コード例 #1
0
        public async Task <ApportionmentCalculationResponseDTO> PerformApportionmentCalculationAsync(
            ApportionmentCalculationRequestModel data, IOptions <ConfigLookupRoot> options)
        {
            decimal preferentialClaim       = 0.0m;
            decimal preferentialLimit       = ConfigValueLookupHelper.GetPreferentialLimit(options, DateTime.Now);
            decimal apportionmentPercentage = 1.0m;

            if (data.TupeStatus)
            {
                preferentialClaim = Math.Min(data.GrossPaidInFourMonth, preferentialLimit);
            }
            if (data.TupeStatus == false && data.TotalClaimedInFourMonth > 0.0m)
            {
                apportionmentPercentage = (data.TotalClaimedInFourMonth <= preferentialLimit) ? 1m :
                                          data.GrossPaidInFourMonth / data.TotalClaimedInFourMonth;

                preferentialClaim = (data.TotalClaimedInFourMonth > preferentialLimit
                    ? preferentialLimit * apportionmentPercentage
                    : data.GrossPaidInFourMonth * apportionmentPercentage);
            }
            apportionmentPercentage = Math.Round(apportionmentPercentage * 100, 4);
            var result = new ApportionmentCalculationResponseDTO()
            {
                ApportionmentPercentage = apportionmentPercentage,
                PrefClaim    = Math.Round(preferentialClaim, 2),
                NonPrefClaim = Math.Round((data.GrossEntitlement - preferentialClaim), 2),
                TupeStatus   = data.TupeStatus
            };

            return(await Task.FromResult(result));
        }
