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