private void CheckFullAssortmentAndDeactivateProducts(IEnumerable <AssortmentStockPriceProduct> productsSource)
        {
            using (var helper = new AssortmentHelper(Connector.Connection, Version))
            {
                var skuList      = helper.GetSkuList();
                var skuInXmlList = (from p in productsSource
                                    select p.ManufacturerID).ToList();

                var toDeactivate = skuList.Where(x => !skuInXmlList.Contains(x.Key));

                //exclude shipping costs
                toDeactivate = toDeactivate.Where(x => !x.Key.StartsWith("ShippingCostProductID_"));

                if (toDeactivate.Count() > 0)
                {
                    SortedDictionary <string, eav_attribute> attributeList = helper.GetAttributeList(PRODUCT_ENTITY_TYPE_ID);

                    foreach (var p in toDeactivate)
                    {
                        SetProductStatus(p.Value.entity_id, (int)PRODUCT_STATUS.DISABLED, helper, attributeList, StoreList[CurrentStoreCode].store_id);

                        if (RequiresStockUpdate)
                        {
                            helper.SyncStock(new cataloginventory_stock_item()
                            {
                                product_id  = p.Value.entity_id,
                                qty         = 0,
                                is_in_stock = false
                            });
                        }
                    }
                }
            }
        }
Beispiel #2
0
        public void Price_Rule_Should_Not_Return_Discount_As_Price()
        {
            var    priceMockRepo = new Mock <IPriceRepository>();
            string productNumber = "2EB6771029";
            string currencyCode  = "EURN";
            string colorCode     = "10";
            string sizeCode      = "s";

            priceMockRepo.Setup(c => c.GetProductPriceRules(productNumber, currencyCode)).Returns(new List <PriceResult>()
            {
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2011, 7, 6),
                    price         = 10
                },
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2011, 7, 7),
                    price         = 8,
                    discount_code = "afp"
                }
            });

            AssortmentHelper help = new AssortmentHelper();

            Assert.AreEqual(help.GetPrice(productNumber, colorCode, sizeCode, priceMockRepo.Object.GetProductPriceRules(productNumber, currencyCode)), 10, "Price from PFA is not as it is expected");
        }
Beispiel #3
0
        public void Price_Rules_With_Color_Should_Have_Priority_Over_Product_Rules()
        {
            var    priceMockRepo = new Mock <IPriceRepository>();
            string productNumber = "2EB6771029";
            string currencyCode  = "EURN";
            string colorCode     = "10";
            string sizeCode      = "s";

            priceMockRepo.Setup(c => c.GetProductPriceRules(productNumber, currencyCode)).Returns(new List <PriceResult>()
            {
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2011, 7, 7),
                    price         = 10
                },
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2011, 7, 7),
                    price         = 5,
                    color_code    = colorCode
                },
            });

            AssortmentHelper help = new AssortmentHelper();

            Assert.AreEqual(help.GetPrice(productNumber, colorCode, sizeCode, priceMockRepo.Object.GetProductPriceRules(productNumber, currencyCode)), 5, "Price from PFA is not on color level");
        }
Beispiel #4
0
        public void Discount_Rule_On_Color_Level_With_End_Date_Should_Not_Return_The_Discount()
        {
            var    priceMockRepo = new Mock <IPriceRepository>();
            string productNumber = "2EB6771029";
            string currencyCode  = "EURN";
            string colorCode     = "10";
            string sizeCode      = "s";
            string discountCode  = "afp";

            priceMockRepo.Setup(c => c.GetProductPriceRules(productNumber, currencyCode)).Returns(new List <PriceResult>()
            {
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2011, 7, 7),
                    end_date      = new DateTime(2011, 7, 8),
                    price         = 5,
                    discount_code = discountCode,
                    color_code    = colorCode
                }
            });

            AssortmentHelper help = new AssortmentHelper();

            Assert.AreEqual(help.GetDiscount(productNumber, colorCode, sizeCode, priceMockRepo.Object.GetProductPriceRules(productNumber, currencyCode)), null, "Discount from PFA on color level is not as it is expected");
        }
Beispiel #5
0
        public void Price_Rules_With_Color_And_Different_Start_Dates_Should_Always_Take_The_Newest_Rule()
        {
            var    priceMockRepo = new Mock <IPriceRepository>();
            string productNumber = "2EB6771029";
            string currencyCode  = "EURN";
            string colorCode     = "10";
            string sizeCode      = "s";

            priceMockRepo.Setup(c => c.GetProductPriceRules(productNumber, currencyCode)).Returns(new List <PriceResult>()
            {
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2011, 7, 8),
                    price         = 10
                },
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2011, 7, 7),
                    price         = 5,
                    color_code    = colorCode
                },
            });

            AssortmentHelper help = new AssortmentHelper();

            Assert.AreEqual(help.GetPrice(productNumber, colorCode, sizeCode, priceMockRepo.Object.GetProductPriceRules(productNumber, currencyCode)), 10, "Price from PFA is on color level but that is not the newest rule");
        }
Beispiel #6
0
        public void Price_Should_Be_Checked_For_Size_Levels()
        {
            var    priceMockRepo = new Mock <IPriceRepository>();
            string productNumber = "2EB6771031";
            string currencyCode  = "EURN";
            string colorCode     = "10";

            string sizeCode = "s";

            priceMockRepo.Setup(c => c.GetProductPriceRules(productNumber, currencyCode)).Returns(new List <PriceResult>()
            {
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2011, 7, 6),
                    color_code    = colorCode,
                    price         = 12.95m
                },
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2011, 7, 9),
                    price         = 7.50m,
                    color_code    = colorCode,
                    size_code     = "XS"
                }
            });

            AssortmentHelper help = new AssortmentHelper();

            Assert.AreEqual(help.GetPrice(productNumber, colorCode, sizeCode, priceMockRepo.Object.GetProductPriceRules(productNumber, currencyCode)), 12.95m, "Latest price should also ignore the size level");
        }
        private void SetProductStatus(int entity_id, int productStatus, AssortmentHelper helper, SortedDictionary <string, eav_attribute> attributeList, int store_id = 0)
        {
            bool ignoreProductStatusUpdates = Connector.ConnectorSettings.GetValueByKey <bool>("IgnoreProductStatusUpdates", false);

            if (!ignoreProductStatusUpdates)
            {
                helper.SyncAttributeValue(attributeList["status"].attribute_id, PRODUCT_ENTITY_TYPE_ID, StoreList[CurrentStoreCode].store_id, entity_id, productStatus, "int");
            }
        }
        public void TaxRate_Parsing_Should_Take_Rate_Of_Active_Date()
        {
            AssortmentHelper help = new AssortmentHelper();
            var dates             = "10/01/2012;01/01/2001;01/01/1980;08/07/1996;08/07/1996;08/07/1996;08/07/1996;08/07/1996;08/07/1996;08/07/1996";
            var rates             = "21;19;17.5;0;0;0;0;0;0;0";
            var code = "1";
            var rate = help.GetCurrentBTWRate(rates, dates, 18, code);

            Assert.AreEqual(21, rate);
        }
Beispiel #9
0
        public void Discount_on_Product_Level_Later_Than_On_Color_Level()
        {
            var    priceMockRepo = new Mock <IPriceRepository>();
            string productNumber = "1512509031";
            string currencyCode  = "EURN";
            string colorCode     = "800";
            string sizeCode      = "s";

            priceMockRepo.Setup(c => c.GetProductPriceRules(productNumber, currencyCode)).Returns(new List <PriceResult>()
            {
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2012, 7, 2),
                    price         = 49.95m,
                    discount_code = "spec"
                },
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2007, 11, 15),
                    end_date      = new DateTime(2013, 12, 31),
                    price         = 59.95m,
                    color_code    = colorCode,
                    discount_code = "tijd"
                }, new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2012, 3, 7),
                    price         = 64.95m
                },
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2012, 3, 7),
                    end_date      = new DateTime(2013, 12, 31),
                    price         = 64.95m,
                    color_code    = colorCode
                }
            });

            DateTime currentTime = new DateTime(2012, 7, 30);


            AssortmentHelper help = new AssortmentHelper();

            var prices = priceMockRepo.Object.GetProductPriceRules(productNumber, currencyCode);

            Assert.AreEqual(49.95m, help.GetDiscount(productNumber, colorCode, sizeCode, prices, currentTime), "Discount from PFA on color level is not as it is expected");
            Assert.AreEqual(64.95m, help.GetPrice(productNumber, colorCode, sizeCode, prices, currentTime), "Price from PFA on color level is not as it is expected");
        }
        public void TaxRate_Parsing_Should_Return_Default_Rate_If_Exception()
        {
            AssortmentHelper help = new AssortmentHelper();
            var dates             = "3123q2rt3q";
            var rates             = "";
            var code = "1";

            var rate = help.GetCurrentBTWRate(rates, dates, 18, code);

            Assert.AreEqual(18, rate);
        }
        public void TaxRate_Parsing_Should_Still_Work_Without_A_Rate_Code()
        {
            AssortmentHelper help = new AssortmentHelper();
            var dates             = "3123q2rt3q";
            var rates             = "";
            var code = "";

            var rate = help.GetCurrentBTWRate(rates, dates, 18, code);

            Assert.AreEqual(18, rate);
        }
Beispiel #12
0
        public void Discounts_With_Date_Later_Than_Today_Should_Be_Discarded()
        {
            var    priceMockRepo = new Mock <IPriceRepository>();
            string productNumber = "2EB6771029";
            string currencyCode  = "EURN";
            string colorCode     = "10";
            string sizeCode      = "s";
            string discountCode  = "afp";

            DateTime currentTime = new DateTime(2012, 7, 20);

            priceMockRepo.Setup(c => c.GetProductPriceRules(productNumber, currencyCode)).Returns(new List <PriceResult>()
            {
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2012, 7, 20),
                    end_date      = new DateTime(2012, 7, 23),
                    price         = 15,
                    discount_code = discountCode,
                    color_code    = colorCode
                },
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2012, 7, 24),
                    end_date      = new DateTime(2012, 7, 23),
                    price         = 19.95m,
                    discount_code = discountCode,
                    color_code    = colorCode
                },
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2012, 7, 21),
                    price         = 10,
                    discount_code = discountCode,
                    color_code    = "20"
                },
            });

            AssortmentHelper help = new AssortmentHelper();

            var prices = priceMockRepo.Object.GetProductPriceRules(productNumber, currencyCode);

            Assert.AreEqual(help.GetDiscount(productNumber, colorCode, sizeCode, prices, currentTime), 15, "Discount from PFA on color level is not as it is expected");
        }
Beispiel #13
0
        public void Older_Discounts_On_Product_Level_Should_Not_Override_Newer_Color_Levels()
        {
            var    priceMockRepo = new Mock <IPriceRepository>();
            string productNumber = "2EB6771029";
            string currencyCode  = "EURN";
            string colorCode     = "10";
            string sizeCode      = "s";
            string discountCode  = "afp";

            priceMockRepo.Setup(c => c.GetProductPriceRules(productNumber, currencyCode)).Returns(new List <PriceResult>()
            {
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2011, 7, 7),
                    price         = 7,
                    discount_code = discountCode,
                    color_code    = "5"
                },
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2011, 7, 9),
                    price         = 5,
                    discount_code = discountCode,
                    color_code    = colorCode
                },
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2011, 7, 6),
                    price         = 3,
                    discount_code = discountCode,
                },
            });

            AssortmentHelper help = new AssortmentHelper();

            var prices = priceMockRepo.Object.GetProductPriceRules(productNumber, currencyCode);

            Assert.AreEqual(help.GetDiscount(productNumber, colorCode, sizeCode, prices), 5, "Discount from PFA on color level is not as it is expected");
            Assert.AreEqual(help.GetDiscount(productNumber, "5", sizeCode, prices), 7, "Discount from PFA on color level is not as it is expected");
            Assert.AreEqual(help.GetDiscount(productNumber, "12", sizeCode, prices), 3, "Discount from PFA on color level is not as it is expected");
        }
Beispiel #14
0
        public void Ignore_Price_Rules_With_Zero()
        {
            var    priceMockRepo = new Mock <IPriceRepository>();
            string productNumber = "1112001046";
            string currencyCode  = "EURN";
            string colorCode     = "395";

            priceMockRepo.Setup(c => c.GetProductPriceRules(productNumber, currencyCode)).Returns(new List <PriceResult>()
            {
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2012, 3, 23),
                    price         = 59.95m
                },
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2012, 7, 2),
                    end_date      = new DateTime(2012, 9, 24),
                    price         = 69.95m,
                    color_code    = colorCode
                },
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2012, 7, 25),
                    price         = 0,
                },
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2012, 9, 25),
                    end_date      = new DateTime(2012, 9, 24),
                    price         = 69.95m,
                    color_code    = colorCode
                }
            });

            AssortmentHelper help = new AssortmentHelper();

            Assert.AreEqual(69.95m, help.GetPrice(productNumber, colorCode, string.Empty, priceMockRepo.Object.GetProductPriceRules(productNumber, currencyCode)), "OMP price should be imported");
        }
        private void SyncProducts()
        {
            var productsSource = (from p in Assortment
                                  select p);

            if (productsSource.Count() > 0)
            {
                bool doRetailStock = ((ConnectorSystemType)Connector.ConnectorType).Has(ConnectorSystemType.ExportRetailStock);

                XDocument retailStock = null;
                Dictionary <int, List <AssortmentRetailStock> > retailStockList = new Dictionary <int, List <AssortmentRetailStock> >();

                if (IsPrimaryLanguage && doRetailStock)
                {
                    retailStockList = (from r in Assortment
                                       select new
                    {
                        product_id = r.ProductID,
                        store_records = r.RetailStock
                    }).Distinct().ToDictionary(x => x.product_id, y => y.store_records);
                }

                Dictionary <string, int> stockStoreList = new Dictionary <string, int>();
                if (doRetailStock)
                {
                    using (var helper = new AssortmentHelper(Connector.Connection, Version))
                    {
                        stockStoreList = helper.GetStockStoreList();
                    }
                }


                List <AssortmentStockPriceProduct> products = productsSource.Where(x => !x.IsConfigurable).ToList();

                ProcessProductCollection(retailStockList, stockStoreList, products);
            }

            if (AssortmentToDeactivate == null && productsSource.Count() > 0)
            {
                CheckFullAssortmentAndDeactivateProducts(productsSource);
            }
            else
            {
                DeactivateAssortmentPartial(AssortmentToDeactivate);
            }
        }
Beispiel #16
0
        public void Change_Of_Price_With_Code_OMP_Should_Be_Imported()
        {
            var    priceMockRepo = new Mock <IPriceRepository>();
            string productNumber = "2EB6771031";
            string currencyCode  = "EURN";
            string colorCode     = "10";

            string sizeCode = "s";

            priceMockRepo.Setup(c => c.GetProductPriceRules(productNumber, currencyCode)).Returns(new List <PriceResult>()
            {
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2011, 7, 6),
                    color_code    = colorCode,
                    price         = 12.95m,
                    discount_code = "omp"
                },
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2011, 7, 3),
                    price         = 7.50m,
                    color_code    = colorCode,
                    size_code     = "XS",
                    discount_code = "afp"
                },
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2011, 7, 9),
                    price         = 10m,
                    color_code    = colorCode,
                    size_code     = "XS"
                }
            });

            AssortmentHelper help = new AssortmentHelper();

            Assert.AreEqual(12.95m, help.GetPrice(productNumber, colorCode, sizeCode, priceMockRepo.Object.GetProductPriceRules(productNumber, currencyCode)), "OMP price should be imported");
        }
Beispiel #17
0
        public void Price_Of_Zero_On_Product_Level_And_Price_On_Color_Level_Should_Word()
        {
            var    priceMockRepo = new Mock <IPriceRepository>();
            string productNumber = "2EB6771029";
            string currencyCode  = "EURN";
            string colorCode     = "10";

            string sizeCode = "s";

            priceMockRepo.Setup(c => c.GetProductPriceRules(productNumber, currencyCode)).Returns(new List <PriceResult>()
            {
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2011, 7, 9),
                    color_code    = colorCode,
                    price         = 10
                },
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2011, 7, 9),
                    price         = 10,
                    color_code    = "300",
                },
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2011, 7, 9),
                    price         = 0,
                }
            });

            AssortmentHelper help = new AssortmentHelper();

            Assert.AreEqual(help.GetPrice(productNumber, colorCode, sizeCode, priceMockRepo.Object.GetProductPriceRules(productNumber, currencyCode)), 10, "Price from PFA is not checked for an end date");
            Assert.AreEqual(help.GetPrice(productNumber, "300", sizeCode, priceMockRepo.Object.GetProductPriceRules(productNumber, currencyCode)), 10, "Price from PFA is not checked for an end date");
            Assert.AreEqual(help.GetPrice(productNumber, "500", sizeCode, priceMockRepo.Object.GetProductPriceRules(productNumber, currencyCode)), 0, "Price from PFA is not checked for an end date");
        }
        private void ProcessProductCollection(Dictionary <int, List <AssortmentRetailStock> > retailStockList, Dictionary <string, int> stockStoreList, List <AssortmentStockPriceProduct> products)
        {
            int totalProcessed = 0;
            SortedDictionary <string, eav_attribute> attributeList;
            int totalRecords = products.Count();

            Logger.DebugFormat("Found {0} products", totalRecords);

            using (var helper = new AssortmentHelper(Connector.Connection, Version))
            {
                attributeList = helper.GetAttributeList(PRODUCT_ENTITY_TYPE_ID);
            }

            ParallelOptions options = new ParallelOptions()
            {
                MaxDegreeOfParallelism = 1
            };

            Parallel.ForEach(Partitioner.Create(0, totalRecords), options, (range, loopState) =>
            {
                using (var helper = new AssortmentHelper(Connector.Connection, Version))
                {
                    var skuList = helper.GetSkuList();

                    for (int index = range.Item1; index < range.Item2; index++)
                    {
                        int productID = Convert.ToInt32(products[index].ProductID);

                        IEnumerable <AssortmentRetailStock> productRetailStock = null;

                        ProcessProduct(helper, products[index], skuList, attributeList, stockStoreList, productRetailStock);

                        Interlocked.Increment(ref totalProcessed);
                        if (totalProcessed % 100 == 0)
                        {
                            Logger.DebugFormat(String.Format("Processed {0} of {1} records", totalProcessed, totalRecords));
                        }
                    }
                }
            });
        }
Beispiel #19
0
        public void Colors_With_Different_Prices_And_Different_Start_Dates_Should_Be_Correct()
        {
            var    priceMockRepo = new Mock <IPriceRepository>();
            string productNumber = "2EB6771029";
            string currencyCode  = "EURN";
            string colorCode     = "10";
            string sizeCode      = "s";

            priceMockRepo.Setup(c => c.GetProductPriceRules(productNumber, currencyCode)).Returns(new List <PriceResult>()
            {
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2011, 7, 9),
                    color_code    = colorCode,
                    price         = 10
                },
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2011, 7, 8),
                    price         = 5,
                    color_code    = "5"
                },
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2011, 7, 7),
                    price         = 7
                },
            });

            AssortmentHelper help = new AssortmentHelper();

            Assert.AreEqual(help.GetPrice(productNumber, colorCode, sizeCode, priceMockRepo.Object.GetProductPriceRules(productNumber, currencyCode)), 10, "Price from PFA is not checked for an end date");
            Assert.AreEqual(help.GetPrice(productNumber, "5", sizeCode, priceMockRepo.Object.GetProductPriceRules(productNumber, currencyCode)), 5, "Price from PFA is not checked for an end date");
            Assert.AreEqual(help.GetPrice(productNumber, "12", sizeCode, priceMockRepo.Object.GetProductPriceRules(productNumber, currencyCode)), 7, "Price from PFA is not checked for an end date");
        }
Beispiel #20
0
        private void CleanupGallery(AssortmentHelper helper, catalog_product_entity entity, IEnumerable <catalog_product_entity_media_gallery> currentImages, List <string> currentPaths, TElSimpleSFTPClient client, string basePath)
        {
            var toDelete = (from r in currentImages
                            where !currentPaths.Contains(r.value)
                            select basePath + r.value);


            foreach (var file in toDelete)
            {
                try
                {
                    client.RemoveFile(file);
                }
                catch { }
            }
            helper.DeleteGalleryItems(
                (from r in currentImages
                 where !currentPaths.Contains(r.value)
                 select r).ToList()
                );
        }
