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