Esempio n. 1
0
        /// <summary>
        /// Kiểm tra một ngày có phải là ngày làm việc không?
        /// </summary>
        /// <param name="date"></param>
        /// <param name="gradeCfg"></param>
        /// <param name="listDailyShift"></param>
        /// <param name="listDayOff"></param>
        /// <returns></returns>
        public static bool IsWorkDay(DateTime date, Cat_GradeAttendance gradeCfg,
                                     Dictionary <DateTime, Cat_Shift> listDailyShift, List <Cat_DayOff> listDayOff)
        {
            bool result = false;

            if (gradeCfg.RosterType == GradeRosterType.E_ISROSTER.ToString() ||
                gradeCfg.RosterType == GradeRosterType.E_ISROSTER_ORG.ToString())
            {
                result = IsWorkDay(date, listDailyShift);
            }
            //else if (gradeCfg.RosterType == GradeRosterType.E_ISDEFAULT.ToString())
            //{
            //    result = IsWorkDay(date, gradeCfg, listDayOff);
            //}
            else if (gradeCfg.RosterType == GradeRosterType.E_ISHOLIDAY.ToString())
            {
                if (listDayOff == null || !listDayOff.Any(d => d.DateOff.Date == date.Date &&
                                                          d.Type == HolidayType.E_WEEKEND_HLD.ToString()))
                {
                    result = true;
                }
            }

            return(result);
        }
Esempio n. 2
0
        /// <summary>
        /// Kiểm tra một ngày có phải là ngày làm việc không?
        /// Chỉ áp dụng cho trường hợp RosterType = E_ISDEFAULT
        /// </summary>
        /// <param name="date"></param>
        /// <param name="gradeCfg"></param>
        /// <param name="listDayOff"></param>
        /// <returns></returns>
        public static bool IsWorkDay(DateTime date, Cat_GradeAttendance gradeCfg, List <Cat_DayOff> listDayOff)
        {
            bool result = false;

            if (listDayOff == null || !listDayOff.Any(d => d.DateOff.Date == date.Date &&
                                                      d.Type == HolidayType.E_WEEKEND_HLD.ToString()))
            {
                if (gradeCfg.RosterType == GradeRosterType.E_ISDEFAULT.ToString())
                {
                    //if (date.DayOfWeek == DayOfWeek.Monday && gradeCfg.Cat_Shift != null)
                    //{
                    //    result = true;
                    //}
                    //else if (date.DayOfWeek == DayOfWeek.Tuesday && gradeCfg.Cat_Shift1 != null)
                    //{
                    //    result = true;
                    //}
                    //else if (date.DayOfWeek == DayOfWeek.Wednesday && gradeCfg.Cat_Shift2 != null)
                    //{
                    //    result = true;
                    //}
                    //else if (date.DayOfWeek == DayOfWeek.Thursday && gradeCfg.Cat_Shift3 != null)
                    //{
                    //    result = true;
                    //}
                    //else if (date.DayOfWeek == DayOfWeek.Friday && gradeCfg.Cat_Shift4 != null)
                    //{
                    //    result = true;
                    //}
                    //else if (date.DayOfWeek == DayOfWeek.Saturday && gradeCfg.Cat_Shift5 != null)
                    //{
                    //    result = true;
                    //}
                    //else if (date.DayOfWeek == DayOfWeek.Sunday && gradeCfg.Cat_Shift6 != null)
                    //{
                    result = true;
                    //}
                }
            }

            return(result);
        }
Esempio n. 3
0
        /// <summary>
        /// Edit comment Trung.le 20120529
        /// Them thuoc tinh Khong cat Overtime qua ngày E_STANDARD_WORKDAY - Value37 Trung.le 20120529
        /// </summary>
        /// <param name="overtime"></param>
        /// <param name="lstDayOff"></param>
        /// <param name="_LstPregnancy"></param>
        /// <param name="GuidContext"></param>
        /// <param name="_userId"></param>
        /// <param name="isByShift">Lấy theo ca làm việc của từng người</param>
        /// <returns></returns>
        public List <Att_OvertimeEntity> AnalysisOvertime(Att_OvertimeEntity overtime, List <Cat_DayOff> lstDayOff,
                                                          List <Att_Pregnancy> _LstPregnancy, bool isByShift, bool isAllowCutBreakHour, string UserLogin)
        {
            using (var context = new VnrHrmDataContext())
            {
                var unitOfWork    = (IUnitOfWork)(new UnitOfWork(context));
                var repoCat_Shift = new CustomBaseRepository <Cat_Shift>(unitOfWork);

                Cat_Shift ShiftOfOT = repoCat_Shift.FindBy(s => s.ID == overtime.ShiftID).FirstOrDefault();


                string status = string.Empty;

                Att_OvertimeEntity baseOT = null;
                if (overtime != null)
                {
                    //overtime.SerialCode = overtime.Workdate.ToString("ddMMyyyy");
                }

                List <Att_OvertimeEntity> listOvertimeInsert = new List <Att_OvertimeEntity>();
                Hre_Profile profile = new Hre_Profile();
                profile.ID = overtime.ProfileID;
                DateTime _workDate    = overtime.WorkDate;
                DateTime dateWorkDate = _workDate;

                string        key      = "HRM_ATT_OT";
                List <object> lstSysOT = new List <object>();
                lstSysOT.Add(key);
                lstSysOT.Add(null);
                lstSysOT.Add(null);
                var config = GetData <Sys_AllSettingEntity>(lstSysOT, ConstantSql.hrm_sys_sp_get_AllSetting, UserLogin, ref status);
                if (config == null)
                {
                    return(listOvertimeInsert);
                }
                var  NoCutOvertimePassDay   = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_NOCUTOVERTIMEPASSDAY.ToString()).FirstOrDefault();
                var  ByPeriodOfTime         = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_BYPERIODOFTIME.ToString()).FirstOrDefault();
                var  nightShiftFrom         = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_NIGHTSHIFTFROM.ToString()).FirstOrDefault();
                var  nightShiftTo           = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_NIGHTSHIFTTO.ToString()).FirstOrDefault();
                bool isNocutOvertimePassDay = Convert.ToBoolean(NoCutOvertimePassDay.Value1);//Không cắt Overtime qua ngày


                List <Hre_Profile> lstProfile = new List <Hre_Profile>()
                {
                    profile
                };
                List <Guid>            lstProfileIDs      = lstProfile.Select(m => m.ID).ToList();
                List <Att_Roster>      lstRosterTypeGroup = new List <Att_Roster>();
                List <Att_RosterGroup> lstRosterGroup     = new List <Att_RosterGroup>();
                Att_RosterServices.GetRosterGroup(lstProfileIDs, _workDate.Date, _workDate.Date, out lstRosterTypeGroup, out lstRosterGroup);

                string registryCode  = "OT_" + overtime.CodeEmp + "_" + overtime.WorkDate.ToString("ddMMyyyyHHmmss");
                double basicHours    = overtime.RegisterHours;
                double durationHours = overtime.RegisterHours;
                //overtime.BasicHours = basicHours;
                //overtime.RegisterCode = registryCode;
                bool                isWorkDay       = true;
                DateTime            dateWorkDateEnd = dateWorkDate.AddHours(durationHours);
                Att_Grade           grade           = Att_GradeServices.GetGrade(profile, _workDate.Date);
                Cat_GradeAttendance gradeCfg        = grade == null ? null : grade.Cat_GradeAttendance;
                if (gradeCfg == null)
                {
                    return(listOvertimeInsert);
                }
                Hashtable htable = null;
                htable    = Att_RosterServices.GetRosterTable(false, profile, _workDate.Date, _workDate.Date, lstRosterGroup, lstRosterTypeGroup);
                isWorkDay = Att_AttendanceServices.IsWorkDay(gradeCfg, htable, lstDayOff, _workDate.Date);
                if (isByShift)//Lấy theo ca làm việc của từng người
                {
                    #region Lấy theo ca làm việc của từng người

                    Cat_Shift ship = Att_AttendanceServices.GetShift(gradeCfg, htable, _workDate.Date);
                    if (ship != null)
                    {
                        if (isWorkDay)
                        {
                            if (overtime.DurationType == EnumDropDown.OvertimeDurationType.E_OT_LATE.ToString() && ship != null)
                            {
                                DateTime timeOut = ship.InTime.AddHours(ship.CoOut);
                                dateWorkDate    = _workDate.Date.AddHours(timeOut.Hour).AddMinutes(timeOut.Minute);
                                dateWorkDateEnd = dateWorkDate.AddHours(durationHours);
                            }
                            else if (overtime.DurationType == EnumDropDown.OvertimeDurationType.E_OT_EARLY.ToString() && ship != null)
                            {
                                DateTime timeIn = ship.InTime;
                                dateWorkDate    = _workDate.Date.AddHours(timeIn.Hour).AddMinutes(timeIn.Minute);
                                dateWorkDateEnd = dateWorkDate;
                                dateWorkDate    = dateWorkDate.AddHours(-durationHours);
                            }
                        }
                        else
                        {
                            DateTime timeIn = ship.InTime;
                            dateWorkDate = _workDate.Date.AddHours(timeIn.Hour).AddMinutes(timeIn.Minute);
                        }
                    }
                    else
                    {
                        dateWorkDate    = dateWorkDate.Date;
                        dateWorkDateEnd = dateWorkDate.AddHours(durationHours);
                    }
                    ShiftOfOT = ship;


                    htable    = Att_RosterServices.GetRosterTable(false, profile, dateWorkDate, dateWorkDate.AddHours(durationHours), lstRosterGroup, lstRosterTypeGroup);
                    isWorkDay = Att_AttendanceServices.IsWorkDay(gradeCfg, htable, lstDayOff, dateWorkDate.AddHours(durationHours));

                    #endregion
                }

                //Kiem tra xem co trong thoi gian nghi thai san khong?
                if (isWorkDay && overtime.DurationType == EnumDropDown.OvertimeDurationType.E_OT_LATE.ToString() &&
                    _LstPregnancy != null && _LstPregnancy.Exists(pc => pc.ProfileID == profile.ID && pc.DateEnd >= dateWorkDate && pc.DateStart <= dateWorkDateEnd))
                {
                    dateWorkDate    = dateWorkDate.AddHours(-1);
                    dateWorkDateEnd = dateWorkDate.AddHours(durationHours);
                }
                overtime.WorkDate = dateWorkDate;



                string strHoursNightFrom = string.Empty;
                string strHoursNightTo   = string.Empty;


                if (!Att_AttendanceServices.IsNightShiftByConfig(ByPeriodOfTime) && ShiftOfOT != null &&
                    ShiftOfOT.NightTimeStart != null &&
                    ShiftOfOT.NightTimeEnd != null)
                {
                    strHoursNightFrom = ShiftOfOT.NightTimeStart.Value.ToString("HH:mm:ss");
                    strHoursNightTo   = ShiftOfOT.NightTimeEnd.Value.ToString("HH:mm:ss");
                }
                else
                {
                    strHoursNightFrom = string.IsNullOrEmpty(nightShiftFrom.Value1) == true ? "21:00:00" : nightShiftFrom.Value1 + ":00";
                    strHoursNightTo   = string.IsNullOrEmpty(nightShiftTo.Value1) == true ? "05:00:00" : nightShiftTo.Value1 + ":00";
                }

                DateTime dateNightFrom = Common.ConvertStringToDateTime(dateWorkDate.Date.ToString("MM/dd/yyyy") + " " + strHoursNightFrom, CultureInfo.CurrentCulture.DateTimeFormat.LongDatePattern);
                DateTime dateNightTo   = Common.ConvertStringToDateTime(dateWorkDate.Date.AddDays(1).ToString("MM/dd/yyyy") + " " + strHoursNightTo, CultureInfo.CurrentCulture.DateTimeFormat.LongDatePattern);


                OvertimeInfo overtimeInfo = new OvertimeInfo(true);
                overtimeInfo.DateFrom   = dateWorkDate;
                overtimeInfo.TotalHours = overtime.RegisterHours;

                overtimeInfo.DayShiftPoints = new DateTime[] { dateNightTo };

                if (isNocutOvertimePassDay)
                {
                    overtimeInfo.NightShiftPoints = new DateTime[] { dateNightFrom };
                }
                else
                {
                    //truong hop cat khi qua ngay hom sau
                    overtimeInfo.NightShiftPoints = new DateTime[] { dateNightFrom, dateNightFrom.Date };
                }

                if (ShiftOfOT != null && isAllowCutBreakHour)
                {
                    Cat_Shift shift      = ShiftOfOT;
                    DateTime  coBreakOut = shift.InTime.AddHours(shift.CoBreakIn);

                    if (shift.CoBreakOut - shift.CoBreakIn > 0)
                    {
                        overtimeInfo.BreaktPoints.Add(coBreakOut, shift.CoBreakOut - shift.CoBreakIn);
                    }
                }
                Hre_Profile temp = new Hre_Profile();
                temp.ID = overtime.ProfileID;

                overtimeInfo.Hre_Profile = temp;
                overtimeInfo.ListDayOff  = lstDayOff;

                listOvertimeInsert = AnalysisOvertime(overtime, overtimeInfo);



                return(listOvertimeInsert);
            }
        }
