private ProductItemModel MapProductItemModel(ProductItem productItem, VariantItemList allVariants)
        {
            var itemModel = Mapper.Map <ProductItem, ProductItemModel>(productItem);

            var variants = allVariants.Where(v => v.GroupByKey == productItem.GroupByKey).ToList();

            MapVariants(productItem, variants, itemModel);

            MoveEqualParametricsFromVariantToProduct(itemModel);
            var allParametrics          = GetAllParametrics(productItem);
            var variantParametricIds    = itemModel.Variants.SelectMany(v => v.VariantParametrics.Select(p => p.Id));
            var parametricIdsOnVariants = itemModel.Variants.SelectMany(v => v.Parametrics.Select(p => p.Id));

            allParametrics.RemoveAll(i => variantParametricIds.Contains(i.Id) || parametricIdsOnVariants.Contains(i.Id));
            MapParametrics(itemModel.Parametrics, allParametrics);

            var activeVariants = variants.Where(i => i.StatusId != 5).ToList();

            itemModel.Price             = MapMinPrice(activeVariants);
            itemModel.Price.IsFromPrice = activeVariants.Any() && activeVariants.Max(v => v.Price?.Value) != activeVariants.Min(v => v.Price?.Value);

            itemModel.OnHandStatus = itemModel.Variants.Min(x => x.OnHandStatus);

            return(itemModel);
        }
        private ProductListModel MapProductList(ProductItemPagedList productList, VariantItemList variants, FilterList filters)
        {
            model = new ProductListModel
            {
                ItemCount = productList.ItemCount,
                Items     = new List <ProductItemModel>(),
                Filters   = new List <FilterModel>(),
            };

            if (productList.ItemCount == 0)
            {
                return(model);
            }

            if (filters != null && filters.Count > 0)
            {
                var filterBuilder = new FilterBuilder(dictionary, SiteRules);
                filterBuilder.ItemCount = productList.ItemCount;
                model.Filters.AddRange(filterBuilder.BuildFilters(filters));
            }

            model.Items = MapProductItems(productList.Items, variants);
            return(model);
        }
        private List <ProductItemModel> MapProductItems(List <ProductItem> productItems, VariantItemList variants)
        {
            var productGroup = productItems.GroupBy(i => i.GroupByKey);

            return(variants == null
                ? productGroup.Select(MapProductItemModel).ToList()
                : productGroup.Select(g => MapProductItemModel(g.First(), variants)).ToList());
        }
 public ProductListModel BuildProductList(ProductItemPagedList productList, VariantItemList variants, FilterList filters = null)
 {
     return(productList == null ? null :  MapProductList(productList, variants, filters));
 }
        public void BuildProductListFromVariantItemsPriceTest()
        {
            // Arrange
            var rules = new DefaultSiteRules();

            var productList = new ProductItemPagedList
            {
                ItemCount = 3,
                Items     = new ProductItemList
                {
                    new ProductItem {
                        Id = 1, GroupByKey = "v1", Name = "P1",
                    },
                    new ProductItem {
                        Id = 2, GroupByKey = "v2", Name = "P2",
                    },
                    new ProductItem {
                        Id = 3, GroupByKey = "v3", Name = "P3",
                    },
                }
            };

            var variantList = new VariantItemList
            {
                new VariantItem
                {
                    Id = 1, GroupByKey = "v1", Name = "P1", Price = new ProductPrice {
                        Value = 1.00M, Catalog = 1.00M, VatRate = 1.25M, PriceListId = 1
                    },
                    OnHand = new OnHand {
                        Value = 3, IsActive = true
                    },
                },
                new VariantItem
                {
                    Id = 2, GroupByKey = "v2", Name = "P2", Price = new ProductPrice {
                        Value = 2.00M, Catalog = 2.00M, VatRate = 1.25M, PriceListId = 2
                    },
                    OnHand = new OnHand {
                        Value = 3, IsActive = true
                    },
                },
                new VariantItem
                {
                    Id = 3, GroupByKey = "v3", Name = "P3", Price = new ProductPrice {
                        Value = 3.00M, Catalog = 3.00M, VatRate = 1.25M, PriceListId = 3
                    },
                    OnHand = new OnHand {
                        Value = 3, IsActive = true
                    },
                },
            };


            var stormContext = MockRepository.GenerateMock <IStormContext>();

            stormContext.Stub(x => x.Configuration).Return(new StormConfigurationSection());
            stormContext.Stub(x => x.ShowPricesIncVat).Return(false);
            stormContext.Stub(x => x.CultureCode).Return("sv");
            StormContext.SetInstance(stormContext);

            var dictionary = MockRepository.GenerateMock <IApplicationDictionary>();

            // Act
            var productBuilder = new ProductListBuilder(dictionary, rules);
            var result         = productBuilder.BuildProductList(productList, variantList);

            // Assert
            Assert.AreNotEqual(null, result);
            Assert.AreEqual(3, result.ItemCount);
            Assert.AreEqual(1M, result.Items[0].Price.Display);
            Assert.AreEqual(2M, result.Items[1].Price.Display);
            Assert.AreEqual(3M, result.Items[2].Price.Display);
        }
        public void BuildProductListFromVariantItemsTest()
        {
            // Arrange
            var rules = new DefaultSiteRules();

            var productList = new ProductItemPagedList
            {
                ItemCount = 1,
                Items     = new ProductItemList
                {
                    new ProductItem
                    {
                        Id           = 1,
                        Name         = "Handske",
                        CategoryId   = 1,
                        Manufacturer = new ProductManufacturer {
                            Id = 1, Name = "Manufacturer"
                        },
                        AdditionalImageKeySeed = "14:" + Guid.Empty,
                        FlagIdSeed             = "",
                        Price  = 100.00M, PriceCatalog = 100.00M, VatRate = 1.25M, RecommendedQuantity = 1.000M,
                        OnHand = new OnHand {
                            Value = 10, IsActive = true
                        },
                        OnHandStore = new OnHand {
                            IsActive = false
                        },
                        OnHandSupplier = new OnHand {
                            IsActive = false
                        },
                        Key                    = Guid.NewGuid(),
                        ImageKey               = Guid.NewGuid(),
                        StatusId               = 1,
                        Type                   = 1,
                        GroupByKey             = "v1",
                        ParametricListSeed     = "111:11,112:12,200:20,300:30",
                        ParametricMultipleSeed = "113:13,113:14",
                        ParametricValueSeed    = "115:15,116:16,117:17,117:18",
                        VariantParametricSeed  = "200,300",
                    }
                }
            };

            var variantList = new VariantItemList
            {
                new VariantItem
                {
                    Id    = 1, GroupByKey = "v1", Name = "Handske 1", TypeId = 1, PartNo = "P1", ManufacturerPartNo = "P1", FlagIdSeed = "1", ImageKey = productList.Items[0].ImageKey,
                    Price = new ProductPrice {
                        Value = 100.00M, Catalog = 100.00M, VatRate = 1.25M, PriceListId = 1, IsBuyable = true, RecommendedQuantity = 1, IsRecommendedQuantityFixed = true
                    },
                    OnHand = new OnHand {
                        Value = 3, IsActive = true
                    },
                    Parametrics = new ParametricsSeed {
                        ListSeed = "200:20,300:30", MultipleSeed = "117:17", ValueSeed = ""
                    },
                    AdditionalImageKeySeed = "58:" + Guid.NewGuid()
                },
                new VariantItem
                {
                    Id    = 2, GroupByKey = "v1", Name = "Handske 2", TypeId = 1, PartNo = "P2", ManufacturerPartNo = "P2", FlagIdSeed = "2", ImageKey = Guid.NewGuid(),
                    Price = new ProductPrice {
                        Value = 100.00M, Catalog = 100.00M, VatRate = 1.25M, PriceListId = 1, IsBuyable = true, RecommendedQuantity = 1, IsRecommendedQuantityFixed = true
                    },
                    OnHand = new OnHand {
                        Value = 7, IsActive = true
                    },
                    Parametrics = new ParametricsSeed {
                        ListSeed = "200:21,300:31", MultipleSeed = "117:18", ValueSeed = ""
                    },
                    AdditionalImageKeySeed = "58:" + Guid.NewGuid(),
                },
            };


            var stormContext = MockRepository.GenerateMock <IStormContext>();

            stormContext.Stub(x => x.Configuration).Return(new StormConfigurationSection());
            stormContext.Stub(x => x.ShowPricesIncVat).Return(false);
            stormContext.Stub(x => x.CultureCode).Return("sv");
            StormContext.SetInstance(stormContext);

            var dictionary = MockRepository.GenerateMock <IApplicationDictionary>();

            dictionary.Stub(x => x.ParametricInfo(111, "sv")).Return(new ParametricInfo {
                Id = 111, Type = ParametricType.ListValue, ValueType = ParametricValueType.Integer
            });
            dictionary.Stub(x => x.ParametricValue(ParametricType.ListValue, 11, "sv")).Return(new ParametricValue {
                Id = 11, Name = "Valuee", Description = "Desc", Code = "Coode", SortOrder = 1, Type = ParametricType.ListValue.ToString()
            });

            dictionary.Stub(x => x.ParametricInfo(112, "sv")).Return(new ParametricInfo {
                Id = 112, Type = ParametricType.ListValue, ValueType = ParametricValueType.Integer
            });
            dictionary.Stub(x => x.ParametricValue(ParametricType.ListValue, 12, "sv")).Return(new ParametricValue {
                Id = 12, Name = "Valuee", Description = "Desc", Code = "Coode", SortOrder = 1, Type = ParametricType.ListValue.ToString()
            });

            dictionary.Stub(x => x.ParametricInfo(113, "sv")).Return(new ParametricInfo {
                Id = 113, Type = ParametricType.MultiValue, ValueType = ParametricValueType.Integer
            });
            dictionary.Stub(x => x.ParametricValue(ParametricType.MultiValue, 13, "sv")).Return(new ParametricValue {
                Id = 13, Name = "Valuee", Description = "Desc", Code = "Coode", SortOrder = 1, Type = ParametricType.MultiValue.ToString()
            });
            dictionary.Stub(x => x.ParametricValue(ParametricType.MultiValue, 14, "sv")).Return(new ParametricValue {
                Id = 14, Name = "Valuee", Description = "Desc", Code = "Coode", SortOrder = 1, Type = ParametricType.MultiValue.ToString()
            });

            dictionary.Stub(x => x.ParametricInfo(115, "sv")).Return(new ParametricInfo {
                Id = 115, Type = ParametricType.ListValue, ValueType = ParametricValueType.Integer
            });
            dictionary.Stub(x => x.ParametricValue(ParametricType.ListValue, 15, "sv")).Return(new ParametricValue {
                Id = 15, Name = "Valuee", Description = "Desc", Code = "Coode", SortOrder = 1, Type = ParametricType.ListValue.ToString()
            });

            dictionary.Stub(x => x.ParametricInfo(116, "sv")).Return(new ParametricInfo {
                Id = 116, Type = ParametricType.ListValue, ValueType = ParametricValueType.Integer
            });
            dictionary.Stub(x => x.ParametricValue(ParametricType.ListValue, 16, "sv")).Return(new ParametricValue {
                Id = 16, Name = "Valuee", Description = "Desc", Code = "Coode", SortOrder = 1, Type = ParametricType.ListValue.ToString()
            });

            dictionary.Stub(x => x.ParametricInfo(200, "sv")).Return(new ParametricInfo {
                Id = 200, Type = ParametricType.ListValue, ValueType = ParametricValueType.Integer
            });
            dictionary.Stub(x => x.ParametricValue(ParametricType.ListValue, 20, "sv")).Return(new ParametricValue {
                Id = 20, Name = "Valuee", Description = "Desc", Code = "Coode", SortOrder = 1, Type = ParametricType.MultiValue.ToString()
            });
            dictionary.Stub(x => x.ParametricValue(ParametricType.ListValue, 21, "sv")).Return(new ParametricValue {
                Id = 21, Name = "Valuee", Description = "Desc", Code = "Coode", SortOrder = 1, Type = ParametricType.MultiValue.ToString()
            });

            dictionary.Stub(x => x.ParametricInfo(300, "sv")).Return(new ParametricInfo {
                Id = 300, Type = ParametricType.ListValue, ValueType = ParametricValueType.Integer
            });
            dictionary.Stub(x => x.ParametricValue(ParametricType.ListValue, 30, "sv")).Return(new ParametricValue {
                Id = 30, Name = "Valuee", Description = "Desc", Code = "Coode", SortOrder = 1, Type = ParametricType.MultiValue.ToString()
            });
            dictionary.Stub(x => x.ParametricValue(ParametricType.ListValue, 31, "sv")).Return(new ParametricValue {
                Id = 31, Name = "Valuee", Description = "Desc", Code = "Coode", SortOrder = 1, Type = ParametricType.MultiValue.ToString()
            });

            dictionary.Stub(x => x.ParametricInfo(117, "sv")).Return(new ParametricInfo {
                Id = 117, Type = ParametricType.MultiValue, ValueType = ParametricValueType.Integer
            });
            dictionary.Stub(x => x.ParametricValue(ParametricType.MultiValue, 17, "sv")).Return(new ParametricValue {
                Id = 17, Name = "Valuee", Description = "Desc", Code = "Coode", SortOrder = 1, Type = ParametricType.MultiValue.ToString()
            });
            dictionary.Stub(x => x.ParametricValue(ParametricType.MultiValue, 18, "sv")).Return(new ParametricValue {
                Id = 18, Name = "Valuee", Description = "Desc", Code = "Coode", SortOrder = 1, Type = ParametricType.MultiValue.ToString()
            });

            // Act
            var productBuilder = new ProductListBuilder(dictionary, rules);
            var result         = productBuilder.BuildProductList(productList, variantList);

            // Assert
            Assert.AreNotEqual(null, result);
            Assert.AreEqual(1, result.ItemCount);
            Assert.AreEqual(1, result.Items.Count);

            var product = result.Items[0];

            Assert.AreEqual("Manufacturer", product.Manufacturer.Name);
            Assert.AreEqual(2, product.Files.Count, "Files");
            Assert.AreEqual("Handske", product.Files[0].AltText);
            Assert.AreEqual(0, product.Flags.Count);
            Assert.AreEqual(5, product.Parametrics.Count, "Parametrics");

            Assert.AreEqual(2, product.Variants.Count, "Parametrics");
            var variant1 = product.Variants[0];

            Assert.AreEqual(1, variant1.Parametrics.Count, "Parametrics");
            Assert.AreEqual(2, variant1.VariantParametrics.Count, "VariantParametrics");
            Assert.AreEqual(1, variant1.Flags.Count);
            Assert.AreEqual(2, variant1.Files.Count);
        }