/// <summary> /// Lấy bản ghi có id /// </summary> /// <returns></returns> public Sys_AllSetting GetById(Guid id) { using (var context = new VnrHrmDataContext()) { IUnitOfWork unitOfWork = (IUnitOfWork)(new UnitOfWork(context)); Sys_AllSettingRepository repo = new Sys_AllSettingRepository(unitOfWork); Sys_AllSetting model = new Sys_AllSetting(); model = repo.GetById(id); return(model); } }
public List <Can_MealRecordEntity> GetMealRecordSummary(string _line, string _catering, string _canteen, DateTime dateStart, DateTime dateEnd, List <Hre_ProfileEntity> lstProfileIDs, string UserLogin) { dateStart = dateStart.Date; dateEnd = dateEnd.Date.AddDays(1).AddMilliseconds(-1); using (var context = new VnrHrmDataContext()) { var unitOfWork = (IUnitOfWork)(new UnitOfWork(context)); var repoCan_MealRecord = new CustomBaseRepository <Can_MealRecord>(unitOfWork); var repoCan_TamScanLog = new CustomBaseRepository <Can_TamScanLogCMS>(unitOfWork); var repoCan_Line = new CustomBaseRepository <Can_Line>(unitOfWork); var repoCan_Canteen = new CustomBaseRepository <Can_Canteen>(unitOfWork); var repoCan_Catering = new CustomBaseRepository <Can_Catering>(unitOfWork); var repoSys_AllSetting = new CustomBaseRepository <Sys_AllSetting>(unitOfWork); string status = string.Empty; //string strIDs = string.Join(",", lstProfileIDs.ToArray()); #region xử lý cấu hình giờ kết thúc ăn - DateStart & DateEnd DateTime dateConfig = DateTime.MinValue; var rsTimeConfig = GetData <Sys_AllSettingEntity>(AppConfig.HRM_CAN_MEALRECORD_EATEND_CONFIG.ToString(), ConstantSql.hrm_sys_sp_get_AllSettingByKey, UserLogin, ref status).FirstOrDefault(); if (rsTimeConfig != null && rsTimeConfig.Value1 != null) { dateConfig = DateTimeHelper.ConvertStringToDateTime(rsTimeConfig.Value1, ConstantFormat.HRM_Format_YearMonthDay_HoursMinSecond_ffffff.ToString()); } double hourConfig = dateConfig.Hour + (((double)dateConfig.Minute) / 60); dateStart = dateStart.Date.AddHours(hourConfig); dateEnd = dateEnd.Date.AddDays(1).AddHours(hourConfig).AddMilliseconds(-1); #endregion #region cấu hình số phút xử lý trùng int rsScanMulti = 0; var rsScanMultiConfig = GetData <Sys_AllSettingEntity>(AppConfig.HRM_CAN_MEALRECORD_SCANMULTI_CONFIG.ToString(), ConstantSql.hrm_sys_sp_get_AllSettingByKey, UserLogin, ref status).FirstOrDefault(); if (rsScanMultiConfig != null) { rsScanMulti = rsScanMultiConfig.Value1 != null?int.Parse(rsScanMultiConfig.Value1.ToString()) : 0; } #endregion var tamScanLogs = repoCan_TamScanLog .FindBy(s => dateStart <= s.TimeLog && s.TimeLog <= dateEnd) .Select(s => new { s.MachineCode, s.CardCode, s.TimeLog, s.ID }) .ToList(); var cardCodes = tamScanLogs.Select(s => s.CardCode).ToList(); //strIDs = Common.DotNetToOracle(strIDs); //var profiles = GetData<Hre_ProfileEntity>(strIDs, ConstantSql.hrm_hr_sp_get_ProfileByIds, ref status) // .Where(s => cardCodes.Contains(s.CodeAttendance) && lstProfileIDs.Contains(s.ID)) var profiles = lstProfileIDs .Where(s => cardCodes.Contains(s.CodeAttendance)) .Select(s => new { s.ID, s.CodeAttendance, s.CodeEmp, s.ProfileName, s.OrgStructureName }).ToList(); tamScanLogs = tamScanLogs.Where(s => profiles.Select(p => p.CodeAttendance).Contains(s.CardCode)).OrderBy(s => s.CardCode).ThenBy(s => s.TimeLog).ToList(); var lines = repoCan_Line.FindBy(s => s.IsDelete == null).ToList(); var canteens = repoCan_Canteen.FindBy(s => s.IsDelete == null).ToList(); var caterings = repoCan_Catering.FindBy(s => s.IsDelete == null).ToList(); if (_line != null) { List <Guid> lstLine = _line.Split(',').Select(Guid.Parse).ToList(); lines = lines.Where(s => lstLine.Contains(s.ID)).ToList(); } if (_canteen != null) { List <Guid> lstcanteen = _canteen.Split(',').Select(Guid.Parse).ToList(); canteens = canteens.Where(s => lstcanteen.Contains(s.ID)).ToList(); } if (_catering != null) { List <Guid> lstcatering = _catering.Split(',').Select(Guid.Parse).ToList(); caterings = caterings.Where(s => lstcatering.Contains(s.ID)).ToList(); } List <object> lstObj = new List <object>(); lstObj.Add(dateStart); lstObj.Add(dateEnd); List <Can_MealRecordCheckEntity> mealRecordCheckList = GetData <Can_MealRecordCheckEntity>(lstObj, ConstantSql.hrm_can_sp_get_MealRecord_ByDateFromDateTo, UserLogin, ref status); Can_MealRecordEntity record = new Can_MealRecordEntity(); List <Can_MealRecordEntity> lstRecord = new List <Can_MealRecordEntity>(); List <Can_MealRecord> lstEdit = new List <Can_MealRecord>(); List <Can_MealRecord> lstAdd = new List <Can_MealRecord>(); List <Guid> lstDuplicateTamScan = new List <Guid>(); foreach (var tamScanLog in tamScanLogs) { if (lstDuplicateTamScan.Contains(tamScanLog.ID)) { continue; } record = new Can_MealRecordEntity(); var profile = profiles.FirstOrDefault(s => s.CodeAttendance == tamScanLog.CardCode); var line = lines.FirstOrDefault(s => tamScanLog.MachineCode == s.MachineCode); if (profile != null && line != null) { #region xử lý quẹt thẻ trùng theo HRM_CAN_MEALRECORD_SCANMULTI_CONFIG var tamScanLogProfiles = tamScanLogs .Where(s => s.CardCode == tamScanLog.CardCode && s.TimeLog.Value.Date == tamScanLog.TimeLog.Value.Date && s.MachineCode == tamScanLog.MachineCode) .OrderBy(s => s.TimeLog) .ToList(); if (tamScanLogProfiles.Count > 1 && rsScanMulti > 0) { for (int i = 0; i < tamScanLogProfiles.Count; i++) { var tamsanFirst = tamScanLogProfiles[i]; int j = i + 1; if (j > tamScanLogProfiles.Count - 1) { j = i; } var tamsanNear = tamScanLogProfiles[j]; if (tamsanNear.TimeLog.Value.Subtract(tamsanFirst.TimeLog.Value).TotalMinutes < rsScanMulti && tamsanFirst.ID != tamsanNear.ID) { if (tamsanFirst.MachineCode == tamsanNear.MachineCode) { lstDuplicateTamScan.Add(tamsanNear.ID); break; } } } } #endregion #region xử lý add record record.TimeLog = tamScanLog.TimeLog.HasValue ? tamScanLog.TimeLog.Value : DateTime.MinValue; if (record.TimeLog < record.TimeLog.Value.Date.AddHours(hourConfig)) { record.WorkDay = record.TimeLog.Value.AddDays(-1); } else { record.WorkDay = record.TimeLog; } if (tamScanLog.MachineCode != null) { record.MachineCode = tamScanLog.MachineCode; if (line != null) { record.LineName = line.LineName; record.LineID = line.ID; record.Amount = (decimal)line.Amount; if (line.CanteenID != null) { var cant = canteens.Where(c => c.ID == line.CanteenID).FirstOrDefault(); record.CanteenName = cant.CanteenName; record.CanteenID = line.CanteenID; } if (line.CateringID != null) { var cater = caterings.Where(c => c.ID == line.CateringID).FirstOrDefault(); record.CateringName = cater.CateringName; record.CateringID = line.CateringID; } } } record.ProfileName = profile.ProfileName; record.CodeEmp = profile.CodeEmp; record.OrgStructureName = profile.OrgStructureName; record.CodeAttendance = profile.CodeAttendance; record.DateCreate = DateTime.Now; var recordAdd = record.CopyData <Can_MealRecord>(); recordAdd.ProfileID = profile.ID; var CheckList = mealRecordCheckList.Where(s => s.ProfileID == profile.ID && s.TimeLog == tamScanLog.TimeLog).ToList(); if (CheckList != null) { if (CheckList.Count() > 0) { var idUpdate = CheckList.FirstOrDefault(); recordAdd.ID = idUpdate.ID; //lstEdit.Add(recordAdd); repoCan_MealRecord.Edit(recordAdd); } else { recordAdd.ID = Guid.NewGuid(); repoCan_MealRecord.Add(recordAdd); //lstAdd.Add(recordAdd); } } record.ID = tamScanLog.ID; lstRecord.Add(record); #endregion } } repoCan_MealRecord.SaveChanges(); if (lstRecord.Count > 0) { Sys_AllSetting sys = new Sys_AllSetting(); Sys_AllSetting rs = GetData <Sys_AllSetting>(AppConfig.HRM_CAN_MEALRECORD_SUMMARY.ToString(), ConstantSql.hrm_sys_sp_get_AllSettingByKey, UserLogin, ref status).FirstOrDefault(); sys.Value1 = dateStart.ToString(ConstantFormat.HRM_Format_YearMonthDay_HoursMinSecond.ToString()); sys.Value2 = dateEnd.ToString(ConstantFormat.HRM_Format_YearMonthDay_HoursMinSecond.ToString()); sys.Name = AppConfig.HRM_CAN_MEALRECORD_SUMMARY.ToString(); if (rs != null) { sys.ID = rs.ID; repoSys_AllSetting.Edit(sys); } else { sys.ID = Guid.NewGuid(); repoSys_AllSetting.Add(sys); } repoSys_AllSetting.SaveChanges(); } //lstRecord.Where().(s => s.MealAllowanceTypeName = ConstantDisplay.HRM_Enum_Submit.TranslateString()).ToList(); return(lstRecord); } }
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); }
/// <summary> /// Button Tính Phép Bệnh (Cơ Chế Mới) /// Lưu vào Att_AnnualDetail /// </summary> /// <param name="Year"></param> /// <param name="orgStructure"></param> /// <param name="LstProfileStatus"></param> /// <returns></returns> public bool ComputeAnnualSick(int Year, string orgStructure, string LstProfileStatus, bool isFullEmp, string UserLogin) { var result = false; using (var context = new VnrHrmDataContext()) { string status = string.Empty; var unitOfWork = (IUnitOfWork) new UnitOfWork(context); var repoCat_GradeAttendance = new CustomBaseRepository <Cat_GradeAttendance>(unitOfWork); var repoCat_DayOff = new CustomBaseRepository <Cat_DayOff>(unitOfWork); var repoCat_Shift = new CustomBaseRepository <Cat_Shift>(unitOfWork); var repoAtt_AnnualDetail = new CustomBaseRepository <Att_AnnualDetail>(unitOfWork); var repoAtt_RosterGroup = new CustomBaseRepository <Att_RosterGroup>(unitOfWork); var repoAtt_AnnualLeave = new CustomBaseRepository <Att_AnnualLeave>(unitOfWork); var repoAtt_Grade = new CustomBaseRepository <Att_Grade>(unitOfWork); var repoSys_AllSetting = new CustomBaseRepository <Sys_AllSetting>(unitOfWork); List <Guid> lstLeaveDayApproveIDs = new List <Guid>(); List <Guid> lstLeaveDayRejectIDs = new List <Guid>(); var shifts = repoCat_Shift.FindBy(s => s.IsDelete == null).ToList(); List <object> lstObj = new List <object>(); lstObj.Add(orgStructure); lstObj.Add(null); lstObj.Add(null); var lstProfile = GetData <Hre_ProfileEntity>(lstObj, ConstantSql.hrm_hr_sp_get_ProfileIdsByOrg, UserLogin, ref status); List <Att_AnnualDetail> lstResult = new List <Att_AnnualDetail>(); List <Guid> lstProfileID = lstProfile.Select(m => m.ID).ToList(); int BeginMonth = MonthStartAnl; DateTime BeginYear = new DateTime(Year, BeginMonth, 1); DateTime EndYear = BeginYear.AddYears(1).AddMinutes(-1); DateTime BeginYearToGetData = BeginYear.AddMonths(-1); //trừ một tháng để lấy data (bao những data thuộc những ngày trước tháng dành cho chế độ lương ko phải từ ngày 1) var lstGradeCgf = repoCat_GradeAttendance.FindBy(s => s.ID != null).ToList(); string E_APPROVED = LeaveDayStatus.E_APPROVED.ToString(); var lstAnnualDetailInDB = new List <Att_AnnualDetail>(); var lstLeaveDaySick = new List <Att_LeaveDay>(); var lstAttGrade = new List <Att_Grade>(); var lstAnualLeaveCfg = new List <Att_AnnualLeave>(); var lstWorkingHistory = new List <Hre_WorkHistory>(); var lstRoster = new List <Att_Roster>(); #region Lấy Dữ Liệu List <object> lst2Param = new List <object>(); lst2Param.Add(null); lst2Param.Add(EndYear); List <object> lst3Param = new List <object>(); lst3Param.Add(null); lst3Param.Add(null); lst3Param.Add(null); List <object> lst4Param = new List <object>(); lst4Param.Add(null); lst4Param.Add(BeginYearToGetData); lst4Param.Add(EndYear); lst4Param.Add(E_APPROVED); var dataAtt_LeaveDay = GetData <Att_LeaveDay>(lst3Param, ConstantSql.hrm_att_getdata_LeaveDay_Inner, UserLogin, ref status).ToList(); var dataHre_WorkHistory = GetData <Hre_WorkHistory>(lst2Param, ConstantSql.hrm_hre_getdata_WorkHistory, UserLogin, ref status).ToList(); var dataAtt_Roster_Inner = GetData <Att_Roster>(lst4Param, ConstantSql.hrm_att_getdata_Roster_Inner, UserLogin, ref status).ToList(); #endregion if (isFullEmp != null && isFullEmp == true) { lstAnnualDetailInDB = repoAtt_AnnualDetail.FindBy(m => m.IsDelete == null && m.ProfileID != null && m.Year == Year).ToList <Att_AnnualDetail>(); lstLeaveDaySick = dataAtt_LeaveDay .Where(m => m.Status == E_APPROVED && m.DateStart <= EndYear && m.DateEnd >= BeginYearToGetData && m.Cat_LeaveDayType != null && m.Cat_LeaveDayType.Code == LeavedayTypeCode.SICK.ToString() && lstProfileID.Contains(m.ProfileID)).ToList <Att_LeaveDay>(); lstAttGrade = repoAtt_Grade.FindBy(m => m.IsDelete == null).ToList(); lstAnualLeaveCfg = repoAtt_AnnualLeave.FindBy(m => m.IsDelete == null && m.Year == Year).ToList <Att_AnnualLeave>(); lstWorkingHistory = dataHre_WorkHistory.Where(m => m.DateEffective <= EndYear).OrderByDescending(m => m.DateEffective).ToList(); lstRoster = dataAtt_Roster_Inner.Where(m => m.Status == E_APPROVED && m.DateStart <= EndYear && m.DateEnd >= BeginYearToGetData).ToList <Att_Roster>(); } else { lstAnnualDetailInDB = repoAtt_AnnualDetail.FindBy(m => m.IsDelete == null && m.ProfileID != null && lstProfileID.Contains(m.ProfileID.Value) && m.Year == Year).ToList <Att_AnnualDetail>(); lstLeaveDaySick = dataAtt_LeaveDay .Where(m => m.Status == E_APPROVED && m.DateStart <= EndYear && m.DateEnd >= BeginYearToGetData && m.Cat_LeaveDayType != null && m.Cat_LeaveDayType.Code == LeavedayTypeCode.SICK.ToString() && lstProfileID.Contains(m.ProfileID)).ToList <Att_LeaveDay>(); lstAttGrade = repoAtt_Grade.FindBy(m => m.IsDelete == null && lstProfileID.Contains(m.ProfileID.Value)).ToList <Att_Grade>(); lstAnualLeaveCfg = repoAtt_AnnualLeave.FindBy(m => m.IsDelete == null && m.Year == Year && lstProfileID.Contains(m.ProfileID)).ToList <Att_AnnualLeave>(); lstWorkingHistory = dataHre_WorkHistory.Where(m => m.DateEffective <= EndYear && lstProfileID.Contains(m.ProfileID)).OrderByDescending(m => m.DateEffective).ToList <Hre_WorkHistory>(); lstRoster = dataAtt_Roster_Inner.Where(m => m.Status == E_APPROVED && m.DateStart <= EndYear && m.DateEnd >= BeginYearToGetData && lstProfileID.Contains(m.ProfileID)).ToList <Att_Roster>(); } if (lstLeaveDayApproveIDs != null && lstLeaveDayApproveIDs.Count > 0) { lstLeaveDaySick.AddRange(dataAtt_LeaveDay.Where(m => lstLeaveDayApproveIDs.Contains(m.ID)).ToList <Att_LeaveDay>()); lstLeaveDaySick = lstLeaveDaySick.Distinct().ToList(); } if (lstLeaveDayRejectIDs != null && lstLeaveDayRejectIDs.Count > 0) { lstLeaveDaySick = lstLeaveDaySick.Where(m => !lstLeaveDayRejectIDs.Contains(m.ID)).ToList(); } var lstRosterGroup = repoAtt_RosterGroup.FindBy(m => m.IsDelete == null && m.DateStart <= EndYear && m.DateEnd >= BeginYearToGetData).ToList <Att_RosterGroup>(); var lstDayOff = repoCat_DayOff.FindBy(m => m.IsDelete == null && m.DateOff >= BeginYearToGetData && m.DateOff <= EndYear).ToList <Cat_DayOff>(); // Phép Năm chốt Từ Ngày 1 -> 31 Hàng Tháng bool IsFrom1To31 = false; string type2 = AppConfig.HRM_ATT_ANNUALLEAVE_ANNUALBEGINMONTHTOENDMONTH.ToString(); Sys_AllSetting sys_ANNUAL_BEGINMONTHTO_ENDMONTH = repoSys_AllSetting.FindBy(sy => sy.IsDelete == null && sy.Name == type2).FirstOrDefault(); if (sys_ANNUAL_BEGINMONTHTO_ENDMONTH != null && sys_ANNUAL_BEGINMONTHTO_ENDMONTH.Value1 == bool.TrueString) { IsFrom1To31 = true; } foreach (var profile in lstProfile) { var lstGradeByProfile = lstAttGrade.Where(m => m.ProfileID == profile.ID).OrderByDescending(m => m.MonthStart).ToList(); var lstLeaveDaySickByprofile = lstLeaveDaySick.Where(m => m.ProfileID == profile.ID).ToList(); var AnualLeaveCfg = lstAnualLeaveCfg.Where(m => m.ProfileID == profile.ID).FirstOrDefault(); var lstRosterByProfile = lstRoster.Where(m => m.ProfileID == profile.ID).ToList(); var lstWorkHistoryByProfile = lstWorkingHistory.Where(m => m.ProfileID == profile.ID).ToList(); List <Att_AnnualDetail> lstAnnualDetailByProfile = AnalyzeAnnualSickPerProfile(profile, lstGradeCgf, lstGradeByProfile, BeginYear, EndYear, lstLeaveDaySickByprofile, lstAnnualDetailInDB, AnualLeaveCfg, lstRosterByProfile, lstRosterGroup, lstWorkHistoryByProfile, lstDayOff, IsFrom1To31, shifts); //lstResult.AddRange(lstAnnualDetailByProfile); repoAtt_AnnualDetail.Add(lstAnnualDetailByProfile); } repoAtt_AnnualDetail.SaveChanges(); //DataErrorCode DataErr = DataErrorCode.Unknown; //if (lstAnnualDetail.Count > 0) //{ // #region lấy dữ liệu dưới DB xóa đi // List<Guid> lstProfileID_InDB = lstAnnualDetail.Where(m => m.ProfileID != null).Select(m => m.ProfileID.Value).ToList(); // List<Att_AnnualDetail> lstAnnualLeaveDetail_InDB = repoAtt_AnnualDetail // .FindBy(m => m.IsDelete == null && m.Year == Year && m.Type == E_SICK_LEAVE && m.ProfileID != null && lstProfileID_InDB.Contains(m.ProfileID.Value)).ToList<Att_AnnualDetail>(); // foreach (var item in lstAnnualLeaveDetail_InDB) // { // item.IsDelete = true; // } // #endregion // repoAtt_AnnualDetail.Add(lstAnnualDetail); // try // { // repoAtt_AnnualDetail.SaveChanges(); // } // catch (Exception) // { // return false; // } //} result = true; } return(result); }
public string SaveOvertimePermitConfig(OvertimePermitEntity entity, string userLogin) { using (var context = new VnrHrmDataContext()) { var unitOfWork = (IUnitOfWork)(new UnitOfWork(context)); var repoSys_AllSetting = new CustomBaseRepository <Sys_AllSetting>(unitOfWork); Sys_AllSetting sys = new Sys_AllSetting(); string HRM_ATT_OT_OTPERMIT_ = AppConfig.HRM_ATT_OT_OTPERMIT_.ToString(); string status = string.Empty; List <object> lstO = new List <object>(); lstO.Add(HRM_ATT_OT_OTPERMIT_); lstO.Add(null); lstO.Add(null); var config = GetData <Sys_AllSetting>(lstO, ConstantSql.hrm_sys_sp_get_AllSetting, userLogin, ref status); if (config != null) { if (entity.limitHour_ByDay.HasValue) { var objConfig = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_OTPERMIT_LIMITHOUR_BYDAY.ToString()).FirstOrDefault(); if (objConfig != null) { if (objConfig.Value1 != entity.limitHour_ByDay.Value.ToString()) { objConfig.Value1 = entity.limitHour_ByDay.Value.ToString(); repoSys_AllSetting.Edit(objConfig); } } else { objConfig.ID = Guid.NewGuid(); objConfig.Name = AppConfig.HRM_ATT_OT_OTPERMIT_LIMITHOUR_BYDAY.ToString(); objConfig.Value1 = entity.limitHour_ByDay.Value.ToString(); repoSys_AllSetting.Add(objConfig); } } if (entity.limitHour_ByDay_Lev1.HasValue) { var objConfig = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_OTPERMIT_LIMITHOUR_BYDAY_LEV1.ToString()).FirstOrDefault(); if (objConfig != null) { if (objConfig.Value1 != entity.limitHour_ByDay_Lev1.Value.ToString()) { objConfig.Value1 = entity.limitHour_ByDay_Lev1.Value.ToString(); repoSys_AllSetting.Edit(objConfig); } } else { objConfig.ID = Guid.NewGuid(); objConfig.Name = AppConfig.HRM_ATT_OT_OTPERMIT_LIMITHOUR_BYDAY_LEV1.ToString(); objConfig.Value1 = entity.limitHour_ByDay_Lev1.Value.ToString(); repoSys_AllSetting.Add(objConfig); } } if (entity.limitHour_ByDay_Lev2.HasValue) { var objConfig = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_OTPERMIT_LIMITHOUR_BYDAY_LEV2.ToString()).FirstOrDefault(); if (objConfig != null) { if (objConfig.Value1 != entity.limitHour_ByDay_Lev2.Value.ToString()) { objConfig.Value1 = entity.limitHour_ByDay_Lev2.Value.ToString(); repoSys_AllSetting.Edit(objConfig); } } else { objConfig.ID = Guid.NewGuid(); objConfig.Name = AppConfig.HRM_ATT_OT_OTPERMIT_LIMITHOUR_BYDAY_LEV2.ToString(); objConfig.Value1 = entity.limitHour_ByDay_Lev2.Value.ToString(); repoSys_AllSetting.Add(objConfig); } } if (entity.limitHour_ByWeek.HasValue) { var objConfig = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_OTPERMIT_LIMITHOUR_BYWEEK.ToString()).FirstOrDefault(); if (objConfig != null) { if (objConfig.Value1 != entity.limitHour_ByWeek.Value.ToString()) { objConfig.Value1 = entity.limitHour_ByWeek.Value.ToString(); repoSys_AllSetting.Edit(objConfig); } } else { objConfig.ID = Guid.NewGuid(); objConfig.Name = AppConfig.HRM_ATT_OT_OTPERMIT_LIMITHOUR_BYWEEK.ToString(); objConfig.Value1 = entity.limitHour_ByWeek.Value.ToString(); repoSys_AllSetting.Add(objConfig); } } if (entity.limitHour_ByWeek_Lev1.HasValue) { var objConfig = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_OTPERMIT_LIMITHOUR_BYWEEK_LEV1.ToString()).FirstOrDefault(); if (objConfig != null) { if (objConfig.Value1 != entity.limitHour_ByWeek_Lev1.Value.ToString()) { objConfig.Value1 = entity.limitHour_ByWeek_Lev1.Value.ToString(); repoSys_AllSetting.Edit(objConfig); } } else { objConfig.ID = Guid.NewGuid(); objConfig.Name = AppConfig.HRM_ATT_OT_OTPERMIT_LIMITHOUR_BYWEEK_LEV1.ToString(); objConfig.Value1 = entity.limitHour_ByWeek_Lev1.Value.ToString(); repoSys_AllSetting.Add(objConfig); } } if (entity.limitHour_ByWeek_Lev2.HasValue) { var objConfig = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_OTPERMIT_LIMITHOUR_BYWEEK_LEV2.ToString()).FirstOrDefault(); if (objConfig != null) { if (objConfig.Value1 != entity.limitHour_ByWeek_Lev2.Value.ToString()) { objConfig.Value1 = entity.limitHour_ByWeek_Lev2.Value.ToString(); repoSys_AllSetting.Edit(objConfig); } } else { objConfig.ID = Guid.NewGuid(); objConfig.Name = AppConfig.HRM_ATT_OT_OTPERMIT_LIMITHOUR_BYWEEK_LEV2.ToString(); objConfig.Value1 = entity.limitHour_ByWeek_Lev2.Value.ToString(); repoSys_AllSetting.Add(objConfig); } } if (entity.limitHour_ByMonth.HasValue) { var objConfig = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_OTPERMIT_LIMITHOUR_BYMONTH.ToString()).FirstOrDefault(); if (objConfig != null) { if (objConfig.Value1 != entity.limitHour_ByMonth.Value.ToString()) { objConfig.Value1 = entity.limitHour_ByMonth.Value.ToString(); repoSys_AllSetting.Edit(objConfig); } } else { objConfig.ID = Guid.NewGuid(); objConfig.Name = AppConfig.HRM_ATT_OT_OTPERMIT_LIMITHOUR_BYMONTH.ToString(); objConfig.Value1 = entity.limitHour_ByMonth.Value.ToString(); repoSys_AllSetting.Add(objConfig); } } if (entity.limitHour_ByMonth_Lev1.HasValue) { var objConfig = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_OTPERMIT_LIMITHOUR_BYMONTH_LEV1.ToString()).FirstOrDefault(); if (objConfig != null) { if (objConfig.Value1 != entity.limitHour_ByMonth_Lev1.Value.ToString()) { objConfig.Value1 = entity.limitHour_ByMonth_Lev1.Value.ToString(); repoSys_AllSetting.Edit(objConfig); } } else { objConfig.ID = Guid.NewGuid(); objConfig.Name = AppConfig.HRM_ATT_OT_OTPERMIT_LIMITHOUR_BYMONTH_LEV1.ToString(); objConfig.Value1 = entity.limitHour_ByMonth_Lev1.Value.ToString(); repoSys_AllSetting.Add(objConfig); } } if (entity.limitHour_ByMonth_Lev2.HasValue) { var objConfig = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_OTPERMIT_LIMITHOUR_BYMONTH_LEV2.ToString()).FirstOrDefault(); if (objConfig != null) { if (objConfig.Value1 != entity.limitHour_ByMonth_Lev2.Value.ToString()) { objConfig.Value1 = entity.limitHour_ByMonth_Lev2.Value.ToString(); repoSys_AllSetting.Edit(objConfig); } } else { objConfig.ID = Guid.NewGuid(); objConfig.Name = AppConfig.HRM_ATT_OT_OTPERMIT_LIMITHOUR_BYMONTH_LEV2.ToString(); objConfig.Value1 = entity.limitHour_ByMonth_Lev2.Value.ToString(); repoSys_AllSetting.Add(objConfig); } } if (entity.limitHour_ByYear.HasValue) { var objConfig = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_OTPERMIT_LIMITHOUR_BYYEAR.ToString()).FirstOrDefault(); if (objConfig != null) { if (objConfig.Value1 != entity.limitHour_ByYear.Value.ToString()) { objConfig.Value1 = entity.limitHour_ByYear.Value.ToString(); repoSys_AllSetting.Edit(objConfig); } } else { objConfig.ID = Guid.NewGuid(); objConfig.Name = AppConfig.HRM_ATT_OT_OTPERMIT_LIMITHOUR_BYYEAR.ToString(); objConfig.Value1 = entity.limitHour_ByYear.Value.ToString(); repoSys_AllSetting.Add(objConfig); } } if (entity.limitHour_ByYear_Lev1.HasValue) { var objConfig = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_OTPERMIT_LIMITHOUR_BYYEAR_LEV1.ToString()).FirstOrDefault(); if (objConfig != null) { if (objConfig.Value1 != entity.limitHour_ByYear_Lev1.Value.ToString()) { objConfig.Value1 = entity.limitHour_ByYear_Lev1.Value.ToString(); repoSys_AllSetting.Edit(objConfig); } } else { objConfig.ID = Guid.NewGuid(); objConfig.Name = AppConfig.HRM_ATT_OT_OTPERMIT_LIMITHOUR_BYYEAR_LEV1.ToString(); objConfig.Value1 = entity.limitHour_ByYear_Lev1.Value.ToString(); repoSys_AllSetting.Add(objConfig); } } if (entity.limitHour_ByYear_Lev2.HasValue) { var objConfig = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_OTPERMIT_LIMITHOUR_BYYEAR_LEV2.ToString()).FirstOrDefault(); if (objConfig != null) { if (objConfig.Value1 != entity.limitHour_ByYear_Lev2.Value.ToString()) { objConfig.Value1 = entity.limitHour_ByYear_Lev2.Value.ToString(); repoSys_AllSetting.Edit(objConfig); } } else { objConfig.ID = Guid.NewGuid(); objConfig.Name = AppConfig.HRM_ATT_OT_OTPERMIT_LIMITHOUR_BYYEAR_LEV2.ToString(); objConfig.Value1 = entity.limitHour_ByYear_Lev2.Value.ToString(); repoSys_AllSetting.Add(objConfig); } } if (!string.IsNullOrEmpty(entity.limitColor)) { var objConfig = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_OTPERMIT_LIMITCOLOR.ToString()).FirstOrDefault(); if (objConfig != null) { if (objConfig.Value1 != entity.limitColor) { objConfig.Value1 = entity.limitColor; repoSys_AllSetting.Edit(objConfig); } } else { objConfig.ID = Guid.NewGuid(); objConfig.Name = AppConfig.HRM_ATT_OT_OTPERMIT_LIMITCOLOR.ToString(); objConfig.Value1 = entity.limitColor; repoSys_AllSetting.Add(objConfig); } } if (!string.IsNullOrEmpty(entity.limitColor_Lev1)) { var objConfig = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_OTPERMIT_LIMITCOLOR_LEV1.ToString()).FirstOrDefault(); if (objConfig != null) { if (objConfig.Value1 != entity.limitColor_Lev1) { objConfig.Value1 = entity.limitColor_Lev1; repoSys_AllSetting.Edit(objConfig); } } else { objConfig.ID = Guid.NewGuid(); objConfig.Name = AppConfig.HRM_ATT_OT_OTPERMIT_LIMITCOLOR_LEV1.ToString(); objConfig.Value1 = entity.limitColor_Lev1; repoSys_AllSetting.Add(objConfig); } } if (!string.IsNullOrEmpty(entity.limitColor_Lev2)) { var objConfig = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_OTPERMIT_LIMITCOLOR_LEV2.ToString()).FirstOrDefault(); if (objConfig != null) { if (objConfig.Value1 != entity.limitColor_Lev2) { objConfig.Value1 = entity.limitColor_Lev2; repoSys_AllSetting.Edit(objConfig); } } else { objConfig.ID = Guid.NewGuid(); objConfig.Name = AppConfig.HRM_ATT_OT_OTPERMIT_LIMITCOLOR_LEV2.ToString(); objConfig.Value1 = entity.limitColor_Lev2; repoSys_AllSetting.Add(objConfig); } } if (entity.IsAllowOverLimit_Normal.HasValue) { var objConfig = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_OTPERMIT_ISALLOWOVERLIMIT_NORMAL.ToString()).FirstOrDefault(); if (objConfig != null) { if (objConfig.Value1 != entity.IsAllowOverLimit_Normal.Value.ToString()) { objConfig.Value1 = entity.IsAllowOverLimit_Normal.Value.ToString(); repoSys_AllSetting.Edit(objConfig); } } else { objConfig.ID = Guid.NewGuid(); objConfig.Name = AppConfig.HRM_ATT_OT_OTPERMIT_ISALLOWOVERLIMIT_NORMAL.ToString(); objConfig.Value1 = entity.IsAllowOverLimit_Normal.Value.ToString(); repoSys_AllSetting.Add(objConfig); } } if (entity.IsAllowOverLimit_Normal_Lev1.HasValue) { var objConfig = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_OTPERMIT_ISALLOWOVERLIMIT_NORMAL_LEV1.ToString()).FirstOrDefault(); if (objConfig != null) { if (objConfig.Value1 != entity.IsAllowOverLimit_Normal_Lev1.Value.ToString()) { objConfig.Value1 = entity.IsAllowOverLimit_Normal_Lev1.Value.ToString(); repoSys_AllSetting.Edit(objConfig); } } else { objConfig.ID = Guid.NewGuid(); objConfig.Name = AppConfig.HRM_ATT_OT_OTPERMIT_ISALLOWOVERLIMIT_NORMAL_LEV1.ToString(); objConfig.Value1 = entity.IsAllowOverLimit_Normal_Lev1.Value.ToString(); repoSys_AllSetting.Add(objConfig); } } if (entity.IsAllowOverLimit_Normal_Lev2.HasValue) { var objConfig = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_OTPERMIT_ISALLOWOVERLIMIT_NORMAL_LEV2.ToString()).FirstOrDefault(); if (objConfig != null) { if (objConfig.Value1 != entity.IsAllowOverLimit_Normal_Lev2.Value.ToString()) { objConfig.Value1 = entity.IsAllowOverLimit_Normal_Lev2.Value.ToString(); repoSys_AllSetting.Edit(objConfig); } } else { objConfig.ID = Guid.NewGuid(); objConfig.Name = AppConfig.HRM_ATT_OT_OTPERMIT_ISALLOWOVERLIMIT_NORMAL_LEV2.ToString(); objConfig.Value1 = entity.IsAllowOverLimit_Normal_Lev2.Value.ToString(); repoSys_AllSetting.Add(objConfig); } } if (entity.IsAllowOverLimit_AllowOver.HasValue) { var objConfig = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_OTPERMIT_ISALLOWOVERLIMIT_ALLOWOVER.ToString()).FirstOrDefault(); if (objConfig != null) { if (objConfig.Value1 != entity.IsAllowOverLimit_AllowOver.Value.ToString()) { objConfig.Value1 = entity.IsAllowOverLimit_AllowOver.Value.ToString(); repoSys_AllSetting.Edit(objConfig); } } else { objConfig.ID = Guid.NewGuid(); objConfig.Name = AppConfig.HRM_ATT_OT_OTPERMIT_ISALLOWOVERLIMIT_ALLOWOVER.ToString(); objConfig.Value1 = entity.IsAllowOverLimit_AllowOver.Value.ToString(); repoSys_AllSetting.Add(objConfig); } } if (entity.IsAllowOverLimit_AllowOver_Lev1.HasValue) { var objConfig = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_OTPERMIT_ISALLOWOVERLIMIT_ALLOWOVER_LEV1.ToString()).FirstOrDefault(); if (objConfig != null) { if (objConfig.Value1 != entity.IsAllowOverLimit_AllowOver_Lev1.Value.ToString()) { objConfig.Value1 = entity.IsAllowOverLimit_AllowOver_Lev1.Value.ToString(); repoSys_AllSetting.Edit(objConfig); } } else { objConfig.ID = Guid.NewGuid(); objConfig.Name = AppConfig.HRM_ATT_OT_OTPERMIT_ISALLOWOVERLIMIT_ALLOWOVER_LEV1.ToString(); objConfig.Value1 = entity.IsAllowOverLimit_AllowOver_Lev1.Value.ToString(); repoSys_AllSetting.Add(objConfig); } } if (entity.IsAllowOverLimit_AllowOver_Lev2.HasValue) { var objConfig = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_OTPERMIT_ISALLOWOVERLIMIT_ALLOWOVER_LEV2.ToString()).FirstOrDefault(); if (objConfig != null) { if (objConfig.Value1 != entity.IsAllowOverLimit_AllowOver_Lev2.Value.ToString()) { objConfig.Value1 = entity.IsAllowOverLimit_AllowOver_Lev2.Value.ToString(); repoSys_AllSetting.Edit(objConfig); } } else { objConfig.ID = Guid.NewGuid(); objConfig.Name = AppConfig.HRM_ATT_OT_OTPERMIT_ISALLOWOVERLIMIT_ALLOWOVER_LEV2.ToString(); objConfig.Value1 = entity.IsAllowOverLimit_AllowOver_Lev2.Value.ToString(); repoSys_AllSetting.Add(objConfig); } } if (entity.IsAllowSplit.HasValue) { var objConfig = config.Where(s => s.Name == AppConfig.HRM_ATT_OT_OTPERMIT_ISALLOWSPLIT.ToString()).FirstOrDefault(); if (objConfig != null) { if (objConfig.Value1 != entity.IsAllowSplit.Value.ToString()) { objConfig.Value1 = entity.IsAllowSplit.Value.ToString(); repoSys_AllSetting.Edit(objConfig); } } else { objConfig.ID = Guid.NewGuid(); objConfig.Name = AppConfig.HRM_ATT_OT_OTPERMIT_ISALLOWSPLIT.ToString(); objConfig.Value1 = entity.IsAllowSplit.Value.ToString(); repoSys_AllSetting.Add(objConfig); } } } repoSys_AllSetting.SaveChanges(); return("0"); } }
private List <Att_AnnualDetail> AnalyzeAnnualDetail(List <Hre_ProfileMultiField> lstProfile, int Year, bool?isFullEmp, string userLogin) { using (var context = new VnrHrmDataContext()) { var unitOfWork = (IUnitOfWork)(new UnitOfWork(context)); var repoAtt_AnnualDetail = new CustomBaseRepository <Att_AnnualDetail>(unitOfWork); List <Att_AnnualDetail> lstResult = new List <Att_AnnualDetail>(); List <Guid> lstProfileID = lstProfile.Select(m => m.ID).ToList(); int BeginMonth = MonthStartAnl; DateTime BeginYear = new DateTime(Year, BeginMonth, 1); DateTime EndYear = BeginYear.AddYears(1).AddMinutes(-1); DateTime BeginYearToGetData = BeginYear.AddMonths(-1); //trừ một tháng để lấy data (bao những data thuộc những ngày trước tháng dành cho chế độ lương ko phải từ ngày 1) var lstGradeCgf = unitOfWork.CreateQueryable <Cat_GradeAttendance>().ToList(); var lstLeaveDayTypeAnnual = unitOfWork.CreateQueryable <Cat_LeaveDayType>(s => s.IsAnnualLeave == true).ToList(); List <Guid> lstAnnualTypeID = lstLeaveDayTypeAnnual.Select(s => s.ID).ToList(); string E_APPROVED = LeaveDayStatus.E_APPROVED.ToString(); var lstAnnualDetailInDB_Query = unitOfWork.CreateQueryable <Att_AnnualDetail>(m => m.ProfileID != null && m.Year == Year); var lstLeaveDayAnl_Query = unitOfWork.CreateQueryable <Att_LeaveDay>(m => m.Status == E_APPROVED && m.DateStart <= EndYear && m.DateEnd >= BeginYearToGetData && m.LeaveDayTypeID != null && lstAnnualTypeID.Contains(m.LeaveDayTypeID)); var lstAttGrade_Query = unitOfWork.CreateQueryable <Att_Grade>(); var lstAnualLeaveCfg_Query = unitOfWork.CreateQueryable <Att_AnnualLeave>(m => m.Year == Year); var lstlstRoster_Query = unitOfWork.CreateQueryable <Att_Roster>(m => m.Status == E_APPROVED && m.DateStart <= EndYear && m.DateEnd >= BeginYearToGetData); if (isFullEmp != null && isFullEmp.Value == false) { lstAnnualDetailInDB_Query = lstAnnualDetailInDB_Query.Where(m => m.ProfileID != null && lstProfileID.Contains(m.ProfileID.Value)); lstLeaveDayAnl_Query = lstLeaveDayAnl_Query.Where(m => lstProfileID.Contains(m.ProfileID)); lstAttGrade_Query = lstAttGrade_Query.Where(m => m.ProfileID != null && lstProfileID.Contains(m.ProfileID.Value)); lstAnualLeaveCfg_Query = lstAnualLeaveCfg_Query.Where(m => lstProfileID.Contains(m.ProfileID)); lstlstRoster_Query = lstlstRoster_Query.Where(m => lstProfileID.Contains(m.ProfileID)); } var lstAnnualDetailInDB = lstAnnualDetailInDB_Query.ToList(); var lstLeaveDayAnl = lstLeaveDayAnl_Query.Select(m => new Att_LeaveDayInfo() { ID = m.ID , ProfileID = m.ProfileID , DateStart = m.DateStart , DateEnd = m.DateEnd , LeaveDayTypeID = m.LeaveDayTypeID , TotalDuration = m.TotalDuration , Duration = m.Duration , DurationType = m.DurationType , LeaveDays = m.LeaveDays , LeaveHours = m.LeaveHours }).ToList(); var lstAttGrade = lstAttGrade_Query.ToList(); var lstAnualLeaveCfg = lstAnualLeaveCfg_Query.ToList(); var lstRoster = lstlstRoster_Query.Select(m => new Att_RosterInfo() { ID = m.ID, ProfileID = m.ProfileID, Type = m.Type, MonShiftID = m.MonShiftID, TueShiftID = m.TueShiftID, WedShiftID = m.WedShiftID, ThuShiftID = m.ThuShiftID, FriShiftID = m.FriShiftID, SatShiftID = m.SatShiftID, SunShiftID = m.SunShiftID }).ToList(); var lstRosterGroup = unitOfWork.CreateQueryable <Att_RosterGroup>(m => m.DateStart <= EndYear && m.DateEnd >= BeginYearToGetData).ToList(); var lstDayOff = unitOfWork.CreateQueryable <Cat_DayOff>(m => m.DateOff >= BeginYearToGetData && m.DateOff <= EndYear).ToList(); // Phép Năm chốt Từ Ngày 1 -> 31 Hàng Tháng bool IsFrom1To31 = false; string type2 = AppConfig.HRM_ATT_ANNUALLEAVE_ANNUALBEGINMONTHTOENDMONTH.ToString(); Sys_AllSetting sys_ANNUAL_BEGINMONTHTO_ENDMONTH = unitOfWork.CreateQueryable <Sys_AllSetting>(sy => sy.Name == type2).FirstOrDefault(); if (sys_ANNUAL_BEGINMONTHTO_ENDMONTH != null && sys_ANNUAL_BEGINMONTHTO_ENDMONTH.Value1 == bool.TrueString) { IsFrom1To31 = true; } List <Guid> lstPositionIDs = lstProfile.Where(m => m.PositionID != null).Select(m => m.PositionID.Value).Distinct().ToList(); List <Cat_Position> lstPosition = unitOfWork.CreateQueryable <Cat_Position>(m => lstPositionIDs.Contains(m.ID)).ToList <Cat_Position>(); var lstAllSetting = unitOfWork.CreateQueryable <Sys_AllSetting>().ToList(); var lstHDTJob = new List <Hre_HDTJob>(); foreach (var templstProfileId in lstProfileID.Chunk(1000)) { lstHDTJob.AddRange(unitOfWork.CreateQueryable <Hre_HDTJob>(Guid.Empty, m => m.ProfileID != null && templstProfileId.Contains(m.ProfileID.Value)).ToList()); } foreach (var profile in lstProfile) { var lstGradeByProfile = lstAttGrade.Where(m => m.ProfileID == profile.ID).OrderByDescending(m => m.MonthStart).ToList(); var lstLeaveDayByprofile = lstLeaveDayAnl.Where(m => m.ProfileID == profile.ID).ToList(); var AnualLeaveCfg = lstAnualLeaveCfg.Where(m => m.ProfileID == profile.ID).FirstOrDefault(); var lstRosterByProfile = lstRoster.Where(m => m.ProfileID == profile.ID).ToList(); var position = lstPosition.Where(m => m.ID == profile.PositionID).FirstOrDefault(); List <Att_AnnualDetail> lstAnnualDetailByProfile_Update = new List <Att_AnnualDetail>(); List <Att_AnnualDetail> lstAnnualDetailByProfile = AnalyzeAnnualDetailPerProfile(profile, lstGradeCgf, lstGradeByProfile, BeginYear, EndYear, lstLeaveDayByprofile, lstAnnualDetailInDB, AnualLeaveCfg, lstRosterByProfile, lstRosterGroup, lstDayOff, IsFrom1To31, position, lstAllSetting, lstHDTJob, out lstAnnualDetailByProfile_Update, userLogin); lstResult.AddRange(lstAnnualDetailByProfile); lstResult.AddRange(lstAnnualDetailByProfile_Update); repoAtt_AnnualDetail.Add(lstAnnualDetailByProfile); repoAtt_AnnualDetail.Edit(lstAnnualDetailByProfile_Update); } repoAtt_AnnualDetail.SaveChanges(); return(lstResult); } }
/// <summary> /// Lấy tất cả các bản ghi /// Get by key /// </summary> /// <returns></returns> public void SaveConfig(List <Dictionary <string, string> > lstModel) { using (var context = new VnrHrmDataContext()) { IUnitOfWork unitOfWork = (IUnitOfWork)(new UnitOfWork(context)); var repo = new CustomBaseRepository <Sys_AllSetting>(unitOfWork); string status = string.Empty; List <Dictionary <Guid, string> > lstUpdate = new List <Dictionary <Guid, string> >(); var valueTemp = new Sys_AllSetting(); var modelTemp = new Sys_AllSetting(); List <Guid> lstConfigIds = new List <Guid>(); List <Sys_AllSetting> lstAdd = new List <Sys_AllSetting>(); List <Sys_AllSetting> lstEdit = new List <Sys_AllSetting>(); List <Sys_AllSetting> lstDel = new List <Sys_AllSetting>(); var getdata = repo.FindBy(s => s.IsDelete == null).ToList(); if (lstModel[0].FirstOrDefault().Value.Length > 0) { var lstStr = lstModel.FirstOrDefault()["lstConfigIds"].Split(','); lstConfigIds = lstStr.Select(Guid.Parse).ToList(); } foreach (var item in lstConfigIds) { modelTemp = GetById <Sys_AllSetting>(item, ref status); lstUpdate.Add(new Dictionary <Guid, string>() { { modelTemp.ID, modelTemp.Name } }); } for (int i = 1; i < lstModel.Count; i++) { var lstEntity = getdata.Where(s => s.Name == lstModel[i].FirstOrDefault().Key).ToList(); if (lstEntity.Count == 0) { valueTemp = new Sys_AllSetting(); valueTemp.ID = Guid.NewGuid(); valueTemp.Name = lstModel[i].FirstOrDefault().Key; valueTemp.Value1 = lstModel[i].FirstOrDefault().Value; lstAdd.Add(valueTemp); continue; } if (lstEntity.Count > 0) { valueTemp = new Sys_AllSetting(); foreach (var item in lstEntity) { item.IsDelete = true; lstDel.Add(item); //repo.Edit(item); } var isUpdate = lstUpdate.Where(s => s.FirstOrDefault().Value == lstModel[i].FirstOrDefault().Key).FirstOrDefault(); if (isUpdate != null) { valueTemp.ID = lstEntity.FirstOrDefault().ID; valueTemp.Name = lstModel[i].FirstOrDefault().Key; valueTemp.Value1 = lstModel[i].FirstOrDefault().Value; valueTemp.IsDelete = null; lstEdit.Add(valueTemp); } else { valueTemp.ID = Guid.NewGuid(); valueTemp.Name = lstModel[i].FirstOrDefault().Key; valueTemp.Value1 = lstModel[i].FirstOrDefault().Value; lstAdd.Add(valueTemp); } } } repo.Edit(lstDel); repo.Add(lstAdd); repo.Edit(lstEdit); repo.SaveChanges(); } }
/// <summary> /// [Hieu.van] Tổng Hợp giặt là /// </summary> /// <param name="dateStart"></param> /// <param name="dateEnd"></param> /// <param name="lstProfileIDs"></param> /// <returns></returns> public List <LMS_LaundryRecordEntity> GetLaundryRecordSummary(string _line, string _locker, string _marker, DateTime dateStart, DateTime dateEnd, List <Hre_ProfileEntity> lstProfileIDs, string UserLogin) { dateStart = dateStart.Date; dateEnd = dateEnd.Date.AddDays(1).AddMilliseconds(-1); string status = string.Empty; //string strIDs = string.Join(",", lstProfileIDs.ToArray()); using (var context = new VnrHrmDataContext()) { var unitOfWork = (IUnitOfWork)(new UnitOfWork(context)); var repoLau_TamScanLog = new CustomBaseRepository <LMS_TamScanLogLMS>(unitOfWork); var repoLau_Line = new CustomBaseRepository <LMS_LineLMS>(unitOfWork); var repoLau_Locker = new CustomBaseRepository <LMS_LockerLMS>(unitOfWork); var repoLau_Marker = new CustomBaseRepository <LMS_Marker>(unitOfWork); var repoLau_LaundryRecord = new CustomBaseRepository <LMS_LaundryRecord>(unitOfWork); var repoSys_AllSetting = new CustomBaseRepository <Sys_AllSetting>(unitOfWork); #region cấu hình số phút xử lý trùng int rsScanMulti = 0; var rsScanMultiConfig = GetData <Sys_AllSetting>(AppConfig.HRM_LAU_LAUNDRYRECORD_SCANMULTI_CONFIG.ToString(), ConstantSql.hrm_sys_sp_get_AllSettingByKey, UserLogin, ref status).FirstOrDefault(); if (rsScanMultiConfig != null) { rsScanMulti = rsScanMultiConfig.Value1 != null?int.Parse(rsScanMultiConfig.Value1.ToString()) : 0; dateStart = dateStart.Date.AddHours(rsScanMulti); dateEnd = dateEnd.Date.AddDays(1).AddHours(rsScanMulti).AddMilliseconds(-1); } #endregion var tamScanLogs = repoLau_TamScanLog .FindBy(s => dateStart <= s.TimeLog && s.TimeLog <= dateEnd) .Select(s => new { s.Code, s.TimeLog, s.ID, s.MachineCode }) //.Select(s => new { s.MachineCode, s.CardCode, s.TimeLog, s.Id }) .ToList(); var cardCodes = tamScanLogs.Select(s => s.Code).ToList(); //strIDs = Common.DotNetToOracle(strIDs); //var profiles = GetData<Hre_ProfileEntity>(strIDs, ConstantSql.hrm_hr_sp_get_ProfileByIds, ref status) // .Where(s => cardCodes.Contains(s.CodeAttendance) && lstProfileIDs.Contains(s.ID)) var profiles = lstProfileIDs .Where(s => cardCodes.Contains(s.CodeAttendance)) .Select(s => new { s.ID, s.CodeAttendance, s.CodeEmp, s.ProfileName, s.OrgStructureName }).ToList(); tamScanLogs = tamScanLogs .Where(s => profiles.Select(p => p.CodeAttendance).Contains(s.Code)) .OrderBy(s => s.Code) .ThenBy(s => s.TimeLog) .ToList(); #region lấy line-locker-marker và xử lý khi tìm kiếm var lines = repoLau_Line.FindBy(s => s.IsDelete == null).ToList(); var Lockers = repoLau_Locker.FindBy(s => s.IsDelete == null).ToList(); var Markers = repoLau_Marker.FindBy(s => s.IsDelete == null).ToList(); if (_line != null) { List <Guid> lstLine = _line.Split(',').Select(Guid.Parse).ToList(); lines = lines.Where(s => lstLine.Contains(s.ID)).ToList(); } if (_locker != null) { List <Guid> lstLocker = _locker.Split(',').Select(Guid.Parse).ToList(); Lockers = Lockers.Where(s => lstLocker.Contains(s.ID)).ToList(); } if (_marker != null) { List <Guid> lstMarker = _marker.Split(',').Select(Guid.Parse).ToList(); Markers = Markers.Where(s => lstMarker.Contains(s.ID)).ToList(); } #endregion List <object> lstObj = new List <object>(); lstObj.Add(dateStart); lstObj.Add(dateEnd); List <Lau_LaundryRecordCheckEntity> laundryCheckList = GetData <Lau_LaundryRecordCheckEntity>(lstObj, ConstantSql.hrm_lau_sp_get_LaundryRecord_ByDateFromDateTo, UserLogin, ref status); LMS_LaundryRecordEntity laundry = new LMS_LaundryRecordEntity(); List <LMS_LaundryRecordEntity> lstRecord = new List <LMS_LaundryRecordEntity>(); List <LMS_LaundryRecord> lstAdd = new List <LMS_LaundryRecord>(); List <LMS_LaundryRecord> lstEdit = new List <LMS_LaundryRecord>(); List <Guid> lstDuplicateTamScan = new List <Guid>(); foreach (var tamScanLog in tamScanLogs) { if (lstDuplicateTamScan.Contains(tamScanLog.ID)) { continue; } laundry = new LMS_LaundryRecordEntity(); var profile = profiles.FirstOrDefault(s => s.CodeAttendance == tamScanLog.Code); var line = lines.FirstOrDefault(s => tamScanLog.MachineCode == s.MachineCode); if (profile != null && line != null) { #region xử lý bản ghi trùng var tamScanLogProfiles = tamScanLogs .Where(s => s.Code == tamScanLog.Code && s.TimeLog.Value.Date == tamScanLog.TimeLog.Value.Date && s.MachineCode == tamScanLog.MachineCode) .OrderBy(s => s.TimeLog) .ToList(); if (tamScanLogProfiles.Count > 1 && rsScanMulti > 0) { for (int i = 0; i < tamScanLogProfiles.Count; i++) { var tamsanFirst = tamScanLogProfiles[i]; int j = i + 1; if (j > tamScanLogProfiles.Count - 1) { j = i; } var tamsanNear = tamScanLogProfiles[j]; if (tamsanNear.TimeLog.Value.Subtract(tamsanFirst.TimeLog.Value).TotalMinutes < rsScanMulti && tamsanFirst.ID != tamsanNear.ID) { if (tamsanFirst.MachineCode == tamsanNear.MachineCode) { lstDuplicateTamScan.Add(tamsanNear.ID); break; } } } } #endregion #region xử lý add record laundry.ProfileID = profile.ID; laundry.ProfileName = profile.ProfileName; laundry.CodeAttendance = profile.CodeAttendance; laundry.TimeLog = tamScanLog.TimeLog; laundry.Status = HRM.Infrastructure.Utilities.LaundryRecordStatus.E_SUBMIT.ToString(); laundry.Type = LaundryRecordType.E_AUTO.ToString(); if (tamScanLog.MachineCode != null) { laundry.MachineCode = tamScanLog.MachineCode; if (line != null) { laundry.LineLMSName = line.LineLMSName; laundry.LineID = line.ID; laundry.Amount = (decimal)line.Amount; if (line.LockerID != null) { var locker = Lockers.Where(c => c.ID == line.LockerID).FirstOrDefault(); laundry.LockerLMSName = locker.LockerLMSName; laundry.LockerID = locker.ID; } if (line.MarkerID != null) { var marker = Markers.Where(c => c.ID == line.MarkerID).FirstOrDefault(); laundry.MarkerName = marker.MarkerName; laundry.MarkerID = marker.ID; } } } laundry.DateCreate = DateTime.Now; var recordAdd = laundry.CopyData <LMS_LaundryRecord>(); var CheckList = laundryCheckList.Where(s => s.ProfileID == laundry.ProfileID.Value && s.TimeLog == laundry.TimeLog).ToList(); if (CheckList != null) { if (CheckList.Count() > 0) { var idUpdate = CheckList.FirstOrDefault(); recordAdd.ID = idUpdate.ID; repoLau_LaundryRecord.Edit(recordAdd); //lstEdit.Add(recordAdd); } else { recordAdd.ID = Guid.NewGuid(); repoLau_LaundryRecord.Add(recordAdd); //lstAdd.Add(recordAdd); } } laundry.ID = tamScanLog.ID; lstRecord.Add(laundry); #endregion } } repoLau_LaundryRecord.SaveChanges(); //if (lstAdd.Any()) //{ // repoLau_LaundryRecord.Add(lstAdd); // repoLau_LaundryRecord.SaveChanges(); //} //if (lstEdit.Any()) //{ // repoLau_LaundryRecord.Edit(lstEdit); // repoLau_LaundryRecord.SaveChanges(); //} if (lstRecord.Count > 0) { Sys_AllSetting sys = new Sys_AllSetting(); Sys_AllSetting rs = GetData <Sys_AllSetting>(AppConfig.HRM_LAU_LAUNDRYRECORD_SUMMARY.ToString(), ConstantSql.hrm_sys_sp_get_AllSettingByKey, UserLogin, ref status).FirstOrDefault(); sys.Value1 = dateStart.ToString(ConstantFormat.HRM_Format_YearMonthDay_HoursMinSecond.ToString()); sys.Value2 = dateEnd.ToString(ConstantFormat.HRM_Format_YearMonthDay_HoursMinSecond.ToString()); sys.Name = AppConfig.HRM_LAU_LAUNDRYRECORD_SUMMARY.ToString(); if (rs != null) { sys.ID = rs.ID; repoSys_AllSetting.Edit(sys); } else { sys.ID = Guid.NewGuid(); repoSys_AllSetting.Add(sys); } repoSys_AllSetting.SaveChanges(); } return(lstRecord); } }