Esempio n. 4
0
        public static void SendMailForgetTAMScanLog()
        {
            using (var context = new VnrHrmDataContext())
            {
                BaseService _base = new BaseService();
                string      body2;
                var         unitOfWork = (IUnitOfWork)(new UnitOfWork(context));
                try
                {
                    string _typeTemplate = EnumDropDown.EmailType.E_SENDMAILFORGETTAMSCANLOG.ToString();
                    var    template      = unitOfWork.CreateQueryable <Sys_TemplateSendMail>(s => s.Type == _typeTemplate).FirstOrDefault();
                    if (template == null)
                    {
                        return;
                    }

                    if (DateTime.Now.DayOfWeek == DayOfWeek.Sunday)
                    {
                        return;
                    }
                    //Common.HostPath = System.Configuration.ConfigurationSettings.AppSettings["URLHost"].ToString();
                    var date1 = DateTime.Now;
                    if (date1.Day > 26)
                    {
                        date1 = date1.AddMonths(1);
                    }
                    DateTime dateStart = new DateTime(date1.Year, date1.Month, 26);
                    dateStart = dateStart.AddMonths(-1);
                    DateTime dateEnd = new DateTime(date1.Year, date1.Month, 25);
                    if (dateEnd >= DateTime.Now.Date)
                    {
                        dateEnd = DateTime.Now.Date.AddDays(-1);
                    }
                    dateEnd = dateEnd.AddDays(1).AddMilliseconds(-1);
                    var dayOffs = unitOfWork.CreateQueryable <Cat_DayOff>(s => dateStart <= s.DateOff && s.DateOff <= dateEnd).Select(s => s.DateOff).ToList();
                    var inOuts  = unitOfWork.CreateQueryable <Att_Workday>(s => s.ShiftID != null && dateStart <= s.WorkDate && s.WorkDate <= dateEnd)
                                  .Select(s => new { s.InTime1, s.ProfileID, s.ShiftID, s.OutTime1, s.WorkDate }).OrderByDescending(s => s.InTime1).ToList();
                    string status   = ProfileStatusSyn.E_HIRE.ToString();
                    var    profiles = unitOfWork.CreateQueryable <Hre_Profile>(s => s.Email != null && s.StatusSyn == status &&
                                                                               (s.DateQuit == null || s.DateQuit > DateTime.Now)).ToList();

                    string key = AppConfig.E_SERVER_MAIL.ToString();
                    //Sys_AppConfig AppConfigServerSendMail = unitOfWork.CreateQueryable<Sys_AppConfig>(s => s.Info == key).FirstOrDefault();
                    //string host = AppConfigServerSendMail.Value1;
                    //string emailFrom = AppConfigServerSendMail.Value2;
                    //string pass = AppConfigServerSendMail.Value3;
                    //bool isSSL = false;
                    //string subject = System.Configuration.ConfigurationManager.AppSettings["SendMailInOut"];
                    //string emailTitle = System.Configuration.ConfigurationManager.AppSettings["SendMailInOut"];
                    //if (AppConfigServerSendMail.Value6 != null)
                    //    bool.TryParse(AppConfigServerSendMail.Value6, out isSSL);
                    //int port = AppConfigServerSendMail.Value30.AsInt();
                    var                    shifts             = unitOfWork.CreateQueryable <Cat_Shift>().ToList();
                    string                 approve            = RosterStatus.E_APPROVED.ToString();
                    var                    rosters            = unitOfWork.CreateQueryable <Att_Roster>(s => s.MonShiftID != null && s.DateStart <= dateEnd && dateStart <= s.DateEnd && s.Status == approve).ToList <Att_Roster>();
                    List <Hre_Profile>     profileHasIns      = profiles;
                    List <Att_Roster>      lstRosterTypeGroup = new List <Att_Roster>();
                    List <Att_RosterGroup> lstRosterGroup     = new List <Att_RosterGroup>();

                    var    listHoliday     = unitOfWork.CreateQueryable <Cat_DayOff>(s => dateStart <= s.DateOff && s.DateOff <= dateEnd).ToList <Cat_DayOff>();
                    string E_FIRST         = PregnancyLeaveEarlyType.E_FIRST.ToString();
                    string E_LAST          = PregnancyLeaveEarlyType.E_LAST.ToString();
                    var    profileIDEarlys = unitOfWork.CreateQueryable <Att_Pregnancy>(s => (s.TypePregnancyEarly == E_FIRST || s.TypePregnancyEarly == E_LAST) &&
                                                                                        s.DateStart <= dateEnd && dateStart <= s.DateEnd).Select(s => s.ProfileID).ToList();
                    var approveKey = LeaveDayStatus.E_APPROVED.ToString();

                    var E_FULLSHIFT = LeaveDayDurationType.E_FULLSHIFT.ToString();
                    var leavdays    = unitOfWork.CreateQueryable <Att_LeaveDay>(s => s.DateStart <= dateEnd && dateStart <= s.DateEnd && s.Status == approveKey)
                                      .Select(s => new { s.ProfileID, s.DateStart, s.DateEnd, s.DurationType }).ToList();
                    var leavdaysFullShifts = leavdays.Where(s => s.DurationType == E_FULLSHIFT).ToList();
                    //string contenFile = File.ReadAllText(UIController.GetPath("~/TemplateTemp/InOutTemplate.html"));
                    string codeEmp = "85S";
                    if (codeEmp == null)
                    {
                        profiles = profiles.Where(s => s.CodeEmp == codeEmp).ToList();
                    }
                    var profileIDs = profileHasIns.Select(s => s.ID).ToList();
                    var grades     = unitOfWork.CreateQueryable <Att_Grade>(s => s.MonthStart <= dateEnd).OrderByDescending(d => d.MonthStart)
                                     .Select(d => new { d.ProfileID, d.MonthStart, d.GradeAttendanceID }).ToList();
                    List <Guid> gardeIDs = grades.Select(d => d.GradeAttendanceID.Value).ToList();
                    List <Cat_GradeAttendance> garCfgs = unitOfWork.CreateQueryable <Cat_GradeAttendance>(s => s.Code != "GENERAL DIRECTOR" && s.Code != "DIRECTOR").ToList();
                    garCfgs = garCfgs.Where(s => gardeIDs.Contains(s.ID)).ToList();
                    var workHistorys = unitOfWork.CreateQueryable <Hre_WorkHistory>(d => d.OrganizationStructureID != null && profileIDs.Contains(d.ProfileID)).ToList <Hre_WorkHistory>();
                    foreach (var profile in profileHasIns)
                    {
                        string          body   = string.Empty;
                        var             isSend = false;
                        int             index  = 1;
                        var             profileLeavesFullShifts = leavdaysFullShifts.Where(s => s.ProfileID == profile.ID).ToList();
                        List <DateTime> dateLeaveFullShits      = new List <DateTime>();
                        foreach (var leavesFullShift in profileLeavesFullShifts)
                        {
                            for (DateTime date = leavesFullShift.DateStart; date <= leavesFullShift.DateEnd; date = date.AddDays(1))
                            {
                                dateLeaveFullShits.Add(date);
                            }
                        }
                        for (DateTime date = dateStart; date <= dateEnd; date = date.AddDays(1))
                        {
                            if (date < profile.DateHire)
                            {
                                continue;
                            }
                            if (date.DayOfWeek == DayOfWeek.Sunday || dayOffs.Contains(date.Date) || dateLeaveFullShits.Contains(date.Date))
                            {
                                continue;
                            }
                            Att_AttendanceServices.GetRosterGroup(profileIDs, date, date, out lstRosterTypeGroup, out lstRosterGroup);
                            bool isSendIn                 = true;
                            bool isSendOut                = true;
                            var  inout                    = inOuts.FirstOrDefault(s => s.ProfileID == profile.ID && s.WorkDate == date);
                            var  listRosterByProfile      = rosters.Where(d => d.ProfileID == profile.ID).ToList();
                            var  listWorkHistoryByProfile = workHistorys.Where(d => d.ProfileID == profile.ID).ToList();
                            var  grade                    = grades.Where(d => d.ProfileID == profile.ID).OrderByDescending(d => d.MonthStart).FirstOrDefault();
                            Cat_GradeAttendance gradeCfg  = garCfgs.FirstOrDefault(d => grade != null && d.ID == grade.GradeAttendanceID);
                            if (gradeCfg != null && gradeCfg.AttendanceMethod != AttendanceMethod.E_FULL.ToString())
                            {
                                var listRosterEntity = listRosterByProfile.Select(d => new Att_RosterEntity
                                {
                                    ID              = d.ID,
                                    ProfileID       = d.ProfileID,
                                    RosterGroupName = d.RosterGroupName,
                                    Type            = d.Type,
                                    Status          = d.Status,
                                    DateEnd         = d.DateEnd,
                                    DateStart       = d.DateStart,
                                    MonShiftID      = d.MonShiftID,
                                    TueShiftID      = d.TueShiftID,
                                    WedShiftID      = d.WedShiftID,
                                    ThuShiftID      = d.ThuShiftID,
                                    FriShiftID      = d.FriShiftID,
                                    SatShiftID      = d.SatShiftID,
                                    SunShiftID      = d.SunShiftID,
                                    MonShift2ID     = d.MonShiftID,
                                    TueShift2ID     = d.TueShift2ID,
                                    WedShift2ID     = d.WedShift2ID,
                                    ThuShift2ID     = d.ThuShift2ID,
                                    FriShift2ID     = d.FriShift2ID,
                                    SatShift2ID     = d.SatShift2ID,
                                    SunShift2ID     = d.SunShift2ID
                                }).ToList();

                                var listRosterGroupEntity = lstRosterGroup.Select(d => new Att_RosterGroupEntity
                                {
                                    ID              = d.ID,
                                    DateEnd         = d.DateEnd,
                                    DateStart       = d.DateStart,
                                    MonShiftID      = d.MonShiftID,
                                    TueShiftID      = d.TueShiftID,
                                    WedShiftID      = d.WedShiftID,
                                    ThuShiftID      = d.ThuShiftID,
                                    FriShiftID      = d.FriShiftID,
                                    SatShiftID      = d.SatShiftID,
                                    SunShiftID      = d.SunShiftID,
                                    RosterGroupName = d.RosterGroupName
                                }).ToList();

                                Dictionary <DateTime, Cat_Shift> listDailyShifts = Att_AttendanceLib.GetDailyShifts(profile != null ? profile.ID : Guid.Empty, date, date, listRosterEntity, listRosterGroupEntity, shifts);

                                bool isWorkDate = Att_WorkDayHelper.IsWorkDay(date, gradeCfg, listDailyShifts, listHoliday);
                                if (isWorkDate)
                                {
                                    var catshift = shifts.FirstOrDefault(s => inout != null && s.ID == inout.ShiftID);
                                    if (catshift != null && inout != null)
                                    {
                                        double minInLate        = 0;
                                        double minOutEarly      = 0;
                                        var    leaveDayProfiles = leavdays.Where(s => s.ProfileID == profile.ID).ToList();
                                        var    leaveDay         = leaveDayProfiles.FirstOrDefault(s => s.DateStart.Date <= date && date <= s.DateEnd.Date);
                                        var    dateBreakOut     = new DateTime(date.Year, date.Month, date.Day, catshift.udCoBreakOut.Hour, catshift.udCoBreakOut.Minute, 0);
                                        var    dateBreakIn      = new DateTime(date.Year, date.Month, date.Day, catshift.udCoBreakIn.Hour, catshift.udCoBreakIn.Minute, 1);
                                        if (inout.InTime1 != null)                                                                                                    //kiem tra vao tre
                                        {
                                            var dateInShift = new DateTime(date.Year, date.Month, date.Day, catshift.udCoIn.Hour, catshift.udCoIn.Minute, 0);         // gio vao ca
                                            var dateInReal  = new DateTime(date.Year, date.Month, date.Day, inout.InTime1.Value.Hour, inout.InTime1.Value.Minute, 0); // gio vao thuc te
                                            minInLate = dateInReal.Subtract(dateInShift).TotalMinutes;
                                            if (minInLate >= 30)                                                                                                      // neu di tre >30 phut
                                            {
                                                if (leaveDay != null && leaveDay.DateStart != null)                                                                   // neu dang ky nghi
                                                {
                                                    if (leaveDay.DateStart <= dateInReal && dateInReal <= leaveDay.DateEnd)                                           // neu gio bat dau nghi
                                                    {
                                                        dateInShift = leaveDay.DateEnd;
                                                    }
                                                    else if (dateInReal > leaveDay.DateStart && dateInReal > leaveDay.DateEnd)// neu gio vao > gio dang ky nghi
                                                    {
                                                        dateInShift = leaveDay.DateEnd;
                                                    }
                                                    if (dateBreakIn <= dateInReal)// neu gio ra trong vung nghi giua ca
                                                    {
                                                        dateInShift = dateBreakOut;
                                                    }
                                                    minInLate = dateInReal.Subtract(dateInShift).TotalMinutes;
                                                }
                                            }
                                        }
                                        if (inout.OutTime1 != null)                                                                                                      //kiem tra ve som
                                        {
                                            var dateOutShift = new DateTime(date.Year, date.Month, date.Day, catshift.udCoOut.Hour, catshift.udCoOut.Minute, 0);         // gio ra ca
                                            var dateOutReal  = new DateTime(date.Year, date.Month, date.Day, inout.OutTime1.Value.Hour, inout.OutTime1.Value.Minute, 0); // gio vao thuc te
                                            minOutEarly = dateOutShift.Subtract(dateOutReal).TotalMinutes;
                                            if (minOutEarly >= 30)                                                                                                       // neu ve som > 30 phut
                                            {
                                                if (dateBreakIn <= dateOutReal && dateOutReal <= dateBreakOut)                                                           // neu gio ra trong vung nghi giua ca
                                                {
                                                    dateOutReal = dateBreakOut;
                                                }
                                                if (leaveDay != null && leaveDay.DateStart != null)                           // neu dang ky nghi
                                                {
                                                    if (leaveDay.DateStart <= dateOutReal && dateOutReal <= leaveDay.DateEnd) // neu gio bat dau nghi
                                                    {
                                                        dateOutShift = leaveDay.DateStart;
                                                    }
                                                    else if (dateOutReal < leaveDay.DateStart && dateOutReal < leaveDay.DateEnd)// neu gio vao > gio dang ky nghi
                                                    {
                                                        dateOutShift = leaveDay.DateStart;
                                                    }
                                                    minOutEarly = dateOutShift.Subtract(dateOutReal).TotalMinutes;
                                                }
                                            }
                                        }
                                        string minstr = string.Empty;
                                        if (minInLate < 30 && inout.InTime1 != null)
                                        {
                                            isSendIn = false;
                                        }
                                        if (minOutEarly < 30 && inout.OutTime1 != null)
                                        {
                                            isSendOut = false;
                                        }
                                        if (inout.OutTime1 == null || inout.InTime1 == null)
                                        {
                                            isSendOut = true;
                                        }
                                        if (isSendIn || isSendOut)
                                        {
                                            isSend = true;
                                        }
                                        if (inout.InTime1 != null)
                                        {
                                            if (profileIDEarlys.Contains(profile.ID))
                                            {
                                                if (minInLate < 90)
                                                {
                                                    isSendIn = false;
                                                }
                                                else
                                                {
                                                    minInLate -= 60;
                                                }
                                            }
                                            if (minInLate <= 0)
                                            {
                                                minInLate = 0;
                                            }
                                            if (minOutEarly <= 0)
                                            {
                                                minOutEarly = 0;
                                            }
                                            double sum = 0;
                                            if (minInLate >= 30)
                                            {
                                                sum += minInLate;
                                            }
                                            if (minOutEarly >= 30)
                                            {
                                                sum += minOutEarly;
                                            }
                                            minstr = sum.ToString();
                                        }
                                        if (isSendOut || isSendIn)
                                        {
                                            if (body == string.Empty)
                                            {
                                                body = "<tr><td style=\"text-align: center\"  class=\"dvtCellInfo\">";
                                            }
                                            body += "<tr>";
                                            body += "<td>";
                                            body += index;
                                            body += "</td>";
                                            body += "<td style=\"text-align: left\"  class=\"dvtCellInfo\">";
                                            body += profile.ProfileName;
                                            body += "</td>";
                                            body += "<td style=\"text-align: center\"  class=\"dvtCellInfo\">";
                                            body += profile.CodeEmp;
                                            body += "</td>";
                                            body += "<td style=\"text-align: center\"  class=\"dvtCellInfo\">";
                                            body += date.ToShortDateString();
                                            body += "</td>";
                                            body += "<td style=\"text-align: center\"  class=\"dvtCellInfo\">";
                                            body += (inout.InTime1 != null ? inout.InTime1.Value.ToString("HH:mm") : string.Empty);
                                            body += "</td>";
                                            body += "<td style=\"text-align: center\"  class=\"dvtCellInfo\">";
                                            body += (inout.OutTime1 != null ? inout.OutTime1.Value.ToString("HH:mm") : string.Empty);
                                            body += "</td>";
                                            body += "<td style=\"text-align: center\"  class=\"dvtCellInfo\">";
                                            body += minstr;
                                            body += "</td>";
                                            index++;
                                        }
                                    }
                                    else
                                    {
                                        isSend = true;
                                        body  += "<tr>";
                                        body  += "<td>";
                                        body  += index;
                                        body  += "</td>";
                                        body  += "<td style=\"text-align: left\"  class=\"dvtCellInfo\">";
                                        body  += profile.ProfileName;
                                        body  += "</td>";
                                        body  += "<td style=\"text-align: center\"  class=\"dvtCellInfo\">";
                                        body  += profile.CodeEmp;
                                        body  += "</td>";
                                        body  += "<td style=\"text-align: center\"  class=\"dvtCellInfo\">";
                                        body  += date.ToShortDateString();
                                        body  += "<td style=\"text-align: center\"  class=\"dvtCellInfo\">";
                                        body  += "</td>";
                                        body  += "<td style=\"text-align: center\"  class=\"dvtCellInfo\">";
                                        body  += "</td>";
                                        index++;
                                    }
                                    body += "</tr>";
                                }
                            }
                        }
                        string emailTo = profile.Email;
                        if (isSend && !String.IsNullOrEmpty(emailTo))
                        {
                            try
                            {
                                string[] strsParaKey = new[]
                                {
                                    "[ProfileName]"
                                    , "[Table]"
                                    , "[Date]"
                                };
                                string[] strsParaValues = new[]
                                {
                                    profile.ProfileName,
                                    body,
                                    ""
                                };
                                string body1 = ReplaceContentFile(template.Content, strsParaKey, strsParaValues);
                                body2 = body1;

                                _base.SendMail(template.Subject, emailTo, body1, null);

                                //var body1 = att_OvertimeDAO.ReplaceContentFileContent(contenFile, strsParaKey, strsParaValues);

                                //string result = Common.SendMail(host, port, subject, emailTitle, body1, emailFrom, emailTo, true, isSSL, pass, true);
                                //if (!result.Contains("OK"))
                                //    Response.Write("<br/>" + "Error send mail: " + emailTo + " " + result);
                            }
                            catch
                            {
                            }
                            //Response.Write("<br/>Sended: " + emailTo + "  " + DateTime.Now.ToLongTimeString());
                        }
                    }
                }
                catch (Exception ex)
                {
                }
            }
        }
