예제 #1
0
        private void syncProductGroupMapping(List <MasterGroupMapping> listOfSourceProductGroupMappings, int?sourceParentProductGroupMappingID, int?destParentProductGroupMappingID, Connector destConnector)
        {
            List <MasterGroupMapping> listOfSourceProductGroupMappingsByParentID = new List <MasterGroupMapping>();
            List <MasterGroupMapping> listOfDestProductGroupMappingsByParentID   = new List <MasterGroupMapping>();

            if (sourceParentProductGroupMappingID.HasValue && sourceParentProductGroupMappingID.Value > 0)
            {
                listOfSourceProductGroupMappingsByParentID = listOfSourceProductGroupMappings
                                                             .Where(x => x.ParentMasterGroupMappingID == sourceParentProductGroupMappingID.Value)
                                                             .ToList();
                listOfDestProductGroupMappingsByParentID = masterGroupMappingRepo
                                                           .GetListOfProductGroupsByConnector(destConnector.ConnectorID)
                                                           .Where(x => x.SourceProductGroupMappingID != null && x.ParentMasterGroupMappingID == destParentProductGroupMappingID)
                                                           .ToList();
            }
            else
            {
                listOfSourceProductGroupMappingsByParentID = listOfSourceProductGroupMappings
                                                             .Where(x => x.ParentMasterGroupMappingID == null)
                                                             .ToList();
                listOfDestProductGroupMappingsByParentID = masterGroupMappingRepo
                                                           .GetListOfProductGroupsByConnector(destConnector.ConnectorID)
                                                           .Where(x => x.ParentMasterGroupMappingID == null && x.SourceProductGroupMappingID != null)
                                                           .ToList();
            }

            List <MasterGroupMapping> listOfProductGroupMappingsToInsert =
                (
                    from parentPGM in listOfSourceProductGroupMappingsByParentID
                    join childPGM in listOfDestProductGroupMappingsByParentID on parentPGM.MasterGroupMappingID equals childPGM.SourceProductGroupMappingID into mappedPGM
                    from pgm in mappedPGM.DefaultIfEmpty()
                    where pgm == null
                    select parentPGM
                ).ToList();

            List <MasterGroupMapping> listOfProductGroupMappingsToUpdate =
                (
                    from parentPGM in listOfSourceProductGroupMappingsByParentID
                    join childPGM in listOfDestProductGroupMappingsByParentID on parentPGM.MasterGroupMappingID equals childPGM.SourceProductGroupMappingID
                    where
                    parentPGM.Score != childPGM.Score ||
                    parentPGM.FlattenHierarchy != childPGM.FlattenHierarchy ||
                    parentPGM.FilterByParentGroup != childPGM.FilterByParentGroup ||
                    parentPGM.ExportID != childPGM.ExportID
                    select childPGM
                ).ToList();

            List <MasterGroupMapping> listOfProductGroupMappingsToDelete =
                (
                    from childPGM in listOfDestProductGroupMappingsByParentID
                    join parentPGM in listOfSourceProductGroupMappingsByParentID on childPGM.SourceProductGroupMappingID equals parentPGM.MasterGroupMappingID into mappedPGM
                    from pgm in mappedPGM.DefaultIfEmpty()
                    where pgm == null
                    select childPGM
                ).ToList();

            if (listOfProductGroupMappingsToInsert.Count > 0)
            {
                InsertProductGroupMappingToDestConnector(listOfProductGroupMappingsToInsert, destConnector, (destParentProductGroupMappingID.HasValue && destParentProductGroupMappingID.Value > 0) ? destParentProductGroupMappingID : null);
            }

            if (listOfProductGroupMappingsToUpdate.Count > 0)
            {
                UpdateProductGroupMappingInDestConnector(listOfProductGroupMappingsToUpdate, listOfSourceProductGroupMappingsByParentID);
            }

            if (listOfProductGroupMappingsToDelete.Count > 0)
            {
                DeleteProductGroupMappingFromDestConnector(listOfProductGroupMappingsToDelete);
            }

            if (listOfProductGroupMappingsToInsert.Count + listOfProductGroupMappingsToDelete.Count > 0)
            {
                if (sourceParentProductGroupMappingID.HasValue && sourceParentProductGroupMappingID.Value > 0)
                {
                    listOfDestProductGroupMappingsByParentID = masterGroupMappingRepo
                                                               .GetListOfProductGroupsByConnector(destConnector.ConnectorID)
                                                               .Where(x => x.SourceProductGroupMappingID != null && x.ParentMasterGroupMappingID == destParentProductGroupMappingID)
                                                               .ToList();
                }
                else
                {
                    listOfDestProductGroupMappingsByParentID = masterGroupMappingRepo
                                                               .GetListOfProductGroupsByConnector(destConnector.ConnectorID)
                                                               .Where(x => x.ParentMasterGroupMappingID == null && x.SourceProductGroupMappingID != null)
                                                               .ToList();
                }
            }
            listOfSourceProductGroupMappingsByParentID.ForEach(productGroupMapping => {
                if (!productGroupMapping.ParentMasterGroupMappingID.HasValue)
                {
                    string productGroupMappingName = masterGroupMappingRepo.GetListOfMasterGroupMappingLanguagesByMasterGroupMappingID(productGroupMapping.MasterGroupMappingID).Where(x => x.LanguageID == 2).Select(x => x.Name).FirstOrDefault();
                    log.DebugFormat("Sync Product Group Mapping {0}({1})", productGroupMappingName, productGroupMapping.MasterGroupMappingID);
                }

                int countProductGroupMappingChildren = listOfSourceProductGroupMappings
                                                       .Where(x => x.ParentMasterGroupMappingID == productGroupMapping.MasterGroupMappingID)
                                                       .Count();

                if (countProductGroupMappingChildren > 0)
                {
                    MasterGroupMapping childProductGroupMapping = listOfDestProductGroupMappingsByParentID.Single(x => x.SourceProductGroupMappingID == productGroupMapping.MasterGroupMappingID);
                    if (childProductGroupMapping != null)
                    {
                        syncProductGroupMapping(listOfSourceProductGroupMappings, productGroupMapping.MasterGroupMappingID, childProductGroupMapping.MasterGroupMappingID, destConnector);
                    }
                    else
                    {
                        log.DebugFormat("ProductGroupMapping with SourceProductGroupMappingID {0} in Connector {1} should exist! But i cant find it.", productGroupMapping.MasterGroupMappingID, destConnector);
                    }
                }
            });
        }