public async Task <ImpactOfBaseRateChange> CalculateImpactOfBaseRateChange ( long userId, long agreementId, BaseRateCodeEnum newBaseRate ) { var userRepo = this.uow.GetRepository <User>(); var user = await userRepo.GetAsync( u => u.Id == userId && u.Agreements.Any(a => a.Id == agreementId), u => u.Include(x => x.Agreements) ) ?? throw new EntityNotFoundException($"User with Id: {userId}, which has an agreement with Id: {agreementId}, was not found."); var targetAgreement = user.Agreements.Single(a => a.Id == agreementId); var baseRatesCodes = new List <BaseRateCodeEnum> { targetAgreement.BaseRateCodeId, newBaseRate }; var baseRateTasks = baseRatesCodes.Select(brc => this.baseRateService.GetBaseRate(brc)); var baseRates = await Task.WhenAll(baseRateTasks); var currentInterestRate = targetAgreement.CalculateInterestRate(baseRates.First()); var newInterestRate = targetAgreement.CalculateInterestRate(baseRates.Last()); return(new ImpactOfBaseRateChange { User = user.ToDto(), Agreement = targetAgreement.ToDto(), CurrentInterestRate = currentInterestRate, NewInterestRate = newInterestRate, InterestRateDifference = Math.Abs(newInterestRate - currentInterestRate) }); }
public async Task <ActionResult> CalculateBaseRateChangeImpact( [FromRoute] long userId, [FromRoute] long agreementId, [FromQuery][Required] BaseRateCodeEnum newBaseRate ) { return(Ok(await this.interestRateService.CalculateImpactOfBaseRateChange(userId, agreementId, newBaseRate))); }
public async Task <decimal> GetBaseRate(BaseRateCodeEnum baseRateCode) { var endpoint = $"http://www.lb.lt/webservices/VilibidVilibor/VilibidVilibor.asmx/getLatestVilibRate?RateType={baseRateCode.ToString()}"; var response = await this.httpClient.GetAsync(endpoint); if (!response.IsSuccessStatusCode) { throw new IntegrationFailedException("Failed to retrieve the latest Vilib rate from www.lb.lt"); } var content = await response.Content.ReadAsStringAsync(); XDocument xmlContent = XDocument.Parse(content); var baseRateAsString = (xmlContent.FirstNode as XElement).Value; var baseRate = decimal.Parse(baseRateAsString, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture); return(baseRate); }