public ENVIService.ENVIClass_Result Workflow_PTTApproveL4(ENVIService.ENVIClass_ENVI dataENVI)
            {
                ENVIService.ENVIClass_Result result = new ENVIService.ENVIClass_Result();
                var dataFacPTT = db.mTFacility.FirstOrDefault(w => w.cActive == "Y" && w.cDel == "N" && w.nLevel == 0 && w.CompanyID == 1 && w.sMappingCodePTT == dataENVI.FacilityCode);

                if (dataFacPTT != null)
                {
                    var dataFacilityGC = db.mTFacility.FirstOrDefault(w => w.nLevel == 1 && w.cDel == "N" && w.cActive == "Y" && w.nHeaderID == dataFacPTT.ID);
                    if (dataFacilityGC != null)
                    {
                        if (dataENVI.Quarter == 1 || dataENVI.Quarter == 2 || dataENVI.Quarter == 3 || dataENVI.Quarter == 4)
                        {
                            int nIndID = 0;
                            switch (dataENVI.IndicatorCode)
                            {
                            case ENVIService.EPIClass_DataType.InidcatorCode.IntensityDenominator: nIndID = API_ENVI.DataType.nIndIntensityID; break;

                            case ENVIService.EPIClass_DataType.InidcatorCode.Material: nIndID = API_ENVI.DataType.nIndMaterialID; break;

                            case ENVIService.EPIClass_DataType.InidcatorCode.Water: nIndID = API_ENVI.DataType.nIndWaterID; break;

                            case ENVIService.EPIClass_DataType.InidcatorCode.Waste: nIndID = API_ENVI.DataType.nIndWasteID; break;

                            case ENVIService.EPIClass_DataType.InidcatorCode.Emission: nIndID = API_ENVI.DataType.nIndEmissionID; break;

                            case ENVIService.EPIClass_DataType.InidcatorCode.Effluent: nIndID = API_ENVI.DataType.nIndEffluentID; break;

                            case ENVIService.EPIClass_DataType.InidcatorCode.Spill: nIndID = API_ENVI.DataType.nIndSpillID; break;

                            case ENVIService.EPIClass_DataType.InidcatorCode.Complaint: nIndID = API_ENVI.DataType.nIndComplaintID; break;

                            case ENVIService.EPIClass_DataType.InidcatorCode.Compliance: nIndID = API_ENVI.DataType.nIndComplianceID; break;
                            }

                            if (nIndID != 0)
                            {
                                int   nStatusApprove   = 34;
                                int[] arrAllowedStatus = new int[] { 30 };//Approve by PTT(L3)
                                var   dataTransfer     = db.TEPI_TransferPTT.FirstOrDefault(w => w.nYear == dataENVI.Year && w.nIndicatorID == nIndID && w.nQuarter == dataENVI.Quarter && w.nFacilityID == dataFacilityGC.ID && arrAllowedStatus.Contains(w.nStatusID ?? 0));
                                if (dataTransfer != null)
                                {
                                    //TEPI_TransferPTT
                                    dataTransfer.nStatusID = nStatusApprove;
                                    dataTransfer.dAction   = DateTime.Now;

                                    //TEPI_TransferPTT_SubFacility
                                    List <int> lstSubFac   = new List <int>();
                                    var        querySubFac = db.TEPI_TransferPTT_SubFacility.Where(w => w.nHeaderID == dataTransfer.nFacilityID && w.nYear == dataTransfer.nYear && w.nIndicatorID == dataTransfer.nIndicatorID && w.nQuarterID == dataTransfer.nQuarter).ToList();
                                    foreach (var item in querySubFac)
                                    {
                                        lstSubFac.Add(item.nFacilityID);
                                        item.nStatusID = nStatusApprove;
                                        item.dAction   = DateTime.Now;
                                    }

                                    #region TEPI_TransferPTT_Log
                                    TEPI_TransferPTT_Log tl = new TEPI_TransferPTT_Log();
                                    tl.nYear        = dataENVI.Year;
                                    tl.nFacilityID  = dataFacilityGC.ID;
                                    tl.nIndicatorID = nIndID;
                                    tl.nQuarter     = dataENVI.Quarter;
                                    tl.nStatusID    = nStatusApprove;
                                    tl.nActionBy    = -1;
                                    tl.dAction      = DateTime.Now;
                                    tl.sRemark      = dataENVI.Comment;
                                    db.TEPI_TransferPTT_Log.Add(tl);
                                    db.SaveChanges();
                                    #endregion

                                    db.SaveChanges();
                                    result.IsCompleted = true;
                                }
                                else
                                {
                                    result.IsCompleted = false;
                                    result.Message     = "Update Status Failed.";
                                }
                            }
                            else
                            {
                                result.IsCompleted = false;
                                result.Message     = "Invalid Indicator Code.";
                            }
                        }
                        else
                        {
                            result.IsCompleted = false;
                            result.Message     = "Invalid Quater.";
                        }
                    }
                    else
                    {
                        result.IsCompleted = false;
                        result.Message     = "Not Found GC Facility";
                    }
                }
                else
                {
                    result.IsCompleted = false;
                    result.Message     = "Not Found Facility Code.";
                }
                return(result);
            }
            public ENVIService.ENVIClass_Result Workflow_PTTClearWF(ENVIService.ENVIClass_ENVI dataENVI)
            {
                ENVIService.ENVIClass_Result result = new ENVIService.ENVIClass_Result();
                var dataFacPTT = db.mTFacility.FirstOrDefault(w => w.cActive == "Y" && w.cDel == "N" && w.nLevel == 0 && w.CompanyID == 1 && w.sMappingCodePTT == dataENVI.FacilityCode);

                if (dataFacPTT != null)
                {
                    var dataFacilityGC = db.mTFacility.FirstOrDefault(w => w.nLevel == 1 && w.cDel == "N" && w.cActive == "Y" && w.nHeaderID == dataFacPTT.ID);
                    if (dataFacilityGC != null)
                    {
                        if (dataENVI.Quarter == 1 || dataENVI.Quarter == 2 || dataENVI.Quarter == 3 || dataENVI.Quarter == 4)
                        {
                            int nIndID = 0;
                            switch (dataENVI.IndicatorCode)
                            {
                            case ENVIService.EPIClass_DataType.InidcatorCode.IntensityDenominator: nIndID = API_ENVI.DataType.nIndIntensityID; break;

                            case ENVIService.EPIClass_DataType.InidcatorCode.Material: nIndID = API_ENVI.DataType.nIndMaterialID; break;

                            case ENVIService.EPIClass_DataType.InidcatorCode.Water: nIndID = API_ENVI.DataType.nIndWaterID; break;

                            case ENVIService.EPIClass_DataType.InidcatorCode.Waste: nIndID = API_ENVI.DataType.nIndWasteID; break;

                            case ENVIService.EPIClass_DataType.InidcatorCode.Emission: nIndID = API_ENVI.DataType.nIndEmissionID; break;

                            case ENVIService.EPIClass_DataType.InidcatorCode.Effluent: nIndID = API_ENVI.DataType.nIndEffluentID; break;

                            case ENVIService.EPIClass_DataType.InidcatorCode.Spill: nIndID = API_ENVI.DataType.nIndSpillID; break;

                            case ENVIService.EPIClass_DataType.InidcatorCode.Complaint: nIndID = API_ENVI.DataType.nIndComplaintID; break;

                            case ENVIService.EPIClass_DataType.InidcatorCode.Compliance: nIndID = API_ENVI.DataType.nIndComplianceID; break;
                            }

                            if (nIndID != 0)
                            {
                                int nStatusWaitingSubmit = 0;
                                var dataTransfer         = db.TEPI_TransferPTT.FirstOrDefault(w => w.nYear == dataENVI.Year && w.nIndicatorID == nIndID && w.nQuarter == dataENVI.Quarter && w.nFacilityID == dataFacilityGC.ID);
                                if (dataTransfer != null)
                                {
                                    //TEPI_TransferPTT
                                    dataTransfer.nStatusID = nStatusWaitingSubmit;
                                    dataTransfer.dAction   = DateTime.Now;

                                    //TEPI_TransferPTT_SubFacility
                                    List <int> lstSubFac   = new List <int>();
                                    var        querySubFac = db.TEPI_TransferPTT_SubFacility.Where(w => w.nHeaderID == dataTransfer.nFacilityID && w.nYear == dataTransfer.nYear && w.nIndicatorID == dataTransfer.nIndicatorID && w.nQuarterID == dataTransfer.nQuarter).ToList();
                                    foreach (var item in querySubFac)
                                    {
                                        lstSubFac.Add(item.nFacilityID);
                                        item.nStatusID = nStatusWaitingSubmit;
                                        item.dAction   = DateTime.Now;
                                    }

                                    #region TEPI_TransferPTT_Log
                                    TEPI_TransferPTT_Log tl = new TEPI_TransferPTT_Log();
                                    tl.nYear        = dataENVI.Year;
                                    tl.nFacilityID  = dataFacilityGC.ID;
                                    tl.nIndicatorID = nIndID;
                                    tl.nQuarter     = dataENVI.Quarter;
                                    tl.nStatusID    = nStatusWaitingSubmit;
                                    tl.nActionBy    = -1;
                                    tl.dAction      = DateTime.Now;
                                    tl.sRemark      = dataENVI.Comment;
                                    db.TEPI_TransferPTT_Log.Add(tl);
                                    db.SaveChanges();
                                    #endregion

                                    #region TEPI_Workflow
                                    string sYear       = dataENVI.Year + "";
                                    var    dataEPIFrom = db.TEPI_Forms.Where(w => w.IDIndicator == nIndID && w.sYear == sYear && lstSubFac.Contains(w.FacilityID ?? 0)).ToList();
                                    foreach (var item in dataEPIFrom)
                                    {
                                        List <int> lstMonth = new List <int>();
                                        switch (dataENVI.Quarter)
                                        {
                                        case 1: lstMonth.Add(1); lstMonth.Add(2); lstMonth.Add(3); break;

                                        case 2: lstMonth.Add(4); lstMonth.Add(5); lstMonth.Add(6); break;

                                        case 3: lstMonth.Add(7); lstMonth.Add(8); lstMonth.Add(9); break;

                                        case 4: lstMonth.Add(10); lstMonth.Add(11); lstMonth.Add(12); break;
                                        }

                                        var queryUpdateWF = db.TEPI_Workflow.Where(w => w.FormID == item.FormID && lstMonth.Contains(w.nMonth)).ToList();
                                        foreach (var itemWF in queryUpdateWF)
                                        {
                                            if (itemWF.nHistoryStatusID == 26) //Completed (L3) >> Approved by PTT
                                            {
                                                itemWF.nHistoryStatusID = 5;   //Approved by ENVI Corporate
                                            }
                                        }
                                    }
                                    #endregion

                                    db.SaveChanges();
                                    result.IsCompleted = true;
                                }
                                else
                                {
                                    result.IsCompleted = false;
                                    result.Message     = "Update Status Failed.";
                                }
                            }
                            else
                            {
                                result.IsCompleted = false;
                                result.Message     = "Invalid Indicator Code.";
                            }
                        }
                        else
                        {
                            result.IsCompleted = false;
                            result.Message     = "Invalid Quater.";
                        }
                    }
                    else
                    {
                        result.IsCompleted = false;
                        result.Message     = "Not Found GC Facility";
                    }
                }
                else
                {
                    result.IsCompleted = false;
                    result.Message     = "Not Found Facility Code.";
                }
                return(result);
            }