Esempio n. 5
0
        /// <summary>
        /// Tính toán thời gian làm việc thực tế của nhân viên.
        /// </summary>
        /// <param name="profile"></param>
        /// <param name="listWorkDay"></param>
        /// <param name="listAllShiftItem"></param>
        /// <param name="listRosterByProfile"></param>
        /// <param name="listPregnancy"></param>
        /// <param name="gradeByProfile"></param>
        /// <returns></returns>
        public static List <WorkDay> ComputeWorkDays(Hre_Profile profile, List <Att_Workday> listInOut, List <Cat_ShiftItem> listAllShiftItem,
                                                     List <Att_Roster> listRosterByProfile, List <Att_Pregnancy> listPregnancy, Cat_GradeAttendance gradeCfgByProfile, string userLogin)
        {
            List <WorkDay> result = new List <WorkDay>();

            if (profile != null && listInOut != null && listInOut.Count() > 0)
            {
                listInOut = listInOut.OrderBy(inout => inout.WorkDate).ThenBy(inout => inout.InTime1).ToList();
                List <DateTime> listWorkDate = listInOut.Select(d => d.WorkDate.Date).Distinct().OrderBy(d => d).ToList();

                if (listWorkDate != null && listWorkDate.Count() > 0)
                {
                    Dictionary <DateTime, Cat_OrgStructure> listOrgStructure = Att_AttendanceLib.GetDailyLines(profile,
                                                                                                               listRosterByProfile, listWorkDate.FirstOrDefault(), listWorkDate.LastOrDefault());

                    foreach (DateTime workDate in listWorkDate)
                    {
                        Cat_OrgStructure orgLine = null;

                        if (listOrgStructure.ContainsKey(workDate))
                        {
                            //luôn luôn tồn tại 1 line
                            orgLine = listOrgStructure[workDate];
                        }

                        List <Att_Workday> listInOutByWorkDate = listInOut.Where(io => io.WorkDate.Date == workDate).ToList();

                        if (listInOutByWorkDate != null && listInOutByWorkDate.Count() > 0)
                        {
                            Att_Pregnancy pregnancyByWorkDay = listPregnancy.Where(d => d.DateStart != null && d.DateEnd != null &&
                                                                                   d.DateStart.Value <= workDate && d.DateEnd >= workDate).FirstOrDefault();

                            List <IGrouping <Cat_Shift, Att_Workday> > listInOutGroup = listInOutByWorkDate.Where(d =>
                                                                                                                  d.Cat_Shift != null).GroupBy(d => d.Cat_Shift).ToList();

                            foreach (IGrouping <Cat_Shift, Att_Workday> inOutGroup in listInOutGroup)
                            {
                                List <Cat_ShiftItem> listShiftItem = listAllShiftItem.Where(it =>
                                                                                            it.ShiftID == inOutGroup.Key.ID).ToList();

                                WorkDay workDayItem = CreateWorkDay(profile, inOutGroup.ToList(), orgLine,
                                                                    inOutGroup.Key, listShiftItem, pregnancyByWorkDay, gradeCfgByProfile, userLogin);

                                if (workDayItem != null)
                                {
                                    result.Add(workDayItem);
                                }
                            }
                        }
                    }
                }
            }

            return(result);
        }
