Beispiel #1
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 #2
0
        private Boolean ProcessPricatLines(Vendor vendor, IEnumerable <PricatLine> pricatLines)
        {
            var noneMappableSizes = pricatLines
                                    .Select(pricatLine => new
            {
                BrandCode = pricatLine.Brand,
                ModelName = pricatLine.Model,
                GroupCode = pricatLine.ArticleGroupCode,
                Size      = pricatLine.SizeSupplier
            })
                                    .Distinct()
                                    .Where(item => TranslateSize(item.BrandCode, item.ModelName, item.GroupCode, item.Size) == null)
                                    .ToArray();

            if (noneMappableSizes.Any())
            {
                foreach (var noneMappableSize in noneMappableSizes)
                {
                    TraceWarning("The combination Brand: '{0}', Model: '{1}' (or empty), Group: '{2}' (or empty), Size: '{3}' does not exists."
                                 , noneMappableSize.BrandCode
                                 , noneMappableSize.ModelName
                                 , noneMappableSize.GroupCode
                                 , noneMappableSize.Size);
                }

                return(false);
            }

            var noneMappableColors = pricatLines
                                     .Select(pricatLine => pricatLine.ColorCode)
                                     .Distinct()
                                     .Where(colorCode => !PricatColorMapping.ContainsKey(colorCode))
                                     .ToArray();

            if (noneMappableColors.Any())
            {
                foreach (var noneMappableColor in noneMappableColors)
                {
                    TraceWarning("The color code '{0}' is not mapped to color filter.", noneMappableColor);
                }

                return(false);
            }

            var existBarcodes = (
                from pricat in pricatLines
                join currentBarcode in Unit.Scope.Repository <ProductBarcode>().GetAll()
                on pricat.ArticleID equals currentBarcode.Barcode
                where String.Join(" ", pricat.SupplierCode
                                  , pricat.ColorCode
                                  ,
                                  _pricatLineProcessor.TranslateSize(PricatSizes, pricat.Brand, pricat.Model, pricat.ArticleGroupCode, pricat.SizeSupplier)
                                  .Trim()) != currentBarcode.Product.VendorItemNumber
                select new
            {
                pricatBarcode = pricat.ArticleID,
                pricatSku = String.Join(" ", pricat.SupplierCode
                                        , pricat.ColorCode
                                        ,
                                        _pricatLineProcessor.TranslateSize(PricatSizes, pricat.Brand, pricat.Model, pricat.ArticleGroupCode,
                                                                           pricat.SizeSupplier).Trim())
                ,
                currentSku = currentBarcode.Product.VendorItemNumber
            }
                )
                                .ToArray();

            if (existBarcodes.Any())
            {
                foreach (var item in existBarcodes)
                {
                    TraceWarning(
                        "Error during processing Pricat File, Barcode '{0}' mapped to sku '{1}' in file '{2}' already exists within the Concentrator. It is currently mapped to sku '{3}'"
                        , item.pricatBarcode
                        , item.pricatSku
                        , _currentRemoteFileName
                        , item.currentSku);
                }

                return(false);
            }

            var vendorAssortmentItems = new List <VendorAssortmentBulk.VendorAssortmentItem>();

            foreach (var pricatLineGroup in pricatLines
                     .GroupBy(pricatLine => String.Join(" ", pricatLine.SupplierCode, pricatLine.ColorCode))
                     .Where(pricatLineGroup => pricatLineGroup.Any()))
            {
                var productGroupCode = pricatLineGroup.Select(pricatLine => pricatLine.ArticleGroupCode).First();

                foreach (
                    var vendorAssortmentItem in
                    _pricatLineProcessor.ProcessPricatGroupedLines(Unit, TraceSource, vendor, pricatLineGroup.Key, DefaultLanguage,
                                                                   pricatLineGroup.OrderBy(line => line.Number),
                                                                   ProductAttributes, PricatColorMapping, PricatSizes))
                {
                    vendorAssortmentItems.Add(vendorAssortmentItem);
                }
            }

            TraceVerbose("Bulk importing {0} products...", vendorAssortmentItems.Count);

            try
            {
                var bulkConfig = new VendorAssortmentBulkConfiguration {
                    IsPartialAssortment = true
                };
                using (var vendorAssortmentBulk = new VendorAssortmentBulk(vendorAssortmentItems, vendor.VendorID, DefaultVendor.VendorID, bulkConfig))
                {
                    vendorAssortmentBulk.Init(Unit.Context);
                    vendorAssortmentBulk.Sync(Unit.Context);
                }
            }
            catch (SqlException exception)
            {
                TraceError("Failed to bulk import the products. {0}", exception.Message);

                return(false);
            }
            catch (Exception exception)
            {
                TraceError("Failed to bulk import the products. {0}", exception.Message);

                return(false);
            }

            return(true);
        }
        private Boolean ProcessFile(Stream fileStream)
        {
            using (var document = new ExcelPackage(fileStream))
            {
                var worksheet = document.Workbook.Worksheets.First();

                if (VerifyWorksheet(worksheet))
                {
                    TraceVerbose("Loading existing product vendor assortment data...");

                    var vendorBySkuLookup = Unit.Scope.Repository <VendorAssortment>()
                                            .Include(vendorAssortment => vendorAssortment.Product)
                                            .GetAll(vendorAssortment => vendorAssortment.Product.IsConfigurable)
                                            .ToLookup(vendorAssortment => vendorAssortment.CustomItemNumber, vendorAssortment => vendorAssortment.VendorID);

                    TraceVerbose("Loading product content processors...");

                    var productContentRecordProcessors = GetType()
                                                         .GetNestedTypes(BindingFlags.Instance | BindingFlags.NonPublic)
                                                         .Where(type => type.BaseType == typeof(ProductContentRecordProcessor))
                                                         .Select(processorType => Activator.CreateInstance(processorType, DefaultVendor) as ProductContentRecordProcessor)
                                                         .ToArray();

                    TraceVerbose("Loading product content records...");

                    var productContentRecords      = GetProductContentRecords(worksheet).ToArray();
                    var vendorAssortmentDictionary = new Dictionary <Int32, IList <VendorAssortmentBulk.VendorAssortmentItem> >();
                    var progressStopwatch          = Stopwatch.StartNew();

                    for (var index = 0; index < productContentRecords.Length; index++)
                    {
                        var productContentRecord = productContentRecords[index];
                        var customItemNumber     = String.Format("{0} {1}", productContentRecord[HeaderName].Substring(3), productContentRecord[HeaderColor]);

                        foreach (var vendorID in vendorBySkuLookup[customItemNumber])
                        {
                            var vendorAssortmentItem = new VendorAssortmentBulk.VendorAssortmentItem();

                            foreach (var productContentProcessor in productContentRecordProcessors)
                            {
                                productContentProcessor.CustomItemNumber = customItemNumber;
                                productContentProcessor.LanguageID       = DefaultLanguage.LanguageID;
                                productContentProcessor.VendorAssortment = vendorAssortmentItem;
                                productContentProcessor.VendorID         = vendorID;
                                productContentProcessor.Process(productContentRecord);
                            }

                            if (!vendorAssortmentDictionary.ContainsKey(vendorID))
                            {
                                vendorAssortmentDictionary[vendorID] = new List <VendorAssortmentBulk.VendorAssortmentItem>();
                            }

                            vendorAssortmentDictionary[vendorID].Add(vendorAssortmentItem);
                        }

                        if (progressStopwatch.ElapsedMilliseconds > 1000L || productContentRecords.Length - 1 == index)
                        {
                            TraceVerbose("Progress: {0:P2}", (index + 1D) / productContentRecords.Length);
                            progressStopwatch.Restart();
                        }
                    }

                    foreach (var vendorID in vendorAssortmentDictionary.Keys)
                    {
                        TraceVerbose("Bulk importing vendor '{0}'...", Unit.Scope.Repository <Vendor>().GetSingle(vendor => vendor.VendorID == vendorID).Name);

                        var bulkConfig = new VendorAssortmentBulkConfiguration {
                            IsPartialAssortment = true
                        };

                        using (var vendorAssortmentBulk = new VendorAssortmentBulk(vendorAssortmentDictionary[vendorID], vendorID, vendorID, bulkConfig))
                        {
                            vendorAssortmentBulk.Init(Unit.Context);
                            vendorAssortmentBulk.Sync(Unit.Context);
                        }
                    }

                    return(true);
                }
            }

            return(false);
        }
