public async Task <bool> Handle(DeleteSecuredDealLinkCommand message, CancellationToken cancellationToken) { var longApplicationNumber = long.Parse(message.ApplicationNumber); CollateralRequirement requirement = _arrangementRequestRepository.GetCollateralRequirementById(longApplicationNumber, message.ArrangementRequestId, message.CollateralRequirementId); var result = false; try { var remainingDeals = requirement.SecuredDealLinks.Where (x => !x.ArrangementRequestId.Equals(message.ArrangementRequestId) || !x.ApplicationNumber.Equals(message.ApplicationNumber) || !x.ArrangementNumber.Equals(message.ArrangementNumber)).ToList(); _logger.LogDebug("Number of remaining secure deal links is {SecureDealLinkCount}", remainingDeals.Count()); requirement.SecuredDealLinks = remainingDeals; _arrangementRequestRepository.UpdateCollateralRequirement(requirement); result = await _arrangementRequestRepository.UnitOfWork.SaveEntitiesAsync(); var msgBuilder = _messageEventFactory.CreateBuilder("offer", "secured-deal-link-changed") .AddHeaderProperty("application-number", message.ApplicationNumber) .AddHeaderProperty("username", "ALL"); _bus.Publish(msgBuilder.Build()); } catch (Exception e) { _logger.LogError(e, "An error occurred while removing deal link from collateral requirement."); } return(result); }
public async Task <bool?> Handle(UpdateCollateralModelCommand message, CancellationToken cancellationToken) { var arrangementRequest = _arrangementRequestRepository.GetArrangementRequest(message.ApplicationNumber, message.ArrangementRequestId, "collateral-requirements,product-snapshot", null); if (arrangementRequest == null) { return(null); } if (arrangementRequest is FinanceServiceArrangementRequest ara && ara.ProductSnapshot.AvailableCollateralModels.Contains(message.CollateralModel)) { var selectedModel = ara.ProductSnapshot.AvailableCollateralModelsData.Where(m => m.Code.Equals(message.CollateralModel)).FirstOrDefault(); if (selectedModel != null) { ara.CollateralModel = message.CollateralModel; if (ara.CollateralRequirements == null) { ara.CollateralRequirements = new List <CollateralRequirement>(); } foreach (var newRequirement in selectedModel.CollateralRequirements) { var existingRequirement = ara.CollateralRequirements.Where(c => c.CollateralArrangementCode.Equals(newRequirement.CollateralArrangementCode)).Any(); if (!existingRequirement) { var req = new CollateralRequirement { ApplicationId = message.ApplicationNumber, ArrangementRequestId = message.ArrangementRequestId, CollateralArrangementCode = newRequirement.CollateralArrangementCode, MinimalCoverage = newRequirement.MinimalCoverage, MinimalCoverageInLoanCurrency = ara.Amount * (newRequirement.MinimalCoverage / 100), ActualCoverage = 0, CollateralRequirementId = (ara.CollateralRequirements.Count > 0) ? ara.CollateralRequirements.Max(x => x.CollateralRequirementId) + 1 : 1, FromModel = true }; ara.CollateralRequirements.Add(req); } } List <CollateralRequirement> deletionList = new List <CollateralRequirement>(); foreach (var requirement in ara.CollateralRequirements) { var query = selectedModel.CollateralRequirements.Where(x => x.CollateralArrangementCode.Equals(requirement.CollateralArrangementCode)); requirement.FromModel = query.Any(); if (!requirement.FromModel && requirement.SecuredDealLinks == null) // not from model and empty { deletionList.Add(requirement); } } foreach (var requirement in deletionList) { ara.CollateralRequirements.Remove(requirement); } } else { return(false); } }
public CollateralRequirement UpdateCollateralRequirement(CollateralRequirement requirement) { _logger.LogInformation("Updating collateral requirement {CollateralRequirementId} for application {ApplicationNumber}", requirement.CollateralRequirementId, requirement.ApplicationNumber); _logger.LogInformation("Current actual coverage for collateral requirement {CollateralRequirementId} for application {ApplicationNumber}" + "is {ActualCoverage}", requirement.CollateralRequirementId, requirement.ApplicationNumber, requirement.ActualCoverage); requirement.ActualCoverage = requirement.SecuredDealLinks.Sum(deal => deal.PledgedValueInLoanCurrency);; _logger.LogInformation("New actual coverage for collateral requirement {CollateralRequirementId} for application {ApplicationNumber}" + "is {ActualCoverage}", requirement.CollateralRequirementId, requirement.ApplicationNumber, requirement.ActualCoverage); return(requirement); }
public async Task <bool> Handle(AddSecuredDealLinkCommand message, CancellationToken cancellationToken) { var longApplicationNumber = long.Parse(message.ApplicationNumber); CollateralRequirement requirement = _arrangementRequestRepository.GetCollateralRequirementById(longApplicationNumber, message.ArrangementRequestId, message.CollateralRequirementId); List <SecuredDealLink> securedDealLinks = requirement?.SecuredDealLinks ?? new List <SecuredDealLink>(); ArrangementRequest request = _arrangementRequestRepository.GetArrangementRequest(longApplicationNumber, message.ArrangementRequestId); if (request is FinanceServiceArrangementRequest finRequest) { CurrencyConverter currencyConverter = new CurrencyConverter(); var currencyConversionMethod = _configurationService.GetEffective("offer/currency-conversion-method").Result; var pledgedValueInLoanCurrency = currencyConverter.CurrencyConvert(message.PledgedValueInCollateralCurrency, message.ArrangementCurrency, finRequest.Currency, DateTime.Today.ToString("o", CultureInfo.InvariantCulture), currencyConversionMethod); var existingSecuredDealLink = securedDealLinks.Where (x => x.ArrangementRequestId.Equals(message.ArrangementRequestId) && x.ApplicationNumber.Equals(message.ApplicationNumber) && x.ArrangementNumber.Equals(message.ArrangementNumber)).FirstOrDefault(); if (existingSecuredDealLink != null) { existingSecuredDealLink.PledgedValueInCollateralCurrency = message.PledgedValueInCollateralCurrency; existingSecuredDealLink.PledgedValueInLoanCurrency = pledgedValueInLoanCurrency; requirement.SecuredDealLinks = securedDealLinks; } else { securedDealLinks.Add(new SecuredDealLink { ApplicationNumber = message.ApplicationNumber, ArrangementNumber = message.ArrangementNumber, ArrangementRequestId = message.ArrangementRequestId, PledgedValueInCollateralCurrency = message.PledgedValueInCollateralCurrency, PledgedValueInLoanCurrency = pledgedValueInLoanCurrency }); requirement.SecuredDealLinks = securedDealLinks; } _arrangementRequestRepository.UpdateCollateralRequirement(requirement); var result = await _arrangementRequestRepository.UnitOfWork.SaveEntitiesAsync(); var msgBuilder = _messageEventFactory.CreateBuilder("offer", "secured-deal-link-changed") .AddHeaderProperty("application-number", message.ApplicationNumber) .AddHeaderProperty("username", "ALL"); _bus.Publish(msgBuilder.Build()); return(result); } else { return(false); } }
public CollateralRequirement AddCollateralRequirement(CollateralRequirement req) { var applicationNumber = long.Parse(req.ApplicationNumber); var arrangementRequest = GetArrangementRequest(applicationNumber, req.ArrangementRequestId); if (arrangementRequest == null) { return(null); } if (arrangementRequest is FinanceServiceArrangementRequest ara) { if (ara.CollateralRequirements == null) { ara.CollateralRequirements = new List <CollateralRequirement>(); } ara.CollateralRequirements.Add(req); var result = _context.SaveChanges(); if (result > 0) { var app = _context.Applications .Include(a => a.ArrangementRequests) .Include(a => a.InvolvedParties) .Include(a => a.Documents) .FirstOrDefault(a => a.ApplicationId == applicationNumber); var x = _documentsResolver.ResolveDocuments(app).Result; result = _context.SaveChanges(); var y = _documentsResolver.CreateApplicationDocumentsFolders().Result; return((result > 0) ? req : null); } else { return(null); } } else { return(null); } }
private FinanceServiceArrangementRequest AddCollateralRequirements(FinanceServiceArrangementRequest request) { if (request.ProductSnapshot.AvailableCollateralModelsData.Count > 0) { ProductCollateralModel selectedModel = null; if (!String.IsNullOrEmpty(request.ProductSnapshot.DefaultCollateralModel)) { selectedModel = request.ProductSnapshot.AvailableCollateralModelsData.Find(c => c.Code == request.ProductSnapshot.DefaultCollateralModel); } if (selectedModel == null) { selectedModel = request.ProductSnapshot.AvailableCollateralModelsData[0]; } request.CollateralModel = selectedModel.Code; if (request.CollateralRequirements == null) { request.CollateralRequirements = new List <CollateralRequirement>(); } foreach (var requirement in selectedModel.CollateralRequirements) { var collateralRequirement = new CollateralRequirement { // Application = request.Application, ArrangementRequestId = request.ArrangementRequestId, CollateralRequirementId = (request.CollateralRequirements.Count > 0) ? request.CollateralRequirements.Max(x => x.CollateralRequirementId) + 1 : 1, CollateralArrangementCode = requirement.CollateralArrangementCode, FromModel = true, MinimalCoverage = requirement.MinimalCoverage, MinimalCoverageInLoanCurrency = request.Amount * (requirement.MinimalCoverage / 100), ActualCoverage = 0 }; request.CollateralRequirements.Add(collateralRequirement); } } return(request); }
public async Task <bool?> Handle(AddCollateralRequirementCommand message, CancellationToken cancellationToken) { var arrangementRequest = _arrangementRequestRepository.GetArrangementRequest(message.ApplicationNumber, message.ArrangementRequestId, "collateral-requirements,product-snapshot", null); if (arrangementRequest == null) { return(null); } if (arrangementRequest is FinanceServiceArrangementRequest finRequest) { var fromModel = false; var minimalCoverage = message.MinimalCoverage; var model = finRequest.ProductSnapshot.AvailableCollateralModelsData.Where(x => x.Code.Equals(finRequest.CollateralModel)).FirstOrDefault(); if (model != null) { var query = model.CollateralRequirements.Where(x => x.CollateralArrangementCode.Equals(message.CollateralArrangementCode)); fromModel = query.Any(); if (fromModel) { var collateralRequirement = query.FirstOrDefault(); //minimalCoverage = collateralRequirement.MinimalCoverage; } } var minimalCoverageInLoanCurrency = finRequest.Amount * (minimalCoverage / 100); var collateralOwner = message.CollateralOwner; if (string.IsNullOrEmpty(collateralOwner)) { var involvedParties = await _applicationRepository.GetInvolvedParties(message.ApplicationNumber); collateralOwner = involvedParties.Where(x => x.PartyRole.Equals(PartyRole.Customer)).FirstOrDefault().PartyId.ToString(); } var requirement = new CollateralRequirement { ApplicationId = message.ApplicationNumber, ArrangementRequestId = message.ArrangementRequestId, CollateralArrangementCode = message.CollateralArrangementCode, MinimalCoverage = minimalCoverage, MinimalCoverageInLoanCurrency = minimalCoverageInLoanCurrency, ActualCoverage = 0, FromModel = fromModel, CollateralOwner = collateralOwner }; if (finRequest.CollateralRequirements == null) { finRequest.CollateralRequirements = new List <CollateralRequirement>(); } requirement.CollateralRequirementId = (finRequest.CollateralRequirements.Count > 0) ? finRequest.CollateralRequirements.Max(x => x.CollateralRequirementId) + 1 : 1; _arrangementRequestRepository.AddCollateralRequirement(requirement); try { await _auditClient.WriteLogEntry(AuditLogEntryAction.Add, AuditLogEntryStatus.Success, "collateral", message.ApplicationNumber.ToString(), "Collateral added", requirement); } catch (Exception ex) { _logger.LogError(ex, "Audit error in AddCollateralRequirementCommandHandler"); } } else { return(false); } return(await _arrangementRequestRepository.UnitOfWork.SaveEntitiesAsync()); }