/// <summary> /// hàm tạo ra OT với sự phân tích ra night shift và cắt giờ theo nightShift /// </summary> /// <param name="lstDayOff"></param> /// <param name="lstOvertimeType"></param> /// <param name="lstOvertimeInsert"></param> /// <param name="workday"></param> /// <param name="shiftByWorkday"></param> /// <param name="beginOT"></param> /// <param name="endOT"></param> private void CreateOvertimeAnalyzeNightShift(List<Cat_DayOffEntity> lstDayOff, List<Cat_OvertimeTypeEntity> lstOvertimeType, List<Att_OvertimeEntity> lstOvertimeInsert, WorkdayCustom Workday, Cat_ShiftEntity ShiftByWorkday, DateTime? BeginOT, DateTime? EndOT, bool isAllowGetNightShift, double MininumOvertimeHour , bool isAllowGetTypeBaseOnActualDate, bool isAllowGetTypeBaseOnBeginShift, bool isAllowGetTypeBaseOnEndShift, bool isNonShift, bool isBeforeShift, string userLogin) { DateTime? BeforeNightShiftStart = null; DateTime? BeforeNightShiftEnd = null; DateTime? NightShiftStart = null; DateTime? NightShiftEnd = null; DateTime? AfterNightShiftStart = null; DateTime? AfterNightShiftEnd = null; if ((EndOT.Value - BeginOT.Value).TotalHours < MininumOvertimeHour) { return; } DateTime DateChecking = Workday.WorkDate; DateTime ShiftBegin = DateChecking.Date.Add(ShiftByWorkday.InTime.TimeOfDay); DateTime ShiftEnd = ShiftBegin.AddHours(ShiftByWorkday.CoOut); DateTime ShiftStartBreak = DateChecking.Date.Add(ShiftByWorkday.InTime.TimeOfDay).AddHours(ShiftByWorkday.CoBreakIn); DateTime ShiftEndBreak = DateChecking.Date.Add(ShiftByWorkday.InTime.TimeOfDay).AddHours(ShiftByWorkday.CoBreakOut); if (isAllowGetNightShift && IsOverTimeNightShift(BeginOT.Value, EndOT.Value, ShiftByWorkday, Workday.WorkDate, out BeforeNightShiftStart, out BeforeNightShiftEnd, out NightShiftStart, out NightShiftEnd, out AfterNightShiftStart, out AfterNightShiftEnd, isNonShift)) { //Có Đi Qua OT Đêm //Cặp trươc OT Đêm if (BeforeNightShiftStart != null && BeforeNightShiftEnd != null) { double HourOT = 0; //Logic Mantis:0029025 if (isNonShift) { HourOT = HourRoundDownNonShift(BeforeNightShiftStart, BeforeNightShiftEnd, ShiftBegin, ShiftEnd, ShiftStartBreak, ShiftEndBreak, userLogin); } else { if (BeforeNightShiftStart.Value < ShiftEndBreak && ShiftStartBreak < BeforeNightShiftEnd.Value) //co giao nhau { HourOT += (ShiftStartBreak - BeforeNightShiftStart.Value).TotalHours < 0 ? 0 : (ShiftStartBreak - BeforeNightShiftStart.Value).TotalHours; HourOT += (BeforeNightShiftEnd.Value - ShiftEndBreak).TotalHours < 0 ? 0 : (BeforeNightShiftEnd.Value - ShiftEndBreak).TotalHours; } else { HourOT = (BeforeNightShiftEnd.Value - BeforeNightShiftStart.Value).TotalHours; } } Guid? OvertimeTypeID = GetOvertimeType(DateChecking, lstDayOff, lstOvertimeType, false, isNonShift); if (OvertimeTypeID != null) { Att_OvertimeEntity OTInsert = new Att_OvertimeEntity(); OTInsert.ID = Guid.NewGuid(); // OTInsert.WorkDate = BeginOT.Value; OTInsert.WorkDate = BeforeNightShiftStart.Value; OTInsert.WorkDateRoot = DateChecking; OTInsert.RegisterHours = HourOT; OTInsert.AnalyseHour = HourOT; OTInsert.Status = OverTimeStatus.E_SUBMIT.ToString(); OTInsert.ProfileID = Workday.ProfileID; OTInsert.OvertimeTypeID = OvertimeTypeID.Value; //OTInsert.InTime = BeforeNightShiftStart.Value; //OTInsert.OutTime = BeforeNightShiftEnd.Value; OTInsert.InTime = Workday.InTime1; OTInsert.OutTime = Workday.OutTime1; OTInsert.ShiftID = Workday.ShiftApprove ?? Workday.ShiftID; if (isNonShift) { OTInsert.udWorkdayNonShift = true; } if (isBeforeShift) { OTInsert.udTypeBeginOTWithShift = OverTimeBeginType.E_BEFORE_SHIFT.ToString(); } else { OTInsert.udTypeBeginOTWithShift = OverTimeBeginType.E_AFTER_SHIFT.ToString(); } lstOvertimeInsert.Add(OTInsert); } } //Cặp sau OT Đêm if (AfterNightShiftStart != null && AfterNightShiftEnd != null) { if (isAllowGetTypeBaseOnActualDate) { DateChecking = AfterNightShiftStart.Value.Date; } else if (isAllowGetTypeBaseOnEndShift) { DateChecking = AfterNightShiftEnd.Value.Date; } double HourOT = 0; //Logic Mantis:0029025 if (isNonShift) { HourOT = HourRoundDownNonShift(AfterNightShiftStart, AfterNightShiftEnd, ShiftBegin, ShiftEnd, ShiftStartBreak, ShiftEndBreak, userLogin); } else { if (AfterNightShiftStart.Value < ShiftEndBreak && ShiftStartBreak < AfterNightShiftEnd.Value) //co giao nhau { HourOT += (ShiftStartBreak - AfterNightShiftStart.Value).TotalHours < 0 ? 0 : (ShiftStartBreak - AfterNightShiftStart.Value).TotalHours; HourOT += (AfterNightShiftEnd.Value - ShiftEndBreak).TotalHours < 0 ? 0 : (AfterNightShiftEnd.Value - ShiftEndBreak).TotalHours; } else { HourOT = (AfterNightShiftEnd.Value - AfterNightShiftStart.Value).TotalHours; } } Guid? OvertimeTypeID = GetOvertimeType(DateChecking, lstDayOff, lstOvertimeType, false, isNonShift); if (OvertimeTypeID != null) { Att_OvertimeEntity OTInsert = new Att_OvertimeEntity(); OTInsert.ID = Guid.NewGuid(); // OTInsert.WorkDate = BeginOT.Value; OTInsert.WorkDate = AfterNightShiftStart.Value; OTInsert.WorkDateRoot = DateChecking; OTInsert.RegisterHours = HourOT; OTInsert.AnalyseHour = HourOT; OTInsert.Status = OverTimeStatus.E_SUBMIT.ToString(); OTInsert.ProfileID = Workday.ProfileID; OTInsert.OvertimeTypeID = OvertimeTypeID.Value; //OTInsert.InTime = AfterNightShiftStart.Value; //OTInsert.OutTime = AfterNightShiftEnd.Value; OTInsert.InTime = Workday.InTime1; OTInsert.OutTime = Workday.OutTime1; OTInsert.ShiftID = Workday.ShiftApprove ?? Workday.ShiftID; if (isNonShift) { OTInsert.udWorkdayNonShift = true; } if (isBeforeShift) { OTInsert.udTypeBeginOTWithShift = OverTimeBeginType.E_BEFORE_SHIFT.ToString(); } else { OTInsert.udTypeBeginOTWithShift = OverTimeBeginType.E_AFTER_SHIFT.ToString(); } lstOvertimeInsert.Add(OTInsert); } } //Cặp OT Đêm if (NightShiftStart != null && NightShiftEnd != null) { if (isAllowGetTypeBaseOnActualDate) { DateChecking = NightShiftStart.Value.Date; } else if (isAllowGetTypeBaseOnEndShift) { DateChecking = NightShiftEnd.Value.Date; } double HourOT = 0; //Logic Mantis:0029025 if (isNonShift) { HourOT = HourRoundDownNonShift(NightShiftStart, NightShiftEnd, ShiftBegin, ShiftEnd, ShiftStartBreak, ShiftEndBreak, userLogin); } else { if (NightShiftStart.Value < ShiftEndBreak && ShiftStartBreak < NightShiftEnd.Value) //co giao nhau { HourOT += (ShiftStartBreak - NightShiftStart.Value).TotalHours < 0 ? 0 : (ShiftStartBreak - NightShiftStart.Value).TotalHours; HourOT += (NightShiftEnd.Value - ShiftEndBreak).TotalHours < 0 ? 0 : (NightShiftEnd.Value - ShiftEndBreak).TotalHours; } else { HourOT = (NightShiftEnd.Value - NightShiftStart.Value).TotalHours; } } //double HourOT = (NightShiftEnd.Value - NightShiftStart.Value).TotalHours; Guid? OvertimeTypeID = GetOvertimeType(DateChecking, lstDayOff, lstOvertimeType, true, isNonShift); if (OvertimeTypeID != null) { Att_OvertimeEntity OTInsert = new Att_OvertimeEntity(); OTInsert.ID = Guid.NewGuid(); // OTInsert.WorkDate = BeginOT.Value; OTInsert.WorkDate = NightShiftStart.Value; OTInsert.WorkDateRoot = DateChecking; OTInsert.RegisterHours = HourOT; OTInsert.AnalyseHour = HourOT; OTInsert.Status = OverTimeStatus.E_SUBMIT.ToString(); OTInsert.ProfileID = Workday.ProfileID; OTInsert.OvertimeTypeID = OvertimeTypeID.Value; //OTInsert.InTime = NightShiftStart.Value; //OTInsert.OutTime = NightShiftEnd.Value; OTInsert.InTime = Workday.InTime1; OTInsert.OutTime = Workday.OutTime1; OTInsert.ShiftID = Workday.ShiftApprove ?? Workday.ShiftID; if (isNonShift) { OTInsert.udWorkdayNonShift = true; } if (isBeforeShift) { OTInsert.udTypeBeginOTWithShift = OverTimeBeginType.E_BEFORE_SHIFT.ToString(); } else { OTInsert.udTypeBeginOTWithShift = OverTimeBeginType.E_AFTER_SHIFT.ToString(); } lstOvertimeInsert.Add(OTInsert); } } } else { //Không Đi Qua OT Ca Đêm double HourOT = 0; //Logic Mantis:0029025 if (isNonShift) { HourOT = HourRoundDownNonShift(BeginOT, EndOT, ShiftBegin, ShiftEnd, ShiftStartBreak, ShiftEndBreak, userLogin); } else { if (BeginOT.Value < ShiftEndBreak && ShiftStartBreak < EndOT.Value) //co giao nhau { HourOT += (ShiftStartBreak - BeginOT.Value).TotalHours < 0 ? 0 : (ShiftStartBreak - BeginOT.Value).TotalHours; HourOT += (EndOT.Value - ShiftEndBreak).TotalHours < 0 ? 0 : (EndOT.Value - ShiftEndBreak).TotalHours; } else { HourOT = (EndOT.Value - BeginOT.Value).TotalHours; } } Guid? OvertimeTypeID = GetOvertimeType(DateChecking, lstDayOff, lstOvertimeType, false, isNonShift); if (OvertimeTypeID != null) { Att_OvertimeEntity OTInsert = new Att_OvertimeEntity(); OTInsert.ID = Guid.NewGuid(); OTInsert.WorkDate = BeginOT.Value; OTInsert.WorkDateRoot = DateChecking; OTInsert.RegisterHours = HourOT; OTInsert.AnalyseHour = HourOT; OTInsert.Status = OverTimeStatus.E_SUBMIT.ToString(); OTInsert.ProfileID = Workday.ProfileID; OTInsert.OvertimeTypeID = OvertimeTypeID.Value; //OTInsert.InTime = BeginOT.Value; //OTInsert.OutTime = EndOT.Value; OTInsert.InTime = Workday.InTime1; OTInsert.OutTime = Workday.OutTime1; OTInsert.ShiftID = Workday.ShiftApprove ?? Workday.ShiftID; if (isNonShift) { OTInsert.udWorkdayNonShift = true; } if (isBeforeShift) { OTInsert.udTypeBeginOTWithShift = OverTimeBeginType.E_BEFORE_SHIFT.ToString(); } else { OTInsert.udTypeBeginOTWithShift = OverTimeBeginType.E_AFTER_SHIFT.ToString(); } lstOvertimeInsert.Add(OTInsert); } } }
/// <summary> /// Hàm phân tích tăng ca /// </summary> /// <param name="lstWorkday">Ds Overtime đang đăng ký cần phân tích</param> /// <param name="lstShift">Ds ca làm việc </param> /// <param name="lstShiftItem">Ds ca làm việc Item </param> /// <param name="lstDayOff">Ds ngày nghỉ của Cty đã được lọc theo thời gian</param> /// <param name="lstOvertimeType">Ds loại OT</param> /// <param name="OvertimeInfoFillterAnalyze">Các info để tính toán phân tích tăng ca </param> /// <returns></returns> public List<Att_OvertimeEntity> StartAnalyzeOvertime(List<Att_OvertimeEntity> lstOvertime, List<Cat_ShiftEntity> lstShift, List<Cat_ShiftItemEntity> lstShiftItem, List<Cat_DayOffEntity> lstDayOff, List<Cat_OvertimeTypeEntity> lstOvertimeType, Att_OvertimeInfoFillterAnalyze OvertimeInfoFillterAnalyze, string userLogin) { List<WorkdayCustom> lstWorkday = new List<WorkdayCustom>(); WorkdayCustom Workday = new WorkdayCustom(); foreach (var item in lstOvertime) { if (item.ProfileID == null || item.ShiftID == null || item.WorkDate == null || item.RegisterHours == null) continue; Workday.ProfileID = item.ProfileID; Workday.ShiftID = item.ShiftID; Workday.WorkDate = item.WorkDate.Date; Workday.InTime1 = item.WorkDate; Workday.OutTime1 = item.WorkDate.AddHours(item.RegisterHours); lstWorkday.Add(Workday); } var rs = AnalyzeOvertime(lstWorkday, lstShift, lstShiftItem, lstDayOff, lstOvertimeType, OvertimeInfoFillterAnalyze, userLogin); return rs; }