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));
        }
Пример #2
0
        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));
        }