static void Main() { var output = new List <string>(); // Fill in your data here: var calc = new IncomeTaxCalculator(new IncomeTaxConfig() { // Stockholm 2018. skattesats_kommunalskatt = 17.90 / 100, skattesats_landstingsskatt = 12.08 / 100, skattesats_begravning = 0.075 / 100, // Correct for 2018. taxYear = 2018, PBB = 45500, IBB = 62500, nedreSkiktgräns = 455300, övreSkiktgräns = 662300, birthYear = 1980, }); output.Add("Gross salary (year), Net salary (year), Total tax (year), Effective tax rate"); for (int salary = 1000 * 12; salary <= 100000 * 12; salary += 1000 * 12) { var r = calc.Calculate(salary); output.Add(string.Format("{0}, {1}, {2}, {3}", salary, salary - r.slutligSkatt, r.slutligSkatt, r.effektivTotalSkattesats)); } File.WriteAllLines("SalaryRangeOutput.csv", output); }
public void CalculatesRentalIncomeTax() { //only rental income where income is below tax band Assert.That(new IncomeTaxCalculator().TaxFor(0m, rentalIncome: new RentalIncomeForTax(12000, 0, 5000)).IncomeTax, Is.EqualTo(0)); //only rental income where tax falls in 20% bracket Assert.That(new IncomeTaxCalculator().TaxFor(0m, rentalIncome: new RentalIncomeForTax(50_000, 0, 5000)).IncomeTax, Is.EqualTo(6498.2m)); //only rental income where tax falls in 40% bracket Assert.That(new IncomeTaxCalculator().TaxFor(0m, rentalIncome: new RentalIncomeForTax(100_000, 0, 10_000)).IncomeTax, Is.EqualTo(25496.4m)); //personal allowance is breached due to rental properties but Assert.That(new IncomeTaxCalculator().TaxFor(3_000m, rentalIncome: new RentalIncomeForTax(10_000, 0, 5_000)).IncomeTax, Is.EqualTo(0)); Assert.That(new IncomeTaxCalculator().TaxFor(3_000m, rentalIncome: new RentalIncomeForTax(11_000, 0, 0)).IncomeTax, Is.EqualTo(98.2)); //rental puts you in 100k bracket Assert.That(new IncomeTaxCalculator().TaxFor(90_000, rentalIncome: new RentalIncomeForTax(20_000, 0, 10_000)).IncomeTax, Is.EqualTo(31_496.4m)); //applies the property allowance when appropriate var taxReport = new IncomeTaxCalculator().TaxFor(10_000, rentalIncome: new RentalIncomeForTax(11_000, 400, 2_000)); Assert.That(taxReport.IncomeTax, Is.EqualTo(1_498.2m)); Assert.That(taxReport.AfterTaxIncomeFor(IncomeType.RentalIncome), Is.EqualTo(7_101.8m)); //all income types var taxResult = new IncomeTaxCalculator().TaxFor(90_000, 10_000, 10_000, new RentalIncomeForTax(20_000, 0, 10_000)); Assert.That(taxResult.IncomeTax, Is.EqualTo(42_500m)); Assert.That(taxResult.NationalInsurance, Is.EqualTo(5_660)); Assert.That(taxResult.TotalTax, Is.EqualTo(48_160)); }
private IRetirementReport ReportFor(Family family, bool exitOnceMinCalcd = false, DateTime?givenRetirementDate = null) { _incomeTaxCalculator = new IncomeTaxCalculator(); var result = new RetirementReport(_pensionAgeCalc, _incomeTaxCalculator, family, _now, givenRetirementDate, _assumptions, _taxSystem); var calcdMinimum = false; var monthsToDeath = MonthsToDeath(family.PrimaryPerson.Dob, _now); for (var month = 1; month <= monthsToDeath; month++) { ProgressTheResultBy1Month(family, givenRetirementDate, result, calcdMinimum); if (givenRetirementDate == null && !calcdMinimum) { var retirementReport = result.CopyCalcMinimumMode(); if (IsThatEnoughTillDeath(family, retirementReport, month, monthsToDeath)) { result.Persons.ForEach((p) => p.FinancialIndependenceDate = result.PrimaryPerson.StepReport.CurrentStep.StepDate); if (exitOnceMinCalcd) { return(result); } calcdMinimum = true; } } } return(result); }
public void IncomeTaxIsSeparatedPerIncomeType() { var result = new IncomeTaxCalculator().TaxFor(60_000, 60_000, 60_000); Assert.That(result.TotalTaxFor(IncomeType.Salary), Is.EqualTo(21_560)); Assert.That(result.TotalTaxFor(IncomeType.PrivatePension), Is.EqualTo(24_000)); Assert.That(result.TotalTaxFor(IncomeType.StatePension), Is.EqualTo(25_500)); }
static void Main() { //// Fill in your data here: //var taxConfig = new IncomeTaxConfig() //{ // // Stockholm 2018. // skattesats_kommunalskatt = 17.90 / 100, // skattesats_landstingsskatt = 12.08 / 100, // skattesats_begravning = 0.075 / 100, // // Correct for 2018. // taxYear = 2018, // PBB = 45500, // IBB = 62500, // nedreSkiktgräns = 455300, // övreSkiktgräns = 662300, // birthYear = 1980, //}; // Fill in your data here: var taxConfig = new IncomeTaxConfig() { // Stockholm 2021. skattesats_kommunalskatt = 17.74 / 100, skattesats_landstingsskatt = 12.08 / 100, skattesats_begravning = 0.065 / 100, // Correct for 2021. taxYear = 2021, PBB = TaxYearConstants_2021.PBB, IBB = TaxYearConstants_2021.IBB, nedreSkiktgräns = 523_200, birthYear = 1980, }; double arbetsinkomstFörHelaÅret = 537_200; // Calculate and present the result. var incomeTaxCalculator = new IncomeTaxCalculator(taxConfig); var r = incomeTaxCalculator.Calculate(arbetsinkomstFörHelaÅret); Console.WriteLine(); Console.WriteLine("Arbetsinkomst: {0}", arbetsinkomstFörHelaÅret); Console.WriteLine("Beskattningsbar förvärvsinkomst: {0}", r.beskattningsbarForvärvsinkomst); Console.WriteLine("Kommunalskatt: {0}", r.kommunalskatt); Console.WriteLine("Statligskatt: {0}", r.statligskatt); Console.WriteLine("Begravningsavgift: {0}", r.begravningsavgift); Console.WriteLine("Grundavdrag: {0}", r.grundavdrag); Console.WriteLine("Allmän pensionsavgift: {0}", r.allmänPensionsavgift); Console.WriteLine("Jobbskatteavdrag: {0}", r.jobbskatteavdrag); Console.WriteLine("Totalskatt: {0}", r.slutligSkatt); Console.WriteLine("Effektiv total skattesats: {0}%", r.effektivTotalSkattesats * 100); Console.WriteLine(); }
protected override decimal CalculateTaxOnWithdrawal(decimal withdrawal, decimal income) { if (income == 0) { return(0); } var liability = IncomeTaxCalculator.TotalIncomeTaxFor(Data.FilingStatus, income, 0.00M) / income; return(withdrawal * liability); }
public void MaximaltUtnyttjande_GränsFörStatligSkatt() { var calc = new IncomeTaxCalculator(Get2017TestConfig()); // No state tax below. Assert.AreEqual(0, calc.Calculate(452100).statligskatt); // State tax above. Assert.AreNotEqual(0, calc.Calculate(452100 + 100).statligskatt); }
public void CalculatesRentalTax_ConsideringPropertyAllowance() { var taxReport = new IncomeTaxCalculator().TaxFor(10_000, rentalIncome: new RentalIncomeForTax(10_000, 400, 2_000)); Assert.That(taxReport.IncomeTax, Is.EqualTo(1298.2m)); Assert.That(taxReport.AfterTaxIncomeFor(IncomeType.RentalIncome), Is.EqualTo(6301.8m)); var taxReportAllowanceBroken = new IncomeTaxCalculator().TaxFor(10_000, rentalIncome: new RentalIncomeForTax(10_000, 800, 1_600)); //800+.2*1_600 is > 1_000 Assert.That(taxReportAllowanceBroken.IncomeTax, Is.EqualTo(1018.2m)); Assert.That(taxReportAllowanceBroken.AfterTaxIncomeFor(IncomeType.RentalIncome), Is.EqualTo(6581.8m)); }
public void CalculateIncomeTax_ShouldThrowArgumentException_IfGrossSalaryIsNegative() { //Arrange double grossSalaryNegative = -1; IncomeTaxCalculator incomeTaxCalculator = new IncomeTaxCalculator(); //Action var exception = Assert.Throws <ArgumentException>(() => incomeTaxCalculator.CalculateIncomeTax(grossSalaryNegative)); //Assert Assert.That(exception.Message, Is.EqualTo(GlobalConstants.NegativeGrossSalaryMessage)); }
public void CalculateIncomeTax_ShouldReturn0_IfGrossSalaryIsBelowOrMinGrossSalary() { //Arrange IncomeTaxCalculator incomeTaxCalculator = new IncomeTaxCalculator(); double grossSalaryBelowOrMin = GlobalConstants.MinGrossSalary - 1; double expectedIncomeTax = 0; //Action double resultIncomeTax = incomeTaxCalculator.CalculateIncomeTax(grossSalaryBelowOrMin); //Assert Assert.AreEqual(expectedIncomeTax, resultIncomeTax, $"Result income tax was not equal to {expectedIncomeTax}"); }
public void CalculateIncomeTax_ShouldReturnValidIncomeTax_IfGrossSalaryIsAboveMinGrossSalary() { //Arrange IncomeTaxCalculator incomeTaxCalculator = new IncomeTaxCalculator(); double grossSalaryAboveMinGrossSalary = GlobalConstants.MinGrossSalary + 1; double expectedIncomeTax = (grossSalaryAboveMinGrossSalary - GlobalConstants.MinGrossSalary) * GlobalConstants.IncomeTaxPercent / 100; //Action double resultIncomeTax = incomeTaxCalculator.CalculateIncomeTax(grossSalaryAboveMinGrossSalary); //Assert Assert.AreEqual(expectedIncomeTax, resultIncomeTax, $"Result income tax was not equal to {expectedIncomeTax}"); }
private static PaySlip BuildPaySlip(EmployeeDetails employeeDetails) { var incomeTaxCalculator = new IncomeTaxCalculator(); var incomeTax = incomeTaxCalculator.Calculate(employeeDetails.AnnualSalary); var grossIncome = CalculateGrossIncome(employeeDetails.AnnualSalary); return(new PaySlip() { Name = $"{employeeDetails.FirstName} {employeeDetails.Surname}", PayPeriod = employeeDetails.PaymentPeriod, GrossIncome = grossIncome, IncomeTax = incomeTax, NetIncome = grossIncome - incomeTax, Super = CalculateSuper(employeeDetails.SuperRate, grossIncome) }); }
public void CalculatesCorrectTax() { Assert.That(new IncomeTaxCalculator().TaxFor(0).IncomeTax, Is.EqualTo(0)); Assert.That(new IncomeTaxCalculator().TaxFor(0).NationalInsurance, Is.EqualTo(0)); Assert.That(new IncomeTaxCalculator().TaxFor(12_500).IncomeTax, Is.EqualTo(0)); Assert.That(new IncomeTaxCalculator().TaxFor(12_500).NationalInsurance, Is.EqualTo(360)); Assert.That(new IncomeTaxCalculator().TaxFor(50_000).IncomeTax, Is.EqualTo(7_498.2)); Assert.That(new IncomeTaxCalculator().TaxFor(100_000).IncomeTax, Is.EqualTo(27_496.4)); Assert.That(new IncomeTaxCalculator().TaxFor(125_000).IncomeTax, Is.EqualTo(42_496.4)); Assert.That(new IncomeTaxCalculator().TaxFor(150_000).IncomeTax, Is.EqualTo(52_500)); var tax160000 = new IncomeTaxCalculator().TaxFor(160_000); Assert.That(tax160000.IncomeTax, Is.EqualTo(57_000)); Assert.That(tax160000.NationalInsurance, Is.EqualTo(7_060)); Assert.That(tax160000.TotalTax, Is.EqualTo(64_060)); }
protected override decimal CalculateTaxOnAddition(decimal addition) { var liability = IncomeTaxCalculator.TotalIncomeTaxFor(Data.FilingStatus, Data.Income, Data.BasicAdjustment) / Data.Income; return(addition * liability); }
public void SetUp() { _incomeTaxCalculator = new IncomeTaxCalculator(); }
public void Initialize() { _incomeTaxCalculator = new IncomeTaxCalculator(); }
public void TestIncomeTax(FilingStatus status, decimal income, decimal expectedTax) { Assert.Equal(expectedTax, IncomeTaxCalculator.TotalIncomeTaxFor(status, income, 0.00M), 1); }
// Methods // Given desired additions, get withdrawal schedule // Not a constructor because Asset may be initialized with empty properties, in which case this would break public virtual void CalculateSchedule() { // Tax for dividends if (GetType() == typeof(BrokerageHolding)) { if (Data.Income != 0) { var liability = IncomeTaxCalculator.TotalIncomeTaxFor(Data.FilingStatus, Data.Income, Data.BasicAdjustment) / Data.Income; InterestRateMultiplier = 1 - liability; } else { InterestRateMultiplier = 1; } } Data.UpdateCapsFor(Data.CurrentAge); Data.ChildrensAges.RemoveAll(age => (age) >= 17); List <decimal> amounts = new List <decimal>() { Value + Additions - CalculateTaxOnAddition(Additions) }; // Add additions up to retirement for (var i = 1; i < TimeToRetirement; i++) { // Tax for dividends if (GetType() == typeof(BrokerageHolding)) { if (Data.Income != 0) { var liability = IncomeTaxCalculator.TotalIncomeTaxFor(Data.FilingStatus, Data.Income, Data.BasicAdjustment) / Data.Income; InterestRateMultiplier = 1 - liability; } else { InterestRateMultiplier = 1; } } Data.UpdateCapsFor(Data.CurrentAge + i); Data.ChildrensAges.RemoveAll(age => (age + i) >= 17); amounts.Add(CalculateNextYearAmount(amounts[i - 1], Additions - CalculateTaxOnAddition(Additions))); } // Tax for dividends if (GetType() == typeof(BrokerageHolding)) { if (Data.RetirementIncome != 0) { var liability = IncomeTaxCalculator.TotalIncomeTaxFor(Data.FilingStatus, Data.RetirementIncome, Data.BasicAdjustment) / Data.RetirementIncome; InterestRateMultiplier = 1 - liability; } else { InterestRateMultiplier = 1; } } // Get the withdrawal var delta = GetWithdrawalFor(amounts[TimeToRetirement - 1], RetirementLength); // Populate the rest of the schedule for (var i = TimeToRetirement; i < TimeToRetirement + RetirementLength; i++) { amounts.Add(CalculateNextYearAmount(amounts[i - 1], -delta)); } amounts = amounts.Select(x => Decimal.Round(x, 2)).ToList(); Withdrawal = Decimal.Round(delta, 2); YearlyAmount = amounts; }
public PayslipGenerator(IncomeTaxCalculator incomeTaxCalculator = null) { _incomeTaxCalculator = new IncomeTaxCalculator() ?? incomeTaxCalculator; }
public IncomeTaxCalculatorTest() { function = new IncomeTaxCalculator(); context = new TestLambdaContext(); }