public ActionResult Create([Bind(Include = "PurchaseOrderOID,PurchaseRequisitionID,CheckedResultSetVM")] PurchaseOrderCreateViewModel model) { if (model == null || model.CheckedResultSetVM.Count(s => s.Checked) == 0) { TempData["ErrorMessage"] = "採購細項請至少勾選一項"; return(RedirectToAction("Create")); } //從暫存新增至正式資料表 DateTime now = DateTime.Now; using (PMSAEntities db = new PMSAEntities()) { //新增採購單 PurchaseOrderTemp pot = db.PurchaseOrderTemp.Find(model.PurchaseOrderOID); db.Entry(pot).State = EntityState.Detached; string poId = $"PO-{now:yyyyMMdd}-"; int count = db.PurchaseOrder.Where(i => i.PurchaseOrderID.StartsWith(poId)).Count(); count++; poId = $"{poId}{count:000}"; PurchaseOrder po = new PurchaseOrder { PurchaseOrderID = poId, SupplierCode = pot.SupplierCode, EmployeeID = pot.EmployeeID, CreateDate = now, PurchaseOrderStatus = "N" }; db.PurchaseOrder.Add(po); db.SaveChanges(); //新增採購單明細 int index = 0; foreach (var item in model.CheckedResultSetVM) { if (!item.Checked) { continue; } var podt = db.PurchaseOrderDtlTemp.Find(item.PurchaseOrderDtlOID); index++; PurchaseOrderDtl pod = new PurchaseOrderDtl { PurchaseOrderDtlCode = $"{poId}-{index:000}", PurchaseOrderID = poId, PartNumber = podt.PartNumber, PartName = podt.PartName, PartSpec = podt.PartSpec, QtyPerUnit = podt.QtyPerUnit, TotalPartQty = podt.TotalPartQty, OriginalUnitPrice = podt.OriginalUnitPrice, Discount = podt.Discount, PurchaseUnitPrice = podt.PurchaseUnitPrice, Qty = podt.Qty, PurchasedQty = podt.PurchasedQty, GoodsInTransitQty = podt.GoodsInTransitQty, Total = podt.Total, DateRequired = podt.DateRequired, CommittedArrivalDate = podt.CommittedArrivalDate, ShipDate = podt.ShipDate, ArrivedDate = podt.ArrivedDate, SourceListID = podt.SourceListID }; db.PurchaseOrderDtl.Add(pod); db.SaveChanges(); //請購單與採購單關聯 //TODO: 應從暫存取出,目前暫以傳入方式處理 PRPORelation rel = new PRPORelation { PurchaseOrderID = poId, PurchaseOrderDtlCode = pod.PurchaseOrderDtlCode, PurchaseRequisitionID = model.PurchaseRequisitionID, PurchaseRequisitionDtlCode = item.PurchaseRequisitionDtlCode, }; db.PRPORelation.Add(rel); db.SaveChanges(); //採購單異動總表 POChanged poc = new POChanged { PurchaseOrderID = poId, POChangedCategoryCode = "N", RequestDate = now, RequesterRole = "P", RequesterID = pot.EmployeeID }; db.POChanged.Add(poc); db.SaveChanges(); //更新PurchaseOrderDtl.POChangedOID pod.POChangedOID = poc.POChangedOID; db.Entry(pod).Property(podp => podp.POChangedOID).IsModified = true; db.SaveChanges(); } //刪除暫存資料 var PRPORelationTemps = db.PRPORelationTemp.Where(i => i.PurchaseOrderOID == model.PurchaseOrderOID); db.PRPORelationTemp.RemoveRange(PRPORelationTemps); db.SaveChanges(); var PurchaseOrderDtlTemps = db.PurchaseOrderDtlTemp.Where(i => i.PurchaseOrderOID == model.PurchaseOrderOID); db.PurchaseOrderDtlTemp.RemoveRange(PurchaseOrderDtlTemps); var PurchaseOrderOld = db.PurchaseOrderTemp.Find(model.PurchaseOrderOID); db.PurchaseOrderTemp.Remove(PurchaseOrderOld); } return(RedirectToAction("Index")); }
public IEnumerable <PurchaseOrderDtlItem> GetPurchaseOrderDtlList(string purchaseRequisitionID, string supplierCode) { IEnumerable <PurchaseOrderDtlItem> pods = null; DateTime now = DateTime.Now; //排除時間 now = new DateTime(now.Year, now.Month, now.Day); //取得顯示資料 using (PMSAEntities db = new PMSAEntities()) { var podq = from pr in db.PurchaseRequisition join prd in db.PurchaseRequisitionDtl on new { pr.PurchaseRequisitionID, ID = pr.PurchaseRequisitionID } equals new { prd.PurchaseRequisitionID, ID = purchaseRequisitionID } join sl in db.SourceList on new { prd.PartNumber, SupplierCode = supplierCode } equals new { sl.PartNumber, sl.SupplierCode } join p in db.Part on sl.PartNumber equals p.PartNumber where !(from prdRel in db.PRPORelation select prdRel.PurchaseRequisitionDtlCode).Contains(prd.PurchaseRequisitionDtlCode) && sl.SourceListDtl.Where(d => d.DiscountBeginDate <= now && d.DiscountEndDate >= now).Any() orderby prd.PurchaseRequisitionDtlCode select new PurchaseOrderDtlItem { PartNumber = prd.PartNumber, PartName = p.PartName, PartSpec = p.PartSpec, QtyPerUnit = sl.QtyPerUnit, OriginalUnitPrice = sl.UnitPrice, Qty = sl.MOQ.HasValue && prd.Qty < sl.MOQ.Value ? sl.MOQ.Value : prd.Qty, Discount = 0M, DateRequired = prd.DateRequired, SourceListID = sl.SourceListID, PurchaseRequisitionDtlCode = prd.PurchaseRequisitionDtlCode }; pods = podq.ToList(); } //設定折扣 foreach (PurchaseOrderDtlItem item in pods) { using (PMSAEntities db = new PMSAEntities()) { IEnumerable <SourceListDtl> sldq = db.SourceListDtl.Where(s => s.SourceListID == item.SourceListID && s.DiscountBeginDate <= now && s.DiscountEndDate >= now).OrderBy(o => o.QtyDemanded); foreach (SourceListDtl sld in sldq) { if (item.Qty >= sld.QtyDemanded) { item.Discount = sld.Discount; } } item.TotalPartQty = item.QtyPerUnit * item.Qty; item.PurchaseUnitPrice = (int)Math.Ceiling(item.OriginalUnitPrice * (1 - item.Discount)); item.Total = item.PurchaseUnitPrice * item.Qty; item.DateRequired = item.DateRequired.AddDays(-7); } } //寫入暫存資料表 using (PMSAEntities db = new PMSAEntities()) { //TODO: 多人新增相同請購單來源會有刪除同一筆資料的問題,請購單需要設定[新增中]的狀態 //移除現有資料 var rortq = db.PRPORelationTemp.Where(p => p.PurchaseRequisitionID == purchaseRequisitionID); int?poOid = rortq.FirstOrDefault()?.PurchaseOrderOID; if (poOid.HasValue) { db.PRPORelationTemp.RemoveRange(rortq); var podtq = db.PurchaseOrderDtlTemp.Where(p => p.PurchaseOrderOID == poOid); db.PurchaseOrderDtlTemp.RemoveRange(podtq); var potq = db.PurchaseOrderTemp.Find(poOid); db.PurchaseOrderTemp.Remove(potq); db.SaveChanges(); } //新增暫存資料 PurchaseOrderTemp pot = new PurchaseOrderTemp { SupplierCode = supplierCode, EmployeeID = emp.EmployeeID, CreateDate = DateTime.Now }; db.PurchaseOrderTemp.Add(pot); db.SaveChanges(); //更新暫存OID foreach (var item in pods) { item.PurchaseOrderOID = pot.PurchaseOrderOID; } foreach (var item in pods) { PurchaseOrderDtlTemp podt = new PurchaseOrderDtlTemp { PurchaseOrderOID = pot.PurchaseOrderOID, PartNumber = item.PartNumber, PartName = item.PartName, PartSpec = item.PartSpec, QtyPerUnit = item.QtyPerUnit, TotalPartQty = item.TotalPartQty, OriginalUnitPrice = item.OriginalUnitPrice, Discount = item.Discount, PurchaseUnitPrice = item.PurchaseUnitPrice, Qty = item.Qty, PurchasedQty = 0, GoodsInTransitQty = 0, Total = item.Total, SourceListID = item.SourceListID }; db.PurchaseOrderDtlTemp.Add(podt); db.SaveChanges(); item.PurchaseOrderDtlOID = podt.PurchaseOrderDtlOID; PRPORelationTemp rort = new PRPORelationTemp { PurchaseRequisitionID = purchaseRequisitionID, PurchaseRequisitionDtlCode = item.PurchaseRequisitionDtlCode, PurchaseOrderOID = pot.PurchaseOrderOID, PurchaseOrderDtlOID = podt.PurchaseOrderDtlOID }; db.PRPORelationTemp.Add(rort); db.SaveChanges(); } } return(pods); }