private void ResolveForApplication()
        {
            // var documents = Application.Documents;
            // var existingHandledDocs = new List<long>();

            var applicationDocuments = DocumentationRequirements.Where(d =>
                                                                       d.DocumentContextKind.Equals(DocumentContextKind.ApplicationEnum)).ToList();

            foreach (var document in applicationDocuments)
            {
                //var appDocument = ApplicationDocument.FromProductDocument(document);
                var appDocument = Convert(document);
                appDocument.ApplicationId     = Application.ApplicationId;
                appDocument.ApplicationNumber = Application.ApplicationNumber;

                //var matchings = from it in DocumentationRequirements
                //                where it.DocumentType == appDocument.DocumentKind &&
                //                      it.DocumentContextKind == appDocument.DocumentContextKind
                //                select it;
                //if (matchings != null && matchings.Any())
                //{
                //    var existingDoc = matchings.FirstOrDefault(d => d.Equals(appDocument));
                //    //existingHandledDocs.Add(existingDoc.DocumentId);
                //}
                NewRequirements.Add(appDocument);
            }

            //var deleted = documents.Where(d => d.DocumentId != 0 && !existingHandledDocs.Contains(d.DocumentId) &&
            //    d.DocumentContextKind.Equals(DocumentContextKind.ApplicationEnum) && d.Origin.Equals(DocumentOrigin.Product))
            //    .Select(d => d.DocumentId).ToList();
            //_logger.LogInformation("There are {DeletedNumber} unused documents being deleted with application document context kind", deleted.Count());
            //Existing.AddRange(existingHandledDocs);
            //Deleted.AddRange(deleted);
        }
        private void ResolveForParties()
        {
            var existingHandledDocs = new List <long>();
            var partyDocuments      = DocumentationRequirements.Where(d =>
                                                                      d.DocumentContextKind.Equals(DocumentContextKind.PartyEnum) && Application.InvolvedParties.Count() > 0).ToList();

            foreach (var document in partyDocuments)
            {
                foreach (var party in Application.InvolvedParties)
                {
                    var appDocument = Convert(document);
                    appDocument.ApplicationId     = Application.ApplicationId;
                    appDocument.ApplicationNumber = this.Application.ApplicationNumber;
                    appDocument.PartyId           = party.PartyId;
                    // Check if party role corresponds to document PartyRole including "new" status for role
                    if (
                        (party.PartyRole.Equals(PartyRole.Customer) && document.PartyRole.Equals(ProductPartyRoleEnum.CustomerEnum)) ||
                        (party.PartyRole.Equals(PartyRole.Customer) &&
                         string.IsNullOrEmpty(party.CustomerNumber) && document.PartyRole.Equals(ProductPartyRoleEnum.NewCustomerEnum)) ||
                        (party.PartyRole.Equals(PartyRole.AuthorizedPerson) && document.PartyRole.Equals(ProductPartyRoleEnum.AuthorizedPersonEnum)) ||
                        (party.PartyRole.Equals(PartyRole.AuthorizedPerson) &&
                         string.IsNullOrEmpty(party.CustomerNumber) && document.PartyRole.Equals(ProductPartyRoleEnum.NewAuthorizedPersonEnum)) ||
                        (party.PartyRole.Equals(PartyRole.CoDebtor) && document.PartyRole.Equals(ProductPartyRoleEnum.CoDebtorEnum)) ||
                        (party.PartyRole.Equals(PartyRole.CoDebtor) &&
                         string.IsNullOrEmpty(party.CustomerNumber) && document.PartyRole.Equals(ProductPartyRoleEnum.NewCoDebtorEnum)) ||
                        (party.PartyRole.Equals(PartyRole.Guarantor) && document.PartyRole.Equals(ProductPartyRoleEnum.GuarantorEnum)) ||
                        (party.PartyRole.Equals(PartyRole.Guarantor) &&
                         string.IsNullOrEmpty(party.CustomerNumber) && document.PartyRole.Equals(ProductPartyRoleEnum.NewGuarantorEnum)))
                    {
                        //var matchings = from it in DocumentationRequirements
                        //                where it.DocumentType == appDocument.DocumentKind &&
                        //                      it.DocumentContextKind == appDocument.DocumentContextKind &&
                        //                select it;
                        //if (matchings != null && matchings.Any())
                        //{
                        //    var existingDoc = matchings.FirstOrDefault();// d => d.Equals(appDocument));
                        //    // existingHandledDocs.Add(existingDoc.DocumentId); // visak
                        //}
                        NewRequirements.Add(appDocument);
                    }
                }
            }
            //var deleted = documents.Where(d => d.DocumentId != 0 && !existingHandledDocs.Contains(d.DocumentId) &&
            //    d.DocumentContextKind.Equals(DocumentContextKind.PartyEnum) && d.Origin.Equals(DocumentOrigin.Product))
            //    .Select(d => d.DocumentId).ToList();
            //_logger.LogInformation("There are {DeletedNumber} unused documents being deleted with party document context kind", deleted.Count());
            //Existing.AddRange(existingHandledDocs);
            //Deleted.AddRange(deleted);
        }
        private void ResolveForCollaterals()
        {
            var documents           = Application.Documents;
            var existingHandledDocs = new List <long>();
            var collateralCodes     = _configurationService.GetEffective <ClassificationSchema>("collateral/classification-schemes/collateral-code").Result;
            var collateralDocuments = DocumentationRequirements.Where(d =>
                                                                      d.DocumentContextKind.Equals(DocumentContextKind.CollateralEnum)).ToList();

            _logger.LogInformation("Found {NumberOfDocuments} documents related to collaterals", collateralDocuments.Count());
            foreach (var document in collateralDocuments)
            {
                var activeArrangements = Application.ArrangementRequests.Where(a => a.Enabled ?? false);
                foreach (var request in activeArrangements)
                {
                    if (request is FinanceServiceArrangementRequest financeRequest && financeRequest.CollateralRequirements != null)
                    {
                        foreach (var collateralRequirement in financeRequest.CollateralRequirements)
                        {
                            var hasCollateralKind = collateralCodes.Values
                                                    .Exists(v => v.AdditionalFields.GetValueOrDefault("collateral-arrangement-code", "").Equals(collateralRequirement.CollateralArrangementCode) &&
                                                            v.AdditionalFields.GetValueOrDefault("collateral-kind", "").Equals(document.CollateralKind));
                            if (hasCollateralKind)
                            {
                                foreach (var deal in collateralRequirement.SecuredDealLinks)
                                {
                                    var appDocument = Convert(document);
                                    appDocument.ApplicationId        = Application.ApplicationId;
                                    appDocument.ArrangementRequestId = request.ArrangementRequestId;
                                    appDocument.CollateralId         = "" + collateralRequirement.CollateralRequirementId + "-" + deal.ArrangementNumber;

                                    //if (documents.Contains(appDocument))
                                    //{
                                    //    _logger.LogDebug("Found existing application document related to collateral.");
                                    //    var existingDoc = documents.FirstOrDefault(d => d.Equals(appDocument));
                                    //    existingHandledDocs.Add(existingDoc.DocumentId);
                                    //}
                                    //else
                                    //{
                                    //    _logger.LogDebug("Adding new application document related to collateral");
                                    //    documents.Add(appDocument);
                                    //}
                                }
                            }
                            else
                            {
                                _logger.LogInformation("Collateral kind {CollateralKind} not found for collateral arrangement code {CollateralArrangementCode}",
                                                       document.CollateralKind, collateralRequirement.CollateralArrangementCode);
                            }
                        }
                    }
                }
            }
            var deleted = documents.Where(d => d.DocumentId != 0 && !existingHandledDocs.Contains(d.DocumentId) &&
                                          d.DocumentContextKind.Equals(DocumentContextKind.CollateralEnum) && d.Origin.Equals(DocumentOrigin.Product))
                          .Select(d => d.DocumentId).ToList();

            _logger.LogInformation("There are {DeletedNumber} unused documents being deleted with collateral document context kind", deleted.Count());
            _logger.LogInformation("There are {ExistingNumber} existing documents with collateral document context kind", existingHandledDocs.Count());
            Existing.AddRange(existingHandledDocs);
            Deleted.AddRange(deleted);
        }
        private void ResolveForArrangementRequests()
        {
            // var documents = Application.Documents;
            var existingHandledDocs = new List <long>();
            var arrRequestDocuments = DocumentationRequirements.Where(d =>
                                                                      d.DocumentContextKind.Equals(DocumentContextKind.ArrangementRequestEnum)).ToList();

            foreach (var document in arrRequestDocuments)
            {
                var activeArrangements = Application.ArrangementRequests.Where(a => a.Enabled ?? false);
                foreach (var request in activeArrangements)
                {
                    //var appDocument = ApplicationDocument.FromProductDocument(document);
                    var appDocument = Convert(document);
                    appDocument.ApplicationId        = Application.ApplicationId;
                    appDocument.ArrangementRequestId = request.ArrangementRequestId;
                    appDocument.ProductCode          = request.ProductCode;
                    appDocument.ApplicationNumber    = Application.ApplicationNumber;

                    IEnumerable <PartyRole> partyRoles = null;
                    if (document.PartyRole != null)
                    {
                        partyRoles = from party in Application.InvolvedParties
                                     where (party.PartyRole.Equals(PartyRole.Customer) && document.PartyRole.Value.Equals(ProductPartyRoleEnum.CustomerEnum)) ||
                                     (party.PartyRole.Equals(PartyRole.Customer) &&
                                      string.IsNullOrEmpty(party.CustomerNumber) && document.PartyRole.Equals(ProductPartyRoleEnum.NewCustomerEnum)) ||
                                     (party.PartyRole.Equals(PartyRole.AuthorizedPerson) && document.PartyRole.Equals(ProductPartyRoleEnum.AuthorizedPersonEnum)) ||
                                     (party.PartyRole.Equals(PartyRole.AuthorizedPerson) &&
                                      string.IsNullOrEmpty(party.CustomerNumber) && document.PartyRole.Equals(ProductPartyRoleEnum.NewAuthorizedPersonEnum)) ||
                                     (party.PartyRole.Equals(PartyRole.CoDebtor) && document.PartyRole.Equals(ProductPartyRoleEnum.CoDebtorEnum)) ||
                                     (party.PartyRole.Equals(PartyRole.CoDebtor) &&
                                      string.IsNullOrEmpty(party.CustomerNumber) && document.PartyRole.Equals(ProductPartyRoleEnum.NewCoDebtorEnum)) ||
                                     (party.PartyRole.Equals(PartyRole.Guarantor) && document.PartyRole.Equals(ProductPartyRoleEnum.GuarantorEnum)) ||
                                     (party.PartyRole.Equals(PartyRole.Guarantor) &&
                                      string.IsNullOrEmpty(party.CustomerNumber) && document.PartyRole.Equals(ProductPartyRoleEnum.NewGuarantorEnum))
                                     select party.PartyRole;
                    }

                    if (document.ProductCodes == null ||
                        !document.ProductCodes.Any() ||
                        document.ProductCodes.Contains(request.ProductCode))
                    {
                        if (partyRoles != null && partyRoles.Any())
                        {
                            NewRequirements.Add(appDocument);
                        }
                    }

                    //var matchings = from it in DocumentationRequirements
                    //                where it.DocumentType == appDocument.DocumentKind &&
                    //                      it.DocumentContextKind == appDocument.DocumentContextKind
                    //                select it;
                    //if (matchings != null && matchings.Any())
                    //{
                    //    var existingDoc = matchings.FirstOrDefault(d => d.Equals(appDocument));
                    //    // existingHandledDocs.Add(existingDoc.DocumentId);
                    //}
                }
            }

            //var deleted = documents.Where(d => d.DocumentId != 0 && !existingHandledDocs.Contains(d.DocumentId) &&
            //    d.DocumentContextKind.Equals(DocumentContextKind.ArrangementRequestEnum) && d.Origin.Equals(DocumentOrigin.Product))
            //    .Select(d => d.DocumentId).ToList();
            //_logger.LogInformation("There are {DeletedNumber} unused documents being deleted with arrangement request document context kind", deleted.Count());
            //Existing.AddRange(existingHandledDocs);
            //Deleted.AddRange(deleted);
        }