Esempio n. 6
0
        private static WorkDay CreateWorkDay(Hre_Profile profile, List <Att_Workday> listInOutByWorkDate, Cat_OrgStructure orgLine,
                                             Cat_Shift shift, List <Cat_ShiftItem> listShiftItem, Att_Pregnancy pregnancyByWorkDay, Cat_GradeAttendance graCfgPro, string userLogin)
        {
            WorkDay result = null;

            listInOutByWorkDate = listInOutByWorkDate.Where(d => d.InTime1 != null &&
                                                            d.OutTime1 != null).OrderBy(d => d.WorkDate).ThenBy(d => d.InTime1).ToList();

            if (listInOutByWorkDate != null && listInOutByWorkDate.Count() > 0)
            {
                #region Khởi tạo

                result              = new WorkDay();
                result.Cat_Shift    = shift;
                result.WorkDuration = 0D;

                result.WorkDate = listInOutByWorkDate.Select(d => d.WorkDate).FirstOrDefault(); //ngày làm việc
                DateTime timeShiftStart = result.WorkDate.Date.Add(shift.InTime.TimeOfDay);     //thời gian bắt đầu của ca làm việc
                DateTime timeShiftEnd   = timeShiftStart.AddHours(shift.CoOut);                 ////thời gian kết thúc của ca làm việc (date + time)
                double   totalTimeShift = timeShiftEnd.Subtract(timeShiftStart).TotalHours;

                //LamLe - 20121017 - Lay gio lam viec trong grade hay trong Shift
                double workingStandardHour = graCfgPro.GetWorkHouPerDay(result.WorkDate);
                //if (shift != null && graCfgPro != null && graCfgPro.WorkHoursType == GradeHoursType.E_SHIFT_HOURS.ToString())
                if (shift != null && graCfgPro != null)
                {
                    workingStandardHour = shift.WorkHours != null ? shift.WorkHours.Value : 0D;
                }

                listShiftItem = listShiftItem.Where(sh => sh.ShiftItemType == ShiftItemType.E_SHIFTBREAK.ToString()).OrderBy(p => p.CoFrom).ToList();
                Guid?         lineID        = orgLine != null ? orgLine.ID : profile.OrgStructureID;//LamLe - 20121030 - Xu ly truong hop co Line org trong Roster
                Cat_ShiftItem shiftItemFlex = listShiftItem.Where(p => p.OrgStructureID == lineID).FirstOrDefault();

                double realCoBreakStart = 0D;
                double realCoBreakEnd   = 0D;

                //Vinhtran: Kiểm tra có giờ nghỉ giữa ca làm việc hay không?
                if (shift.ShiftBreakType == ShiftBreakType.E_FLEXIBLE.ToString() && totalTimeShift > workingStandardHour &&
                    shiftItemFlex != null && shiftItemFlex.CoFrom > 0 && shiftItemFlex.CoTo > shiftItemFlex.CoFrom)
                {
                    if (!shift.IsBreakAsWork.HasValue || !shift.IsBreakAsWork.Value)
                    {
                        shift.udCoBreakStart = shiftItemFlex.CoFrom;
                        shift.udCoBreakEnd   = shiftItemFlex.CoTo;
                    }

                    realCoBreakStart = shiftItemFlex.CoFrom;
                    realCoBreakEnd   = shiftItemFlex.CoTo;
                }
                else if (shift.CoBreakIn > 0 && shift.CoBreakOut > shift.CoBreakIn)
                {
                    if (!shift.IsBreakAsWork.HasValue || !shift.IsBreakAsWork.Value)
                    {
                        shift.udCoBreakStart = shift.CoBreakIn;
                        shift.udCoBreakEnd   = shift.CoBreakOut;
                    }

                    realCoBreakStart = shift.CoBreakIn;
                    realCoBreakEnd   = shift.CoBreakOut;
                }

                if (realCoBreakEnd > realCoBreakStart)
                {
                    totalTimeShift -= realCoBreakEnd - realCoBreakStart;
                }

                //Thời gian bắt đầu và kết thúc nghỉ giữa ca - dùng cho tính toán
                DateTime timeShiftBreakIn  = timeShiftStart.AddHours(shift.udCoBreakStart);
                DateTime timeShiftBreakOut = timeShiftStart.AddHours(shift.udCoBreakEnd);

                //Khoảng thời gian của nửa ca đầu
                DateTime firstHalfShiftStart = timeShiftStart;
                DateTime firstHalfShiftEnd   = timeShiftEnd;

                //Khoảng thời gian của nửa ca sau
                DateTime lastHalfShiftStart = timeShiftStart;
                DateTime lastHalfShiftEnd   = timeShiftEnd;

                if (shift.udCoBreakEnd > shift.udCoBreakStart &&
                    shift.udCoBreakStart > 0)
                {
                    firstHalfShiftStart = timeShiftStart;
                    firstHalfShiftEnd   = timeShiftBreakIn;

                    lastHalfShiftStart = timeShiftBreakOut;
                    lastHalfShiftEnd   = timeShiftEnd;
                }

                if (timeShiftBreakIn > timeShiftStart && listInOutByWorkDate.Count() > 1)
                {
                    //Lần quẹt thẻ vào đầu tiên và lần quẹt thẻ ra cuối cùng của nửa ca đâu
                    if (listInOutByWorkDate.Any(d => d.InTime1 < timeShiftBreakIn))
                    {
                        result.FirstInTime  = listInOutByWorkDate.Where(d => d.InTime1 < timeShiftBreakIn).OrderBy(d => d.WorkDate).ThenBy(d => d.InTime1).Select(d => d.InTime1.Value).FirstOrDefault();
                        result.FirstOutTime = listInOutByWorkDate.Where(d => d.InTime1 < timeShiftBreakIn).OrderBy(d => d.WorkDate).ThenBy(d => d.OutTime1).Select(d => d.OutTime1.Value).LastOrDefault();
                    }
                    else
                    {
                        result.FirstInTime  = listInOutByWorkDate.OrderBy(d => d.WorkDate).ThenBy(d => d.InTime1).Select(d => d.InTime1.Value).FirstOrDefault();
                        result.FirstOutTime = listInOutByWorkDate.OrderBy(d => d.WorkDate).ThenBy(d => d.OutTime1).Select(d => d.OutTime1.Value).FirstOrDefault();
                    }

                    //Lần quẹt thẻ vào đầu tiên và lần quẹt thẻ ra cuối cùng của nửa ca sau
                    if (listInOutByWorkDate.Any(d => d.OutTime1 > timeShiftBreakOut))
                    {
                        result.LastInTime  = listInOutByWorkDate.Where(d => d.OutTime1 > timeShiftBreakOut).OrderBy(d => d.WorkDate).ThenBy(d => d.InTime1).Select(d => d.InTime1.Value).FirstOrDefault();
                        result.LastOutTime = listInOutByWorkDate.Where(d => d.OutTime1 > timeShiftBreakOut).OrderBy(d => d.WorkDate).ThenBy(d => d.OutTime1).Select(d => d.OutTime1.Value).LastOrDefault();
                    }
                    else
                    {
                        result.LastInTime  = listInOutByWorkDate.OrderBy(d => d.WorkDate).ThenBy(d => d.InTime1).Select(d => d.InTime1.Value).LastOrDefault();
                        result.LastOutTime = listInOutByWorkDate.OrderBy(d => d.WorkDate).ThenBy(d => d.OutTime1).Select(d => d.OutTime1.Value).LastOrDefault();
                    }
                }
                else
                {
                    //Lần quẹt thẻ vào đầu tiên và lần quẹt thẻ ra cuối cùng của nửa ca đâu
                    result.FirstInTime  = listInOutByWorkDate.OrderBy(d => d.WorkDate).ThenBy(d => d.InTime1).Select(d => d.InTime1.Value).FirstOrDefault();
                    result.FirstOutTime = listInOutByWorkDate.OrderBy(d => d.WorkDate).ThenBy(d => d.OutTime1).Select(d => d.OutTime1.Value).LastOrDefault();

                    //Lần quẹt thẻ vào đầu tiên và lần quẹt thẻ ra cuối cùng của nửa ca sau
                    result.LastInTime  = listInOutByWorkDate.OrderBy(d => d.WorkDate).ThenBy(d => d.InTime1).Select(d => d.InTime1.Value).FirstOrDefault();
                    result.LastOutTime = listInOutByWorkDate.OrderBy(d => d.WorkDate).ThenBy(d => d.OutTime1).Select(d => d.OutTime1.Value).LastOrDefault();
                }

                DateTime nightTimeStart = result.WorkDate.Date.AddHours(21);
                DateTime nightTimeEnd   = result.WorkDate.Date.AddDays(1).AddHours(5);

                double nightDuration = 0D;
                double firstDuration = 0D;
                double lastDuration  = 0D;

                if (shift.IsNightShift)
                {
                    if (shift.NightTimeStart == null || shift.NightTimeEnd == null)
                    {
                        string appConfigName = AppConfig.HRM_ATT_OT_.ToString();
                        double startHour     = 21D;
                        double endHour       = 5D;

                        List <object> lstParamSys = new List <object>();
                        lstParamSys.Add(appConfigName);
                        lstParamSys.Add(null);
                        lstParamSys.Add(null);
                        string      status       = string.Empty;
                        BaseService baseService  = new BaseService();
                        var         lstAppConfig = baseService.GetData <Sys_AllSetting>(lstParamSys, ConstantSql.hrm_sys_sp_get_AllSetting, userLogin, ref status);

                        Sys_AllSetting appConfig13 = lstAppConfig.Where(s => s.IsDelete == null && s.Name == AppConfig.HRM_ATT_OT_NIGHTSHIFTFROM.ToString()).FirstOrDefault();
                        Sys_AllSetting appConfig14 = lstAppConfig.Where(s => s.IsDelete == null && s.Name == AppConfig.HRM_ATT_OT_NIGHTSHIFTTO.ToString()).FirstOrDefault();
                        //Sys_AppConfig appConfig = EntityService.Instance.GetEntityList<Sys_AppConfig>(false,
                        //    EntityService.Instance.GuidMainContext, Guid.Empty, d => d.Info == appConfigName).FirstOrDefault();

                        if (lstAppConfig != null && appConfig13 != null && appConfig14 != null)
                        {
                            double.TryParse(appConfig13.Value1, out startHour);
                            double.TryParse(appConfig14.Value1, out endHour);
                        }

                        nightTimeStart = shift.NightTimeStart == null?result.WorkDate.Date.AddHours(startHour) : result.WorkDate.Date.Add(shift.NightTimeStart.Value.TimeOfDay);

                        nightTimeEnd = shift.NightTimeEnd == null?result.WorkDate.Date.AddHours(endHour) : result.WorkDate.Date.Add(shift.NightTimeEnd.Value.TimeOfDay);
                    }
                    else
                    {
                        nightTimeStart = result.WorkDate.Date.Add(shift.NightTimeStart.Value.TimeOfDay);
                        nightTimeEnd   = result.WorkDate.Date.Add(shift.NightTimeEnd.Value.TimeOfDay);
                    }

                    nightTimeEnd = nightTimeStart > nightTimeEnd?nightTimeEnd.AddDays(1) : nightTimeEnd;
                }

                #endregion

                foreach (Att_Workday objInOut in listInOutByWorkDate)
                {
                    if (objInOut.InTime1.HasValue && objInOut.OutTime1.HasValue)
                    {
                        #region Tính work duration

                        DateTime inTime  = objInOut.InTime1.Value;
                        DateTime outTime = objInOut.OutTime1.Value;

                        firstDuration += GetIntersectAmountMinutes(inTime, outTime, firstHalfShiftStart, firstHalfShiftEnd);

                        if (timeShiftBreakIn > timeShiftStart)
                        {
                            //Nếu có giờ nghỉ giữa ca
                            lastDuration += GetIntersectAmountMinutes(inTime, outTime, lastHalfShiftStart, lastHalfShiftEnd);
                        }

                        #endregion

                        #region Tính night shift

                        if (shift.IsNightShift)
                        {
                            if (pregnancyByWorkDay != null)
                            {
                                if ((pregnancyByWorkDay.TypePregnancyEarly == PregnancyLeaveEarlyType.E_FIRST.ToString() ||
                                     pregnancyByWorkDay.TypePregnancyEarly == PregnancyLeaveEarlyType.E_FIRST_OUT_BEARK.ToString()) &&
                                    Common.IsOverlap(inTime, outTime, nightTimeStart, nightTimeEnd))
                                {
                                    nightTimeStart = nightTimeStart.AddHours(1);
                                }
                                else if ((pregnancyByWorkDay.TypePregnancyEarly == PregnancyLeaveEarlyType.E_LAST.ToString() ||
                                          pregnancyByWorkDay.TypePregnancyEarly == PregnancyLeaveEarlyType.E_LAST_IN_BEARK.ToString()) &&
                                         Common.IsOverlap(inTime, outTime, nightTimeStart, nightTimeEnd))
                                {
                                    nightTimeEnd = nightTimeEnd.AddHours(-1);
                                }
                            }

                            //Truong hop nghi giua ca nam trong khoang bat dau ca dem
                            if (nightTimeStart >= timeShiftBreakIn && nightTimeStart <= timeShiftBreakOut)
                            {
                                nightDuration += GetIntersectAmountMinutes(inTime, outTime, timeShiftBreakOut, nightTimeEnd);
                            }
                            else if (nightTimeEnd >= timeShiftBreakIn && nightTimeEnd <= timeShiftBreakOut)
                            {
                                nightDuration += GetIntersectAmountMinutes(inTime, outTime, nightTimeStart, timeShiftBreakIn);
                            }
                            else if (nightTimeEnd > timeShiftBreakOut && nightTimeStart < timeShiftBreakIn)
                            {
                                nightDuration += GetIntersectAmountMinutes(inTime, outTime, nightTimeStart, timeShiftBreakIn);
                                nightDuration += GetIntersectAmountMinutes(inTime, outTime, timeShiftBreakOut, nightTimeEnd);
                            }
                            else
                            {
                                nightDuration += GetIntersectAmountMinutes(inTime, outTime, nightTimeStart, nightTimeEnd);
                            }
                        }

                        #endregion
                    }
                }

                if (shift.ReduceNightShift != null && shift.ReduceNightShift >= 0)
                {
                    Int32 reduceNightMinutes = Convert.ToInt32(shift.ReduceNightShift.Value * 60);
                    nightDuration = nightDuration > reduceNightMinutes ? reduceNightMinutes : nightDuration;
                }

                nightDuration = nightDuration > 0 ? nightDuration / 60 : 0D;
                firstDuration = firstDuration > 0 ? firstDuration / 60 : 0D;
                lastDuration  = lastDuration > 0 ? lastDuration / 60 : 0D;

                //Vinhtran: Tổng thời gian làm việc - tính theo giờ
                result.WorkDuration       = firstDuration + lastDuration;
                result.NightShiftDuration = nightDuration;
                result.FirstDuration      = firstDuration;
                result.LastDuration       = lastDuration;

                if (result.WorkDuration > workingStandardHour)
                {
                    result.WorkDuration = workingStandardHour;
                }
                if (result.NightShiftDuration > workingStandardHour)
                {
                    result.NightShiftDuration = workingStandardHour;
                }

                if (shift.IsDoubleShift.Get_Boolean())
                {
                    //Vinh.Tran: Xử lý trường hợp ca ghép
                    totalTimeShift = shift.WorkHours.Get_Double();
                }

                //Vinhtran: Tổng thời gian bị đi trễ hoặc về sớm - tính theo giờ
                result.LateEarlyDuration = totalTimeShift - result.WorkDuration;

                #region Tính trễ sớm

                //Có đi trễ hoặc về sớm
                if (result.LateEarlyDuration > 0)
                {
                    if (timeShiftBreakIn > timeShiftStart)
                    {
                        if (result.FirstInTime > firstHalfShiftStart && result.FirstInTime < firstHalfShiftEnd)
                        {
                            //thời gian đi trễ nửa ca đầu
                            result.FirstLateDuration = result.FirstInTime.Value.Subtract(firstHalfShiftStart).TotalHours;
                        }

                        if (result.LastInTime > lastHalfShiftStart)
                        {
                            //thời gian đi trễ nửa ca sau
                            result.LastLateDuration = result.LastInTime.Value.Subtract(lastHalfShiftStart).TotalHours;
                        }

                        result.FirstEarlyDuration = firstHalfShiftEnd.Subtract(firstHalfShiftStart).TotalHours - firstDuration - result.FirstLateDuration;
                        result.LastEarlyDuration  = lastHalfShiftEnd.Subtract(lastHalfShiftStart).TotalHours - lastDuration - result.LastLateDuration;

                        result.LateDuration  = result.FirstLateDuration + result.LastLateDuration;
                        result.EarlyDuration = result.FirstEarlyDuration + result.LastEarlyDuration;
                    }
                    else
                    {
                        if (result.FirstInTime > timeShiftStart)
                        {
                            //thời gian đi trễ nửa ca đầu
                            result.LateDuration      = result.FirstInTime.Value.Subtract(timeShiftStart).TotalHours;
                            result.FirstLateDuration = result.LateDuration;
                            result.LastLateDuration  = 0;
                        }

                        result.EarlyDuration      = timeShiftEnd.Subtract(timeShiftStart).TotalHours - result.WorkDuration - result.LateDuration;
                        result.FirstEarlyDuration = result.EarlyDuration;
                        result.LastEarlyDuration  = 0;
                    }

                    if (pregnancyByWorkDay != null)
                    {
                        //Thời gian làm việc lớn nhất có thể xảy ra
                        double maxWorkDuration = totalTimeShift - result.LateEarlyDuration + 1;
                        maxWorkDuration += shift.IsDoubleShift.Get_Boolean() ? 1 : 0;//Ca ghép thì thêm 1 giờ
                        maxWorkDuration  = maxWorkDuration > totalTimeShift ? totalTimeShift : maxWorkDuration;

                        if (pregnancyByWorkDay.TypePregnancyEarly == PregnancyLeaveEarlyType.E_FIRST.ToString())
                        {
                            //Chỉ được đi trễ 1 giờ đầu của nửa ca trước, không được về sớm trong nữa ca đầu.
                            result.WorkDuration     += result.FirstLateDuration <= 1 ? result.FirstLateDuration : 1;
                            result.FirstLateDuration = result.FirstLateDuration <= 1 ? 0 : result.FirstLateDuration - 1;

                            if (shift.IsDoubleShift.Get_Boolean())
                            {
                                result.WorkDuration    += result.LastLateDuration <= 1 ? result.LastLateDuration : 1;
                                result.LastLateDuration = result.LastLateDuration <= 1 ? 0 : result.LastLateDuration - 1;
                                result.LateDuration     = result.LateDuration <= 2 ? 0 : result.LateDuration - 2;
                            }
                            else
                            {
                                result.LateDuration = result.LateDuration <= 1 ? 0 : result.LateDuration - 1;
                            }

                            result.WorkDuration = result.WorkDuration > maxWorkDuration ? maxWorkDuration : result.WorkDuration;
                        }
                        else if (pregnancyByWorkDay.TypePregnancyEarly == PregnancyLeaveEarlyType.E_FIRST_OUT_BEARK.ToString())
                        {
                            //Được đi trễ hoặc về sớm 1 giờ bất kỳ của nửa ca trước, nếu là ca ghép thì được 1 tiếng trễ sớm ở mỗi ca (tổng là 2 tiếng)
                            double firstLatetEarly = timeShiftBreakIn > timeShiftStart ? result.FirstLateDuration + result.FirstEarlyDuration : result.LateDuration + result.EarlyDuration;
                            double lastLatetEarly  = (shift.IsDoubleShift.Get_Boolean() && timeShiftBreakIn > timeShiftStart) ? result.LastLateDuration + result.LastEarlyDuration : 0;
                            double totalLatetEarly = firstLatetEarly + lastLatetEarly;

                            if (shift.IsDoubleShift.Get_Boolean())
                            {
                                result.WorkDuration += totalLatetEarly <= 2 ? totalLatetEarly : 2;
                                result.LateDuration  = result.LateDuration <= 2 ? 0 : result.LateDuration - 2;
                            }
                            else
                            {
                                result.WorkDuration += totalLatetEarly <= 1 ? totalLatetEarly : 1;
                                result.LateDuration  = result.LateDuration <= 1 ? 0 : result.LateDuration - 1;
                            }

                            if (timeShiftBreakIn > timeShiftStart)
                            {
                                result.FirstLateDuration  = result.FirstLateDuration <= 1 ? 0 : result.FirstLateDuration - 1;
                                result.FirstEarlyDuration = firstLatetEarly - result.FirstLateDuration;

                                if (shift.IsDoubleShift.Get_Boolean())
                                {
                                    result.LastLateDuration  = result.LastLateDuration <= 1 ? 0 : result.LastLateDuration - 1;
                                    result.LastEarlyDuration = lastLatetEarly - result.LastLateDuration;
                                }
                            }

                            result.EarlyDuration = totalLatetEarly - result.LateDuration;
                        }
                        else if (pregnancyByWorkDay.TypePregnancyEarly == PregnancyLeaveEarlyType.E_LAST_IN_BEARK.ToString())
                        {
                            //Được đi trễ hoặc về sớm 1 giờ bất kỳ của nửa ca sau, nếu là ca ghép thì được 1 tiếng trễ sớm ở mỗi ca (tổng là 2 tiếng)
                            double lastLatetEarly  = timeShiftBreakIn > timeShiftStart ? result.LastLateDuration + result.LastEarlyDuration : result.LateDuration + result.EarlyDuration;
                            double firstLatetEarly = (shift.IsDoubleShift.Get_Boolean() && timeShiftBreakIn > timeShiftStart) ? result.FirstLateDuration + result.FirstEarlyDuration : 0;
                            double totalLatetEarly = firstLatetEarly + lastLatetEarly;

                            if (shift.IsDoubleShift.Get_Boolean())
                            {
                                result.WorkDuration += totalLatetEarly <= 2 ? totalLatetEarly : 2;
                                result.LateDuration  = result.LateDuration <= 2 ? 0 : result.LateDuration - 2;
                            }
                            else
                            {
                                result.WorkDuration += totalLatetEarly <= 1 ? totalLatetEarly : 1;
                                result.LateDuration  = result.LateDuration <= 1 ? 0 : result.LateDuration - 1;
                            }

                            if (timeShiftBreakIn > timeShiftStart)
                            {
                                result.LastLateDuration  = result.LastLateDuration <= 1 ? 0 : result.LastLateDuration - 1;
                                result.LastEarlyDuration = lastLatetEarly - result.LastLateDuration;

                                if (shift.IsDoubleShift.Get_Boolean())
                                {
                                    result.FirstLateDuration  = result.FirstLateDuration <= 1 ? 0 : result.FirstLateDuration - 1;
                                    result.FirstEarlyDuration = firstLatetEarly - result.FirstLateDuration;
                                }
                            }

                            result.EarlyDuration = totalLatetEarly - result.LateDuration;
                        }
                        else if (pregnancyByWorkDay.TypePregnancyEarly == PregnancyLeaveEarlyType.E_LAST.ToString())
                        {
                            //Chỉ được về sớm 1 giờ cuối của nửa ca trước, không được đi trễ trong nữa ca sau.
                            if (timeShiftBreakIn > timeShiftStart)
                            {
                                result.WorkDuration     += result.LastEarlyDuration <= 1 ? result.LastEarlyDuration : 1;
                                result.LastEarlyDuration = result.LastEarlyDuration <= 1 ? 0 : result.LastEarlyDuration - 1;

                                if (shift.IsDoubleShift.Get_Boolean())
                                {
                                    result.WorkDuration      += result.FirstEarlyDuration <= 1 ? result.FirstEarlyDuration : 1;
                                    result.FirstEarlyDuration = result.FirstEarlyDuration <= 1 ? 0 : result.FirstEarlyDuration - 1;
                                }
                            }
                            else
                            {
                                if (shift.IsDoubleShift.Get_Boolean())
                                {
                                    result.WorkDuration += result.EarlyDuration <= 2 ? result.EarlyDuration : 2;
                                }
                                else
                                {
                                    result.WorkDuration += result.EarlyDuration <= 1 ? result.EarlyDuration : 1;
                                }
                            }

                            if (shift.IsDoubleShift.Get_Boolean())
                            {
                                result.EarlyDuration = result.EarlyDuration <= 2 ? 0 : result.EarlyDuration - 2;
                            }
                            else
                            {
                                result.EarlyDuration = result.EarlyDuration <= 1 ? 0 : result.EarlyDuration - 1;
                            }

                            result.WorkDuration = result.WorkDuration > maxWorkDuration ? maxWorkDuration : result.WorkDuration;
                        }
                    }
                }

                #endregion

                //Vinhtran: Tổng thời gian bị đi trễ hoặc về sớm - tính theo phút
                result.LateDuration       = result.LateDuration > 0 ? result.LateDuration * 60 : 0D;
                result.EarlyDuration      = result.EarlyDuration > 0 ? result.EarlyDuration * 60 : 0D;
                result.FirstLateDuration  = result.FirstLateDuration > 0 ? result.FirstLateDuration * 60 : 0D;
                result.FirstEarlyDuration = result.FirstEarlyDuration > 0 ? result.FirstEarlyDuration * 60 : 0D;
                result.LastLateDuration   = result.LastLateDuration > 0 ? result.LastLateDuration * 60 : 0D;
                result.LastEarlyDuration  = result.LastEarlyDuration > 0 ? result.LastEarlyDuration * 60 : 0D;
                result.LateEarlyDuration  = result.LateEarlyDuration > 0 ? result.LateEarlyDuration * 60 : 0D;

                //Vinhtran: Tổng thời gian (h) làm ca đêm lớn nhất có thể => làm tròn trễ sớm
                result.MaxNightDuration = nightTimeEnd.Subtract(nightTimeStart).TotalHours;

                //Thời gian bắt đầu và kết thúc nghỉ giữa ca - giá trị thực tế
                result.ShiftBreakInTime  = timeShiftStart.AddHours(realCoBreakStart);
                result.ShiftBreakOutTime = timeShiftStart.AddHours(realCoBreakEnd);

                //Khoản thời gian làm việc của ca
                result.ShiftInTime  = timeShiftStart;
                result.ShiftOutTime = timeShiftEnd;

                if (shift != null && shift.IsNotApplyWorkHoursReal != null && shift.IsNotApplyWorkHoursReal.Value == true)
                {
                    result.WorkDuration = workingStandardHour - Math.Abs(result.LateDuration / 60) - Math.Abs(result.EarlyDuration / 60);
                }
            }

            return(result);
        }
