// create an method for upsert and can get null Id in case of create
        public IActionResult Upsert(int?id)
        {
            PRApprovalVM prapprovalVM = new PRApprovalVM()
            {
                PRApproval   = new PRApproval(),
                EmployeeList = _unitOfWork.Employee.GetAll().Select(i => new SelectListItem
                {
                    Text  = i.EmployeeName,
                    Value = i.Id.ToString()
                }),

                VendorList = _unitOfWork.Vendor.GetAll().Select(i => new SelectListItem
                {
                    Text  = i.VendorName,
                    Value = i.Id.ToString()
                }),

                PurchaseTypeList = _unitOfWork.PurchaseType.GetAll().Select(i => new SelectListItem
                {
                    Text  = i.PurcahseTypeName,
                    Value = i.Id.ToString()
                }),

                ProjectList = _unitOfWork.Project.GetAll().Select(i => new SelectListItem
                {
                    Text  = i.ProjectName,
                    Value = i.Id.ToString()
                }),
            };

            if (id == null) // create case
            {
                return(View(prapprovalVM));
            }
            // this for edit request
            prapprovalVM.PRApproval = _unitOfWork.PRApproval.Get(id.GetValueOrDefault()); // To add stored procedure

            // var parameter = new DynamicParameters(); // arrange parameters for sql server
            //parameter.Add("@Id", id); // arrange to send the Id

            // var objFromDb = _unitOfWork.PRApproval.Get(id);

            //prapproval = _unitOfWork.SP_Call.OneRecord<PRApproval>(SD.Proc_PRApproval_Get, parameter);



            if (prapprovalVM.PRApproval == null)
            {
                return(NotFound());
            }
            return(View(prapprovalVM));
            //   return View();
        }
        [Authorize(Roles = SD.Role_Admin_Modify + "," + SD.Role_Admin_View + "," + SD.Role_Employee_Modify)]// Add authorization Level

        public IActionResult Upsert(PRApprovalVM prapprovalVM)
        {
            if (ModelState.IsValid)
            {
                // to pass parameters to sql procedrues
                var parameter = new DynamicParameters();
                parameter.Add("@PRApprovalId", prapprovalVM.PRApproval.PRApprovalId);
                parameter.Add("@PRApprovalTitle ", prapprovalVM.PRApproval.PRApprovalTitle);
                parameter.Add("@PRApprovalDescription ", prapprovalVM.PRApproval.PRApprovalDescription);
                parameter.Add("@WorkOrder ", prapprovalVM.PRApproval.WorkOrder);
                parameter.Add("@CMOA", prapprovalVM.PRApproval.CMOA);
                parameter.Add("@MatCorVer ", prapprovalVM.PRApproval.MatCorVer);
                parameter.Add("@Warranty ", prapprovalVM.PRApproval.Warranty);
                parameter.Add("@WorkDurationSiteDays ", prapprovalVM.PRApproval.WorkDurationSiteDays);
                parameter.Add("@RateSheet ", prapprovalVM.PRApproval.RateSheet);
                parameter.Add("@GateAccess ", prapprovalVM.PRApproval.GateAccess);
                parameter.Add("@RentalPeriodDays ", prapprovalVM.PRApproval.RentalPeriodDays);
                parameter.Add("@EquipmentTireEngine ", prapprovalVM.PRApproval.EquipmentTireEngine);
                parameter.Add("@JustificationVendor ", prapprovalVM.PRApproval.JustificationVendor);
                parameter.Add("@VendorId", prapprovalVM.PRApproval.VendorId);
                parameter.Add("@PurchaseTypeId", prapprovalVM.PRApproval.PurchaseTypeId);
                parameter.Add("@SourcedBy", prapprovalVM.PRApproval.SourcedBy);
                parameter.Add("@ProjectId", prapprovalVM.PRApproval.ProjectId);

                // File operation started
                string     webRootPath = _hostEnvironment.WebRootPath;
                PRApproval objFromDB   = _unitOfWork.PRApproval.Get(prapprovalVM.PRApproval.Id); //testing now for delete the old files
                if ((objFromDB != null) && (objFromDB.ExcelFileUrl != null))                     // //testing now for delete the old files

                {
                    // this is an edit and we need to remove old image


                    // var quotePath = Path.Combine(webRootPath, quoteVM.Quote.PdfUrl.TrimStart('\\'));
                    var excelPath = Path.Combine(webRootPath, objFromDB.ExcelFileUrl.TrimStart('\\'));


                    if (System.IO.File.Exists(excelPath))
                    {
                        System.IO.File.Delete(excelPath);
                    }
                }
                // Start check case if edit or new to create the ID
                if (prapprovalVM.PRApproval.Id == 0)
                {
                    prapprovalVM.PRApproval.PRApprovalId = GetNextPRID();
                }
                else
                {
                    prapprovalVM.PRApproval.PRApprovalId = _unitOfWork.PRApproval.Get(prapprovalVM.PRApproval.Id).PRApprovalId;
                }


                // End check case if edit or new to create the ID

// Adding operation to create an excel file
                var ExcelFileUrlName = CreateEmptyExcelPRA(prapprovalVM.PRApproval.PRApprovalId.ToString(),
                                                           _unitOfWork.Vendor.Get(prapprovalVM.PRApproval.VendorId).VendorName,
                                                           prapprovalVM.PRApproval.PRApprovalTitle,
                                                           _unitOfWork.PurchaseType.Get(prapprovalVM.PRApproval.PurchaseTypeId).PurcahseCode.ToString(),
                                                           "0");
                parameter.Add("@ExcelFileUrl", ExcelFileUrlName);
                prapprovalVM.PRApproval.ExcelFileUrl = ExcelFileUrlName;



                // File Operation Ended


                if (prapprovalVM.PRApproval.Id == 0) // create case whenever no ID posted
                {
                    //prapprovalVM.PRApproval.PRApprovalId = GetNextPRID(); // Get next ID
                    _unitOfWork.PRApproval.Add(prapprovalVM.PRApproval); // to allow sql procedrues
                    // _unitOfWork.SP_Call.Execute(SD.Proc_PRApproval_Create, parameter);
                }
                else
                {
                    parameter.Add("@Id", prapprovalVM.PRApproval.Id);
                    // _unitOfWork.SP_Call.Execute(SD.Proc_PRApproval_Update, parameter);
                    _unitOfWork.PRApproval.Update(prapprovalVM.PRApproval);
                }

                _unitOfWork.Save();
                EditExcelPRA(_unitOfWork.PRApproval.Get(prapprovalVM.PRApproval.Id).ExcelFileUrl, prapprovalVM.PRApproval);



                return(RedirectToAction(nameof(Index))); // if any mistake the name is gotted
            }
            return(View(prapprovalVM));
        }