public async Task <bool?> Handle(RecalculateArrangementRequestCommand message, CancellationToken cancellationToken) { //var conversionMethod = _configurationService.GetEffective("offer/fee-currency-conversion-method", "Buy to middle").Result; var arrangementRequest = _arrangementRequestRepository.GetArrangementRequest(message.ApplicationNumber, message.ArrangementRequestId); OfferApplication application = await _applicationRepository.GetAsync(message.ApplicationNumber); _calculatorProvider.Calculate(arrangementRequest, application); //arrangementRequest.CalculateOffer(application, priceCalculator, conversionMethod); await _arrangementRequestRepository.UpdateArrangementRequest(arrangementRequest); return(await _arrangementRequestRepository.UnitOfWork.SaveEntitiesAsync()); }
public async Task <bool?> Handle(AddAccountNumbersCommand message, CancellationToken cancellationToken) { ArrangementRequest arrangementRequest = _arrangementRequestRepository.GetArrangementRequest(message.ApplicationNumber, message.ArrangementRequestId); if (arrangementRequest == null) { return(null); } List <ArrangementAccountInfo> arrangementAccounts; if (arrangementRequest.Accounts == null) { arrangementAccounts = new List <ArrangementAccountInfo>(); } else { arrangementAccounts = arrangementRequest.Accounts; } foreach (AccountNumbersData accountData in message.AccountNumbers) { if (accountData != null) { _logger.LogInformation("Adding account number {accountNumbers} for {applicationNumber}", accountData.AccountNumber, message.ApplicationNumber); ArrangementAccountInfo newAccount = new ArrangementAccountInfo { AccountNumber = accountData.AccountNumber, RoleKind = accountData.RoleKind }; arrangementAccounts.Add(newAccount); } } arrangementRequest.Accounts = arrangementAccounts; await _arrangementRequestRepository.UpdateArrangementRequest(arrangementRequest); return(await _arrangementRequestRepository.UnitOfWork.SaveEntitiesAsync()); }
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 }); }