Пример #1
0
    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;
            }
        }
    }
Пример #2
0
    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;
        }
    }