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); }
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); }
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); }
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); }