private ShiftOutput ProcessShift(Shift shift, List <WageLevel> wageLevels) { ShiftDTO shiftDTO = new ShiftDTO(shift); WageLevel wageLevel = wageLevels.FirstOrDefault(wl => wl.Key == shiftDTO.WageLevel); if (wageLevel == null) { throw new ArgumentNullException($"wageLevel in shift started at: [{shift.StartedAt}] cannot be found."); } decimal wageBase = wageLevel.Value; //init shiftDTO shiftDTO.InitWageBaseRate(wageBase).CalculateHoursWorked().CalculateEarning(); //map to output ShiftOutput shiftOutput = PayslipMapper.MapFromShiftDTOToShiftOutput(shiftDTO); return(shiftOutput); }
PayslipOutput IPayslipService.GeneratePayslip(PayslipInput input) { List <WageLevel> wageLevels = PayslipMapper.MapFromDictionaryToWageLevelModel(input.WageLevels); PayslipOutput payslipOutput = new PayslipOutput { EmployeeName = input.Employee?.Name, ShiftOutputs = new List <ShiftOutput>() }; foreach (var shift in input.Shifts) { var shiftOutput = ProcessShift(shift, wageLevels); payslipOutput.ShiftOutputs.Add(shiftOutput); } payslipOutput.TotalHoursWorked = payslipOutput.ShiftOutputs.Sum(so => so.TotalHoursWorked); payslipOutput.TotalNormalHoursWorked = payslipOutput.ShiftOutputs.Sum(so => so.NormalHoursWorked); payslipOutput.TotalOvertimeHoursWorked = payslipOutput.ShiftOutputs.Sum(so => so.OvertimeHoursWorked); payslipOutput.TotalEarning = payslipOutput.ShiftOutputs.Sum(so => so.Earning); //init response properties payslipOutput.Message = "payslip has been successfully generated"; payslipOutput.IsSuccessful = true; return(payslipOutput); }