Esempio n. 1
0
        public double MITA(double cita, int numberOfMonths)
        {
            double monthlySalary = cita / numberOfMonths;
            double previousCita = monthlySalary * (numberOfMonths - 1);
            int    min, max;

            NükEMEntities     db         = new NükEMEntities();
            List <TaxBracket> taxBracket = db.TaxBrackets.ToList();
            int IsOnBorder = 0;

            foreach (TaxBracket item in taxBracket)
            {
                min = item.MinCITA ?? 0;
                max = item.MaxCITA ?? 0;
                if (cita > min && previousCita < min)
                {
                    IsOnBorder = 1;
                }

                if (cita > min && cita < max && IsOnBorder == 0)
                {
                    mit = monthlySalary * item.Bracket;
                    break;
                }
                else if (cita > min && cita < max && IsOnBorder == 1)
                {
                    TaxBracket previous = db.TaxBrackets.Find(item.Id - 1);
                    mit = (cita - min) * item.Bracket + (min - previousCita) * previous.Bracket;
                    break;
                }
            }
            return(Math.Round(mit, 2));
        }
Esempio n. 2
0
        public void TaxBracketTest()
        {
            TaxBracket expected = new TaxBracket(3572, 37000, 0.325m);

            Assert.AreEqual(expected.AccumulatedTaxFromPreviousBracket, 3572m);
            Assert.AreEqual(expected.MarginalTaxRate, 37000m);
            Assert.AreEqual(expected.IncomeThreshold, 0.325m);
        }
Esempio n. 3
0
        public void _get_tax_rate(int annualIncome)
        {
            //Arrange
            //Act
            TaxBracket taxBracket = _taxService.GetTaxBracket(annualIncome);

            //Assert
            Assert.AreEqual(taxBracket.BaseRate, 3572);
            Assert.AreEqual(taxBracket.TaxPerDollar, 0.325m);
        }
        public TaxBracketBuilder AddBracket(decimal lowerLimit, decimal upperLimit, decimal taxRate)
        {
            var taxBracket = new TaxBracket
            {
                LowerLimit = lowerLimit,
                UpperLimit = upperLimit,
                TaxRate    = taxRate
            };

            _taxBrackets.Add(taxBracket);

            return(this);
        }
Esempio n. 5
0
        public EmployeePayslipCalculator()
        {
            var taxBracket1 = new TaxBracket(0, 18200, 0, 0);
            var taxBracket2 = new TaxBracket(18201, 37000, 0, 19);
            var taxBracket3 = new TaxBracket(37001, 80000, 3572, 32.5);
            var taxBracket4 = new TaxBracket(80001, 180000, 17547, 37);
            var taxBracket5 = new TaxBracket(180001, double.MaxValue, 54232, 45);

            _taxBrackets = new List <TaxBracket> {
                taxBracket1, taxBracket2, taxBracket3, taxBracket4, taxBracket5
            };
            _targetedPeriod = TargetedPeriod.Monthy;
        }
        private void TestCalculations(int salary, int rate, TaxBracket taxBracket)
        {
            var payslipRequest = GetMockRequestData();

            payslipRequest.AnnualSalary = salary;
            payslipRequest.SuperRate    = rate;
            var response = _payslipService.GeneratePayslip(payslipRequest);

            var expectedGrossIncome    = (int)Math.Round((decimal)(salary / 12));
            var expectedSuperannuation = (int)Math.Round((decimal)(expectedGrossIncome * rate / 100));
            var expectedIncomeTax      = salary == 0 ? 0
                : (int)Math.Round((taxBracket.Base + (salary - taxBracket.FromIncome) * taxBracket.TaxPerDollar) / 12);

            Assert.AreEqual(expectedGrossIncome, response.GrossIncome);
            Assert.AreEqual(expectedSuperannuation, response.Superannuation);
            Assert.AreEqual(expectedIncomeTax, response.IncomeTax);
            Assert.AreEqual(expectedGrossIncome - expectedIncomeTax, response.NetIncome);
        }
