private void CompensateForRegisteredPayouts(List <OvertimeEntry> overtimeEntries, PayoutsDto registeredPayouts) { var payoutEntriesGroupedByDate = registeredPayouts.Entries.GroupBy(e => e.Date).OrderBy(g => g.Key); foreach (var payoutEntryGroup in payoutEntriesGroupedByDate) { var payoutDate = payoutEntryGroup.Key; var registeredPayoutsTotal = payoutEntryGroup.Sum(e => e.HoursBeforeCompRate); var orderedOverTime = overtimeEntries.Where(e => e.Date <= payoutDate).GroupBy( hours => hours.CompensationRate, hours => hours, (cr, hours) => new { CompensationRate = cr, Hours = hours.Sum(h => h.Hours) }) .OrderBy(h => h.CompensationRate); foreach (var entry in orderedOverTime) { if (registeredPayoutsTotal <= 0) { break; } OvertimeEntry overtimeEntry = new OvertimeEntry { Hours = -Math.Min(registeredPayoutsTotal, entry.Hours), CompensationRate = entry.CompensationRate, Date = payoutDate }; overtimeEntries.Add(overtimeEntry); registeredPayoutsTotal += overtimeEntry.Hours; } } }
private void CompensateForRegisteredPayouts(List <OvertimeEntry> overtimeEntries, PayoutsDto registeredPayouts) { var registeredPayoutsTotal = registeredPayouts.TotalHours; var orderedOverTime = overtimeEntries.GroupBy( hours => hours.CompensationRate, hours => hours, (cr, hours) => new { CompensationRate = cr, Hours = hours.Sum(h => h.Hours) }) .OrderByDescending(h => h.CompensationRate); foreach (var entry in orderedOverTime) { if (registeredPayoutsTotal <= 0) { break; } OvertimeEntry overtimeEntry = new OvertimeEntry { Hours = -Math.Min(registeredPayoutsTotal, entry.Hours * entry.CompensationRate), CompensationRate = 1, Date = DateTime.Now }; overtimeEntries.Add(overtimeEntry); registeredPayoutsTotal += overtimeEntry.Hours; } }