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);
        }