Esempio n. 7
0
        static void Main(string[] args)
        {
            var firstNameInput = StandardMessage.CaptureData("first name");
            var surnameInput   = StandardMessage.CaptureData("surname");

            var annualSalaryInput = StandardMessage.CaptureData("annual salary");

            var superRateInput = StandardMessage.CaptureData("super rate");

            var startDate = StandardMessage.CaptureData("payment start date");
            var endDate   = StandardMessage.CaptureData("payment end date");

            var bracket1 = TaxBracket.Generate(0M, 18200M, 0M, 0M);
            var bracket2 = TaxBracket.Generate(18201M, 37000M, 0M, 0.325M);
            var bracket3 = TaxBracket.Generate(37001M, 87000M, 3572M, 0.325M);
            var bracket4 = TaxBracket.Generate(87001M, 180000M, 19822M, 0.37M);
            var bracket5 = TaxBracket.Generate(180000M, Int32.MaxValue, 54232M, 0.45M);

            var taxTable = TaxTable.Build(bracket1, bracket2, bracket3, bracket4, bracket5);

            EmployeeDetails employeeDetails = EmployeeDetails.ConstructFullName(firstNameInput, surnameInput);

            PayPeriod payPeriod = PayPeriod.Generate(startDate, endDate);

            GrossIncome grossIncome = GrossIncome.Generate(annualSalaryInput, payPeriod);
            IncomeTax   incomeTax   = IncomeTax.Generate(taxTable, grossIncome, payPeriod);
            NetIncome   netIncome   = NetIncome.Generate(grossIncome, incomeTax);

            Super super = Super.Generate(superRateInput, grossIncome);

            var paySlip = PaySlip.Create(
                employeeDetails,
                payPeriod,
                grossIncome,
                incomeTax,
                netIncome,
                super
                );

            var payslipOutput = PayslipBuilder.Print(paySlip);

            Console.WriteLine(payslipOutput);
//
        }
        private int GetIncomeTax(int annualSalary)
        {
            var        previousTaxBracketIncome = 0;
            var        incomeTax      = 0.0;
            var        found          = false;
            var        taxBrackets    = _taxTableRepository.FindAll().ToList();
            TaxBracket lastTaxBracket = null;

            foreach (var taxBracket in taxBrackets)
            {
                lastTaxBracket = taxBracket;
                if (annualSalary <= taxBracket.MaximumIncome)
                {
                    incomeTax = CalculateIncomeTax(annualSalary, taxBracket, previousTaxBracketIncome);
                    found     = true;
                    break;
                }

                if (taxBracket.HasMaximumLimit)
                {
                    previousTaxBracketIncome = taxBracket.MaximumIncome;
                }
            }

            if (found)
            {
                return((int)Math.Round(incomeTax / 12, MidpointRounding.AwayFromZero));
            }

            if (lastTaxBracket == null)
            {
                return(0);
            }

            if (lastTaxBracket.HasMaximumLimit)
            {
                // TODO : Move validation to Data Layer
                throw new InvalidOperationException("Last Tax Bracket should have max income of -1");
            }

            incomeTax = CalculateIncomeTax(annualSalary, lastTaxBracket, previousTaxBracketIncome);
            return((int)Math.Round(incomeTax / 12, MidpointRounding.AwayFromZero));
        }
        public void TestBrackets()
        {
            TaxCalculator calc = new TaxCalculator(100_000.0, 0.0);

            Assert.IsTrue(IsClose(calc.TaxesOwed[(int)TaxCalculator.Backets.PER_37], 0.0));
            Assert.IsTrue(IsClose(calc.TaxesOwed[(int)TaxCalculator.Backets.PER_35], 0.0));
            Assert.IsTrue(IsClose(calc.TaxesOwed[(int)TaxCalculator.Backets.PER_32], 0.0));

            {
                double     min     = calc.BracketSet.TaxBrackets[(int)TaxCalculator.Backets.PER_22].UpperBound;
                double     taxable = 100_000.0 - min;
                TaxBracket tw4     = calc.BracketSet.TaxBrackets[(int)TaxCalculator.Backets.PER_24];
                double     proper  = taxable * tw4.Percent;
                double     actual  = calc.TaxesOwed[(int)TaxCalculator.Backets.PER_24];
                Assert.IsTrue(IsClose(proper, actual), $"Expected {proper}. Got {actual}");
            }

            {
                double taxable2 = calc.BracketSet.TaxBrackets[(int)TaxCalculator.Backets.PER_22].UpperBound
                                  - calc.BracketSet.TaxBrackets[(int)TaxCalculator.Backets.PER_12].UpperBound;
                double target = taxable2 * calc.BracketSet.TaxBrackets[(int)TaxCalculator.Backets.PER_22].Percent;
                double actual = calc.TaxesOwed[(int)TaxCalculator.Backets.PER_22];
                Assert.IsTrue(IsClose(target, actual), $"Expected {target}. Got {actual}");
            }

            {
                double taxable2 = calc.BracketSet.TaxBrackets[(int)TaxCalculator.Backets.PER_12].UpperBound
                                  - calc.BracketSet.TaxBrackets[(int)TaxCalculator.Backets.PER_10].UpperBound;
                double target = taxable2 * calc.BracketSet.TaxBrackets[(int)TaxCalculator.Backets.PER_12].Percent;
                double actual = calc.TaxesOwed[(int)TaxCalculator.Backets.PER_12];
                Assert.IsTrue(IsClose(target, actual), $"Expected {target}. Got {actual}");
            }

            {
                double taxable2 = calc.BracketSet.TaxBrackets[(int)TaxCalculator.Backets.PER_10].UpperBound;

                double target = taxable2 * calc.BracketSet.TaxBrackets[(int)TaxCalculator.Backets.PER_10].Percent;
                double actual = calc.TaxesOwed[(int)TaxCalculator.Backets.PER_10];
                Assert.IsTrue(IsClose(target, actual), $"Expected {target}. Got {actual}");
            }
        }
