/// <summary>
        /// Get employee list that dont have any overtime in passing date of passing department
        /// </summary>
        /// <param name="departmentId"></param>
        /// <param name="locationId"></param>
        /// <param name="date"></param>
        /// <returns></returns>
        /// CALL URL:  _vti_bin/Services/Employee/EmployeeService.svc/GetEmployeeListDontHaveOvertimeInDate/1/4-21-2017
        public List <EmployeeModel> GetEmployeeListDontHaveOvertimeInDate(string departmentId, string locationId, string date)
        {
            try
            {
                DateTime dateTime = DateTime.Parse(date);

                var fromDate = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, 0, 0, 0);
                var toDate   = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, 23, 59, 59);

                List <EmployeeModel> employeeDontHaveOvertimeList = new List <EmployeeModel>();
                string maxLevel = "6"; // Quản lý trực tiếp -> Exclude 'BOD'

                //List<EmployeeDepartmentModel> employeeIncurrentDepartmentList = GetEmployeeListInCurrentDepartment(departmentId);
                List <EmployeeModel> employeeIncurrentDepartmentList = GetByDepartmentLocation(locationId, departmentId, maxLevel);

                var overtimeManagements = _overtimeManagementDAL.GetByDepartmentInRange(Convert.ToInt32(departmentId), Convert.ToInt32(locationId), fromDate, toDate);

                if (overtimeManagements.Count > 0)
                {
                    // Overtime
                    List <int> employeesHaveOvertimeList = new List <int>();
                    foreach (var overtime in overtimeManagements)
                    {
                        var overtimeDetailList = _overtimeManagementDetailDAL.GetByOvertimeId(overtime.ID);
                        if (overtimeDetailList.Any())
                        {
                            foreach (var overtimeDetailItem in overtimeDetailList)
                            {
                                employeesHaveOvertimeList.Add(overtimeDetailItem.Employee.LookupId);
                            }
                        }
                    }

                    // Rejected
                    var        overtimesRejected = overtimeManagements.Where(x => x.ApprovalStatus == "false");
                    List <int> employeesRejected = new List <int>();
                    foreach (var overtime in overtimesRejected)
                    {
                        var overtimeDetailList = _overtimeManagementDetailDAL.GetByOvertimeId(overtime.ID);
                        if (overtimeDetailList.Any())
                        {
                            foreach (var overtimeDetailItem in overtimeDetailList)
                            {
                                employeesRejected.Add(overtimeDetailItem.Employee.LookupId);
                            }
                        }
                    }

                    var employeesRejectedModel = employeeIncurrentDepartmentList.Where(i => employeesRejected.Contains(i.ID));

                    var employeesNotOvertimeModel = employeeIncurrentDepartmentList.Where(i => !employeesHaveOvertimeList.Contains(i.ID));
                    // Result = Not registered overtime + Rejected
                    employeeDontHaveOvertimeList = employeesNotOvertimeModel.Concat(employeesRejectedModel).ToList();
                }
                else
                {
                    employeeDontHaveOvertimeList = employeeIncurrentDepartmentList;
                }

                return(employeeDontHaveOvertimeList);
            }
            catch (Exception ex)
            {
                ULSLogging.Log(new SPDiagnosticsCategory("STADA - Employee Service - GetEmployeeListDontHaveOvertimeInDate fn",
                                                         TraceSeverity.Unexpected, EventSeverity.Error), TraceSeverity.Unexpected,
                               string.Format(CultureInfo.InvariantCulture, "{0}:{1}", ex.Message, ex.StackTrace));
                return(null);
            }
        }
        public OverTimeModel GetById(string Id)
        {
            try
            {
                OverTimeModel overTimeModel = new OverTimeModel();
                int           itemId        = Convert.ToInt32(Id);
                var           overtime      = _overTimeManagementDAL.GetByID(itemId);
                if (overtime != null && overtime.ID > 0)
                {
                    overTimeModel.ID = overtime.ID;
                    overTimeModel.OtherRequirements = overtime.OtherRequirements;
                    overTimeModel.DHComments        = overtime.DHComments;
                    overTimeModel.BODComments       = overtime.BODComments;
                    overTimeModel.SecurityComments  = overtime.SecurityComments;
                    overTimeModel.Requester         = LookupItemHelper.ConvertToModel(overtime.Requester);
                    if (overtime.ApprovedBy != null)
                    {
                        overTimeModel.ApprovedBy = new UserModel {
                            FirstName = overtime.ApprovedBy.FirstName, FullName = overtime.ApprovedBy.FullName, ID = overtime.ApprovedBy.ID, IsGroup = overtime.ApprovedBy.IsGroup, LastName = overtime.ApprovedBy.LastName, UserName = overtime.ApprovedBy.UserName
                        };
                    }

                    overTimeModel.SumOfEmployee = overtime.SumOfEmployee + "";
                    overTimeModel.SumOfMeal     = overtime.SumOfMeal + "";

                    overTimeModel.ApprovalStatus   = overtime.ApprovalStatus;
                    overTimeModel.CommonDepartment = LookupItemHelper.ConvertToModel(overtime.CommonDepartment);

                    overTimeModel.Date = overtime.CommonDate.ToString("s");
                    overTimeModel.FirstApprovedDate = overtime.FirstApprovedDate.ToString(StringConstant.DateFormatddMMyyyyHHmmss);
                    overTimeModel.Modified          = overtime.Modified.ToString(StringConstant.DateFormatddMMyyyyHHmmss);
                    if (overtime.FirstApprovedBy != null)
                    {
                        overTimeModel.FirstApprovedBy = new UserModel {
                            FirstName = overtime.FirstApprovedBy.FirstName, FullName = overtime.FirstApprovedBy.FullName, ID = overtime.FirstApprovedBy.ID, IsGroup = overtime.FirstApprovedBy.IsGroup, LastName = overtime.FirstApprovedBy.LastName, UserName = overtime.FirstApprovedBy.UserName
                        };
                    }
                    overTimeModel.CommonLocation = LookupItemHelper.ConvertToModel(overtime.CommonLocation);
                    overTimeModel.Place          = overtime.Place;
                    overTimeModel.ApprovalStatus = overtime.ApprovalStatus;

                    if (overtime.RequestDueDate != null && overtime.RequestDueDate != default(DateTime))
                    {
                        overTimeModel.RequestDueDate = overtime.RequestDueDate.ToString(StringConstant.DateFormatddMMyyyy2);
                        if (overtime.RequestDueDate.Date < DateTime.Now.Date)
                        {
                            //overTimeModel.RequestExpired = true;
                            overTimeModel.RequestExpired = false;
                        }
                    }

                    overTimeModel.ApprovedLevel = 0;
                    if (overTimeModel.ApprovalStatus == "true")
                    {
                        overTimeModel.ApprovedLevel = 1; // Truong phong Approved
                        // Check Approved By: BOD
                        var approverInfo = _employeeInfoDAL.GetByADAccount(overtime.ApprovedBy.ID);
                        if (approverInfo.EmployeePosition.LookupId == (int)StringConstant.EmployeePosition.BOD) // BOD Approved
                        {
                            overTimeModel.ApprovedLevel = 2;
                        }
                    }
                    else if (overTimeModel.ApprovalStatus == "false")
                    {
                        overTimeModel.ApprovedLevel = 1; // Truong phong Rejected
                        // Check Approved By: BOD
                        var approverInfo = _employeeInfoDAL.GetByADAccount(overtime.ApprovedBy.ID);
                        if (approverInfo.EmployeePosition.LookupId == (int)StringConstant.EmployeePosition.BOD) // BOD Rejected
                        {
                            overTimeModel.ApprovedLevel = 2;
                        }
                    }
                    else // Check Truong phong co duyet chua
                    {
                        // Check Approved By: BOD
                        var approverInfo = _employeeInfoDAL.GetByADAccount(overtime.ApprovedBy.ID);
                        if (approverInfo.EmployeePosition.LookupId == (int)StringConstant.EmployeePosition.BOD) // BOD Rejected
                        {
                            overTimeModel.ApprovedLevel = 1;
                        }
                    }


                    var OverTimeDetails = _overTimeManagementDetailDAL.GetByOvertimeId(overTimeModel.ID);
                    foreach (var detail in OverTimeDetails)
                    {
                        var overtimeDetailModel = new OvertimeDetailModel();
                        overtimeDetailModel.ID                         = detail.ID;
                        overtimeDetailModel.OvertimeFrom               = detail.OvertimeFrom.ToString();
                        overtimeDetailModel.OvertimeManagementID       = LookupItemHelper.ConvertToModel(detail.OvertimeManagementID);
                        overtimeDetailModel.Employee.LookupId          = detail.Employee.LookupId;
                        overtimeDetailModel.Employee.LookupValue       = detail.Employee.LookupValue;
                        overtimeDetailModel.OvertimeMgmtApprovalStatus = LookupItemHelper.ConvertToModel(detail.ApprovalStatus);
                        overtimeDetailModel.SummaryLinks               = detail.SummaryLinks;
                        overtimeDetailModel.OvertimeTo                 = detail.OvertimeTo.ToString();
                        overtimeDetailModel.Task                       = string.IsNullOrEmpty(detail.SummaryLinks) ? detail.Task : detail.Task + "_" + detail.SummaryLinks;
                        overtimeDetailModel.CompanyTransport           = detail.CompanyTransport;
                        overtimeDetailModel.WorkingHours               = detail.WorkingHours + "";
                        // Grid
                        overtimeDetailModel.FullName         = overtimeDetailModel.Employee.LookupValue + "_" + overtimeDetailModel.Employee.LookupId + "_";
                        overtimeDetailModel.OvertimeHourFrom = detail.OvertimeFrom.Hour + ":" + detail.OvertimeFrom.Minute;
                        overtimeDetailModel.OvertimeHourTo   = detail.OvertimeTo.Hour + ":" + detail.OvertimeTo.Minute;
                        overTimeModel.OvertimeDetailModelList.Add(overtimeDetailModel);
                    }
                }
                return(overTimeModel);
            }
            catch (Exception ex)
            {
                ULSLogging.Log(new SPDiagnosticsCategory("STADA - Overtime Service - GetById fn",
                                                         TraceSeverity.Unexpected, EventSeverity.Error), TraceSeverity.Unexpected,
                               string.Format(CultureInfo.InvariantCulture, "{0}:{1}", ex.Message, ex.StackTrace));
                return(null);
            }
        }