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