public static Att_Grade GetGrade(Hre_Profile profile, DateTime effectMonth) { using (var context = new VnrHrmDataContext()) { var unitOfWork = (IUnitOfWork)(new UnitOfWork(context)); var repoAtt_Grade = new CustomBaseRepository <Att_Grade>(unitOfWork); //NOTE: can modify lai cau truy van de gioi han data lay len List <Att_Grade> lst = repoAtt_Grade .FindBy(alw => alw.IsDelete == null && alw.ProfileID == profile.ID && alw.MonthStart <= effectMonth) .OrderByDescending(alw => alw.MonthStart).ToList(); if (lst != null && lst.Count > 0) { // Lấy grade có ngày đến hạn, nếu không có ngày đến hạn xem như Ok không hết hạn, nếu có ngày đến hạn DateTime temp = new DateTime(effectMonth.Year, effectMonth.Month, 1); if (!lst[0].MonthEnd.HasValue || (lst[0].MonthEnd.HasValue && lst[0].MonthEnd.Value >= temp)) { return(lst[0]); } } return(null); } }
public void EditProfle() { var model = new Hre_Profile { Id = 1, ProfileName = "Nguyễn Ngọc Chúc Test Edit", DateHire = DateTime.Now, OrgStructureID = 3, PositionID = 1, DateOfEffect = DateTime.Now, CostCentreID = 1, NationalityID = 1, EthnicID = 1, ReligionID = 1, JobTitleID = 1, EmpTypeID = 1, SupervisiorID = 1, HighSupervisiorID = 1, DateQuit = DateTime.Now }; var service = new Hre_ProfileServices(); var repo = service.Edit(model); Console.Write("Result: " + repo); }
/// <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); }
public void AddProfleNoneReference() { for (int i = 21; i < 10000; i++) { var model = new Hre_Profile { ProfileName = " Văn Thiên Hiếu 00" + i.ToString(), LastName = "Hiếu 00" + i.ToString(), FirstName = "Văn Thiên", NameEnglish = "Kenptk 00" + i.ToString(), ImagePath = "", CodeEmp = "NV-IT-00" + i.ToString(), CodeTax = "MST-NV-00" + i.ToString(), CodeAttendance = "MTT-00" + i.ToString(), DateHire = DateTime.Now, DateEndProbation = DateTime.Now, DateOfEffect = DateTime.Now, WorkingPlace = "TP. Hồ Chí Minh", OrgStructureID = 2, JobTitleID = 4, PositionID = 2, EmpTypeID = 1, Gender = "E_MALE", MarriageStatus = "E_SINGLE", DayOfBirth = 9, MonthOfBirth = 7, YearOfBirth = 1991, PlaceOfBirth = "QT", BloodType = "O", Height = 170, Weight = 59, IDNo = "2014" + i, IDDateOfIssue = DateTime.Now, IDPlaceOfIssue = "TP. Hồ Chí Minh", PassportNo = "20140100" + i, Email = "*****@*****.**", CellPhone = "01207666444", Notes = "Công ty VnResource, test chương trình quản lý nhân sự version 8.0 đang trong quá trình phát triển và xây dựng năm 2014", }; var service = new Hre_ProfileServices(); var repo = false; if (service.Add(model)=="0") { repo = true; } NUnit.Framework.Assert.IsTrue(repo); Console.Write("Record: " + model.ProfileName); } }
public void AddProfleNoneReference() { for (int i = 21; i < 10000; i++) { var model = new Hre_Profile { ProfileName = " Văn Thiên Hiếu 00" + i.ToString(), LastName = "Hiếu 00" + i.ToString(), FirstName = "Văn Thiên", NameEnglish = "Kenptk 00" + i.ToString(), ImagePath = "", CodeEmp = "NV-IT-00" + i.ToString(), CodeTax = "MST-NV-00" + i.ToString(), CodeAttendance = "MTT-00" + i.ToString(), DateHire = DateTime.Now, DateEndProbation = DateTime.Now, DateOfEffect = DateTime.Now, WorkingPlace = "TP. Hồ Chí Minh", OrgStructureID = 2, JobTitleID = 4, PositionID = 2, EmpTypeID = 1, Gender = "E_MALE", MarriageStatus = "E_SINGLE", DayOfBirth = 9, MonthOfBirth = 7, YearOfBirth = 1991, PlaceOfBirth = "QT", BloodType = "O", Height = 170, Weight = 59, IDNo = "2014" + i, IDDateOfIssue = DateTime.Now, IDPlaceOfIssue = "TP. Hồ Chí Minh", PassportNo = "20140100" + i, Email = "*****@*****.**", CellPhone = "01207666444", Notes = "Công ty VnResource, test chương trình quản lý nhân sự version 8.0 đang trong quá trình phát triển và xây dựng năm 2014", }; var service = new Hre_ProfileServices(); var repo = false; if (service.Add(model) == "0") { repo = true; } NUnit.Framework.Assert.IsTrue(repo); Console.Write("Record: " + model.ProfileName); } }
public string ActionApproved(string selectedIds) { using (var context = new VnrHrmDataContext()) { string message = string.Empty; var unitOfWork = (IUnitOfWork)(new UnitOfWork(context)); //var repo = new Hre_WorkHistoryRepository(unitOfWork); var repoWorkHistory = new CustomBaseRepository <Hre_WorkHistory>(unitOfWork); var repoProfile = new CustomBaseRepository <Hre_Profile>(unitOfWork); List <Guid> lstIds = selectedIds.Split(',').Select(x => Guid.Parse(x)).ToList(); var lstWorkHistorys = repoWorkHistory.FindBy(m => lstIds.Contains(m.ID)).ToList(); foreach (var WorkHistory in lstWorkHistorys) { WorkHistory.Status = WorkHistoryStatus.E_APPROVED.ToString(); if (WorkHistory.DateEffective != null && WorkHistory.DateEffective <= DateTime.Now.Date) { string status = string.Empty; Hre_Profile profile = repoProfile.FindBy(m => m.IsDelete != true && m.ID == WorkHistory.ProfileID).FirstOrDefault(); if (profile != null) { profile.OrgStructureID = WorkHistory.OrganizationStructureID; profile.JobTitleID = WorkHistory.JobTitleID; profile.PositionID = WorkHistory.PositionID; profile.DateOfEffect = WorkHistory.DateEffective; profile.LaborType = WorkHistory.LaborType; profile.CostCentreID = WorkHistory.CostCentreID; profile.FormType = WorkHistory.FormType; profile.EmpTypeID = WorkHistory.EmployeeTypeID; profile.WorkingPlace = WorkHistory.WorkLocation; //profileServices.Edit(profile); } } } unitOfWork.SaveChanges(); message = NotificationType.Success.ToString(); return(message); } }
private Att_RptExceptionDataEntity SetExceptionData(Att_InOut InOut, Hre_Profile profile, Cat_Shift shift, DateTime idx, string userExport) { Att_RptExceptionDataEntity exceptionData = new Att_RptExceptionDataEntity(); exceptionData.ID = Guid.NewGuid(); exceptionData.InOutID = InOut == null ? Guid.Empty : InOut.ID; //exceptionData.EntityType = ClassNames.Att_InOut; exceptionData.EntityType = "Att_InOut"; exceptionData.CodeEmp = profile.CodeEmp; exceptionData.ShiftID = shift == null ? Guid.Empty : shift.ID; exceptionData.ProfileID = profile.ID; exceptionData.ProfileName = profile.ProfileName; exceptionData.UserExport = userExport; exceptionData.DateExport = DateTime.Today; //exceptionData.Position = profile.Cat_Position == null ? string.Empty : profile.Cat_Position.PositionName; //string[] strDepartment = GradeCfgDAO.getLinkDepartment(ListCacheOrgStructure, profile.Cat_OrgStructure, true); //exceptionData.Department = strDepartment[1]; exceptionData.Date = idx; return(exceptionData); }
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); } }
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> /// 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); } }
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); }
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); } }
public void AddProfle() { for (int i = 0; i < 20; i++) { var model = new Hre_Profile { ProfileName = "Nguyễn Ngọc Chúc "+i, LastName = "Công ty VnResource", FirstName = "Công ty VnResource", NameEnglish = "Công ty VnResource", ImagePath = "andrew.jpg", CodeEmp = "NV00000"+i, CodeTax = "T00000"+i, CodeAttendance = "A00000"+i, DateHire = DateTime.Now, DateEndProbation = DateTime.Now, OrgStructureID = 3, PositionID = 1, DateOfEffect = DateTime.Now, CostCentreID = 1, WorkingPlace = "TP. Hồ Chí Minh", Gender = "male", DayOfBirth = 10, MonthOfBirth = 11, YearOfBirth = 2014, PlaceOfBirth = "TP. Hồ Chí Minh", NationalityID = 1, EthnicID = 1, ReligionID = 1, BloodType = "o", Height = 170, Weight = 59, IDNo = "24110128"+i, IDDateOfIssue = DateTime.Now, IDPlaceOfIssue = "TP. Hồ Chí Minh", PassportNo = "20001210"+i, PassportDateOfExpiry = DateTime.Now, PassportDateOfIssue = DateTime.Now, PassportPlaceOfIssue = "TP. Hồ Chí Minh", Email = "*****@*****.**", CellPhone = "0989199212", HomePhone = "09121212", BusinessPhone = "38006223", PAddressID = 1, TAddressID = 1, JobTitleID = 1, EmpTypeID = 1, SupervisiorID = 1, HighSupervisiorID = 1, DateQuit = DateTime.Now, Notes = "Công ty VnResource, test chương trình quản lý nhân sự version 8.0 đang trong quá trình phát triển và xây dựng năm 2014", }; var service = new Hre_ProfileServices(); var repo = false; if (service.Add(model) == "0") { repo = true; } NUnit.Framework.Assert.IsTrue(repo); Console.Write("Record: " + repo); } }
public void EditProfle() { var model = new Hre_Profile { Id = 1, ProfileName = "Nguyễn Ngọc Chúc Test Edit", DateHire = DateTime.Now, OrgStructureID = 3, PositionID = 1, DateOfEffect = DateTime.Now, CostCentreID = 1, NationalityID = 1, EthnicID = 1, ReligionID = 1, JobTitleID = 1, EmpTypeID = 1, SupervisiorID = 1, HighSupervisiorID = 1, DateQuit = DateTime.Now }; var service = new Hre_ProfileServices(); var repo = service.Edit(model); Console.Write("Result: " + repo); }
public void AddProfle() { for (int i = 0; i < 20; i++) { var model = new Hre_Profile { ProfileName = "Nguyễn Ngọc Chúc " + i, LastName = "Công ty VnResource", FirstName = "Công ty VnResource", NameEnglish = "Công ty VnResource", ImagePath = "andrew.jpg", CodeEmp = "NV00000" + i, CodeTax = "T00000" + i, CodeAttendance = "A00000" + i, DateHire = DateTime.Now, DateEndProbation = DateTime.Now, OrgStructureID = 3, PositionID = 1, DateOfEffect = DateTime.Now, CostCentreID = 1, WorkingPlace = "TP. Hồ Chí Minh", Gender = "male", DayOfBirth = 10, MonthOfBirth = 11, YearOfBirth = 2014, PlaceOfBirth = "TP. Hồ Chí Minh", NationalityID = 1, EthnicID = 1, ReligionID = 1, BloodType = "o", Height = 170, Weight = 59, IDNo = "24110128" + i, IDDateOfIssue = DateTime.Now, IDPlaceOfIssue = "TP. Hồ Chí Minh", PassportNo = "20001210" + i, PassportDateOfExpiry = DateTime.Now, PassportDateOfIssue = DateTime.Now, PassportPlaceOfIssue = "TP. Hồ Chí Minh", Email = "*****@*****.**", CellPhone = "0989199212", HomePhone = "09121212", BusinessPhone = "38006223", PAddressID = 1, TAddressID = 1, JobTitleID = 1, EmpTypeID = 1, SupervisiorID = 1, HighSupervisiorID = 1, DateQuit = DateTime.Now, Notes = "Công ty VnResource, test chương trình quản lý nhân sự version 8.0 đang trong quá trình phát triển và xây dựng năm 2014", }; var service = new Hre_ProfileServices(); var repo = false; if (service.Add(model) == "0") { repo = true; } NUnit.Framework.Assert.IsTrue(repo); Console.Write("Record: " + repo); } }