public IActionResult Request_byWorkType(int nWorkTypeID)
        {
            DATA_Request r = new DATA_Request();

            var work = db.TB_Work.FirstOrDefault(w => w.nWorkID == nWorkTypeID);

            if (work != null)
            {
                var lstGroupID         = db.TB_Material_Group.Where(w => !w.IsDel && w.IsActive).Select(s => s.nGroupID).ToList();
                var lstGroupCategoryID = db.TB_Material_Category.Where(w => !w.IsDel && w.IsActive && lstGroupID.Contains(w.nGroupID))
                                         .Select(s => new { s.nGroupID, s.nCategoryID }).ToList();
                var lstMaterialID = db.TB_Materials.Where(w => !w.IsDel && w.IsActive).Select(s => new { s.nGroupID, s.nCategoryID, s.nMaterialID }).ToList()
                                    .Where(w => lstGroupCategoryID.Any(a => a.nGroupID == w.nGroupID && a.nCategoryID == w.nCategoryID)).Select(s => s.nMaterialID).ToList();
                var lstMatBP = db.TB_Materials_BP.Where(w => lstMaterialID.Contains(w.nMaterialID)).Select(s => new { s.nMaterialID, s.nMat_Balance }).ToList();

                var lstMaterial_Work = db.TB_Work_Material
                                       .Where(w => w.nWorkID == nWorkTypeID && w.IsActive && lstMaterialID.Contains(w.nMaterialID))
                                       .Select(s => new { s.nMaterialID, s.nAmount }).ToList();

                List <DATA_MaterialItem_Selected> lstMaterial_Selected = new List <DATA_MaterialItem_Selected>();
                lstMaterial_Work.ForEach(m =>
                {
                    var bp = lstMatBP.FirstOrDefault(w => w.nMaterialID == m.nMaterialID);
                    if (bp != null)
                    {
                        lstMaterial_Selected.Add(new DATA_MaterialItem_Selected()
                        {
                            ItemID = m.nMaterialID,
                            Amount = m.nAmount <= bp.nMat_Balance ? m.nAmount : bp.nMat_Balance
                        });
                    }
                });

                r.nWorkID              = work.nWorkID;
                r.nReasonID            = work.nReasonID;
                r.lstMaterial_Selected = lstMaterial_Selected;
            }

            return(Ok(r));
        }
        public IActionResult Request_Load(int nRequestID)
        {
            DATA_Request r = new DATA_Request();

            var req = db.T_Request.FirstOrDefault(w => w.nRequestID == nRequestID);

            if (req != null)
            {
                r.nRequestID       = req.nRequestID;
                r.sLocation        = req.sLocation;
                r.nReasonID        = req.nReasonID;
                r.sReasonDetail    = req.sDetail_Reason;
                r.isFastTrack      = req.IsFastTrack;
                r.sFastTrackDetail = req.sDetail_FastTrack;

                r.lstMaterial_Selected = db.T_Request_Material.Where(w => w.nRequestID == nRequestID)
                                         .Select(s => new DATA_MaterialItem_Selected()
                {
                    ItemID = s.nMaterialID, Amount = s.nRequest_Amount
                }).ToList();
            }

            return(Ok(r));
        }
        public IActionResult Request_Save(int nRequestID, DATA_Request d)
        {
            IProcessResult r = new IProcessResult();

            try
            {
                PTTGSP_DWSContext db   = new PTTGSP_DWSContext();
                UserAccount       ua   = IAuthen.SessionInfo();
                DateTime          dNow = DateTime.Now;

                var req = db.T_Request.FirstOrDefault(w => w.nRequestID == d.nRequestID);
                if (req == null)
                {
                    #region string sReqCode = ...;
                    string sReqCode              = "";
                    string sReqCode_Prefix       = "RS-" + dNow.ToStringFromDate("yyMM", "th-TH");
                    var    lstReqCode_samePrefix = db.T_Request.Where(w => w.sRequestNo.StartsWith(sReqCode_Prefix)).Select(s => s.sRequestNo).ToList();
                    string sReqCode_Last         = lstReqCode_samePrefix.Any() ? lstReqCode_samePrefix.Max() : "";
                    if (string.IsNullOrEmpty(sReqCode_Last))
                    {
                        sReqCode = sReqCode_Prefix + "1".PadLeft(4, '0');
                    }
                    else
                    {
                        int n = sReqCode_Last.Substring(sReqCode_Last.Length - 4).ToIntOrNull() ?? 1;
                        sReqCode = sReqCode_Prefix + n.ToString().PadLeft(4, '0');
                    }
                    #endregion

                    req = new T_Request()
                    {
                        sRequestNo        = sReqCode,
                        sOrgID            = ua.sUnitCode,
                        IsFastTrack       = d.isFastTrack,
                        sDetail_FastTrack = d.sFastTrackDetail,
                        nWorkID           = d.nWorkID,
                        nStepID           = 1,
                        IsCancel          = false,
                        sCreateBy         = ua.sEmployeeCode,
                        dCreate           = dNow
                    };
                    db.T_Request.Add(req);
                }

                req.sLocation      = d.sLocation;
                req.nReasonID      = d.nReasonID.Value;
                req.sDetail_Reason = d.sReasonDetail;
                req.sEmpCode_MG1   = ua.sEmpCode_MG1; req.IsApproved_MG1 = null;
                req.sEmpCode_MG2   = ua.sEmpCode_MG2; req.IsApproved_MG2 = null;
                req.sEmpCode_MG3   = ua.sEmpCode_MG3; req.IsApproved_MG3 = null;
                req.IsRevisit      = false;
                req.sUpdateBy      = ua.sEmployeeCode;
                req.dUpdate        = dNow;

                #region List<T_Request_Material> lstMaterial_ToSave = new List<T_Request_Material>() {...};
                List <T_Request_Material> lstMaterial_ToSave = new List <T_Request_Material>();

                var lstMaterialID = d.lstMaterial_Selected.Select(s => s.ItemID).ToList();
                var lstMaterial   = db.TB_Materials
                                    .Where(w => !w.IsDel && w.IsActive && lstMaterialID.Contains(w.nMaterialID))
                                    .Select(s => new { s.nMaterialID, s.nPrice }).ToList();

                decimal nTotalPrice = 0;
                d.lstMaterial_Selected.ForEach(m_selected =>
                {
                    var m_db = lstMaterial.FirstOrDefault(w => w.nMaterialID == m_selected.ItemID);
                    if (m_db != null)
                    {
                        var m = new T_Request_Material()
                        {
                            nMaterialID = m_selected.ItemID
                        };
                        m.nRequest_Amount     = m.nPay_Amount = m_selected.Amount;
                        m.nRequest_Price      = m.nPay_Price = m_db.nPrice;
                        m.nRequest_TotalPrice = m.nPay_TotalPrice = m_selected.Amount * m_db.nPrice;

                        nTotalPrice += m.nRequest_TotalPrice;

                        lstMaterial_ToSave.Add(m);
                    }
                });
                #endregion

                req.nRequest_TotalPrice = req.nPay_TotalPrice = nTotalPrice;

                db.SaveChanges();
                db = new PTTGSP_DWSContext();

                db.T_Request_Material.RemoveRange(db.T_Request_Material.Where(w => w.nRequestID == req.nRequestID));
                lstMaterial_ToSave.ForEach(m => { m.nRequestID = req.nRequestID; db.T_Request_Material.Add(m); });

                db.SaveChanges();
                r.Success = true;
            }
            catch (Exception ex)
            {
                r.Message = ex.Message;
            }

            return(Ok(r));
        }