public void Add(PickingListHeader header, AromaContext db)
 {
     foreach (var detail in header.PickingListDetail)
     {
         var shipment = (from item in this.Shipments
                         where item.groupId.Equals(detail.GroupId)
                         select item).FirstOrDefault();
         if (shipment == null)
         {
             if (detail.Address == null) detail.Address = detail.Client.DeliveryAddress;
             var cell = db.GetContact(detail.ClientID, Generic.enumContactType.Cell);
             //var contact = detail.Client.Contact?.Where(m => m.Active && m.ContactTypeID == 3).FirstOrDefault();
             shipment = new Shipment()
             {
                 ClientDescription = string.Format("{0} {1} ({2})", detail.Client.FullNames, detail.Client.ClientSurname, detail.ClientID),
                 PhoneNumber = cell,// contact==null?string.Empty:contact.ContactName,
                 Address = detail.Address,
                 ClientId = detail.ClientID,
                 groupId = detail.GroupId,
                 ItemCount = 1
             };
             this.Shipments.Add(shipment);
         }
         else
         {
             shipment.ItemCount++;
         }
     }
 }
        private async Task<PickingListHeader> GetPickingListView(int shippingTypeId, int shippingMethodId)
        {
            var shippingType = db.ShippingTypes.Find(shippingTypeId);
            var codes = new string[0];
            if (shippingType.ShippingList)
            {
                codes = await (from item in db.ShippingMethodPostalCodes
                               where item.Active && item.ShippingMethodId == shippingMethodId
                               select item.PostalCode.PostalCodeName).Distinct().ToArrayAsync();
            }
            else
            {
                codes = await (from item in db.PostalCodes
                               select item.PostalCodeName).ToArrayAsync();
            }

            var codeCheck = codes.Where(m => m == "0300").FirstOrDefault();

            var ddd =  (from item in db.OrderHeaders.Include(mbox=>mbox.OrderLines).Include(m=>m.Address).ToArray()
                             where item.OrderHeaderId.Equals(Guid.Parse("18903cd2-9554-e611-814c-2047477ce07a"))
                             select item).ToArray();

            //var orders =  (from item in ddd
            //                    where item.Active
            //                    && codes.Contains(item.Address.Code)
            //                    select item).ToArray();

            //try and fix oreders without addesses
            var noAddressOrders = await (from item in db.OrderHeaders
                                         where item.Active
                                         && item.Address == null
                                         select item).ToArrayAsync();
            foreach (var order in noAddressOrders)
            {
                order.Address = (from item in db.Addresses
                                 where item.ClientID == order.ClientID
                                 && item.AddressTypeID == 2
                                 && item.Active
                                 select item).FirstOrDefault();
                if (order.Address == null)
                {
                    order.Address = (from item in db.Addresses
                                     where item.AddressId== order.Client.DeliveryAddress_AddressId
                                     select item).FirstOrDefault();
                }
                if (order.Address == null)
                {
                    order.Address = (from item in db.Addresses
                                     where item.ClientID == order.ClientID
                                     && item.AddressTypeID == 2
                                     select item).FirstOrDefault();
                }
                if (order.Address != null)
                {
                    db.SaveChanges();
                }
            }
            /////////////////////////////////////////

            var orders = await (from item in db.OrderHeaders
                                where item.Active
                                && codes.Contains(item.Address.Code)
                                select item).Include(m => m.OrderLines).ToArrayAsync();

            orders = (from item in orders
                      where item.ShippingTypeId == shippingTypeId
                      select item).ToArray();
            
            orders = (from item in orders
                      where item.OrderStatusId==2
                      select item).ToArray();


            var detail = new List<PickingListDetail>();
            foreach (var order in orders)
            {
                var dt = (from item in order.OrderLines
                          select new PickingListDetail()
                          {
                              Active = false,
                              Address = order.Address,
                              Client = order.Client,
                              ClientID = order.ClientID,
                              OrderLineId = item.OrderLineId,
                              Product = item.Product,
                              ProductID = item.ProductID,
                              TotalItems = item.Quantity - (from PickingListDetail pld in db.PickingListDetails where pld.Active && pld.OrderLineId == item.OrderLineId select pld.TransferQuantity).DefaultIfEmpty(0).Sum(),
                              GroupId = item.OrderHeaderId,
                              Invoice = OrderHeadersController.GetInvoice(db,item.OrderHeaderId).Number,
                              TransferQuantity=item.Quantity - (from PickingListDetail pld in db.PickingListDetails where pld.Active && pld.OrderLineId==item.OrderLineId select pld.TransferQuantity).DefaultIfEmpty(0).Sum()
                          }).OrderBy(m=>m.ClientID).ThenBy(m=>m.Invoice).ToArray();

                detail.AddRange(dt.Where(m=>m.TransferQuantity>0));
                if (dt.Where(m => m.TransferQuantity > 0).Count() == 0)
                {
                    order.OrderStatusId = 4; //picked
                    db.SaveChanges();
                }    
                
            }

            ModelState.Remove("PickingListDetail");
            ModelState.Remove("ShippingMethodId");
            ModelState.Remove("ShippingMethodId");
            ModelState.Remove("PickingDate");
            ModelState.Remove("ClientId");
            var viewModel = new PickingListHeader()
            {
                PickingDate = DateTime.Now,
                ShippingMethodId = shippingMethodId,
                ShippingTypeId = shippingTypeId,
                PickingListDetail = detail.OrderBy(m=>m.ClientID)
                    .ThenBy(m => m.GroupId)
                    .ThenBy(m=>m.Product.ProductName).ToList()
            };

            return viewModel;
        }