private IEnumerable <OvertimeEntry> CreateOvertimeEntries(DateEntry day, bool isRedDay) { var overtimeEntries = new List <OvertimeEntry>(); var overtimeHours = isRedDay ? day.GetWorkingHours() : day.GetWorkingHours() - HoursInRegularWorkday; foreach (var entry in day.Entries.OrderBy(task => task.CompensationRate)) { if (overtimeHours <= 0) { break; } if (isRedDay && (entry.TaskId == _paidHolidayTask || entry.TaskId == _unpaidHolidayTask)) { continue; } OvertimeEntry overtimeEntry = new OvertimeEntry { Hours = Math.Min(overtimeHours, entry.Value), CompensationRate = entry.CompensationRate, Date = day.Date, TaskId = entry.TaskId }; overtimeHours -= overtimeEntry.Hours; yield return(overtimeEntry); } }
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; } }
private void CompensateForOffTime(List <OvertimeEntry> overtimeEntries, IEnumerable <DateEntry> entriesByDate, DateTime startDate, DateTime endDate, int userId) { var dbUser = _context.User.SingleOrDefault(u => u.Id == userId); foreach (var currentWorkDay in GetDaysInPeriod(startDate, endDate)) { var day = entriesByDate.SingleOrDefault(entryDate => entryDate.Date == currentWorkDay); var entriesWithTimeOff = day.Entries.Where(e => e.TaskId == _flexTask); if (day != null && entriesWithTimeOff.Any()) { var hoursOffThisDay = entriesWithTimeOff.Sum(e => e.Value); var orderedOverTime = overtimeEntries .Where(o => o.Date < currentWorkDay) .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 (hoursOffThisDay <= 0) { break; } OvertimeEntry overtimeEntry = new OvertimeEntry { Hours = -Math.Min(hoursOffThisDay, entry.Hours), CompensationRate = entry.CompensationRate, Date = day.Date }; overtimeEntries.Add(overtimeEntry); hoursOffThisDay += overtimeEntry.Hours; } } } }
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; } } }
public bool insertOvertimeEntry([FromBody] OvertimeEntry pOvertimeEntry, string pUserId) { return(loOvertimeEntry.insertOvertimeEntry(pOvertimeEntry, pUserId)); }