public MessageResult InsertOvertime(SPWeb spWeb, OverTimeModel overTimeModel, bool autoovertime = false)
        {
            var  overtimeManagementId = 0;
            bool createNew            = overTimeModel.ID == 0;
            bool breakFunc            = false;
            var  overtimeEntity       = overTimeModel.ToEntity();

            try
            {
                if (createNew == false)
                {
                    var currentItem = _overTimeManagementDAL.GetByID(spWeb, overtimeEntity.ID);

                    string actionType = overTimeModel.ApprovalStatus.ToLower();
                    if (actionType == "true" || actionType == "false" || overTimeModel.RequiredBODApprove == true) // action = approve or reject
                    {
                        string retMsg = GetRequestStatusMessage(currentItem);
                        if (!string.IsNullOrEmpty(retMsg))
                        {
                            breakFunc = true;
                            int errorCode = actionType == "false" ? (int)OverTimeErrorCode.CannotReject : (int)OverTimeErrorCode.CannotApprove;
                            return(new MessageResult {
                                Code = errorCode, Message = retMsg, ObjectId = 0
                            });
                        }
                    }
                    else // action = edit
                    {
                        if (currentItem.ApprovalStatus.ToLower().Equals("false") || currentItem.ApprovalStatus.ToLower().Equals("true"))
                        {
                            breakFunc = true;
                            string retMsg = GetRequestStatusMessage(currentItem);
                            return(new MessageResult {
                                Code = (int)OverTimeErrorCode.CannotSubmit, Message = retMsg, ObjectId = 0
                            });
                        }
                        else if (currentItem.FirstApprovedDate != null && currentItem.FirstApprovedDate != DateTime.MinValue && currentItem.ApprovalStatus == "")
                        {
                            breakFunc = true;
                            string retMsg = WebPageResourceHelper.GetResourceString("RequestStatusInProgress");
                            return(new MessageResult {
                                Code = (int)OverTimeErrorCode.CannotSubmit, Message = retMsg, ObjectId = 0
                            });
                        }
                    }

                    string requestExpiredMsg = MessageResultHelper.GetRequestExpiredMessage(currentItem.RequestDueDate);
                    if (!string.IsNullOrEmpty(requestExpiredMsg))
                    {
                        breakFunc = true;
                        return(new MessageResult {
                            Code = (int)OverTimeErrorCode.CannotApprove, Message = requestExpiredMsg, ObjectId = 0
                        });
                    }

                    overtimeEntity.FirstApprovedDate = currentItem.FirstApprovedDate;
                    if (!string.IsNullOrEmpty(currentItem.ApprovalStatus.Trim()))
                    {
                        breakFunc = true;
                        return(new MessageResult
                        {
                            Code = 0,
                            Message = "Success",
                            ObjectId = overtimeManagementId
                        });
                    }

                    // Update Approver
                    if (!string.IsNullOrEmpty(overTimeModel.ApprovalStatus))
                    {
                        if (!overTimeModel.RequiredBODApprove) // 1 STEP
                        {
                            overtimeEntity.FirstApprovedDate = DateTime.Now;
                        }
                        else // 2 STEPs
                        {
                            if (overTimeModel.ApprovalStatus == "true") // BOD Approve
                            {
                                overtimeEntity.DHComments = currentItem.DHComments;
                            }
                            else if (overTimeModel.ApprovalStatus == "false")                                  // DH/BOD Reject
                            {
                                if (currentItem.FirstApprovedBy != null && currentItem.FirstApprovedBy.ID > 0) // BOD Reject
                                {
                                    overtimeEntity.DHComments = currentItem.DHComments;
                                }
                                else // DH Reject
                                {
                                    overtimeEntity.FirstApprovedDate = DateTime.Now;
                                }
                            }
                        }
                    }
                    else // DH Approve, Waiting BOD
                    {
                        overtimeEntity.FirstApprovedDate = DateTime.Now;
                    }
                }
                else
                {
                    overtimeEntity = _overTimeManagementDAL.SetDueDate(overtimeEntity);
                }

                overtimeManagementId = _overTimeManagementDAL.SaveOrUpdate(spWeb, overtimeEntity);
            }
            catch (Exception ex)
            {
                ULSLogging.Log(new SPDiagnosticsCategory("STADA - Overtime Service - InsertOvertime fn",
                                                         TraceSeverity.Unexpected, EventSeverity.Error), TraceSeverity.Unexpected,
                               string.Format(CultureInfo.InvariantCulture, "{0}:{1}", ex.Message, ex.StackTrace));
            }
            finally
            {
                if (overtimeManagementId > 0 && breakFunc == false)
                {
                    var overtimeManagementDetailAddNewList = new List <OverTimeManagementDetail>();
                    foreach (var detail in overTimeModel.OvertimeDetailModelList)
                    {
                        var overTimeManagementDetail = new OverTimeManagementDetail();
                        overTimeManagementDetail.Employee.LookupId             = detail.Employee.LookupId;
                        overTimeManagementDetail.OvertimeFrom                  = Convert.ToDateTime(detail.OvertimeFrom);
                        overTimeManagementDetail.OvertimeManagementID.LookupId = overtimeManagementId;
                        overTimeManagementDetail.ApprovalStatus.LookupId       = detail.OvertimeMgmtApprovalStatus.LookupId;
                        overTimeManagementDetail.Task             = detail.Task;
                        overTimeManagementDetail.OvertimeTo       = Convert.ToDateTime(detail.OvertimeTo);
                        overTimeManagementDetail.CompanyTransport = detail.CompanyTransport;
                        overTimeManagementDetail.WorkingHours     = string.IsNullOrEmpty(detail.WorkingHours) ? 0.0 : double.Parse(detail.WorkingHours);
                        overTimeManagementDetail.ID           = detail.ID;
                        overTimeManagementDetail.BatchCommand = EntityBase.BatchCmd.Save;

                        overtimeManagementDetailAddNewList.Add(overTimeManagementDetail);
                    }

                    if (overtimeManagementDetailAddNewList.Count > 0)
                    {
                        if (autoovertime == false)
                        {
                            SPQuery spQuery = new SPQuery()
                            {
                                Query = $"<Where><Eq><FieldRef Name='OvertimeManagementID'/><Value Type='Lookup' LookupId='TRUE'>{overtimeManagementId}</Value></Eq></Where>"
                            };
                            List <OverTimeManagementDetail> details = _overTimeManagementDetailDAL.GetByQuery(spQuery, new string[] { "ID" });
                            _overTimeManagementDetailDAL.DeleteBatch(details);
                        }

                        _overTimeManagementDetailDAL.BulkInsert(overtimeManagementDetailAddNewList);
                    }

                    // Create New -> SendEmailToDepartmentHead
                    overtimeEntity = _overTimeManagementDAL.GetByID(spWeb, overtimeManagementId);
                    if (createNew)
                    {
                        _overTimeManagementDAL.SendEmailToApprover(SPContext.Current.Web, overtimeEntity, (int)StringConstant.EmployeePosition.DepartmentHead);
                        _overTimeManagementDAL.SendEmailToDelegatedApprover(SPContext.Current.Web, overtimeEntity);
                    }
                    else
                    {
                        if (!string.IsNullOrEmpty(overTimeModel.ApprovalStatus) && overTimeModel.ApprovalStatus.Equals("true")) // Approve
                        {
                            _overTimeManagementDAL.Approve(overtimeManagementId, overTimeModel.ApproverFullName);
                        }
                        else if (!string.IsNullOrEmpty(overTimeModel.ApprovalStatus) && overTimeModel.ApprovalStatus.Equals("false")) // Reject
                        {
                            _overTimeManagementDAL.Reject(overtimeManagementId, overTimeModel.ApproverFullName);
                        }
                        else if (string.IsNullOrEmpty(overTimeModel.ApprovalStatus) && overTimeModel.RequiredBODApprove)
                        {
                            _overTimeManagementDAL.SendEmailToApprover(SPContext.Current.Web, overtimeEntity, (int)StringConstant.EmployeePosition.BOD);
                            _overTimeManagementDAL.SendEmailToDelegatedApprover(SPContext.Current.Web, overtimeEntity);
                        }
                    }
                }
            }

            return(new MessageResult
            {
                Code = 0,
                Message = "Success",
                ObjectId = overtimeManagementId
            });
        }