Beispiel #1
0
        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));
        }
Beispiel #5
0
        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}");
        }
Beispiel #12
0
        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);
        }
Beispiel #15
0
 public void SetUp()
 {
     _incomeTaxCalculator = new IncomeTaxCalculator();
 }
Beispiel #16
0
 public void Initialize()
 {
     _incomeTaxCalculator = new IncomeTaxCalculator();
 }
Beispiel #17
0
 public void TestIncomeTax(FilingStatus status, decimal income, decimal expectedTax)
 {
     Assert.Equal(expectedTax, IncomeTaxCalculator.TotalIncomeTaxFor(status, income, 0.00M), 1);
 }
Beispiel #18
0
        // 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();
 }