public async Task <ProductData> Handle(GetProductDataCommand message, CancellationToken cancellationToken) { using (var httpClient = _httpClientFactory.CreateClient()) { httpClient.AddDefaultJsonHeaders(); try { string checkCustomerId = string.IsNullOrEmpty(message.CustomerId) ? "" : "&customer-id=" + message.CustomerId; using (HttpResponseMessage response = await httpClient.GetAsync(_apiEndPoints.GetServiceUrl("product") + "products/" + message.ProductCode + "?include=available-collateral-models-data,bundled-products" + checkCustomerId)) { var res = await response.Content.ReadAsStringAsync(); if (string.IsNullOrEmpty(res)) { _logger.LogError("Could not fetch product data for product: {productCode}. Response is empty", message.ProductCode); throw new Exception("Could not fetch Product"); } var productData = (ProductData)CaseUtil.ConvertFromJsonToObject(res, typeof(ProductData)); if (string.IsNullOrEmpty(productData.ProductCode)) { return(null); } var conditions = await GetProductConditions(message.ProductCode); productData.Conditions = await _priceCalculation.ReadVariationDefinitions(conditions); if (productData.IsPackage) { productData.BundleDefaults = await GetProductBundleDefaults(productData.ProductCode); } if (message.IncludeArray.Contains("documentation")) { var getProductDocs = new IdentifiedCommand <GetProductDocumentationCommand, List <ProductDocumentation> >( new GetProductDocumentationCommand { ProductCode = message.ProductCode, CustomerId = message.CustomerId }, new Guid()); productData.RequiredDocumentation = await _mediator.Send(getProductDocs); } return(productData); } } catch (HttpRequestException e) { _logger.LogError(e, "Could not fetch product data for product: {productCode}", message.ProductCode); throw e; } } }
public async Task <PriceCalculationResponse> Handle(InitiatePriceCalculationCommand message, CancellationToken cancellationToken) { ProductConditions conditions = await _priceCalculation.ReadVariationDefinitions(new ProductConditions { Fees = message.Fees == null ? null : new List <FeeCondition>(message.Fees), InterestRates = message.InterestRates == null ? null : new List <InterestRateCondition>(message.InterestRates) }); var calcParams = new PriceCalculationParameters { InterestRates = conditions.InterestRates, Fees = conditions.Fees, Amount = message.Amount, Term = message.Term, Currency = message.Currency, Channel = message.Channel, RiskScore = message.RiskScore, CustomerSegment = message.CustomerSegment, CollateralModel = message.CollateralModel, PartOfBundle = message.ProductBundling, Campaign = message.Campaign, Options = message.ProductOptions, CreditRating = message.CreditRating, CustomerValue = message.CustomerValue, DebtToIncome = message.DebtToIncome, AdditionalProperties = message.BundledComponents }; var calcResult = await _priceCalculator.CalculatePrice(calcParams); var result = new PriceCalculationResponse { Fees = calcResult.Fees, InterestRates = calcResult.InterestRates, Napr = calcResult.Napr }; return(result); }
public async Task <ArrangementRequest> Handle(InitiateCalculateOfferCommand message, CancellationToken cancellationToken) { ProductConditions conditions = await _priceCalculation.ReadVariationDefinitions(message.ProductConditions); var parameters = Mapper.Map <InitiateCalculateOfferCommand, ArrangementRequestInitializationParameters>(message); try { parameters.MaturityDate = Utility.GetEndDateFromPeriod(parameters.Term, message.CalculationDate); } catch (InvalidTermException) { // do nothing } ArrangementRequest result = _requestFactory.GetForArrangementKind(parameters, message.ArrangementKind); if (parameters.MaturityDate.HasValue && result.IsFinanceService()) { FinanceServiceArrangementRequest fsr = result as FinanceServiceArrangementRequest; fsr.MaturityDate = parameters.MaturityDate.Value; } result.ParentProductCode = message.PartOfBundle; result.Campaign = message.Campaign; result.Options = message.ProductOptions; if (result is FinanceServiceArrangementRequest finRequest) { finRequest.CollateralModel = message.CollateralModel; } Dictionary <string, OptionGroup> productShapsotOptions = new Dictionary <string, OptionGroup>(); if (message.ProductOptions != null) { foreach (var option in message.ProductOptions) { if (productShapsotOptions.TryGetValue(option.GroupCode, out OptionGroup optionGroup)) { optionGroup.Options.Add(new Option { Code = option.Code, Description = option.Description, Effects = option.Effects }); } else { productShapsotOptions.Add(option.GroupCode, new OptionGroup { Code = option.GroupCode, Description = option.GroupDescription, Options = new List <Option> { new Option { Code = option.Code, Description = option.Description, Effects = option.Effects } } }); } } } result.ProductSnapshot = new ProductSnapshot { Conditions = conditions, Campaign = message.Campaign, OptionGroups = productShapsotOptions.Values.ToList(), MinimumDaysForFirstInstallment = message.MinimumDaysForFirstInstallment }; OfferApplication application = new OfferApplication { CustomerSegment = message.CustomerSegment, CollateralModel = message.CollateralModel, RiskScore = message.RiskScore ?? null, ChannelCode = message.Channel, DebtToIncome = message.DebtToIncome, CustomerValue = message.CustomerValue, CreditRating = message.CreditRating, RequestDate = message.RequestDate }; try { _logger.LogInformation("Calculating offer for term: {term}, annuity: {annutiy} and amount {amount} and interest rate: {rate}", message.Term, message.Annuity, message.Amount, message.InterestRate); result = _calculatorProvider.Calculate(result, application, message.BundledComponents); RemoveDmnFields(result); try { await _auditClient.WriteLogEntry(AuditLogEntryAction.Execute, AuditLogEntryStatus.Success, "application", application.ApplicationNumber, "Calculating offer for term: " + message.Term + ", annuity: " + message.Annuity + " and amount " + message.Amount, new { }); } catch (Exception ex) { _logger.LogError(ex, "Audit error in UpdateApplicationStatusCommandHandler"); } return(result); } catch (MaxNumberOfIterationsException e) { _logger.LogInformation("Error in calculation: {calcErr}. Command data: {command}", e.Message, message); throw e; } catch (Exception exp) { _logger.LogError(exp, "Exception while calculating offer for data, term: {term}, annuity: {annutiy} and amount {amount} and interest rate: {rate}", message.Term, message.Annuity, message.Amount, message.InterestRate); throw new NotImplementedException(exp.Message); } }