private static List <BiometryCalculatedDetailTime> RemoveFromRangeAndGetRemain( BiometryCalculatedDetailTime remain , List <BiometryCalculatedDetailTime> allWorkTimesInRange) { List <BiometryCalculatedDetailTime> _remain = new List <BiometryCalculatedDetailTime>(); List <BiometryCalculatedDetailTime> intervals = new List <BiometryCalculatedDetailTime>(); _remain.Add(remain); foreach (var detailTime in allWorkTimesInRange) { foreach (var rm in _remain.ToList()) { var res = IntervalHelperDepricated.RemoveInterval(detailTime, rm); intervals.AddRange(res); if (res.Count > 0) { _remain.Remove(rm); } _remain.AddRange(intervals.Where(i => i.Type == BiometryCalculatedDetailTimeType.NotValid || i.Type == BiometryCalculatedDetailTimeType.HurryUp || i.Type == BiometryCalculatedDetailTimeType.Delay || i.Type == BiometryCalculatedDetailTimeType.Absence || i.Type == BiometryCalculatedDetailTimeType.Overtime).ToList()); intervals = intervals.Where(i => i.Type == BiometryCalculatedDetailTimeType.Valid).ToList(); } } return(intervals); }
public static List <BiometryCalculatedDetailTime> CompareAndGetIntervals(ICollection <BiometricDataTime> workdayTimes, List <ObligatedRangeDayTimes> obligationRanges) { List <BiometryCalculatedDetailTime> allWorkDayTimes = new List <BiometryCalculatedDetailTime>(); foreach (var obligationRange in obligationRanges) { List <BiometryCalculatedDetailTime> allWorkTimesInRange = IntervalHelperDepricated.GetAllRelatdIntervals(obligationRange, workdayTimes); BiometryCalculatedDetailTime remain = IntervalHelperDepricated.ToInterval(obligationRange); var res = IntervalHelperDepricated.RemoveFromRangeAndGetRemain(remain, allWorkTimesInRange); allWorkDayTimes.AddRange(res); } return(allWorkDayTimes); }
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); }
public static List <BiometryCalculatedDetailTime> RemoveInterval(BiometryCalculatedDetailTime detailTime, BiometryCalculatedDetailTime remain) { List <BiometryCalculatedDetailTime> generated = new List <BiometryCalculatedDetailTime>(); //تایم ورود و خروج و بازه برابر if (detailTime.TimeIn == remain.TimeIn && detailTime.TimeOut == remain.TimeOut) { detailTime.Type = BiometryCalculatedDetailTimeType.Valid; generated.Add(detailTime); } BiometryCalculatedDetailTime bigger; BiometryCalculatedDetailTime small; // detailTime is bigger //کارکرد بزرگتر از بازه if (detailTime.TimeIn <= remain.TimeIn && detailTime.TimeOut >= remain.TimeOut) { bigger = detailTime; small = remain; var s1 = new BiometryCalculatedDetailTime { TimeIn = bigger.TimeIn, TimeOut = small.TimeIn, Type = BiometryCalculatedDetailTimeType.HurryUp }; var s2 = new BiometryCalculatedDetailTime { TimeIn = small.TimeOut, TimeOut = bigger.TimeOut, Type = BiometryCalculatedDetailTimeType.Overtime }; if (s1.TimeIn != s1.TimeOut) { generated.Add(s1); } generated.Add(small); if (s2.TimeIn != s2.TimeOut) { generated.Add(s2); } } // remain is bigger // بازه بزرگ تر از کارکرد else if (remain.TimeIn <= detailTime.TimeIn && remain.TimeOut >= detailTime.TimeOut) { bigger = remain; small = detailTime; //قبل - ورود var s1 = new BiometryCalculatedDetailTime { TimeIn = bigger.TimeIn, TimeOut = small.TimeIn, Type = BiometryCalculatedDetailTimeType.Delay }; // بعد - خروج var s2 = new BiometryCalculatedDetailTime { TimeIn = small.TimeOut, TimeOut = bigger.TimeOut, Type = BiometryCalculatedDetailTimeType.HurryUp }; if (s1.TimeIn != s1.TimeOut) { generated.Add(s1); } generated.Add(small); if (s2.TimeIn != s2.TimeOut) { generated.Add(s2); } } // timein bewteen in and out is bigger // ورودی یا خروجی بازه موظفی کوچک در داخل بازه کارکرد قرار دارد else if (detailTime.TimeIn <= remain.TimeIn && detailTime.TimeOut >= remain.TimeIn) { //قبل - ورود var s1 = new BiometryCalculatedDetailTime { TimeIn = remain.TimeIn, TimeOut = detailTime.TimeOut, Type = BiometryCalculatedDetailTimeType.Valid }; // بعد - خروج var s2 = new BiometryCalculatedDetailTime { TimeIn = detailTime.TimeIn, TimeOut = remain.TimeIn, Type = BiometryCalculatedDetailTimeType.NotValid }; // بعد - خروج var s3 = new BiometryCalculatedDetailTime { TimeIn = detailTime.TimeOut, TimeOut = remain.TimeOut, Type = BiometryCalculatedDetailTimeType.Absence }; generated.Add(s1); if (s3.TimeIn != s3.TimeOut) { generated.Add(s3); } if (s2.TimeIn != s2.TimeOut) { generated.Add(s2); } } else if (detailTime.TimeIn <= remain.TimeOut && detailTime.TimeOut >= remain.TimeOut) { //قبل - ورود var s1 = new BiometryCalculatedDetailTime { TimeIn = remain.TimeIn, TimeOut = detailTime.TimeIn, Type = BiometryCalculatedDetailTimeType.NotValid }; // بعد - خروج var s2 = new BiometryCalculatedDetailTime { TimeIn = detailTime.TimeIn, TimeOut = remain.TimeOut, Type = BiometryCalculatedDetailTimeType.Valid }; // بعد - خروج var s3 = new BiometryCalculatedDetailTime { TimeIn = remain.TimeOut, TimeOut = detailTime.TimeOut, Type = BiometryCalculatedDetailTimeType.Absence }; if (s1.TimeIn != s1.TimeOut) { generated.Add(s1); } generated.Add(s3); if (s2.TimeIn != s2.TimeOut) { generated.Add(s2); } } else { } return(generated); }