public override NationalInsuranceCalculation CalculateNationalInsurance(decimal gross, char niCategory, PayPeriods payPeriods) { var totalPT = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.PrimaryThreshold); var totalST = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.SecondaryThreshold); var totalUEL = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.UpperEarningsLimit); var totalLEL = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.LowerEarningsLimit); var totalUST = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.UpperSecondaryThreshold); var totalAUST = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.ApprenticeUpperSecondaryThreshold); var niRates = TaxYearSpecificProvider.GetCodeSpecifics(niCategory); var(periods, weeksInPeriod) = TaxMath.GetFactoring(payPeriods); decimal periodPT = TaxMath.PeriodRound(TaxMath.Factor(totalPT, weeksInPeriod, periods), weeksInPeriod), periodST = TaxMath.PeriodRound(TaxMath.Factor(totalST, weeksInPeriod, periods), weeksInPeriod), periodUEL = TaxMath.PeriodRound(TaxMath.Factor(totalUEL, weeksInPeriod, periods), weeksInPeriod), periodLEL = Math.Ceiling(TaxMath.Factor(totalLEL, weeksInPeriod, periods)); var niCalc = new NationalInsuranceCalculation { EarningsUptoIncludingLEL = SubtractRound(gross, periodLEL, 0), EarningsAboveLELUptoIncludingPT = SubtractRound(gross, periodPT, periodLEL), EarningsAbovePTUptoIncludingST = SubtractRound(gross, periodST, periodPT), EarningsAboveSTUptoIncludingUEL = SubtractRound(gross, periodUEL, periodST), EarningsAboveUEL = SubtractRound(gross, gross, periodUEL) }; niCalc.EmployeeNiGross += TaxMath.HmrcRound(niCalc.EarningsAbovePTUptoIncludingST * (niRates.EeC / 100)); niCalc.EmployeeNiGross += TaxMath.HmrcRound(niCalc.EarningsAboveSTUptoIncludingUEL * (niRates.EeD / 100)); niCalc.EmployeeNiGross += TaxMath.HmrcRound(niCalc.EarningsAboveUEL * (niRates.EeE / 100)); niCalc.EmployerNiGross += TaxMath.HmrcRound(niCalc.EarningsAboveSTUptoIncludingUEL * (niRates.ErD / 100)); niCalc.EmployerNiGross += TaxMath.HmrcRound(niCalc.EarningsAboveUEL * (niRates.ErE / 100)); return(niCalc); }
protected virtual void CalculateLn() { var taxableIncome = Math.Max(Math.Floor(CalculationContainer.Pn - CalculationContainer.na1), 0); FixedCode fixedCode; if ((fixedCode = TaxYearSpecificProvider.GetFixedCode(CalculationContainer.TaxCode.SanitisedTaxCode, CalculationContainer.TaxCode.IsScotlandTax)) != null) { CalculationContainer.Ln = taxableIncome * fixedCode.Rate; } else { var brackets = GetBracketsForPeriod();//TaxYear, CalculationContainer.n, (int)CalculationContainer.Periods); for (int i = 0; i < brackets.Length; i++) { var lastv = i > 0 ? brackets[i - 1].v : 0; var lastc = i > 0 ? brackets[i - 1].c : 0; var lastk = i > 0 ? brackets[i - 1].k : 0; if (CalculationContainer.Un > lastv && CalculationContainer.Un <= brackets[i].v) { CalculationContainer.Ln = lastk + ((CalculationContainer.Tn - lastc) * brackets[i].R); break; } } } }
public override NationalInsuranceCalculation CalculateNationalInsurance(decimal gross, char niCategory, PayPeriods payPeriods) { var totalPT = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.PrimaryThreshold); var totalST = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.SecondaryThreshold); var totalUAP = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.UpperAccrualPoint); var totalUEL = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.UpperEarningsLimit); var totalLEL = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.LowerEarningsLimit); var niRates = TaxYearSpecificProvider.GetCodeSpecifics(niCategory); var(periods, weeksInPeriod) = TaxMath.GetFactoring(payPeriods); decimal periodPT = TaxMath.PeriodRound(TaxMath.Factor(totalPT, weeksInPeriod, periods), weeksInPeriod), periodST = TaxMath.PeriodRound(TaxMath.Factor(totalST, weeksInPeriod, periods), weeksInPeriod), periodUAP = TaxMath.PeriodRound(TaxMath.Factor(totalUAP, weeksInPeriod, periods), weeksInPeriod), periodUEL = TaxMath.PeriodRound(TaxMath.Factor(totalUEL, weeksInPeriod, periods), weeksInPeriod), periodLEL = Math.Ceiling(TaxMath.Factor(totalLEL, weeksInPeriod, periods)); var niCalc = new NationalInsuranceCalculation(); // Employee NI Gross var lelToPt = SubtractRound(gross, periodPT, periodLEL); var ptToSt = SubtractRound(gross, periodST, periodPT); var stToUap = SubtractRound(gross, periodUAP, periodST); var uapToUel = SubtractRound(gross, periodUEL, periodUAP); var aboveUel = SubtractRound(gross, gross, periodUEL); niCalc.EmployeeNiGross = TaxMath.HmrcRound(ptToSt * (niRates.EeC / 100)); niCalc.EmployeeNiGross += TaxMath.HmrcRound(stToUap * (niRates.EeD / 100)); niCalc.EmployeeNiGross += TaxMath.HmrcRound(uapToUel * (niRates.EeE / 100)); niCalc.EmployeeNiGross += TaxMath.HmrcRound(aboveUel * (niRates.EeF / 100)); niCalc.EmployeeNiRebate = TaxMath.HmrcRound(lelToPt * (niRates.EeB / 100)); // Employer NI Gross //niCalc.EmployerNiGross = TaxMath.HmrcRound(ptToSt * (niRates.ErC / 100)); if (!(niCategory == 'I' || niCategory == 'K' || niCategory == 'V')) { niCalc.EmployerNiGross += TaxMath.HmrcRound(stToUap * (niRates.ErD / 100)); } niCalc.EmployerNiGross += TaxMath.HmrcRound(uapToUel * (niRates.ErE / 100)); niCalc.EmployerNiGross += TaxMath.HmrcRound(aboveUel * (niRates.ErF / 100)); niCalc.EmployerNiRebate = TaxMath.HmrcRound(lelToPt * (niRates.ErB / 100)); niCalc.EmployerNiRebate += TaxMath.HmrcRound(ptToSt * (niRates.ErC / 100)); if ((niCategory == 'I' || niCategory == 'K' || niCategory == 'V')) { niCalc.EmployerNiRebate += TaxMath.HmrcRound(stToUap * (niRates.ErD / 100)); } return(niCalc); }
public override NationalInsuranceCalculation CalculateNationalInsurance(decimal gross, char niCategory, PayPeriods periods) { int periodCnt = 52; int weeksInPeriod = 1; if (periods == PayPeriods.Monthly) { periodCnt = 12; } else { weeksInPeriod = (int)Math.Round((decimal)periodCnt / (int)periods); } var totalPT = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.PrimaryThreshold); var totalST = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.SecondaryThreshold); var totalUAP = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.UpperAccrualPoint); var totalUEL = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.UpperEarningsLimit); var totalLEL = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.LowerEarningsLimit); var niRates = TaxYearSpecificProvider.GetCodeSpecifics(niCategory); decimal periodPT = TaxMath.PeriodRound(TaxMath.Factor(totalPT, weeksInPeriod, periodCnt), weeksInPeriod), periodST = TaxMath.PeriodRound(TaxMath.Factor(totalST, weeksInPeriod, periodCnt), weeksInPeriod), periodUAP = TaxMath.PeriodRound(TaxMath.Factor(totalUAP, weeksInPeriod, periodCnt), weeksInPeriod), periodUEL = TaxMath.PeriodRound(TaxMath.Factor(totalUEL, weeksInPeriod, periodCnt), weeksInPeriod), periodLEL = TaxMath.PeriodRound(TaxMath.Factor(totalLEL, weeksInPeriod, periodCnt), weeksInPeriod); var niCalc = new NationalInsuranceCalculation(); // Employee NI Gross niCalc.EmployeeNiGross = TaxMath.HmrcRound(SubtractRound(gross, periodUAP, periodPT) * (niRates.EeD / 100)); niCalc.EmployeeNiGross += TaxMath.HmrcRound(SubtractRound(gross, periodUEL, periodUAP) * (niRates.EeE / 100)); niCalc.EmployeeNiGross += TaxMath.HmrcRound(SubtractRound(gross, gross, periodUEL) * (niRates.EeF / 100)); niCalc.EmployeeNiRebate = TaxMath.HmrcRound(SubtractRound(gross, periodST, periodLEL) * (niRates.EeB / 100)); niCalc.EmployeeNiRebate += TaxMath.HmrcRound(SubtractRound(gross, periodPT, periodST) * (niRates.EeC / 100)); // Employer NI Gross niCalc.EmployerNiGross = TaxMath.HmrcRound(SubtractRound(gross, periodPT, periodST) * (niRates.ErC / 100)); niCalc.EmployerNiGross += TaxMath.HmrcRound(SubtractRound(gross, periodUAP, periodPT) * (niRates.ErD / 100)); niCalc.EmployerNiGross += TaxMath.HmrcRound(SubtractRound(gross, periodUEL, periodUAP) * (niRates.ErE / 100)); niCalc.EmployerNiGross += TaxMath.HmrcRound(SubtractRound(gross, gross, periodUEL) * (niRates.ErF / 100)); niCalc.EmployerNiRebate = TaxMath.HmrcRound(SubtractRound(gross, periodST, periodLEL) * (niRates.ErB / 100)); return(niCalc); }
public override NationalInsuranceCalculation CalculateNationalInsurance(decimal gross, char niCategory, PayPeriods periods) { int periodCnt = 52; int weeksInPeriod = 1; if (periods == PayPeriods.Monthly) { periodCnt = 12; } else { weeksInPeriod = (int)Math.Round((decimal)periodCnt / (int)periods); } var totalPT = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.PrimaryThreshold); var totalST = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.SecondaryThreshold); var totalUEL = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.UpperEarningsLimit); var totalLEL = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.LowerEarningsLimit); var totalUST = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.UpperSecondaryThreshold); var totalAUST = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.ApprenticeUpperSecondaryThreshold); var niRates = TaxYearSpecificProvider.GetCodeSpecifics(niCategory); // WTF. UEL must round 865.3846 to 866. But PT must round 680.3333 to 680. This isn't sane. decimal periodPT = TaxMath.PeriodRound(TaxMath.Factor(totalPT, weeksInPeriod, periodCnt), weeksInPeriod), periodUEL = Math.Ceiling(TaxMath.Factor(totalUEL, weeksInPeriod, periodCnt)), periodLEL = Math.Ceiling(TaxMath.Factor(totalLEL, weeksInPeriod, periodCnt)); var niCalc = new NationalInsuranceCalculation { EarningsUptoIncludingLEL = SubtractRound(gross, periodLEL, 0), EarningsAboveLELUptoIncludingPT = SubtractRound(gross, periodPT, periodLEL), EarningsAboveSTUptoIncludingUEL = SubtractRound(gross, periodUEL, periodPT), EarningsAboveUEL = SubtractRound(gross, gross, periodUEL) }; niCalc.EmployeeNiGross += TaxMath.HmrcRound(niCalc.EarningsAboveSTUptoIncludingUEL * (niRates.EeC / 100)); niCalc.EmployeeNiGross += TaxMath.HmrcRound(niCalc.EarningsAboveUEL * (niRates.EeD / 100)); niCalc.EmployerNiGross += TaxMath.HmrcRound(niCalc.EarningsAboveSTUptoIncludingUEL * (niRates.ErC / 100)); niCalc.EmployerNiGross += TaxMath.HmrcRound(niCalc.EarningsAboveUEL * (niRates.ErD / 100)); return(niCalc); }
public StudentLoanCalculationResult CalculateStudentLoanDeduction(StudentLoanPlan plan, decimal gross, PayPeriods periods) { decimal threshold = 0, rate = 0, periodAdjustedThreshold, thresholdAdjustedGross, deduction; int periodCnt = 52; int weeksInPeriod = 1; if (periods == PayPeriods.Monthly) { periodCnt = 12; } else { weeksInPeriod = (int)Math.Round((decimal)periodCnt / (int)periods); } switch (plan) { case StudentLoanPlan.Plan1: threshold = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.Plan1StudentLoanThreshold); rate = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.Plan1StudentLoanRate); break; case StudentLoanPlan.Plan2: threshold = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.Plan2StudentLoanThreshold); rate = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.Plan2StudentLoanRate); break; } periodAdjustedThreshold = TaxMath.Truncate(((threshold * weeksInPeriod) / periodCnt), 2); thresholdAdjustedGross = Math.Max(0, gross - periodAdjustedThreshold); deduction = Math.Floor(thresholdAdjustedGross * rate); return(new StudentLoanCalculationResult { Gross = gross, Threshold = threshold, Rate = rate, PeriodAdjustedThreshold = periodAdjustedThreshold, ThresholdAdjustedGross = thresholdAdjustedGross, StudentLoanDeduction = deduction }); }
public override NationalInsuranceCalculation CalculateNationalInsurance(decimal gross, char niCategory, PayPeriods payPeriods) { var totalPT = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.PrimaryThreshold); var totalST = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.SecondaryThreshold); var totalUEL = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.UpperEarningsLimit); var totalLEL = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.LowerEarningsLimit); var totalUST = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.UpperSecondaryThreshold); var totalAUST = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.ApprenticeUpperSecondaryThreshold); var niRates = TaxYearSpecificProvider.GetCodeSpecifics(niCategory); // 'X' Ni Code does not pay NI contributions if (niCategory == 'X') { gross = 0m; } var(periods, weeksInPeriod) = TaxMath.GetFactoring(payPeriods); // WTF. UEL must round 865.3846 to 866. But PT must round 680.3333 to 680. This isn't sane. decimal periodPT = TaxMath.PeriodRound(TaxMath.Factor(totalPT, weeksInPeriod, periods), weeksInPeriod), periodUEL = Math.Ceiling(TaxMath.Factor(totalUEL, weeksInPeriod, periods)), periodLEL = Math.Ceiling(TaxMath.Factor(totalLEL, weeksInPeriod, periods)); var niCalc = new NationalInsuranceCalculation { EarningsUptoIncludingLEL = SubtractRound(gross, periodLEL, 0), EarningsAboveLELUptoIncludingPT = SubtractRound(gross, periodPT, periodLEL), EarningsAboveSTUptoIncludingUEL = SubtractRound(gross, periodUEL, periodPT), EarningsAboveUEL = SubtractRound(gross, gross, periodUEL) }; niCalc.EmployeeNiGross += TaxMath.HmrcRound(niCalc.EarningsAboveSTUptoIncludingUEL * (niRates.EeC / 100)); niCalc.EmployeeNiGross += TaxMath.HmrcRound(niCalc.EarningsAboveUEL * (niRates.EeD / 100)); niCalc.EmployerNiGross += TaxMath.HmrcRound(niCalc.EarningsAboveSTUptoIncludingUEL * (niRates.ErC / 100)); niCalc.EmployerNiGross += TaxMath.HmrcRound(niCalc.EarningsAboveUEL * (niRates.ErD / 100)); return(niCalc); }
public override NationalInsuranceCalculation CalculateNationalInsurance(decimal gross, char niCategory, PayPeriods payPeriods) { var totalPT = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.PrimaryThreshold); var totalST = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.SecondaryThreshold); var totalUAP = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.UpperAccrualPoint); var totalUEL = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.UpperEarningsLimit); var totalLEL = TaxYearSpecificProvider.GetSpecificValue <decimal>(TaxYearSpecificValues.LowerEarningsLimit); var niRates = TaxYearSpecificProvider.GetCodeSpecifics(niCategory); var(periods, weeksInPeriod) = TaxMath.GetFactoring(payPeriods); decimal periodPT = TaxMath.PeriodRound(TaxMath.Factor(totalPT, weeksInPeriod, periods), weeksInPeriod), periodST = TaxMath.PeriodRound(TaxMath.Factor(totalST, weeksInPeriod, periods), weeksInPeriod), periodUAP = TaxMath.PeriodRound(TaxMath.Factor(totalUAP, weeksInPeriod, periods), weeksInPeriod), periodUEL = TaxMath.PeriodRound(TaxMath.Factor(totalUEL, weeksInPeriod, periods), weeksInPeriod), periodLEL = TaxMath.PeriodRound(TaxMath.Factor(totalLEL, weeksInPeriod, periods), weeksInPeriod); #pragma warning disable IDE0017 // Simplify object initialization var niCalc = new NationalInsuranceCalculation(); #pragma warning restore IDE0017 // Simplify object initialization // Employee NI Gross niCalc.EmployeeNiGross = TaxMath.HmrcRound(SubtractRound(gross, periodUAP, periodPT) * (niRates.EeD / 100)); niCalc.EmployeeNiGross += TaxMath.HmrcRound(SubtractRound(gross, periodUEL, periodUAP) * (niRates.EeE / 100)); niCalc.EmployeeNiGross += TaxMath.HmrcRound(SubtractRound(gross, gross, periodUEL) * (niRates.EeF / 100)); niCalc.EmployeeNiRebate = TaxMath.HmrcRound(SubtractRound(gross, periodST, periodLEL) * (niRates.EeB / 100)); niCalc.EmployeeNiRebate += TaxMath.HmrcRound(SubtractRound(gross, periodPT, periodST) * (niRates.EeC / 100)); // Employer NI Gross niCalc.EmployerNiGross = TaxMath.HmrcRound(SubtractRound(gross, periodPT, periodST) * (niRates.ErC / 100)); niCalc.EmployerNiGross += TaxMath.HmrcRound(SubtractRound(gross, periodUAP, periodPT) * (niRates.ErD / 100)); niCalc.EmployerNiGross += TaxMath.HmrcRound(SubtractRound(gross, periodUEL, periodUAP) * (niRates.ErE / 100)); niCalc.EmployerNiGross += TaxMath.HmrcRound(SubtractRound(gross, gross, periodUEL) * (niRates.ErF / 100)); niCalc.EmployerNiRebate = TaxMath.HmrcRound(SubtractRound(gross, periodST, periodLEL) * (niRates.ErB / 100)); return(niCalc); }
protected virtual IEnumerable <TaxBracket> GetBracketsFromProvider(bool scottish = false) { return(TaxYearSpecificProvider.GetTaxBrackets(scottish)); }