public List<DailyAttendanceReportViewModel> GetMonthlyAttendanceDetailedReport(int employeeId, DateTime startDate, DateTime endDate, TimeSpan relaxation, out MonthlyReportOfEmployee objMonthlyReportOfEmployee)// aspx file mai check kar lena ki startDate < endDate
    {
        List<DailyAttendanceReportViewModel> lstMonthlyAttendanceReportViewModel = new List<DailyAttendanceReportViewModel>();
        objMonthlyReportOfEmployee = new MonthlyReportOfEmployee();
        for (DateTime date = startDate; date <= endDate; date = date.AddDays(1))
        {
            DailyAttendanceReportViewModel objMonthlyAttendanceReportViewModel = new DailyAttendanceReportViewModel();
            objMonthlyAttendanceReportViewModel = GetDataForReportEmployeeWise(employeeId, date, relaxation);
            objMonthlyAttendanceReportViewModel.Date = date;
            lstMonthlyAttendanceReportViewModel.Add(objMonthlyAttendanceReportViewModel);
        }

        foreach (var item in lstMonthlyAttendanceReportViewModel)
        {
            objMonthlyReportOfEmployee.TotalDuration += item.Duration;
            DayStatus daystatus = GetStatusOfDay(item.Date, employeeId);
            if (daystatus == DayStatus.Active)
            {
                if (item.Status == Status.Present || item.Status == Status.PresentWithNoOutPunch)
                {
                    objMonthlyReportOfEmployee.PresentDays++;
                }
                else
                {
                    objMonthlyReportOfEmployee.AbsentDays++;
                }
            }
            else if (daystatus == DayStatus.WeeklyOff)
            {
                if (item.Status == Status.Present)
                {
                    item.Status = Status.WeeklyOffPresent;
                    objMonthlyReportOfEmployee.PresentDays++;
                }
                else if (item.Status == Status.PresentWithNoOutPunch)
                {
                    item.Status = Status.WeeklyOffPresentWithNoOutPunch;
                    objMonthlyReportOfEmployee.PresentDays++;
                }
                else
                {
                    item.Status = Status.WeeklyOff;
                    objMonthlyReportOfEmployee.WeeklyOff++;
                }
            }
            else //Holiday
            {
                objMonthlyReportOfEmployee.Holidays++;
                item.Status = Status.Holiday;
            }
        }
        return lstMonthlyAttendanceReportViewModel;
    }
    public List<DailyAttendanceReportViewModel> GetDataForMonthlyReport(int departmentId, DateTime date, TimeSpan relaxation)
    {
        List<DailyAttendanceReportViewModel> lstDailyAttendanceReportViewModel = new List<DailyAttendanceReportViewModel>();
        DataTable dtEmployees, dtShifts;
        DBDataHelper.ConnectionString = ConfigurationManager.ConnectionStrings["CSBiometricAttendance"].ConnectionString;
        List<SqlParameter> list_params = new List<SqlParameter>() { new SqlParameter("@date", date), new SqlParameter("@departmentId", departmentId) };

        ManageLeaves objManageLeave = new ManageLeaves();
        TimeSpan tsShortLeave = objManageLeave.GetShortLeaveDuration();
        TimeSpan tsHalfLeave = objManageLeave.GetHalfDayLeaveDuration();

        try
        {
            using (DBDataHelper helper = new DBDataHelper())
            {
                dtEmployees = helper.GetDataTable("spGetEmployeesForDailyAttendanceReportByDeaprtment", SQLTextType.Stored_Proc, list_params);
                dtShifts = helper.GetDataTable("spGetActiveShift", SQLTextType.Stored_Proc);

                foreach (DataRow row in dtEmployees.Rows)
                {
                    DailyAttendanceReportViewModel objDailyAttendanceReportViewModel = new DailyAttendanceReportViewModel();

                    objDailyAttendanceReportViewModel.EmployeeId = Int32.Parse(row[1].ToString());
                    objDailyAttendanceReportViewModel.Name = row[0].ToString();
                    objDailyAttendanceReportViewModel.FirstHalfStartTime = dtShifts.Rows[0]["FirstHalfStart"].ToString();
                    objDailyAttendanceReportViewModel.SecondHalfEndTime = dtShifts.Rows[0]["SecondHalfEnd"].ToString();
                    objDailyAttendanceReportViewModel.Relaxation = relaxation.ToString();
                    objDailyAttendanceReportViewModel.Date = date;

                    if (row[2] != DBNull.Value) //Entry Time is Not  Null
                    {
                        objDailyAttendanceReportViewModel.InTime = row[2].ToString();
                        objDailyAttendanceReportViewModel.OutTime = row[3] == DBNull.Value ? dtShifts.Rows[0]["SecondHalfEnd"].ToString() : row[3].ToString();

                        if (row[3] != DBNull.Value)
                            objDailyAttendanceReportViewModel.Status = Status.Present;  //Exit Time is Not Null
                        else
                            objDailyAttendanceReportViewModel.Status = Status.PresentWithNoOutPunch; //Exit Time is Null

                        if (objDailyAttendanceReportViewModel._inTime >= objDailyAttendanceReportViewModel._firstHalfStartTime + relaxation)
                        {
                            ManageLeaves objManageLeaves = new ManageLeaves();
                            if (objDailyAttendanceReportViewModel._inTime - objDailyAttendanceReportViewModel._firstHalfStartTime >= tsHalfLeave)
                            {
                                objDailyAttendanceReportViewModel.Status = Status.OnHalfDayLeave;
                            }
                            else if (objDailyAttendanceReportViewModel._inTime - objDailyAttendanceReportViewModel._firstHalfStartTime >= tsShortLeave)
                            {
                                objDailyAttendanceReportViewModel.Status = Status.OnShortLeave;
                            }
                            else
                                objDailyAttendanceReportViewModel.Status = Status.Late;

                            objDailyAttendanceReportViewModel.LateByDuration = (objDailyAttendanceReportViewModel._firstHalfStartTime < objDailyAttendanceReportViewModel._inTime) ? (objDailyAttendanceReportViewModel._inTime - objDailyAttendanceReportViewModel._firstHalfStartTime).Duration() : TimeSpan.Parse("00:00:00");
                        }
                        objDailyAttendanceReportViewModel.EarlyGoingByDuration = (objDailyAttendanceReportViewModel._inTime.TimeOfDay > TimeSpan.Parse("00:00:00")) ? ((objDailyAttendanceReportViewModel._secondHalfEndTime > objDailyAttendanceReportViewModel._outTime) ? (objDailyAttendanceReportViewModel._secondHalfEndTime - objDailyAttendanceReportViewModel._outTime).Duration() : TimeSpan.Parse("00:00:00")) : TimeSpan.Parse("00:00:00");


                        objDailyAttendanceReportViewModel.Duration = GetTotalTime(objDailyAttendanceReportViewModel.EmployeeId, date);// Exit time null waali
                        if (TimeSpan.Parse(objDailyAttendanceReportViewModel.TotalDuration) > new TimeSpan(0, 0, 0)) // Iterartes only if emp is Present
                            objDailyAttendanceReportViewModel.PunchRecords = GetPunchRecords(objDailyAttendanceReportViewModel.EmployeeId, date);
                        else
                            objDailyAttendanceReportViewModel.PunchRecords = "No Punch Records"; //Employee is Absent
                        TimeSpan totalShiftDuration = objDailyAttendanceReportViewModel._secondHalfEndTime - objDailyAttendanceReportViewModel._firstHalfStartTime;

                        if (TimeSpan.Parse(objDailyAttendanceReportViewModel.TotalDuration) == new TimeSpan(0, 0, 0))
                        {
                            objDailyAttendanceReportViewModel.Status = Status.Absent;
                        }
                        else if (totalShiftDuration - objDailyAttendanceReportViewModel.Duration >= tsHalfLeave)
                        {
                            //ManageLeaves objManageLeaves = new ManageLeaves();
                            //objManageLeaves.AssignLeave(objDailyAttendanceReportViewModel.EmployeeId, objDailyAttendanceReportViewModel.Date, (int)LeaveTypes.HDL);
                            objDailyAttendanceReportViewModel.Status = Status.OnHalfDayLeave;
                        }
                    }

                    else
                    {
                        objDailyAttendanceReportViewModel.InTime = "00:00:00.0000000";
                        objDailyAttendanceReportViewModel.OutTime = "00:00:00.0000000";

                        ManageLeaves objManageLeaves = new ManageLeaves();
                        int TypeOfLeave;// For the type of leave
                        if (objManageLeaves.IsEmployeeOnLeave(objDailyAttendanceReportViewModel.EmployeeId, date, out TypeOfLeave))
                        {
                            objDailyAttendanceReportViewModel.Status = (Status)TypeOfLeave;
                        }
                        else
                            objDailyAttendanceReportViewModel.Status = Status.Absent; // If no leave is there then Absent

                        objDailyAttendanceReportViewModel.Duration = new TimeSpan(0, 0, 0);
                        objDailyAttendanceReportViewModel.PunchRecords = "No Punch Records"; //Employee is Absent
                    }
                    lstDailyAttendanceReportViewModel.Add(objDailyAttendanceReportViewModel);
                }
            }
        }
        catch (Exception)
        {
            //
        }

        return lstDailyAttendanceReportViewModel;
    }
    public DailyAttendanceReportViewModel GetDataForReportEmployeeWise(int employeeId, DateTime date, TimeSpan relaxation)
    {
        DataTable dtEmployees;
        DBDataHelper.ConnectionString = ConfigurationManager.ConnectionStrings["CSBiometricAttendance"].ConnectionString;
        TimeSpan duration = GetDurationOfEmployeeDateWise(employeeId, date);

        List<SqlParameter> list_params = new List<SqlParameter>()
                                        { new SqlParameter("@date", date),
                                          new SqlParameter("@employeeId", employeeId) };

        MasterShifts objShift = GetShiftForEmployeeDateWise(employeeId, date); //Getting Shift Active as per Employee
        ManageLeaves objManageLeaves = new ManageLeaves();

        TimeSpan ShortLeaveDuration = objShift.SHLDuration;
        TimeSpan HalfLeaveDuration = new TimeSpan(4, 0, 0); //Change According
        TimeSpan totalDuration = new DateTime(1, 1, 1, objShift.SecondHalfEnd.Hours, objShift.SecondHalfEnd.Minutes, objShift.SecondHalfEnd.Seconds) - new DateTime(1, 1, 1, objShift.FirstHalfStart.Hours, objShift.FirstHalfStart.Minutes, objShift.FirstHalfStart.Seconds);
        DayStatus dayStatus = GetStatusOfDayEmployeeWise(date, employeeId);
        DailyAttendanceReportViewModel objDailyAttendanceReportViewModel = new DailyAttendanceReportViewModel();
        int typeOfLeave;// For the type of leave

        #region Generate Data
        try
        {
            using (DBDataHelper helper = new DBDataHelper())
            {
                dtEmployees = helper.GetDataTable("spGetEmployeesForDailyAttendanceReportByEmployeeId", SQLTextType.Stored_Proc, list_params);

                foreach (DataRow row in dtEmployees.Rows)
                {
                    objDailyAttendanceReportViewModel.EmployeeId = Int32.Parse(row[1].ToString());
                    objDailyAttendanceReportViewModel.Name = row[0].ToString();
                    objDailyAttendanceReportViewModel.FirstHalfStartTime = objShift.FirstHalfStart.ToString();
                    objDailyAttendanceReportViewModel.FirstHalfEndTime = objShift.FirstHalfEnd.ToString();
                    objDailyAttendanceReportViewModel.SecondHalfStartTime = objShift.SecondHalfStart.ToString();
                    objDailyAttendanceReportViewModel.SecondHalfEndTime = objShift.SecondHalfEnd.ToString();
                    objDailyAttendanceReportViewModel.Relaxation = relaxation.ToString();
                    objDailyAttendanceReportViewModel.Date = date;
                    objDailyAttendanceReportViewModel.Duration = duration;

                    #region If Present
                    if (row[2] != DBNull.Value) //Entry Time is Not  Null ---- Employee is Present
                    {
                        TimeSpan empEntryTime = TimeSpan.Parse("00:" + row[2].ToString());
                        TimeSpan empExitTime = row[3] == DBNull.Value ? new TimeSpan() : TimeSpan.Parse("00:" + row[3].ToString());

                        var bnm = (DateTime.Parse(objDailyAttendanceReportViewModel.FirstHalfStartTime)).TimeOfDay;

                        if (empEntryTime > (DateTime.Parse(objDailyAttendanceReportViewModel.FirstHalfStartTime)).TimeOfDay + relaxation)
                        {
                            objDailyAttendanceReportViewModel.LateByDuration = empEntryTime - (DateTime.Parse(objDailyAttendanceReportViewModel.FirstHalfStartTime)).TimeOfDay - relaxation;
                        }
                        //objDailyAttendanceReportViewModel.InTime = DateTime
                        objDailyAttendanceReportViewModel.InTime = Convert.ToDateTime(empEntryTime.ToString()).ToString();

                        objDailyAttendanceReportViewModel.OutTime = row[3] == DBNull.Value ? Convert.ToDateTime(objShift.SecondHalfEnd.ToString()).ToString() : Convert.ToDateTime(empExitTime.ToString()).ToString();//IfExitPunch is Null 

                        if (row[3] == DBNull.Value)
                        {
                            if (dayStatus != DayStatus.WeeklyOff)
                                objDailyAttendanceReportViewModel.Status = BAS.Enums.Status.PresentWithNoOutPunch;//Exit Time is Null
                            else
                                objDailyAttendanceReportViewModel.Status = BAS.Enums.Status.WeeklyOffPresentWithNoOutPunch;
                        }
                        else
                        {

                            if (objDailyAttendanceReportViewModel._inTime.TimeOfDay >= relaxation + objShift.FirstHalfStart)// IF Late
                            {
                                if (duration + HalfLeaveDuration <= totalDuration)
                                {
                                    objManageLeaves.AssignLeave(employeeId, date, (int)BAS.Enums.LeaveTypes.HDL);
                                    objDailyAttendanceReportViewModel.Status = BAS.Enums.Status.OnHalfDayLeaveFirstHalf;
                                }
                                else
                                {
                                    objManageLeaves.AssignLeave(employeeId, date, (int)BAS.Enums.LeaveTypes.SHL);
                                    objDailyAttendanceReportViewModel.Status = BAS.Enums.Status.OnShortLeave;
                                }
                            }
                            else if (duration + HalfLeaveDuration < duration)// Second Half Leave
                            {
                                objManageLeaves.AssignLeave(employeeId, date, (int)BAS.Enums.LeaveTypes.HDL);
                                objDailyAttendanceReportViewModel.Status = BAS.Enums.Status.OnHalfDayLeaveSecondHalf;
                            }
                            else
                            {
                                if (dayStatus != DayStatus.WeeklyOff)
                                    objDailyAttendanceReportViewModel.Status = BAS.Enums.Status.Present;
                                else
                                    objDailyAttendanceReportViewModel.Status = BAS.Enums.Status.WeeklyOffPresent;
                            }
                        } //

                    }
                    #endregion
                    #region If Absent
                    else  //Entry Time is Null
                    {
                        objDailyAttendanceReportViewModel.InTime = "00:00:00.0000000";
                        objDailyAttendanceReportViewModel.OutTime = "00:00:00.0000000";
                        if (dayStatus == DayStatus.Holiday)
                        {
                            objDailyAttendanceReportViewModel.Status = Status.Holiday;
                        }
                        else if (dayStatus == DayStatus.WeeklyOff)
                        {
                            objDailyAttendanceReportViewModel.Status = Status.WeeklyOff;
                        }
                        else if (objManageLeaves.IsEmployeeOnLeave(objDailyAttendanceReportViewModel.EmployeeId, date, out typeOfLeave))
                        {
                            objDailyAttendanceReportViewModel.Status = (Status)typeOfLeave;
                        }
                        else
                        {
                            objDailyAttendanceReportViewModel.Status = Status.LeaveWithoutPay;
                        }
                    }

                    #endregion

                }

            }
        }
        catch (Exception)
        {
        }
        #endregion

        return objDailyAttendanceReportViewModel;
    }