Beispiel #4
0
        protected override void Process()
        {
            var defaultVendorIDSetting = GetConfiguration().AppSettings.Settings["VendorID"];

            if (defaultVendorIDSetting == null)
            {
                throw new Exception("Setting VendorID is missing");
            }

            DefaultVendorID = Int32.Parse(defaultVendorIDSetting.Value);

            var vendorIdsToProcess = GetConfiguration().AppSettings.Settings["VendorIDs"];

            if (vendorIdsToProcess == null)
            {
                throw new Exception("Setting VendorIDs is missing");
            }

            _vendorIDs = vendorIdsToProcess.Value.Split(',').Select(x => Convert.ToInt32(x)).ToArray();

            var attributes = new List <ProductAttributeMetaData>();

            using (var unit = GetUnitOfWork())
            {
                try
                {
                    InitAttributeMapping();
                    SetupAttributes(unit, _attributeMapping, DefaultVendorID, out attributes);
                }
                catch (Exception e)
                {
                    log.Debug(e.InnerException);
                }

                foreach (var vendorID in _vendorIDs)
                {
                    _configuredAttributes = new Dictionary <string, List <string> >();



                    var repositoryProductTypes = new ProductTypeRepository((IServiceUnitOfWork)unit, DefaultVendorID);
                    var repositoryModels       = new ProductModelRepository((IServiceUnitOfWork)unit, DefaultVendorID);

                    bool useAdvicePrice        = false;
                    var  useAdvicePriceSetting = unit.Scope.Repository <VendorSetting>().GetSingle(c => c.VendorID == vendorID && c.SettingKey == USE_ADVICE_PRICE_FROM_XML_SETTING_KEY);
                    if (useAdvicePriceSetting != null)
                    {
                        bool.TryParse(useAdvicePriceSetting.Value, out useAdvicePrice);
                    }


                    var ReturnCostsVendorItemNumber = unit.Scope.Repository <VendorSetting>().GetSingle(c => c.VendorID == vendorID && c.SettingKey == "ReturnCostsProduct");
                    if (ReturnCostsVendorItemNumber != null)
                    {
                        ReturnVendorItemNumber = ReturnCostsVendorItemNumber.Value;
                    }

                    var ShipmentCostsVendorItemNumber = unit.Scope.Repository <VendorSetting>().GetSingle(c => c.VendorID == vendorID && c.SettingKey == "ShipmentCostsProduct");
                    if (ShipmentCostsVendorItemNumber != null)
                    {
                        ShipmentVendorItemNumber = ShipmentCostsVendorItemNumber.Value;
                    }

                    foreach (var attributeMapping in _attributeMapping)
                    {
                        attributeMapping.VendorID = vendorID;
                    }


                    var xmlAssortmentRepository = new XmlAssortmentRepository(vendorID, unit, log);
                    foreach (var assortment in xmlAssortmentRepository.GetAssortment(vendorID))
                    {
                        var assortmentList  = new List <VendorAssortmentBulk.VendorAssortmentItem>();
                        var stockPerProduct = (from p in unit.Scope.Repository <Product>().GetAll(c => c.SourceVendorID == vendorID)
                                               let stock = p.VendorStocks.FirstOrDefault(c => c.VendorID == vendorID)
                                                           where stock != null
                                                           select new
                        {
                            p.VendorItemNumber,
                            stock.QuantityOnHand
                        }).ToDictionary(c => c.VendorItemNumber, c => c.QuantityOnHand);

                        var productGroup = assortment.Assortments.GroupBy(c => c.ConfigurableVendorItemNumber).ToList();

                        foreach (var configurableProductGroup in productGroup)
                        {
                            var first = configurableProductGroup.First();
                            var isConfigurableProductAWebsiteProduct = configurableProductGroup.Select(x => x.Website).Contains("WEB");

                            var type = first.TypeCode;

                            var typeObject  = repositoryProductTypes.Get(type);
                            var modelObject = repositoryModels.Get(first.ModelCode);

                            #region "Configurable Product"
                            var configurableProduct = new VendorAssortmentBulk.VendorAssortmentItem();

                            if (first.ConfigurableVendorItemNumber != ShipmentVendorItemNumber && first.ConfigurableVendorItemNumber != ReturnVendorItemNumber)
                            {
                                #region BrandVendor
                                configurableProduct.BrandVendors = new List <VendorAssortmentBulk.VendorImportBrand>()
                                {
                                    new VendorAssortmentBulk.VendorImportBrand()
                                    {
                                        VendorID        = DefaultVendorID,
                                        VendorBrandCode = first.Brand,
                                        Name            = first.Brand
                                    }
                                };
                                #endregion

                                #region GeneralProductInfo
                                configurableProduct.VendorProduct = new VendorAssortmentBulk.VendorProduct
                                {
                                    VendorID                    = vendorID,
                                    DefaultVendorID             = DefaultVendorID,
                                    CustomItemNumber            = configurableProductGroup.Key,
                                    VendorItemNumber            = configurableProductGroup.Key,
                                    VendorBrandCode             = first.Brand,
                                    IsConfigurable              = 1,
                                    VendorProductGroupCode1     = first.ProductGroupCode1,
                                    VendorProductGroupCodeName1 = first.ProductGroupCode1,
                                    VendorProductGroupCode2     = first.ProductGroupCode2,
                                    VendorProductGroupCodeName2 = first.ProductGroupCode2,
                                    VendorProductGroupCode3     = first.ProductGroupCode3,
                                    VendorProductGroupCodeName3 = first.ProductGroupCode3,
                                    VendorProductGroupCode4     = first.Brand,
                                    VendorProductGroupCodeName4 = first.Brand,
                                    ShortDescription            = first.ShortDescription,
                                    LongDescription             = first.LongDescription,
                                    Barcode = String.Empty
                                };
                                #endregion

                                #region ProductDescription
                                configurableProduct.VendorProductDescriptions = new List <VendorAssortmentBulk.VendorProductDescription>()
                                {
                                    new Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorProductDescription()
                                    {
                                        VendorID                = vendorID,
                                        DefaultVendorID         = DefaultVendorID,
                                        CustomItemNumber        = first.ConfigurableVendorItemNumber,
                                        LanguageID              = 1,
                                        ProductName             = first.ShortDescription,
                                        ShortContentDescription = first.ShortDescription,
                                        LongContentDescription  = first.LongDescription
                                    }
                                };
                                #endregion

                                #region Attributes

                                configurableProduct.VendorImportAttributeValues = new List
                                                                                  <VendorAssortmentBulk.VendorImportAttributeValue>()
                                {
                                    new VendorAssortmentBulk.VendorImportAttributeValue()
                                    {
                                        AttributeCode    = "Season",
                                        Value            = first.ProductGroupCode2,
                                        AttributeID      = attributes.FirstOrDefault(c => c.AttributeCode == "Season").AttributeID,
                                        CustomItemNumber = first.ConfigurableVendorItemNumber,
                                        DefaultVendorID  = DefaultVendorID,
                                        LanguageID       = null,
                                        VendorID         = ConcentratorVendorID
                                    },
                                    new Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorImportAttributeValue()
                                    {
                                        AttributeCode    = "IsBra",
                                        Value            = typeObject == null ? "false" : typeObject.IsBra.ToString(),
                                        AttributeID      = attributes.FirstOrDefault(c => c.AttributeCode == "IsBra").AttributeID,
                                        CustomItemNumber = first.ConfigurableVendorItemNumber,
                                        DefaultVendorID  = DefaultVendorID,
                                        LanguageID       = null,
                                        VendorID         = ConcentratorVendorID
                                    },
                                    new Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorImportAttributeValue()
                                    {
                                        AttributeCode    = "Group",
                                        Value            = typeObject == null ? type : typeObject.ProductType.ToString(),
                                        AttributeID      = attributes.FirstOrDefault(c => c.AttributeCode == "Group").AttributeID,
                                        CustomItemNumber = first.ConfigurableVendorItemNumber,
                                        DefaultVendorID  = DefaultVendorID,
                                        LanguageID       = null,
                                        VendorID         = ConcentratorVendorID
                                    }
                                };

                                #region ProductType Translation Attributes

                                if (typeObject != null) //add translations
                                {
                                    foreach (var translation in typeObject.Translations)
                                    {
                                        configurableProduct.VendorImportAttributeValues.Add(new VendorAssortmentBulk.VendorImportAttributeValue
                                        {
                                            AttributeCode    = "Type",
                                            Value            = translation.Value,
                                            AttributeID      = attributes.FirstOrDefault(c => c.AttributeCode == "Type").AttributeID,
                                            CustomItemNumber = first.ConfigurableVendorItemNumber,
                                            DefaultVendorID  = DefaultVendorID,
                                            LanguageID       = translation.Key.ToString(),
                                            VendorID         = ConcentratorVendorID
                                        });
                                    }
                                }

                                #endregion

                                #region Model Translation

                                if (modelObject != null)
                                {
                                    configurableProduct.VendorImportAttributeValues.Add(new Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorImportAttributeValue()
                                    {
                                        AttributeCode    = "Model",
                                        Value            = modelObject.Translation,
                                        AttributeID      = attributes.FirstOrDefault(c => c.AttributeCode == "Model").AttributeID,
                                        CustomItemNumber = first.ConfigurableVendorItemNumber,
                                        DefaultVendorID  = DefaultVendorID,
                                        LanguageID       = null,
                                        VendorID         = ConcentratorVendorID
                                    });
                                }

                                #endregion

                                #endregion

                                #region Prices
                                configurableProduct.VendorImportPrices =
                                    new List <Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorImportPrice>()
                                {
                                    new Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorImportPrice()
                                    {
                                        VendorID         = vendorID,
                                        DefaultVendorID  = DefaultVendorID,
                                        CustomItemNumber = configurableProductGroup.Key,
                                        CommercialStatus = isConfigurableProductAWebsiteProduct ? "Active" : "Non-Web",
                                        Price            = "0"
                                    }
                                };
                                #endregion

                                #region VendorStock
                                configurableProduct.VendorImportStocks = new List <VendorAssortmentBulk.VendorImportStock>()
                                {
                                    new VendorAssortmentBulk.VendorImportStock()
                                    {
                                        VendorID         = vendorID,
                                        DefaultVendorID  = DefaultVendorID,
                                        CustomItemNumber = configurableProductGroup.Key,
                                        StockType        = "Webshop",
                                        StockStatus      = "NonStock"
                                    }
                                };
                                #endregion

                                assortmentList.Add(configurableProduct);

                                configurableProduct.RelatedProducts = new List <VendorAssortmentBulk.VendorImportRelatedProduct>();

                                var otherProductsFromModel =
                                    assortment.Assortments.Where(c => c.ModelCode == first.ModelCode && c.TypeCode != first.ModelCode)
                                    .Select(c => c.ConfigurableVendorItemNumber)
                                    .Distinct()
                                    .ToList();
                                var otherProductsFromModelAndSameType      = new List <string>();
                                var otherProductsFromModelAndDifferentType = new List <string>();

                                foreach (var product in otherProductsFromModel)
                                {
                                    //var typeRelated = product.Split(new char[] {'-'}, StringSplitOptions.RemoveEmptyEntries)[1];
                                    var typeObjectRelated = repositoryProductTypes.Get(type);

                                    if (typeObjectRelated != null && typeObject != null)
                                    {
                                        if (typeObjectRelated.IsBra == typeObject.IsBra)
                                        {
                                            otherProductsFromModelAndSameType.Add(product);
                                        }
                                        else
                                        {
                                            otherProductsFromModelAndDifferentType.Add(product);
                                        }
                                    }
                                }

                                foreach (var relatedFromType in otherProductsFromModelAndSameType)
                                {
                                    configurableProduct.RelatedProducts.Add(new VendorAssortmentBulk.VendorImportRelatedProduct()
                                    {
                                        CustomItemNumber        = configurableProductGroup.Key,
                                        DefaultVendorID         = DefaultVendorID,
                                        VendorID                = vendorID,
                                        RelatedCustomItemNumber = relatedFromType,
                                        IsConfigured            = 0,
                                        RelatedProductType      = "ModelType"
                                    });
                                }

                                foreach (var relatedFromType in otherProductsFromModelAndDifferentType)
                                {
                                    configurableProduct.RelatedProducts.Add(new VendorAssortmentBulk.VendorImportRelatedProduct()
                                    {
                                        CustomItemNumber        = configurableProductGroup.Key,
                                        DefaultVendorID         = DefaultVendorID,
                                        VendorID                = vendorID,
                                        RelatedCustomItemNumber = relatedFromType,
                                        IsConfigured            = 0,
                                        RelatedProductType      = "ModelTypeCross"
                                    });
                                }
                            }
                            #endregion

                            var isBra = typeObject != null && typeObject.IsBra;

                            foreach (var simpleItem in configurableProductGroup)
                            {
                                var cupsizeProduct = false;

                                #region "Simple Product"
                                var simpleProduct = new VendorAssortmentBulk.VendorAssortmentItem();

                                #region "Brand"
                                simpleProduct.BrandVendors = new List <VendorAssortmentBulk.VendorImportBrand>()
                                {
                                    new VendorAssortmentBulk.VendorImportBrand()
                                    {
                                        VendorID        = DefaultVendorID,
                                        VendorBrandCode = simpleItem.Brand,
                                        Name            = simpleItem.Brand
                                    }
                                };
                                #endregion

                                #region "Vendor Product"
                                simpleProduct.VendorProduct = new VendorAssortmentBulk.VendorProduct
                                {
                                    VendorID                    = vendorID,
                                    DefaultVendorID             = DefaultVendorID,
                                    CustomItemNumber            = simpleItem.SimpleVendorItemNumber,
                                    VendorItemNumber            = simpleItem.SimpleVendorItemNumber,
                                    VendorBrandCode             = first.Brand,
                                    IsConfigurable              = 0,
                                    VendorProductGroupCode1     = simpleItem.ProductGroupCode1,
                                    VendorProductGroupCodeName1 = simpleItem.ProductGroupCode1,
                                    VendorProductGroupCode2     = simpleItem.ProductGroupCode2,
                                    VendorProductGroupCodeName2 = simpleItem.ProductGroupCode2,
                                    VendorProductGroupCode3     = simpleItem.ProductGroupCode3,
                                    VendorProductGroupCodeName3 = simpleItem.ProductGroupCode3,
                                    VendorProductGroupCode4     = first.Brand,
                                    VendorProductGroupCodeName4 = first.Brand,
                                    ShortDescription            = simpleItem.ShortDescription,
                                    LongDescription             = simpleItem.LongDescription,
                                    Barcode = simpleItem.Barcode,
                                    ParentProductCustomItemNumber = configurableProductGroup.Key
                                };
                                #endregion

                                #region "Product Description"
                                simpleProduct.VendorProductDescriptions = new List <VendorAssortmentBulk.VendorProductDescription>()
                                {
                                    new Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorProductDescription()
                                    {
                                        VendorID                = vendorID,
                                        DefaultVendorID         = DefaultVendorID,
                                        CustomItemNumber        = simpleItem.SimpleVendorItemNumber,
                                        LanguageID              = 1,
                                        ProductName             = simpleItem.ShortDescription,
                                        ShortContentDescription = simpleItem.ShortDescription,
                                        LongContentDescription  = simpleItem.LongDescription
                                    }
                                };
                                #endregion

                                #region "Attribute"
                                simpleProduct.VendorImportAttributeValues = new List <VendorAssortmentBulk.VendorImportAttributeValue>()
                                {
                                    new Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorImportAttributeValue()
                                    {
                                        AttributeCode    = "Color",
                                        Value            = simpleItem.ColourcodeSupplier,
                                        AttributeID      = attributes.FirstOrDefault(c => c.AttributeCode == "Color").AttributeID,
                                        CustomItemNumber = simpleItem.SimpleVendorItemNumber,
                                        DefaultVendorID  = DefaultVendorID,
                                        LanguageID       = null,
                                        VendorID         = ConcentratorVendorID
                                    },
                                    new Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorImportAttributeValue()
                                    {
                                        AttributeCode    = "Group",
                                        Value            = typeObject == null ? type : typeObject.ProductType.ToString(),
                                        AttributeID      = attributes.FirstOrDefault(c => c.AttributeCode == "Group").AttributeID,
                                        CustomItemNumber = simpleItem.SimpleVendorItemNumber,
                                        DefaultVendorID  = DefaultVendorID,
                                        LanguageID       = null,
                                        VendorID         = ConcentratorVendorID
                                    }
                                };

                                if (!string.IsNullOrEmpty(simpleItem.SubsizeSupplier))
                                {
                                    simpleProduct.VendorImportAttributeValues.Add(new VendorAssortmentBulk.VendorImportAttributeValue()
                                    {
                                        AttributeCode    = "Size",
                                        Value            = string.Format("{0}{1}", simpleItem.SizeSupplier, simpleItem.SubsizeSupplier),
                                        AttributeID      = attributes.FirstOrDefault(c => c.AttributeCode == "Size").AttributeID,
                                        CustomItemNumber = simpleItem.SimpleVendorItemNumber,
                                        DefaultVendorID  = DefaultVendorID,
                                        LanguageID       = null,
                                        VendorID         = ConcentratorVendorID
                                    });

                                    cupsizeProduct = true;
                                }
                                else
                                {
                                    simpleProduct.VendorImportAttributeValues.Add(new VendorAssortmentBulk.VendorImportAttributeValue()
                                    {
                                        AttributeCode    = "Size",
                                        Value            = simpleItem.SizeSupplier,
                                        AttributeID      = attributes.FirstOrDefault(c => c.AttributeCode == "Size").AttributeID,
                                        CustomItemNumber = simpleItem.SimpleVendorItemNumber,
                                        DefaultVendorID  = DefaultVendorID,
                                        LanguageID       = null,
                                        VendorID         = ConcentratorVendorID
                                    });
                                }

                                if (isBra)
                                {
                                    simpleProduct.VendorImportAttributeValues.Add(new VendorAssortmentBulk.VendorImportAttributeValue()
                                    {
                                        AttributeCode    = "TopSize",
                                        Value            = string.Format("{0}{1}", simpleItem.SizeSupplier, simpleItem.SubsizeSupplier),
                                        AttributeID      = attributes.FirstOrDefault(c => c.AttributeCode == "TopSize").AttributeID,
                                        CustomItemNumber = simpleItem.SimpleVendorItemNumber,
                                        DefaultVendorID  = DefaultVendorID,     // 50
                                        LanguageID       = null,
                                        VendorID         = ConcentratorVendorID // 48
                                    });
                                }
                                else
                                {
                                    simpleProduct.VendorImportAttributeValues.Add(new VendorAssortmentBulk.VendorImportAttributeValue()
                                    {
                                        AttributeCode    = "BottomSize",
                                        Value            = simpleItem.SizeSupplier,
                                        AttributeID      = attributes.FirstOrDefault(c => c.AttributeCode == "BottomSize").AttributeID,
                                        CustomItemNumber = simpleItem.SimpleVendorItemNumber,
                                        DefaultVendorID  = DefaultVendorID,     // 50
                                        LanguageID       = null,
                                        VendorID         = ConcentratorVendorID // 48
                                    });
                                }


                                #endregion

                                #region "Price"
                                simpleProduct.VendorImportPrices = new List <Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorImportPrice>()
                                {
                                    new Concentrator.Objects.Vendors.Bulk.VendorAssortmentBulk.VendorImportPrice()
                                    {
                                        VendorID         = vendorID,
                                        DefaultVendorID  = DefaultVendorID,
                                        CustomItemNumber = simpleItem.SimpleVendorItemNumber,
                                        CommercialStatus = simpleItem.Website.Equals("WEB") ? "Active" : "Non-Web",
                                        Price            = (useAdvicePrice  ? simpleItem.AdvicePrice :  simpleItem.LabellingPrice).ToString(CultureInfo.InvariantCulture),
                                        CostPrice        = (useAdvicePrice  ? simpleItem.AdvicePrice :  simpleItem.LabellingPrice).ToString(CultureInfo.InvariantCulture)
                                    }
                                };
                                #endregion

                                #region "Stock"

                                if (!stockPerProduct.ContainsKey(simpleItem.SimpleVendorItemNumber))
                                {
                                    simpleProduct.VendorImportStocks = new List <VendorAssortmentBulk.VendorImportStock>()
                                    {
                                        new VendorAssortmentBulk.VendorImportStock()
                                        {
                                            VendorID         = vendorID,
                                            DefaultVendorID  = DefaultVendorID,
                                            CustomItemNumber = simpleItem.SimpleVendorItemNumber,
                                            StockType        = "Webshop",
                                            StockStatus      = "ENA"
                                        }
                                    };
                                }
                                else
                                {
                                    simpleProduct.VendorImportStocks = new List <VendorAssortmentBulk.VendorImportStock>();
                                }
                                #endregion

                                assortmentList.Add(simpleProduct);

                                if (first.ConfigurableVendorItemNumber != ShipmentVendorItemNumber && first.ConfigurableVendorItemNumber != ReturnVendorItemNumber)
                                {
                                    configurableProduct.RelatedProducts.Add(new VendorAssortmentBulk.VendorImportRelatedProduct()
                                    {
                                        CustomItemNumber        = first.ConfigurableVendorItemNumber,
                                        DefaultVendorID         = DefaultVendorID,
                                        IsConfigured            = 1,
                                        VendorID                = vendorID,
                                        RelatedCustomItemNumber = simpleItem.SimpleVendorItemNumber,
                                        RelatedProductType      = "Configured product"
                                    });

                                    AddConfiguredAttributes(configurableProduct, cupsizeProduct);
                                }
                                #endregion
                            }
                        }

                        try
                        {
                            var bulkConfig = new VendorAssortmentBulkConfiguration {
                                IsPartialAssortment = IsPartialAssortment
                            };
                            using (var vendorAssortmentBulk = new VendorAssortmentBulk(assortmentList, vendorID, DefaultVendorID, bulkConfig))
                            {
                                vendorAssortmentBulk.Init(unit.Context);
                                vendorAssortmentBulk.Sync(unit.Context);
                            }
                        }
                        catch (Exception ex)
                        {
                            log.AuditError(ex.Message);
                        }

                        foreach (var productAttributeConfiguration in _configuredAttributes)
                        {
                            var product = unit.Scope.Repository <Product>().GetSingle(c => c.VendorItemNumber == productAttributeConfiguration.Key && c.IsConfigurable);

                            foreach (var code in productAttributeConfiguration.Value)
                            {
                                var ent = product.ProductAttributeMetaDatas.FirstOrDefault(c => c.AttributeCode == code);

                                if (ent == null)
                                {
                                    var attr = unit.Scope.Repository <ProductAttributeMetaData>().GetSingle(c => c.AttributeCode == code);

                                    product.ProductAttributeMetaDatas.Add(attr);
                                }
                            }
                        }
                        unit.Save();
                        CopyArticleInformationToTnt(assortment.FileName);
                    }
                }
            }
        }
        protected override void ExecuteVendorTask()
        {
            _monitoring = new FeeblMonitoring();
            _monitoring.Notify(Name, 0);

            if (Location.IsNullOrWhiteSpace())
            {
                TraceError("The connector setting '{0}' does not exists or is empty!", Constants.Vendor.Setting.Location);
            }
            else
            {
                var locationInfo = new DirectoryInfo(Location);

                if (!locationInfo.FullName.EndsWith("$") && !locationInfo.Exists)
                {
                    TraceError("The directory '{0}' does not exists!", locationInfo.FullName);
                }
                else if (!locationInfo.FullName.EndsWith("$") && !locationInfo.HasAccess(FileSystemRights.FullControl))
                {
                    TraceError("The user '{0}' has insufficient access over the directory '{1}'!", WindowsIdentity.GetCurrent().Name, locationInfo.FullName);
                }
                else if (ProductAttributeHelper.Bind(PropertyStore, Context, TraceSource))
                {
                    Languages = Unit.Scope
                                .Repository <Language>()
                                .GetAll(language => language.Name == Constants.Language.English)
                                .ToArray();

                    TariffVendors = Unit.Scope
                                    .Repository <Vendor>()
                                    .Include(vendor => vendor.VendorSettings)
                                    .GetAll(vendor => vendor.ParentVendorID == VendorID)
                                    .AsEnumerable()
                                    .Where(vendor
                                           => vendor.GetVendorSetting(Constants.Vendor.Setting.IsTariff, false) &&
                                           !vendor.GetVendorSetting(Constants.Vendor.Setting.CountryCode).IsNullOrWhiteSpace() &&
                                           !vendor.GetVendorSetting(Constants.Vendor.Setting.CurrencyCode).IsNullOrWhiteSpace())
                                    .ToDictionary(GetTariffCode);

                    var files = locationInfo.GetFiles("*.csv", SearchOption.TopDirectoryOnly);

                    TraceInformation("Found {0} CSV-files for import!", files.Length);

                    foreach (var fileInfo in files)
                    {
                        TraceInformation("Importing the file '{0}'...", fileInfo);

                        var articles = GetArticles(fileInfo.FullName);

                        if (articles != null)
                        {
                            var enumerableArticles = articles as Article[] ?? articles.ToArray();
                            ImportTariffVendors(enumerableArticles);

                            var vendorAssortmentItems = GetVendorAssortments(enumerableArticles).ToArray();

                            var success = true;

                            foreach (var vendorAssortmentGrouping in vendorAssortmentItems.GroupBy(vendorAssortmentItem => vendorAssortmentItem.VendorProduct.VendorID))
                            {
                                TraceInformation("Importing assortment for vendor '{0}'...", vendorAssortmentGrouping.Key != VendorID
                  ? Unit.Scope.Repository <Vendor>().GetSingle(vendor => vendor.VendorID == vendorAssortmentGrouping.Key).Name
                  : VendorName);

                                var bulkConfig = new VendorAssortmentBulkConfiguration
                                {
                                    IsPartialAssortment = true
                                };

                                using (var bulk = new VendorAssortmentBulk(vendorAssortmentGrouping, vendorAssortmentGrouping.Key, VendorID, bulkConfig))
                                {
                                    try
                                    {
                                        bulk.Init(Unit.Context);
                                        bulk.Sync(Unit.Context);
                                    }
                                    catch (Exception exception)
                                    {
                                        success = false;
                                        TraceCritical(exception);
                                    }
                                }
                            }

                            fileInfo.CopyTo(fileInfo.FullName + (success ? ".processed" : ".failed"), true);
                            fileInfo.Delete();
                        }
                    }

                    ImportProductConfiguration(PropertyStore.ColorCode, PropertyStore.SizeCode);
                    ImportProductGroups();
                }
            }
            _monitoring.Notify(Name, 1);
        }