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;
                }
            }
        }
示例#2
0
        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);
            }
        }