private async Task HandleShiftAdjustmentsAndOvertime(int locationId, DateTimeOffset targetDate, string timezone, IEnumerable <Guid?> sheriffsForDuties) { var startRange = targetDate.ConvertToTimezone(timezone).DateOnly(); var endRange = startRange.TranslateDateForDaylightSavings(timezone, hoursToShift: 24); var shiftExpansions = new List <ShiftAdjustment>(); foreach (var sheriff in sheriffsForDuties.Where(sheriff => sheriff != null)) { var shiftsForDay = await Db.Shift.Where(s => s.ExpiryDate == null && s.SheriffId == sheriff && s.LocationId == locationId && s.StartDate >= startRange && s.StartDate < endRange).ToListAsync(); if (shiftsForDay.Count == 0) { continue; } var referenceShift = shiftsForDay.First(); var earliestShift = shiftsForDay.FirstOrDefault(s => s.StartDate == shiftsForDay.Min(s2 => s2.StartDate)); var latestShift = shiftsForDay.FirstOrDefault(s => s.EndDate == shiftsForDay.Max(s2 => s2.EndDate)); var dutySlotsForSheriffOnDay = await Db.DutySlot.Where(s => s.ExpiryDate == null && s.SheriffId == sheriff && s.LocationId == locationId && s.StartDate >= startRange && s.StartDate < endRange).ToListAsync(); var earliestDutySlot = dutySlotsForSheriffOnDay.FirstOrDefault(ds => ds.StartDate == dutySlotsForSheriffOnDay.Min(ds2 => ds2.StartDate)); var latestDutySlot = dutySlotsForSheriffOnDay.FirstOrDefault(ds => ds.EndDate == dutySlotsForSheriffOnDay.Max(ds2 => ds2.EndDate)); if (latestShift !.EndDate < latestDutySlot?.EndDate) { await Db.Shift.AddAsync(new Shift { SheriffId = sheriff.Value, Timezone = referenceShift.Timezone, LocationId = referenceShift.LocationId, StartDate = latestShift.EndDate, EndDate = latestDutySlot.EndDate }); shiftExpansions.Add(new ShiftAdjustment { SheriffId = sheriff.Value, Date = earliestDutySlot.StartDate, Timezone = earliestShift.Timezone }); } if (earliestShift !.StartDate > earliestDutySlot?.StartDate) { await Db.Shift.AddAsync(new Shift { SheriffId = sheriff.Value, Timezone = referenceShift.Timezone, LocationId = referenceShift.LocationId, StartDate = earliestDutySlot.StartDate, EndDate = earliestShift.StartDate }); shiftExpansions.Add(new ShiftAdjustment { SheriffId = sheriff.Value, Date = earliestDutySlot.StartDate, Timezone = earliestShift.Timezone }); } } if (!shiftExpansions.Any()) { return; } await Db.SaveChangesAsync(); foreach (var shiftExpansion in shiftExpansions.Distinct()) { await ShiftService.CalculateOvertimeHoursForSheriffOnDay( shiftExpansion.SheriffId, shiftExpansion.Date, shiftExpansion.Timezone); } }