Esempio n. 10
0
        public void CalculatePayroll_ValidInputData_ShouldProduceCorrectPayroll(double taxRate,
                                                                                double hourlyRate, int timeCardHours, bool seniority, double payroll)
        {
            // arrange
            TaxBracket taxBracket = new TaxBracket
            {
                TaxRate = taxRate
            };

            Employee employee = new Employee
            {
                Seniority  = seniority,
                HourlyRate = hourlyRate
            };

            TimeCard timeCard = new TimeCard
            {
                TotalHours = timeCardHours
            };

            Mock <ITaxService>      taxServiceMock      = new Mock <ITaxService>();
            Mock <IEmployeeService> employeeServiceMock = new Mock <IEmployeeService>();
            Mock <ITimeCardService> timeCardServiceMock = new Mock <ITimeCardService>();

            taxServiceMock.Setup(x => x.GetTaxBracket(It.IsAny <double>())).Returns(taxBracket);
            employeeServiceMock.Setup(x => x.GetById(It.IsAny <string>())).Returns(employee);
            timeCardServiceMock
            .Setup(x => x.GetEmployeeTimeCard(It.IsAny <string>(), It.IsAny <DateTime>(), It.IsAny <DateTime>()))
            .Returns(timeCard);

            var sut = new PayrollCalculator(timeCardServiceMock.Object, employeeServiceMock.Object,
                                            taxServiceMock.Object);

            // act
            double amount = sut.CalculatePayroll(DateTime.Now, DateTime.Now.AddDays(7), "1");

            // assert
            Assert.Equal(payroll, amount);
        }
Esempio n. 11
0
        public void CalculatePayroll_LessThanOrEqualZeroTimeCardHours_ShouldReturnZero(int hours)
        {
            // arrange
            TaxBracket taxBracket = new TaxBracket
            {
                TaxRate = 0.2
            };

            Employee employee = new Employee
            {
                Seniority  = false,
                HourlyRate = 25
            };

            TimeCard timeCard = new TimeCard
            {
                TotalHours = hours
            };

            Mock <ITaxService>      taxServiceMock      = new Mock <ITaxService>();
            Mock <IEmployeeService> employeeServiceMock = new Mock <IEmployeeService>();
            Mock <ITimeCardService> timeCardServiceMock = new Mock <ITimeCardService>();

            taxServiceMock.Setup(x => x.GetTaxBracket(It.IsAny <double>())).Returns(taxBracket);
            employeeServiceMock.Setup(x => x.GetById(It.IsAny <string>())).Returns(employee);
            timeCardServiceMock
            .Setup(x => x.GetEmployeeTimeCard(It.IsAny <string>(), It.IsAny <DateTime>(), It.IsAny <DateTime>()))
            .Returns(timeCard);

            var sut = new PayrollCalculator(timeCardServiceMock.Object, employeeServiceMock.Object,
                                            taxServiceMock.Object);

            // act
            double payroll = sut.CalculatePayroll(DateTime.Now, DateTime.Now.AddDays(7), "1");

            // assert
            Assert.Equal(0, payroll);
        }
