Esempio n. 1
0
 //檢視未出貨訂單明細,並要可以勾選要出貨的明細,檢視該採購單所有的產品,並可以選擇出貨那些產品
 public ActionResult UnshipOrderDtl([Bind(Include = "PurchaseOrderID")] UnshipOrderDtlViewModel purchaseOrder)
 {
     return(View(purchaseOrder));
 }
Esempio n. 2
0
        public ActionResult shipCheckDtl(UnshipOrderDtlViewModel unshipOrderDtl)
        {
            //建立一個LIST用來接住所有的OrderDtlItemChecked
            IList <OrderDtlItemChecked> OrderDtlChecked = unshipOrderDtl.orderDtlItemCheckeds;
            //用來存放確定有要出貨的LIST(有勾選)
            List <PurchaseOrderDtl> orderDtls = new List <PurchaseOrderDtl>();

            //檢查是否有勾選出貨,true為有勾,有則放進orderDtls
            foreach (var dtl in OrderDtlChecked)
            {
                if (dtl.Checked)
                {
                    PurchaseOrderDtl purchaseOrderDtl = db.PurchaseOrderDtl.Find(dtl.PurchaseOrderDtlCode);
                    orderDtls.Add(purchaseOrderDtl);
                }
            }
            DateTime          now         = DateTime.Now;
            List <SourceList> sourceLists = new List <SourceList>();

            //檢查庫存是否足夠,不足則顯示庫存不足的訊息,足夠則扣掉該或源清單庫存
            //並新增該採購單明細實際出貨日期,新增出貨明細//
            foreach (var dtl in orderDtls)
            {
                SourceList sourceList = db.SourceList.Find(dtl.SourceListID);
                if (sourceList.UnitsInStock < dtl.Qty)
                {
                    //這裡要return 錯誤訊息,並且回到原頁面
                    TempData["message"] = "<script>Swal.fire({  icon: 'error',  title: 'Oops...',  text: '庫存不足!',  footer: '<a href>Why do I have this issue?</a>'})</script>";
                    return(RedirectToAction("UnshipOrderDtl", "ShipNotices", new { PurchaseOrderID = unshipOrderDtl.PurchaseOrderID }));
                }
                //扣除該料件貨源清單的庫存以及訂單數量
                sourceList.UnitsInStock = sourceList.UnitsInStock - dtl.Qty;
                if (sourceList.UnitsOnOrder < dtl.Qty)
                {
                    sourceList.UnitsOnOrder = 0;
                }
                else
                {
                    sourceList.UnitsOnOrder = sourceList.UnitsOnOrder - dtl.Qty;
                }
                sourceLists.Add(sourceList);
                dtl.ShipDate = now;
                //新增出貨通知 應該在這 先檢查是否有該筆出貨通知(因為有可能分開出貨,所以同筆訂單後出貨的就不用在增加出貨通知,只要增加出貨明細即可)
                if (db.ShipNotice.Where(x => x.PurchaseOrderID == unshipOrderDtl.PurchaseOrderID).FirstOrDefault() == null)
                {
                    //新增出貨通知//感覺應該要在外面再加一個迴圈做出貨通知以及出貨明細
                    ShipNotice shipNotice = new ShipNotice();
                    string     snId       = $"SN-{now:yyyyMMdd}-";
                    int        count      = db.ShipNotice.Where(x => x.ShipNoticeID.StartsWith(snId)).Count();
                    count++;
                    snId = $"{snId}{count:000}";
                    shipNotice.ShipNoticeID      = snId;
                    shipNotice.PurchaseOrderID   = unshipOrderDtl.PurchaseOrderID;
                    shipNotice.ShipDate          = now;
                    shipNotice.EmployeeID        = db.PurchaseOrder.Find(unshipOrderDtl.PurchaseOrderID).EmployeeID;
                    shipNotice.CompanyCode       = db.Employee.Find(shipNotice.EmployeeID).CompanyCode;
                    shipNotice.SupplierAccountID = supplierAccount;
                    db.ShipNotice.Add(shipNotice);
                    //先把新增的出貨通知資料存進資料庫
                    db.SaveChanges();
                }
                //新增出貨明細 保存期限先不填
                ShipNoticeDtl shipNoticeDtl = new ShipNoticeDtl();
                shipNoticeDtl.ShipNoticeID         = db.ShipNotice.Where(x => x.PurchaseOrderID == unshipOrderDtl.PurchaseOrderID).FirstOrDefault().ShipNoticeID;
                shipNoticeDtl.PurchaseOrderDtlCode = dtl.PurchaseOrderDtlCode;
                shipNoticeDtl.ShipQty = dtl.Qty;
                //金額為數量*單價*折扣*批量
                shipNoticeDtl.ShipAmount = Convert.ToInt32(dtl.Qty * dtl.PurchaseUnitPrice * (1 - dtl.Discount) * dtl.QtyPerUnit);
                //把新出貨明細資料加進資料庫
                db.ShipNoticeDtl.Add(shipNoticeDtl);
                //把資料庫中的每筆訂單以及貨源清單資料狀態改為追蹤
                db.Entry(dtl).State        = EntityState.Modified;
                db.Entry(sourceList).State = EntityState.Modified;
            }
            //存進資料庫
            db.SaveChanges();
            //檢查該筆訂單所有產品是否都已經出貨,如果是,將該筆採購單狀態改為已出貨"S"
            //預設先當作都已出貨
            bool poCheck = true;
            var  q       = from pod in db.PurchaseOrderDtl
                           where pod.PurchaseOrderID == unshipOrderDtl.PurchaseOrderID
                           select pod;

            foreach (var pod in q)
            {
                if (pod.ShipDate == null)
                {
                    //找到未出貨產品,代表尚未全部出貨
                    poCheck = false;
                }
            }
            //確認是否已全部出貨,如果是修改採購單狀態為已出貨(S)並新增一筆採購單異動資料
            //採購單明細的POChangedOID欄位也要更新
            if (poCheck)
            {
                //改採購單狀態
                db.PurchaseOrder.Find(unshipOrderDtl.PurchaseOrderID).PurchaseOrderStatus = POChangedCategoryCodeShipped;
                //新增採購單異動總表
                POChanged pOChanged = new POChanged();
                pOChanged.PurchaseOrderID       = unshipOrderDtl.PurchaseOrderID;
                pOChanged.POChangedCategoryCode = POChangedCategoryCodeShipped;
                pOChanged.RequestDate           = now;
                pOChanged.RequesterRole         = RequesterRoleSupplier;
                pOChanged.RequesterID           = supplierAccount;
                db.POChanged.Add(pOChanged);
                db.SaveChanges();
                //更新採購單明細POChangedOID欄位
                //2019 11/20 23:06 下方註解掉的程式碼不知道為甚麼會發生無法辨識此方法,無法放入站存區,所以只好分開來寫
                //int a = db.POChanged.Last(x => (x.RequesterRole == RequesterRoleSupplier) && (x.PurchaseOrderID == unshipOrderDtl.PurchaseOrderID)).POChangedOID;

                //先找出最新一筆採購單異動資料且是供應商的
                var      poc          = db.POChanged.Where(x => (x.RequesterRole == RequesterRoleSupplier) && (x.PurchaseOrderID == unshipOrderDtl.PurchaseOrderID));
                DateTime dt           = poc.FirstOrDefault().RequestDate;
                int      pOChangedOID = poc.FirstOrDefault().POChangedOID;
                foreach (var pocD in poc)
                {
                    if (pocD.RequestDate > dt)
                    {
                        dt           = pocD.RequestDate;
                        pOChangedOID = pocD.POChangedOID;
                    }
                }
                //然後把找出來的採購單異動總表最新的POChangedOID更新至採購單明細POChangedOID欄位中
                var podQueryForPOChangedOID = from pod in db.PurchaseOrderDtl
                                              where pod.PurchaseOrderID == unshipOrderDtl.PurchaseOrderID
                                              select pod;
                foreach (var pod in podQueryForPOChangedOID)
                {
                    pod.POChangedOID    = pOChangedOID;
                    db.Entry(pod).State = EntityState.Modified;
                }
                db.SaveChanges();
                TempData["message"] = "<script>Swal.fire({position: 'top-end',icon: 'success',title: '出貨處理成功,庫存已扣除',showConfirmButton: false,timer: 1500})</script>";
            }
            //成功回原頁面
            TempData["message"] = "<script>Swal.fire({position: 'top-end',icon: 'success',title: '已全部出貨',showConfirmButton: false,timer: 1500})</script>";
            return(RedirectToAction("UnshipOrderDtl", "ShipNotices", new { PurchaseOrderID = unshipOrderDtl.PurchaseOrderID }));
        }
