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
            });
        }
示例#2
0
 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));
        }