public VirtualMidNightList(Person _person, bool endOfDayIsForce, DateTime calcFromDate, DateTime calcToDate, IList <AssignedRuleParameter> ruleParameterList) { try { RuleParameterList = ruleParameterList; this.CalcFromDate = calcFromDate; this.CalcToDate = calcToDate; this.person = _person; EndOfDayIsForce = endOfDayIsForce; //{ // AssignedWGDShift assignWGD = (AssignedWGDShift)_person.GetShiftByDate(_person.CalcDateZone.FromDate); // if (assignWGD.Pairs.Count > 0) // { // ShiftPair fSpwd = assignWGD.Pairs.OrderBy(x => x.From).First(); // ShiftPair lSpwd = assignWGD.Pairs.OrderBy(x => x.From).Last(); // decimal lAfterTelorance = 0;// lSpwd.AfterTolerance; // int to = lSpwd.To + (int)lAfterTelorance; // if (to > DayMinutes) // { // to -= DayMinutes; // } // VirtualMidNight vmn = new VirtualMidNight(assignWGD.Date, to, fSpwd.BeforeTolerance, lSpwd.AfterTolerance); // _vmnList.Add(vmn); // } //} MidNightTimeSt midNightTime = this.GetMidNightTime(_person.CalcDateZone.FromDate); MidNightTimeSt beforeMidNight = new MidNightTimeSt() { Start = -1 }; MidNightTimeSt lastMidNight = null; foreach (DateTime CalcDate in _person.CalcDateZone) { try { beforeMidNight = midNightTime; midNightTime = this.GetMidNightTime(CalcDate); AssignedWGDShift tomorrowShift = (AssignedWGDShift)_person.GetShiftByDate(CalcDate.AddDays(1)); AssignedWGDShift todayShift = (AssignedWGDShift)_person.GetShiftByDate(CalcDate); if (todayShift.Pairs.Count > 0) { lastMidNight = (MidNightTimeSt)midNightTime.Clone(); //جلوگیری از تداخل نیمه شبهای مجازی شیفتهای متوالی //در حالت اول شبانه روز اول محدود میشود و در حالت دوم شبانه روز دوم را محدود میکنیم //مثال حالت اول مانند وقتی که روز اول دارای شیفت 23:50 تا +7:00 با پایان شبانه روز 20:00 باشد و روز دوم دارای شیفت 7:00 تا 17:00 با پایان شبانه روز 6:00 باشد //مثال حالت دوم مانند وقتی که روز اول دارای شیفت 7:00 تا +7:00 با پایان شبانه روز 7:00 باشد و روز دوم دارای شیفت 7:00 تا 17:00 با پایان شبانه روز 6:00 باشد // فرض بر این است که حالت دوم تنها در هنگام شیفت 24 ساعته بروز میکند و باید "تا" پایان شبانه روز شیفت مقدار بگیرد - در مثال بالا +7:00 میباشد if (beforeMidNight.Start > midNightTime.Start && (beforeMidNight.End - DayMinutes) < midNightTime.Start) { VirtualMidNight lastVmn = _vmnList.Last(); lastVmn.SecondMidLimit = midNightTime.Start - 1; } else if (beforeMidNight.Start > midNightTime.Start) { int end = beforeMidNight.End; if (end > DayMinutes) { end -= DayMinutes; } midNightTime.Start = end + 1; } VirtualMidNight vmn = GetMidNightOFShift(todayShift, midNightTime); _vmnList.Add(vmn); } else { //این بلاک بجای قسمت مربوط به درج نیمه شب در تعطیلات اضافه گردید VirtualMidNight vmn = new VirtualMidNight(); if (lastMidNight != null)//استفاده از روزهای قبل که شیفت داشته است و عدم استفاده از قانون پایان شبانه روز { vmn = new VirtualMidNight(CalcDate, lastMidNight.Start, lastMidNight.BeforeTelorance, lastMidNight.AfterTelorance); } else { vmn = new VirtualMidNight(CalcDate, midNightTime.Start, midNightTime.BeforeTelorance, midNightTime.AfterTelorance); } _vmnList.Add(vmn); //فقط وقتی بکار میآید که در روزهای متوالی شیفت داشته باشیم if (beforeMidNight.Start > 0) { midNightTime = (MidNightTimeSt)beforeMidNight.Clone(); } beforeMidNight.Start = -1; } } catch (Exception ex) { throw ex; } } //افزودن نیمه شب مجازی برای روزهایی که شیفت نداشته است //از 10 روز قبل شروع میکنیم تا برای اولین ترددها مشکلی ایجاد نشود #region without shift days if (_vmnList.Count > 0) { VirtualMidNight lastVmn = new VirtualMidNight(); _vmnList = _vmnList.OrderBy(x => x.DateTime).ToList(); DateTime startDate = _vmnList.First().Date.AddDays(-10); DateTime endDate = _vmnList.OrderBy(x => x.Date).Last().Date; for (DateTime dateCounter = startDate; dateCounter < endDate; dateCounter = dateCounter.AddDays(1)) { try { if (!_vmnList.Any(x => x.Date == dateCounter.Date)) { // VirtualMidNight vmn = new VirtualMidNight(dateCounter, midNightTime); //اگر روزی شیفت نداشت ما باید نیمه شب مجازی اضافه کنیم که همان روز را پوشش دهد(نیمه دوم )در //مورد مکان های مشترک اگر شخص در حال ورود بود باید نیمه شب مجازی دوم و اگر در حال خروج بود //باید نیمه شب مجازی اول به ان تعلق گیرد VirtualMidNight vmn = new VirtualMidNight(); if (_vmnList.Any(x => x.Date == dateCounter.Date.AddDays(1)) && _vmnList.Any(x => x.Date == dateCounter.Date.AddDays(-1)) && _vmnList.Where(x => x.Date == dateCounter.Date.AddDays(1)).First().Time == _vmnList.Where(x => x.Date == dateCounter.Date.AddDays(-1)).First().Time) { lastVmn = lastVmn = _vmnList.Where(x => x.Date == dateCounter.Date.AddDays(1)).First(); vmn = new VirtualMidNight(dateCounter, lastVmn.Time, lastVmn.BeforeTelorance, lastVmn.AfterTelorance); } if (_vmnList.Any(x => x.Date == dateCounter.Date.AddDays(-1))) { lastVmn = _vmnList.Where(x => x.Date == dateCounter.Date.AddDays(-1)).First(); vmn = new VirtualMidNight(dateCounter, lastVmn.Time, lastVmn.BeforeTelorance, lastVmn.AfterTelorance); } else { vmn = new VirtualMidNight(dateCounter, midNightTime.Start, midNightTime.BeforeTelorance, midNightTime.AfterTelorance); lastVmn = vmn; } _vmnList.Add(vmn); } } catch (Exception ex) { throw ex; } } _vmnList = _vmnList.OrderBy(x => x.DateTime).ToList(); } #endregion foreach (VirtualMidNight vmn in _vmnList) { vmn.DayPart = GetMainDayRegion(vmn, _person); } } catch (Exception ex) { throw ex; } }