Beispiel #21
0
        public void Price_With_A_Start_Date_Later_Than_Discount_With_Start_Date_And_Earlier_End_Date_Should_Override_The_Discount()
        {
            var    priceMockRepo = new Mock <IPriceRepository>();
            string productNumber = "1512510009";
            string currencyCode  = "EURN";
            string colorCode     = "100";
            string sizeCode      = "s";
            string discountCode  = "tijd";

            DateTime currentTime = new DateTime(2012, 7, 30);

            priceMockRepo.Setup(c => c.GetProductPriceRules(productNumber, currencyCode)).Returns(new List <PriceResult>()
            {
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2012, 7, 24),
                    end_date      = new DateTime(2012, 7, 29),
                    price         = 15,
                    discount_code = discountCode,
                    color_code    = colorCode
                },
                new PriceResult()
                {
                    art_code      = productNumber,
                    currency_code = currencyCode,
                    start_date    = new DateTime(2012, 7, 30),
                    price         = 21.50m,
                    color_code    = colorCode
                }
            });

            AssortmentHelper help = new AssortmentHelper();

            var prices = priceMockRepo.Object.GetProductPriceRules(productNumber, currencyCode);

            Assert.AreEqual(null, help.GetDiscount(productNumber, colorCode, sizeCode, prices, currentTime), "Discount from PFA on color level is not as it is expected");
        }
        private void DeactivateAssortmentPartial(IEnumerable <AssortmentStockPriceProduct> productsSource)
        {
            using (var helper = new AssortmentHelper(Connector.Connection, Version))
            {
                var skuList      = helper.GetSkuList();
                var toDeactivate = (from p in productsSource
                                    let entity_id = (skuList.ContainsKey(p.ManufacturerID) ? skuList[p.ManufacturerID].entity_id : 0)
                                                    where !p.IsNonAssortmentItem && entity_id != 0 && //only products that are already present in magento
                                                    !p.ManufacturerID.StartsWith("ShippingCostProductID_")
                                                    select new KeyValuePair <string, int>(
                                        p.ManufacturerID,
                                        entity_id
                                        )).ToList();


                //exclude shipping costs


                if (toDeactivate.Count() > 0)
                {
                    SortedDictionary <string, eav_attribute> attributeList = helper.GetAttributeList(PRODUCT_ENTITY_TYPE_ID);

                    foreach (var p in toDeactivate)
                    {
                        SetProductStatus(p.Value, (int)PRODUCT_STATUS.DISABLED, helper, attributeList, StoreList[CurrentStoreCode].store_id);

                        if (RequiresStockUpdate)
                        {
                            helper.SyncStock(new cataloginventory_stock_item()
                            {
                                product_id  = p.Value,
                                qty         = 0,
                                is_in_stock = false
                            });
                        }
                    }
                }
            }
        }
