Esempio n. 1
0
        public SalaryDetails GetSalaryDetails(SalaryInformationRequest request)
        {
            var salaryDetails = new SalaryDetails();
            var grossIncome   = request.details.GrossIncome;

            if (grossIncome > 0)
            {
                salaryDetails.GrossIncome        = grossIncome;
                salaryDetails.IncomeTaxThreshold = _taxSettings.TaxThreshold;

                // TODO: Refactor into smaller more maintainable parts
                if (_features.UsePension)
                {
                    salaryDetails.Pension = _taxSettings.DefaultPensionRate * grossIncome;
                    salaryDetails.TotalStatutoryDeductions += salaryDetails.Pension;
                }

                if (_features.UseNISRate)
                {
                    salaryDetails.NIS = _taxSettings.NISRate * grossIncome;

                    if (_features.UseNISCap && salaryDetails.NIS > _taxSettings.NISCap)
                    {
                        salaryDetails.NIS = _taxSettings.NISCap;
                    }

                    salaryDetails.TotalStatutoryDeductions += salaryDetails.NIS;
                }

                if (_features.UseEducationTaxRate)
                {
                    salaryDetails.EducationTax              = _taxSettings.EducationTaxRate * (grossIncome - salaryDetails.TotalStatutoryDeductions);
                    salaryDetails.TotalStatutoryDeductions += salaryDetails.EducationTax;
                }

                if (_features.UseNHTRate)
                {
                    salaryDetails.NHT = _taxSettings.NHTRate * grossIncome;
                    salaryDetails.TotalStatutoryDeductions += salaryDetails.NHT;
                }

                var statutoryIncome = grossIncome - salaryDetails.TotalStatutoryDeductions;
                var taxableIncome   = (grossIncome - (salaryDetails.Pension + salaryDetails.NIS)) - _taxSettings.TaxThreshold;
                salaryDetails.TaxableIncome = taxableIncome;

                if (_features.UseIncomeTax)
                {
                    salaryDetails.IncomeTax = (grossIncome > _taxSettings.StandardIncomeTaxMark)
                        ? taxableIncome * _taxSettings.IncomeTaxRateForIncomeAboveStandardMark
                        : taxableIncome * _taxSettings.IncomeTaxRateForIncomeBelowStandardMark;
                }

                salaryDetails.NetIncome = statutoryIncome - salaryDetails.IncomeTax;
            }

            return(salaryDetails);
        }
        public IActionResult Calculate(Decimal grossIncome, bool hasPension = false, Decimal pensionRate = 0)
        {
            SalaryInformationRequest  request  = new SalaryInformationRequest();
            SalaryInformationResponse response = new SalaryInformationResponse();

            try
            {
                request.details.GrossIncome = grossIncome;

                response.Details = _taxService.GetSalaryDetails(request);
                response.Success = true;
            }
            catch (Exception ex)
            {
                var errorMessage = "An exception occured while trying to process your request.";
                Console.WriteLine($"{errorMessage} {ex.Message} - {ex.StackTrace}");
                response = new SalaryInformationResponse();
                response.Errors.Add(errorMessage);

                return(BadRequest(response));
            }

            return(Ok(response));
        }