private bool IsBreakTime(Att_OvertimeEntity baseDataOvertime, OvertimeInfo parameter) { return(parameter.BreaktPoints.Where(d => d.Value > 0).Select(d => d.Key.TimeOfDay).Distinct().Any(d => baseDataOvertime.WorkDate != null && d == baseDataOvertime.WorkDate.TimeOfDay)); }
private bool IsNightShift(Att_OvertimeEntity baseDataOvertime, OvertimeInfo parameter) { bool result = false; if (parameter.DayShiftPoints != null && parameter.NightShiftPoints != null && parameter.DayShiftPoints.Count() > 0 && parameter.NightShiftPoints.Count() > 0) { //Tính ca ngày nhỏ nhất và ca ngày lớn nhất theo cấu hình Day/Night TimeSpan minDayShift = parameter.DayShiftPoints.Min(d => d.TimeOfDay); TimeSpan maxDayShift = DateTime.Now.Date.TimeOfDay; if (parameter.NightShiftPoints.Any(d => d.TimeOfDay > minDayShift)) { maxDayShift = parameter.NightShiftPoints.Where(d => d.TimeOfDay > minDayShift).Min(d => d.TimeOfDay); } else { maxDayShift = parameter.NightShiftPoints.Min(d => d.TimeOfDay); maxDayShift = maxDayShift.Add(new TimeSpan(1, 0, 0, 0));//cộng thêm 1 ngày } DateTime dayFrom = DateTime.Now.Date.Add(minDayShift); DateTime dayTo = DateTime.Now.Date.Add(maxDayShift); DateTime workDate = DateTime.Now.Date.Add(baseDataOvertime.WorkDate.TimeOfDay); DateTime endWorkDate = workDate.AddHours(baseDataOvertime.RegisterHours); result = !(workDate <dayTo && endWorkDate> dayFrom); } else if (parameter.DayShiftPoints != null && parameter.DayShiftPoints.Count() > 0) { //Tính ca ngày nhỏ nhất và ca ngày lớn nhất theo cấu hình Day/Night TimeSpan minDayShift = parameter.DayShiftPoints.Min(d => d.TimeOfDay); TimeSpan maxDayShift = parameter.DayShiftPoints.Max(d => d.TimeOfDay); DateTime dayFrom = DateTime.Now.Date.Add(minDayShift); DateTime dayTo = DateTime.Now.Date.Add(maxDayShift); DateTime workDate = DateTime.Now.Date.Add(baseDataOvertime.WorkDate.TimeOfDay); DateTime endWorkDate = workDate.AddHours(baseDataOvertime.RegisterHours); result = !(workDate <dayTo && endWorkDate> dayFrom); } else if (parameter.NightShiftPoints != null && parameter.NightShiftPoints.Count() > 0) { TimeSpan minNightShift = DateTime.Now.Date.TimeOfDay; TimeSpan maxNightShift = DateTime.Now.Date.TimeOfDay; //Tính ca ngày nhỏ nhất và ca ngày lớn nhất theo cấu hình Day/Night if (parameter.NightShiftPoints.Any(d => d.TimeOfDay > DateTime.Now.Date.TimeOfDay && d.TimeOfDay < DateTime.Now.Date.AddHours(12).TimeOfDay)) { maxNightShift = parameter.NightShiftPoints.Where(d => d.TimeOfDay > DateTime.Now.Date.TimeOfDay && d.TimeOfDay < DateTime.Now.Date.AddHours(12).TimeOfDay).Max(d => d.TimeOfDay); if (parameter.NightShiftPoints.Any(d => d.TimeOfDay > maxNightShift)) { minNightShift = parameter.NightShiftPoints.Where(d => d.TimeOfDay > maxNightShift).Min(d => d.TimeOfDay); maxNightShift = maxNightShift.Add(new TimeSpan(1, 0, 0, 0));//cộng thêm 1 ngày } else { minNightShift = parameter.NightShiftPoints.Min(d => d.TimeOfDay); } } else { minNightShift = parameter.NightShiftPoints.Min(d => d.TimeOfDay); maxNightShift = parameter.NightShiftPoints.Max(d => d.TimeOfDay); } DateTime nightFrom = DateTime.Now.Date.Add(minNightShift); DateTime nightTo = DateTime.Now.Date.Add(maxNightShift); DateTime workDate = DateTime.Now.Date.Add(baseDataOvertime.WorkDate.TimeOfDay); DateTime endWorkDate = workDate.AddHours(baseDataOvertime.RegisterHours); result = workDate <nightTo && endWorkDate> nightFrom; } return(result); }
public List <Att_OvertimeEntity> LoadData(Att_OvertimeEntity overtime, string ProfileIds, bool ByShiftProfile, string UserLogin) { List <Att_OvertimeEntity> listOvertimeInsert = new List <Att_OvertimeEntity>(); using (var context = new VnrHrmDataContext()) { var unitOfWork = (IUnitOfWork)(new UnitOfWork(context)); var repoCat_DayOff = new CustomBaseRepository <Cat_DayOff>(unitOfWork); var repoAtt_LeaveDay = new CustomBaseRepository <Att_LeaveDay>(unitOfWork); var repoAtt_Pregnancy = new CustomBaseRepository <Att_Pregnancy>(unitOfWork); List <Att_Pregnancy> _LstPregnancy = new List <Att_Pregnancy>(); Att_OvertimeServices overtimeDAO = new Att_OvertimeServices(); string status = string.Empty; string proStr = Common.DotNetToOracle(ProfileIds); var lstProfileDetails = GetData <Hre_ProfileEntity>(proStr, ConstantSql.hrm_hr_sp_get_ProfileByIds, UserLogin, ref status); List <Guid> listProfileId = lstProfileDetails.Select(s => s.ID).ToList(); 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 OTThanTwoHour = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_ISALLOWADDHOURWHENOTTHANTWOHOUR.ToString()).FirstOrDefault(); var OTBreakTime = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_DONOTSPLITOTBREAKTIME.ToString()).FirstOrDefault(); var inmaternityregime = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_ALLOWREGISTEROTWHENINMATERNITYREGIME.ToString()).FirstOrDefault(); List <Cat_DayOff> lstDayOff = repoCat_DayOff.FindBy(s => s.IsDelete == null).ToList(); if (OTThanTwoHour.Value1 == bool.TrueString) { lstDayOff = lstDayOff.Where(dayoff => dayoff.Type == HolidayType.E_HOLIDAY_HLD.ToString()).ToList(); } bool isAllowCutOTBreakHour = false; if (OTBreakTime.Value1 == bool.TrueString) { isAllowCutOTBreakHour = true; } Att_OvertimeEntity baseOT = null; //Trung.Le 20120621 #0014337 Nếu như CÓ THÊM đăng ký Leave loại nghỉ lễ (Mã: HLD) thì ngày đó tương đương với ngày nghỉ lễ string LeavedayTypeCode_HLD = LeavedayTypeCode.HLD.ToString(); string E_HOLIDAY_HLD = HolidayType.E_HOLIDAY_HLD.ToString(); DateTime DateFromOvertime = overtime.WorkDate.Date; DateTime DateEndOvertime = overtime.WorkDate.Add(TimeSpan.FromHours(overtime.RegisterHours)).Date; string E_APPROVED = LeaveDayStatus.E_APPROVED.ToString(); List <Att_LeaveDay> lstLeaveDayHoliday = repoAtt_LeaveDay .FindBy(att => att.IsDelete == null && DateEndOvertime >= att.DateStart && DateFromOvertime <= att.DateEnd && att.Status == E_APPROVED && att.Cat_LeaveDayType.Code == LeavedayTypeCode_HLD && listProfileId.Contains(att.ProfileID)) .ToList(); if (overtime.ID == Guid.Empty) { //baseOT = GetBaseDataOvertime(baseOT, overtime, profile); string _pregnancyType = PregnancyType.E_LEAVE_EARLY.ToString(); _LstPregnancy = repoAtt_Pregnancy .FindBy(prg => prg.Type == _pregnancyType && prg.DateEnd >= overtime.WorkDate.Date && prg.DateStart <= overtime.WorkDate) .ToList(); Hre_Profile _hreProfile = new Hre_Profile(); foreach (var profile in lstProfileDetails) { overtime.ProfileID = profile.ID; overtime.ProfileName = profile.ProfileName; overtime.CodeEmp = profile.CodeEmp; listOvertimeInsert.AddRange(AnalysisOvertime(overtime, GetListDayOffPerProfile(lstLeaveDayHoliday, profile, lstDayOff, E_HOLIDAY_HLD) //lstDayOff , _LstPregnancy, ByShiftProfile, isAllowCutOTBreakHour, UserLogin)); } } #region overtime.ID == Guid.Empty && strListId.Length > 1 //if (overtime.ID == Guid.Empty && strListId.Length > 1) //{ // List<Hre_Profile> listAllProfile = EntityService.GetEntityList<Hre_Profile>(GuidContext, LoginUserID.Value, pf => listProfileId.Contains(pf.ID)); // foreach (Guid _pfID in listProfileId) // { // if (_pfID != pfid) // { // baseOT = GetBaseDataOvertime(baseOT, overtime, profile); // List<Hre_Profile> _listPfTemp = listAllProfile.Where(pf => pf.ID == _pfID).ToList(); // if (_listPfTemp.Count != 1) // { // continue; // } // profile = _listPfTemp[0]; // baseOT.Hre_Profile = profile; // listOvertimeInsert.AddRange(overtimeDAO.AnalysisOvertime(baseOT, // GetListDayOffPerProfile(lstLeaveDayHoliday, profile, lstDayOff, E_HOLIDAY_HLD) //lstDayOff // , _LstPregnancy, GuidContext, LoginUserID.Value, rdbByShiftProfile, isAllowCutOTBreakHour)); // } // } //} #endregion #region tan.do danh dau nguoi huong che do thai san //_listbaseData = new List<BaseDataOvertime>(); if (inmaternityregime.Value1 != bool.TrueString) { DateTime time = overtime.WorkDate; string type = PregnancyStatus.E_LEAVE_EARLY.ToString(); List <Guid> guids = listOvertimeInsert.Select(s => s.ProfileID).ToList(); var pregnancies = repoAtt_Pregnancy .FindBy(s => s.IsDelete == null && s.DateStart <= time && time <= s.DateEnd && s.Type == type && guids.Contains(s.ProfileID)) .ToList(); foreach (var baseDataOvertime in listOvertimeInsert) { foreach (var attPregnancy in pregnancies) { if (baseDataOvertime.ProfileID == attPregnancy.ProfileID) { //_listbaseData.Add(baseDataOvertime); } } } } #endregion return(listOvertimeInsert); } }
/// <summary> /// Tách thời gian làm việc thành các khoản theo cấu hình. /// </summary> /// <param name="guidContext"></param> /// <param name="userID"></param> /// <param name="parameter">Điền đủ thông tin cho tất cả thuộc tính trong OvertimeInfo</param> /// <returns></returns> public List <Att_OvertimeEntity> AnalysisOvertime(Att_OvertimeEntity BaseDataOvertimeTemplate, OvertimeInfo parameter) { List <TimeSpan> listTimePoints = new List <TimeSpan>(); if (parameter.DayShiftPoints != null) { listTimePoints.AddRange(parameter.DayShiftPoints.Select(d => d.TimeOfDay).ToList()); } if (parameter.NightShiftPoints != null) { listTimePoints.AddRange(parameter.NightShiftPoints.Select(d => d.TimeOfDay).ToList()); } if (parameter.BreaktPoints != null) { foreach (var item in parameter.BreaktPoints) { TimeSpan breakStart = item.Key.TimeOfDay; TimeSpan breakEnd = item.Key.AddHours(item.Value).TimeOfDay; listTimePoints.Add(breakStart); listTimePoints.Add(breakEnd); } } listTimePoints = listTimePoints.Distinct().ToList(); List <Att_OvertimeEntity> listOvertimeInsert = new List <Att_OvertimeEntity>(); List <Guid> lstProfileIDs = listOvertimeInsert.Select(m => m.ProfileID).ToList(); List <Att_Roster> lstRosterTypeGroup = new List <Att_Roster>(); List <Att_RosterGroup> lstRosterGroup = new List <Att_RosterGroup>(); Att_RosterServices.GetRosterGroup(lstProfileIDs, parameter.DateFrom, parameter.DateTo, out lstRosterTypeGroup, out lstRosterGroup); DateTime currentPoint = parameter.DateFrom; while (currentPoint < parameter.DateTo) { TimeSpan greaterTime = listTimePoints.Min(); Att_OvertimeEntity baseDataOvertime = new Att_OvertimeEntity(); //string[] strExclude = new string[] { BaseDataOvertime.FieldNames.ID, BaseDataOvertime.FieldNames.Can_Food, BaseDataOvertime.FieldNames.Can_Food2, BaseDataOvertime.FieldNames.Can_Menu, BaseDataOvertime.FieldNames.Can_Menu1 }; //BaseDataOvertimeTemplate.CopyTo(baseDataOvertime, strExclude); baseDataOvertime.ID = Guid.NewGuid(); baseDataOvertime.WorkDate = currentPoint; if (listTimePoints.Any(d => d > currentPoint.TimeOfDay)) { greaterTime = listTimePoints.Where(d => d > currentPoint.TimeOfDay).OrderBy(d => d).FirstOrDefault(); currentPoint = currentPoint.Date.Add(greaterTime); } else { currentPoint = currentPoint.Date.AddDays(1).Add(greaterTime); } currentPoint = currentPoint > parameter.DateTo ? parameter.DateTo : currentPoint; baseDataOvertime.RegisterHours = currentPoint.Subtract(baseDataOvertime.WorkDate).TotalHours; baseDataOvertime.WorkDateEnd = currentPoint;//thới gian kết thúc ca baseDataOvertime.IsNightShift = IsNightShift(baseDataOvertime, parameter); baseDataOvertime.ProfileID = parameter.Hre_Profile.ID; if (!IsBreakTime(baseDataOvertime, parameter)) { if (parameter.Hre_Profile != null && parameter.ListDayOff != null) { baseDataOvertime.OvertimeTypeID = getOTType(baseDataOvertime.WorkDate, baseDataOvertime.IsNightShift, parameter.Hre_Profile, parameter.ListDayOff, lstRosterGroup, lstRosterTypeGroup).ID; } listOvertimeInsert.Add(baseDataOvertime); } } return(listOvertimeInsert); }
/// <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); } }