//檢視未出貨訂單明細,並要可以勾選要出貨的明細,檢視該採購單所有的產品,並可以選擇出貨那些產品 public async Task <ActionResult> UnshipOrderDtl([Bind(Include = "PurchaseOrderID")] shipOrderViewModel purchaseOrder) { var q = from po in db.PurchaseOrder where po.PurchaseOrderID == purchaseOrder.PurchaseOrderID select new shipOrderViewModel { PurchaseOrderID = po.PurchaseOrderID, PurchaseOrderStatus = po.PurchaseOrderStatus }; var query = q.First(); return(View(query)); }
//出貨按鈕ACTION結束在這 ////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// UnshipOrderDtl的patialView方法 /// 改用PARTIALVIEW寫寫看 /// </summary> /// <returns></returns> //回傳PATIALVIEW給UnShipOrderDtl.cshtml //這裡應該要檢查庫存不足,和已出貨的明細,並直接顯示在第一欄 public ActionResult GetPurchaseOrderDtlPatialView(shipOrderViewModel 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, pod.PurchasedQty, 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; int shipQty = 0; if (db.ShipNoticeDtl.Where(x => x.PurchaseOrderDtlCode == item.PurchaseOrderDtlCode).SingleOrDefault() != null) { shipQty = db.ShipNoticeDtl.Where(x => x.PurchaseOrderDtlCode == item.PurchaseOrderDtlCode).SingleOrDefault().ShipQty; } orderDtlItemChecked.Qty = item.Qty - shipQty; //顯示庫存是否足夠 if (item.UnitsInStock >= orderDtlItemChecked.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, PartNumber = pod.PartNumber, QtyPerUnit = pod.QtyPerUnit, TotalPartQty = pod.TotalPartQty, PurchaseQty = pod.Qty, SourceListID = pod.SourceListID, CommittedArrivalDate = pod.CommittedArrivalDate, ShipDate = pod.ShipDate, DateRequired = pod.DateRequired, UnitsInStock = sl.UnitsInStock }; od = queryOrderitem.ToList(); //檢查是否有出貨過,有的話要檢查是否出貨明細SHIPQTY是否和採購單QTY是否相同 //相同的話,代表該商品已全部出貨完畢,Unship = true,否則仍然有需要出貨的數量,Unship = false foreach (var orderdtl in od) { if (orderdtl.ShipDate == null) { orderdtl.Unship = true; orderdtl.ShipQty = 0; } else { ShipNoticeDtl snd = db.ShipNoticeDtl.Where(x => x.PurchaseOrderDtlCode == orderdtl.PurchaseOrderDtlCode).SingleOrDefault(); if (snd != null && snd.ShipQty < orderdtl.PurchaseQty) { orderdtl.Unship = true; orderdtl.ShipQty = snd.ShipQty; } else { orderdtl.Unship = false; orderdtl.ShipQty = orderdtl.PurchaseQty; } } } shipOrderViewModel uodvm = new shipOrderViewModel() { PurchaseOrderID = unshipOrderDtlViewModel.PurchaseOrderID, orderDtlItems = od, orderDtlItemCheckeds = odc }; return(PartialView("_GetPurchaseOrderDtlPatialView", uodvm)); }
public async Task <ActionResult> shipCheckDtl(shipOrderViewModel unshipOrderDtl) { string shipnoticesid = "";//為了進貨單而設立的變數 //////////////////////////////////////////////// //取得供應商帳號資料 SupplierAccount supplier = User.Identity.GetSupplierAccount(); supplierAccount = supplier.SupplierAccountID; supplierCode = supplier.SupplierCode; //////////////////////////////////////////////////// //ShipNoticesUtilities utilities = new ShipNoticesUtilities(); string message = ""; //此LIST要用來存放出貨明細ID 用來寄送電子郵件給公司採購員 List <string> shipDtlList = new List <string>(); List <int> shipDtlListQty = new List <int>(); string shipNoticeID = ""; //建立一個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); } } //檢查是否至少一個被勾選,如沒有則跳回去UnshipOrderDtl頁面 if (orderDtls.Count() == 0) { TempData["message"] = "<script>toastr.error('請選擇欲出貨商品!','通知')</script>"; message = "請選擇欲出貨商品!"; return(RedirectToAction("UnshipOrderDtl", "ShipNotices", new { PurchaseOrderID = unshipOrderDtl.PurchaseOrderID, message = message })); } DateTime now = DateTime.Now; //檢查庫存是否足夠,不足則顯示庫存不足的訊息,足夠則扣掉該或源清單庫存 //並新增該採購單明細實際出貨日期,新增出貨明細// foreach (var dtl in orderDtls) { SourceList sourceList = db.SourceList.Find(dtl.SourceListID); if (sourceList.UnitsInStock < unshipOrderDtl.orderDtlItemCheckeds.Where(x => x.PurchaseOrderDtlCode == dtl.PurchaseOrderDtlCode).FirstOrDefault().Qty) { //這裡要return 錯誤訊息,並且回到原頁面 TempData["message"] = "<script>Swal.fire({ icon: 'error', title: 'Oops...', text: '庫存不足!', footer: '<a href>Why do I have this issue?</a>'})</script>"; message = "庫存不足!"; // return Json(new { PurchaseOrderID = unshipOrderDtl.PurchaseOrderID, message = message }, JsonRequestBehavior.AllowGet); return(RedirectToAction("UnshipOrderDtl", "ShipNotices", new { PurchaseOrderID = unshipOrderDtl.PurchaseOrderID, message = message })); } //扣除該料件貨源清單的庫存以及訂單數量 //出貨數量要在這裡檢查,先檢查出貨明細裡面的shipQty比對是否小於同一個採購單明細的Qty, //是的話,扣除該料件貨源清單的庫存以及訂單數量並且更新shipQty if (db.ShipNoticeDtl.Where(x => x.PurchaseOrderDtlCode == dtl.PurchaseOrderDtlCode).FirstOrDefault() != null) { ShipNoticeDtl snd = db.ShipNoticeDtl.Where(x => x.PurchaseOrderDtlCode == dtl.PurchaseOrderDtlCode).FirstOrDefault(); int orderQty = dtl.Qty; if (orderQty > snd.ShipQty || (unshipOrderDtl.orderDtlItemCheckeds.Where(x => x.PurchaseOrderDtlCode == dtl.PurchaseOrderDtlCode).FirstOrDefault().Qty + snd.ShipQty) < orderQty) { sourceList.UnitsInStock = sourceList.UnitsInStock - unshipOrderDtl.orderDtlItemCheckeds.Where(x => x.PurchaseOrderDtlCode == dtl.PurchaseOrderDtlCode).FirstOrDefault().Qty; } } else { sourceList.UnitsInStock = sourceList.UnitsInStock - unshipOrderDtl.orderDtlItemCheckeds.Where(x => x.PurchaseOrderDtlCode == dtl.PurchaseOrderDtlCode).FirstOrDefault().Qty; if (sourceList.UnitsOnOrder < dtl.Qty) { sourceList.UnitsOnOrder = 0; } else { sourceList.UnitsOnOrder = sourceList.UnitsOnOrder - dtl.Qty; } } //新增出貨通知 應該在這 先檢查是否有該筆出貨通知(因為有可能分開出貨,所以同筆訂單後出貨的就不用在增加出貨通知,只要增加出貨明細即可) 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; shipnoticesid = snId; //將出貨ID存入變數中 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(); } //檢查是否有該出貨明細,沒有則新增出貨明細 if (db.ShipNoticeDtl.Where(x => x.PurchaseOrderDtlCode == dtl.PurchaseOrderDtlCode).FirstOrDefault() == null) { //新增出貨明細 保存期限先不填 ShipNoticeDtl shipNoticeDtl = new ShipNoticeDtl(); shipNoticeDtl.ShipNoticeID = db.ShipNotice.Where(x => x.PurchaseOrderID == unshipOrderDtl.PurchaseOrderID).FirstOrDefault().ShipNoticeID; shipnoticesid = shipNoticeDtl.ShipNoticeID; //將出貨ID存入變數中 shipNoticeDtl.PurchaseOrderDtlCode = dtl.PurchaseOrderDtlCode; shipNoticeDtl.ShipQty = unshipOrderDtl.orderDtlItemCheckeds.Where(x => x.PurchaseOrderDtlCode == dtl.PurchaseOrderDtlCode).FirstOrDefault().Qty; //金額為數量*單價*折扣*批量 shipNoticeDtl.ShipAmount = Convert.ToInt32(shipNoticeDtl.ShipQty * dtl.PurchaseUnitPrice * (1 - dtl.Discount) * dtl.QtyPerUnit); //把新出貨明細資料加進資料庫 db.ShipNoticeDtl.Add(shipNoticeDtl); //存進出貨明細OID給寄送電子郵件用,改成存採購單編號CODE,因為OID會有新增先後順序的問題 shipDtlList.Add(dtl.PurchaseOrderDtlCode); shipDtlListQty.Add(unshipOrderDtl.orderDtlItemCheckeds.Where(x => x.PurchaseOrderDtlCode == dtl.PurchaseOrderDtlCode).FirstOrDefault().Qty); } //有的話,則去修改出貨明細表的出貨數量和出貨金額 else { ShipNoticeDtl snd = db.ShipNoticeDtl.Where(x => x.PurchaseOrderDtlCode == dtl.PurchaseOrderDtlCode).FirstOrDefault(); snd.ShipQty += unshipOrderDtl.orderDtlItemCheckeds.Where(x => x.PurchaseOrderDtlCode == dtl.PurchaseOrderDtlCode).FirstOrDefault().Qty; snd.ShipAmount = Convert.ToInt32(snd.ShipQty * dtl.PurchaseUnitPrice * (1 - dtl.Discount) * dtl.QtyPerUnit); db.Entry(snd).State = EntityState.Modified; //存進出貨明細OID給寄送電子郵件用,改成存採購單編號CODE,因為OID會有新增先後順序的問題 shipDtlList.Add(dtl.PurchaseOrderDtlCode); shipDtlListQty.Add(unshipOrderDtl.orderDtlItemCheckeds.Where(x => x.PurchaseOrderDtlCode == dtl.PurchaseOrderDtlCode).FirstOrDefault().Qty); } //不管是採購單明細或是採購單有異動都要新增採購單異動總表 //新增採購單異動總表(明細) POChanged pOChanged = new POChanged(); pOChanged.PurchaseOrderID = unshipOrderDtl.PurchaseOrderID; pOChanged.POChangedCategoryCode = POChangedCategoryCodeShipped; pOChanged.RequestDate = now; pOChanged.DateRequired = dtl.DateRequired; pOChanged.RequesterRole = RequesterRoleSupplier; pOChanged.RequesterID = supplierAccount; pOChanged.PurchaseOrderDtlCode = dtl.PurchaseOrderDtlCode; pOChanged.Qty = db.PurchaseOrderDtl.Find(dtl.PurchaseOrderDtlCode).Qty; db.POChanged.Add(pOChanged); db.SaveChanges(); //新增採購單明細出貨日期欄位以及POchangedOID欄位 dtl.ShipDate = now; //更新採購單明細POChangedOID欄位 //找出最新一筆採購單異動資料且是供應商的 dtl.POChangedOID = utilities.FindPOChangedOIDByDtlCode(RequesterRoleSupplier, dtl.PurchaseOrderDtlCode); //把資料庫中的每筆訂單明細以及貨源清單資料狀態改為追蹤 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; } else { //如果有出貨過,檢查出貨數量是否跟採購單採購數量一致 ShipNoticeDtl snd = db.ShipNoticeDtl.Where(x => x.PurchaseOrderDtlCode == pod.PurchaseOrderDtlCode).SingleOrDefault(); if (snd != null && pod.Qty > snd.ShipQty) { 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更新至採購單明細POChangedOID欄位中 var podQueryForPOChangedOID = from pod in db.PurchaseOrderDtl where pod.PurchaseOrderID == unshipOrderDtl.PurchaseOrderID select pod; int pOChangedOID = utilities.FindPOChangedOID(RequesterRoleSupplier, unshipOrderDtl.PurchaseOrderID); 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>"; message = "已全部出貨"; } //成功回原頁面 //TempData["message"] = "<script>Swal.fire({position: 'top-end',icon: 'success',title: '出貨處理成功,庫存已扣除',showConfirmButton: false,timer: 1500})</script>"; TempData["message"] = "出貨處理成功,庫存已扣除"; if (message == "") { message = "出貨處理成功,庫存已扣除"; } List <OrderDtlForMail> odm = orderDtlForMails(shipDtlList, shipDtlListQty); await SendMailToBuyer(odm); //呼叫新增進貨單方法 PurchaseOrderReceivesController purchaseOrderReceivesController = new PurchaseOrderReceivesController(); purchaseOrderReceivesController.Create(shipnoticesid); //return Json(new { PurchaseOrderID = unshipOrderDtl.PurchaseOrderID, message = message },JsonRequestBehavior.AllowGet); return(RedirectToAction("Index", "ShipNotices", new { PurchaseOrderID = unshipOrderDtl.PurchaseOrderID, message = message })); }