private void ParseStockLevels() { var promisedDeliveryDate = _record.Field <DateTime?>("PromisedDeliveryDate"); var quantityToReceive = _record.Field <double?>("QuantityToReceive"); VendorStock vendorStock = (from vs in _vendorStock where vs.ProductID == _product.ProductID && vs.VendorStockType == _vendorStockTypes.SyncVendorStockTypes("Assortment") && vs.VendorID == _vendor.VendorID select vs).FirstOrDefault(); if (vendorStock == null) { vendorStock = new VendorStock() { ProductID = _product.ProductID, VendorID = _vendor.VendorID, VendorStockTypeID = 1 }; _unit.Scope.Repository <VendorStock>().Add(vendorStock); _vendorStock.Add(vendorStock); } vendorStock.ProductID = _product.ProductID; vendorStock.QuantityOnHand = (int)_record.Field <double>("QuantityOnHand"); vendorStock.PromisedDeliveryDate = promisedDeliveryDate; vendorStock.VendorID = _vendor.VendorID; vendorStock.QuantityToReceive = quantityToReceive.Try <double?, int?>(c => int.Parse(c.Value.ToString()), null); vendorStock.ConcentratorStatusID = UpdateVendorStatuses(_record.Field <string>("StockStatus")); vendorStock.VendorStatus = _record.Field <string>("StockStatus"); vendorStock.StockStatus = _record.Field <string>("StockStatus"); }
private void ImportRetailStock(Connector connector, XDocument products, log4net.ILog log) { using (ShopDataContext context = new ShopDataContext(connector.ConnectionString)) { try { Dictionary <int, List <VendorStock> > existingStock = new Dictionary <int, List <VendorStock> >(); var records = (from r in products.Root.Elements("Product") where !String.IsNullOrEmpty(r.Attribute("CustomProductID").Value) select r); foreach (var r in records) { int custom = int.Parse(r.Attribute("CustomProductID").Value); context.VendorStocks.DeleteAllOnSubmit( context.VendorStocks.Where( x => x.ProductID == custom && x.RelationID == BASrelationID && x.StockLocationID != BASLocation)); foreach (var vendor in r.Element("Stock").Element("Retail").Elements("RetailStock")) { VendorStock stock = null; stock = new VendorStock(); stock.CreationTime = DateTime.Now; stock.LastModificationTime = DateTime.Now; stock.CreatedBy = 0; stock.LastModifiedBy = 0; stock.ProductID = custom; stock.RelationID = 962542; stock.VendorProductStatus = "S"; stock.StockLocationID = vendor.Attribute("Name").Value; stock.QuantityOnHand = int.Parse(vendor.Attribute("InStock").Value); context.VendorStocks.InsertOnSubmit(stock); //addedstock.Add(custom); } context.SubmitChanges(); } } catch (Exception ex) { log.Error("Error import vendor stock", ex); log.Debug(ex.StackTrace); } } }
public Boolean InsertVendorStock(VendorStock vendorStock) { using (var db = GetUnitOfWork()) { try { db.Scope.Repository <VendorStock>().Add(vendorStock); db.Save(); return(true); } catch (Exception) { return(false); } } }
private bool ProcessXML(XDocument doc, IScope scope) { var repoAssortment = scope.Repository <VendorAssortment>(); var repoStock = scope.Repository <VendorStock>(); var stockData = (from data in doc.Elements("Products").Elements("Product") select new { CustomItemNumber = data.Attribute("id").Value, Stock = data.Element("Purchase").Element("Stock").Value }).ToList(); foreach (var productStock in stockData) { //get productID in vendorStockAssortment var productID = repoAssortment.GetSingle(vs => vs.CustomItemNumber == productStock.CustomItemNumber && vs.VendorID == VendorID).Try <VendorAssortment, int?>(c => c.ProductID, null); //if found if (productID.HasValue && productID.Value > 0) { var vendorStock = repoStock.GetSingle(st => st.ProductID == productID); try { if (vendorStock == null) { vendorStock = new VendorStock { VendorID = VendorID, ProductID = productID.Value, VendorStockTypeID = 1 }; repoStock.Add(vendorStock); } vendorStock.QuantityOnHand = Int32.Parse(productStock.Stock); vendorStock.ConcentratorStatusID = -1; } catch (Exception ex) { log.AuditError(string.Format("Error update stock for product {0}, error {1}", productID, ex.InnerException)); return(false); } } } return(true); }
public ActionResult Create(int productID, int vendorID, int quantityOnHand, int vendorStockTypeID, int minimumQuantity) { return(Create <VendorPrice>((unit, vendorPrice) => { var assortmentService = unit.Service <VendorAssortment>(); var va = assortmentService.Get(c => c.ProductID == productID && c.VendorID == vendorID); var firstVa = assortmentService.Get(c => c.ProductID == productID); if (va == null) { va = new VendorAssortment() { ProductID = productID, CustomItemNumber = firstVa.CustomItemNumber, VendorID = vendorID, ShortDescription = firstVa.ShortDescription, LongDescription = firstVa.LongDescription, LineType = firstVa.LineType, LedgerClass = firstVa.LedgerClass, ExtendedCatalog = firstVa.ExtendedCatalog, ProductDesk = firstVa.ProductDesk, IsActive = firstVa.IsActive, ZoneReferenceID = firstVa.ZoneReferenceID, ShipmentRateTableReferenceID = firstVa.ShipmentRateTableReferenceID }; assortmentService.Create(va); } vendorPrice.VendorAssortment = va; vendorPrice.MinimumQuantity = minimumQuantity; unit.Service <VendorPrice>().Create(vendorPrice); VendorStock venStock = new VendorStock { ProductID = productID, VendorID = vendorID, QuantityOnHand = quantityOnHand, VendorStockTypeID = vendorStockTypeID }; unit.Service <VendorStock>().Create(venStock); })); }
private void ProcessFile(IUnitOfWork unit, DataTable stockFile) { var repoAssortment = unit.Scope.Repository <VendorAssortment>(); var repoStock = unit.Scope.Repository <VendorStock>(); var stockData = (from data in stockFile.AsEnumerable() select new { CustomItemNumber = data[0].ToString(), Stock = data[2].ToString() }).ToList(); foreach (var productStock in stockData) { //get productID in vendorStockAssortment var productID = repoAssortment.GetSingle(vs => vs.CustomItemNumber == productStock.CustomItemNumber && vs.VendorID == VendorID).Try <VendorAssortment, int?>(c => c.ProductID, null); //if found if (productID.HasValue && productID.Value > 0) { var vendorStock = repoStock.GetSingle(st => st.ProductID == productID); try { if (vendorStock == null) { vendorStock = new VendorStock { VendorID = VendorID.Value, ProductID = productID.Value, VendorStockTypeID = 1 }; repoStock.Add(vendorStock); } vendorStock.QuantityOnHand = Int32.Parse(productStock.Stock); vendorStock.ConcentratorStatusID = -1; } catch (Exception ex) { log.AuditError(string.Format("Error update stock for product {0}, error {1}", productID, ex.InnerException)); } } } }
private VendorStock ParseRetailStockLevels(int retailVendorID, DataRow dr, List <VendorStock> vendorstockList) { var stockRepo = _unit.Scope.Repository <VendorStock>(); var stockType = _vendorStockTypes.SyncVendorStockTypes("Assortment"); VendorStock vendorStock = vendorstockList.FirstOrDefault(vs => vs.ProductID == _product.ProductID && vs.VendorStockTypeID == stockType.VendorStockTypeID); if (vendorStock == null) { vendorStock = new VendorStock() { ProductID = _product.ProductID, VendorID = retailVendorID, VendorStockType = _vendorStockTypes.SyncVendorStockTypes("Assortment") }; stockRepo.Add(vendorStock); } //vendorStock.ProductID = _product.ProductID; vendorStock.QuantityOnHand = dr.Field <int>("InStock"); //vendorStock.VendorID = retailVendorID; return(vendorStock); }
protected override bool Process(String file, Vendor vendor) { var document = Documents[file]; var elementGroups = from element in document.XPathSelectElements("return_notifications/return_notification") let websiteOrderNumber = (String)element.XPathEvaluate("string(website_order_number/text())") group element by websiteOrderNumber; foreach (var elementGroup in elementGroups) { var websiteOrderNumber = elementGroup.Key; if (String.IsNullOrWhiteSpace(websiteOrderNumber)) { var message = "Website_order_number is missing."; Log.AuditError(message); throw new Exception(message); } int connectorID = vendor.VendorSettings.FirstOrDefault(c => c.SettingKey == "RelatedConnectorID").Try(c => int.Parse(c.Value)); var order = Unit.Scope.Repository <Order>().GetSingle(o => o.WebSiteOrderNumber == websiteOrderNumber && o.ConnectorID == connectorID); if (order == null) //no order for this connector. Leave message for next { return(false); } var orderResponse = new OrderResponse { Order = order, OrderResponseLines = new List <OrderResponseLine>(), ReceiveDate = DateTime.Now.ToUniversalTime(), ResponseType = OrderResponseTypes.Return.ToString(), Vendor = Vendor, VendorDocument = document.ToString(), VendorDocumentDate = DateTime.Now.ToUniversalTime(), VendorDocumentReference = websiteOrderNumber, VendorDocumentNumber = websiteOrderNumber, }; var isCompleteOrderReturnedInOne = IsTotalOrderReturnedAtOnce(elementGroup, order, vendor.Name); int currentComplaintCount = 0; foreach (var element in elementGroup) { var sku = GetSku(element, true).Replace(" ", ""); var product = Unit.Scope.Repository <Product>().GetSingle(p => p.VendorItemNumber.Replace(" ", "") == sku); if (product == null) { var message = String.Format("No product found with vendor item number '{0}'.", sku); Log.AuditError(message); throw new Exception(message); } var returned = Convert.ToInt32(element.XPathEvaluate("number(returned/text())")); var vendorID = vendor.VendorID; int vendorOverrideID = vendor.VendorSettings.GetValueByKey <int>("VendorStockOverrideID", 0); VendorStock vendorStock = null; //Not good, rework if (vendorOverrideID != 0) { vendorStock = product.VendorStocks.Single(vs => vs.VendorID == vendorOverrideID && vs.VendorStockType.StockType == "Webshop"); } else { vendorStock = product.VendorStocks.Single(vs => vs.Vendor == Vendor && vs.VendorStockType.StockType == "Webshop"); } vendorStock.QuantityOnHand += returned; var complaint = Convert.ToBoolean(element.XPathEvaluate("string(complaint/text())")); if (complaint) { currentComplaintCount++; } var orderLine = order.OrderLines.FirstOrDefault(row => row.Product == product); if (orderLine == null) { var message = String.Format("No order line found with product '{0}'.", sku); Log.AuditError(message); throw new Exception(message); } orderResponse.OrderResponseLines.Add(new OrderResponseLine { OrderLine = orderLine, Ordered = orderLine.GetDispatchQuantity(), Delivered = returned, Remark = "Returned", Description = complaint ? "complaint" : null }); } order.OrderResponses.Add(orderResponse); //check if total order is returned var isWholeOrderReturned = TNTOrderHelper.IsTotalOrderReturned(order); var complaintCount = GetOrderComplaintCount(order); if (currentComplaintCount == 0) { //add a new line for the return costs orderResponse.OrderResponseLines.Add(AddReturnCosts(order)); } if (isWholeOrderReturned) { bool useKialaShipmentCosts = !string.IsNullOrEmpty(order.ShippedToCustomer.ServicePointID); var line = order.OrderLines.FirstOrDefault(c => c.Product.VendorItemNumber == GetShipmentCostsProduct(order.ConnectorID, Unit, useKialaShipmentCosts)); if (line != null) { //add shipment costs to returned collection orderResponse.OrderResponseLines.Add(new OrderResponseLine() { OrderLine = line, Delivered = 1, Remark = "Returned", Ordered = 1 }); } } Unit.Save(); } return(true); }
public ActionResult CreateByVendorAssortment(int productID, int vendorID, bool isSearched = false) { if (isSearched) { List <int> underlyingProductIDs = GetAllUnderlyingProds(productID); if (underlyingProductIDs.Contains(productID)) { underlyingProductIDs.Remove(productID); } foreach (int underlyingProductID in underlyingProductIDs) { Create <VendorPrice>((unit, vendorPrice) => { var vendorAssortment = unit.Service <VendorAssortment>().Get(c => c.ProductID == underlyingProductID && c.VendorID == vendorID); var firstVa = unit.Service <VendorAssortment>().Get(c => c.ProductID == underlyingProductID); if (vendorAssortment == null) { vendorAssortment = new VendorAssortment() { ProductID = underlyingProductID, CustomItemNumber = firstVa.CustomItemNumber, VendorID = vendorID, ShortDescription = firstVa.ShortDescription, LongDescription = firstVa.LongDescription, LineType = firstVa.LineType, LedgerClass = firstVa.LedgerClass, ExtendedCatalog = firstVa.ExtendedCatalog, ProductDesk = firstVa.ProductDesk, IsActive = firstVa.IsActive, ZoneReferenceID = firstVa.ZoneReferenceID, ShipmentRateTableReferenceID = firstVa.ShipmentRateTableReferenceID }; unit.Service <VendorAssortment>().Create(vendorAssortment); VendorStock venStock = new VendorStock { ProductID = underlyingProductID, VendorID = vendorID, QuantityOnHand = 0, VendorStockTypeID = 1 }; unit.Service <VendorStock>().Create(venStock); unit.Save(); } vendorAssortment.ThrowIfNull("The vendor selected does not have any assortment from this item"); var vendorAssortmentID = vendorAssortment.VendorAssortmentID; vendorPrice.VendorAssortmentID = vendorAssortmentID; unit.Service <VendorPrice>().Create(vendorPrice); }); } } return(Create <VendorPrice>((unit, vendorPrice) => { var vendorAssortment = unit.Service <VendorAssortment>().Get(c => c.ProductID == productID && c.VendorID == vendorID); var firstVa = unit.Service <VendorAssortment>().Get(c => c.ProductID == productID); if (vendorAssortment == null) { vendorAssortment = new VendorAssortment() { ProductID = productID, CustomItemNumber = firstVa.CustomItemNumber, VendorID = vendorID, ShortDescription = firstVa.ShortDescription, LongDescription = firstVa.LongDescription, LineType = firstVa.LineType, LedgerClass = firstVa.LedgerClass, ExtendedCatalog = firstVa.ExtendedCatalog, ProductDesk = firstVa.ProductDesk, IsActive = firstVa.IsActive, ZoneReferenceID = firstVa.ZoneReferenceID, ShipmentRateTableReferenceID = firstVa.ShipmentRateTableReferenceID }; vendorAssortment.ProductGroupVendors = new List <ProductGroupVendor>(); unit.Service <VendorAssortment>().Create(vendorAssortment); firstVa.ProductGroupVendors.ForEach((pg, idx) => { vendorAssortment.ProductGroupVendors.Add(pg); }); VendorStock venStock = new VendorStock { ProductID = productID, VendorID = vendorID, QuantityOnHand = 0, VendorStockTypeID = 1 }; unit.Service <VendorStock>().Create(venStock); unit.Save(); } vendorAssortment.ThrowIfNull("The vendor selected does not have any assortment from this item"); var vendorAssortmentID = vendorAssortment.VendorAssortmentID; vendorPrice.VendorAssortmentID = vendorAssortmentID; unit.Service <VendorPrice>().Create(vendorPrice); })); }
protected override void Process() { try { using (var unit = GetUnitOfWork()) { var config = GetConfiguration(); var vendorID = 0; //config.AppSettings.Settings["StockMutationVendorID"].Value; if (!int.TryParse(config.AppSettings.Settings["StockMutationVendorID"].Value, out vendorID)) { throw new Exception("Appsetting StockMutationVendorID missing in plugin config"); } var vendor = unit.Scope.Repository <Vendor>().GetSingle(x => x.VendorID == vendorID); var stockMutationPath = config.AppSettings.Settings["StockMutationPath"].Value; if (string.IsNullOrEmpty(stockMutationPath)) { throw new Exception("Empty stock mutation path for " + vendor.Name); } int wmsStockLocation = int.Parse(config.AppSettings.Settings["WmsVendorStockTypeID"].Value); int transitStockLocation = int.Parse(config.AppSettings.Settings["TransitVendorStockTypeID"].Value); var cmStockType = unit.Scope.Repository <VendorStockType>().GetSingle(x => x.StockType == "CM"); if (cmStockType == null) { throw new Exception("Stocklocation CM does not exists, skip order process"); } var transferStockType = unit.Scope.Repository <VendorStockType>().GetSingle(x => x.StockType == "Transfer"); if (transferStockType == null) { throw new Exception("Stocklocation Transfer does not exists, skip order process"); } var webShopStockType = unit.Scope.Repository <VendorStockType>().GetSingle(x => x.StockType == "Webshop"); if (webShopStockType == null) { throw new Exception("Stocklocation Webshop does not exists, skip order process"); } Directory.GetFiles(stockMutationPath).ForEach((file, idx) => { try { XDocument XmlDocument = XDocument.Parse(System.IO.File.ReadAllText(file)); var mutations = (from r in XmlDocument.Root.Elements("Mutation") select new { VendorItemNumber = r.Element("ProductID").Value, TransitStock = bool.Parse(r.Element("TransitStock").Value), Quantity = int.Parse(r.Element("Quantity").Value) }); mutations.ForEach((mutation, ridx) => { var wmsVendorstockRecord = unit.Scope.Repository <VendorStock>().GetSingle(x => x.Product.VendorItemNumber == mutation.VendorItemNumber && x.VendorStockTypeID == wmsStockLocation); if (wmsVendorstockRecord == null) { var product = unit.Scope.Repository <Product>().GetSingle(x => x.VendorItemNumber == mutation.VendorItemNumber); if (product != null) { wmsVendorstockRecord = new VendorStock() { VendorStockTypeID = wmsStockLocation, VendorID = vendor.VendorID, ProductID = product.ProductID, QuantityOnHand = 0 }; unit.Scope.Repository <VendorStock>().Add(wmsVendorstockRecord); unit.Save(); } else { log.AuditInfo("Received mutation for non existing product"); } } if (wmsVendorstockRecord != null) { wmsVendorstockRecord.QuantityOnHand = wmsVendorstockRecord.QuantityOnHand + mutation.Quantity; var cmStock = unit.Scope.Repository <VendorStock>().GetSingle(x => x.Product.VendorItemNumber == mutation.VendorItemNumber && x.VendorStockTypeID == cmStockType.VendorStockTypeID); var cmStockOnHand = 0; if (cmStock != null) { cmStockOnHand = cmStock.QuantityOnHand; } var transitVendorstockRecord = unit.Scope.Repository <VendorStock>().GetSingle(x => x.Product.VendorItemNumber == mutation.VendorItemNumber && x.VendorStockTypeID == transferStockType.VendorStockTypeID); if (mutation.TransitStock) { //In transit stock mutations need to be moved from transit to wms location //var transitVendorstockRecord = unit.Scope.Repository<VendorStock>().GetSingle(x => x.Product.VendorItemNumber == mutation.VendorItemNumber && x.VendorStockTypeID == transitStockLocation); if (transitVendorstockRecord == null) { var product = unit.Scope.Repository <Product>().GetSingle(x => x.VendorItemNumber == mutation.VendorItemNumber); if (product != null) { transitVendorstockRecord = new VendorStock() { VendorStockTypeID = transferStockType.VendorStockTypeID, VendorID = vendor.VendorID, ProductID = product.ProductID, QuantityOnHand = 0 }; unit.Scope.Repository <VendorStock>().Add(transitVendorstockRecord); unit.Save(); } else { log.AuditInfo("Received mutation for non existing product"); } } if (transitVendorstockRecord != null && transitVendorstockRecord.QuantityOnHand > 0) { transitVendorstockRecord.QuantityOnHand = transitVendorstockRecord.QuantityOnHand - mutation.Quantity; } } var transferStockOnHand = 0; if (transitVendorstockRecord != null) { transferStockOnHand = transitVendorstockRecord.QuantityOnHand; } var webshopStock = unit.Scope.Repository <VendorStock>().GetSingle(x => x.Product.VendorItemNumber == mutation.VendorItemNumber && x.VendorStockTypeID == webShopStockType.VendorStockTypeID); if (webshopStock == null) { var product = unit.Scope.Repository <Product>().GetSingle(x => x.VendorItemNumber == mutation.VendorItemNumber); if (product != null) { webshopStock = new VendorStock() { VendorStockTypeID = wmsStockLocation, VendorID = vendor.VendorID, ProductID = product.ProductID, QuantityOnHand = 0 }; unit.Scope.Repository <VendorStock>().Add(webshopStock); unit.Save(); } else { log.AuditInfo("Received mutation for non existing product"); } } webshopStock.QuantityOnHand = cmStockOnHand + transferStockOnHand + wmsVendorstockRecord.QuantityOnHand; } }); unit.Save(); } catch (Exception ex) { log.Error("Error process dispatch " + vendor.Name, ex); } FileInfo finf = new FileInfo(file); string archivePath = Path.Combine(stockMutationPath, "Archive"); if (!Directory.Exists(archivePath)) { Directory.CreateDirectory(archivePath); } var path = Path.Combine(archivePath, DateTime.Now.ToString("yyyyMMddHHmmss") + finf.Extension); if (File.Exists(path)) { File.Delete(path); } File.Move(file, path); }); } } catch (Exception ex) { log.AuditError("Error importing stock mutations WMS", ex); } }
private void ImportStock(Connector connector, XDocument products, log4net.ILog log) { try { using (ShopDataContext context = new ShopDataContext(connector.ConnectionString)) { //var ids = (from r in products.Root.Elements("Product") //select int.Parse(r.Attribute("CustomProductID").Value)).Distinct().ToArray(); //Dictionary<int, List<VendorStock>> existingStock = new Dictionary<int, List<VendorStock>>(); //foreach (int id in ids) //{ // var stk = (from c in context.VendorStocks // where c.ProductID == id // select c).ToList(); // if (stk.Count() > 0) // { // if (!existingStock.ContainsKey(stk.First().ProductID)) // existingStock.Add(stk.First().ProductID, stk); // else // { // foreach (VendorStock vs in stk) // { // if (!existingStock[stk.First().ProductID].Contains(vs)) // existingStock[stk.First().ProductID].Add(vs); // } // } // } //} //List<int> addedstock = new List<int>(); context.VendorStocks.DeleteAllOnSubmit(context.VendorStocks.Where(x => x.RelationID == BASrelationID)); var records = (from r in products.Root.Elements("Product") where !String.IsNullOrEmpty(r.Attribute("CustomProductID").Value) select r); var groupedByProduct = (from r in records group r by r.Attribute("CustomProductID").Value into grouped select grouped ); foreach (var r in groupedByProduct) { var product = r; int custom = int.Parse(product.Key); var stock = new VendorStock(); stock.CreationTime = DateTime.Now; stock.LastModificationTime = DateTime.Now; stock.CreatedBy = 0; stock.LastModifiedBy = 0; stock.ProductID = custom; stock.RelationID = BASrelationID; stock.VendorProductStatus = "S"; stock.StockLocationID = BASLocation; int qty = product.Sum(x => int.Parse(x.Element("Stock").Attribute("InStock").Value)); stock.QuantityOnHand = qty; context.VendorStocks.InsertOnSubmit(stock); } context.SubmitChanges(); } } catch (Exception ex) { log.Error("Error import stock", ex); log.Debug(ex.InnerException); } }
private void Import(List <int> Vendors, XDocument productsDoc, XDocument categoriesDoc, IUnitOfWork unit) { #region Repositories var _vendorRepo = unit.Scope.Repository <Vendor>(); var _brandRepo = unit.Scope.Repository <Brand>(); var _brandVendorRepo = unit.Scope.Repository <BrandVendor>(); var _productRepo = unit.Scope.Repository <Product>(); var _assortmentRepo = unit.Scope.Repository <VendorAssortment>(); var _productGroupVendorRepo = unit.Scope.Repository <ProductGroupVendor>(); var _prodDescriptionRepo = unit.Scope.Repository <ProductDescription>(); var _attrGroupRepo = unit.Scope.Repository <ProductAttributeGroupMetaData>(); var _attrGroupName = unit.Scope.Repository <ProductAttributeGroupName>(); var _attrRepo = unit.Scope.Repository <ProductAttributeMetaData>(); var _attrNameRepo = unit.Scope.Repository <ProductAttributeName>(); var _attrValueRepo = unit.Scope.Repository <ProductAttributeValue>(); var _mediaRepo = unit.Scope.Repository <ProductMedia>(); var _mediaTypeRepo = unit.Scope.Repository <MediaType>(); var _priceRepo = unit.Scope.Repository <VendorPrice>(); var _stockRepo = unit.Scope.Repository <VendorStock>(); var _barcodeRepo = unit.Scope.Repository <ProductBarcode>(); var _relatedProductRepo = unit.Scope.Repository <RelatedProduct>(); var _relatedProductTypeRepo = unit.Scope.Repository <RelatedProductType>(); #endregion #region Parsing xmls //Parse categories var Categories = (from cat in categoriesDoc.Element("CATEGORYDATA").Elements("category") select new { category = cat.Element("Category").Value, path = cat.Element("Path").Value } ); //Parse products var importProducts = (from productData in productsDoc.Element("PRODUCTDATA").Elements("product") let td = productData.Element("TechnicalData").Elements() let c = Categories.Where( x => x.path == "private_" + productData.Elements().Where(p => p.Name == "Path").FirstOrDefault().Value). FirstOrDefault() select new SennHeiserItemImport { CustomItemNumber = productData.Attribute("name").Value.Trim(), VendorItemNumber = productData.Attribute("no").Value.Trim(), Url = productData.Element("URL") != null ? productData.Element("URL").Value.Trim() : string.Empty, ShortContentDescription = System.Web.HttpUtility.UrlDecode(productData.Element("ShortDescription").Value), LongContentDescription = System.Web.HttpUtility.UrlDecode(productData.Element("GeneralDescription").Value), Attributes = (from items in td group items by items.Attribute("order").Value into g select new SennHeiserAttribute { AttributeCode = System.Web.HttpUtility.UrlDecode( td.Where( x => x.Attribute("order").Value == g.Key && x.Name == "TechnicalData").FirstOrDefault().Value), AttributeValue = System.Web.HttpUtility.UrlDecode( td.Where( x => x.Attribute("order").Value == g.Key && x.Name == "TechnicalData_Content").FirstOrDefault().Value), AttributeGroupCode = "TechnicalData" } ).Union( (from elem in productData.Elements() where elem.Name == "KeyFeatures" || elem.Name == "Features" || elem.Name == "DeliveryIncludes" select new SennHeiserAttribute { AttributeCode = elem.Name.LocalName.Length > 150 ? elem.Name.LocalName.Substring(0, 150) : elem.Name.LocalName, AttributeValue = System.Web.HttpUtility.UrlDecode(elem.Value), AttributeGroupCode = elem.Name.LocalName })).ToList(), Variants = (from data in productData.Elements() where data.Name == "Variant" from data1 in data.Elements() where data1.Name == "VariantData" select new ProductData { VendorItemNumber = data1.Element("ProductNo").Value, OrderID = int.Parse(data1.Attribute("order").Value), CustomItemNumber = data1.Element("ProductName").Value, Description = data1.Element("Description").Value, IsVariant = true }).ToList(), Accessoires = (from data in productData.Elements() where data.Name == "Accessories" from data1 in data.Elements() where data1.Name == "AccessoriesData" select new ProductData { VendorItemNumber = data1.Element("ProductNo").Value, OrderID = int.Parse(data1.Attribute("order").Value), CustomItemNumber = data1.Element("ProductName").Value, Description = data1.Element("Description").Value, IsVariant = false, Designation = data1.Element("Designation").Value }).ToList(), ProductCategory = c.Try(q => q.category.Remove(0, "Private_".Length), string.Empty), ProductMedia = (from url in productData.Elements() where url.Name == "Image" select new ProductMedia { MediaUrl = url.Element("ImageFile").Value, Description = url.Attribute("description").Value }).ToList(), OtherMedia = (from m in productData.Elements() where m.Name == "Download" select new ProductMedia { MediaUrl = m.Element("DownloadFile").Value, Sequence = int.Parse(m.Element("DownloadFile").Attribute("order").Value), Description = m.Attribute("description").Value }).ToList() }).ToList(); #endregion #region Initialize independent inmemory collections var brands = _brandRepo.GetAll().ToList(); var products = _productRepo.GetAll().ToList(); var relatedProductTypeVariant = _relatedProductTypeRepo.GetSingle(x => x.Type == "Variant"); var relatedProductTypeAccessory = _relatedProductTypeRepo.GetSingle(x => x.Type == "Accessory"); var mediaTypes = _mediaTypeRepo.GetAll().ToList(); var imageMediaType = _mediaTypeRepo.GetSingle(i => i.Type.ToLower() == "Image"); if (imageMediaType == null) { imageMediaType = new MediaType() { Type = "Image" }; _mediaTypeRepo.Add(imageMediaType); } #endregion bool firstVendor = true; foreach (var vendorID in Vendors) { var vendor = _vendorRepo.GetSingle(c => c.VendorID == vendorID); log.InfoFormat("Starting processing for {0}", vendor.Name); #region Initialize vendor dependent inmemory collections var brandVendors = _brandVendorRepo.GetAll(b => (b.VendorID == vendor.VendorID || (vendor.ParentVendorID.HasValue && b.VendorID == vendor.ParentVendorID))).ToList(); var currentVendorProductGroups = _productGroupVendorRepo.GetAll(v => v.VendorID == vendor.VendorID).ToList(); var productGroupVendors = _productGroupVendorRepo.GetAll(g => (g.VendorID == vendor.VendorID || (vendor.ParentVendorID.HasValue && g.VendorID == vendor.VendorID))).ToList(); var vendorassortments = _assortmentRepo.GetAll(x => x.VendorID == vendor.VendorID).ToList(); var medias = _mediaRepo.GetAll().ToList(); var productDescriptions = _prodDescriptionRepo.GetAll().ToList(); var vendorStocks = _stockRepo.GetAll(c => c.VendorID == vendorID).ToList(); #endregion log.InfoFormat("About to process {0} products", importProducts.Count); int counter = 0; int total = importProducts.Count(); int totalNumberOfProductsToProcess = total; log.InfoFormat("Start import {0} products", total); foreach (var product in importProducts) { if (counter == 50) { counter = 0; log.InfoFormat("Still need to process {0} of {1}; {2} done;", totalNumberOfProductsToProcess, total, total - totalNumberOfProductsToProcess); } totalNumberOfProductsToProcess--; counter++; string vendorBrandCode = "Sennheiser"; if (!string.IsNullOrEmpty(product.MainCategory)) { vendorBrandCode = int.Parse(product.MainCategory.Substring(1, 3)) < 8 ? "Sennheiser" : product.MainCategory.Substring(4).Replace("$'", "").Trim(); } int BrandID; #region Brands var brandVendor = brandVendors.FirstOrDefault(c => c.VendorBrandCode == vendorBrandCode.Trim()); if (brandVendor == null) { Brand brand = brands.FirstOrDefault(c => c.Name == vendorBrandCode); brandVendor = new BrandVendor() { BrandID = brand == null ? unmappedID : brand.BrandID, VendorID = vendorID, VendorBrandCode = vendorBrandCode, Name = vendorBrandCode }; _brandVendorRepo.Add(brandVendor); brandVendors.Add(brandVendor); } BrandID = brandVendor.BrandID; #endregion #region product and assortment var productIsExisting = false; var productEntity = products.FirstOrDefault(c => c.VendorItemNumber == product.VendorItemNumber); if (productEntity == null) { //productIsExisting = false; productEntity = new Product() { VendorItemNumber = product.VendorItemNumber, BrandID = brandVendor.BrandID, SourceVendorID = vendorID }; _productRepo.Add(productEntity); products.Add(productEntity); } productEntity.BrandID = BrandID; bool assortmentIsExisting = true; var vendorAssortment = vendorassortments.FirstOrDefault(c => c.Product.VendorItemNumber == product.VendorItemNumber && c.VendorID == vendorID); if (vendorAssortment == null) { assortmentIsExisting = false; vendorAssortment = new VendorAssortment() { VendorID = vendorID, Product = productEntity, IsActive = true, CustomItemNumber = product.CustomItemNumber }; _assortmentRepo.Add(vendorAssortment); vendorassortments.Add(vendorAssortment); } vendorAssortment.CustomItemNumber = product.CustomItemNumber; vendorAssortment.LongDescription = string.Empty; vendorAssortment.ShortDescription = string.Empty; #endregion #region Vendor stock --> insert empty stock var vendorStock = vendorStocks.FirstOrDefault(c => c.VendorID == vendorID && c.Product.VendorItemNumber == product.VendorItemNumber); //create vendorPrice with vendorAssortmentID if (vendorStock == null) { vendorStock = new VendorStock { Product = productEntity, QuantityOnHand = 0, VendorID = vendorID, VendorStockTypeID = 1 }; vendorStocks.Add(vendorStock); _stockRepo.Add(vendorStock); } #endregion if (firstVendor) { #region Product description var productDescription = productDescriptions.FirstOrDefault(pd => pd.Product.VendorItemNumber == product.VendorItemNumber && pd.LanguageID == 1 && (pd.VendorID == vendor.VendorID || (vendor.ParentVendorID.HasValue && pd.VendorID == vendor.VendorID))); if (productDescription == null) { //create ProductDescription productDescription = new ProductDescription { Product = productEntity, LanguageID = languageID, VendorID = vendorID, }; _prodDescriptionRepo.Add(productDescription); productDescriptions.Add(productDescription); } if (string.IsNullOrEmpty(productDescription.ProductName)) { productDescription.ProductName = product.CustomItemNumber.ToString(); productDescription.ModelName = product.CustomItemNumber.ToString(); } if (string.IsNullOrEmpty(productDescription.ShortContentDescription)) { productDescription.ShortContentDescription = product.ShortContentDescription.Cap(1000); } if (string.IsNullOrEmpty(productDescription.ShortSummaryDescription)) { productDescription.ShortSummaryDescription = product.ShortContentDescription.Cap(1000); } if (string.IsNullOrEmpty(productDescription.LongContentDescription)) { productDescription.LongContentDescription = product.LongContentDescription; } if (string.IsNullOrEmpty(productDescription.LongSummaryDescription)) { productDescription.LongSummaryDescription = product.LongContentDescription; } if (string.IsNullOrEmpty(productDescription.WarrantyInfo)) { productDescription.WarrantyInfo = "2 years warranty"; } #endregion #region Product images if (product.ProductMedia != null) { int imageSequence = 0; foreach (var image in product.ProductMedia.OrderByDescending(x => x.Description == "ProductImage").OrderByDescending(x => x.Description == "ProductImageNew")) { if (!string.IsNullOrEmpty(image.MediaUrl)) { var productImage = medias.FirstOrDefault(pd => (pd.VendorID == vendor.VendorID || (vendor.ParentVendorID.HasValue && pd.VendorID == vendor.VendorID)) && pd.MediaUrl == image.MediaUrl && pd.Product == productEntity); if (productImage == null) { //create ProductDescription productImage = new ProductMedia { Product = productEntity, MediaUrl = image.MediaUrl, VendorID = vendorID }; _mediaRepo.Add(productImage); medias.Add(productImage); } productImage.Sequence = imageSequence; productImage.MediaType = imageMediaType; productImage.Description = image.Description; imageSequence++; } } } if (product.OtherMedia != null) { int productMediaSequence = 0; foreach (var media in product.OtherMedia.OrderByDescending(x => x.Description.Contains("Instruction")).OrderByDescending(x => x.Description.Contains("Sheet"))) { string fileType = media.MediaUrl.Substring(media.MediaUrl.Length - 3).ToLower(); var mediaType = mediaTypes.FirstOrDefault(c => c.Type.ToLower() == fileType); if (mediaType == null) { mediaType = new MediaType() { Type = fileType }; _mediaTypeRepo.Add(mediaType); mediaTypes.Add(mediaType); } if (!string.IsNullOrEmpty(media.MediaUrl)) { var productImage = medias.FirstOrDefault(pd => (pd.VendorID == vendor.VendorID || (vendor.ParentVendorID.HasValue && pd.VendorID == vendor.VendorID)) && pd.MediaUrl == media.MediaUrl); if (productImage == null) { //create ProductDescription productImage = new ProductMedia { Product = productEntity, MediaUrl = media.MediaUrl, VendorID = vendorID }; _mediaRepo.Add(productImage); medias.Add(productImage); } productImage.Sequence = productMediaSequence; productImage.MediaType = mediaType; productImage.Description = media.Description; productMediaSequence++; } } } #endregion if (!productIsExisting) { #region Product attribute //add the mandatory gurantee supplier product.Attributes.Add(new SennHeiserAttribute { AttributeCode = "Guarantee", AttributeGroupCode = "GuaranteeSupplier", AttributeValue = "Sennheiser" }); product.Attributes.Add(new SennHeiserAttribute { AttributeCode = "ProductUrl", AttributeGroupCode = "General", AttributeValue = product.Url }); int keyFeatures = 0; int features = 0; int DeliveryIncludes = 0; foreach (var content in product.Attributes) { if (content == null) { continue; } #region ProductAttributeGroupMetaData var productAttributeGroupMetaData = _attrGroupRepo.GetSingle(c => c.GroupCode == content.AttributeGroupCode && (c.VendorID == vendor.VendorID || (vendor.ParentVendorID.HasValue && c.VendorID == vendor.VendorID))); //create ProductAttributeGroupMetaData if not exists if (productAttributeGroupMetaData == null) { productAttributeGroupMetaData = new ProductAttributeGroupMetaData { Index = 0, GroupCode = content.AttributeGroupCode, VendorID = vendorID }; _attrGroupRepo.Add(productAttributeGroupMetaData); } #endregion #region ProductAttributeGroupName if (productAttributeGroupMetaData.ProductAttributeGroupNames == null) { productAttributeGroupMetaData.ProductAttributeGroupNames = new List <ProductAttributeGroupName>(); } var productAttributeGroupName = productAttributeGroupMetaData.ProductAttributeGroupNames.FirstOrDefault(c => c.LanguageID == languageID); //create ProductAttributeGroupName if not exists if (productAttributeGroupName == null) { productAttributeGroupName = new ProductAttributeGroupName { Name = content.AttributeGroupCode, ProductAttributeGroupMetaData = productAttributeGroupMetaData, LanguageID = languageID }; _attrGroupName.Add(productAttributeGroupName); } #endregion #region ProductAttributeMetaData //create ProductAttributeMetaData as many times that there are entrys in technicaldata string attributeCode = content.AttributeCode; if (content.AttributeCode == "KeyFeatures") { if (keyFeatures > 0) { attributeCode = attributeCode + keyFeatures.ToString(); } keyFeatures++; } else if (content.AttributeCode == "Features") { if (features > 0) { attributeCode = attributeCode + features.ToString(); } features++; } else if (content.AttributeCode == "DeliveryIncludes") { if (DeliveryIncludes > 0) { attributeCode = attributeCode + DeliveryIncludes.ToString(); } DeliveryIncludes++; } var productAttributeMetaData = _attrRepo.GetSingle(x => x.AttributeCode == attributeCode && (x.VendorID == vendor.VendorID || (vendor.ParentVendorID.HasValue && x.VendorID == vendor.VendorID))); //create ProductAttributeMetaData if not exists if (productAttributeMetaData == null) { productAttributeMetaData = new ProductAttributeMetaData { ProductAttributeGroupMetaData = productAttributeGroupMetaData, AttributeCode = attributeCode, Index = 0, IsVisible = true, NeedsUpdate = true, VendorID = vendorID, IsSearchable = false }; _attrRepo.Add(productAttributeMetaData); } #endregion #region ProductAttributeName if (productAttributeMetaData.ProductAttributeNames == null) { productAttributeMetaData.ProductAttributeNames = new List <ProductAttributeName>(); } var productAttributeName = productAttributeMetaData.ProductAttributeNames.FirstOrDefault(c => c.LanguageID == languageID); //create ProductAttributeName if not exists if (productAttributeName == null) { productAttributeName = new ProductAttributeName { ProductAttributeMetaData = productAttributeMetaData, LanguageID = languageID }; _attrNameRepo.Add(productAttributeName); } productAttributeName.Name = productAttributeName.Name.IfNullOrEmpty(content.AttributeCode); #endregion #region ProductAttributeValue if (productAttributeMetaData.ProductAttributeValues == null) { productAttributeMetaData.ProductAttributeValues = new List <ProductAttributeValue>(); } var productAttributeValue = productAttributeMetaData.ProductAttributeValues.FirstOrDefault(c => c.Product.VendorItemNumber == productEntity.VendorItemNumber && c.LanguageID == languageID); //create ProductAttributeValue if (productAttributeValue == null) { productAttributeValue = new ProductAttributeValue { ProductAttributeMetaData = productAttributeMetaData, Product = productEntity, LanguageID = languageID }; _attrValueRepo.Add(productAttributeValue); } productAttributeValue.Value = content.AttributeValue; #endregion } #endregion } #region Related products var allRelatedItems = product.Variants; allRelatedItems.AddRange(product.Accessoires); foreach (var relatedProduct in allRelatedItems) { var relatedProductEntity = products.FirstOrDefault(c => c.VendorItemNumber == relatedProduct.VendorItemNumber); if (relatedProductEntity == null) { relatedProductEntity = new Product { VendorItemNumber = relatedProduct.VendorItemNumber, BrandID = BrandID, SourceVendorID = vendorID }; _productRepo.Add(relatedProductEntity); products.Add(relatedProductEntity); log.DebugFormat("New product inserted: {0}", relatedProduct.VendorItemNumber); unit.Save(); } //relatedProductEntity.BrandID = BrandID; var assortment = vendorassortments.FirstOrDefault(c => c.Product.VendorItemNumber == relatedProduct.VendorItemNumber && c.VendorID == vendorID); if (assortment == null) { assortment = new VendorAssortment { Product = relatedProductEntity, CustomItemNumber = relatedProduct.CustomItemNumber, VendorID = vendorID, IsActive = true }; vendorassortments.Add(assortment); _assortmentRepo.Add(assortment); } var vendorStockRelated = vendorStocks.FirstOrDefault(c => c.Product.VendorItemNumber == relatedProduct.VendorItemNumber && c.VendorID == vendorID); if (vendorStockRelated == null) { vendorStockRelated = new VendorStock { Product = relatedProductEntity, QuantityOnHand = 0, VendorID = vendorID, VendorStockTypeID = 1 }; vendorStocks.Add(vendorStockRelated); _stockRepo.Add(vendorStockRelated); } var descriptionEntity = productDescriptions.FirstOrDefault(c => c.Product.VendorItemNumber == relatedProduct.VendorItemNumber && c.LanguageID == languageID && c.VendorID == vendorID); if (descriptionEntity == null) { descriptionEntity = new ProductDescription() { LanguageID = languageID, Product = relatedProductEntity, ProductName = relatedProduct.CustomItemNumber, ShortContentDescription = relatedProduct.Description, ModelName = relatedProduct.Designation, VendorID = vendor.VendorID }; _prodDescriptionRepo.Add(descriptionEntity); productDescriptions.Add(descriptionEntity); } if (productEntity.RelatedProductsSource == null) { productEntity.RelatedProductsSource = new List <RelatedProduct>(); } var relatedProductActual = productEntity.RelatedProductsSource.FirstOrDefault(c => c.RProduct.VendorItemNumber == relatedProduct.VendorItemNumber && c.VendorID == vendorID); if (relatedProductActual == null) { relatedProductActual = new RelatedProduct() { SourceProduct = productEntity, RProduct = relatedProductEntity, VendorID = vendorID, RelatedProductType = relatedProduct.IsVariant ? relatedProductTypeVariant : relatedProductTypeAccessory }; _relatedProductRepo.Add(relatedProductActual); productEntity.RelatedProductsSource.Add(relatedProductActual); } } #endregion } unit.Save(); } //unit.Save(); log.InfoFormat("Finished processing {0} products for vendor {1}", importProducts.Count, vendor.Name); firstVendor = false; } }
private void ParseDocuments(IUnitOfWork unit, XDocument[] products, XDocument cont) { #region Xml Data //products = new XDocument[1]; //products[0] = XDocument.Load(@"C:\Lenmar\test.xml"); var itemContent = (from content in cont.Root.Elements("item") let attributes = content.Elements().Where(x => AttributeMapping.Contains(x.Name.LocalName)) where content.Element("LenmarSKU") != null && content.Element("Description") != null && content.Element("Manufacturer") != null select new { LenmarSKU = content.Element("LenmarSKU").Value, ShortContentDescription = content.Element("Description").Value, GroupCode = content.Element("Manufacturer").Value, CostPrice = content.Element("BC_euro_cost") != null ? content.Element("BC_euro_cost").Value : "0", dynamic = attributes }).ToList(); XNamespace xName = "http://logictec.com/schemas/internaldocuments"; var itemProducts = (from d in products from itemproduct in d.Elements(xName + "Envelope").Elements("Messages").Elements(xName + "Price") let c = itemContent.Where(x => x.LenmarSKU == itemproduct.Element("SupplierSku").Value).FirstOrDefault() select new { VendorBrandCode = itemproduct.Element("MfgName").Value, VendorName = itemproduct.Element("MfgName").Value, SupplierSKU = itemproduct.Element("SupplierSku").Value, CustomItemNr = itemproduct.Element("MfgSKU").Value, ShortDescription = itemproduct.Element("ProductName").Value, Price = itemproduct.Element("MSRP").Value, Status = itemproduct.Element("Active").Value, CostPrice = c != null ? c.CostPrice : itemproduct.Element("Price").Value, QuantityOnHand = itemproduct.Element("Inventory").Value, VendorProductGroupCode1 = itemproduct.Element("Category1").Value, VendorProductGroupCode2 = itemproduct.Element("Category2").Value, VendorProductGroupCode3 = itemproduct.Element("Category3").Value, VendorProductGroupCode4 = itemproduct.Element("Category4").Value, VendorProductGroupCode5 = itemproduct.Element("Category5").Value, Barcode = itemproduct.Element("UPCCode").Value, ShortContentDescription = c != null ? c.ShortContentDescription : string.Empty }).ToList(); #endregion var _brandVendorRepo = unit.Scope.Repository <BrandVendor>(); var _productRepo = unit.Scope.Repository <Product>(); var _assortmentRepo = unit.Scope.Repository <VendorAssortment>(); var productGroupVendorRepo = unit.Scope.Repository <ProductGroupVendor>(); var _prodDescriptionRepo = unit.Scope.Repository <ProductDescription>(); var _attrGroupRepo = unit.Scope.Repository <ProductAttributeGroupMetaData>(); var _attrGroupName = unit.Scope.Repository <ProductAttributeGroupName>(); var _attrRepo = unit.Scope.Repository <ProductAttributeMetaData>(); var _attrNameRepo = unit.Scope.Repository <ProductAttributeName>(); var _attrValueRepo = unit.Scope.Repository <ProductAttributeValue>(); var _mediaRepo = unit.Scope.Repository <ProductMedia>(); var _priceRepo = unit.Scope.Repository <VendorPrice>(); var _stockRepo = unit.Scope.Repository <VendorStock>(); var _barcodeRepo = unit.Scope.Repository <ProductBarcode>(); var brands = _brandVendorRepo.GetAll(bv => bv.VendorID == VendorID).ToList(); var productGroups = productGroupVendorRepo.GetAll(g => g.VendorID == VendorID).ToList(); var productAttributes = _attrRepo.GetAll(g => g.VendorID == VendorID).ToList(); var productAttributeGroups = _attrGroupRepo.GetAll().ToList(); var currentProductGroupVendors = productGroupVendorRepo.GetAll(g => g.VendorID == VendorID).ToList(); ProductStatusVendorMapper mapper = new ProductStatusVendorMapper(unit.Scope.Repository <VendorProductStatus>(), VendorID); var unusedVendorAssortmentItems = _assortmentRepo.GetAll(x => x.VendorID == VendorID && x.IsActive == true).ToList(); int counter = 0; int total = itemProducts.Count(); int totalNumberOfProductsToProcess = total; log.InfoFormat("Start import {0} products", total); foreach (var product in itemProducts) { if (counter == 50) { counter = 0; log.InfoFormat("Still need to process {0} of {1}; {2} done;", totalNumberOfProductsToProcess, total, total - totalNumberOfProductsToProcess); } totalNumberOfProductsToProcess--; counter++; try { #region BrandVendor Product prod = null; //check if brandvendor exists in db var brandVendor = brands.FirstOrDefault(vb => vb.VendorBrandCode == product.VendorBrandCode); if (brandVendor == null) //if brandvendor does not exist { //create new brandVendor brandVendor = new BrandVendor { BrandID = unmappedID, VendorID = VendorID, VendorBrandCode = product.VendorBrandCode, Name = product.VendorBrandCode }; _brandVendorRepo.Add(brandVendor); brands.Add(brandVendor); } //use BrandID to create product and retreive ProductID var BrandID = brandVendor.BrandID; var prods = _productRepo.GetAll(p => p.VendorItemNumber == product.SupplierSKU && (p.BrandID == BrandID || p.BrandID < 0)).ToList(); prod = prods.OrderByDescending(x => x.BrandID).FirstOrDefault(); if (prods.Count() > 1) { try { _stockRepo.Delete(prods.Where(x => x.BrandID < 0).SelectMany(x => x.VendorStocks)); unit.Save(); _productRepo.Delete(prods.Where(x => x.BrandID < 0)); unit.Save(); } catch (Exception ex) { } } //if product does not exist (usually true) if (prod == null) { prod = new Product { VendorItemNumber = product.SupplierSKU, SourceVendorID = VendorID }; _productRepo.Add(prod); } prod.BrandID = BrandID; unit.Save(); #endregion #region VendorAssortMent var productID = prod.ProductID; if (prod.VendorAssortments == null) { prod.VendorAssortments = new List <VendorAssortment>(); } var vendorAssortment = prod.VendorAssortments.FirstOrDefault(va => va.VendorID == VendorID); //if vendorAssortMent does not exist if (vendorAssortment == null) { //create vendorAssortMent with productID vendorAssortment = new VendorAssortment { Product = prod, CustomItemNumber = product.CustomItemNr, VendorID = VendorID }; _assortmentRepo.Add(vendorAssortment); } vendorAssortment.IsActive = true; vendorAssortment.ShortDescription = product.ShortDescription.Length > 150 ? product.ShortDescription.Substring(0, 150) : product.ShortDescription; vendorAssortment.LongDescription = ""; unusedVendorAssortmentItems.Remove(vendorAssortment); #endregion #region VendorPrice if (vendorAssortment.VendorPrices == null) { vendorAssortment.VendorPrices = new List <VendorPrice>(); } var vendorPrice = vendorAssortment.VendorPrices.FirstOrDefault(); //create vendorPrice with vendorAssortmentID if (vendorPrice == null) { vendorPrice = new VendorPrice { VendorAssortment = vendorAssortment }; _priceRepo.Add(vendorPrice); } vendorPrice.Price = Decimal.Parse(product.Price) / 119; vendorPrice.TaxRate = (Decimal)19.00; vendorPrice.CommercialStatus = product.Status; vendorPrice.MinimumQuantity = 0; vendorPrice.CostPrice = Decimal.Parse(product.CostPrice) / 100; vendorPrice.ConcentratorStatusID = mapper.SyncVendorStatus(product.Status, -1); #endregion #region VendorStock //var vendorStock = vendorAssortment.VendorStock.FirstOrDefault(); var vendorStock = _stockRepo.GetSingle(c => c.ProductID == vendorAssortment.ProductID && c.VendorID == vendorAssortment.VendorID); //create vendorStock with productID if (vendorStock == null) { vendorStock = new VendorStock { Product = prod }; _stockRepo.Add(vendorStock); } vendorStock.StockStatus = product.Status; vendorStock.QuantityOnHand = int.Parse(product.QuantityOnHand); vendorStock.VendorID = VendorID; vendorStock.VendorStockTypeID = 1; vendorStock.VendorStatus = product.Status; vendorStock.ConcentratorStatusID = mapper.SyncVendorStatus(product.Status, -1); #endregion #region ProductGroupVendor //var vendorProductGroupAssortments = (from c in context.VendorProductGroupAssortments // where // c.VendorAssortment == vendorAssortment // select c).ToList(); //create vendorGroup five times, each time with a different VendorProductGroupCode on a different level if not exist string vendorProductGroupCode1 = string.IsNullOrEmpty(product.VendorProductGroupCode1) ? "Battery" : product.VendorProductGroupCode1; var productGroupVendor1 = productGroups.FirstOrDefault(pg => pg.VendorProductGroupCode1 == vendorProductGroupCode1); if (productGroupVendor1 == null) { productGroupVendor1 = new ProductGroupVendor { ProductGroupID = unmappedID, VendorID = VendorID, VendorName = product.VendorName, VendorProductGroupCode1 = vendorProductGroupCode1, VendorAssortments = new List <VendorAssortment>() }; productGroupVendorRepo.Add(productGroupVendor1); productGroups.Add(productGroupVendor1); } #region sync if (currentProductGroupVendors.Contains(productGroupVendor1)) { currentProductGroupVendors.Remove(productGroupVendor1); } #endregion if (!productGroupVendor1.VendorAssortments.Any(c => c == vendorAssortment)) { productGroupVendor1.VendorAssortments.Add(vendorAssortment); } if (!string.IsNullOrEmpty(product.VendorProductGroupCode2)) { var productGroupVendor2 = productGroups.FirstOrDefault(pg => pg.VendorProductGroupCode2 == product.VendorProductGroupCode2); if (productGroupVendor2 == null) { productGroupVendor2 = new ProductGroupVendor { ProductGroupID = unmappedID, VendorID = VendorID, VendorName = product.VendorName, VendorProductGroupCode2 = product.VendorProductGroupCode2, VendorAssortments = new List <VendorAssortment>() }; productGroupVendorRepo.Add(productGroupVendor2); productGroups.Add(productGroupVendor2); } #region sync if (currentProductGroupVendors.Contains(productGroupVendor2)) { currentProductGroupVendors.Remove(productGroupVendor2); } #endregion var vendorProductGroupAssortment2 = productGroupVendor2.VendorAssortments.FirstOrDefault(c => c.VendorAssortmentID == vendorAssortment.VendorAssortmentID); if (vendorProductGroupAssortment2 == null) { productGroupVendor2.VendorAssortments.Add(vendorAssortment); } } if (!string.IsNullOrEmpty(product.VendorProductGroupCode3)) { var productGroupVendor3 = productGroups.FirstOrDefault(pg => pg.VendorProductGroupCode3 == product.VendorProductGroupCode3); if (productGroupVendor3 == null) { productGroupVendor3 = new ProductGroupVendor { ProductGroupID = unmappedID, VendorID = VendorID, VendorName = product.VendorName, VendorProductGroupCode3 = product.VendorProductGroupCode3, VendorAssortments = new List <VendorAssortment>() }; productGroupVendorRepo.Add(productGroupVendor3); productGroups.Add(productGroupVendor3); } #region sync if (currentProductGroupVendors.Contains(productGroupVendor3)) { currentProductGroupVendors.Remove(productGroupVendor3); } #endregion var vendorProductGroupAssortment3 = productGroupVendor3.VendorAssortments.FirstOrDefault(c => c.VendorAssortmentID == vendorAssortment.VendorAssortmentID); if (vendorProductGroupAssortment3 == null) { productGroupVendor3.VendorAssortments.Add(vendorAssortment); } } if (!string.IsNullOrEmpty(product.VendorProductGroupCode4)) { var productGroupVendor4 = productGroups.FirstOrDefault(pg => pg.VendorProductGroupCode4 == product.VendorProductGroupCode4); if (productGroupVendor4 == null) { productGroupVendor4 = new ProductGroupVendor { ProductGroupID = unmappedID, VendorID = VendorID, VendorName = product.VendorName, VendorProductGroupCode4 = product.VendorProductGroupCode4, VendorAssortments = new List <VendorAssortment>() }; productGroupVendorRepo.Add(productGroupVendor4); productGroups.Add(productGroupVendor4); } #region sync if (currentProductGroupVendors.Contains(productGroupVendor4)) { currentProductGroupVendors.Remove(productGroupVendor4); } #endregion var vendorProductGroupAssortment4 = productGroupVendor4.VendorAssortments.FirstOrDefault(c => c.VendorAssortmentID == vendorAssortment.VendorAssortmentID); if (vendorProductGroupAssortment4 == null) { productGroupVendor4.VendorAssortments.Add(vendorAssortment); } } if (!string.IsNullOrEmpty(product.VendorProductGroupCode5)) { var productGroupVendor5 = productGroups.FirstOrDefault(pg => pg.VendorProductGroupCode5 == product.VendorProductGroupCode5); if (productGroupVendor5 == null) { productGroupVendor5 = new ProductGroupVendor { ProductGroupID = unmappedID, VendorID = VendorID, VendorName = product.VendorName, VendorProductGroupCode5 = product.VendorProductGroupCode5, VendorAssortments = new List <VendorAssortment>() }; productGroupVendorRepo.Add(productGroupVendor5); productGroups.Add(productGroupVendor5); } #region sync if (currentProductGroupVendors.Contains(productGroupVendor5)) { currentProductGroupVendors.Remove(productGroupVendor5); } #endregion var vendorProductGroupAssortment5 = productGroupVendor5.VendorAssortments.FirstOrDefault(c => c.VendorAssortmentID == vendorAssortment.VendorAssortmentID); if (vendorProductGroupAssortment5 == null) { productGroupVendor5.VendorAssortments.Add(vendorAssortment); } } if (!string.IsNullOrEmpty(product.VendorBrandCode)) { var brandProductGroupvendor = productGroups.FirstOrDefault(pg => pg.BrandCode == product.VendorBrandCode && pg.VendorProductGroupCode1 == null && pg.VendorProductGroupCode2 == null && pg.VendorProductGroupCode3 == null && pg.VendorProductGroupCode4 == null && pg.VendorProductGroupCode5 == null); if (brandProductGroupvendor == null) { brandProductGroupvendor = new ProductGroupVendor { ProductGroupID = unmappedID, VendorID = VendorID, VendorName = product.VendorName, BrandCode = product.VendorBrandCode }; productGroupVendorRepo.Add(brandProductGroupvendor); productGroups.Add(brandProductGroupvendor); } #region sync if (currentProductGroupVendors.Contains(brandProductGroupvendor)) { currentProductGroupVendors.Remove(brandProductGroupvendor); } #endregion var brandProductGroupAssortment = brandProductGroupvendor.VendorAssortments.FirstOrDefault(c => c.VendorAssortmentID == vendorAssortment.VendorAssortmentID); if (brandProductGroupAssortment == null) { brandProductGroupvendor.VendorAssortments.Add(vendorAssortment); } } #endregion #region ProductBarcode if (prod.ProductBarcodes == null) { prod.ProductBarcodes = new List <ProductBarcode>(); } if (!prod.ProductBarcodes.Any(pb => pb.Barcode.Trim() == product.Barcode)) { //create ProductBarcode if not exists _barcodeRepo.Add(new ProductBarcode { Product = prod, Barcode = product.Barcode, VendorID = VendorID, BarcodeType = (int)BarcodeTypes.Default }); } #endregion #region ProductDescription if (prod.ProductDescriptions == null) { prod.ProductDescriptions = new List <ProductDescription>(); } var productDescription = prod.ProductDescriptions.FirstOrDefault(pd => pd.LanguageID == languageID && pd.VendorID == VendorID); if (productDescription == null) { //create ProductDescription productDescription = new ProductDescription { Product = prod, LanguageID = languageID, VendorID = VendorID }; _prodDescriptionRepo.Add(productDescription); } productDescription.ShortContentDescription = product.ShortContentDescription; #endregion foreach (var content in itemContent.Where(x => x.LenmarSKU == product.SupplierSKU)) { #region ProductAttributeGroupMetaData var productAttributeGroupMetaData = productAttributeGroups.FirstOrDefault(c => c.GroupCode == content.GroupCode); //create ProductAttributeGroupMetaData if not exists if (productAttributeGroupMetaData == null) { productAttributeGroupMetaData = new ProductAttributeGroupMetaData { Index = 0, GroupCode = content.GroupCode, VendorID = VendorID }; _attrGroupRepo.Add(productAttributeGroupMetaData); productAttributeGroups.Add(productAttributeGroupMetaData); } #endregion #region ProductAttributeGroupName if (productAttributeGroupMetaData.ProductAttributeGroupNames == null) { productAttributeGroupMetaData.ProductAttributeGroupNames = new List <ProductAttributeGroupName>(); } var productAttributeGroupName = productAttributeGroupMetaData.ProductAttributeGroupNames.FirstOrDefault(c => c.LanguageID == languageID); //create ProductAttributeGroupName if not exists if (productAttributeGroupName == null) { productAttributeGroupName = new ProductAttributeGroupName { Name = "General", ProductAttributeGroupMetaData = productAttributeGroupMetaData, LanguageID = languageID }; _attrGroupName.Add(productAttributeGroupName); } #endregion #region ProductAttributeMetaData //create ProductAttributeMetaData as many times that there are entrys in content.dynamic foreach (var element in content.dynamic) { var productAttributeMetaData = productAttributes.FirstOrDefault(c => c.AttributeCode == element.Name.ToString()); //create ProductAttributeMetaData if not exists if (productAttributeMetaData == null) { productAttributeMetaData = new ProductAttributeMetaData { ProductAttributeGroupMetaData = productAttributeGroupMetaData, AttributeCode = element.Name.ToString(), Index = 0, IsVisible = true, NeedsUpdate = true, VendorID = VendorID, IsSearchable = false }; _attrRepo.Add(productAttributeMetaData); productAttributes.Add(productAttributeMetaData); } #endregion #region ProductAttributeName if (productAttributeMetaData.ProductAttributeNames == null) { productAttributeMetaData.ProductAttributeNames = new List <ProductAttributeName>(); } var productAttributeName = productAttributeMetaData.ProductAttributeNames.FirstOrDefault(c => c.LanguageID == languageID); //create ProductAttributeName with generated productAttributeMetaData.AttributeID if not exists if (productAttributeName == null) { productAttributeName = new ProductAttributeName { ProductAttributeMetaData = productAttributeMetaData, LanguageID = languageID, Name = element.Name.ToString() }; _attrNameRepo.Add(productAttributeName); } #endregion #region ProductAttributeValue if (productAttributeMetaData.ProductAttributeValues == null) { productAttributeMetaData.ProductAttributeValues = new List <ProductAttributeValue>(); } var productAttributeValue = productAttributeMetaData.ProductAttributeValues.FirstOrDefault(c => c.ProductID == prod.ProductID); //create ProductAttributeValue with generated productAttributeMetaData.AttributeID if (productAttributeValue == null) { productAttributeValue = new ProductAttributeValue { ProductAttributeMetaData = productAttributeMetaData, Product = prod, Value = element.Value, LanguageID = languageID }; _attrValueRepo.Add(productAttributeValue); } #endregion } } unit.Save(); } catch (Exception ex) { log.ErrorFormat("product: {0} error: {1}", product.SupplierSKU, ex.StackTrace); } } #region delete unused vendorProductGroups foreach (var vProdVendor in currentProductGroupVendors) { if (vProdVendor.ProductGroupID == -1) { productGroupVendorRepo.Add(vProdVendor); } } unit.Save(); unusedVendorAssortmentItems.ForEach(x => x.IsActive = false); unit.Save(); #endregion }
private void DoProcess(List <TrdPartyProductModel> data, List <Attributes> atts, Objects.DataAccess.UnitOfWork.IUnitOfWork unit) { var config = GetConfiguration(); var vendorID_NL = vendors.First(x => x.Value == "NL").Key; var vendorID_BE = vendors.First(x => x.Value == "BE").Key; var repoBrandVendor = unit.Scope.Repository <BrandVendor>(); var prodRepo = unit.Scope.Repository <Product>().Include(c => c.ProductMedias, c => c.ProductBarcodes, c => c.ProductDescriptions); var productAttributeGroups = unit.Scope.Repository <ProductAttributeGroupMetaData>().GetAll(g => g.VendorID == vendorID_NL || g.VendorID == vendorID_BE).ToList(); var repoAssortment = unit.Scope.Repository <VendorAssortment>().Include(c => c.VendorPrices); var stockRepo = unit.Scope.Repository <VendorStock>(); var repoAttributeGroup = unit.Scope.Repository <ProductAttributeGroupMetaData>(); var repoAttributeGroupName = unit.Scope.Repository <ProductAttributeGroupName>(); var repoAttributeValue = unit.Scope.Repository <ProductAttributeValue>(); var repotAttributeName = unit.Scope.Repository <ProductAttributeName>(); var repoAttribute = unit.Scope.Repository <ProductAttributeMetaData>().Include(c => c.ProductAttributeNames, c => c.ProductAttributeValues); var repoVendor = unit.Scope.Repository <ProductGroupVendor>(); var prodDescriptionRepo = unit.Scope.Repository <ProductDescription>(); var priceRepo = unit.Scope.Repository <VendorPrice>(); var productGroupLanguageRepo = unit.Scope.Repository <ProductGroupLanguage>(); var productGroupMappingRepo = unit.Scope.Repository <ProductGroupMapping>(); //var products = prodRepo.GetAll(x => x.SourceVendorID == VendorID).ToList(); var vendorassortments = repoAssortment.GetAll(x => x.VendorID == vendorID_NL || x.VendorID == vendorID_BE).ToList(); var productAttributes = repoAttribute.GetAll(g => g.VendorID == vendorID_NL || g.VendorID == vendorID_BE).ToList(); var productGroupVendorRecords = repoVendor.GetAll(pc => pc.VendorID == vendorID_NL || pc.VendorID == vendorID_BE).ToList(); var brands = repoBrandVendor.GetAll(bv => bv.VendorID == vendorID_NL || bv.VendorID == vendorID_BE).ToList(); var brandEnts = unit.Scope.Repository <Brand>().GetAll(); var products = prodRepo.GetAll(x => x.SourceVendorID == vendorID_NL || x.SourceVendorID == vendorID_BE).ToList(); var vendorStock = stockRepo.GetAll(x => x.VendorID == vendorID_NL || x.VendorID == vendorID_BE).ToList(); var productDescriptions = prodDescriptionRepo.GetAll().ToList(); var productGroupLanguages = productGroupLanguageRepo.GetAll().ToList(); var prodAttributeGroups = repoAttributeGroup.GetAll(g => g.VendorID == vendorID_NL || g.VendorID == vendorID_BE).ToList(); var productGroupMapping = productGroupMappingRepo.GetAll(x => x.ConnectorID == 2).ToList(); int counter = 0; int total = data.Count(); int totalNumberOfProductsToProcess = total; log.InfoFormat("Start import {0} products", total); bool firstVendor = true; foreach (var VendorID in vendors.Keys) { ProductStatusVendorMapper mapper = new ProductStatusVendorMapper(unit.Scope.Repository <VendorProductStatus>(), VendorID); var vendor = unit.Scope.Repository <Vendor>().GetSingle(x => x.VendorID == VendorID); foreach (var product in data) { if (string.IsNullOrEmpty(product.Artnr)) { continue; } try { if (counter == 100) { counter = 0; log.InfoFormat("Still need to process {0} of {1}; {2} done for {3};", totalNumberOfProductsToProcess, total, total - totalNumberOfProductsToProcess, VendorID); } totalNumberOfProductsToProcess--; counter++; var brand = brandEnts.FirstOrDefault(c => c.Name.ToLower() == product.BrandName.Trim().ToLower()); int brandID = 0; if (brand == null) { var vbrand = brands.FirstOrDefault(vb => vb.VendorBrandCode.Trim() == product.BrandName.Trim()); if (vbrand == null) { vbrand = new BrandVendor { VendorID = VendorID, VendorBrandCode = product.BrandName.Trim(), BrandID = unmappedID, Name = product.BrandName.Trim() }; brands.Add(vbrand); repoBrandVendor.Add(vbrand); } brandID = vbrand.BrandID; } else { brandID = brand.BrandID; } var item = products.FirstOrDefault(p => p.VendorItemNumber.Trim() == product.Artnr.Trim() && p.BrandID == brandID); if (item == null) { item = new Product { VendorItemNumber = product.Artnr.Trim(), BrandID = brandID, SourceVendorID = VendorID }; prodRepo.Add(item); products.Add(item); unit.Save(); } if (firstVendor) { var productDescription = productDescriptions.FirstOrDefault(pd => pd.Product.VendorItemNumber == item.VendorItemNumber && pd.LanguageID == 1 && (pd.VendorID == vendor.VendorID || (vendor.ParentVendorID.HasValue && pd.VendorID == vendor.VendorID))); if (productDescription == null) { //create ProductDescription productDescription = new ProductDescription { Product = item, LanguageID = languageID, VendorID = VendorID, }; prodDescriptionRepo.Add(productDescription); productDescriptions.Add(productDescription); } if (string.IsNullOrEmpty(productDescription.ProductName)) { productDescription.ProductName = product.Product; productDescription.ModelName = product.Product; } if (!string.IsNullOrEmpty(product.ShortDescription)) { productDescription.ShortContentDescription = product.ShortDescription.Cap(1000); } if (string.IsNullOrEmpty(productDescription.LongContentDescription)) { productDescription.LongContentDescription = product.LongDescription; } if (string.IsNullOrEmpty(productDescription.LongSummaryDescription)) { productDescription.LongSummaryDescription = product.LongDescription; } } var assortment = vendorassortments.FirstOrDefault(x => x.Product.VendorItemNumber == item.VendorItemNumber.Trim() && x.VendorID == VendorID); if (assortment == null) { assortment = new VendorAssortment { VendorID = VendorID, Product = item, ShortDescription = product.Try(c => c.ShortDescription.Cap(1000), string.Empty),//.ShortDescription // .Length > 150 ? product.ShortDescription.Substring(0, 150) : product.ShortDescription, CustomItemNumber = product.Artnr.Trim(), IsActive = true, LongDescription = product.LongDescription }; vendorassortments.Add(assortment); repoAssortment.Add(assortment); } var productGroups = new string[4]; productGroups[0] = product.BrandName; productGroups[1] = product.Chapter; productGroups[2] = product.Category; productGroups[3] = product.Subcategory; var pgvs = assortment.ProductGroupVendors != null?assortment.ProductGroupVendors.ToList() : new List <ProductGroupVendor>(); ProductGroupMapping parentpgm = null; for (int i = 0; i < productGroups.Length; i++) { var groupCode = productGroups[i]; if (string.IsNullOrEmpty(groupCode)) { continue; } var productGroup = productGroupLanguages.FirstOrDefault(x => x.Name == groupCode.Trim()); if (productGroup == null) { var pg = new Concentrator.Objects.Models.Products.ProductGroup() { Score = 0 }; unit.Scope.Repository <Concentrator.Objects.Models.Products.ProductGroup>().Add(pg); productGroup = new ProductGroupLanguage() { ProductGroup = pg, LanguageID = 1, Name = groupCode.Trim() }; productGroupLanguages.Add(productGroup); productGroupLanguageRepo.Add(productGroup); unit.Save(); } //var productGroupVendor = productGroupVendorRecords.Where(pg => pg.GetType().GetProperty(string.Format("VendorProductGroupCode{0}", i + 1)).GetValue(pg, null) != null // && pg.GetType().GetProperty(string.Format("VendorProductGroupCode{0}", i + 1)).GetValue(pg, null).ToString() == groupCode.Trim()).FirstOrDefault(); var productGroupVendor = productGroupVendorRecords.FirstOrDefault(x => x.ProductGroupID == productGroup.ProductGroupID); if (productGroupVendor == null) { productGroupVendor = new ProductGroupVendor { ProductGroupID = productGroup.ProductGroupID, VendorID = VendorID, VendorName = groupCode.Trim(), }; productGroupVendor.GetType().GetProperty(string.Format("VendorProductGroupCode{0}", i + 1)).SetValue(productGroupVendor, groupCode.Trim().Cap(50), null); repoVendor.Add(productGroupVendor); productGroupVendorRecords.Add(productGroupVendor); } if (productGroupVendor.VendorAssortments == null) { productGroupVendor.VendorAssortments = new List <VendorAssortment>(); } var assortmentRelation = productGroupVendor.VendorAssortments.Count == 0 ? null : productGroupVendor.VendorAssortments.Where(c => c.Product != null && c.Product.VendorItemNumber == item.VendorItemNumber.Trim() && c.VendorID == VendorID).FirstOrDefault(); if (assortmentRelation == null) { productGroupVendor.VendorAssortments.Add(assortment); } else { pgvs.Remove(productGroupVendor); } if (productGroupVendor.ProductGroupID > 0) { ProductGroupMapping pgm = null; if (parentpgm != null) { pgm = productGroupMapping.FirstOrDefault(x => x.ProductGroupID == productGroupVendor.ProductGroupID && x.ParentProductGroupMappingID == parentpgm.ProductGroupMappingID); } else { pgm = productGroupMapping.FirstOrDefault(x => x.ProductGroupID == productGroupVendor.ProductGroupID); } if (pgm == null) { pgm = new ProductGroupMapping() { ConnectorID = 2, ProductGroupID = productGroupVendor.ProductGroupID, FlattenHierarchy = false, FilterByParentGroup = parentpgm != null ? true : false, Depth = i, Score = 0 }; if (parentpgm != null) { pgm.ParentProductGroupMappingID = parentpgm.ProductGroupMappingID; } unit.Scope.Repository <ProductGroupMapping>().Add(pgm); unit.Save(); productGroupMapping.Add(pgm); } parentpgm = pgm; } } pgvs.ForEach(pg => { productGroupVendorRecords.Remove(pg); }); if (firstVendor) { if (!string.IsNullOrEmpty(product.PriceGroup)) { atts.Add(new Attributes() { AttArtnr = product.Artnr.Trim(), Feature = "PriceGroup", Value = product.PriceGroup }); } if (!string.IsNullOrEmpty(product.Features)) { atts.Add(new Attributes() { AttArtnr = product.Artnr.Trim(), Feature = "Features", Value = product.Features }); } if (!string.IsNullOrEmpty(product.NEW)) { atts.Add(new Attributes() { AttArtnr = product.Artnr.Trim(), Feature = "New", Value = product.NEW }); } var attributes = atts.Where(x => x.AttArtnr != null && (x.AttArtnr.Trim() == product.Artnr.Trim())).ToList(); if (attributes != null && attributes.Count > 0) { foreach (var att in attributes) { string AttributeCode = "General", AttributeGroupCode = att.Feature, AttributeValue = att.Value; if (!string.IsNullOrEmpty(AttributeGroupCode) && !string.IsNullOrEmpty(AttributeValue)) { var productAttributeMetadata = productAttributes.FirstOrDefault(c => c.ProductAttributeNames.Any(l => l.Name == AttributeGroupCode) && c.VendorID == VendorID); if (productAttributeMetadata == null) { productAttributeMetadata = new ProductAttributeMetaData { AttributeCode = att.Feature, Index = 0, IsVisible = true, NeedsUpdate = true, VendorID = VendorID, IsSearchable = false }; productAttributes.Add(productAttributeMetadata); repoAttribute.Add(productAttributeMetadata); } var attributeGroup = productAttributeMetadata.ProductAttributeGroupMetaData; if (attributeGroup == null) { attributeGroup = new ProductAttributeGroupMetaData { Index = 0, GroupCode = "TechnicalData", VendorID = VendorID }; repoAttributeGroup.Add(attributeGroup); productAttributeMetadata.ProductAttributeGroupMetaData = attributeGroup; } productAttributeMetadata.ProductAttributeGroupID = attributeGroup.ProductAttributeGroupID; var attributeGroupName = attributeGroup.ProductAttributeGroupNames.FirstOrDefault(c => c.LanguageID == 1); if (attributeGroupName == null) { attributeGroupName = new ProductAttributeGroupName { Name = AttributeCode, LanguageID = languageID, ProductAttributeGroupMetaData = attributeGroup }; repoAttributeGroupName.Add(attributeGroupName); attributeGroup.ProductAttributeGroupNames.Add(attributeGroupName); } var attributeName = productAttributeMetadata.ProductAttributeNames.FirstOrDefault(c => c.LanguageID == 1); if (attributeName == null) { attributeName = new ProductAttributeName { ProductAttributeMetaData = productAttributeMetadata, LanguageID = 1, Name = AttributeGroupCode }; repotAttributeName.Add(attributeName); productAttributeMetadata.ProductAttributeNames.Add(attributeName); } var attributeValue = productAttributeMetadata.ProductAttributeValues.FirstOrDefault(c => c.Value == AttributeValue && c.ProductID == item.ProductID); if (attributeValue == null && !string.IsNullOrEmpty(AttributeValue)) { attributeValue = new ProductAttributeValue { Value = AttributeValue, ProductAttributeMetaData = productAttributeMetadata, LanguageID = 1, Product = item }; productAttributeMetadata.ProductAttributeValues.Add(attributeValue); repoAttributeValue.Add(attributeValue); } } } } } var stock = vendorStock.FirstOrDefault(c => c.Product.VendorItemNumber == item.VendorItemNumber.Trim() && c.VendorID == VendorID); if (stock == null) { stock = new VendorStock { Product = item, QuantityOnHand = 0, VendorID = VendorID, VendorStockTypeID = 1 }; vendorStock.Add(stock); stockRepo.Add(stock); } if (assortment.VendorPrices == null) { assortment.VendorPrices = new List <VendorPrice>(); } var vendorPrice = assortment.VendorPrices.FirstOrDefault(); //create vendorPrice with vendorAssortmentID if (vendorPrice == null) { vendorPrice = new VendorPrice { VendorAssortment = assortment, CommercialStatus = "S", MinimumQuantity = 0 }; priceRepo.Add(vendorPrice); assortment.VendorPrices.Add(vendorPrice); } decimal taxRate = 19; decimal price = 0; decimal costPrice = 0; switch (vendors[VendorID]) { case "NL": taxRate = 19; Decimal.TryParse(product.VATExclNL, out costPrice); Decimal.TryParse(product.NLincl, out price); break; case "BE": taxRate = 21; Decimal.TryParse(product.VATExclBE, out costPrice); Decimal.TryParse(product.BEincl, out price); break; } vendorPrice.Price = price; vendorPrice.CostPrice = costPrice; vendorPrice.TaxRate = taxRate; if (product.Image != null) { if (item.ProductMedias == null) { item.ProductMedias = new List <ProductMedia>(); } if (!item.ProductMedias.Any(pi => pi.VendorID == VendorID && pi.MediaUrl == product.Image)) { unit.Scope.Repository <ProductMedia>().Add(new ProductMedia { VendorID = VendorID, MediaUrl = product.Image, TypeID = 1, // image Product = item, Sequence = 0 }); } } if (product.EAN != null || product.Barcode != null) { if (item.ProductBarcodes == null) { item.ProductBarcodes = new List <ProductBarcode>(); } if (!item.ProductBarcodes.Any(pb => pb.Barcode.Trim() == product.EAN.Trim())) { unit.Scope.Repository <ProductBarcode>().Add(new ProductBarcode { Product = item, Barcode = product.EAN != null ? product.EAN : product.Barcode != null ? product.Barcode : "", BarcodeType = (int)BarcodeTypes.Default, VendorID = VendorID }); } } } catch (Exception ex) { log.AuditError("Error import products for Sennheiser 3rdParty", ex); } } firstVendor = false; } }
protected override void Import(IDictionary <Models.Stock, String> stockItems) { var vendorStockTypeRepository = Unit.Scope.Repository <VendorStockType>(); var vendorStockTypes = vendorStockTypeRepository.GetAll().ToDictionary(x => x.StockType); foreach (var shopCode in stockItems.Keys.Select(stock => stock.ShopCode).Distinct()) { if (!vendorStockTypes.ContainsKey(shopCode)) { var vendorStockType = new VendorStockType { StockType = shopCode }; vendorStockTypes[shopCode] = vendorStockType; vendorStockTypeRepository.Add(vendorStockType); } } Unit.Save(); var vendorID = Unit.Scope .Repository <Vendor>() .GetSingle(vendor => vendor.Name == Constants.Vendor.Vlisco) .VendorID; var vendorStockRepository = Unit.Scope.Repository <VendorStock>(); foreach (var stockItemsByShopCode in stockItems.Keys.GroupBy(stockItem => stockItem.ShopCode)) { var vendorStockLookup = vendorStockRepository .Include(vendorStock => vendorStock.Product) .Include(vendorStock => vendorStock.VendorStockType) .GetAll(vendorStock => vendorStock.VendorStockType.StockType == stockItemsByShopCode.Key && vendorStock.VendorID == vendorID) .ToDictionary(vendorStock => vendorStock.Product.VendorItemNumber); foreach (var stockItem in stockItemsByShopCode) { var vendorItemNumber = Constants.GetVendorItemNumber(stockItem.ArticleCode, stockItem.ColorCode, stockItem.SizeCode); var vendorStock = default(VendorStock); if (!vendorStockLookup.TryGetValue(vendorItemNumber, out vendorStock)) { var product = Unit.Scope.Repository <Product>().GetSingle(p => p.VendorItemNumber == vendorItemNumber); vendorStock = new VendorStock { ConcentratorStatusID = 1, Product = product, StockStatus = Constants.Status.Default, VendorID = vendorID, VendorStatus = Constants.Status.Default, VendorStockType = vendorStockTypes[stockItemsByShopCode.Key] }; vendorStockRepository.Add(vendorStock); } vendorStock.QuantityOnHand = stockItem.Available; } } Unit.Save(); }
private void ParseDocuments(IUnitOfWork unit, int vendorID, DataSet excel, bool firstRun) { var content = (from p in excel.Tables[0].AsEnumerable().Skip(1) let vpn = p.Field <string>(0) select new { UnpaddedVendorItemNumber = vpn, PaddedVendorItemNumber = vpn.Length <= 6 ? vpn.PadLeft(6, '0') : vpn, Price = p.Field <String>(3), PriceGroup = p.Field <String>(1), EAN = p.Field <String>(2) }).ToList(); int counter = 0; int total = content.Count(); int totalNumberOfProductsToProcess = total; log.InfoFormat("Start import {0} products", total); var attribute = unit.Scope.Repository <ProductAttributeMetaData>().GetSingle(x => x.AttributeCode == "PriceGroup"); foreach (var item in content) { try { if (counter == 50) { counter = 0; log.InfoFormat("Still need to process {0} of {1}; {2} done;", totalNumberOfProductsToProcess, total, total - totalNumberOfProductsToProcess); } totalNumberOfProductsToProcess--; counter++; decimal dec = 0; decimal.TryParse(item.Price, NumberStyles.Any, CultureInfo.InvariantCulture, out dec); if (dec <= 0) { continue; } if (item.Price == String.Empty) { continue; } var _vendorAssortment = unit.Scope.Repository <VendorAssortment>().GetSingle(x => (x.Product.VendorItemNumber == item.PaddedVendorItemNumber || x.Product.VendorItemNumber == item.UnpaddedVendorItemNumber) && x.VendorID == vendorID); if (_vendorAssortment == null) { _vendorAssortment = unit.Scope.Repository <VendorAssortment>().GetSingle(x => (x.Product.VendorItemNumber == item.PaddedVendorItemNumber || x.Product.VendorItemNumber == item.UnpaddedVendorItemNumber)); if (_vendorAssortment == null) { continue; } else { var va = new VendorAssortment() { VendorID = vendorID, ProductID = _vendorAssortment.ProductID, CustomItemNumber = _vendorAssortment.CustomItemNumber, ShortDescription = _vendorAssortment.ShortDescription, LongDescription = _vendorAssortment.LongDescription, IsActive = false, ProductGroupVendors = _vendorAssortment.ProductGroupVendors }; unit.Scope.Repository <VendorAssortment>().Add(va); unit.Save(); _vendorAssortment = va; } } var _vendorPrice = unit.Scope.Repository <VendorPrice>().GetSingle(x => x.VendorAssortmentID == _vendorAssortment.VendorAssortmentID); // Remove trailing zeros and Parsing //String currencyFormat = String.Format("{0:C4}", Decimal.Parse(item.Price.Replace('.', ','))); var costPrice = dec; //Decimal.Parse(currencyFormat, NumberStyles.Currency); var priceWithTax = (costPrice * _taxCalculation); if (_vendorPrice == null) { VendorPrice price = new VendorPrice() { VendorAssortmentID = _vendorAssortment.VendorAssortmentID, Price = priceWithTax, MinimumQuantity = 0, CostPrice = costPrice, TaxRate = _taxRate }; unit.Scope.Repository <VendorPrice>().Add(price); } else { _vendorPrice.CostPrice = costPrice; _vendorPrice.TaxRate = _taxRate; _vendorPrice.Price = null; } var _vendorStock = unit.Scope.Repository <VendorStock>().GetSingle(x => x.ProductID == _vendorAssortment.ProductID && x.VendorID == vendorID); if (_vendorStock == null) { VendorStock stock = new VendorStock() { ProductID = _vendorAssortment.ProductID, VendorID = vendorID, QuantityOnHand = 0, VendorStockTypeID = 1 }; unit.Scope.Repository <VendorStock>().Add(stock); } if (firstRun) { #region Attribute if (!string.IsNullOrEmpty(item.PriceGroup)) { if (attribute == null) { log.AuditCritical("PriceGroup attribute Removed"); } else { var attributevalue = attribute.ProductAttributeValues.FirstOrDefault(x => x.ProductID == _vendorAssortment.ProductID); if (attributevalue == null) { attributevalue = new ProductAttributeValue() { LanguageID = 1, AttributeID = attribute.AttributeID, ProductID = _vendorAssortment.ProductID }; unit.Scope.Repository <ProductAttributeValue>().Add(attributevalue); } attributevalue.Value = item.PriceGroup; } } #endregion //#region Barcode //var productBarcode = unit.Scope.Repository<ProductBarcode>().GetSingle(x => x.ProductID == _vendorAssortment.ProductID && x.BarcodeType == 1); //if (productBarcode == null) //{ // productBarcode = new ProductBarcode() // { // ProductID = _vendorAssortment.ProductID, // BarcodeType = (int)BarcodeTypes.EAN, // VendorID = vendorID // }; // unit.Scope.Repository<ProductBarcode>().Add(productBarcode); //} //productBarcode.Barcode = item.EAN; //#endregion } unit.Save(); } catch (Exception ex) { log.AuditError("Error update price", ex); } } }
private void ParseDocuments(IUnitOfWork unit, XDocument prods, DataTable cont, DataTable statuses, DataTable taxTable) { #region Xml Data var taxList = (from tax in taxTable.AsEnumerable() select new { ID = tax[1].ToString(), Tax = tax[2].ToString() }).ToList(); var vendorStatuses = (from status in statuses.AsEnumerable() select new { Code = status[0].ToString(), Name = status[1].ToString() }); var itemContent = (from content in cont.AsEnumerable() select new { Code = content[0].ToString(), Name = content[2].ToString(), Level = content[1].ToString() }).ToList(); var itemProducts = (from itemproduct in prods.Element("XMLOUT_pricelist_01").Elements("item") let content = itemContent select new { VendorName = itemproduct.Element("vendor").Value, CustomItemNr = itemproduct.Element("item_id").Value, VendorItemNr = itemproduct.Element("vendor_id").Value, Longdescription = itemproduct.Element("long_desc").Value, Price = itemproduct.Element("price").Value, Tax = taxList.FirstOrDefault(x => x.ID == itemproduct.Element("item_id").Value), Status = vendorStatuses.FirstOrDefault(x => x.Code == itemproduct.Element("status").Value), QuantityOnHand = itemproduct.Element("stock").Value, VendorProductGroupCode1 = content.FirstOrDefault(x => x.Code.StartsWith(itemproduct.Element("item_group").Value.Substring(0, 2)) && Int32.Parse(x.Level) == 1), VendorProductGroupCode2 = content.FirstOrDefault(x => x.Code.StartsWith(itemproduct.Element("item_group").Value.Substring(0, 2)) && Int32.Parse(x.Level) == 2), VendorProductGroupCode3 = content.FirstOrDefault(x => x.Code.StartsWith(itemproduct.Element("item_group").Value.Substring(0, 2)) && Int32.Parse(x.Level) == 3), VendorProductGroupCode4 = content.FirstOrDefault(x => x.Code.StartsWith(itemproduct.Element("item_group").Value.Substring(0, 2)) && Int32.Parse(x.Level) == 4), VendorProductGroupCode5 = content.FirstOrDefault(x => x.Code.StartsWith(itemproduct.Element("item_group").Value.Substring(0, 2)) && Int32.Parse(x.Level) == 5), Barcode = itemproduct.Element("EAN_code").Value, ShortContentDescription = "" }).ToList(); #endregion var repoBrandVendor = unit.Scope.Repository <BrandVendor>(); var prodRepo = unit.Scope.Repository <Product>().Include(c => c.ProductMedias, c => c.ProductBarcodes, c => c.ProductDescriptions); var productAttributeGroups = unit.Scope.Repository <ProductAttributeGroupMetaData>().GetAll(g => g.VendorID == VendorID).ToList(); var repoAssortment = unit.Scope.Repository <VendorAssortment>().Include(c => c.VendorPrices); var stockRepo = unit.Scope.Repository <VendorStock>(); var repoAttributeGroup = unit.Scope.Repository <ProductAttributeGroupMetaData>(); var repoAttributeGroupName = unit.Scope.Repository <ProductAttributeGroupName>(); var repoAttribute = unit.Scope.Repository <ProductAttributeMetaData>().Include(c => c.ProductAttributeNames, c => c.ProductAttributeValues); var repoVendor = unit.Scope.Repository <ProductGroupVendor>(); var prodDescriptionRepo = unit.Scope.Repository <ProductDescription>(); var products = prodRepo.GetAll(x => x.SourceVendorID == VendorID).ToList(); var vendorassortments = repoAssortment.GetAll(x => x.VendorID == VendorID).ToList(); var productAttributes = repoAttribute.GetAll(g => g.VendorID == VendorID).ToList(); var currentProductGroupVendors = repoVendor.GetAll(v => v.Vendor.VendorID == VendorID).ToList(); var productGroupVendorRecords = repoVendor.GetAll(pc => pc.VendorID == VendorID).ToList(); var brands = repoBrandVendor.GetAll(bv => bv.VendorID == VendorID).ToList(); var vendorStock = stockRepo.GetAll(x => x.VendorID == VendorID).ToList(); var prodDescriptions = prodDescriptionRepo.GetAll().ToList(); var prodAttributeGroups = repoAttributeGroup.GetAll(g => g.VendorID == VendorID).ToList(); ProductStatusVendorMapper mapper = new ProductStatusVendorMapper(unit.Scope.Repository <VendorProductStatus>(), VendorID); int counter = 0; int total = itemProducts.Count(); int totalNumberOfProductsToProcess = total; log.InfoFormat("Start import {0} products", total); foreach (var product in itemProducts) { try { if (counter == 100) { counter = 0; log.InfoFormat("Still need to process {0} of {1}; {2} done;", totalNumberOfProductsToProcess, total, total - totalNumberOfProductsToProcess); } totalNumberOfProductsToProcess--; counter++; #region Brand var vbrand = brands.FirstOrDefault(vb => vb.VendorBrandCode == product.VendorProductGroupCode1.Code); if (vbrand == null) { vbrand = new BrandVendor { VendorID = VendorID, VendorBrandCode = product.VendorProductGroupCode1.Code, BrandID = UnMappedID }; brands.Add(vbrand); repoBrandVendor.Add(vbrand); } vbrand.Name = product.VendorName; #endregion Brand #region Product var item = products.FirstOrDefault(p => p.VendorItemNumber == product.VendorItemNr && p.BrandID == vbrand.BrandID); if (item == null) { item = new Product { VendorItemNumber = product.VendorItemNr, BrandID = vbrand.BrandID, SourceVendorID = VendorID }; prodRepo.Add(item); products.Add(item); unit.Save(); } else { if (item.BrandID < 0) { item.BrandID = vbrand.BrandID; } } #endregion Product #region Vendor assortment //if (item.VendorAssortments == null) item.VendorAssortments = new List<VendorAssortment>(); var assortment = vendorassortments.FirstOrDefault(x => x.ProductID == item.ProductID); if (assortment == null) { assortment = new VendorAssortment { VendorID = VendorID, Product = item }; vendorassortments.Add(assortment); repoAssortment.Add(assortment); } assortment.ShortDescription = product.Longdescription.Length > 150 ? product.Longdescription.Substring(0, 150) : product.Longdescription; assortment.CustomItemNumber = product.CustomItemNr; assortment.IsActive = true; assortment.LongDescription = product.Longdescription; #region Product group try { var brndCode = product.Try(x => x.VendorProductGroupCode1, null); if (brndCode != null) { var productGroupVendor = productGroupVendorRecords.Where(pg => pg.GetType().GetProperty("BrandCode").GetValue(pg, null) != null && pg.GetType().GetProperty("BrandCode").GetValue(pg, null).ToString() == brndCode.Code.Trim()).FirstOrDefault(); if (productGroupVendor == null) { productGroupVendor = new ProductGroupVendor { ProductGroupID = UnMappedID, VendorID = VendorID, VendorName = brndCode.Name.Trim() }; productGroupVendor.GetType().GetProperty("BrandCode").SetValue(productGroupVendor, brndCode.Code.Trim(), null); repoVendor.Add(productGroupVendor); productGroupVendorRecords.Add(productGroupVendor); } #region sync if (currentProductGroupVendors.Contains(productGroupVendor)) { currentProductGroupVendors.Remove(productGroupVendor); } #endregion } for (int i = 2; i <= 4; i++) { var category = i == 2 ? product.Try(x => x.VendorProductGroupCode2, null) : i == 3 ? product.Try(x => x.VendorProductGroupCode3, null) : i == 4 ? product.Try(x => x.VendorProductGroupCode4, null) : null; if (category != null) { var productGroupVendor = productGroupVendorRecords.Where(pg => pg.GetType().GetProperty("VendorProductGroupCode" + i).GetValue(pg, null) != null && pg.GetType().GetProperty("VendorProductGroupCode" + i).GetValue(pg, null).ToString() == category.Code.Trim()).FirstOrDefault(); if (productGroupVendor == null) { productGroupVendor = new ProductGroupVendor { ProductGroupID = UnMappedID, VendorID = VendorID, VendorName = category.Name.Trim() }; productGroupVendor.GetType().GetProperty("VendorProductGroupCode" + i).SetValue(productGroupVendor, category.Code.Trim(), null); repoVendor.Add(productGroupVendor); productGroupVendorRecords.Add(productGroupVendor); } #region sync if (currentProductGroupVendors.Contains(productGroupVendor)) { currentProductGroupVendors.Remove(productGroupVendor); } #endregion } } } catch (Exception ex) { log.Error("Failed productgroups", ex); } #endregion #region Vendor Product Group Assortment string brandCode = product.VendorProductGroupCode1.Code; /// string groupCode1 = product.VendorProductGroupCode1.Code; string groupCode1 = product.VendorProductGroupCode2.Code; string groupCode2 = product.VendorProductGroupCode3.Code; string groupCode3 = product.VendorProductGroupCode4.Code; var records = (from l in productGroupVendorRecords where ((brandCode != null && l.BrandCode.Trim() == brandCode) || l.BrandCode == null) && ((groupCode1 != null && l.VendorProductGroupCode1 != null && l.VendorProductGroupCode1.Trim() == groupCode1) || l.VendorProductGroupCode1 == null) && ((groupCode2 != null && l.VendorProductGroupCode2 != null && l.VendorProductGroupCode2.Trim() == groupCode2) || l.VendorProductGroupCode2 == null) && ((groupCode3 != null && l.VendorProductGroupCode3 != null && l.VendorProductGroupCode3.Trim() == groupCode3) || l.VendorProductGroupCode3 == null) select l).ToList(); List <int> existingProductGroupVendors = new List <int>(); foreach (ProductGroupVendor prodGroupVendor in records) { existingProductGroupVendors.Add(prodGroupVendor.ProductGroupVendorID); if (prodGroupVendor.VendorAssortments == null) { prodGroupVendor.VendorAssortments = new List <VendorAssortment>(); } if (prodGroupVendor.VendorAssortments.Any(x => x.VendorAssortmentID == assortment.VendorAssortmentID)) { // only add new rows continue; } prodGroupVendor.VendorAssortments.Add(assortment); } var unusedPGV = new List <ProductGroupVendor>(); assortment.ProductGroupVendors.ForEach((pgv, id) => { if (!existingProductGroupVendors.Contains(pgv.ProductGroupVendorID)) { unusedPGV.Add(pgv); } }); unusedPGV.ForEach((pg) => { assortment.ProductGroupVendors.Remove(pg); }); #endregion #endregion Vendor assortment #region Stock var stock = vendorStock.FirstOrDefault(c => c.ProductID == assortment.ProductID && c.VendorID == assortment.VendorID); if (stock == null) { stock = new VendorStock { VendorID = VendorID, Product = item, VendorStockTypeID = 1 }; vendorStock.Add(stock); stockRepo.Add(stock); } stock.QuantityOnHand = Int32.Parse(product.QuantityOnHand); stock.StockStatus = product.Status == null ? null : product.Status.Name; if (product.Status != null) { stock.ConcentratorStatusID = mapper.SyncVendorStatus(product.Status.Name, -1); } #endregion Stock #region Price if (assortment.VendorPrices == null) { assortment.VendorPrices = new List <VendorPrice>(); } var price = assortment.VendorPrices.FirstOrDefault(); if (price == null) { price = new VendorPrice { VendorAssortment = assortment, MinimumQuantity = 0 }; unit.Scope.Repository <VendorPrice>().Add(price); } price.CommercialStatus = product.Status == null ? null : product.Status.Name; price.BasePrice = Decimal.Parse(product.Price); if (product.Tax != null) { price.TaxRate = Decimal.Parse(product.Tax.Tax) / Decimal.Parse(product.Price); } price.ConcentratorStatusID = stock.ConcentratorStatusID; #endregion Price #region Barcode if (!String.IsNullOrEmpty(product.Barcode)) { if (item.ProductBarcodes == null) { item.ProductBarcodes = new List <ProductBarcode>(); } if (!item.ProductBarcodes.Any(pb => pb.Barcode.Trim() == product.Barcode.Trim())) { unit.Scope.Repository <ProductBarcode>().Add(new ProductBarcode { Product = item, Barcode = product.Barcode.Trim(), BarcodeType = (int)BarcodeTypes.Default, VendorID = VendorID }); } } #endregion Barcode unit.Save(); } catch (Exception ex) { log.Error("Error import products for Copaco", ex); } } #region delete unused productgroupvendor records foreach (var vProdGroup in currentProductGroupVendors) { if (vProdGroup.ProductGroupID == -1) { unit.Scope.Repository <ProductGroupVendor>().Delete(vProdGroup); } } #endregion }
private void ProcessStock(IEnumerable <DatColStock> listOfLocalVendorStock) { var corruptStock = new List <DatColStock>(); var stockToUpdate = new List <VendorStock>(); var stockToCreate = new List <VendorStock>(); var currentVendorAssortments = _vendorAssortmentRepo .GetListOfVendorAssortmentByVendorID(SapphVendorID) .ToLookup(x => Regex.Replace(x.CustomItemNumber, @"\s+", "")) .ToDictionary(x => x.Key, x => x.FirstOrDefault()); var currentVendorStock = _vendorStockRepo .GetListOfVendorStockByVendorID(SapphVendorID) .ToLookup(x => x.ProductID) .ToDictionary(x => x.Key, x => x.FirstOrDefault()); foreach (var stock in listOfLocalVendorStock) { if (currentVendorAssortments.ContainsKey(stock.CustomItemNumberWithoutWhiteSpace)) { var productID = currentVendorAssortments[stock.CustomItemNumberWithoutWhiteSpace].ProductID; if (currentVendorStock.ContainsKey(productID)) { var vendorStock = currentVendorStock[productID]; if (vendorStock.QuantityOnHand != stock.Quantity) { vendorStock.QuantityOnHand = stock.Quantity; stockToUpdate.Add(vendorStock); } } else { var vendorStock = new VendorStock { ProductID = productID, VendorID = SapphVendorID, QuantityOnHand = stock.Quantity, StockStatus = "ENA", ConcentratorStatusID = 4, VendorStatus = "ENA", VendorStockTypeID = 1 }; stockToCreate.Add(vendorStock); } } else { corruptStock.Add(stock); _log.Info(string.Format("Error: CustomItemNumber does not exists. {0}", stock.ModelCode)); } } if (stockToCreate.Any()) { _vendorStockRepo.InsertVendorStocks(stockToCreate); } if (stockToUpdate.Any()) { _vendorStockRepo.UpdateVendorStocksQuantity(stockToUpdate); } _archiveService.ExportToAxapta(corruptStock, SaveTo.CorruptStockDirectory, FailedStockFileName); }
//private void ParseProductGroupVendor() //{ // string productGroupCode = _record.Field<string>("ProductGroup"); // string productSubGroupCode = _record.Field<string>("ProductSubGroup"); // string productSubSubGroupCode = _record.Field<string>("ProductSubSubGroup"); // string brandcode = _record.Field<string>("Brand").Trim(); // _productGroupVendorRecords = VendorUtility.MergeProductGroupVendor(_vendorProductGroups, _vendor, brandcode, productGroupCode, productSubGroupCode, productSubSubGroupCode, _unit); //} private void ParseBSCStockLevels() { //update the regular stock levels ParseStockLevels(); var repoVendorStock = _unit.Scope.Repository <VendorStock>(); #region BSC OEM VendorStock bscoem = (from vs in _vendorStock where vs.ProductID == _product.ProductID && vs.VendorID == _vendor.VendorID && vs.VendorStockType == _vendorStockTypes.SyncVendorStockTypes("BSCOEM") select vs).FirstOrDefault(); if (_record.Field <int?>("QuantityBSCOEM").HasValue&& _record.Field <decimal?>("CostPriceBSC").HasValue) { if (bscoem == null) { bscoem = new VendorStock() { VendorID = _vendor.VendorID, ProductID = _product.ProductID, VendorStockType = _vendorStockTypes.SyncVendorStockTypes("BSCOEM") }; repoVendorStock.Add(bscoem); _vendorStock.Add(bscoem); } bscoem.QuantityOnHand = _record.Field <int>("QuantityBSCOEM"); bscoem.UnitCost = _record.Field <decimal>("CostPriceBSC"); bscoem.ConcentratorStatusID = UpdateVendorStatuses(_record.Field <string>("StockStatus")); bscoem.StockStatus = _record.Field <string>("StockStatus");//TODO: To remove bscoem.VendorStatus = _record.Field <string>("StockStatus"); } else { if (bscoem != null) { repoVendorStock.Delete(bscoem); _vendorStock.Remove(bscoem); } } #endregion #region BSC MYVEIL VendorStock bsc = (from vs in _vendorStock where vs.ProductID == _product.ProductID && vs.VendorID == _vendor.VendorID && vs.VendorStockType == _vendorStockTypes.SyncVendorStockTypes("BSC") select vs).FirstOrDefault(); if (_record.Field <int?>("QuantityBSC").HasValue&& _record.Field <decimal?>("CostPriceBSC").HasValue) { if (bsc == null) { bsc = new VendorStock() { VendorID = _vendor.VendorID, ProductID = _product.ProductID, VendorStockType = _vendorStockTypes.SyncVendorStockTypes("BSC") }; repoVendorStock.Add(bsc); _vendorStock.Add(bsc); } bsc.QuantityOnHand = _record.Field <int>("QuantityBSC"); bsc.UnitCost = _record.Field <decimal>("CostPriceBSC"); bsc.ConcentratorStatusID = UpdateVendorStatuses(_record.Field <string>("StockStatus")); bsc.VendorStatus = _record.Field <string>("StockStatus"); bsc.StockStatus = _record.Field <string>("StockStatus"); } else { if (bsc != null) { repoVendorStock.Delete(bsc); _vendorStock.Remove(bsc); } } #endregion #region BSC DEMO VendorStock bscDS = (from vs in _vendorStock where vs.ProductID == _product.ProductID && vs.VendorID == _vendor.VendorID && vs.VendorStockType == _vendorStockTypes.SyncVendorStockTypes("BSCDEMO") select vs).FirstOrDefault(); if (_record.Field <int?>("QuantityBSCDEMO").HasValue&& _record.Field <decimal?>("CostPriceBSC").HasValue) { if (bscDS == null) { bscDS = new VendorStock() { VendorID = _vendor.VendorID, ProductID = _product.ProductID, VendorStockType = _vendorStockTypes.SyncVendorStockTypes("BSCDEMO") }; repoVendorStock.Add(bscDS); _vendorStock.Add(bscDS); } bscDS.QuantityOnHand = _record.Field <int>("QuantityBSCDEMO"); bscDS.UnitCost = _record.Field <decimal>("CostPriceBSC"); bscDS.ConcentratorStatusID = UpdateVendorStatuses(_record.Field <string>("StockStatus")); bscDS.VendorStatus = _record.Field <string>("StockStatus"); bscDS.StockStatus = _record.Field <string>("StockStatus"); } else { if (bscDS != null) { repoVendorStock.Delete(bscDS); _vendorStock.Remove(bscDS); } } #endregion #region BSC DMGBOX VendorStock bscDMGBOX = (from vs in _vendorStock where vs.ProductID == _product.ProductID && vs.VendorID == _vendor.VendorID && vs.VendorStockType == _vendorStockTypes.SyncVendorStockTypes("BSCDMGBOX") select vs).FirstOrDefault(); if (_record.Field <int?>("QuantityBSCDMGBOX").HasValue&& _record.Field <decimal?>("CostPriceBSC").HasValue) { if (bscDMGBOX == null) { bscDMGBOX = new VendorStock() { VendorID = _vendor.VendorID, ProductID = _product.ProductID, VendorStockType = _vendorStockTypes.SyncVendorStockTypes("BSCDMGBOX") }; repoVendorStock.Add(bscDMGBOX); _vendorStock.Add(bscDMGBOX); } bscDMGBOX.QuantityOnHand = _record.Field <int>("QuantityBSCDMGBOX"); bscDMGBOX.UnitCost = _record.Field <decimal>("CostPriceBSC"); bscDMGBOX.ConcentratorStatusID = UpdateVendorStatuses(_record.Field <string>("StockStatus")); bscDMGBOX.VendorStatus = _record.Field <string>("StockStatus"); bscDMGBOX.StockStatus = _record.Field <string>("StockStatus"); } else { if (bscDMGBOX != null) { repoVendorStock.Delete(bscDMGBOX); _vendorStock.Remove(bscDMGBOX); } } #endregion #region BSCDMGITEM VendorStock bscDMGItem = (from vs in _vendorStock where vs.ProductID == _product.ProductID && vs.VendorID == _vendor.VendorID && vs.VendorStockType == _vendorStockTypes.SyncVendorStockTypes("BSCDMGITEM") select vs).FirstOrDefault(); if (_record.Field <int?>("QuantityBSCDMGITEM").HasValue&& _record.Field <decimal?>("CostPricebsc").HasValue) { if (bscDMGItem == null) { bscDMGItem = new VendorStock() { VendorID = _vendor.VendorID, ProductID = _product.ProductID, VendorStockType = _vendorStockTypes.SyncVendorStockTypes("BSCDMGITEM") }; repoVendorStock.Add(bscDMGItem); _vendorStock.Add(bscDMGItem); } bscDMGItem.QuantityOnHand = _record.Field <int>("QuantityBSCDMGITEM"); bscDMGItem.UnitCost = _record.Field <decimal>("CostPricebsc"); bscDMGItem.ConcentratorStatusID = UpdateVendorStatuses(_record.Field <string>("StockStatus")); bscDMGItem.VendorStatus = _record.Field <string>("StockStatus"); bscDMGItem.StockStatus = _record.Field <string>("StockStatus"); } else { if (bscDMGItem != null) { repoVendorStock.Delete(bscDMGItem); _vendorStock.Remove(bscDMGItem); } } #endregion #region BSC BSCIMCOMPL VendorStock bscBSCIMCOMPL = (from vs in _vendorStock where vs.ProductID == _product.ProductID && vs.VendorID == _vendor.VendorID && vs.VendorStockType == _vendorStockTypes.SyncVendorStockTypes("BSCINCOMPL") select vs).FirstOrDefault(); if (_record.Field <int?>("QuantityBSCINCOMPL").HasValue&& _record.Field <decimal?>("CostPriceBSC").HasValue) { if (bscBSCIMCOMPL == null) { bscBSCIMCOMPL = new VendorStock() { VendorID = _vendor.VendorID, ProductID = _product.ProductID, VendorStockType = _vendorStockTypes.SyncVendorStockTypes("BSCINCOMPL") }; repoVendorStock.Add(bscBSCIMCOMPL); _vendorStock.Add(bscBSCIMCOMPL); } bscBSCIMCOMPL.QuantityOnHand = _record.Field <int>("QuantityBSCINCOMPL"); bscBSCIMCOMPL.UnitCost = _record.Field <decimal>("CostPriceBSC"); bscBSCIMCOMPL.ConcentratorStatusID = UpdateVendorStatuses(_record.Field <string>("StockStatus")); bscBSCIMCOMPL.VendorStatus = _record.Field <string>("StockStatus"); bscBSCIMCOMPL.StockStatus = _record.Field <string>("StockStatus"); } else { if (bsc != null) { repoVendorStock.Delete(bscBSCIMCOMPL); _vendorStock.Remove(bscBSCIMCOMPL); } } #endregion #region BSC BSCRETURN VendorStock bscBSCRETURN = (from vs in _vendorStock where vs.ProductID == _product.ProductID && vs.VendorID == _vendor.VendorID && vs.VendorStockType == _vendorStockTypes.SyncVendorStockTypes("BSCRETURN") select vs).FirstOrDefault(); if (_record.Field <int?>("QuantityBSCRETURN").HasValue&& _record.Field <decimal?>("CostPriceBSC").HasValue) { if (bscBSCRETURN == null) { bscBSCRETURN = new VendorStock() { VendorID = _vendor.VendorID, ProductID = _product.ProductID, VendorStockType = _vendorStockTypes.SyncVendorStockTypes("BSCRETURN") }; repoVendorStock.Add(bscBSCRETURN); _vendorStock.Add(bscBSCRETURN); } bscBSCRETURN.QuantityOnHand = _record.Field <int>("QuantityBSCRETURN"); bscBSCRETURN.UnitCost = _record.Field <decimal>("CostPriceBSC"); bscBSCRETURN.ConcentratorStatusID = UpdateVendorStatuses(_record.Field <string>("StockStatus")); bscBSCRETURN.VendorStatus = _record.Field <string>("StockStatus"); bscBSCRETURN.StockStatus = _record.Field <string>("StockStatus"); } else { if (bscBSCRETURN != null) { repoVendorStock.Delete(bscBSCRETURN); _vendorStock.Remove(bscBSCRETURN); } } #endregion #region BSC BSCUSED VendorStock bscUsed = (from vs in _vendorStock where vs.ProductID == _product.ProductID && vs.VendorID == _vendor.VendorID && vs.VendorStockType == _vendorStockTypes.SyncVendorStockTypes("BSCUSED") select vs).FirstOrDefault(); if (_record.Field <int?>("QuantityBSCUSED").HasValue&& _record.Field <decimal?>("CostPriceBSC").HasValue) { if (bscUsed == null) { bscUsed = new VendorStock() { VendorID = _vendor.VendorID, ProductID = _product.ProductID, VendorStockType = _vendorStockTypes.SyncVendorStockTypes("BSCUSED") }; repoVendorStock.Add(bscUsed); _vendorStock.Add(bscUsed); } bscUsed.QuantityOnHand = _record.Field <int>("QuantityBSCUSED"); bscUsed.UnitCost = _record.Field <decimal>("CostPriceBSC"); bscUsed.ConcentratorStatusID = UpdateVendorStatuses(_record.Field <string>("StockStatus")); bscUsed.VendorStatus = _record.Field <string>("StockStatus"); bscUsed.StockStatus = _record.Field <string>("StockStatus"); } else { if (bscUsed != null) { repoVendorStock.Delete(bscUsed); _vendorStock.Remove(bscUsed); } } #endregion }