public CompensationSummaryResultContract CorrectRoundingLoss(CompensationSummaryRequestContract request, decimal totalAnnualDiscounts, IEnumerable <PaycheckContract> paychecks) { var totalAnnualDeductions = paychecks.Select(x => x.DeductionsAmount).Sum(); var totalUndiscountedDeductions = request.Employee.AnnualElectedBenefitsCost + request.Employee.Dependents.Select(x => x.AnnualElectedBenefitsCost).Sum(); var roundingLoss = totalUndiscountedDeductions - totalAnnualDiscounts - totalAnnualDeductions; if (roundingLoss != 0m) { var lastPaycheck = paychecks.Where(x => x.PayPeriodOrdinal == request.NumberOfPaychecks - 1).FirstOrDefault(); lastPaycheck.DeductionsAmount += roundingLoss; lastPaycheck.NetPayAmount -= roundingLoss; totalAnnualDeductions += roundingLoss; } return(new CompensationSummaryResultContract { AnnualSalary = request.Employee.AnnualSalary, AnnualDeductions = totalAnnualDeductions, AnnualNetPay = paychecks.Select(x => x.NetPayAmount).Sum(), Paychecks = paychecks }); }
public ActionResult <CompensationSummaryResultContract> Post([FromBody] CompensationSummaryRequestContract request) { return(_compensationSummaryProxy.CalculateEmployeeAnnualCompensationSummary(request)); }
public CompensationSummaryResultContract CalculateEmployeeAnnualCompensationSummary(CompensationSummaryRequestContract request) { var personalPayPeriodDeductions = _deductionCalculators.CalculateEmployeePersonalPaycheckDeduction(request.Employee, request.NumberOfPaychecks); var totalDependentPayPeriodDeductions = request.Employee.Dependents.Select(x => _deductionCalculators.CalculateEmployeeDependentPaycheckDeduction(x, request.NumberOfPaychecks)).Sum(); var availableDiscounts = new List <IDiscount> { new NameDiscount() }; var personalPayPeriodDiscount = _discountCalculators.CalculateBeneficiaryDiscountPaycheckValue(request.Employee, availableDiscounts, request.NumberOfPaychecks); var totalDependentPayPeriodDiscount = request.Employee.Dependents.Select(x => _discountCalculators.CalculateBeneficiaryDiscountPaycheckValue(x, availableDiscounts, request.NumberOfPaychecks)).Sum(); var paychecks = Enumerable.Range(0, request.NumberOfPaychecks).Select(i => { var grossPay = decimal.Round(request.Employee.AnnualSalary / request.NumberOfPaychecks, 2, MidpointRounding.AwayFromZero); var deductions = (personalPayPeriodDeductions - personalPayPeriodDiscount) + (totalDependentPayPeriodDeductions - totalDependentPayPeriodDiscount); return(new PaycheckContract { PayPeriodOrdinal = i, GrossPayAmount = grossPay, DeductionsAmount = deductions, NetPayAmount = grossPay - deductions }); }).ToList(); var totalAnnualDiscounts = (personalPayPeriodDiscount + totalDependentPayPeriodDiscount) * request.NumberOfPaychecks; return(_summaryRoundingLossCalculators.CorrectRoundingLoss(request, totalAnnualDiscounts, paychecks)); }