Esempio n. 7
0
        public List <Att_RptExceptionDataEntity> GetAtt_RptExceptionData(DateTime DateStart, DateTime DateEnd, String OrgStructureIDs, bool NoScan, bool DifferenceMoreRoster, double Difference, double LessHours, bool MissInOut, out string message, string userExport, string userLogin)
        {
            using (var context = new VnrHrmDataContext())
            {
                var unitOfWork = (IUnitOfWork) new UnitOfWork(context);
                message = "";
                var repoHre_Profile          = new CustomBaseRepository <Hre_Profile>(unitOfWork);
                var repoCat_OrgStructure     = new CustomBaseRepository <Cat_OrgStructure>(unitOfWork);
                var repoCat_DayOff           = new CustomBaseRepository <Cat_DayOff>(unitOfWork);
                var repoAtt_Roster           = new CustomBaseRepository <Att_Roster>(unitOfWork);
                var repoAtt_InOut            = new CustomBaseRepository <Att_InOut>(unitOfWork);
                var repoAtt_LeaveDay         = new CustomBaseRepository <Att_LeaveDay>(unitOfWork);
                var repoAtt_Grade            = new CustomBaseRepository <Att_Grade>(unitOfWork);
                var repoHre_WorkHistory      = new CustomBaseRepository <Hre_WorkHistory>(unitOfWork);
                var repoCat_OrgStructureType = new Cat_OrgStructureTypeRepository(unitOfWork);
                var repoCat_Position         = new Cat_PositionRepository(unitOfWork);


                List <Hre_ProfileEntity> lstProfile = new List <Hre_ProfileEntity>();
                List <object>            lstOrgIDs  = new List <object>();
                lstOrgIDs.AddRange(new object[3]);
                lstOrgIDs[0] = OrgStructureIDs;
                lstOrgIDs[1] = null;
                lstOrgIDs[2] = null;
                lstProfile   = GetData <Hre_ProfileEntity>(lstOrgIDs, ConstantSql.hrm_hr_sp_get_ProfileIdsByOrg, userLogin, ref message);

                List <Att_RptExceptionDataEntity> Result = new List <Att_RptExceptionDataEntity>();
                string waitStatus = ProfileStatusSyn.E_WAITING.ToString();
                lstProfile = lstProfile.Where(d => d.StatusSyn != waitStatus && (d.DateQuit == null || d.DateQuit.Value > DateEnd)).ToList();
                List <Guid>      lstProfileID = lstProfile.Select(d => d.ID).ToList();
                List <Att_InOut> lstInOutAll  = repoAtt_InOut.FindBy(wd => wd.WorkDate >= DateStart &&
                                                                     wd.WorkDate <= DateEnd).OrderBy(wd => wd.Hre_Profile.ProfileName).ToList();
                var positions = repoCat_Position.FindBy(s => s.IsDelete == null && s.Code != null).Select(s => new { s.ID, s.Code, s.PositionName }).ToList();
                var orgTypes  = repoCat_OrgStructureType.FindBy(s => s.IsDelete == null).ToList();
                List <Cat_OrgStructure> lstOrg = new List <Cat_OrgStructure>();
                if (!string.IsNullOrEmpty(OrgStructureIDs)) // Chỉ lấy phòng ban theo sự lựa chọn
                {
                    List <int> lstOrderNumber = OrgStructureIDs.Split(',').Distinct().Select(s => int.Parse(s)).ToList();
                    lstOrg = repoCat_OrgStructure.FindBy(m => m.IsDelete == null && lstOrderNumber.Contains(m.OrderNumber)).ToList();
                }
                else //Lấy hêt phòng ban
                {
                    lstOrg = repoCat_OrgStructure.FindBy(m => m.IsDelete == null).ToList();
                }
                if (NoScan)
                {
                    List <Cat_DayOff> lstHoliday       = repoCat_DayOff.FindBy(d => d.IsDelete == null).ToList();
                    String            RosterTypeAbsent = RosterType.E_TIME_OFF.ToString();
                    List <Att_Roster> lstRoster        = repoAtt_Roster.FindBy(prop => prop.DateStart <= DateEnd && prop.DateEnd >= DateStart &&
                                                                               prop.Type != RosterTypeAbsent).ToList();

                    List <Att_LeaveDay> lstLeaveDayAll = repoAtt_LeaveDay.FindBy(prop => prop.DateStart <= DateEnd && prop.DateEnd >= DateStart).ToList();
                    List <Att_Grade>    lstAtt_Grade   = repoAtt_Grade.FindBy(d => d.MonthStart <= DateEnd && d.MonthEnd >= DateStart && d.ProfileID.HasValue && lstProfileID.Contains(d.ProfileID.Value)).ToList();
                    //List<Sal_Grade> lstGradeAll = GradeDAO.getAllGrade(EntityService.GuidMainContext
                    //                                                , lstProfileID
                    //                                                , DateEnd
                    //                                                , LoginUserID);
                    List <Hre_WorkHistory> lstWHistory        = repoHre_WorkHistory.FindBy(d => d.IsDelete == null).ToList();
                    List <Att_Roster>      lstRosterTypeGroup = new List <Att_Roster>();
                    List <Att_RosterGroup> lstRosterGroup     = new List <Att_RosterGroup>();
                    Att_RosterServices.GetRosterGroup(lstProfileID, DateStart, DateEnd, out lstRosterTypeGroup, out lstRosterGroup);
                    //RosterDAO.GetRosterGroup(GuidContext, lstProfileIDs, DateStart, DateEnd, out lstRosterTypeGroup, out lstRosterGroup);


                    foreach (Hre_ProfileEntity profile in lstProfile)
                    {
                        List <Att_LeaveDay> lstProfileLeaveDay = lstLeaveDayAll.Where(ld => ld.ProfileID == profile.ID).ToList();
                        List <Att_InOut>    lstProfileInOut    = lstInOutAll.Where(ld => ld.ProfileID == profile.ID).ToList();
                        //Sal_Grade grade = lstGradeAll.Where(grad => grad.ProfileID == profile.ID).SingleOrDefault();
                        Att_Grade              grade            = lstAtt_Grade.Where(d => d.ProfileID == profile.ID).FirstOrDefault();
                        List <Att_Roster>      lstProfileRoster = lstRoster.Where(rt => rt.ProfileID == profile.ID).ToList();
                        List <Hre_WorkHistory> lstWHistoryPro   = lstWHistory.Where(wh => wh.ProfileID == profile.ID).ToList();
                        Cat_GradeAttendance    gradeCfg         = grade == null ? null : grade.Cat_GradeAttendance;
                        //Hashtable htRoster = RosterDAO.GetRosterTable(profile, lstProfileRoster, lstWHistoryPro, gradeCfg, DateStart, DateEnd, lstRosterGroup, lstRosterTypeGroup);
                        Hre_Profile objProfile = profile.CopyData <Hre_Profile>();
                        Hashtable   htRoster   = Att_RosterServices.GetRosterTable(objProfile, lstProfileRoster, lstWHistoryPro, gradeCfg, DateStart, DateEnd, lstRosterGroup, lstRosterTypeGroup);
                        //string[] strDepartment = GradeCfgDAO.getLinkDepartment(ListCacheOrgStructure, profile.Cat_OrgStructure);
                        //profile.udLinkDepartmentName = strDepartment[0];
                        if (grade == null)
                        {
                            continue;
                        }
                        if (grade.Cat_GradeAttendance.AttendanceMethod != AttendanceMethod.E_TAM.ToString())
                        {
                            continue;
                        }

                        for (DateTime idx = DateStart; idx <= DateEnd
                             ; idx = idx.AddDays(1))
                        {
                            // kiểm tra nếu nghỉ việc trong tháng, các ngày sau không hiển thị lên
                            if (profile.DateQuit != null && idx > profile.DateQuit.Value)
                            {
                                continue;
                            }

                            //In-Out
                            if (lstHoliday.Where(hol => hol.DateOff == idx).Count() > 0)
                            {
                                continue;
                            }

                            if (!Att_AttendanceServices.IsWorkDay(grade.Cat_GradeAttendance, htRoster, lstHoliday, idx) ||
                                idx < profile.DateHire ||
                                idx >= profile.DateQuit)
                            {
                                continue;
                            }

                            Att_RptExceptionDataEntity exceptionData       = null;
                            List <Att_InOut>           lstDateProfileInOut = lstProfileInOut.Where(inout => inout.WorkDate == idx).ToList();
                            //ko di lam, ko quet the
                            if (lstDateProfileInOut.Count <= 0)
                            {
                                //ko thong bao nghi
                                if (lstProfileLeaveDay.Where(ld => ld.ProfileID == profile.ID &&
                                                             ld.DateStart.Date <= idx && ld.DateEnd.Date >= idx).Count() <= 0)
                                {
                                    exceptionData = SetExceptionData(null, objProfile, null, idx, userExport);
                                    var OrgC = lstOrg.Where(m => m.ID == profile.OrgStructureID).FirstOrDefault();
                                    exceptionData.Department = OrgC != null ? OrgC.OrgStructureName : string.Empty;
                                    var orgSection = LibraryService.GetNearestParent(profile.OrgStructureID, OrgUnit.E_SECTION, lstOrg, orgTypes);
                                    exceptionData.Section = orgSection != null ? orgSection.OrgStructureName : string.Empty;
                                    var positon = positions.FirstOrDefault(s => s.ID == profile.PositionID);
                                    exceptionData.Position = positon != null ? positon.Code : string.Empty;
                                    //exceptionData.DataType = LanguageManager.GetString(ClassNames.Att_InOut);
                                    //exceptionData.Exception = LanguageManager.GetString(Messages.MissingInOut);
                                    exceptionData.DataType    = ("Att_InOut").TranslateString();
                                    exceptionData.Exception   = ConstantMessages.MissingInOut.TranslateString();
                                    exceptionData.Description = "? - ?";
                                    Result.Add(exceptionData);
                                }
                            }
                        }
                    }
                }
                if (DifferenceMoreRoster)
                {
                    foreach (Att_InOut InOut in lstInOutAll)
                    {
                        if (InOut.InTime != null && InOut.OutTime != null)
                        {
                            if (Difference < Att_AttendanceServices.GetShiftRosterShiftInOutHour(InOut, InOut.Cat_Shift))
                            {
                                Att_RptExceptionDataEntity exceptionData = SetExceptionData(InOut, InOut.Hre_Profile
                                                                                            , InOut.Cat_Shift, InOut.WorkDate, userExport);
                                var OrgC = lstOrg.Where(m => m.ID == InOut.Hre_Profile.OrgStructureID).FirstOrDefault();
                                exceptionData.Department = OrgC != null ? OrgC.OrgStructureName : string.Empty;
                                var orgSection = LibraryService.GetNearestParent(InOut.Hre_Profile.OrgStructureID, OrgUnit.E_SECTION, lstOrg, orgTypes);
                                exceptionData.Section = orgSection != null ? orgSection.OrgStructureName : string.Empty;
                                var positon = positions.FirstOrDefault(s => s.ID == InOut.Hre_Profile.PositionID);
                                exceptionData.Position = positon != null ? positon.Code : string.Empty;
                                //exceptionData.DataType = LanguageManager.GetString(ClassNames.Att_InOut);
                                //exceptionData.Exception = LanguageManager.GetString(Messages.DifferenceShiftRosterAndInOut) + " " + Difference + " " + LanguageManager.GetString(Messages.Hour);
                                exceptionData.DataType  = ("Att_InOut").TranslateString();
                                exceptionData.Exception = ConstantMessages.DifferenceShiftRosterAndInOut.TranslateString() + " " + Difference + " " + ConstantMessages.Hour.TranslateString();
                                String desc = "InOut: ";
                                desc += InOut.InTime.Value.ToString(ConstantFormat.HRM_Format_HourMinSecond);
                                desc += " - ";
                                desc += InOut.OutTime.Value.ToString(ConstantFormat.HRM_Format_HourMinSecond);
                                desc += " / Shift: ";
                                desc += InOut.Cat_Shift.ShiftName;

                                exceptionData.Description = desc;
                                Result.Add(exceptionData);
                            }
                        }
                    }
                }
                if (LessHours > 0)
                {
                    Double minHrs = 0;
                    //Get Hours
                    try
                    {
                        minHrs = LessHours;
                    }
                    catch (System.Exception ex)
                    {
                    }


                    List <Att_InOut> lstInOutAllLessHours = lstInOutAll.Where(d => d.InTime.HasValue && d.OutTime.HasValue).ToList();

                    foreach (Att_InOut InOut in lstInOutAllLessHours)
                    {
                        Double workHours = Att_AttendanceServices.GetInOutWorkingHour(InOut, InOut.Cat_Shift);
                        if (minHrs > workHours)
                        {
                            Att_RptExceptionDataEntity exceptionData = SetExceptionData(InOut, InOut.Hre_Profile
                                                                                        , InOut.Cat_Shift, InOut.WorkDate, userExport);
                            var OrgC = lstOrg.Where(m => m.ID == InOut.Hre_Profile.OrgStructureID).FirstOrDefault();
                            exceptionData.Department = OrgC != null ? OrgC.OrgStructureName : string.Empty;
                            var orgSection = LibraryService.GetNearestParent(InOut.Hre_Profile.OrgStructureID, OrgUnit.E_SECTION, lstOrg, orgTypes);
                            exceptionData.Section = orgSection != null ? orgSection.OrgStructureName : string.Empty;
                            var positon = positions.FirstOrDefault(s => s.ID == InOut.Hre_Profile.PositionID);
                            exceptionData.Position = positon != null ? positon.Code : string.Empty;
                            //exceptionData.DataType = LanguageManager.GetString(ClassNames.Att_InOut);
                            //exceptionData.Exception = LanguageManager.GetString(Messages.WorkingHoursLess) + " " + Difference + " " + LanguageManager.GetString(Messages.Hour);
                            exceptionData.DataType  = ("Att_InOut").TranslateString();
                            exceptionData.Exception = ConstantMessages.WorkingHoursLess.TranslateString() + " " + Difference + " " + ConstantMessages.Hour.TranslateString();
                            String desc = "";
                            desc  = InOut.InTime.Value.ToString(ConstantFormat.HRM_Format_HourMinSecond);
                            desc += " - ";
                            desc += InOut.OutTime.Value.ToString(ConstantFormat.HRM_Format_HourMinSecond);

                            exceptionData.Description = desc;
                            Result.Add(exceptionData);
                        }
                    }
                }
                if (MissInOut)
                {
                    List <Att_InOut> lstInOutAllMissInOut = lstInOutAll.Where(wd => (wd.InTime.HasValue &&
                                                                                     !wd.OutTime.HasValue)
                                                                              ||
                                                                              (!wd.InTime.HasValue &&
                                                                               wd.OutTime.HasValue)).ToList();
                    foreach (Att_InOut InOut in lstInOutAll)
                    {
                        if (InOut.InTime == null || InOut.OutTime == null)
                        {
                            Att_RptExceptionDataEntity exceptionData = SetExceptionData(InOut, InOut.Hre_Profile, InOut.Cat_Shift, InOut.WorkDate, userExport);
                            var OrgC = lstOrg.Where(m => m.ID == InOut.Hre_Profile.OrgStructureID).FirstOrDefault();
                            exceptionData.Department = OrgC != null ? OrgC.OrgStructureName : string.Empty;
                            var orgSection = LibraryService.GetNearestParent(InOut.Hre_Profile.OrgStructureID, OrgUnit.E_SECTION, lstOrg, orgTypes);
                            exceptionData.Section = orgSection != null ? orgSection.OrgStructureName : string.Empty;
                            var positon = positions.FirstOrDefault(s => s.ID == InOut.Hre_Profile.PositionID);
                            exceptionData.Position = positon != null ? positon.Code : string.Empty;
                            //exceptionData.DataType = LanguageManager.GetString(ClassNames.Att_InOut);
                            //exceptionData.Exception = LanguageManager.GetString(Messages.MissingInOut);
                            exceptionData.DataType  = ("Att_InOut").TranslateString();
                            exceptionData.Exception = ConstantMessages.MissingInOut.TranslateString();
                            String desc = "";
                            if (InOut.InTime != null)
                            {
                                desc = InOut.InTime.Value.ToString(ConstantFormat.HRM_Format_HourMinSecond);
                            }
                            else
                            {
                                desc = "?";
                            }
                            desc += " - ";
                            if (InOut.OutTime != null)
                            {
                                desc += InOut.OutTime.Value.ToString(ConstantFormat.HRM_Format_HourMinSecond);
                            }
                            else
                            {
                                desc += "?";
                            }
                            exceptionData.Description = desc;
                            Result.Add(exceptionData);
                        }
                    }
                }
                return(Result);
            }
        }