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);
                }
            }
Beispiel #3
0
 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);
            }
        }
Beispiel #5
0
        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);
            }
        }
Beispiel #6
0
        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);
        }
Beispiel #7
0
        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());
        }