public void TestPersonnelWorkDetail()
        {
            var fakeBiometricRepository = new FakeBiometricRepository();

            fakeBiometricRepository.init();

            var c = new PersonnelTaradodInfoService();

            var personnelId   = fakeBiometricRepository.personnel.Id;
            var fromDate      = DateTime.Now.AddDays(-1);
            var toDate        = DateTime.Now.AddDays(1);
            var biometricData = c.GetBiometricData(personnelId, fromDate, toDate);

            var tmpday = DateTime.Now.AddDays(2);

            Assert.DoesNotContain(biometricData, b => b.Date > tmpday);


            ObligatedRange obligatedRange = c.GetObligatedRange(personnelId);

            Assert.NotNull(obligatedRange);
            Assert.True(obligatedRange.ObligatedRangeWeeks.Count >= 7);

            List <BiometryCalculatedDetail> taradodInfo = c.CompareAndJoin(fromDate, toDate, biometricData, obligatedRange);

            //   Assert.True(taradodInfo.Count==biometricData.Count());


            BiometryCalculatedDetail total = c.CalculateTotal(taradodInfo);
        }
        public void init()
        {
            using (var db = new EngineContext())
            {
                var workgroup = new WorkGroup
                {
                    Name = "شیفت کار عادی",
                };
                db.WorkGroups.Add(workgroup);

                personnel = new Personnel
                {
                    Name     = "mohammad",
                    LastName = "Jafaryan",
                };
                db.Personnels.Add(personnel);

                var machine = new Machine
                {
                    Name = "Samsung"
                };
                db.Machines.Add(machine);


                var machineperson = new PersonnelMachine
                {
                    Machine   = machine,
                    Personnel = personnel
                };
                db.PersonnelMachines.Add(machineperson);

                var obligaterange = new ObligatedRange
                {
                    Name   = "شیف کار",
                    OffDay = DayOfWeek.Friday,
                    ObligatedRangeWeeks = GetWeek()
                };
                db.ObligatedRanges.Add(obligaterange);

                SetTimesShift(obligaterange.ObligatedRangeWeeks.ToList());

                var bio = GetBiometryData(machineperson);
                db.BiometricDatas.Add(bio);


                var workgroupRange = new WorkGroupObligatedRange
                {
                    ObligatedRange = obligaterange,
                    WorkGroup      = workgroup
                };


                db.WorkGroupObligatedRanges.Add(workgroupRange);


                db.SaveChanges();
            }
        }
        public ObligatedRange GetNewObligatedRange()
        {
            var obligatedRangeWeeks = GetWeek(1);
            var w2 = GetWeek(2);
            var w3 = GetWeek(3);

            obligatedRangeWeeks.AddRange(w2);
            obligatedRangeWeeks.AddRange(w3);
            var obligaterange = new ObligatedRange
            {
                Name   = "شیف کار",
                OffDay = DayOfWeek.Friday,
                ObligatedRangeWeeks = obligatedRangeWeeks
            };

            return(obligaterange);
        }
        public void MultiWeekPersonnelTaradodTestDetail()
        {
            // ایجاد دیتای فیک
            var fakeBiometricRepository = new MultiWeekFakeBiometricRepository();

            fakeBiometricRepository.init();



            // اطلاعات از تاریخ تا تاریخ را بده برای پرسنل خاص
            var c             = new PersonnelTaradodInfoService();
            var personnelId   = fakeBiometricRepository.personnel.Id;
            var fromDate      = DateTime.Now;
            var toDate        = DateTime.Now.AddDays(15);
            var biometricData = c.GetBiometricData(personnelId, fromDate, toDate);


            // بازه موظفی شخص
            ObligatedRange obligatedRange = c.GetObligatedRange(personnelId);

            Assert.NotNull(obligatedRange);
            Assert.True(obligatedRange.ObligatedRangeWeeks.Count >= 14);


            // محاسبه اطلاعات
            List <BiometryCalculatedDetail> taradodInfo = c.CompareAndJoin(fakeBiometricRepository.workgroupRange.DateTime.Value, toDate, biometricData, obligatedRange);

            // روز اول
            var firstDay = taradodInfo.ElementAt(1);

            /*ValidateFirst(firstDay);
             *
             * var nineDay=taradodInfo.ElementAt(9);
             * ValidateNine(nineDay);*/


            //   Assert.True(taradodInfo.Count==biometricData.Count());


            // محاسبه جمع
            BiometryCalculatedDetail total = c.CalculateTotal(taradodInfo);
        }
示例#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);
        }
        public void init()
        {
            using (var db = new EngineContext())
            {
                var workgroup = new WorkGroup
                {
                    Name = "شیفت چهار هفته ای",
                };
                db.WorkGroups.Add(workgroup);

                personnel = new Personnel
                {
                    Name     = "بهزاد",
                    LastName = "خوشاوند",
                };
                db.Personnels.Add(personnel);

                var machine = new Machine
                {
                    Name = "Samsung"
                };
                db.Machines.Add(machine);


                var machineperson = new PersonnelMachine
                {
                    Machine   = machine,
                    Personnel = personnel
                };
                db.PersonnelMachines.Add(machineperson);


                var w1 = GetWeek(1); //روزکار
                var w2 = GetWeek(2); //شب کار

                SetDayShifts(w1);
                SetNightShifts(w2);

                var obligatedRangeWeeks = w1;
                obligatedRangeWeeks.AddRange(w2);
                var obligaterange = new ObligatedRange
                {
                    Name   = "شیف کار",
                    OffDay = DayOfWeek.Friday,
                    ObligatedRangeWeeks = obligatedRangeWeeks
                };
                db.ObligatedRanges.Add(obligaterange);

                // SetTimesShift(obligaterange.ObligatedRangeWeeks.ToList());

                DateTime date;
                var      bio    = GetBiometryDataDays(machineperson, out date);
                var      nights = GetBiometryDataNights(machineperson, date);

                db.BiometricDatas.AddRange(bio);
                db.BiometricDatas.AddRange(nights);


                var workgroupRange = new WorkGroupObligatedRange
                {
                    ObligatedRange = obligaterange,
                    WorkGroup      = workgroup,
                    DateTime       = DateTime.Now
                };


                this.workgroupRange = workgroupRange;

                db.WorkGroupObligatedRanges.Add(workgroupRange);


                db.SaveChanges();
            }
        }