Exemple #1
0
        private ProductGroupMappingDto BuildUp(ProductGroupMappingDto dto, ProductGroupMapping mapping, Action <ProductGroupMappingDto> onLevel = null)
        {
            ProductGroupMappingDto parentDto = new ProductGroupMappingDto();

            parentDto.Name = mapping.ProductGroup.ProductGroupLanguages.FirstOrDefault(c => c.LanguageID == Client.User.LanguageID).Name;
            parentDto.ProductGroupMappingID = mapping.ProductGroupMappingID;
            parentDto.HasChildren           = true;
            parentDto.Children = new List <ProductGroupMappingDto>();
            parentDto.Lineage  = mapping.Lineage;
            parentDto.Depth    = mapping.Depth;

            //attach the child
            parentDto.Children.Add(dto);

            if (onLevel != null)
            {
                onLevel(parentDto);
            }

            if (mapping.ParentMapping != null) //has more parents
            {
                return(BuildUp(parentDto, mapping.ParentMapping, onLevel));
            }

            return(parentDto);
        }
Exemple #2
0
        private void AttachChildByLineage(ProductGroupMappingDto dtoToAttach, int parentMappingID, List <ProductGroupMappingDto> collection, List <int> lineage, int currentLevel)
        {
            var parent = collection.Where(c => c.ProductGroupMappingID == parentMappingID).FirstOrDefault();

            if (parent == null)
            {
                AttachChildByLineage(dtoToAttach, parentMappingID, collection.FirstOrDefault(c => c.ProductGroupMappingID == currentLevel).Children, lineage, lineage[lineage.IndexOf(currentLevel) + 1]);
            }
            else
            {
                if (parent.Children == null)
                {
                    parent.Children = new List <ProductGroupMappingDto>();
                }

                parent.Children.Add(dtoToAttach);
            }
        }
Exemple #3
0
        private ProductGroupMappingDto GetProductGroupMappingLevelDto(ProductGroupMappingDto dto, ProductGroupMapping mapping, List <ProductGroupMapping> mappings, IRepository <ProductGroupMapping> repo)
        {
            dto.Name = mapping.ProductGroup.ProductGroupLanguages.FirstOrDefault(c => c.LanguageID == Client.User.LanguageID).Name;
            dto.ProductGroupMappingID = mapping.ProductGroupMappingID;
            dto.HasChildren           = repo.GetAllAsQueryable(c => c.ParentProductGroupMappingID == dto.ProductGroupMappingID).Count() > 0;
            dto.Lineage = mapping.Lineage;
            dto.Depth   = mapping.Depth;
            var children = mappings.Where(c => c.ParentProductGroupMappingID.HasValue && c.ParentProductGroupMappingID == dto.ProductGroupMappingID).ToList();

            if (children.Count > 0)
            {
                dto.Children = new List <ProductGroupMappingDto>();
                children.ForEach((map, id) =>
                {
                    dto.Children.Add(GetProductGroupMappingLevelDto(new ProductGroupMappingDto(), map, mappings, repo));
                });
            }
            return(dto);
        }
Exemple #4
0
        public List <ProductGroupMappingDto> GetByLineage(string lineage, int?connectorID = null, bool wholeTree = true)
        {
            if (!connectorID.HasValue)
            {
                connectorID = Client.User.ConnectorID;
            }
            var objects = Repository().GetAll(c => (!connectorID.HasValue || (connectorID.HasValue && connectorID.Value == c.ConnectorID)));

            if (!wholeTree)
            {
                var depth = lineage.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries).Count();

                var mapps = objects.Where(c => c.Lineage.StartsWith(lineage) && c.Depth == depth).ToList();

                List <ProductGroupMappingDto> dtos = new List <ProductGroupMappingDto>();
                mapps.ForEach((mapping, ix) =>
                {
                    //testing
                    var checkExcists2 = mapping.ProductGroup.ProductGroupLanguages.FirstOrDefault(c => c.LanguageID == Client.User.LanguageID);
                    string menuName2;
                    if (checkExcists2 != null)
                    {
                        menuName2 = checkExcists2.Name;
                    }
                    else
                    {
                        menuName2 = mapping.ProductGroup.ProductGroupLanguages.FirstOrDefault().Name;
                    }
                    //
                    //



                    var dto = new ProductGroupMappingDto()
                    {
                        ProductGroupMappingID = mapping.ProductGroupMappingID,
                        Depth   = mapping.Depth,
                        Lineage = mapping.Lineage,
                        Name    = menuName2
                                  //Name = mapping.ProductGroup.ProductGroupLanguages.FirstOrDefault(c => c.LanguageID == Client.User.LanguageID).Name
                    };
                    dtos.Add(dto);
                });

                return(dtos);
            }

            List <int> levels = new List <int>()
            {
                -1
            };


            if (!string.IsNullOrEmpty(lineage))
            {
                var lvs = lineage.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);

                levels.AddRange((from c in lvs select int.Parse(c)).ToList());
            }

            List <ProductGroupMappingDto> result = new List <ProductGroupMappingDto>();



            levels.ForEach((lv, idx) =>
            {
                int level = lv;

                int?parentID = null;

                if (idx > 0)
                {
                    parentID = levels.ElementAt(idx);
                }

                var mapps = objects.Where(c => (parentID.HasValue ? parentID.Value == c.ParentProductGroupMappingID : c.ParentProductGroupMappingID == null)).ToList();

                mapps.ForEach((mapping, ix) =>
                {
                    //testing
                    var checkExcists = mapping.ProductGroup.ProductGroupLanguages.FirstOrDefault(c => c.LanguageID == Client.User.LanguageID);
                    string menuName;
                    if (checkExcists != null)
                    {
                        menuName = checkExcists.Name;
                    }
                    else
                    {
                        menuName = mapping.ProductGroup.ProductGroupLanguages.FirstOrDefault().Name;
                    }
                    //
                    //



                    var dto = new ProductGroupMappingDto()
                    {
                        ProductGroupMappingID = mapping.ProductGroupMappingID,
                        Depth   = mapping.Depth,
                        Lineage = mapping.Lineage,
                        //Name = mapping.ProductGroup.ProductGroupLanguages.FirstOrDefault(c => c.LanguageID == Client.User.LanguageID).Name
                        Name = menuName
                    };

                    if (parentID == null)
                    {
                        result.Add(dto);
                    }
                    else
                    {
                        AttachChildByLineage(dto, parentID.Value, result, levels, levels[1]);
                    }
                });
            });
            return(result);
        }