Esempio n. 3
0
        //出貨按鈕ACTION結束在這

        /// <summary>
        /// UnshipOrderDtl的patialView方法
        /// 改用PARTIALVIEW寫寫看
        /// </summary>
        /// <returns></returns>
        //回傳PATIALVIEW給UnShipOrderDtl.cshtml
        //這裡應該要檢查庫存不足,和已出貨的明細,並直接顯示在第一欄
        public ActionResult GetPurchaseOrderDtlPatialView(UnshipOrderDtlViewModel unshipOrderDtlViewModel)
        {
            var q = from pod in db.PurchaseOrderDtl.AsEnumerable()
                    join sl in db.SourceList on pod.SourceListID equals sl.SourceListID
                    where pod.PurchaseOrderID == unshipOrderDtlViewModel.PurchaseOrderID
                    select new
            {
                pod.PurchaseOrderID,
                pod.PurchaseOrderDtlOID,
                pod.PurchaseOrderDtlCode,
                pod.Qty,
                sl.UnitsInStock
            };
            IList <OrderDtlItemChecked> odc = new List <OrderDtlItemChecked>();

            foreach (var item in q)
            {
                OrderDtlItemChecked orderDtlItemChecked = new OrderDtlItemChecked();
                orderDtlItemChecked.PurchaseOrderDtlOID  = item.PurchaseOrderDtlOID;
                orderDtlItemChecked.PurchaseOrderDtlCode = item.PurchaseOrderDtlCode;
                //顯示庫存是否足夠
                if (item.UnitsInStock >= item.Qty)
                {
                    orderDtlItemChecked.IsEnough = true;
                }
                else
                {
                    orderDtlItemChecked.IsEnough = false;
                }
                //預設為沒有勾選
                orderDtlItemChecked.Checked = false;
                odc.Add(orderDtlItemChecked);
            }

            IEnumerable <OrderDtlItem> od = null;

            var queryOrderitem = from pod in db.PurchaseOrderDtl
                                 join sl in db.SourceList
                                 on pod.SourceListID equals sl.SourceListID
                                 where pod.PurchaseOrderID == unshipOrderDtlViewModel.PurchaseOrderID
                                 select new OrderDtlItem
            {
                PurchaseOrderDtlOID  = pod.PurchaseOrderDtlOID,
                PurchaseOrderDtlCode = pod.PurchaseOrderDtlCode,
                PartName             = pod.PartName,
                QtyPerUnit           = pod.QtyPerUnit,
                TotalPartQty         = pod.TotalPartQty,
                Qty                  = pod.Qty,
                SourceListID         = pod.SourceListID,
                CommittedArrivalDate = pod.CommittedArrivalDate,
                ShipDate             = pod.ShipDate,
                DateRequired         = pod.DateRequired,
                UnitsInStock         = sl.UnitsInStock
            };

            od = queryOrderitem.ToList();
            foreach (var orderdtl in od)
            {
                if (orderdtl.ShipDate == null)
                {
                    orderdtl.Unship = true;
                }
                else
                {
                    orderdtl.Unship = false;
                }
            }
            UnshipOrderDtlViewModel uodvm = new UnshipOrderDtlViewModel()
            {
                PurchaseOrderID      = unshipOrderDtlViewModel.PurchaseOrderID,
                orderDtlItems        = od,
                orderDtlItemCheckeds = odc
            };

            return(PartialView("_GetPurchaseOrderDtlPatialView", uodvm));
        }