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 }); } } } } }
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"); }
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"); }
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"); }
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"); }
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); }
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); }
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"); }
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"); }
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); } }
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"); }
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)); } } } }); }
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"); }
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() ); }
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 }); } } } } }
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); }
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); }
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 }); } } } } }
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); } }