Exemple #5
0
        public List <ProductGroupMappingDto> Search(string query, bool languageSpecific = true, int levels = -1, int?connectorID = null)
        {
            if (!connectorID.HasValue)
            {
                connectorID = Client.User.ConnectorID;
            }

            List <ProductDescription> decs = new List <ProductDescription>();

            if (connectorID.HasValue)
            {
                decs = Repository <ProductDescription>().GetAll(l => l.Product.ContentProducts.Any(m => m.ConnectorID == connectorID.Value)).ToList();
            }
            else
            {
                decs = Repository <ProductDescription>().GetAll().ToList();
            }

            /**
             * 1) Search within all content products
             * 2) Build hierarchy
             * 3) Record the already loaded product group mapping levels
             * 4) Search within the rest of the product group mappings
             * 5) Build hierarchy from them
             */

            List <ProductGroupMappingDto> result = new List <ProductGroupMappingDto>();

            //Record the loaded product group mappings
            List <int> searchedProductGroupMappingIDs = new List <int>();



            //search within the  product hierarchy
            var matched = (from c in decs
                           where c.ProductName.Contains(query) ||
                           c.ShortContentDescription.Contains(query) ||
                           c.Product.VendorAssortments.Any(v => v.ShortDescription.Contains(query))
                           select c.Product).ToList();

            Dictionary <int, ProductGroupMappingDto> cacher = new Dictionary <int, ProductGroupMappingDto>();

            matched.ForEach(product =>
            {
                //loop the pgms and cache them
                product.ContentProductGroups.ForEach((content, idx) =>
                {
                    var name = product.ProductDescriptions.FirstOrDefault(c => c.LanguageID == Client.User.LanguageID).Description;


                    ProductGroupMappingDto dto = null;
                    cacher.TryGetValue(content.ProductGroupMappingID, out dto);

                    if (dto == null) //not cached yet. Create and cache
                    {
                        ProductGroupMapping mapping = Repository().GetSingle(c => c.ProductGroupMappingID == content.ProductGroupMappingID);
                        searchedProductGroupMappingIDs.Add(mapping.ProductGroupMappingID);

                        dto = new ProductGroupMappingDto()
                        {
                            Name = mapping.ProductGroup.ProductGroupLanguages.FirstOrDefault(c => c.LanguageID == Client.User.LanguageID).Name,
                            ProductGroupMappingID = mapping.ProductGroupMappingID,
                            Depth    = mapping.Depth,
                            Lineage  = mapping.Lineage,
                            Products = new List <ProductDto>()
                            {
                                new ProductDto()
                                {
                                    Name      = name,
                                    ProductID = product.ProductID
                                }
                            }
                        };

                        cacher.Add(content.ProductGroupMappingID, dto);
                    }
                    else
                    {
                        dto.Products.Add(new ProductDto()
                        {
                            Name = name, ProductID = product.ProductID
                        });
                    }
                });
            });

            cacher.ForEach((pair, idx) =>
            {
                var mapping = Repository().GetSingle(c => c.ProductGroupMappingID == pair.Value.ProductGroupMappingID);
                result.Add(BuildUp(pair.Value, mapping, c => searchedProductGroupMappingIDs.Add(c.ProductGroupMappingID)));
            });

            //start on mappings
            var mappingMatches = (from m in Repository().GetAllAsQueryable()
                                  where m.ProductGroup.ProductGroupLanguages.Any(c => c.Name.Contains(query))
                                  select m).Distinct().ToList();

            mappingMatches.RemoveAll(c => searchedProductGroupMappingIDs.Contains(c.ProductGroupMappingID));



            mappingMatches.ForEach(mapping =>
            {
                ProductGroupMappingDto dto = new ProductGroupMappingDto()
                {
                    Name = mapping.ProductGroup.ProductGroupLanguages.FirstOrDefault(c => c.LanguageID == Client.User.LanguageID).Name,
                    ProductGroupMappingID = mapping.ProductGroupMappingID,
                    Lineage = mapping.Lineage,
                    Depth   = mapping.Depth
                };

                result.Add(BuildUp(dto, mapping));
            });

            return(result);
        }