private List <Item> SetHierarchyOfAtomes(List <XElement> idents, List <SummaryItemModel> summaryItems) { List <Item> updatedLeafs = new List <Item>(); SummaryItemModel atomeItem = null; foreach (var item in idents) { bool sublevel = true; decimal identQuantity = CommonMethods.ParseDecimal(item.Descendants(Enums.XMLTagName.Kolicina_ident.ToString()).FirstOrDefault().Value); var atomes = item.Descendants(Enums.XMLTagName.Serijske_podnivo.ToString()).ToList(); if (atomes.Count == 0) { sublevel = false; atomes = item.Descendants(Enums.XMLTagName.Serijske.ToString()).ToList(); } foreach (var atome in atomes) { Item obj = new Item(); obj.atomeElement = atome; obj.MeasuringUnitCode = item.Descendants(Enums.XMLTagName.EM_ident.ToString()).FirstOrDefault().Value; obj.PackagesUIDs = ConstructPackagesUIDsHierarchy(obj); obj.Quantity = identQuantity / atomes.Count(); obj.UID = sublevel ? atome.Descendants(Enums.XMLTagName.SP_Barkoda_serijske.ToString()).FirstOrDefault().Value : atome.Descendants(Enums.XMLTagName.Barkoda_serijske.ToString()).FirstOrDefault().Value; obj.PackagesSIDs = item.Descendants(Enums.XMLTagName.Sifra_ident.ToString()).FirstOrDefault().Value; updatedLeafs.Add(obj); } } return(updatedLeafs); }
private List <Item> SetHierarchyOfAtomes(XElement rootUnits, List <SummaryItemModel> summaryItems) { List <Item> updatedLeafs = new List <Item>(); string currentAtomeSID = "", previousAtomeSID = ""; SummaryItemModel atomeItem = null; //Pridobimo vse liste (atome, artikle) xml dokumenta. var leafs = (from l in rootUnits.Descendants() where !l.Elements().Any() select new Item { atomeElement = l, UID = l.Attribute(Enums.XMLTagAttributeName.UID.ToString())?.Value, Parents = new List <Item>(), PackagesUIDs = "", PackagesSIDs = "" }).ToList(); //Sestavimo hirearhijo atoma foreach (var item in leafs) { XElement atomeElem = item.atomeElement; Item obj = ConstructAtomeHierarchyUID(item); obj.atomeElement = atomeElem; if (!String.IsNullOrEmpty(obj.PackagesUIDs)) { obj.PackagesUIDs = obj.PackagesUIDs.Remove(obj.PackagesUIDs.LastIndexOf(',')); } obj.PackagesSIDs = ConstructAtomeHierarchySID(obj.atomeElement, ""); if (!String.IsNullOrEmpty(obj.PackagesSIDs)) { obj.PackagesSIDs = obj.PackagesSIDs.Remove(item.PackagesSIDs.LastIndexOf(',')); } if (atomeElem.Attribute(Enums.XMLTagAttributeName.SID.ToString()) != null) { currentAtomeSID = atomeElem.Attribute(Enums.XMLTagAttributeName.SID.ToString()).Value; if (currentAtomeSID != previousAtomeSID) { atomeItem = summaryItems.Where(a => a.SID == currentAtomeSID).FirstOrDefault(); } obj.Quantity = atomeItem.UnitOfMeasure.ToLower().Contains("kgm") ? CommonMethods.ParseDecimal(atomeItem.NEW.Replace(".", ",")) : atomeItem.Length; obj.MeasuringUnitCode = atomeItem.UnitOfMeasure; previousAtomeSID = currentAtomeSID; } updatedLeafs.Add(obj); } return(updatedLeafs); }
private List <SummaryItemModel> FindTopLevelSummaryItems(List <XElement> products) { List <SummaryItemModel> summaryList = new List <SummaryItemModel>(); foreach (var item in products) { var obj = item.Descendants(Enums.XMLTagName.Serijske.ToString()).Descendants(Enums.XMLTagName.Serijske_podnivo.ToString()).FirstOrDefault();//če obstaja tag Serijski_podnivo potem preštejemo koliko je elementov notri SummaryItemModel summary = new SummaryItemModel(); summary.CountOfTradeUnits = item.Descendants(Enums.XMLTagName.Serijske.ToString()).Count(); summary.ItemQuantity = obj != null?item.Descendants(Enums.XMLTagName.Serijske.ToString()).Descendants(Enums.XMLTagName.Serijske_podnivo.ToString()).Count() : 1; summary.IsTopLevelElement = true; summary.ProducerProductCode = item.Descendants(Enums.XMLTagName.Sifra_ident.ToString()).FirstOrDefault().Value; summary.ProducerProductName = item.Descendants(Enums.XMLTagName.Naziv_ident.ToString()).FirstOrDefault().Value; summary.UnitOfMeasure = item.Descendants(Enums.XMLTagName.EM_ident.ToString()).FirstOrDefault().Value; summary.SID = item.Descendants(Enums.XMLTagName.Sifra_ident.ToString()).FirstOrDefault().Value; summaryList.Add(summary); } return(summaryList); }
private List <SummaryItemModel> FindTopLevelSummaryItems(List <SummaryItemModel> summaryItems, XElement rootUnits, bool isDeloveryNoteRepacking) { string unitsNode = Enums.XMLTagName.Units.ToString(); string rootNode = Enums.XMLTagName.Shipment.ToString(); int unitsCount = 0; List <SummaryItemModel> topLevelItems = new List <SummaryItemModel>(); if (!isDeloveryNoteRepacking) { foreach (var item in summaryItems) { XElement element = rootUnits.Descendants().Where(x => item.PackagingLevel != "00" && (x.Attribute(Enums.XMLTagAttributeName.SID.ToString()) != null ? x.Attribute(Enums.XMLTagAttributeName.SID.ToString()).Value == item.SID : false)).FirstOrDefault(); XElement searchElement = element; if (searchElement != null) { while (true) { if (searchElement.Name == unitsNode) { unitsCount++; } if (searchElement.Name == rootNode) { break; } searchElement = searchElement.Parent; } if (unitsCount == 1) { int elementCount = rootUnits.Descendants().Where(x => item.PackagingLevel != "00" && (x.Attribute(Enums.XMLTagAttributeName.SID.ToString()) != null ? x.Attribute(Enums.XMLTagAttributeName.SID.ToString()).Value == item.SID : false)).Count(); item.ProductItemCount = item.ItemQuantity * elementCount; topLevelItems.Add(item); } unitsCount = 0; } } } else { var repacking = summaryItems.Where(si => si.ProducerProductName == "Repacking").FirstOrDefault(); int maxNum = 0; string maxPackagingLevel = "00"; //želimo pridobiti drugi največu packaging level, da bomo lahko zračunali količine in preverili če je v vsem repackingu isti izdelek foreach (var item in summaryItems) { //izpustimo repacking summaryItem if (item.SID != repacking.SID) { var level = CommonMethods.ParseInt(item.PackagingLevel); if (level > maxNum) { maxNum = level; maxPackagingLevel = item.PackagingLevel; } } } //pridobimo vse summaryItems ki imajo drugi največji packaging level var packagingLevelSummaryItems = summaryItems.Where(si => si.PackagingLevel == maxPackagingLevel).ToList(); //pridobimo ime izdelka (vzamemo naziv do prvega presledka) string productName = packagingLevelSummaryItems.First().ProducerProductName.Substring(0, packagingLevelSummaryItems.First().ProducerProductName.IndexOf(" ")); //pridobimo število summary itemsov ki vsebujejo to ime izdelka int summaryItemsCount = packagingLevelSummaryItems.Where(si => si.ProducerProductName.Contains(productName)).Count(); //če je summaryItemsCount enako število objektov v packagingLevelSummaryItems potem vemo da je v Paketu Repacking samo en izdelek if (summaryItemsCount == packagingLevelSummaryItems.Count) { //TODO: izračunamo količino (ItemQuantity * število paketov - packagingLevelSummaryItems.Count) //V deliveryNoteItem shranimo samo en zapis ki je Repacking repacking.ProducerProductName = packagingLevelSummaryItems.First().ProducerProductName; repacking.ProductItemCount = packagingLevelSummaryItems.Sum(pis => pis.ItemQuantity); repacking.Notes = "Repacking dobavnica z enakim izdelkom"; topLevelItems.Add(repacking); } else { //Obstaja več izdelkov v istem paketu (Repacking) //V deliveryNoteItem shranimo toliko zapisev kot je različnih izdelkov. UID bodo vseboavli enako, razlikovalo se bo samo naziv izdelka, količina,... //pridobimo seznam različnih izdelkov var distinctProducts = packagingLevelSummaryItems.GroupBy(p => p.ProducerProductName.Substring(0, p.ProducerProductName.IndexOf(" "))).ToList(); int productCount = 1; foreach (var item in distinctProducts) { var newTopLevelItem = new SummaryItemModel(); newTopLevelItem.CountOfTradeUnits = item.Count(); newTopLevelItem.PSN = item.Select(i => i.PSN).First(); newTopLevelItem.SID = item.Select(i => i.SID).First(); newTopLevelItem.ItemQuantity = 0; newTopLevelItem.Notes = String.Format("Repacking dobavnica z različnimi izdelki - ({0}/{1})", productCount, distinctProducts.Count); newTopLevelItem.PackagingLevel = repacking.PackagingLevel; newTopLevelItem.ProducerProductCode = repacking.ProducerProductCode; newTopLevelItem.ProducerProductName = item.Key; newTopLevelItem.UnitOfMeasure = repacking.UnitOfMeasure; newTopLevelItem.ProductItemCount = item.Sum(i => i.ItemQuantity); productCount++; topLevelItems.Add(newTopLevelItem); } } } return(topLevelItems); }