public async Task <IActionResult> PostAsync([FromBody] RefundOfNotionalTaxCalculationRequestModel data) { if (data == null) { ModelState.AddModelError("", "Bad payload provided; unable to parse the request , please review request data and try again"); _logger.LogError(400, $"Bad payload " + $"{ModelState}\n Request Data is null and could not be parsed"); return(BadRequest(ModelState)); } var validator = new RefundOfNotionalTaxCalculationRequestValidator(); if (!ModelState.IsValid || !validator.Validate(data).IsValid) { _logger.LogError((int)System.Net.HttpStatusCode.BadRequest, $"Request model not valid " + $"{ModelState}\n Request Data {JsonConvert.SerializeObject(data)} \n Errors : " + $"{validator.Validate(data).Errors.GetErrorsAsString()} "); return(BadRequest(ModelState)); } var result = await _rontCalculationService.PerformRefundOfNotionalTaxCalculationAsync(data, _options); _logger.LogInformation((int)HttpStatusCode.OK, $"Calculation performed successfully for the request data provided \n Request Data: {JsonConvert.SerializeObject(data)}"); return(Ok(result)); }
public async Task PerformRefundOfNotionalTaxCalculation( RefundOfNotionalTaxCalculationRequestModel request1, RefundOfNotionalTaxResponseDto response1, RefundOfNotionalTaxCalculationRequestModel request2, RefundOfNotionalTaxResponseDto response2, RefundOfNotionalTaxCalculationRequestModel request3, RefundOfNotionalTaxResponseDto response3) { var inputData = new List <RefundOfNotionalTaxCalculationRequestModel>() { request1, request2, request3 }; var expectedResult = new List <RefundOfNotionalTaxResponseDto>() { response1, response2, response3 }; var outputResult = new List <RefundOfNotionalTaxResponseDto>(); //Act foreach (var data in inputData) { var res = await _refundOfNotionalTaxCalculationService.PerformRefundOfNotionalTaxCalculationAsync(data, _options); outputResult.Add(res); } //Assert int i = 0; foreach (var actualResult in outputResult) { var expectedCalculationResult = expectedResult[i]; Assert.IsType <RefundOfNotionalTaxResponseDto>(actualResult); actualResult.TaxableEarning.Should().Be(expectedCalculationResult.TaxableEarning); actualResult.TaxAllowance.Should().Be(expectedCalculationResult.TaxAllowance); actualResult.MaximumCNPEntitlement.Should().Be(expectedCalculationResult.MaximumCNPEntitlement); actualResult.CnpPaid.Should().Be(expectedCalculationResult.CnpPaid); actualResult.CnpTaxDeducted.Should().Be(expectedCalculationResult.CnpTaxDeducted); actualResult.MaximumRefundLimit.Should().Be(expectedCalculationResult.MaximumRefundLimit); actualResult.CNPPaidAfterRefund.Should().Be(expectedCalculationResult.CNPPaidAfterRefund); actualResult.RefundAmount.Should().Be(expectedCalculationResult.RefundAmount); i++; } }
public async Task <RefundOfNotionalTaxResponseDto> PerformRefundOfNotionalTaxCalculationAsync( RefundOfNotionalTaxCalculationRequestModel data, IOptions <ConfigLookupRoot> options) { decimal?refundAmount = 0.0m; var refundDue = data.TaxableEarnings < data.TaxAllowance ? true : false; if (refundDue) { refundAmount = data.CnpTaxDeducted; } var diffTaxAllowanceTaxableEarnings = data.TaxAllowance - data.TaxableEarnings; var diffMaxCNPEntitlementCnpPaid = data.MaximumCNPEntitlement - data.CnpPaid; var maximumRefundLimit = diffTaxAllowanceTaxableEarnings < diffMaxCNPEntitlementCnpPaid ? diffTaxAllowanceTaxableEarnings : diffMaxCNPEntitlementCnpPaid; if (maximumRefundLimit < 0) { maximumRefundLimit = 0; } //check refund does not generate tax liability if (refundAmount > maximumRefundLimit) { refundAmount = maximumRefundLimit; } //check refund and netCNPPaid does not exceed cnpMeximumEntitlement if ((refundAmount + data.CnpTaxDeducted) > (data.MaximumCNPEntitlement)) { refundAmount = data.MaximumCNPEntitlement - refundAmount; } var calculationResult = new RefundOfNotionalTaxResponseDto(); calculationResult.TaxableEarning = Math.Round(data.TaxableEarnings.Value, 2); calculationResult.TaxAllowance = Math.Round(data.TaxAllowance.Value, 2); calculationResult.MaximumCNPEntitlement = Math.Round(data.MaximumCNPEntitlement.Value, 2); calculationResult.CnpPaid = Math.Round(data.CnpPaid.Value, 2); calculationResult.CnpTaxDeducted = Math.Round(data.CnpTaxDeducted.Value, 2); calculationResult.MaximumRefundLimit = Math.Round(maximumRefundLimit.Value, 2); calculationResult.CNPPaidAfterRefund = Math.Round(refundAmount.Value + data.CnpPaid.Value, 2); calculationResult.RefundAmount = Math.Round(refundAmount.Value, 2); return(await Task.FromResult(calculationResult)); }