async void LoadSerieBatch()
        {
            if (batchLoaded)
            {
                return;
            }
            SetBusy();
            var lst = await api.Query <InvSerieBatch>(new InvSerieBatchOpen());

            if (lst == null || lst.Length == 0)
            {
                ClearBusy();
                return;
            }

            var mainList   = (List <InvItemStorageCount>)dgInvStockStatus.ItemsSource;
            var search     = new InvItemStorageCount();
            var sort       = new InvItemStorageLocalSort();
            var cnt        = mainList.Count;
            var extraItems = new List <InvItemStorageCount>(cnt);

            foreach (var rec in lst)
            {
                var itm = rec._Item;
                search._Item = itm;
                var idx = mainList.BinarySearch(search, sort);
                if (idx < 0)
                {
                    idx = ~idx;
                }
                if (idx >= 0 && idx < cnt && mainList[idx]._Item == itm)
                {
                    var r    = new InvItemStorageCount();
                    var item = mainList[idx];
                    StreamingManager.Copy(item, r);
                    r._SerieBatch  = rec._Number;
                    r._Qty         = rec._Qty - rec._QtySold;
                    r._QtyReserved = rec._QtyMarked;
                    r._Warehouse   = rec._Warehouse;
                    r._Location    = rec._Location;
                    r._QtyOrdered  = 0;
                    r._Quantity    = null;
                    extraItems.Add(r);
                }
            }
            extraItems.AddRange(mainList);
            extraItems.Sort(sort);
            dgInvStockStatus.ItemsSource = extraItems;
            SerieBatch.Visible           = true;
            batchLoaded = true;
            ClearBusy();
        }
 async void setLocation(InvWarehouse master, InvItemStorageCount rec)
 {
     if (api.CompanyEntity.Location)
     {
         if (master != null)
         {
             rec.locationSource = master.Locations ?? await master.LoadLocations(api);
         }
         else
         {
             rec.locationSource = null;
             rec.Location       = null;
         }
         rec.NotifyPropertyChanged("LocationSource");
     }
 }
        static async void FindOnEANVariant(InvItemStorageCount rec, QueryAPI api)
        {
            var ap      = new Uniconta.API.Inventory.ReportAPI(api);
            var variant = await ap.GetInvVariantDetail(rec._EAN);

            if (variant != null)
            {
                rec.Item     = variant._Item;
                rec.Variant1 = variant._Variant1;
                rec.Variant2 = variant._Variant2;
                rec.Variant3 = variant._Variant3;
                rec.Variant4 = variant._Variant4;
                rec.Variant5 = variant._Variant5;
                rec._EAN     = variant._EAN;
            }
        }
        static public void FindOnEAN(InvItemStorageCount rec, SQLCache Items, QueryAPI api)
        {
            var EAN = rec._EAN;

            if (string.IsNullOrWhiteSpace(EAN))
            {
                return;
            }
            var found = (from item in (InvItem[])Items.GetNotNullArray where string.Compare(item._EAN, EAN, StringComparison.CurrentCultureIgnoreCase) == 0 select item).FirstOrDefault();

            if (found != null)
            {
                rec._EAN = found._EAN;
                rec.Item = found._Item;
            }
            else
            {
                FindOnEANVariant(rec, api);
            }
        }
        List <InvItemStorageCount> AddVariants(List <InvItemStorageCount> mainList, InvStandardVariantCombi[] stds)
        {
            var itemSort = new InvItemVariantSort();

            var stdSort = new InvStandardVariantCombiSort();

            Array.Sort(stds, stdSort);

            var stdSearch = new InvStandardVariantCombi()
            {
                _LineNumber1 = float.MinValue, _LineNumber2 = float.MinValue, _LineNumber3 = float.MinValue, _LineNumber4 = float.MinValue, _LineNumber5 = float.MinValue
            };
            var newItems   = new List <InvItemStorageCount>(100);
            var itemSearch = new InvItemStorageCount();

            string lastItem = null;

            foreach (var rec in mainList)
            {
                if (rec._Item == lastItem)
                {
                    continue;
                }
                lastItem = rec._Item;
                var item = (InvItem)items.Get(lastItem);
                if (item?._StandardVariant == null || !item._UseVariants)
                {
                    continue;
                }

                itemSearch._Item = lastItem;
                var stdVariant = item._StandardVariant;
                stdSearch._StandardVariant = stdVariant;
                var pos = Array.BinarySearch(stds, stdSearch, stdSort);
                if (pos < 0)
                {
                    pos = ~pos;
                }
                while (pos < stds.Length)
                {
                    var std = stds[pos++];
                    if (std._StandardVariant != stdVariant)
                    {
                        break;
                    }

                    itemSearch._Variant1 = std._Variant1;
                    itemSearch._Variant2 = std._Variant2;
                    itemSearch._Variant3 = std._Variant3;
                    itemSearch._Variant4 = std._Variant4;
                    itemSearch._Variant5 = std._Variant5;
                    var itemPos = mainList.BinarySearch(itemSearch, itemSort);
                    if (itemPos < 0)
                    {
                        itemPos = ~itemPos;
                    }
                    if (itemPos >= mainList.Count)
                    {
                        itemPos = mainList.Count - 1;
                    }
                    var found = mainList[itemPos];
                    if (found._Item != itemSearch._Item) // item is not in the list, or we are past item.
                    {
                        if (itemPos == 0)
                        {
                            continue;
                        }
                        found = mainList[itemPos - 1];       // we need to test one position before, since binarysearch will be past the item with blank variants
                        if (found._Item != itemSearch._Item) // item is not in the list
                        {
                            continue;
                        }
                    }
                    if (itemSort.Compare(found, itemSearch) == 0) // we have the variant combination
                    {
                        continue;
                    }

                    var newrec = new InvItemStorageCount();
                    newrec.SetMaster(item);
                    newrec._Variant1  = std._Variant1;
                    newrec._Variant2  = std._Variant2;
                    newrec._Variant3  = std._Variant3;
                    newrec._Variant4  = std._Variant4;
                    newrec._Variant5  = std._Variant5;
                    newrec._Warehouse = item._Warehouse;
                    newrec._Location  = item._Location;
                    newItems.Add(newrec);
                }
            }
            if (newItems.Count > 0)
            {
                newItems.AddRange(mainList);
                return(newItems);
            }
            return(null);
        }
        public async Task BindGrid(IEnumerable <PropValuePair> propValuePair)
        {
            await dgInvStockStatus.Filter(propValuePair);

            var mainList = (List <InvItemStorageCount>)dgInvStockStatus.ItemsSource;

            if (mainList == null)
            {
                return;
            }

            var search = new InvItemStorageCount();
            var sort   = new InvItemStorageLocalSort();
            var cnt    = mainList.Count;
            var api    = this.api;

            if (this.items == null)
            {
                this.items = await api.LoadCache(typeof(Uniconta.DataModel.InvItem));
            }

            if (propValuePair == null || propValuePair.Count() == 0)
            {
                var lst = new List <InvItemStorageCount>(cnt);
                foreach (var item in (Uniconta.DataModel.InvItem[]) this.items.GetNotNullArray)
                {
                    if (item._ItemType == (byte)ItemType.Service)
                    {
                        continue;
                    }
                    var itm = item._Item;
                    search._Item = itm;
                    var idx = mainList.BinarySearch(search, sort);
                    if (idx < 0)
                    {
                        idx = ~idx;
                    }
                    if (idx >= 0 && idx < cnt && mainList[idx]._Item == itm)
                    {
                        continue;
                    }
                    var r = new InvItemStorageCount();
                    r.SetMaster(item);
                    lst.Add(r);
                }
                if (lst.Count > 0)
                {
                    lst.AddRange(mainList);
                    lst.Sort(sort);
                    mainList = lst;
                }
            }
            if (api.CompanyEntity.ItemVariants && api.CompanyEntity._LoadVariantsInCounting)
            {
                var stds = await api.Query <InvStandardVariantCombi>();

                var newList = AddVariants(mainList, stds);
                if (newList != null)
                {
                    newList.Sort(sort);
                    mainList = newList;
                }
            }
            dgInvStockStatus.ItemsSource = mainList;

            SerieBatch.Visible = false;
            batchLoaded        = false;
        }