private void ExecuteForOpportunity_Part1(Dictionary <string, List <Guid> > allRetrieved, IEnumerable <Guid> opportunityIds = null)
        {
            var opportunityRetriever      = opportunityIds != null ? new OpportunityRetriever(_sqlConnection, opportunityIds) : new OpportunityRetriever(_sqlConnection);
            var retrievedOpportunityLinks = opportunityRetriever.Process().Take(2000);

            if (retrievedOpportunityLinks != null && retrievedOpportunityLinks.Count() > 0)
            {
                var retrievedOpportunityIds = retrievedOpportunityLinks.Select(e => e.Id).Distinct();
                allRetrieved["opportunity"].AddRange(retrievedOpportunityIds);

                var partOfOwnerRetriever    = new CmdsoftPartOfOwnerRetriever(_sqlConnection, retrievedOpportunityIds);
                var retrievedPartOfOwnerIds = partOfOwnerRetriever.Process().Distinct();

                if (retrievedPartOfOwnerIds != null && retrievedPartOfOwnerIds.Count() > 0)
                {
                    allRetrieved["cmdsoft_part_of_owner"].AddRange(retrievedPartOfOwnerIds);
                }

                var orderNavRetriever    = new CmdsoftOrderNavRetriever(_sqlConnection, retrievedOpportunityIds);
                var retrievedOrderNavIds = orderNavRetriever.Process().Distinct();

                if (retrievedOrderNavIds != null && retrievedOrderNavIds.Count() > 0)
                {
                    allRetrieved["cmdsoft_ordernav"].AddRange(retrievedOrderNavIds);

                    var cmdsoftOrderLineNavRetriever      = new CmdsoftOrderLineNavRetriever(_sqlConnection, retrievedOrderNavIds);
                    var retrievedCmdsoftOrderLineNavLinks = cmdsoftOrderLineNavRetriever.Process().Distinct();

                    if (retrievedCmdsoftOrderLineNavLinks != null && retrievedCmdsoftOrderLineNavLinks.Count() > 0)
                    {
                        allRetrieved["cmdsoft_orderlinenav"].AddRange(retrievedCmdsoftOrderLineNavLinks.Select(e => e.Id).Distinct());
                        allRetrieved["mcdsoft_sales_appeal"].AddRange(retrievedCmdsoftOrderLineNavLinks.Where(e => e.McdsoftRefOrderlineNav != null).Select(e => e.McdsoftRefOrderlineNav.Value).Distinct());
                    }
                }

                var accountRetriever      = new AccountRetriever(_sqlConnection, retrievedOpportunityLinks);
                var retrievedAccountLinks = accountRetriever.Process();

                if (retrievedAccountLinks != null && retrievedAccountLinks.Count() > 0)
                {
                    allRetrieved["account"].AddRange(retrievedAccountLinks.Select(e => e.Id).Distinct());
                    allRetrieved["contact"].AddRange(retrievedAccountLinks.Where(e => e.PrimaryContactId != null).Select(e => e.PrimaryContactId.Value).Distinct());
                }

                var contactRetriever      = new ContactRetriever(_sqlConnection, retrievedOpportunityLinks);
                var retrievedContactLinks = contactRetriever.Process();

                if (retrievedContactLinks != null && retrievedContactLinks.Count() > 0)
                {
                    allRetrieved["contact"].AddRange(retrievedContactLinks.Select(e => e.Id).Distinct());
                    allRetrieved["account"].AddRange(retrievedContactLinks.Where(e => e.ParentCustomerId != null).Select(e => e.ParentCustomerId.Value).Distinct());
                }

                var specificationRetriever      = new CmdsoftSpecificationRetriever(_sqlConnection, retrievedOpportunityIds);
                var retrievedSpecificationLinks = specificationRetriever.Process();

                if (retrievedSpecificationLinks != null && retrievedSpecificationLinks.Count() > 0)
                {
                    var retrievedSpecificationIds = retrievedSpecificationLinks.Select(e => e.Id).Distinct();
                    allRetrieved["cmdsoft_specification"].AddRange(retrievedSpecificationIds);

                    var listSpecificationRetriever    = new CmdsoftListSpecificationRetriever(_sqlConnection, retrievedSpecificationIds);
                    var retrievedListSpecificationIds = listSpecificationRetriever.Process().Distinct();

                    if (retrievedListSpecificationIds != null && retrievedListSpecificationIds.Count() > 0)
                    {
                        allRetrieved["cmdsoft_listspecification"].AddRange(retrievedListSpecificationIds);
                    }

                    var offerRetriever    = new CmdsoftOfferRetriever(_sqlConnection, retrievedSpecificationIds);
                    var retrievedOfferIds = offerRetriever.Process().Distinct();

                    if (retrievedOfferIds != null && retrievedOfferIds.Count() > 0)
                    {
                        allRetrieved["cmdsoft_offer"].AddRange(retrievedOfferIds);
                    }

                    var retrievedSalesPriceIds = retrievedSpecificationLinks.Where(e => e.YolvaSalesPrice != null).Select(e => e.YolvaSalesPrice.Value).Distinct();

                    if (retrievedSalesPriceIds != null && retrievedSalesPriceIds.Count() > 0)
                    {
                        allRetrieved["yolva_salesprice"].AddRange(retrievedSalesPriceIds);

                        var salespriceLineRetriever    = new YolvaSalespriceLineRetriever(_sqlConnection, retrievedSalesPriceIds);
                        var retrievedSalespriceLineIds = salespriceLineRetriever.Process().Distinct();

                        if (retrievedSalespriceLineIds != null && retrievedSalespriceLineIds.Count() > 0)
                        {
                            allRetrieved["yolva_salespriceline"].AddRange(retrievedSalespriceLineIds);
                        }
                    }
                }
            }
        }
        private void ExecuteForMcdsoftSalesAppeal_Part3(Dictionary <string, List <Guid> > allRetrieved)
        {
            var salesAppealRetriever      = new McdsoftSalesAppealRetriever(_sqlConnection);
            var retrievedSalesAppealLinks = salesAppealRetriever.Process().Take(50);

            if (retrievedSalesAppealLinks != null && retrievedSalesAppealLinks.Count() > 0)
            {
                var retrievedSalesAppealIds = retrievedSalesAppealLinks.Select(e => e.Id).Distinct();
                allRetrieved["mcdsoft_sales_appeal"].AddRange(retrievedSalesAppealIds);

                var accountRetriever      = new AccountRetriever(_sqlConnection, retrievedSalesAppealLinks);
                var retrievedAccountLinks = accountRetriever.Process();

                if (retrievedAccountLinks != null && retrievedAccountLinks.Count() > 0)
                {
                    allRetrieved["account"].AddRange(retrievedAccountLinks.Select(e => e.Id).Distinct());
                    allRetrieved["contact"].AddRange(retrievedAccountLinks.Where(e => e.PrimaryContactId != null).Select(e => e.PrimaryContactId.Value).Distinct());
                }

                var contactRetriever      = new ContactRetriever(_sqlConnection, retrievedSalesAppealLinks);
                var retrievedContactLinks = contactRetriever.Process();

                if (retrievedContactLinks != null && retrievedContactLinks.Count() > 0)
                {
                    allRetrieved["contact"].AddRange(retrievedContactLinks.Select(e => e.Id).Distinct());
                    allRetrieved["account"].AddRange(retrievedContactLinks.Where(e => e.ParentCustomerId != null).Select(e => e.ParentCustomerId.Value).Distinct());
                }

                var opportunityIds = retrievedSalesAppealLinks.Where(e => e.McdsoftRefOpportunity != null).Select(e => e.McdsoftRefOpportunity.Value).Distinct();
                if (opportunityIds != null && opportunityIds.Count() > 0)
                {
                    ExecuteForOpportunity_Part1(allRetrieved, opportunityIds);
                }

                var cmdsoftRefOrderlinenavIds = retrievedSalesAppealLinks.Where(e => e.CmdsoftRefOrderlinenav != null).Select(e => e.CmdsoftRefOrderlinenav.Value).Distinct();
                if (cmdsoftRefOrderlinenavIds != null && cmdsoftRefOrderlinenavIds.Count() > 0)
                {
                    var cmdsoftOrderLineNavRetriever      = new CmdsoftOrderLineNavRetriever(_sqlConnection, cmdsoftRefOrderlinenavIds);
                    var retrievedCmdsoftOrderLineNavLinks = cmdsoftOrderLineNavRetriever.Process().Distinct();

                    if (retrievedCmdsoftOrderLineNavLinks != null && retrievedCmdsoftOrderLineNavLinks.Count() > 0)
                    {
                        allRetrieved["cmdsoft_orderlinenav"].AddRange(retrievedCmdsoftOrderLineNavLinks.Select(e => e.Id).Distinct());
                        allRetrieved["mcdsoft_sales_appeal"].AddRange(retrievedCmdsoftOrderLineNavLinks.Where(e => e.McdsoftRefOrderlineNav != null).Select(e => e.McdsoftRefOrderlineNav.Value).Distinct());
                    }
                }

                var mcdsoftRefOrderlinenavIds = retrievedSalesAppealLinks.Where(e => e.McdsoftRefOrderlinenav != null).Select(e => e.McdsoftRefOrderlinenav.Value).Distinct();
                if (mcdsoftRefOrderlinenavIds != null && mcdsoftRefOrderlinenavIds.Count() > 0)
                {
                    var mcdsoftOrderLineNavRetriever      = new McdsoftOrderLineNavRetriever(_sqlConnection, cmdsoftRefOrderlinenavIds);
                    var retrievedMcdsoftOrderLineNavLinks = mcdsoftOrderLineNavRetriever.Process().Distinct();

                    if (retrievedMcdsoftOrderLineNavLinks != null && retrievedMcdsoftOrderLineNavLinks.Count() > 0)
                    {
                        allRetrieved["mcdsoft_orderlinenav"].AddRange(retrievedMcdsoftOrderLineNavLinks.Select(e => e.Id).Distinct());
                        allRetrieved["cmdsoft_sales_appeal"].AddRange(retrievedMcdsoftOrderLineNavLinks.Where(e => e.CmdsoftRefOrderlineNav != null).Select(e => e.CmdsoftRefOrderlineNav.Value).Distinct());
                    }
                }

                var cmdsoftOrderLineNavRetrieverNew    = new CmdsoftOrderLineNavRetriever(_sqlConnection, retrievedSalesAppealLinks);
                var retrievedCmdsoftOrderLineNavNewIds = cmdsoftOrderLineNavRetrieverNew.Process().Distinct();
            }
        }