private void SetNightShifts(List <ObligatedRangeWeeks> w1) { foreach (var day in w1) { var normal = new ObligatedRangeDayTimes(); normal.Start = new DateTime(2018, 1, 1, 20, 0, 0); normal.End = new DateTime(2018, 1, 1, 22, 0, 0); normal.RangeType = RangeType.Overtime; /*var intime = new ObligatedRangeDayTimes(); * intime.Start = new DateTime(2018, 1, 1, 22, 0, 0); * intime.End = new DateTime(2018, 1, 1, 0, 0, 0); * intime.RangeType = RangeType.NightWork;*/ var intime2 = new ObligatedRangeDayTimes(); intime2.Start = new DateTime(2018, 1, 1, 22, 0, 0); intime2.End = new DateTime(2018, 1, 2, 6, 0, 0); intime2.RangeType = RangeType.NightWork; intime2.IsTwoDay = true; day.ObligatedRangeDayTimes.Add(normal); // day.ObligatedRangeDayTimes.Add(intime); day.ObligatedRangeDayTimes.Add(intime2); } }
public static BiometryCalculatedDetailTime ToInterval(ObligatedRangeDayTimes obligationRange) { return(new BiometryCalculatedDetailTime { TimeIn = obligationRange.Start, TimeOut = obligationRange.End, RangeTimeIn = obligationRange.Start, RangeTimeOut = obligationRange.End, }); }
private void SetDayShifts(List <ObligatedRangeWeeks> w1) { foreach (var day in w1) { var intime = new ObligatedRangeDayTimes(); intime.Start = new DateTime(2018, 1, 1, 8, 0, 0); intime.End = new DateTime(2018, 1, 1, 16, 0, 0); intime.RangeType = RangeType.Normal; var overwork = new ObligatedRangeDayTimes(); overwork.Start = new DateTime(2018, 1, 1, 16, 0, 0); overwork.End = new DateTime(2018, 1, 1, 18, 0, 0); overwork.RangeType = RangeType.Overtime; day.ObligatedRangeDayTimes.Add(intime); day.ObligatedRangeDayTimes.Add(overwork); } }
private static List <BiometryCalculatedDetailTime> GetAllRelatdIntervals (ObligatedRangeDayTimes obligationRange , ICollection <BiometricDataTime> workdayTimes) { List <BiometryCalculatedDetailTime> list = new List <BiometryCalculatedDetailTime>(); ///در داخل بازه است یا خیر foreach (var t in workdayTimes) { var interval = new BiometryCalculatedDetailTime(); if (obligationRange.Start <= t.TimeIn && obligationRange.End >= t.TimeIn || obligationRange.Start <= t.TimeOut && obligationRange.End >= t.TimeOut) { interval.TimeIn = t.TimeIn; interval.TimeOut = t.TimeOut; interval.RangeTimeIn = obligationRange.Start; interval.RangeTimeOut = obligationRange.End; } else if (t.TimeIn <= obligationRange.Start && t.TimeOut >= obligationRange.Start || t.TimeIn <= obligationRange.End && t.TimeOut >= obligationRange.End) { interval.TimeIn = t.TimeIn; interval.TimeOut = t.TimeOut; interval.RangeTimeIn = obligationRange.Start; interval.RangeTimeOut = obligationRange.End; } else { interval.TimeIn = t.TimeIn; interval.TimeOut = t.TimeOut; interval.Type = BiometryCalculatedDetailTimeType.NotValid; } list.Add(interval); } return(list); }
public List <BiometryCalculatedDetail> CompareAndJoin(DateTime fromDate, DateTime toDate, List <BiometricData> biometricData, ObligatedRange obligatedRange) { var totalDays = (toDate.Date - fromDate.Date).TotalDays; List <BiometryCalculatedDetail> data = new List <BiometryCalculatedDetail>(); var firstDay = fromDate; for (int i = 0; i < totalDays; i++) { var vm = new BiometryCalculatedDetail(); vm.Date = i == 0 ? fromDate : fromDate.AddDays(1); fromDate = vm.Date; // در کدام روز بازه موظفی قرار دارد ؟ ObligatedRangeWeeks whichDayInInterval = DetermineDate(firstDay, vm.Date, obligatedRange.ObligatedRangeWeeks); // بازه موظفی امروز را بده var obligatedRangeDayTimeses = whichDayInInterval.ObligatedRangeDayTimes.OrderBy(t => t.Start.Hour).ToList(); // تاریخ های بازه را به همان روزی می برد که میخواهیم مقایسه های ساعت هارا انجام دهیم for (var index = 0; index < obligatedRangeDayTimeses.Count; index++) { obligatedRangeDayTimeses[index].Start = new DateTime(vm.Date.Year , vm.Date.Month , vm.Date.Day , obligatedRangeDayTimeses[index].Start.TimeOfDay.Hours , obligatedRangeDayTimeses[index].Start.TimeOfDay.Minutes, obligatedRangeDayTimeses[index].Start.TimeOfDay.Seconds); var enddate = new DateTime(vm.Date.Year , vm.Date.Month , vm.Date.Day , obligatedRangeDayTimeses[index].End.TimeOfDay.Hours , obligatedRangeDayTimeses[index].End.TimeOfDay.Minutes, obligatedRangeDayTimeses[index].End.TimeOfDay.Seconds); // اگر بازه دو روزه ای باشد ، تاریخ پایان یک روز آن طرف تر می رود if (obligatedRangeDayTimeses[index].IsTwoDay) { enddate = enddate.AddDays(1); } obligatedRangeDayTimeses[index].End = enddate; } // کارکرد امروز را بده var workday = biometricData.FirstOrDefault(d => d.Date.Date == vm.Date.Date); if (workday == null) { // هیچ کارکردی نیست پس کل ان غیبت obligatedRangeDayTimeses.ForEach(o => vm.Times.Add( new BiometryCalculatedDetailTime { RangeTimeIn = o.Start, RangeTimeOut = o.End, TimeIn = o.Start, TimeOut = o.End, Absence = o.End - o.Start, Type = BiometryCalculatedDetailTimeType.Absence } )); CalculateTotalForADay(vm); data.Add(vm); continue; } // کارکرد دارد // کل حضور workday.BiometricDataTimes.Where(b => b.TimeIn.HasValue && b.TimeOut.HasValue).ForEach(b => vm.Total += b.TimeOut.Value - b.TimeIn.Value); //todo:exception for more than two days // تمامی رنج ساعت های حظور و عدم حظور List <DateTime?> intervals = IntervalHelper.ToOneOrderedTimeList(workday.BiometricDataTimes, obligatedRangeDayTimeses); // بازه های حظور و عدم حظور List <BiometryCalculatedDetailTime> calculatedIntervals = new List <BiometryCalculatedDetailTime>(); /*if (intervals.Count % 2 != 0) * { * throw new Exception("اشکال در سیستم تعداد بازه یافت شده زوج نیست"); * }*/ for (int j = 0; j < intervals.Count; j++) { if (j + 1 != intervals.Count) { ObligatedRangeDayTimes range = IntervalHelper.IsInRanges(intervals[j], intervals[j + 1], obligatedRangeDayTimeses); bool isInRange = range != null; BiometricDataTime biometricDataTime = IntervalHelper.IsInWorkTimes(intervals[j], intervals[j + 1], workday.BiometricDataTimes); bool isInWorkTimes = biometricDataTime != null; var detailTime = new BiometryCalculatedDetailTime { TimeIn = intervals[j], TimeOut = intervals[j + 1] }; // در ساعات بازه موظفی حضور دارد if (isInRange && isInWorkTimes) { switch (range.RangeType) { case RangeType.Normal: detailTime.Type = BiometryCalculatedDetailTimeType.Valid; break; case RangeType.Overtime: detailTime.Type = BiometryCalculatedDetailTimeType.Overtime; break; default: detailTime.Type = BiometryCalculatedDetailTimeType.Valid; break; } } // در ساعات موضفی حظور ندارد else if (isInRange && !isInWorkTimes) { detailTime.Type = BiometryCalculatedDetailTimeType.Absence; } // حظور دارد اما بازه موظفی نیست else if (!isInRange && isInWorkTimes) { detailTime.Type = BiometryCalculatedDetailTimeType.NotValid; } // نه حظور دارد و نه بازه موظفی است // این مورد نباید پیش بیاید چون تمامی زمان های محاسبه از بازه ها و کارکرد گرفته شده اند else if (!isInRange && !isInWorkTimes) { //throw new Exception("کاربر حضور ندارد و در رنج نیست"); // detailTime.Type = BiometryCalculatedDetailTimeType.NotValid; continue; } calculatedIntervals.Add(detailTime); } } var temp = vm.Times.ToList(); temp.AddRange(calculatedIntervals); vm.Times = temp; vm.BiometricData = workday; data.Add(vm); } return(data); }