예제 #1
0
        public void CalculateDeductionsIreland()
        {
            // Arrange
            var controller      = new HomePayController();
            var employeeRequest = new HomePayCalculateRequest();

            employeeRequest.HourlyRate       = 50.0m;
            employeeRequest.HoursWorked      = 40;
            employeeRequest.EmployeeLocation = "Ireland";

            // Act
            var response = controller.CalculateGrossAmount(employeeRequest);

            response.Wait();
            var result = response.Result;

            // Assert
            var objResult = result as OkObjectResult;

            Assert.NotNull(objResult);

            var homepayResponse = objResult.Value as HomePayCalculateResponse;

            Assert.NotNull(homepayResponse);
            Assert.True(homepayResponse.EmployeeLocation == "Ireland");
            Assert.True(homepayResponse.GrossAmount == 2000.0m);
            Assert.True(homepayResponse.IncomeTax == 710.0m);
            Assert.True(homepayResponse.UniversalSocialCharge == 155.0m);
            Assert.True(homepayResponse.Pension == 80.0m);
            Assert.True(homepayResponse.NetAmount == 1055.0m); //2000.0m - 710.0m - 155.0m - 80.0m
        }
예제 #2
0
        public void CalculateDeductionsItaly()
        {
            // Arrange
            var controller      = new HomePayController();
            var employeeRequest = new HomePayCalculateRequest();

            employeeRequest.HourlyRate       = 50.0m;
            employeeRequest.HoursWorked      = 40;
            employeeRequest.EmployeeLocation = "Italy";

            // Act
            var response = controller.CalculateGrossAmount(employeeRequest);

            response.Wait();
            var result = response.Result;

            // Assert
            var objResult = result as OkObjectResult;

            Assert.NotNull(objResult);

            var homepayResponse = objResult.Value as HomePayCalculateResponse;

            Assert.NotNull(homepayResponse);
            Assert.True(homepayResponse.EmployeeLocation == "Italy");
            Assert.True(homepayResponse.GrossAmount == 2000.0m);
            Assert.True(homepayResponse.IncomeTax == (567.50m));  //500.0m + 67.50m - Income Tax and INPS Contribution
            Assert.True(homepayResponse.UniversalSocialCharge == 0m);
            Assert.True(homepayResponse.Pension == 0m);
            Assert.True(homepayResponse.NetAmount == 1432.50m); //2000.0m - 567.50m
        }
예제 #3
0
        public void CalculateGrossAmout()
        {
            // Arrange
            var controller      = new HomePayController();
            var employeeRequest = new HomePayCalculateRequest();

            employeeRequest.HourlyRate       = 10.0m;
            employeeRequest.HoursWorked      = 40;
            employeeRequest.EmployeeLocation = "Ireland";

            // Act
            var response = controller.CalculateGrossAmount(employeeRequest);

            response.Wait();
            var result = response.Result;

            // Assert
            var objResult = result as OkObjectResult;

            Assert.NotNull(objResult);

            var homepayResponse = objResult.Value as HomePayCalculateResponse;

            Assert.NotNull(homepayResponse);
            Assert.True(homepayResponse.EmployeeLocation == "Ireland");
            Assert.True(homepayResponse.GrossAmount == 400.0m);
        }
예제 #4
0
 private void validateRequest(HomePayCalculateRequest request)
 {
     if (string.IsNullOrWhiteSpace(request.EmployeeLocation))
     {
         ModelState.AddModelError("EmployeeLocation", "Location is mandatory");
     }
 }
예제 #5
0
        public override HomePayCalculateResponse CalculateHomePay(HomePayCalculateRequest request)
        {
            var totalGross = this.GetGrossValue(request);

            response.GrossAmount = totalGross;

            if (totalGross > 400)
            {
                response.IncomeTax = (400m * 0.25m) + ((totalGross - 400m) * 0.32m);
            }
            response.Pension = totalGross * 0.02m;

            response.NetAmount = this.GetNetValue();
            return(response);
        }
예제 #6
0
        public override HomePayCalculateResponse CalculateHomePay(HomePayCalculateRequest request)
        {
            var totalGross = this.GetGrossValue(request);

            response.GrossAmount = totalGross;

            response.IncomeTax = totalGross * 0.25m;
            if (totalGross > 500)
            {
                int INPSRate = (int)((totalGross - 500m) / 100.0m);
                var inpstax  = (500m * 0.09m) + ((totalGross - 500m) * (0.001m * INPSRate));
                response.IncomeTax += inpstax;
            }

            response.NetAmount = this.GetNetValue();
            return(response);
        }
예제 #7
0
        public override HomePayCalculateResponse CalculateHomePay(HomePayCalculateRequest request)
        {
            var totalGross = this.GetGrossValue(request);

            response.GrossAmount = totalGross;
            if (totalGross > 600)
            {
                response.IncomeTax = (600m * 0.25m) + ((totalGross - 600m) * 0.4m);
            }
            if (totalGross > 500)
            {
                response.UniversalSocialCharge = (500m * 0.07m) + ((totalGross - 500m) * 0.08m);
            }
            response.Pension   = totalGross * 0.04m;
            response.NetAmount = this.GetNetValue();
            return(response);
        }
예제 #8
0
        public async Task <IActionResult> CalculateGrossAmount(HomePayCalculateRequest employeeRequest)
        {
            validateRequest(employeeRequest);
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var country          = employeeRequest.EmployeeLocation;
            var selectedProvider = this.taxProviders.FirstOrDefault(i => i.Country.Equals(country, StringComparison.InvariantCultureIgnoreCase));

            if (selectedProvider == null)
            {
                return(BadRequest("Invalid Country"));
            }

            var response = selectedProvider.CalculateHomePay(employeeRequest);

            return(Ok(response));
        }
예제 #9
0
 protected decimal GetGrossValue(HomePayCalculateRequest request)
 {
     return(request.HourlyRate * request.HoursWorked);
 }
예제 #10
0
 public abstract HomePayCalculateResponse CalculateHomePay(HomePayCalculateRequest request);