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);
            }
        }
예제 #2
0
 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);
            }
        }
예제 #4
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);
        }
예제 #5
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);
        }