public static void Main()
DateTime now = new DateTime(2020,02,03);
DateTime due = new DateTime(2020,02,01);
Console.WriteLine(ChecklistAuditStatusCalculator.IsDue(now, due, dueOffset, overdueOffset));
Console.WriteLine(ChecklistAuditStatusCalculator.IsOverdue(now, due, dueOffset, overdueOffset));
public static class ChecklistAuditStatusCalculator
private static (bool isDue, bool isOverdue) InProgress => (false, false);
private static (bool isDue, bool isOverdue) Due => (true, false);
private static (bool isDue, bool isOverdue) Overdue => (false, true);
public static (bool isDue, bool isOverdue) Calculate(DateTime utcNow, DateTime? dueDate, (int dueOffset, int overdueOffset) offsets) {
if (dueDate == null) return InProgress;
DateTime due = dueDate.Value;
if (offsets.dueOffset == 0 && offsets.overdueOffset == 0) {
if (due < utcNow) return Overdue;
if (due.Year == utcNow.Year && due.Month == utcNow.Month) return Due;
if (due.AddDays(offsets.overdueOffset*-1) < utcNow) return Overdue;
if (due.AddDays(offsets.dueOffset*-1) < utcNow) return Due;
public static bool IsOverdue(DateTime utcNow, DateTime? dueDate, int dueOffset, int overdueOffset)
var x = Calculate(utcNow, dueDate, (dueOffset, overdueOffset));
public static bool IsDue(DateTime utcNow, DateTime? dueDate, int dueOffset, int overdueOffset)
var x = Calculate(utcNow, dueDate, (dueOffset, overdueOffset));