public ArrangementRequest Calculate(ArrangementRequest arrangementRequest, Application application = null, IDictionary <string, JToken> additionalProperties = null) { var priceCalculationParameters = arrangementRequest.GetPriceCalculationParameters(application); if (additionalProperties != null && additionalProperties.Keys.Count() > 0) { priceCalculationParameters.AdditionalProperties = priceCalculationParameters.AdditionalProperties ?? new Dictionary <string, JToken>(); priceCalculationParameters.AdditionalProperties = priceCalculationParameters.AdditionalProperties .Concat(additionalProperties .Where(k => !priceCalculationParameters.AdditionalProperties.ContainsKey(k.Key)) .ToDictionary(k => k.Key, v => v.Value)) .ToDictionary(k => k.Key, v => v.Value); } var calculationEngine = _configurationService.GetEffective("offer/calculation-engine", "basic").Result; switch (calculationEngine) { case "basic": return(CalculateAsBasic(arrangementRequest, priceCalculationParameters)); case "calculation-service": try { var calcServiceCalculator = (CalculationServiceCalculator)_serviceProvider.GetService(typeof(CalculationServiceCalculator)); return(calcServiceCalculator.CalculateAsCalculationService(arrangementRequest, priceCalculationParameters).Result); } catch (Exception e) { throw e; } case "simple-calculation": return(CalculateBySimpleCalculation(arrangementRequest, priceCalculationParameters)); default: return(CalculateAsBasic(arrangementRequest, priceCalculationParameters)); } }
public async Task <CommandStatus <bool> > Handle(UpdateArrangementRequestCommand message, CancellationToken cancellationToken) { this._logger.LogInformation("handle u command handleru"); message.ArrangementRequest.ApplicationId = message.ApplicationNumber; message.ArrangementRequest.ArrangementRequestId = message.ArrangementRequestId; ArrangementRequest request = _arrangementRequestRepository.GetArrangementRequest(message.ApplicationNumber, message.ArrangementRequestId); var conversionMethod = _configurationService.GetEffective("offer/fee-currency-conversion-method", "Buy to middle").Result; if (request == null) { _logger.LogWarning("Tried to update unexisting arrangement request with application number: {0} and arrangement request id: {1}", message.ApplicationNumber, message.ArrangementRequestId); var e = new Exception(string.Format("Tried to update unexisting arrangement request with application number: {0} and arrangement request id: {1}", message.ApplicationNumber, message.ArrangementRequestId)); return(new CommandStatus <bool> { Result = false, CommandResult = StandardCommandResult.BAD_REQUEST, Exception = e }); } if (message.ArrangementRequest is TermLoanRequest termRequest && termRequest.DisbursementsInfo != null && termRequest.DisbursementsInfo.Any()) { var amountToBeChecked = termRequest.InvoiceAmount > 0 ? termRequest.InvoiceAmount : termRequest.Amount; CurrencyConverter currencyConverter = new CurrencyConverter(); decimal sumOfDisbursementsInPrimaryCurrency = 0; foreach (var item in termRequest.DisbursementsInfo) { if (item != null && item.Amount != null) { continue; } if (item.Amount.Code == termRequest.Currency) { sumOfDisbursementsInPrimaryCurrency += item.Amount.Amount; } else { sumOfDisbursementsInPrimaryCurrency += currencyConverter.CurrencyConvert(item.Amount.Amount, item.Amount.Code, termRequest.Currency, DateTime.Today.ToString("o", CultureInfo.InvariantCulture), conversionMethod); } if (sumOfDisbursementsInPrimaryCurrency > amountToBeChecked) { _logger.LogWarning("Sum of disbursement info entries: {0}{2} is larger than invoice(credit) amount: {1}{2}", sumOfDisbursementsInPrimaryCurrency, amountToBeChecked, termRequest.Currency); var e = new Exception(string.Format("Sum of disbursement info is above limits (invoice amount)")); return(new CommandStatus <bool> { Result = false, CommandResult = StandardCommandResult.BAD_REQUEST, Exception = e }); } } } message.ArrangementRequest.InstallmentPlan = request.InstallmentPlan; if (request.ProductCode == message.ArrangementRequest.ProductCode) { message.ArrangementRequest.ProductSnapshot = request.ProductSnapshot; message.ArrangementRequest.ProductName = request.ProductName; } else { return(new CommandStatus <bool> { Result = false, CommandResult = StandardCommandResult.BAD_REQUEST, Exception = new Exception("An error occurred while updating arrangment - product code is wrong") }); //var getProductData = new IdentifiedCommand<GetProductDataCommand, ProductData>( // new GetProductDataCommand { ProductCode = message.ArrangementRequest.ProductCode }, new Guid()); //ProductData productData = await _mediator.Send(getProductData); //ProductSnapshot snapshot = Mapper.Map<ProductData, ProductSnapshot>(productData); //message.ArrangementRequest.ProductSnapshot = snapshot; //message.ArrangementRequest.ProductName = snapshot.Name; } OfferApplication application = await _applicationRepository.GetAsync(message.ArrangementRequest.ApplicationId); application.PreferencialPrice = priceCalculator.HasPreferentialPrice(message.ArrangementRequest.Conditions); // Arrangement conditions request.Conditions = message.ArrangementRequest.Conditions; var priceCalculationParameters = request.GetPriceCalculationParameters(application); /*if (additionalProperties != null && additionalProperties.Keys.Count() > 0) * { * priceCalculationParameters.AdditionalProperties = priceCalculationParameters.AdditionalProperties ?? new Dictionary<string, JToken>(); * priceCalculationParameters.AdditionalProperties = priceCalculationParameters.AdditionalProperties * .Concat(additionalProperties * .Where(k => !priceCalculationParameters.AdditionalProperties.ContainsKey(k.Key)) * .ToDictionary(k => k.Key, v => v.Value)) * .ToDictionary(k => k.Key, v => v.Value); * }*/ message.ArrangementRequest = _calculatorProvider.Calculate(message.ArrangementRequest, application); //message.ArrangementRequest.CalculateOffer(priceCalculationParameters, priceCalculator, conversionMethod); await _arrangementRequestRepository.UpdateArrangementRequest(message.ArrangementRequest); var messageObj = _messageEventFactory.CreateBuilder("offer", "product-selection-changed") .AddHeaderProperty("application-number", application.ApplicationNumber); messageObj = messageObj.AddBodyProperty("product-code", application.ProductCode) .AddBodyProperty("product-name", application.ProductName); _eventBus.Publish(messageObj.Build()); bool result = await _arrangementRequestRepository.UnitOfWork.SaveEntitiesAsync(); await _auditClient.WriteLogEntry(AuditLogEntryAction.Update, AuditLogEntryStatus.Success, "arrangement", message.ApplicationNumber.ToString(), "Arrangement has been updated " + message.ArrangementRequestId, new { }); StandardCommandResult commandResult = result ? StandardCommandResult.OK : StandardCommandResult.BAD_REQUEST; return(new CommandStatus <bool> { Result = result, CommandResult = commandResult }); }
public async Task <ArrangementRequest> CalculatePrice(Application application, ArrangementRequest request) { var calcParams = request.GetPriceCalculationParameters(application); return(await CalculatePrice(request, calcParams)); }