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