public ActionResult Create(int id)
        {
            isAdminLogged();
            ViewBag.Parent = "Quản lý giao hàng";
            ViewBag.Child  = "Lập đơn giao hàng";
            // kt nếu đơn đặt hàng đã lập đơn giao rồi thì thông báo, điều hướng đến trang chi tiết giao hàng
            var order     = _orderService.GetOrder(id);
            var firdOrder = order.DeliveryOrders.FirstOrDefault();

            if (firdOrder != null)
            {
                return(RedirectToAction("Details", new { id = firdOrder.idDeliveryOrder }));
            }
            else
            {
                var contractList = order.Distributor.Contracts.ToList();
                var nowContract  = contractList.OrderByDescending(i => i.expiredDate).FirstOrDefault();
                var commission   = 0;
                if (nowContract.status == true)
                {
                    commission = nowContract.commission.Value;
                }
                var model = new CreateDeliveryOrderViewModel
                {
                    idOrder                = order.idOrder,
                    description            = "Vừa lập đơn giao, nv giao nhanh chóng kiểm kê và đi giao",
                    idDistributor          = order.idDistributor,
                    distributorName        = order.Distributor.name,
                    DeliveryType           = order.DeliveryType,
                    PaymentType            = order.PaymentType,
                    estimateDateOfDelivery = order.EstimateDateOfDelivery,
                    recipient              = order.Consignee.Name,
                    recipientPhone         = order.Consignee.PhoneNumber,
                    totalPurchase          = 0,
                    deliveryDate           = DateTime.Now,
                    commission             = commission
                };

                // lấy km tốt nhất của order
                int       nPromotion = 0;
                Promotion promotion  = getPromotionOrder(order, out nPromotion);

                List <DetailedDeliveryOrder> listddOrder = new List <DetailedDeliveryOrder>();
                foreach (var item in order.OrderDetails)
                {
                    var ddOrder = new DetailedDeliveryOrder
                    {
                        idDeliveryOrder = model.idDeliveryOrder,
                        idProduct       = item.idProduct,
                        quantity        = item.quantity,
                        Product         = item.Product,
                        promoQuantity   = 0,
                        //idDeliveryOrder =1
                    };
                    listddOrder.Add(ddOrder);
                    model.totalPurchase += ddOrder.quantity * ddOrder.Product.Price;
                }
                // đưa sp km vào listddOrder
                if (promotion != null)
                {
                    foreach (var item in promotion.PromotionGifts)
                    {
                        bool check = true;
                        foreach (var item1 in listddOrder)
                        {
                            if (item.idProduct == item1.idProduct)
                            {
                                listddOrder.Remove(item1);
                                item1.promoQuantity = item.quantity * nPromotion;
                                item1.note          = "SLKM " + item.quantity * nPromotion + " từ CTKM số " + item.idPromotion;
                                listddOrder.Add(item1);
                                check = false;
                                break;
                            }
                        }
                        if (check)
                        {
                            var ddOrder = new DetailedDeliveryOrder
                            {
                                idProduct     = item.idProduct,
                                quantity      = 0,
                                promoQuantity = item.quantity * nPromotion,
                                Product       = item.Product,
                                note          = "SLKM " + item.quantity * nPromotion + " từ CTKM số " + item.idPromotion
                                                //idDeliveryOrder =1
                            };
                            listddOrder.Add(ddOrder);
                        }
                    }
                }
                model.DetailedDeliveryOrder = listddOrder;
                // những thuộc tính cần chọn khi lập đơn giao hàng
                ViewBag.Storage = order.Distributor.Storages.ToList();
                ViewBag.Staff   = _staffService.GetAll().ToList();
                //  tính chiết khấu
                model.totalPurchase = model.totalPurchase * (1 - model.commission / 100);
                return(View(model));
            }
        }
        public ActionResult Create(CreateDeliveryOrderViewModel model)
        {
            isAdminLogged();
            ViewBag.Parent = "Quản lý giao hàng";
            ViewBag.Child  = "Lập đơn giao hàng";

            // những thuộc tính cần lựa chọn khi lập đơn giao hàng
            ViewBag.Storage = _disService.SearchByID(model.idDistributor.Value).Storages.ToList();
            ViewBag.Staff   = _staffService.GetAll().ToList();

            DeliveryOrder dOrder = new DeliveryOrder();

            dOrder.deliveryAdd    = model.deliveryAdd;
            dOrder.description    = model.description;
            dOrder.deliveryDate   = model.deliveryDate;
            dOrder.idOrder        = model.idOrder;
            dOrder.idDistributor  = model.idDistributor;
            dOrder.idStaff        = model.idStaff;
            dOrder.recipient      = model.recipient;
            dOrder.recipientPhone = model.recipientPhone;
            dOrder.status         = 5;
            dOrder.updateDate     = DateTime.Now;
            dOrder.deliveryDate   = DateTime.Now;
            dOrder.totalPurchase  = model.totalPurchase;
            //dOrder.idDeliveryOrder = _deliveryOrderService.GenerateDOrderId();

            // lits product lưu giữ sp để cập nhật số lượng sau khi lập giao hàng
            List <Product> ListProduct = new List <Product>();
            // mặc định sl trong kho đủ giao
            bool checkStorage = true;

            foreach (var item in model.DetailedDeliveryOrder)
            {
                // add chi tiết giao vào đơn giao hàng
                //item.idDeliveryOrder = dOrder.idDeliveryOrder;
                dOrder.DetailedDeliveryOrders.Add(item);
                // kiểm tra lượng tồn kho
                var p  = _productService.GetProduct(item.idProduct);
                int sl = p.Quantity.Value - item.quantity.Value - item.promoQuantity.Value;
                if (sl > 0)
                {
                    p.Quantity = sl;
                    ListProduct.Add(p);
                }
                else
                {
                    ViewBag.msg   = "Sản phẩm " + p.ProductName + " chỉ còn " + p.Quantity;
                    ViewBag.types = 1;
                    checkStorage  = false;
                }
            }
            // nếu trong kho đủ sl
            if (checkStorage)
            {
                bool rs = true;
                rs = _deliveryOrderService.AddDeliveryOrder(dOrder);
                if (rs)
                {
                    // cập nhật sl sp trong kho
                    foreach (var item in ListProduct)
                    {
                        _productService.UpdateProduct(item);
                    }
                    // lập thành công chuyển qua trang chi tiết
                    return(RedirectToAction("Details", new { id = dOrder.idDeliveryOrder }));
                }
                ViewBag.msg   = "Lập thất bại";
                ViewBag.types = 1;
            }
            // lập thất bại, chèn Product và chi tiết(ngoài view cần lấy name, price)
            model.DetailedDeliveryOrder.Clear();
            foreach (var item in dOrder.DetailedDeliveryOrders)
            {
                item.Product = _productService.GetProduct(item.idProduct);
                model.DetailedDeliveryOrder.Add(item);
            }
            return(View(model));
        }