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)); }