using System.Collections.Generic;
public static WorkDay ApplyOvertime(WorkDay day, double remainder)
if (day.HolidayHours == 0)
if (remainder > 0 && remainder < day.Hours)
day.Hours = day.Hours - day.OTHours;
public static List<WorkDay> CalculateHolidayAndOvertime(List<WorkDay> workWeek)
List<WorkDay> calculated = new List<WorkDay>();
double holidayWeekHours = workWeek.Sum(d => d.HolidayHours);
double totalWeekHours = workWeek.Sum(d => d.Hours + d.HolidayHours);
double hoursCounter = holidayWeekHours;
foreach (var day in workWeek)
hoursCounter += day.AllNonHolidayHours;
bool thisDayIsOvertime = hoursCounter > 40;
var remainder = hoursCounter - 40;
calculated.Add(ApplyOvertime(day, remainder));
public static void Main()
var example1 = new List<WorkDay>()
var example1Calculated = CalculateHolidayAndOvertime(example1);
var example2 = new List<WorkDay>()
new WorkDay{HolidayHours = 8},
var example2Calculated = CalculateHolidayAndOvertime(example2);
var example3 = new List<WorkDay>()
new WorkDay{HolidayHours = 8},
new WorkDay{HolidayHours = 8},
var example3Calculated = CalculateHolidayAndOvertime(example3);
var example4 = new List<WorkDay>()
new WorkDay{HolidayHours = 8},
var example4Calculated = CalculateHolidayAndOvertime(example4);
var example5 = new List<WorkDay>()
new WorkDay{HolidayHours = 8},
var example5Calculated = CalculateHolidayAndOvertime(example5);
var example6 = new List<WorkDay>()
new WorkDay{HolidayHours = 8},
var example6Calculated = CalculateHolidayAndOvertime(example6);
var example7 = new List<WorkDay>()
new WorkDay{HolidayHours = 8},
var example7Calculated = CalculateHolidayAndOvertime(example7);
PrintWorkWeek(example1Calculated, "48 Hours, no holiday");
PrintWorkWeek(example2Calculated, "Holiday Mid-Week");
PrintWorkWeek(example3Calculated, "2 Holidays");
PrintWorkWeek(example4Calculated, "Holiday End Week OT");
PrintWorkWeek(example5Calculated, "Holiday End Week No OT");
PrintWorkWeek(example6Calculated, "Holiday Split OT");
PrintWorkWeek(example7Calculated, "Holiday Split OT and OT");
public static void PrintWorkWeek(List<WorkDay> week, string label)
Console.Write($"{label, -25}");
var weekRegularHours = week.Sum(d => d.Hours);
var weekOvertimeHours = week.Sum(d => d.OTHours);
var weekHolidayHours = week.Sum(d => d.HolidayHours);
var weekTotalHours = week.Sum(d => d.Hours + d.HolidayHours + d.OTHours);
foreach (var day in week)
Console.Write($"{weekRegularHours,2}(R) {weekOvertimeHours,2} (OT) {weekHolidayHours,2}(H) Total:{weekTotalHours,2}");
public static void PrintFooter()
Console.WriteLine("(R) Regular Hours");
Console.WriteLine("(OT) Overtime Hours");
Console.WriteLine("(H) Holiday Hours");
public static void PrintHeader()
string[] days = new string[] { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
Console.Write($"{"Scenario",-25}");
foreach (var dayName in days)
Console.Write($"{dayName,-15}");
Console.Write($"{"Totals",-15}");
public double Hours { get; set; }
public double OTHours { get; set; }
public double HolidayHours { get; set; }
public decimal Multiplier { get; set; } = 1;
public double AllNonHolidayHours
return OTHours > 0 ? $"{OTHours}(OT)" : "";
public string HolidayLabel
return HolidayHours > 0 ? $"{HolidayHours}(H)" : "";
return $"{HoursLabel} {OTLabel} {HolidayLabel}";
public override String ToString()
return $"{DayLabel,-15}";