Esempio n. 12
0
        public double CalculatePayroll(DateTime startDate, DateTime endDate, string employeeId)
        {
            TimeCard timeCard = _timeCardService.GetEmployeeTimeCard(employeeId, startDate, endDate);

            if (timeCard.TotalHours <= 0)
            {
                return(0);
            }

            Employee employee = _emplyeeService.GetById(employeeId);

            TaxBracket taxBracket = _taxService.GetTaxBracket(employee.HourlyRate);

            double bonus = 0;

            if (employee.Seniority)
            {
                bonus = 100;
            }

            double payPeriodBasePay = employee.HourlyRate * timeCard.TotalHours;

            return((payPeriodBasePay + bonus) * (1 - taxBracket.TaxRate));
        }
Esempio n. 13
0
        static void Main(string[] args)
        {
            #region setup context config
            IConfigurationBuilder builder = new ConfigurationBuilder()
                                            .SetBasePath(Directory.GetCurrentDirectory())
                                            .AddJsonFile("appsettings.json", optional: true);

            IConfigurationRoot configuration = builder.Build();

            DbContextOptionsBuilder <PayrollDbContext> optionsBuilder = new DbContextOptionsBuilder <PayrollDbContext>();
            optionsBuilder.UseSqlServer(configuration.GetConnectionString("DefaultConnection"));
            #endregion

            PayrollDbContext context = new PayrollDbContext(optionsBuilder.Options);

            string payFileOutput = "Employee Id|Total Hours|Health Amount|Life Amount|Tax Rate|Base Pay|Net Pay\r\n";

            DateTime startDateTime = Convert.ToDateTime("10/6/2019");
            DateTime endDateTime   = Convert.ToDateTime("10/20/2019");

            // get employee timecards from database
            List <TimeCard> timeCards = new List <TimeCard>();
            timeCards = context.TimeCards
                        .Where(x => x.StartDateTime >= startDateTime && x.EndDateDateTime <= endDateTime).ToList();

            foreach (var timeCard in timeCards)
            {
                // fetch details of employee for timecard from database
                Employee employee = context.Employees.FirstOrDefault(x => x.Id == timeCard.EmployeeId);

                double salary = employee.HourlyRate * 40 * 52;

                HttpClient httpClient = new HttpClient();

                // get the employee's taxrate from HR system API
                string taxRateJson =
                    httpClient.GetStringAsync(
                        $"https://test.mocktopus.dev-squared.com/payroll/api/taxrate?salary={salary}&zip={employee.ZipCode}").Result;

                TaxBracket taxBracket = JsonConvert.DeserializeObject <TaxBracket>(taxRateJson);

                // get the employee's insurance deductions from HR system API
                string insuranceJson =
                    httpClient.GetStringAsync(
                        $"https://test.mocktopus.dev-squared.com/payroll/api/benefits?id={employee.Id}").Result;

                InsuranceAmounts insuranceAmounts = JsonConvert.DeserializeObject <InsuranceAmounts>(insuranceJson);

                // calculate net payroll amount
                double netPay  = 0;
                double basePay = timeCard.TotalHours * employee.HourlyRate;
                if (employee.Seniority)
                {
                    basePay += 100;
                }

                if (employee.InsuranceBeforeTaxes)
                {
                    netPay  = basePay;
                    netPay -= insuranceAmounts.Health;
                    netPay -= insuranceAmounts.Life;
                    netPay  = netPay * (1 - taxBracket.TaxRate);
                }
                else
                {
                    netPay  = basePay * (1 - taxBracket.TaxRate);
                    netPay -= insuranceAmounts.Health;
                    netPay -= insuranceAmounts.Life;
                }

                // output to desired format
                payFileOutput +=
                    $"{employee.Id}|{timeCard.TotalHours}|${insuranceAmounts.Health}|${insuranceAmounts.Life}|{taxBracket.TaxRate}|${basePay}|${netPay}\r\n";
            }


            Console.WriteLine(payFileOutput);

            // send output file wherever needed

            Console.ReadLine();
        }
        private double CalculateIncomeTax(int annualSalary, TaxBracket taxBracket, int previousTaxBracketIncome)
        {
            var incomeTax = taxBracket.FixedTax + ((annualSalary - previousTaxBracketIncome) * taxBracket.Tax);

            return(incomeTax);
        }