public Cat_OvertimeType getOTType(DateTime dateWorkDate, bool isNightShift, Hre_Profile profile, List <Cat_DayOff> list_dayOff, List <Att_RosterGroup> lstRosterGroup, List <Att_Roster> lstRosterTypeGroup) { using (var context = new VnrHrmDataContext()) { var unitOfWork = (IUnitOfWork)(new UnitOfWork(context)); var repoAtt_LeaveDay = new CustomBaseRepository <Att_LeaveDay>(unitOfWork); var repoCat_OvertimeType = new CustomBaseRepository <Cat_OvertimeType>(unitOfWork); Cat_OvertimeType otType = null; try { dateWorkDate = dateWorkDate.Date; //LamLe : Them chuc nang neu tang ca vao ngay nghi thi chon loai tang ca phu thuoc vao cau hinh Tang ca trong ngay nghi. List <Att_LeaveDay> lstLeave = repoAtt_LeaveDay .FindBy(lv => lv.IsDelete == null && lv.DateStart <= dateWorkDate && lv.DateEnd >= dateWorkDate && lv.ProfileID == profile.ID) .ToList(); if (lstLeave.Count > 0) { Att_LeaveDay leave = lstLeave[0]; if (leave != null && leave.Cat_LeaveDayType != null && leave.Cat_LeaveDayType.Cat_OvertimeType != null) { otType = leave.Cat_LeaveDayType.Cat_OvertimeType; return(otType); } } Att_Grade grade = Att_GradeServices.GetGrade(profile, dateWorkDate); if (grade == null) { string status = OverTimeType.E_WORKDAY.ToString(); otType = repoCat_OvertimeType.FindBy(dayoff => dayoff.IsDelete == null && dayoff.Code == status).FirstOrDefault(); return(otType); } list_dayOff = list_dayOff.Where(df => df.DateOff.Date == dateWorkDate.Date).ToList(); Cat_GradeCfg gradecfg = grade.Cat_GradeCfg; //Check overtime holiday //List<Cat_DayOff> list_dayOff = EntityService.Instance.GetEntityList<Cat_DayOff>(GuidContext, _userId, dayoff => dayoff.DateOff == dateWorkDate); if (list_dayOff.Count > 0) { //Cat_GradeCfg.FieldNames.Cat_OvertimeType1 bool isDayOffHollyDay = false; foreach (var item in list_dayOff) { if (item.DateOff.Date == dateWorkDate.Date && item.Type == HolidayType.E_HOLIDAY_HLD.ToString()) { isDayOffHollyDay = true; } } //Ca dem ngay le if (isDayOffHollyDay && isNightShift) { otType = gradecfg.Cat_OvertimeType5; } //Ca dem ngay nghi cuoi tuan else if (!isDayOffHollyDay && isNightShift) { otType = gradecfg.Cat_OvertimeType4; } ////Ca ngay ngay le else if (isDayOffHollyDay && !isNightShift) { otType = gradecfg.Cat_OvertimeType2; } ////Ca ngay ngay nghi cuoi tuan else { otType = gradecfg.Cat_OvertimeType1; } } else { Hashtable hsRoster = Att_RosterServices.GetRosterTable(false, profile, dateWorkDate, dateWorkDate, lstRosterGroup, lstRosterTypeGroup); bool isWorkday = Att_AttendanceServices.IsWorkDay(grade.Cat_GradeAttendance, hsRoster, list_dayOff, dateWorkDate); if (isWorkday) { if (isNightShift) { otType = gradecfg.Cat_OvertimeType3; } else { otType = gradecfg.Cat_OvertimeType; } //if (gradecfg.Cat_OvertimeType == null) //{ // string workday = OverTimeType.E_WORKDAY.ToString(); // otType = EntityService.Instance.GetEntity<Cat_OvertimeType>(GuidContext, _userId, dayoff => dayoff.Code == workday); //} //else // otType = gradecfg.Cat_OvertimeType; } else { if (isNightShift) { otType = gradecfg.Cat_OvertimeType4; } else { otType = gradecfg.Cat_OvertimeType1; } //if (gradecfg.Cat_OvertimeType1 == null) //{ // string workday = OverTimeType.E_WORKDAY.ToString(); // otType = EntityService.Instance.GetEntity<Cat_OvertimeType>(GuidContext, _userId, dayoff => dayoff.Code == workday); //} //else // otType = gradecfg.Cat_OvertimeType1; } } } catch (Exception ex) { } return(otType); } }
/// <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); } }
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) { } } }
private List <Att_AnnualDetail> AnalyzeAnnualSickPerProfile(Hre_ProfileEntity Profile, List <Cat_GradeAttendance> lstGradeCfg, List <Att_Grade> lstGrade, DateTime BeginYear, DateTime EndYear, List <Att_LeaveDay> lstLeaveSick, List <Att_AnnualDetail> lstAnnualDetailInDB, Att_AnnualLeave AnnualLeave, List <Att_Roster> lstRosterInYear, List <Att_RosterGroup> lstRosterGroup, List <Hre_WorkHistory> lstWorkHistory, List <Cat_DayOff> lstDayOff, bool IsFrom1To31, List <Cat_Shift> shifts) { List <Att_AnnualDetail> lstResult = new List <Att_AnnualDetail>(); double leaveBeginYearToMonth = 0; double leaveBeginYearToMonth_Init = 0; string E_ROSTERGROUP = RosterType.E_ROSTERGROUP.ToString(); List <Att_Roster> lstRoster_byProfile = lstRosterInYear.Where(m => m.ProfileID == Profile.ID && m.Type != E_ROSTERGROUP).ToList(); List <Att_Roster> lstRosterTypeGroup = lstRosterInYear.Where(m => m.ProfileID == Profile.ID && m.Type == E_ROSTERGROUP).ToList(); for (DateTime Month = BeginYear; Month <= EndYear; Month = Month.AddMonths(1)) { var gradeByProfileByTime = lstGrade.Where(m => m.ProfileID == Profile.ID && m.MonthStart <= Month).OrderByDescending(m => m.MonthStart).FirstOrDefault(); if (gradeByProfileByTime == null) { continue; } var GradeCfg = lstGradeCfg.Where(m => m.ID == gradeByProfileByTime.GradeAttendanceID).FirstOrDefault(); if (GradeCfg == null) { continue; } DateTime BeginMonth = Month; DateTime EndMonth = BeginMonth.AddMonths(1).AddMinutes(-1); if (!IsFrom1To31) { Att_AttendanceServices.GetRangeMaxMinGrade(new List <Cat_GradeAttendance>() { GradeCfg }, Month, out BeginMonth, out EndMonth); } double Availale = AnnualLeave == null ? 0 : AnnualLeave.InitSickValue; double LeaveInMonth = 0; List <Att_LeaveDay> lstSickInMonth = lstLeaveSick.Where(m => m.ProfileID == Profile.ID && m.DateStart <= EndMonth && m.DateEnd >= BeginMonth).ToList(); var listRosterEntity = lstRoster_byProfile.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(); foreach (var item in lstSickInMonth) { if (item.DateStart >= BeginMonth && item.DateEnd <= EndMonth) { //Chi cần lấy TotalDuration hoặc lấy giờ rồi lấy ca if (item.DurationType == LeaveDayDurationType.E_FULLSHIFT.ToString()) { LeaveInMonth += item.TotalDuration ?? 0; } else { //Lấy ra ca làm việc DateTime DateBeginLeave = item.DateStart.Date; DateTime DateEndLeave = item.DateEnd.Date; Dictionary <DateTime, Cat_Shift> dicShift = Att_AttendanceLib.GetDailyShifts(Profile != null ? Profile.ID : Guid.Empty, DateBeginLeave, DateEndLeave, listRosterEntity, listRosterGroupEntity, shifts); if (dicShift != null && dicShift.ContainsKey(DateBeginLeave)) { Cat_Shift shift = dicShift[DateBeginLeave]; if (shift != null) { double HourWorkday = 8; if (shift.WorkHours != null && shift.WorkHours != 0) { HourWorkday = shift.WorkHours ?? 8; } LeaveInMonth += item.Duration / HourWorkday; } } } } else { DateTime DateBegin = BeginMonth > item.DateStart ? BeginMonth : item.DateStart; DateTime DateEnd = EndMonth < item.DateEnd ? BeginMonth : item.DateEnd; Dictionary <DateTime, Cat_Shift> dicShift = Att_AttendanceLib.GetDailyShifts(Profile != null ? Profile.ID : Guid.Empty, DateBegin, DateEnd, listRosterEntity, listRosterGroupEntity, shifts); for (DateTime dateCheck = DateBegin; dateCheck <= DateEnd; dateCheck = dateCheck.AddDays(1)) { if (Att_WorkDayHelper.IsWorkDay(dateCheck, GradeCfg, dicShift, lstDayOff) && !lstDayOff.Any(m => m.DateOff == dateCheck)) { LeaveInMonth++; } } } } Att_AnnualDetail AnnualDetail = lstAnnualDetailInDB.Where(m => m.ProfileID == Profile.ID && m.MonthYear == Month).FirstOrDefault(); if (AnnualDetail == null) { AnnualDetail = new Att_AnnualDetail(); } if (Profile.DateQuit != null) { DateTime MonthQuit = Profile.DateQuit.Value.Day >= 15 ? Profile.DateQuit.Value.AddMonths(1) : Profile.DateQuit.Value; MonthQuit = new DateTime(MonthQuit.Year, MonthQuit.Month, 1); if (Month >= MonthQuit) { AnnualDetail.IsDelete = true; } } AnnualDetail.Available = Availale; AnnualDetail.InitAvailable = AnnualLeave == null ? 0 : AnnualLeave.InitSickValue; AnnualDetail.ProfileID = Profile.ID; AnnualDetail.Year = BeginYear.Year; AnnualDetail.MonthYear = Month; AnnualDetail.MonthBeginInYear = MonthStartAnl; //todo: Phần tử này để trong cấu hình chung if (AnnualLeave != null && AnnualLeave.MonthResetAnlOfBeforeYear != null) { AnnualDetail.MonthResetInitAvailable = AnnualLeave.MonthResetAnlOfBeforeYear.Value;//todo: MonthReset Này để trong chế độ lương } else { AnnualDetail.MonthResetInitAvailable = 12;//todo: MonthReset Này để trong chế độ lương } AnnualDetail.MonthStartProfile = AnnualLeave == null ? 1 : AnnualLeave.MonthStart; if (AnnualDetail.MonthResetInitAvailable != null && AnnualDetail.MonthResetInitAvailable != 12 && AnnualDetail.Year != null) { DateTime MonthReset = new DateTime(AnnualDetail.Year.Value, AnnualDetail.MonthResetInitAvailable.Value, 1); AnnualDetail.IsHaveResetInitAvailable = true; if (Month <= MonthReset) //Trong những tháng có { double delta = leaveBeginYearToMonth_Init + LeaveInMonth - AnnualDetail.InitAvailable.Value; if (delta > 0) { AnnualDetail.TotalLeaveBefFromInitAvailable = leaveBeginYearToMonth_Init; AnnualDetail.LeaveInMonthFromInitAvailable = LeaveInMonth - delta; AnnualDetail.LeaveInMonth = delta; AnnualDetail.TotalLeaveBef = leaveBeginYearToMonth; leaveBeginYearToMonth += delta; leaveBeginYearToMonth_Init += LeaveInMonth - delta; } else { AnnualDetail.TotalLeaveBefFromInitAvailable = leaveBeginYearToMonth_Init; AnnualDetail.LeaveInMonthFromInitAvailable = LeaveInMonth; AnnualDetail.TotalLeaveBef = leaveBeginYearToMonth; AnnualDetail.LeaveInMonth = 0; leaveBeginYearToMonth_Init += LeaveInMonth; } } else //sau những tháng kho có { AnnualDetail.InitAvailable = 0; AnnualDetail.TotalLeaveBef = leaveBeginYearToMonth; AnnualDetail.LeaveInMonth = LeaveInMonth; leaveBeginYearToMonth += LeaveInMonth; } } else //Bình thường { AnnualDetail.IsHaveResetInitAvailable = false; AnnualDetail.TotalLeaveBef = leaveBeginYearToMonth; AnnualDetail.LeaveInMonth = LeaveInMonth; leaveBeginYearToMonth += LeaveInMonth; } double remain = (AnnualDetail.Available ?? 0) + (AnnualDetail.InitAvailable ?? 0) - (AnnualDetail.TotalLeaveBefFromInitAvailable ?? 0) - (AnnualDetail.LeaveInMonthFromInitAvailable ?? 0) - (AnnualDetail.TotalLeaveBef ?? 0) - (AnnualDetail.LeaveInMonth ?? 0); AnnualDetail.Remain = remain; AnnualDetail.Type = AnnualLeaveDetailType.E_SICK_LEAVE.ToString(); lstResult.Add(AnnualDetail); } return(lstResult); }
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); } }
/// <summary> /// Hàm tính toán Phép năm dành cho từng nhân viên /// </summary> /// <param name="Profile">Nhân Viên</param> /// <param name="lstGradeCfg">Ds Chế Độ lương</param> /// <param name="lstGrade">Ds Grade của Nhân viên</param> /// <param name="BeginYear">Ngày bắt đầu của năm</param> /// <param name="EndYear">Ngày Kết Thúc Của Năm</param> /// <param name="lstLeaveAnl">Ds nghỉ phép năm</param> /// <param name="lstAnnualDetailInDB">Ds AnnualDetail trong DB</param> /// <param name="AnnualLeave">AnnualLeave</param> /// <param name="lstRosterInYear">Ds Roster</param> /// <param name="lstRosterGroup">Ds RosterGroup</param> /// <param name="lstWorkHistory">Ds WorkingHistory</param> /// <param name="lstDayOff">Ds Ngày Nghỉ Lễ </param> /// <returns></returns> private List <Att_AnnualDetail> AnalyzeAnnualDetailPerProfile(Hre_ProfileMultiField Profile, List <Cat_GradeAttendance> lstGradeCfg, List <Att_Grade> lstGrade, DateTime BeginYear, DateTime EndYear, List <Att_LeaveDayInfo> lstLeaveAnl, List <Att_AnnualDetail> lstAnnualDetailInDB, Att_AnnualLeave AnnualLeave, List <Att_RosterInfo> lstRosterInYearIn, List <Att_RosterGroup> lstRosterGroup, List <Cat_DayOff> lstDayOff, bool IsFrom1To31, Cat_Position Position, List <Sys_AllSetting> lstAllSetting, List <Hre_HDTJob> lstHDTJob, out List <Att_AnnualDetail> AnalyzeAnnualDetailPerProfile_Update, string userLogin) { AnalyzeAnnualDetailPerProfile_Update = new List <Att_AnnualDetail>(); using (var context = new VnrHrmDataContext()) { var unitOfWork = (IUnitOfWork)(new UnitOfWork(context)); var repoAtt_Roster = new CustomBaseRepository <Att_Roster>(unitOfWork); var repoCat_Shift = new Cat_ShiftRepository(unitOfWork); var shifts = repoCat_Shift.FindBy(s => s.IsDelete == null).ToList(); var lstRosterID = lstRosterInYearIn.Select(s => s.ID).ToList(); var lstRosterInYear = repoAtt_Roster.FindBy(s => lstRosterID.Contains(s.ID)).ToList(); List <Att_AnnualDetail> lstResult = new List <Att_AnnualDetail>(); double leaveBeginYearToMonth = 0; double leaveBeginYearToMonth_Init = 0; string E_ROSTERGROUP = RosterType.E_ROSTERGROUP.ToString(); List <Att_Roster> lstRoster_byProfile = lstRosterInYear.Where(m => m.ProfileID == Profile.ID && m.Type != E_ROSTERGROUP).ToList(); List <Att_Roster> lstRosterTypeGroup = lstRosterInYear.Where(m => m.ProfileID == Profile.ID && m.Type == E_ROSTERGROUP).ToList(); for (DateTime Month = BeginYear; Month <= EndYear; Month = Month.AddMonths(1)) { var gradeByProfileByTime = lstGrade.Where(m => m.ProfileID == Profile.ID && m.MonthStart <= Month).OrderByDescending(m => m.MonthStart).FirstOrDefault(); if (gradeByProfileByTime == null) { continue; } var GradeCfg = lstGradeCfg.Where(m => m.ID == gradeByProfileByTime.GradeAttendanceID).FirstOrDefault(); if (GradeCfg == null) { continue; } DateTime BeginMonth = Month; DateTime EndMonth = BeginMonth.AddMonths(1).AddMinutes(-1); if (!IsFrom1To31) { Att_AttendanceServices.GetRangeMaxMinGrade(new List <Cat_GradeAttendance>() { GradeCfg }, Month, out BeginMonth, out EndMonth); } int AnnualLeaveMonthStart = AnnualLeave != null ? AnnualLeave.MonthStart : 1; double AnnualLeaveInitAnlValue = AnnualLeave != null ? AnnualLeave.InitAnlValue : 0; double Availale = Att_AttendanceLib.GetAnnualLeaveReceive(BeginYear.Year, Month, GradeCfg, Profile.DateHire, Profile.DateEndProbation, Profile.DateQuit, AnnualLeaveMonthStart, AnnualLeaveInitAnlValue, Position, Profile, lstLeaveAnl, lstAllSetting, lstHDTJob, lstDayOff.Select(m => m.DateOff).ToList(), lstLeaveAnl, userLogin); double LeaveInMonth = 0; List <Att_LeaveDayInfo> lstAnlInMonth = lstLeaveAnl.Where(m => m.ProfileID == Profile.ID && m.DateStart <= EndMonth && m.DateEnd >= BeginMonth).ToList(); foreach (var item in lstAnlInMonth) { var listRosterEntity = lstRoster_byProfile.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(); if (item.DateStart >= BeginMonth && item.DateEnd <= EndMonth) { //Chi cần lấy TotalDuration hoặc lấy giờ rồi lấy ca if (item.DurationType == LeaveDayDurationType.E_FULLSHIFT.ToString()) { LeaveInMonth += item.LeaveDays ?? 0; } else { //Lấy ra ca làm việc DateTime DateBeginLeave = item.DateStart.Date; DateTime DateEndLeave = item.DateEnd.Date; Dictionary <DateTime, Cat_Shift> dicShift = Att_AttendanceLib.GetDailyShifts(Profile != null ? Profile.ID : Guid.Empty, DateBeginLeave, DateEndLeave, listRosterEntity, listRosterGroupEntity, shifts); if (dicShift != null && dicShift.ContainsKey(DateBeginLeave)) { Cat_Shift shift = dicShift[DateBeginLeave]; if (shift != null) { double HourWorkday = shift.udStandardWorkHours > 0 ? shift.udStandardWorkHours : 8.0; LeaveInMonth += item.LeaveHours.Value / HourWorkday; } } } } else { DateTime DateBegin = BeginMonth > item.DateStart ? BeginMonth : item.DateStart; DateTime DateEnd = EndMonth < item.DateEnd ? BeginMonth : item.DateEnd; Dictionary <DateTime, Cat_Shift> dicShift = Att_AttendanceLib.GetDailyShifts(Profile != null ? Profile.ID : Guid.Empty, DateBegin, DateEnd, listRosterEntity, listRosterGroupEntity, shifts); for (DateTime dateCheck = DateBegin; dateCheck <= DateEnd; dateCheck = dateCheck.AddDays(1)) { if (Att_WorkDayHelper.IsWorkDay(dateCheck, GradeCfg, dicShift, lstDayOff) && !lstDayOff.Any(m => m.DateOff == dateCheck)) { LeaveInMonth++; } } } } Att_AnnualDetail AnnualDetail = lstAnnualDetailInDB.Where(m => m.ProfileID == Profile.ID && m.MonthYear == Month).FirstOrDefault(); bool isNew = false; if (AnnualDetail == null) { isNew = true; AnnualDetail = new Att_AnnualDetail(); } else { AnalyzeAnnualDetailPerProfile_Update.Add(AnnualDetail); } if (Profile.DateQuit != null) { DateTime MonthQuit = Profile.DateQuit.Value.Day >= 15 ? Profile.DateQuit.Value.AddMonths(1) : Profile.DateQuit.Value; MonthQuit = new DateTime(MonthQuit.Year, MonthQuit.Month, 1); if (Month >= MonthQuit) { AnnualDetail.IsDelete = true; } } AnnualDetail.Available = Availale; AnnualDetail.InitAvailable = AnnualLeave == null ? 0 : AnnualLeave.InitAnlValue; AnnualDetail.ProfileID = Profile.ID; //AnnualDetail.Hre_Profile = Profile.CopyData<Hre_Profile>(); AnnualDetail.Year = BeginYear.Year; AnnualDetail.MonthYear = Month; AnnualDetail.MonthBeginInYear = MonthStartAnl; //todo: Phần tử này để trong cấu hình chung if (AnnualLeave != null && AnnualLeave.MonthResetAnlOfBeforeYear != null) { AnnualDetail.MonthResetInitAvailable = AnnualLeave.MonthResetAnlOfBeforeYear.Value;//todo: MonthReset Này để trong chế độ lương } else { AnnualDetail.MonthResetInitAvailable = 12;//todo: MonthReset Này để trong chế độ lương } AnnualDetail.MonthStartProfile = AnnualLeave == null ? 1 : AnnualLeave.MonthStart; if (AnnualDetail.MonthResetInitAvailable != null && AnnualDetail.MonthResetInitAvailable != 12 && AnnualDetail.Year != null) { DateTime MonthReset = new DateTime(AnnualDetail.Year.Value, AnnualDetail.MonthResetInitAvailable.Value, 1); AnnualDetail.IsHaveResetInitAvailable = true; if (Month <= MonthReset) //Trong những tháng có { double delta = leaveBeginYearToMonth_Init + LeaveInMonth - AnnualDetail.InitAvailable.Value; if (delta > 0) { AnnualDetail.TotalLeaveBefFromInitAvailable = leaveBeginYearToMonth_Init; AnnualDetail.LeaveInMonthFromInitAvailable = LeaveInMonth - delta; AnnualDetail.LeaveInMonth = delta; AnnualDetail.TotalLeaveBef = leaveBeginYearToMonth; leaveBeginYearToMonth += delta; leaveBeginYearToMonth_Init += LeaveInMonth - delta; } else { AnnualDetail.TotalLeaveBefFromInitAvailable = leaveBeginYearToMonth_Init; AnnualDetail.LeaveInMonthFromInitAvailable = LeaveInMonth; AnnualDetail.TotalLeaveBef = leaveBeginYearToMonth; AnnualDetail.LeaveInMonth = 0; leaveBeginYearToMonth_Init += LeaveInMonth; } } else //sau những tháng kho có { AnnualDetail.InitAvailable = 0; AnnualDetail.TotalLeaveBef = leaveBeginYearToMonth; AnnualDetail.LeaveInMonth = LeaveInMonth; leaveBeginYearToMonth += LeaveInMonth; } } else //Bình thường { AnnualDetail.IsHaveResetInitAvailable = false; AnnualDetail.TotalLeaveBef = leaveBeginYearToMonth; AnnualDetail.LeaveInMonth = LeaveInMonth; leaveBeginYearToMonth += LeaveInMonth; } double remain = (AnnualDetail.Available ?? 0) + (AnnualDetail.InitAvailable ?? 0) - (AnnualDetail.TotalLeaveBefFromInitAvailable ?? 0) - (AnnualDetail.LeaveInMonthFromInitAvailable ?? 0) - (AnnualDetail.TotalLeaveBef ?? 0) - (AnnualDetail.LeaveInMonth ?? 0); AnnualDetail.Remain = remain; AnnualDetail.Type = AnnualLeaveDetailType.E_ANNUAL_LEAVE.ToString(); if (isNew) { lstResult.Add(AnnualDetail); } } return(lstResult); } }