Beispiel #23
0
        protected override void Process()
        {
            _monitoring.Notify(Name, 0);

            var vendorOverridesSetting = GetConfiguration().AppSettings.Settings["VendorIDOverrides"].Try(c => c.Value, string.Empty);

            if (!string.IsNullOrEmpty(vendorOverridesSetting))
            {
                _vendorIDs = (from p in vendorOverridesSetting.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                              select Convert.ToInt32(p)).ToList();
            }

            var cultureInfoAmerican = CultureInfo.InvariantCulture;
            List <ProductAttributeMetaData> attributes = new List <ProductAttributeMetaData>();

            string connectionString      = string.Empty;
            string stockConnectionString = string.Empty;
            var    pluginConfig          = GetConfiguration();
            var    currentYear           = DateTime.Now.Year;

            using (var unit = GetUnitOfWork())
            {
                connectionString = VendorHelper.GetConnectionStringForPFA(1); //todo: fix vendorid

                CoolcatPFARepository repository = new CoolcatPFARepository(connectionString, stockConnectionString, log);
                AssortmentHelper     helper     = new AssortmentHelper();

                try
                {
                    SetupAttributes(unit, CCAttributeHelper.Attributes, out attributes);
                }
                catch (Exception e)
                {
                    log.Debug(e.InnerException);
                }

                var shopWeekLookup  = repository.GetShopWeekLookup();
                var sizeCodeLookup  = repository.GetSizeCodeLookup();
                var validArtCodes   = repository.GetValidItemNumbers();
                var colorNameLookup = repository.GetColorLookup();
                Dictionary <string, string> colorCodesDict = new Dictionary <string, string>();

                foreach (var vendorID in _vendorIDs)
                {
                    try
                    {
                        _monitoring.Notify(Name, vendorID);
#if DEBUG
                        if (vendorID != 15)
                        {
                            continue;
                        }
#endif

                        Dictionary <string, int> justArrivedCounters = new Dictionary <string, int>();
                        var vendor = unit.Scope.Repository <Vendor>().GetSingle(c => c.VendorID == vendorID);
                        var shouldNotCheckForSolden        = vendor.VendorSettings.GetValueByKey <bool>("NonSoldenVendor", false);
                        var vendorDoesNotImportDescription = vendor.VendorSettings.GetValueByKey <bool>("VendorDoesNotImportDescriptions", false);
                        var countryCode = VendorHelper.GetCountryCode(vendorID);
                        log.Info("Starting import for vendor " + vendor.Name);

                        var connectorID = vendor.ContentProducts.Select(x => x.ConnectorID).FirstOrDefault();

                        bool isSolden;

                        if (shouldNotCheckForSolden)
                        {
                            isSolden = true;
                        }
                        else if (connectorID == null || !GetSoldenPeriod(connectorID, out isSolden))
                        {
                            throw new Exception("Solden period values are corrupt.");
                        }

                        var parentVendorID = vendor.ParentVendorID.HasValue ? vendor.ParentVendorID.Value : vendor.VendorID;

                        var currencyCode = vendor.VendorSettings.FirstOrDefault(c => c.SettingKey == "PFACurrencyCode").Try(c => c.Value, string.Empty);
                        currencyCode.ThrowIfNullOrEmpty(new InvalidOperationException("Missing PFA currency code"));


                        List <Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorAssortmentItem> items          = new List <Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorAssortmentItem>();
                        List <Concentrator.Objects.Vendors.Bulk.VendorBarcodeBulk.VendorImportBarcode>     vendorBarcodes = new List <VendorBarcodeBulk.VendorImportBarcode>();

                        log.Info("Found products in total: " + validArtCodes.Count());

                        int counter = 0;

                        foreach (var itemNumber in validArtCodes)
                        {
                            var productInfo = repository.GetGeneralProductInformation(itemNumber, countryCode);
                            //productInfo.TaxRate = productInfo.TaxRate.Replace("%", string.Empty);
                            var rate = helper.GetCurrentBTWRate(productInfo.TaxRatePercentage, productInfo.TaxRateDates, 21, productInfo.TaxCode);

                            counter++;
                            if (counter % 100 == 0)
                            {
                                log.Info("Found " + counter);
                            }

                            if (!justArrivedCounters.ContainsKey(productInfo.GroupName1))
                            {
                                justArrivedCounters.Add(productInfo.GroupName1, 0);
                            }

                            var priceRules = repository.GetProductPriceRules(itemNumber, currencyCode);

                            if (!string.IsNullOrEmpty(productInfo.override_tax_code))
                            {
                                rate = helper.GetCurrentBTWRate(productInfo.override_tax_rates, productInfo.override_tax_dates, 21, productInfo.override_tax_code);
                            }


                            DateTime?weekShop = null;

                            shopWeekLookup.TryGetValue(itemNumber, out weekShop);

                            Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorAssortmentItem itemToAdd = null;
                            if (itemNumber != PfaCoolcatConfiguration.Current.ShipmentCostsProduct && itemNumber != PfaCoolcatConfiguration.Current.ReturnCostsProduct &&
                                itemNumber != PfaCoolcatConfiguration.Current.KialaShipmentCostsProduct && itemNumber != PfaCoolcatConfiguration.Current.KialaReturnCostsProduct)
                            {
                                itemToAdd = new Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorAssortmentItem
                                {
                                    BrandVendors = new List <VendorAssortmentBulk.VendorImportBrand>()
                                    {
                                        GetVendorBrand(vendorID)
                                    },
                                    VendorProduct               = GetVendorProduct(itemNumber, productInfo.ShortDescription, productInfo.Material, vendorID, parentVendorID, true, productInfo.GroupCode1, productInfo.GroupName1, productInfo.GroupCode2, productInfo.GroupName2, productInfo.GroupCode3, productInfo.GroupName3),
                                    VendorProductDescriptions   = vendorDoesNotImportDescription ? new List <Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorProductDescription>() : GetProductDescriptions(itemNumber, vendorID, parentVendorID, productInfo, _languageIDs),
                                    VendorImportAttributeValues = GetAttributesOnConfigurableLevel(productInfo, itemNumber, attributes, CONCENTRATOR_VENDOR_ID, vendorID),
                                    RelatedProducts             = new List <VendorAssortmentBulk.VendorImportRelatedProduct>(),
                                    VendorImportPrices          = new List <Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorImportPrice>()
                                    {
                                        GetVendorPrice(vendorID, parentVendorID, itemNumber, "0", rate.ToString(cultureInfoAmerican), "0", LEVEL_NOT_EXPORTABLE_STATUS)
                                    },
                                    VendorImportStocks = new List <Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorImportStock>()
                                };
                                items.Add(itemToAdd);
                            }
                            int?shopWeekNumber = null;
                            if (weekShop.HasValue)
                            {
                                Calendar cal = new CultureInfo("nl-NL").Calendar;
                                shopWeekNumber = cal.GetWeekOfYear(weekShop.Value, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Sunday);
                            }

                            if (itemToAdd != null && shopWeekNumber.HasValue)
                            {
                                itemToAdd.VendorImportAttributeValues.Add(new Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorImportAttributeValue()
                                {
                                    AttributeCode    = SHOP_WEEK_ATTRIBUTE_CODE,
                                    Value            = weekShop.Value.Year.ToString() + shopWeekNumber.ToString().PadLeft(2, '0'),
                                    AttributeID      = attributes.FirstOrDefault(c => c.AttributeCode == SHOP_WEEK_ATTRIBUTE_CODE).AttributeID,
                                    CustomItemNumber = itemNumber,
                                    DefaultVendorID  = vendorID,
                                    LanguageID       = null,
                                    VendorID         = CONCENTRATOR_VENDOR_ID
                                });
                            }

                            var skus     = repository.GetValidSkus(itemNumber);
                            var skuSpecs = repository.GetSkuSpecifications(itemNumber);

                            //process color level
                            foreach (var colorLevel in skus.GroupBy(c => c.ColorCode))
                            {
                                var colorItemNumber = string.Format("{0} {1}", itemNumber, colorLevel.Key).Trim();

                                Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorAssortmentItem colorLevelProduct = null;

                                if (itemNumber != PfaCoolcatConfiguration.Current.ShipmentCostsProduct && itemNumber != PfaCoolcatConfiguration.Current.ReturnCostsProduct &&
                                    itemNumber != PfaCoolcatConfiguration.Current.KialaShipmentCostsProduct && itemNumber != PfaCoolcatConfiguration.Current.KialaReturnCostsProduct)
                                {
                                    colorLevelProduct = new Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorAssortmentItem()
                                    {
                                        BrandVendors = new List <VendorAssortmentBulk.VendorImportBrand>()
                                        {
                                            GetVendorBrand(vendorID)
                                        },
                                        VendorProduct               = GetVendorProduct(colorItemNumber, productInfo.ShortDescription, productInfo.Material, vendorID, parentVendorID, true, productInfo.GroupCode1, productInfo.GroupName1, productInfo.GroupCode2, productInfo.GroupName2, productInfo.GroupCode3, productInfo.GroupName3, parentCustomItemNumber: itemNumber),
                                        VendorProductDescriptions   = vendorDoesNotImportDescription ? new List <Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorProductDescription>() : GetProductDescriptions(colorItemNumber, vendorID, parentVendorID, productInfo, _languageIDs),
                                        VendorImportAttributeValues = GetAttributesOnConfigurableLevel(productInfo, colorItemNumber, attributes, CONCENTRATOR_VENDOR_ID, vendorID),
                                        RelatedProducts             = new List <VendorAssortmentBulk.VendorImportRelatedProduct>(
                                            (from rp in skus.GroupBy(c => c.ColorCode)
                                             where rp.Key != colorLevel.Key
                                             select new Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorImportRelatedProduct()
                                        {
                                            CustomItemNumber = colorItemNumber,
                                            DefaultVendorID = vendorID,
                                            VendorID = vendorID,
                                            IsConfigured = 0,
                                            RelatedCustomItemNumber = string.Format("{0} {1}", itemNumber, rp.Key).Trim(),
                                            RelatedProductType = "Related Color Level"
                                        }).ToList()
                                            ),
                                        VendorImportPrices = new List <Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorImportPrice>()
                                        {
                                            GetVendorPrice(vendorID, parentVendorID, colorItemNumber, "0", rate.ToString(cultureInfoAmerican), "0")
                                        },
                                        VendorImportStocks = new List <Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorImportStock>()
                                    };

                                    if (colorLevelProduct != null && shopWeekNumber.HasValue)
                                    {
                                        colorLevelProduct.VendorImportAttributeValues.Add(new Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorImportAttributeValue()
                                        {
                                            AttributeCode    = SHOP_WEEK_ATTRIBUTE_CODE,
                                            Value            = weekShop.Value.Year.ToString() + shopWeekNumber.ToString().PadLeft(2, '0'),
                                            AttributeID      = attributes.FirstOrDefault(c => c.AttributeCode == SHOP_WEEK_ATTRIBUTE_CODE).AttributeID,
                                            CustomItemNumber = colorItemNumber,
                                            DefaultVendorID  = vendorID,
                                            LanguageID       = null,
                                            VendorID         = CONCENTRATOR_VENDOR_ID
                                        });
                                    }

                                    items.Add(colorLevelProduct);

                                    if (itemToAdd != null)
                                    {
                                        itemToAdd.RelatedProducts.Add(new VendorAssortmentBulk.VendorImportRelatedProduct()
                                        {
                                            CustomItemNumber        = itemNumber,
                                            RelatedCustomItemNumber = colorItemNumber,
                                            IsConfigured            = 0,
                                            DefaultVendorID         = parentVendorID,
                                            VendorID           = vendorID,
                                            RelatedProductType = "Style"
                                        });
                                    }
                                }

                                if (justArrivedCounters[productInfo.GroupName1] < 60)
                                {
                                    if (weekShop.HasValue)
                                    {
                                        var daysInRange = (DateTime.Now - weekShop.Value).Days;
                                        if (daysInRange >= 0 && daysInRange <= 14)
                                        {
                                            if (colorLevelProduct != null)
                                            {
                                                colorLevelProduct.VendorProduct.VendorProductGroupCode4 = "Just arrived";

                                                colorLevelProduct.VendorProduct.VendorProductGroupCodeName4 = "Just arrived";
                                                justArrivedCounters[productInfo.GroupName1]++;
                                            }
                                        }
                                    }
                                }

                                foreach (var sku in colorLevel)
                                {
                                    var skuBarcode = CompleteBarcode(sku.Barcode);

                                    int webshopStock  = 0;
                                    int ceyenneStock  = 0;
                                    int transferStock = 0;
                                    int wmsStock      = 0;

                                    string sizeCodePfa = sku.SizeCode;

                                    foreach (var lookupT in new List <string>()
                                    {
                                        productInfo.MtbCode1, productInfo.MtbCode2, productInfo.MtbCode3, productInfo.MtbCode4
                                    })
                                    {
                                        var lookup = sizeCodeLookup.FirstOrDefault(c => c.SizeCode.ToLower() == sku.SizeCode.ToLower() && c.MtbCode.ToLower() == lookupT.ToLower());
                                        if (lookup != null)
                                        {
                                            sizeCodePfa = lookup.PfaCode;
                                            break;
                                        }
                                    }

                                    var product = new Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorAssortmentItem();

                                    string skuNew = string.Empty;
                                    if (itemNumber == PfaCoolcatConfiguration.Current.ShipmentCostsProduct || itemNumber == PfaCoolcatConfiguration.Current.ReturnCostsProduct ||
                                        itemNumber == PfaCoolcatConfiguration.Current.KialaShipmentCostsProduct || itemNumber == PfaCoolcatConfiguration.Current.KialaReturnCostsProduct)
                                    {
                                        skuNew = itemNumber;
                                    }
                                    else
                                    {
                                        skuNew = string.Format("{0} {1} {2}", itemNumber, sku.ColorCode, sku.SizeCode);
                                    }

                                    Concentrator.Objects.Vendors.Bulk.VendorBarcodeBulk.VendorImportBarcode bc = new VendorBarcodeBulk.VendorImportBarcode()
                                    {
                                        CustomItemNumber = skuNew,
                                        Barcode          = sizeCodePfa,
                                        Type             = 4,
                                        VendorID         = 1
                                    };

                                    vendorBarcodes.Add(bc);

                                    var price    = helper.GetPrice(itemNumber, sku.ColorCode, sku.SizeCode, priceRules);
                                    var discount = helper.GetDiscount(itemNumber, sku.ColorCode, sku.SizeCode, priceRules);

                                    if (!isSolden)
                                    {
                                        if (discount.HasValue)
                                        {
                                            price    = discount.Value;
                                            discount = null;
                                        }
                                    }

                                    var item = items.Where(c => c.VendorProduct.CustomItemNumber == itemNumber);
                                    if (item == null)
                                    {
                                        continue;
                                    }


                                    product = new Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorAssortmentItem()
                                    {
                                        VendorProduct             = GetVendorProduct(skuNew, productInfo.ShortDescription, productInfo.LongDescription, vendorID, parentVendorID, false, productInfo.GroupCode1, productInfo.GroupName1, productInfo.GroupCode2, productInfo.GroupName2, productInfo.GroupCode3, productInfo.GroupName3, parentCustomItemNumber: colorItemNumber, barcode: skuBarcode),
                                        VendorProductDescriptions = vendorDoesNotImportDescription ? new List <Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorProductDescription>() : GetProductDescriptions(skuNew, vendorID, parentVendorID, productInfo, _languageIDs),
                                        BrandVendors = new List <VendorAssortmentBulk.VendorImportBrand>()
                                        {
                                            GetVendorBrand(vendorID)
                                        },
                                        VendorImportAttributeValues = (from m in CCAttributeHelper.Attributes
                                                                       where m.Configurable
                                                                       let aM = attributes.FirstOrDefault(c => c.AttributeCode.ToLower() == m.Code.ToLower())
                                                                                select new Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorImportAttributeValue
                                        {
                                            AttributeCode = aM.AttributeCode,
                                            AttributeID = aM.AttributeID,
                                            CustomItemNumber = skuNew,
                                            DefaultVendorID = vendorID,
                                            LanguageID = null,
                                            VendorID = CONCENTRATOR_VENDOR_ID,
                                            Value = (m.Code.ToLower() == "color" ? sku.ColorCode : sku.SizeCode)
                                        }).ToList(),

                                        RelatedProducts    = new List <VendorAssortmentBulk.VendorImportRelatedProduct>(),
                                        VendorImportPrices = new List <Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorImportPrice>()
                                        {
                                            GetVendorPrice(vendorID, parentVendorID, skuNew, price.ToString(cultureInfoAmerican), rate.ToString(cultureInfoAmerican), (discount.HasValue && discount.Value < price)? discount.Value.ToString(cultureInfoAmerican) :null)
                                        },

                                        VendorImportStocks = new List <Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorImportStock>()
                                    };


                                    if ((discount.HasValue && discount.Value > 0) && (price != discount))
                                    {
                                        if (itemToAdd != null)
                                        {
                                            //That is because code4 might be filled with just arrived
                                            if (string.IsNullOrEmpty(colorLevelProduct.VendorProduct.VendorProductGroupCode4))
                                            {
                                                colorLevelProduct.VendorProduct.VendorProductGroupCode4     = "SALE";
                                                colorLevelProduct.VendorProduct.VendorProductGroupCodeName4 = "SALE";
                                            }
                                            else
                                            {
                                                colorLevelProduct.VendorProduct.VendorProductGroupCode5     = "SALE";
                                                colorLevelProduct.VendorProduct.VendorProductGroupCodeName5 = "SALE";
                                            }

                                            if (string.IsNullOrEmpty(itemToAdd.VendorProduct.VendorProductGroupCode4))
                                            {
                                                itemToAdd.VendorProduct.VendorProductGroupCode4     = "SALE";
                                                itemToAdd.VendorProduct.VendorProductGroupCodeName4 = "SALE";
                                            }
                                            else
                                            {
                                                itemToAdd.VendorProduct.VendorProductGroupCode5     = "SALE";
                                                itemToAdd.VendorProduct.VendorProductGroupCodeName5 = "SALE";
                                            }

                                            if (string.IsNullOrEmpty(product.VendorProduct.VendorProductGroupCode4))
                                            {
                                                product.VendorProduct.VendorProductGroupCode4     = "SALE";
                                                product.VendorProduct.VendorProductGroupCodeName4 = "SALE";
                                            }
                                            else
                                            {
                                                product.VendorProduct.VendorProductGroupCode5     = "SALE";
                                                product.VendorProduct.VendorProductGroupCodeName5 = "SALE";
                                            }
                                        }
                                    }

                                    var attributeColorRows = skuSpecs.Where(c => c.ColorCode == sku.ColorCode).ToList();

                                    var mentality  = GetAttributeValue(attributeColorRows, "Mentality");
                                    var input      = GetAttributeValue(attributeColorRows, "Input");
                                    var Style      = GetAttributeValue(attributeColorRows, "Style");
                                    var Usermoment = GetAttributeValue(attributeColorRows, "Usermoment");
                                    var Module     = GetAttributeValue(attributeColorRows, "Module");

                                    AddAttributeValue(itemToAdd, "Mentality", mentality, attributes, itemNumber, CONCENTRATOR_VENDOR_ID, vendorID);
                                    AddAttributeValue(itemToAdd, "Style", Style, attributes, itemNumber, CONCENTRATOR_VENDOR_ID, vendorID);
                                    AddAttributeValue(itemToAdd, "Usermoment", Usermoment, attributes, itemNumber, CONCENTRATOR_VENDOR_ID, vendorID);
                                    AddAttributeValue(product, "Module", Module, attributes, skuNew, CONCENTRATOR_VENDOR_ID, vendorID);
                                    AddAttributeValue(itemToAdd, "InputCode", input, attributes, itemNumber, CONCENTRATOR_VENDOR_ID, vendorID);
                                    AddAttributeValue(itemToAdd, "Gender", DetermineGenderByVendorItemNumber(itemNumber), attributes, itemNumber, CONCENTRATOR_VENDOR_ID, vendorID);

                                    items.Add(product);
                                    if (colorLevelProduct != null)
                                    {
                                        //relate to main product
                                        if (colorLevelProduct.RelatedProducts.Where(c => c.CustomItemNumber == colorItemNumber && c.RelatedCustomItemNumber == skuNew).FirstOrDefault() == null)
                                        {
                                            colorLevelProduct.RelatedProducts.Add(new VendorAssortmentBulk.VendorImportRelatedProduct()
                                            {
                                                CustomItemNumber        = colorItemNumber,
                                                DefaultVendorID         = parentVendorID,
                                                IsConfigured            = 1,
                                                RelatedCustomItemNumber = skuNew,
                                                RelatedProductType      = "Configured product",
                                                VendorID = vendorID
                                            });
                                        }
                                    }
                                }
                            }
                        }

                        var bulkConfig = new VendorAssortmentBulkConfiguration();
                        using (var vendorAssortmentBulk = new VendorAssortmentBulk(items, vendorID, parentVendorID, bulkConfig))
                        {
                            vendorAssortmentBulk.Init(unit.Context);
                            vendorAssortmentBulk.Sync(unit.Context);
                        }

                        using (var barcodeBulk = new VendorBarcodeBulk(vendorBarcodes, vendorID, 4))
                        {
                            barcodeBulk.Init(unit.Context);
                            barcodeBulk.Sync(unit.Context);
                        }
                    }
                    catch (Exception e)
                    {
                        log.AuditCritical("Import failed for vendor " + vendorID, e);
                        _monitoring.Notify(Name, -vendorID);
                    }
                }
                AddValueLabels(unit, colorCodesDict);
                ConfigureProductAttributes(_vendorIDs, unit);
            }
            _monitoring.Notify(Name, 1);
        }
