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);
        }
        private void ValidateFirst(BiometryCalculatedDetail firstDay)
        {
            Assert.True(firstDay.TotalAbsence.Hours == 9);
            Assert.True(firstDay.TotalAbsence.Minutes == 0);
            Assert.True(firstDay.TotalAbsence.Seconds == 50);

            Assert.True(firstDay.TotalOvertime.Hours == 2);
            Assert.True(firstDay.TotalOvertime.Minutes == 0);
            Assert.True(firstDay.TotalOvertime.Seconds == 0);


            Assert.True(firstDay.InValid.Hours == 0);
            Assert.True(firstDay.InValid.Minutes == 30);
            Assert.True(firstDay.InValid.Seconds == 10);

            Assert.True(firstDay.TotalAbsence.Hours == 0);
            Assert.True(firstDay.TotalAbsence.Minutes == 30);
            Assert.True(firstDay.TotalAbsence.Seconds == 20);

            Assert.True(firstDay.TotalValid.Hours == 7);
            Assert.True(firstDay.TotalValid.Minutes == 29);
            Assert.True(firstDay.TotalValid.Seconds == 40);


            Assert.True(firstDay.Times.Count == 4);
        }
示例#3
0
        public BiometryCalculatedDetail CalculateTotal(List <BiometryCalculatedDetail> taradodInfo)
        {
            var bioDetail = new BiometryCalculatedDetail();

            foreach (var detail in taradodInfo)
            {
                bioDetail.Total         += detail.Total;
                bioDetail.TotalValid    += GetTotal(detail.Times, BiometryCalculatedDetailTimeType.Valid);
                bioDetail.TotalAbsence  += GetTotal(detail.Times, BiometryCalculatedDetailTimeType.Absence);
                bioDetail.InValid       += GetTotal(detail.Times, BiometryCalculatedDetailTimeType.NotValid);
                bioDetail.TotalOvertime += GetTotal(detail.Times, BiometryCalculatedDetailTimeType.Overtime);

                bioDetail.TotalStr         = EngineUtility.ConvertTimeSpanToStr(bioDetail.Total);
                bioDetail.TotalValidStr    = EngineUtility.ConvertTimeSpanToStr(bioDetail.TotalValid);
                bioDetail.TotalAbsenceStr  = EngineUtility.ConvertTimeSpanToStr(bioDetail.TotalAbsence);
                bioDetail.InValidStr       = EngineUtility.ConvertTimeSpanToStr(bioDetail.InValid);
                bioDetail.TotalOvertimeStr = EngineUtility.ConvertTimeSpanToStr(bioDetail.TotalOvertime);

                bioDetail.VacationStr    = EngineUtility.ConvertTimeSpanToStr(bioDetail.Vacation);
                bioDetail.HolidayWorkStr = EngineUtility.ConvertTimeSpanToStr(bioDetail.HolidayWork);
                bioDetail.MissionWorkStr = EngineUtility.ConvertTimeSpanToStr(bioDetail.MissionWork);
                bioDetail.NightWorkStr   = EngineUtility.ConvertTimeSpanToStr(bioDetail.NightWork);
                bioDetail.ShiftWorkStr   = EngineUtility.ConvertTimeSpanToStr(bioDetail.ShiftWork);

                /*bioDetail.DateStr =
                 *  Engine.Controllers.AbstractControllers.Utility
                 *      .ConvertToShamsiDate(bioDetail.Date, false, true);*/
                bioDetail.ShiftWorkStr = EngineUtility.ConvertTimeSpanToStr(bioDetail.ShiftWork);
            }

            return(bioDetail);
        }
示例#4
0
 private void CalculateTotalForADay(BiometryCalculatedDetail vm)
 {
     vm.Times.ForEach(t => vm.TotalValid    += t.Valid);
     vm.Times.ForEach(t => vm.TotalAbsence  += t.Absence);
     vm.Times.ForEach(t => vm.TotalOvertime += t.Overtime);
     vm.Times.ForEach(t => vm.TotalDelayIn  += t.DelayIn);
     vm.Times.ForEach(t => vm.TotalHurryOut += t.HurryOut);
 }
        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);
        }
示例#6
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);
        }