internal static void UpdateHeader(ref OrderHeader header)
 {
     header.Total = 0;
     foreach (var line in header.OrderLines)
     {
         header.Total += (line.Quantity * line.UnitCost);
     }
 }
 public ActionResult CreateOrder(int clientId, int salesTypeId)
 {
     var salesType = db.SalesTypes.Find(salesTypeId);
     var shippingType = db.ShippingTypes.Find(salesType.DefaultShippingTypeId);
     var currentUserId = Guid.Parse(IdentityExtensions.GetUserId(User.Identity));
     var newOrder = new OrderHeader() { Active = true, OrderDate = DateTime.Now, OrderStatusId = 8, UserId = currentUserId, ShippingTypeId = shippingType.ShippingTypeId, SalesTypeId = salesTypeId, OnceOff = false,ClientID=clientId };
         db.OrderHeaders.Add(newOrder);
         db.SaveChanges();
     return RedirectToAction("Edit", new { id = newOrder.OrderHeaderId });
 }
        public ActionResult Create(int? ClientId, bool onceOff=false)
        {
            Client client = null;
            var currentUserId = Guid.Parse(IdentityExtensions.GetUserId(User.Identity));
            bool ownOrder = IsOwnOrder(db,ClientId, currentUserId);
            if (ClientId.HasValue)
            {
                client = db.Clients.Find(ClientId.Value);
                
            }
                var pc = db.PostageCharges.Where(m => m.Active).ToArray();
            if (ClientId.HasValue)
            {
                var address = client.DeliveryAddress;
                if (address == null)
                {
                    address = (from item in db.Addresses
                               where item.ClientID == ClientId.Value
                               && item.AddressTypeID == 2
                               select item).FirstOrDefault();
                }
                if (address == null)
                {
                    ModelState.AddModelError("OrderDate", "This client does not have a valid shipping address");
                }
                else
                {
                    var code = db.PostalCodes.FirstOrDefault(m => m.Active && m.PostalCodeName == address.Code);
                    if (code != null)
                    {
                        var link = db.PostalCodePostageCharges.FirstOrDefault(m => m.PostalCodeId == code.PostalCodeId);
                        if (link != null)
                        {
                            ViewBag.PostageChargeId = new SelectList(pc, "PostageChargeId", "PostageChargeName", link.PostageChargeId);
                            ViewBag.PostageChargeSetUp = true;
                        }
                    }
                }
            }

            if (ViewBag.PostageCharge == null)
            {
                ViewBag.PostageChargeSetUp = false;
                ViewBag.PostageChargeId = new SelectList(pc, "PostageChargeId", "PostageChargeName");
            }
            ViewBag.ClientID = new SelectList(db.Clients, "ClientId", "ClientInitials");
            ViewBag.OrderStatusId = new SelectList(db.OrderStatuses, "OrderStatusId", "OrderStatusName");
            var salesTypeId = 1;
            if ( onceOff && !ownOrder)
            {
                var subscriptions = (from item in db.Subscriptions
                                    where item.ValidFromDate <= DateTime.Now
                                    && item.ClientTypeID == client.ClientTypeID
                                    && !item.InitialOnceOffFromAccountID.Equals(Guid.Empty)
                                    select item).ToArray();
                var salesTypeIds = subscriptions.Select(m => m.SalesTypeID).Distinct().ToArray();
                var productIds = subscriptions.Select(m => m.ProductID).Distinct().ToArray();
                
                ViewBag.SalesTypeId = new SelectList(db.SalesTypes.Where(m => m.Active && salesTypeIds.Contains(m.SalesTypeId)).OrderBy(m => m.SalesTypeDescription), "SalesTypeId", "SalesTypeDescription");
                ViewBag.ProductList = new SelectList(db.Products.Where(m => m.Active && productIds.Contains(m.ProductID)).OrderBy(m => m.ProductName), "ProductID", "ProductName");
            }
            else
            {
                var subscriptions = (from item in db.Subscriptions
                                     where item.ValidFromDate <= DateTime.Now
                                     && item.ClientTypeID == client.ClientTypeID
                                     select item.ProductID).Distinct().ToArray();
                ViewBag.SalesTypeId = new SelectList(db.SalesTypes.Where(m => m.Active && (!ownOrder || (ownOrder && m.SalesTypeId == Generic.OwnOrderSalesTypeId))).OrderBy(m=>m.SalesTypeDescription), "SalesTypeId", "SalesTypeDescription");
                ViewBag.ProductList = new SelectList(db.Products.Where(m => m.Active && subscriptions.Contains(m.ProductID)).OrderBy(m=>m.ProductName), "ProductID", "ProductName");
            }
            
            var newOrder = new OrderHeader() {Active = true, OrderDate = DateTime.Now, OrderStatusId=1, UserId=currentUserId,ShippingTypeId=1, SalesTypeId=salesTypeId, OnceOff = onceOff };

            ViewBag.ShippingCost = new KeyValuePair<string, string>[0];

            if (ClientId.HasValue)
            {
                newOrder.Client = client;
                ViewBag.ContactInfo = (from item in db.ContactTypes.Where(m => m.Active).ToArray()
                                       select new string[] { item.ContactTypeName, db.Contacts.Where(m=>m.Active
                                                                                                && m.ContactTypeID == item.ContactTypeId
                                                                                                && m.ClientID==ClientId.Value).Select(m=>m.ContactName).FirstOrDefault()
                                                        }).ToArray();
                var shipping = (from item in db.ShippingMethodPostalCodes
                                        where item.PostalCode.PostalCodeName == newOrder.Client.DeliveryAddress.Code
                                        select item).ToArray();
               // ViewBag.ShippingCost = shipping.Select(m => new KeyValuePair<string, string>(string.Format("{0}:{1}", m.ShippingMethod.ShippingMethodName, m.Description), m.ExtraCost.ToString("R#,###,##0.00"))).Take(5).ToArray();
                

            }
            return View(newOrder);
        }
        private Guid CopyOrder(Guid id, Guid userId)
        {
            var oldHeader = db.OrderHeaders.Find(id);
            var newHeader = new OrderHeader()
            {
                Active = true,
                ClientID = oldHeader.ClientID,
                OrderDate = DateTime.Now,
                OrderHeaderId = Guid.NewGuid(),
                OrderStatusId = 1,
                SaleSourceId = oldHeader.SaleSourceId,
                SalesTypeId = oldHeader.SalesTypeId,
                Shipping=oldHeader.Shipping,
                ShippingTypeId=oldHeader.ShippingTypeId,
                Total = oldHeader.Total,
                UserId=userId,
                VAT = oldHeader.VAT
            };

            db.OrderHeaders.Add(newHeader);
            db.SaveChanges();

            foreach (var oldLine in oldHeader.OrderLines)
            {
                var newLine = new OrderLine()
                {
                    Active = true,
                    OrderHeaderId = newHeader.OrderHeaderId,
                    ProductID=oldLine.ProductID,
                    Quantity=oldLine.Quantity,
                    UnitCost=oldLine.UnitCost,
                    UnitCostExcl=oldLine.UnitCostExcl
                };
                db.OrderLines.Add(newLine);
            }
            db.SaveChanges();

            return newHeader.OrderHeaderId;
        }