コード例 #2
0
        public async Task <IActionResult> PostAsync([FromBody] ApportionmentCalculationRequestModel data)
        {
            try
            {
                if (data == null)
                {
                    ModelState.AddModelError("",
                                             "Bad payload provided; unable to parse the request , please review request data and try again");
                    _logger.LogError((int)HttpStatusCode.BadRequest, $"Bad payload " +
                                     $"{ModelState}\n Request Data is null and could not be parsed");
                    return(BadRequest(ModelState));
                }
                var validator = new ApportionmentCalculationRequestValidator();
                if (!ModelState.IsValid || !validator.Validate(data).IsValid)
                {
                    _logger.LogError((int)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 _apportionmentCalculationService.PerformApportionmentCalculationAsync(data, _options);

                return(Ok(result));
            }
            catch (MissingConfigurationException exp)
            {
                _logger.LogError((int)HttpStatusCode.BadRequest,
                                 $"Apportionment Calculation was not performed for the request data provided \n Request Data: {JsonConvert.SerializeObject(data)} Bad payload provided; {exp.Message}, please review request data and try again");
                return(BadRequest($"Bad payload provided; {exp.Message}, please review request data and try again"));
            }
        }
        public async Task ReturnsCorrectNonPreferentialClaimAmount_WhenApportionmentPercentageIs56()
        {
            // Arrange
            var request = new ApportionmentCalculationRequestModel()
            {
                GrossPaidInFourMonth    = 2249.71m,
                GrossEntitlement        = 2249.71m,
                TotalClaimedInFourMonth = 4000m,
                TupeStatus = false
            };

            // Act
            var result = await _service.PerformApportionmentCalculationAsync(request, _options);

            // Assert
            Math.Round(result.PrefClaim, 2).Should().Be(449.94m);
            Math.Round(result.NonPrefClaim, 2).Should().Be(1799.77m);
            result.ApportionmentPercentage.Should().Be(56.2428m);
            result.TupeStatus.Should().Be(false);
        }
        public async Task ReturnsCorrectPrefAndNonPrefClaimValues_WhenNotTupeAndDoesNotExceedsLimitAndFullyPaidIn4Months()
        {
            // Arrange
            var request = new ApportionmentCalculationRequestModel()
            {
                GrossPaidInFourMonth    = 689.04m,
                GrossEntitlement        = 689.04m,
                TotalClaimedInFourMonth = 3445.20m,
                TupeStatus = false
            };
            // Act
            var result = await _service.PerformApportionmentCalculationAsync(request, _options);

            // Assert
            Math.Round(result.PrefClaim, 2).Should().Be(160m);
            Math.Round(result.NonPrefClaim, 2).Should()
            .Be(Math.Round(request.GrossPaidInFourMonth, 2) - Math.Round(result.PrefClaim, 2));
            result.TupeStatus.Should().Be(request.TupeStatus);
            result.ApportionmentPercentage.Should().Be(20);
        }
        public async Task ReturnsCorrectApportionmentPercentage_WhenTotalClaimedIsLessThanOrEqualTo800()
        {
            // Arrange
            var request = new ApportionmentCalculationRequestModel()
            {
                GrossPaidInFourMonth    = 799.99m,
                GrossEntitlement        = 800m,
                TotalClaimedInFourMonth = 800m,
                TupeStatus = false
            };

            // Act
            var result = await _service.PerformApportionmentCalculationAsync(request, _options);

            // Assert
            Math.Round(result.PrefClaim, 2).Should().Be(799.99m);
            Math.Round(result.NonPrefClaim, 2).Should().Be(0.01m);
            result.ApportionmentPercentage.Should().Be(100.0m);
            result.TupeStatus.Should().Be(false);
        }
        public async Task ReturnsCorrectApportionmentPercentage_WhenTupeStatusIsTrue()
        {
            // Arrange
            var request = new ApportionmentCalculationRequestModel()
            {
                GrossPaidInFourMonth    = 925.0m,
                GrossEntitlement        = 1835.0m,
                TotalClaimedInFourMonth = 2598.0m,
                TupeStatus = true
            };

            // Act
            var result = await _service.PerformApportionmentCalculationAsync(request, _options);

            // Assert
            Math.Round(result.PrefClaim, 2).Should().Be(800.0m);
            Math.Round(result.NonPrefClaim, 2).Should().Be(1035.0m);
            result.ApportionmentPercentage.Should().Be(100.0m);
            result.TupeStatus.Should().Be(request.TupeStatus == true);
        }
        public async Task ReturnsCorrectPrefAndNonPrefClaimValues_WhenFalseTupeStatusAndTotalClaimedIsZero()
        {
            // Arrange
            var request = new ApportionmentCalculationRequestModel()
            {
                GrossPaidInFourMonth    = 998.00m,
                GrossEntitlement        = 998.00m,
                TotalClaimedInFourMonth = 0.0m,
                TupeStatus = false
            };

            // Act
            var result = await _service.PerformApportionmentCalculationAsync(request, _options);

            // Assert
            Math.Round(result.PrefClaim, 2).Should().Be(0.00m);
            Math.Round(result.NonPrefClaim, 2).Should()
            .Be(Math.Round(request.GrossPaidInFourMonth, 2));
            result.TupeStatus.Should().Be(request.TupeStatus);
            result.ApportionmentPercentage.Should().Be(100.0m);
        }
        public async Task PostAsync_FailsWithBadRequest_WhenThereIsAValidationError(ApportionmentCalculationRequestModel request, string expectedErrorMessage)
        {
            //Arrange
            var controller = new ApportionmentController(_service.Object, _mockLogger.Object, _confOptions);

            //Act
            var result = await controller.PostAsync(request);

            //Assert
            var badRequestObjectRequest = result.Should().BeOfType <BadRequestObjectResult>().Subject;

            badRequestObjectRequest.StatusCode.Should().Be((int)System.Net.HttpStatusCode.BadRequest);

            _mockLogger.Verify(x => x.Log(
                                   LogLevel.Error,
                                   It.IsAny <EventId>(),
                                   It.Is <object>(v => v.ToString().Contains(expectedErrorMessage)),
                                   null,
                                   It.IsAny <Func <object, Exception, string> >()
                                   ));
        }
        public async Task ReturnsCorrectPrefAndNonPrefClaimValues_WhenTupeAndExceedsLimit()
        {
            // Arrange
            var request = new ApportionmentCalculationRequestModel()
            {
                GrossPaidInFourMonth    = 898.00m,
                GrossEntitlement        = 1002.24m,
                TotalClaimedInFourMonth = 4698.00m,
                TupeStatus = true
            };

            // Act
            var result = await _service.PerformApportionmentCalculationAsync(request, _options);

            // Assert
            Math.Round(result.PrefClaim, 2).Should()
            .Be(ConfigValueLookupHelper.GetPreferentialLimit(_options, DateTime.Now));
            Math.Round(result.NonPrefClaim, 2).Should()
            .Be(Math.Round(request.GrossEntitlement, 2) - Math.Round(result.PrefClaim, 2));
            result.TupeStatus.Should().Be(request.TupeStatus);
            result.ApportionmentPercentage.Should().Be(100.0m);
        }