protected override decimal GetPayAdjustment(TaxCode taxCode, PayPeriods periods /*, int period*/) { if (taxCode.IsNoAdjustmentCode || !taxCode.TaxCodeNumber.HasValue || taxCode.TaxCodeNumber.Value == 0) { return(0); } var codeNumber = taxCode.TaxCodeNumber.Value; var remainder = ((codeNumber - 1m) % 500) + 1m; var quotient = Math.Floor(codeNumber - remainder) / 500m; var payPeriodForQuotient = (periods == PayPeriods.Monthly ? PayPeriods.Monthly : PayPeriods.Weekly); var quotientMult = TaxMath.UpRound(500 * (10 / (decimal)payPeriodForQuotient), 2); remainder = ((remainder * 10) + 9) / (int)payPeriodForQuotient; remainder = Math.Ceiling(remainder * 100) / 100; //remainder *= Math.Round((decimal)payPeriodForQuotient / (decimal)periods); quotient = quotient * quotientMult; var adjustment = (quotient + remainder);// * period; adjustment *= Math.Round((decimal)payPeriodForQuotient / (decimal)periods); if (taxCode.IsPrefixCode) { adjustment *= -1; } return(adjustment); }
public void UpRoundingTest() { Assert.AreEqual(1m, TaxMath.UpRound(0.99999m, 2)); Assert.AreEqual(1.96m, TaxMath.UpRound(1.956m, 2)); Assert.AreEqual(2.96m, TaxMath.UpRound(2.9555555m, 2)); Assert.AreEqual(2.48m, TaxMath.UpRound(2.4719m, 2)); Assert.AreEqual(978.55m, TaxMath.UpRound(978.54823m, 2)); Assert.AreEqual(8956.55m, TaxMath.UpRound(8956.54168m, 2)); Assert.AreEqual(654.17m, TaxMath.UpRound(654.168749m, 2)); Assert.AreEqual(236514.47m, TaxMath.UpRound(236514.46984m, 2)); Assert.AreEqual(784.47m, TaxMath.UpRound(784.4687m, 2)); }