Beispiel #24
0
        protected override void Process()
        {
            CurrentLanguage = PrimaryLanguage;
            var Soap = new AssortmentService();

#if CACHE
            if (!File.Exists(String.Format(ImagesCacheFile, Connector.ConnectorID, PrimaryLanguage.LanguageID)))
            {
                ImagesXml = XDocument.Parse(Soap.GetAssortmentImages(Connector.ConnectorID));
                ImagesXml.Save(String.Format(ImagesCacheFile, Connector.ConnectorID, PrimaryLanguage.LanguageID));
            }
            else
            {
                ImagesXml = XDocument.Load(String.Format(ImagesCacheFile, Connector.ConnectorID, PrimaryLanguage.LanguageID));
            }
#else
            ImagesXml = XDocument.Parse(Soap.GetAssortmentImages(Connector.ConnectorID));
#endif


            SBLicenseManager.TElSBLicenseManager m = new SBLicenseManager.TElSBLicenseManager();
            m.LicenseKey = "8F1317CD48AC4E68BABA5E339D8B365414D7ADA0289CA037E9074D29AD95FF3EC5D796BEFF0FBADB3BD82F48644C9EB810D9B5A305E0D2A1885C874D8BF974B9608CE918113FBE2AA5EEF8264C93B25ABEA98715DB4AD265F47CE02FC9952D69F2C3530B6ABAAA4C43B45E7EF6A8A0646DA038E34FBFB629C2BF0E83C6B348726E622EBD52CA05CF74C68F1279849CCD0C13EA673916BA42684015D658B8E7626F15BD826A4340EDB36CE55791A051FDBCF9FA1456C3B5008AD9990A0185C0EA3B19F9938CB7DA1FE82736ED4C7A566D4BFD53411E8380F4B020CB50E762520EFAE190836FD253B00DB18D4A485C7DC918AA4DCEC856331DD231CC8DC9C741C3";


            FtpInfo ftpInfo = SftpHelper.GetFtpInfo(Connector);


            Logger.DebugFormat("Exporting images for language '{0}'", CurrentLanguage.Language.Name);

            SortedDictionary <string, catalog_product_entity> currentProducts;
            SortedDictionary <string, eav_attribute>          attributeList;

            using (var helper = new MagentoMySqlHelper(Connector.Connection))
            {
                attributeList = helper.GetAttributeList(PRODUCT_ENTITY_TYPE_ID);

                currentProducts = helper.GetSkuList();
            }


            var products = (from i in ImagesXml.Root.Elements("Products").Elements("ProductMedia")
                            where i.Attribute("ManufacturerID") != null

                            orderby Convert.ToInt32(i.Attribute("ProductID").Value) descending
                            group i by i.Attribute("ManufacturerID").Value into grouped
                            select grouped).ToList();


            var directoryStructureRecords = (from i in ImagesXml.Root.Elements("Products").Elements("ProductMedia")
                                             // this catches the changes in webservice structure
                                             let urlAttribute = i.Attribute("Url")
                                                                let uri = (urlAttribute != null) ? new Uri(urlAttribute.Value) : new Uri(i.Value)
                                                                          select new
            {
                FirstLevel = uri.Segments.Last().Substring(0, 1),
                SecondLevel = uri.Segments.Last().Substring(1, 1)
            }).GroupBy(x => x.FirstLevel).ToDictionary(x => x.Key, y => y.Select(z => z.SecondLevel).Distinct());


            var dirClient = SftpHelper.GetSFTPClient(ftpInfo);


            foreach (var kv in directoryStructureRecords)
            {
                SftpHelper.EnsurePath(dirClient, ftpInfo.FtpPath + kv.Key);
                //if (!dirClient.Exists(kv.Key))
                //  dirClient.MakeDirectory(kv.Key);
                foreach (var sl in kv.Value)
                {
                    //if (!dirClient.Exists(kv.Key + "/" + sl))
                    //  dirClient.MakeDirectory(kv.Key + "/" + sl);
                    SftpHelper.EnsurePath(dirClient, ftpInfo.FtpPath + kv.Key + "/" + sl);
                }
            }

            dirClient.Close(true);

            int totalImages    = products.Select(x => x.Count()).Sum();
            int totalRecords   = products.Count;
            int totalProcessed = 0;

            if (totalRecords == 0)
            {
                Logger.DebugFormat("Finished exporting images for language '{0}'", CurrentLanguage.Language.Name);
                return;
            }
            ParallelOptions options = new ParallelOptions()
            {
                MaxDegreeOfParallelism = 8
            };

            Parallel.ForEach(Partitioner.Create(0, totalRecords), options, (range, loopState) =>
            {
                TElSimpleSFTPClient client = SftpHelper.GetSFTPClient(ftpInfo);
                try
                {
                    using (var helper = new AssortmentHelper(Connector.Connection, Version))
                    {
                        for (int index = range.Item1; index < range.Item2; index++)
                        {
                            var product = products[index];

                            var sku = product.Key.Trim();
                            catalog_product_entity entity;
                            if (!currentProducts.TryGetValue(sku, out entity))
                            {
                                continue;
                            }


                            List <string> currentPaths = new List <string>();

                            //helper.ResetGallery(entity, 0);

                            var sequencedImages = product.OrderBy(x => Convert.ToInt32(x.Attribute("Sequence").Value)).ToList();
                            var thumbnailImage  = sequencedImages.FirstOrDefault(c => c.Attribute("IsThumbnailImage") != null && Convert.ToBoolean(c.Attribute("IsThumbnailImage").Value));

                            int?thumbImageIdx = null;
                            if (thumbnailImage != null)
                            {
                                thumbImageIdx = sequencedImages.IndexOf(thumbnailImage);
                            }

                            for (int idx = 0; idx < sequencedImages.Count; idx++)
                            {
                                var image    = sequencedImages[idx];
                                int position = Convert.ToInt32(image.Attribute("Sequence").Value) + 1;

                                int storeid = 0;

                                // this catches the changes in webservice structure
                                var sourceUri = (image.Attribute("Url") != null) ? new Uri(image.Attribute("Url").Value) : new Uri(image.Value);
                                var label     = image.Attribute("Description") != null ? image.Attribute("Description").Value : string.Empty;

                                string fileName  = sourceUri.Segments.Last();
                                string linuxPath = String.Format(@"/{0}/{1}/{2}", fileName.Substring(0, 1),
                                                                 fileName.Substring(1, 1),
                                                                 fileName.Replace(" ", ""));

#if DEBUG
                                //sourceUri = new Uri(sourceUri.AbsoluteUri.Replace("localhost", "10.172.26.1"));
                                sourceUri = new Uri(sourceUri.AbsoluteUri.Replace("localhost", "172.16.250.94"));
#endif

                                string path = DownloadImage(sourceUri, client, ftpInfo.FtpPath, Logger);

                                if (path != null)
                                {
                                    helper.AddImageToGallery(entity.entity_id, storeid, path, position, label, Logger);

                                    if (idx == 0)
                                    {
                                        helper.SyncAttributeValue(attributeList["image"].attribute_id, PRODUCT_ENTITY_TYPE_ID, 0, entity.entity_id, path);
                                        helper.SyncAttributeValue(attributeList["small_image"].attribute_id, PRODUCT_ENTITY_TYPE_ID, 0, entity.entity_id, path);
                                        helper.SyncAttributeValue(attributeList["image_label"].attribute_id, PRODUCT_ENTITY_TYPE_ID, 0, entity.entity_id, label);
                                    }
                                    if (thumbImageIdx.HasValue && thumbImageIdx.Value == idx)
                                    {
                                        helper.SyncAttributeValue(attributeList["thumbnail"].attribute_id, PRODUCT_ENTITY_TYPE_ID, 0, entity.entity_id, path);
                                    }
                                    currentPaths.Add(path);
                                }
                            }

                            var currentImages = helper.GetGalleryItems(entity);

                            CleanupGallery(helper, entity, currentImages, currentPaths, client, ftpInfo.FtpPath);


                            Interlocked.Increment(ref totalProcessed);
                            //Logger.DebugFormat("Connections : {0}", ftp.ConnectionOpen);
                            //Logger.DebugFormat("Processed {0}", totalProcessed);
                            if (totalProcessed % 100 == 0)
                            {
                                Logger.DebugFormat(String.Format("Processed {0} of {1} products", totalProcessed, totalRecords));
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    Logger.Error("Image uploader error ", e);
                }
            });



            Logger.DebugFormat("Finished exporting images for language '{0}'", CurrentLanguage.Language.Name);
        }
        protected override List <Models.VendorStockCollectionModel> GetStock()
        {
            List <Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorImportStock> result = new List <Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorImportStock>();
            var pluginConfig = GetConfiguration();

            _vendorIDs = GetConfiguration().AppSettings.Settings["ATPFAStockImportVendorIDs"].Value.Split(',').Select(int.Parse).ToList();

            string connectionString = string.Empty;


            var dsnNameSetting = GetConfiguration().AppSettings.Settings["ATPFADSN"];

            dsnNameSetting.ThrowIfNull("AT DSN Must be specified");

            connectionString = string.Format("DSN={0};PWD=progress", dsnNameSetting.Value);

            AtPFARepository repository       = new AtPFARepository(connectionString, log);
            var             assortmentHelper = new AssortmentHelper();

            var validProducts = repository.GetValidItemColors();

            log.Info("Found products in total " + validProducts.Count);

            int counter = 0;

            using (var unit = GetUnitOfWork())
            {
                foreach (var validItem in validProducts)
                {
                    var itemNumber = validItem.Key;
                    counter++;

                    foreach (var color in validItem.Value)
                    {
                        var customItemNumber = string.Format("{0} {1}", itemNumber, color).Trim();

                        result.Add(GetVendorStock(customItemNumber, 0, CCStockType.Webshop));
                        result.Add(GetVendorStock(customItemNumber, 0, CCStockType.Wehkamp));


                        bool noSkus   = false;
                        int  skuCount = 0;
                        foreach (var sku in repository.GetValidSkus(itemNumber, color))
                        {
                            int stock        = repository.GetSkuStock(itemNumber, sku.SizeCode, color, 801);
                            int stockWehkamp = repository.GetSkuStock(itemNumber, sku.SizeCode, color, 803);

                            var skuNew = string.Format("{0} {1} {2}", itemNumber, color, sku.SizeCode);

                            if (customItemNumber.StartsWith("7")) //food items
                            {
                                stock = 1;
                            }

                            result.Add(new Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorImportStock()
                            {
                                CustomItemNumber = skuNew,
                                QuantityOnHand   = stock,
                                StockType        = "Webshop",
                                StockStatus      = stock > 0 ? "ENA" : "NoStock"
                            });

                            result.Add(new Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorImportStock()
                            {
                                CustomItemNumber = skuNew,
                                QuantityOnHand   = stockWehkamp,
                                StockType        = "Wehkamp",
                                StockStatus      = stock > 0 ? "ENA" : "NoStock"
                            });
                        }
                    }
                }
            }


            List <VendorStockCollectionModel> groupedResult = new List <VendorStockCollectionModel>();

            //for the regular vendors add all stock locations without Wehkamp
            foreach (var vendor in _vendorIDs)
            {
                groupedResult.Add(new VendorStockCollectionModel()
                {
                    VendorID        = vendor,
                    DefaultVendorID = 2,
                    StockCollection = result.Where(c => c.StockType != CCStockType.Wehkamp.ToString()).ToList()
                });
            }

            var wehkampStockCollection = result.Where(c => c.StockType == CCStockType.Wehkamp.ToString()).ToList();

            //For vendor Wehkamp, add the stock the webshop location for exporting


            var wehkampWebshopStockCollection = (from r in wehkampStockCollection
                                                 select new Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorImportStock()
            {
                CustomItemNumber = r.CustomItemNumber,
                QuantityOnHand = r.QuantityOnHand,
                StockType = CCStockType.Webshop.ToString(),
                StockStatus = r.QuantityOnHand > 0 ? "ENA" : "NoStock"
            }).ToList();

            wehkampStockCollection.AddRange(wehkampWebshopStockCollection);

            //wehkamp
            groupedResult.Add(new VendorStockCollectionModel()
            {
                VendorID        = _wehkampVendorID,
                DefaultVendorID = 2,
                StockCollection = wehkampStockCollection
            });

            return(groupedResult);
        }
        protected override List <VendorStockCollectionModel> GetStock()
        {
            List <Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorImportStock> result = new List <Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorImportStock>();
            var pluginConfig = GetConfiguration();

            var connectionString      = VendorHelper.GetConnectionStringForPFA(1);//todo vendorid
            var stockConnectionString = PFAConnectionHelper.GetCoolcatPFAVrdsConnection(pluginConfig);

            CoolcatPFARepository repository         = new CoolcatPFARepository(connectionString, stockConnectionString, log);
            AssortmentHelper     helper             = new AssortmentHelper();
            XDocument            seasonCodeRulesDoc = null;
            DateTime?            datcolTimeStamp    = null;

            bool datcolSuccessful = true;

            //if the vrds was not process, exit
            if (!IsVrdsValid(repository))
            {
                return(null);
            }

            using (var unit = GetUnitOfWork())
            {
                seasonCodeRulesDoc = GetCategoryStockBlacklist(unit);
                datcolSuccessful   = WasDatcolRunSuccessful(unit);


                var currentStockDate = helper.GetCurrentStockDate();
                var stockCM          = repository.GetCMStock(currentStockDate);
                var stockTransfer    = repository.GetTransferStock(currentStockDate);
                var stockWms         = repository.GetWmsStock(currentStockDate);
                var validArtCodes    = repository.GetValidItemNumbers();
                var stockWehkamp     = repository.GetWehkampStock(currentStockDate);
                var countryCode      = VendorHelper.GetCountryCode(1);
                log.Info(string.Format("About to process the stock of {0} artikels", validArtCodes.Count));
                int counter = 0;

                foreach (var itemNumber in validArtCodes)
                {
                    counter++;
                    if (counter % 100 == 0)
                    {
                        log.Info(string.Format("Processed {0} products", counter));
                    }
                    var productInfo = repository.GetGeneralProductInformation(itemNumber, countryCode);

                    bool loadCMStock = true;

                    if (seasonCodeRulesDoc != null)
                    {
                        if (IsGroupFiltered(itemNumber, productInfo.SeasonCode, seasonCodeRulesDoc))
                        {
                            loadCMStock = false;
                        }
                    }

                    var artikelStockCM = (from p in stockCM
                                          where p.ItemNumber.ToLower() == itemNumber.ToLower()
                                          select p).ToList();

                    var artikelStockWMS = (from p in stockWms
                                           where p.ItemNumber.ToLower() == itemNumber.ToLower()
                                           select p).ToList();

                    var artikelStockWehkamp = (from p in stockWehkamp
                                               where p.ItemNumber.ToLower() == itemNumber.ToLower()
                                               select p).ToList();

                    var artikelStockTransfer = (from p in stockTransfer
                                                where p.ItemNumber.ToLower() == itemNumber.ToLower()
                                                select p).ToList();

                    result.Add(GetVendorStock(itemNumber, 0, CCStockType.Webshop));
                    result.Add(GetVendorStock(itemNumber, 0, CCStockType.CM));
                    result.Add(GetVendorStock(itemNumber, 0, CCStockType.Transfer));
                    result.Add(GetVendorStock(itemNumber, 0, CCStockType.Wehkamp));
                    result.Add(GetVendorStock(itemNumber, 0, CCStockType.Filiaal890));

                    var validSkus = repository.GetValidSkus(itemNumber);

                    foreach (var color in validSkus.GroupBy(c => c.ColorCode))
                    {
                        string colorLevel = string.Format("{0} {1}", itemNumber, color.Key);

                        result.Add(GetVendorStock(colorLevel, 0, CCStockType.Webshop));
                        result.Add(GetVendorStock(colorLevel, 0, CCStockType.CM));
                        result.Add(GetVendorStock(colorLevel, 0, CCStockType.Transfer));
                        result.Add(GetVendorStock(colorLevel, 0, CCStockType.Wehkamp));
                        result.Add(GetVendorStock(colorLevel, 0, CCStockType.Filiaal890));
                    }

                    foreach (var sku in validSkus)
                    {
                        string skuNew = string.Empty;
                        if (itemNumber == PfaCoolcatConfiguration.Current.ShipmentCostsProduct || itemNumber == PfaCoolcatConfiguration.Current.ReturnCostsProduct ||
                            itemNumber == PfaCoolcatConfiguration.Current.KialaShipmentCostsProduct || itemNumber == PfaCoolcatConfiguration.Current.KialaReturnCostsProduct)
                        {
                            skuNew = itemNumber;
                        }
                        else
                        {
                            skuNew = string.Format("{0} {1} {2}", itemNumber, sku.ColorCode, sku.SizeCode);
                        }

                        int webshopStock  = 0;
                        int ceyenneStock  = 0;
                        int transferStock = 0;
                        int wmsStock      = 0;
                        int wehkampStock  = 0;

                        transferStock = GetSkuStockResult(artikelStockTransfer, sku).Try(c => c.Quantity, 0);
                        ceyenneStock  = (int)(0.5 * GetSkuStockResult(artikelStockCM, sku).Try(c => c.Quantity, 0));
                        wehkampStock  = GetSkuStockResult(artikelStockWehkamp, sku).Try(c => c.Quantity, 0);

                        if (ceyenneStock < 30)
                        {
                            ceyenneStock = 0;
                        }

                        wmsStock = GetSkuStockResult(artikelStockWMS, sku).Try(c => c.Quantity, 0);

                        if (!datcolSuccessful)
                        {
                            //What do we do with the vendorid here?
                            var w = unit.Scope.Repository <VendorStock>().GetAllAsQueryable(c => c.VendorID == 1 && c.VendorStockTypeID == 3 && c.Product.VendorItemNumber == skuNew).FirstOrDefault();

                            wmsStock = 0;
                            if (w != null)
                            {
                                wmsStock = w.QuantityOnHand;
                            }
                        }

                        webshopStock = ceyenneStock + wmsStock + transferStock;

                        if (!loadCMStock)
                        {
                            webshopStock = webshopStock - ceyenneStock;
                            ceyenneStock = 0;
                        }

                        result.Add(GetVendorStock(skuNew, webshopStock, CCStockType.Webshop));
                        result.Add(GetVendorStock(skuNew, ceyenneStock, CCStockType.CM));
                        result.Add(GetVendorStock(skuNew, transferStock, CCStockType.Transfer));
                        result.Add(GetVendorStock(skuNew, wehkampStock, CCStockType.Wehkamp));

                        if (datcolSuccessful)
                        {
                            result.Add(GetVendorStock(skuNew, wmsStock, CCStockType.Filiaal890));
                        }
                    }
                }
            }

            List <VendorStockCollectionModel> groupedResult = new List <VendorStockCollectionModel>();

            //for the regular vendors add all stock locations without Wehkamp
            foreach (var vendor in _vendorIDs)
            {
                groupedResult.Add(new VendorStockCollectionModel()
                {
                    VendorID        = vendor,
                    DefaultVendorID = 1,
                    StockCollection = result.Where(c => c.StockType != CCStockType.Wehkamp.ToString()).ToList()
                });
            }


            var wehkampStockCollection = result.Where(c => c.StockType == CCStockType.Wehkamp.ToString()).ToList();

            //For vendor Wehkamp, add the stock the webshop location for exporting
            wehkampStockCollection.AddRange((from r in wehkampStockCollection
                                             select GetVendorStock(r.CustomItemNumber, r.QuantityOnHand, CCStockType.Webshop)).ToList());

            //wehkamp
            groupedResult.Add(new VendorStockCollectionModel()
            {
                VendorID        = _wehkampVendorID,
                DefaultVendorID = 1,
                StockCollection = wehkampStockCollection
            });

            return(groupedResult);
        }
Beispiel #27
0
        protected override void Process()
        {
            try
            {
                CurrentLanguage = PrimaryLanguage;

                var assortmentService = new AssortmentService();

#if CACHE
                if (File.Exists(String.Format(ImagesCacheFile, Connector.ConnectorID, PrimaryLanguage.LanguageID)))
                {
                    ImagesXml = XDocument.Load(String.Format(ImagesCacheFile, Connector.ConnectorID, PrimaryLanguage.LanguageID));
                }
                else
                {
                    ImagesXml = XDocument.Parse(assortmentService.GetAssortmentImages(Connector.ConnectorID));
                    ImagesXml.Save(String.Format(ImagesCacheFile, Connector.ConnectorID, PrimaryLanguage.LanguageID));
                }
#else
                ImagesXml = XDocument.Parse(assortmentService.GetAssortmentImages(Connector.ConnectorID));
#endif

                if (ImagesXml.Root.Element("Error") != null)
                {
                    Logger.Debug(ImagesXml);
                    throw new Exception("Web service failed call failed.");
                }

                //for debugging purposes
                var debugDirectoryPath = Path.Combine(_serializationPath, "Archive");
                var debugFilePath      = Path.Combine(debugDirectoryPath, string.Format(@"image_{0}_{1}.xml", Connector.ConnectorID, DateTime.Now.ToString("dd-MM-yyyy_hhmm")));
                try
                {
                    if (!Directory.Exists(debugDirectoryPath))
                    {
                        Directory.CreateDirectory(debugDirectoryPath);
                    }

                    ImagesXml.Save(debugFilePath);
                }
                catch (Exception e)
                {
                    Logger.Error("Archiving the xml failed in path " + debugFilePath, e);
                }

                var serializationPath = Path.Combine(_serializationPath, Connector.ConnectorID.ToString());
                if (!Directory.Exists(serializationPath))
                {
                    Directory.CreateDirectory(serializationPath);
                }

                ImageDiffComparisonHelper comparison = new ImageDiffComparisonHelper(ImagesXml, serializationPath);

                Logger.DebugFormat("Exporting images for language '{0}'", CurrentLanguage.Language.Name);

                var currentProducts = default(SortedDictionary <String, catalog_product_entity>);
                var attributeList   = default(SortedDictionary <String, eav_attribute>);

                using (var helper = new MagentoMySqlHelper(Connector.Connection))
                {
                    attributeList   = helper.GetAttributeList(PRODUCT_ENTITY_TYPE_ID);
                    currentProducts = helper.GetSkuList();
                }

                var products = comparison.ProductsToProcess
                               .Where(element => element.Attribute("ManufacturerID") != null)
                               .OrderByDescending(element => element.AttributeValue("ProductID", 0))
                               .GroupBy(element => element.AttributeValue("ManufacturerID"))
                               .ToArray();

                var directoryStructureRecords = (
                    from i in ImagesXml.Root.Elements("Products").Elements("ProductMedia")
                    let urlAttribute = i.Attribute("Url")
                                       let uri = (urlAttribute != null)
            ? new Uri(urlAttribute.Value)
            : new Uri(i.Value)
                                                 select new
                {
                    FirstLevel = uri.Segments.Last().Substring(0, 1),
                    SecondLevel = uri.Segments.Last().Substring(1, 1)
                })
                                                .GroupBy(x => x.FirstLevel)
                                                .ToDictionary(x => x.Key, y => y.Select(z => z.SecondLevel).Distinct());

                var mediaExchangeProvider = GetMediaExchangeProvider();

                int totalImages    = products.Select(element => element.Count()).Sum();
                int totalRecords   = products.Length;
                int totalProcessed = 0;

                if (totalRecords == 0)
                {
                    Logger.DebugFormat("Finished exporting images for language '{0}'", CurrentLanguage.Language.Name);
                    return;
                }

                var options = new ParallelOptions()
                {
                    MaxDegreeOfParallelism = 8
                };

                var basePath = Connector.ConnectorSettings.GetValueByKey <string>("FtpPath", string.Empty);
                if (basePath.EndsWith("/"))
                {
                    basePath = basePath.TrimEnd('/');
                }


                Parallel.For(0, totalRecords, options, index =>
                {
                    using (var helper = new AssortmentHelper(Connector.Connection, Version))
                    {
                        var product = products[index];
                        var sku     = product.Key.Trim();
                        var entity  = default(catalog_product_entity);

                        try
                        {
                            if (currentProducts.TryGetValue(sku, out entity))
                            {
                                var currentPathList = new List <String>();

                                var sequencedImages = product.OrderBy(x => x.AttributeValue("Sequence", 0)).ToList();
                                var thumbnailImage  = sequencedImages.FirstOrDefault(c => c.AttributeValue("IsThumbnailImage", false));

                                int?thumbImageIndex = null;

                                if (thumbnailImage != null)
                                {
                                    thumbImageIndex = sequencedImages.IndexOf(thumbnailImage);
                                }

                                for (var imageIndex = 0; imageIndex < sequencedImages.Count; imageIndex++)
                                {
                                    var storeID   = 0;
                                    var image     = sequencedImages[imageIndex];
                                    var position  = image.AttributeValue("Sequence", 0) + 1;
                                    var sourceUri = new Uri(image.AttributeValue("Url", image.Value));
                                    var label     = image.AttributeValue("Description", String.Empty);

                                    var fileName = HttpUtility.UrlDecode(sourceUri.Segments.Last());

                                    fileName = fileName.Replace(" ", "");

                                    var remotePath = String.Format(@"/{0}/{1}/{2}"
                                                                   , fileName.Substring(0, 1)
                                                                   , fileName.Substring(1, 1)
                                                                   , fileName.Replace(" ", String.Empty));


                                    var path = basePath + remotePath;

                                    //#if DEBUG
                                    //                  //sourceUri = new Uri(sourceUri.AbsoluteUri.Replace("localhost", "10.172.26.1"));
                                    //                  sourceUri = new Uri(sourceUri.AbsoluteUri.Replace("localhost", "54.72.108.185"));
                                    //#endif

                                    using (WebClient dlClient = new WebClient())
                                    {
                                        using (var stream = new MemoryStream(dlClient.DownloadData(sourceUri)))
                                        {
                                            mediaExchangeProvider.Upload(stream, path);
                                        }
                                    }

                                    if (remotePath != null)
                                    {
                                        helper.AddImageToGallery(entity.entity_id, storeID, remotePath, position, label, Logger);

                                        if (imageIndex == 0)
                                        {
                                            helper.SyncAttributeValue(attributeList["image"].attribute_id, PRODUCT_ENTITY_TYPE_ID, 0, entity.entity_id, remotePath);
                                            helper.SyncAttributeValue(attributeList["small_image"].attribute_id, PRODUCT_ENTITY_TYPE_ID, 0, entity.entity_id, remotePath);
                                            helper.SyncAttributeValue(attributeList["image_label"].attribute_id, PRODUCT_ENTITY_TYPE_ID, 0, entity.entity_id, label);
                                        }

                                        if (thumbImageIndex.HasValue && thumbImageIndex.Value == imageIndex)
                                        {
                                            helper.SyncAttributeValue(attributeList["thumbnail"].attribute_id, PRODUCT_ENTITY_TYPE_ID, 0, entity.entity_id, remotePath);
                                        }

                                        currentPathList.Add(remotePath);
                                    }
                                }

                                var mediaGalleryItems = helper
                                                        .GetGalleryItems(entity)
                                                        .Where(mediaGalleryItem => !currentPathList.Contains(mediaGalleryItem.value))
                                                        .ToArray();

                                foreach (var file in mediaGalleryItems.Select(mediaGalleryItem => basePath + mediaGalleryItem.value))
                                {
                                    try
                                    {
                                        mediaExchangeProvider.Delete(file);
                                    }
                                    catch
                                    {
                                    }
                                }

                                helper.DeleteGalleryItems(mediaGalleryItems);

                                Interlocked.Increment(ref totalProcessed);

                                if (totalProcessed % 100 == 0)
                                {
                                    Logger.DebugFormat(String.Format("Processed {0} of {1} products", totalProcessed, totalRecords));
                                }
                                helper.SetProductLastModificationTime(entity.entity_id);
                            }
                            else
                            {
                                comparison.MarkProductAsNotProcessed(product.ToList());
                            }
                        }
                        catch (Exception e)
                        {
                            Logger.Error(string.Format("Image uploader error for sku {0}", sku), e);

                            comparison.MarkProductAsNotProcessed(product.ToList());
                        }
                    }
                });

                Logger.DebugFormat("Finished exporting images for language '{0}'", CurrentLanguage.Language.Name);
                comparison.ArchiveImages();

                mediaExchangeProvider.Dispose();
            }
            catch (Exception e)
            {
                Logger.Error("Image exporter failed", e);
                throw e;
            }
        }
        private void ProcessProduct(AssortmentHelper helper, AssortmentStockPriceProduct product,
                                    SortedDictionary <string, catalog_product_entity> skuList,
                                    SortedDictionary <string, eav_attribute> attributeList,
                                    Dictionary <string, int> stockStoreList,
                                    IEnumerable <AssortmentRetailStock> productRetailStock
                                    )
        {
            string sku                 = product.ManufacturerID;
            int    productID           = product.ProductID;
            string customProductId     = product.CustomProductID;
            bool   isNonAssortmentItem = (product.IsNonAssortmentItem);
            bool   isConfigurable      = (product.IsConfigurable);
            bool   childrenOnStock     = false;
            string type                = isConfigurable ? "configurable" : "simple";

            catalog_product_entity entity = null;

            skuList.TryGetValue(sku, out entity);

            if (entity == null)
            {
                return;
            }

            if (isConfigurable && ConfigurableProducts.ContainsKey(productID))
            {
                var children = ConfigurableProducts[productID];

                childrenOnStock = (children.Any(x => x.Stock != null && x.Stock.InStock > 0));
            }

            int storeid = 0;

            if (MultiLanguage && !IsPrimaryLanguage)
            {
                storeid = StoreList[CurrentStoreCode].store_id;
            }

            int productStatus = (int)PRODUCT_STATUS.ENABLED;

            #region Stock

            if (IsPrimaryLanguage)
            {
                int?     quantityOnHand       = null;
                int?     quantityToReceive    = null;
                string   stockStatus          = "S";
                DateTime?promisedDeliveryDate = null;
                var      stockElement         = product.Stock;

                if (stockElement != null)
                {
                    int tmp;

                    quantityOnHand    = stockElement.InStock;
                    quantityToReceive = stockElement.QuantityToReceive;
                    stockStatus       = stockElement.StockStatus.Trim();

                    DateTime dt;
                    if (stockElement.PromisedDeliveryDate.HasValue)
                    {
                        promisedDeliveryDate = stockElement.PromisedDeliveryDate.Value;
                    }
                }

                if (productRetailStock != null)
                {
                    if (productRetailStock.Count() > 0)
                    {
                        foreach (var s in stockStoreList)
                        {
                            var store_record = productRetailStock.FirstOrDefault(x => x.VendorCode == s.Key);
                            int qty          = (store_record != null) ? store_record.InStock : 0;

                            helper.SyncStoreStock(sku, s.Value, qty);
                        }
                    }
                    else
                    {
                        helper.ClearStoreStock(sku);
                        //no stores left with stock, clear all
                    }
                }

                if (RequiresStockUpdate)
                {
                    helper.SyncAttributeValue(attributeList["quantity_to_receive"].attribute_id, PRODUCT_ENTITY_TYPE_ID, 0, entity.entity_id, quantityToReceive ?? 0, "int");
                    helper.SyncAttributeValue(attributeList["promised_delivery_date"].attribute_id, PRODUCT_ENTITY_TYPE_ID, 0, entity.entity_id, promisedDeliveryDate, "datetime");
                    helper.SyncAttributeValue(attributeList["stock_status"].attribute_id, PRODUCT_ENTITY_TYPE_ID, 0, entity.entity_id, stockStatus, "varchar");

                    helper.SyncWebsiteProduct(StoreList[CurrentStoreCode].website_id, entity.entity_id);

                    bool is_in_stock = quantityOnHand > 0 || (promisedDeliveryDate.HasValue && quantityToReceive > 0) || (productRetailStock != null && productRetailStock.Count() > 0) ||
                                       (!String.IsNullOrEmpty(stockStatus) && stockStatus != "O");

                    if (isConfigurable)
                    {
                        if (childrenOnStock)
                        {
                            is_in_stock = true;
                        }
                        else
                        {
                            is_in_stock = false;
                        }
                    }

                    helper.SyncStock(new cataloginventory_stock_item()
                    {
                        product_id  = entity.entity_id,
                        qty         = quantityOnHand ?? 0,
                        is_in_stock = is_in_stock
                    });

                    if (!is_in_stock)
                    {
                        productStatus = (int)PRODUCT_STATUS.DISABLED;
                    }

                    SetProductStatus(entity.entity_id, productStatus, helper, attributeList, 0);
                }
            }

            SetProductStatus(entity.entity_id, productStatus, helper, attributeList, StoreList[CurrentStoreCode].store_id);
            #endregion

            #region Price
            decimal?price            = null;
            decimal?specialPrice     = null;
            string  commercialStatus = "O";

            int visibility = 4; //catalog, search
            if (isNonAssortmentItem || (UsesConfigurableProducts && SimpleProducts.Contains(productID)) || !product.Visible)
            {
                visibility = 1; // not visible individually
            }

            ExtractPrice(product, ref price, ref specialPrice, ref commercialStatus);

            helper.SyncAttributeValue(attributeList["visibility"].attribute_id, PRODUCT_ENTITY_TYPE_ID, StoreList[CurrentStoreCode].store_id, entity.entity_id, visibility, "int");
            helper.SyncAttributeValue(attributeList["price"].attribute_id, PRODUCT_ENTITY_TYPE_ID, StoreList[CurrentStoreCode].store_id, entity.entity_id, price, "decimal");

            if (IsPrimaryLanguage)
            {
                helper.SyncAttributeValue(attributeList["visibility"].attribute_id, PRODUCT_ENTITY_TYPE_ID, 0, entity.entity_id, visibility, "int");
                helper.SyncAttributeValue(attributeList["price"].attribute_id, PRODUCT_ENTITY_TYPE_ID, 0, entity.entity_id, price, "decimal");
            }

            helper.SyncAttributeValue(attributeList["special_price"].attribute_id, PRODUCT_ENTITY_TYPE_ID, 0, entity.entity_id, null, "decimal");

            if ((specialPrice ?? 0) > 0)
            {
                helper.SyncAttributeValue(attributeList["special_price"].attribute_id, PRODUCT_ENTITY_TYPE_ID, StoreList[CurrentStoreCode].store_id, entity.entity_id, specialPrice, "decimal");
                if (Connector.ConnectorID == 11)
                {
                    helper.SyncAttributeValue(attributeList["special_price"].attribute_id, PRODUCT_ENTITY_TYPE_ID, 0, entity.entity_id, specialPrice, "decimal");
                }
            }
            else
            {
                helper.DeleteAttributeValue(attributeList["special_price"].attribute_id, PRODUCT_ENTITY_TYPE_ID, StoreList[CurrentStoreCode].store_id, entity.entity_id, "decimal");
            }
            #endregion
        }
        private void SyncProducts()
        {
            bool doRetailStock = ((ConnectorSystemType)Connector.ConnectorType).Has(ConnectorSystemType.ExportRetailStock);

            XDocument retailStock = null;
            Dictionary <int, List <AssortmentRetailStock> > retailStockList = new Dictionary <int, List <AssortmentRetailStock> >();

            if (IsPrimaryLanguage && doRetailStock)
            {
                retailStockList = (from r in Assortment
                                   select new
                {
                    product_id = r.ProductID,
                    store_records = r.RetailStock
                }).Distinct().ToDictionary(x => x.product_id, y => y.store_records);
            }

            Dictionary <string, int> stockStoreList = new Dictionary <string, int>();

            if (doRetailStock)
            {
                using (var helper = new AssortmentHelper(Connector.Connection, Version))
                {
                    stockStoreList = helper.GetStockStoreList();
                }
            }

            var productsSource = (from p in Assortment
                                  select p);

            List <AssortmentStockPriceProduct> products = productsSource.Where(x => !x.IsConfigurable).ToList();

            ProcessProductCollection(retailStockList, stockStoreList, products);

            using (var helper = new AssortmentHelper(Connector.Connection, Version))
            {
                var skuList      = helper.GetSkuList();
                var skuInXmlList = (from p in productsSource
                                    select p.ManufacturerID).ToList();

                var toDeactivate = skuList.Where(x => !skuInXmlList.Contains(x.Key));

                //exclude shipping costs
                toDeactivate = toDeactivate.Where(x => !x.Key.StartsWith("ShippingCostProductID_"));

                if (toDeactivate.Count() > 0)
                {
                    SortedDictionary <string, eav_attribute> attributeList = helper.GetAttributeList(PRODUCT_ENTITY_TYPE_ID);

                    foreach (var p in toDeactivate)
                    {
                        SetProductStatus(p.Value.entity_id, (int)PRODUCT_STATUS.DISABLED, helper, attributeList, StoreList[CurrentStoreCode].store_id);

                        if (RequiresStockUpdate)
                        {
                            helper.SyncStock(new cataloginventory_stock_item()
                            {
                                product_id  = p.Value.entity_id,
                                qty         = 0,
                                is_in_stock = false
                            });
                        }
                    }
                }
            }
        }
Beispiel #30
0
        protected void SyncRequiredCatalogAttributes()
        {
            using (var helper = new AssortmentHelper(Connector.Connection, Version))
            {
                var attributes = helper.GetAttributeList(CATEGORY_ENTITY_TYPE_ID);

                eav_attribute att = null;
                attributes.TryGetValue("icecat_cat_id", out att);
                if (att == null)
                {
                    att = helper.CreateAttribute("icecat_cat_id", CATEGORY_ENTITY_TYPE_ID, "icecat_cat_id", "int", is_required: true);
                }
                else
                {
                    att.is_required     = false;
                    att.is_user_defined = false;
                }

                helper.SyncAttribute(att, addToDefaultSet: true);

                attributes = helper.GetAttributeList(PRODUCT_ENTITY_TYPE_ID);
                if (!attributes.TryGetValue("concentrator_product_id", out att))
                {
                    att = helper.CreateAttribute("concentrator_product_id", PRODUCT_ENTITY_TYPE_ID, "concentrator_product_id", "int", is_visible: false);
                }
                else
                {
                    att.frontend_label          = "Concentrator ID";
                    att.is_required             = false;
                    att.is_user_defined         = false;
                    att.used_in_product_listing = true;
                }

                helper.SyncAttribute(att, addToDefaultSet: true);

                if (!attributes.TryGetValue("barcode", out att))
                {
                    att = helper.CreateAttribute("barcode", PRODUCT_ENTITY_TYPE_ID, "barcode", "varchar");
                }
                else
                {
                    att.frontend_label  = "Barcode";
                    att.is_required     = false;
                    att.is_user_defined = false;
                    att.is_searchable   = true;
                }
                helper.SyncAttribute(att, addToDefaultSet: true);

                if (!attributes.TryGetValue("stock_status", out att))
                {
                    att = helper.CreateAttribute("stock_status", PRODUCT_ENTITY_TYPE_ID, "stock_status", "varchar", is_visible: false);
                }
                else
                {
                    att.frontend_label  = "Stock Status";
                    att.is_required     = false;
                    att.is_user_defined = false;
                }
                helper.SyncAttribute(att, addToDefaultSet: true);



                if (!attributes.TryGetValue("quantity_to_receive", out att))
                {
                    att = helper.CreateAttribute("quantity_to_receive", PRODUCT_ENTITY_TYPE_ID, "quantity_to_receive", "int", is_visible: false);
                }
                else
                {
                    att.frontend_label  = "Quantity on PO";
                    att.is_required     = false;
                    att.is_user_defined = false;
                }
                helper.SyncAttribute(att, addToDefaultSet: true);

                if (!attributes.TryGetValue("promised_delivery_date", out att))
                {
                    att = helper.CreateAttribute("promised_delivery_date", PRODUCT_ENTITY_TYPE_ID, "promised_delivery_date", "date", is_visible: true, used_in_product_listing: true);
                }
                else
                {
                    att.frontend_label          = "Promised Delivery Date";
                    att.frontend_input          = "date";
                    att.is_required             = false;
                    att.is_user_defined         = false;
                    att.is_visible              = false;
                    att.used_in_product_listing = true;
                }
                helper.SyncAttribute(att, addToDefaultSet: true);

                if (!attributes.TryGetValue("custom_item_number", out att))
                {
                    att = helper.CreateAttribute("custom_item_number", PRODUCT_ENTITY_TYPE_ID, "custom_item_number", "varchar", is_visible: true, used_in_product_listing: true, is_searchable: true);
                }
                else
                {
                    att.frontend_label          = "Custom Item Number";
                    att.is_required             = false;
                    att.is_user_defined         = false;
                    att.is_visible              = false;
                    att.used_in_product_listing = false;
                    att.is_searchable           = true;
                }
                helper.SyncAttribute(att, addToDefaultSet: true);

                if (!attributes.TryGetValue("commercial_status", out att))
                {
                    att = helper.CreateAttribute("commercial_status", PRODUCT_ENTITY_TYPE_ID, "commercial_status", "varchar", is_visible: true, used_in_product_listing: true);
                }
                else
                {
                    att.frontend_label          = "Commercial Status";
                    att.is_required             = false;
                    att.is_user_defined         = false;
                    att.is_visible              = false;
                    att.used_in_product_listing = true;
                }
                helper.SyncAttribute(att, addToDefaultSet: true);
            }
        }