public ProductRemainsViewModel GetRemainProduct(Guid productId, Guid orderId, Guid customerId)
        {
            ProductRemainsViewModel remain = new ProductRemainsViewModel()
            {
                RemainQuantity = 0,
                RemainWeight   = 0
            };

            List <InputDetail> inputDetails = UnitOfWork.InputDetailsRepository
                                              .Get(current => current.Order.CustomerId == customerId && current.OrderId == orderId &&
                                                   current.ProductId == productId && current.OrderId != null).ToList();

            foreach (var inputDetail in inputDetails)
            {
                remain.RemainQuantity = remain.RemainQuantity + inputDetail.RemainQuantity;
                remain.RemainWeight   = remain.RemainWeight + inputDetail.RemainDestinationWeight;
            }
            return(remain);
        }
        public ActionResult Details(CutOrderViewModel cutOrderViewModel)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    cutOrderViewModel.InputDetail = UnitOfWork.InputDetailsRepository.GetById(cutOrderViewModel.InputDetail.Id);

                    Order inputDetailOrder = UnitOfWork.OrderRepository.Get(current => current.Id == cutOrderViewModel.InputDetail.OrderId).FirstOrDefault();
                    cutOrderViewModel.InputDetail.Order = inputDetailOrder;
                    ProductRemainsViewModel remain = GetRemainProduct(cutOrderViewModel.InputDetail.ProductId, cutOrderViewModel.InputDetail.OrderId.Value, cutOrderViewModel.InputDetail.Order.CustomerId);

                    string cutId = string.Empty;
                    if (cutOrderViewModel.CutOrderId != null)
                    {
                        cutId = cutOrderViewModel.CutOrderId.ToString();
                        Guid cutGuid = new Guid(cutId);
                        cutOrderViewModel.CutOrderDetails = UnitOfWork.CutOrderDetailRepository.Include(current => current.CutOrder.InputDetail.Product.ProductGroup).Where(current => current.CutOrderId == cutGuid).ToList();
                    }
                    if (remain.RemainWeight < cutOrderViewModel.Weight)
                    {
                        ModelState.AddModelError("Weight", "وزن وارد شده بیش از وزن باقی مانده می باشد");
                    }
                    else if (remain.RemainQuantity < cutOrderViewModel.Quantity)
                    {
                        ModelState.AddModelError("Weight", "تعداد برگ وارد شده بیش از تعداد باقی مانده می باشد");
                    }
                    else if (remain.RemainWeight == 0)
                    {
                        ModelState.AddModelError("Weight", "کالا موجود نمی باشد");
                    }
                    else if (remain.RemainWeight == cutOrderViewModel.Weight)
                    {
                        if (cutOrderViewModel.CutOrderId == null)
                        {
                            CutOrder cut = new CutOrder()
                            {
                                CreationDate  = DateTime.Now,
                                InputDetailId = cutOrderViewModel.InputDetail.Id,
                                IsActive      = true,
                                IsDeleted     = false
                            };
                            UnitOfWork.CutOrderRepository.Insert(cut);
                            UnitOfWork.Save();
                            cutId = cut.Id.ToString();
                        }
                        Guid cutGuid = new Guid(cutId);
                        cutOrderViewModel.CutOrderId = cutGuid;
                        CutOrderDetail cutOrderDetail = new CutOrderDetail()
                        {
                            Weight         = cutOrderViewModel.Weight,
                            Length         = cutOrderViewModel.Length,
                            Quantity       = Convert.ToInt32(cutOrderViewModel.Quantity),
                            CutOrderId     = cutGuid,
                            CustomActionId = cutOrderViewModel.CustomActionId,
                            CreationDate   = DateTime.Now,
                            IsActive       = true,
                            IsDeleted      = false
                        };
                        UnitOfWork.CutOrderDetailRepository.Insert(cutOrderDetail);
                        UnitOfWork.Save();

                        cutOrderViewModel.CutOrderDetails = UnitOfWork.CutOrderDetailRepository.Include(current => current.CutOrder.InputDetail.Product.ProductGroup).Where(current => current.CutOrderId == cutOrderViewModel.CutOrderId).ToList();

                        InputDetail inputDetailUpdate = UnitOfWork.InputDetailsRepository.GetById(cutOrderViewModel.InputDetail.Id);
                        inputDetailUpdate.RemainDestinationWeight = 0;
                        inputDetailUpdate.RemainQuantity          = 0;
                        UnitOfWork.InputDetailsRepository.Update(inputDetailUpdate);
                        UnitOfWork.Save();
                        cutOrderViewModel.RemainWeight = inputDetailUpdate.RemainDestinationWeight;
                    }
                    else
                    {
                        if (cutOrderViewModel.CutOrderId != null)
                        {
                            Order order = new Order()
                            {
                                Customer  = cutOrderViewModel.InputDetail.Order.Customer,
                                Parent    = cutOrderViewModel.InputDetail.Order,
                                Code      = GenerateCode.GetChildOrderCode(cutOrderViewModel.InputDetail.OrderId.Value),
                                IsActive  = true,
                                IsDeleted = false,
                                IsLatest  = true
                            };
                            UnitOfWork.OrderRepository.Insert(order);
                            UnitOfWork.Save();

                            CutOrderDetail cutOrderDetail = new CutOrderDetail()
                            {
                                Weight         = cutOrderViewModel.Weight,
                                Length         = cutOrderViewModel.Length,
                                Quantity       = Convert.ToInt32(cutOrderViewModel.Quantity),
                                CutOrderId     = cutOrderViewModel.CutOrderId.Value,
                                CustomActionId = cutOrderViewModel.CustomActionId,
                                CreationDate   = DateTime.Now,
                                IsActive       = true,
                                IsDeleted      = false
                            };
                            UnitOfWork.CutOrderDetailRepository.Insert(cutOrderDetail);
                            UnitOfWork.Save();
                        }
                        else
                        {
                            Order order = new Order()
                            {
                                Customer  = cutOrderViewModel.InputDetail.Order.Customer,
                                Parent    = cutOrderViewModel.InputDetail.Order,
                                Code      = GenerateCode.GetChildOrderCode(cutOrderViewModel.InputDetail.OrderId.Value),
                                IsActive  = true,
                                IsDeleted = false,
                                IsLatest  = true
                            };
                            UnitOfWork.OrderRepository.Insert(order);
                            UnitOfWork.Save();

                            CutOrder cut = new CutOrder()
                            {
                                CreationDate  = DateTime.Now,
                                InputDetailId = cutOrderViewModel.InputDetail.Id,
                                IsActive      = true,
                                IsDeleted     = false
                            };
                            UnitOfWork.CutOrderRepository.Insert(cut);
                            UnitOfWork.Save();

                            cutOrderViewModel.CutOrderId = cut.Id;
                            CutOrderDetail cutOrderDetail = new CutOrderDetail()
                            {
                                Weight         = cutOrderViewModel.Weight,
                                Length         = cutOrderViewModel.Length,
                                Quantity       = Convert.ToInt32(cutOrderViewModel.Quantity),
                                CutOrderId     = cut.Id,
                                CustomActionId = cutOrderViewModel.CustomActionId,
                                CreationDate   = DateTime.Now,
                                IsActive       = true,
                                IsDeleted      = false
                            };
                            UnitOfWork.CutOrderDetailRepository.Insert(cutOrderDetail);
                            UnitOfWork.Save();
                        }
                        cutOrderViewModel.CutOrderDetails = UnitOfWork.CutOrderDetailRepository.Include(current => current.CutOrder.InputDetail.Product.ProductGroup).Where(current => current.CutOrderId == cutOrderViewModel.CutOrderId).ToList();


                        decimal     unit = remain.RemainWeight / remain.RemainQuantity;
                        InputDetail inputDetailUpdate = UnitOfWork.InputDetailsRepository.GetById(cutOrderViewModel.InputDetail.Id);
                        inputDetailUpdate.RemainDestinationWeight = remain.RemainWeight - cutOrderViewModel.Weight;
                        inputDetailUpdate.RemainQuantity          = remain.RemainQuantity - (cutOrderViewModel.Weight / unit);
                        UnitOfWork.InputDetailsRepository.Update(inputDetailUpdate);
                        UnitOfWork.Save();
                        cutOrderViewModel.RemainWeight = inputDetailUpdate.RemainDestinationWeight;
                    }
                }

                ViewBag.CustomActionId = new SelectList(UnitOfWork.ProductGroupCustomActionRepository.Get(x => x.ProductGroupId == cutOrderViewModel.InputDetail.Product.ProductGroupId).Select(x => x.CustomAction), "Id", "Title");
                ViewBag.CustomerName   = cutOrderViewModel.InputDetail.Order.Customer.FullName;
                return(View(cutOrderViewModel));
            }
            catch (Exception exp)
            {
                return(Json(exp.Message, JsonRequestBehavior.AllowGet));
            }
        }
        public ActionResult PostTransfer(string orderId, string productId, string weight, string qty, string customerId)
        {
            try
            {
                decimal weightDecimal = 0;
                int     qtyInt        = 0;
                string  message       = "message-";
                Guid    orderIdGuid   = new Guid(orderId);
                Guid    productIdGuid = new Guid(productId);

                if (!string.IsNullOrEmpty(weight))
                {
                    weightDecimal = Convert.ToDecimal(weight);
                }

                if (!string.IsNullOrEmpty(qty))
                {
                    qtyInt = Convert.ToInt32(qty);
                }

                Guid customerIdGuid = new Guid(customerId);

                Order order = UnitOfWork.OrderRepository.GetById(orderIdGuid);

                //  Product product = UnitOfWork.ProductRepository.GetById(productIdGuid);

                ProductRemainsViewModel remain = GetRemainProduct(productIdGuid, orderIdGuid, order.CustomerId);

                if (!string.IsNullOrEmpty(qty) && remain.RemainQuantity < qtyInt)
                {
                    return(Json(message + "تعداد وارد شده بیش از تعداد باقی مانده می باشد", JsonRequestBehavior.AllowGet));
                }

                if (!string.IsNullOrEmpty(weight) && remain.RemainWeight < weightDecimal)
                {
                    return(Json(message + "وزن وارد شده بیش از وزن باقی مانده می باشد", JsonRequestBehavior.AllowGet));
                }

                if (customerIdGuid == order.CustomerId)
                {
                    return(Json(message + "امکان انتقال حواله به مالک قبلی آن وجود ندارد", JsonRequestBehavior.AllowGet));
                }



                Guid childOrderId = new Guid();
                List <InputDetail> inputDetails = UnitOfWork.InputDetailsRepository
                                                  .Get(c => c.OrderId == order.Id).ToList();
                if (inputDetails.Count() == 1)//حواله فقط یک کالا دارد
                {
                    decimal initialQty    = 0;
                    decimal initialWeight = 0;
                    initialQty    += inputDetails.FirstOrDefault().Quantity;
                    initialWeight += inputDetails.FirstOrDefault().DestinationWeight;
                    if (initialQty == qtyInt || initialWeight == weightDecimal)
                    {
                        childOrderId = CreateChildOrder(orderIdGuid, customerIdGuid, false);
                    }
                    else
                    {
                        childOrderId = CreateChildOrder(orderIdGuid, customerIdGuid, true);
                    }
                }



                //Guid childOrderId = CreateChildOrder(orderIdGuid, customerIdGuid);

                decimal unit = remain.RemainWeight / remain.RemainQuantity;

                SeprateInputDetail(productIdGuid, orderIdGuid, order.CustomerId, qtyInt, weightDecimal, childOrderId, unit);

                UnitOfWork.Save();

                return(Json("true", JsonRequestBehavior.AllowGet));
            }
            catch (Exception e)
            {
                return(Json("false", JsonRequestBehavior.AllowGet));
            }
        }