示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }