private VirtualMidNight GetMidNightOFShift(AssignedWGDShift shift, MidNightTimeSt midNight) { try { VirtualMidNight result = new VirtualMidNight(); ShiftPair firstPair = shift.Pairs.OrderBy(x => x.From).First(); ShiftPair lastPair = shift.Pairs.OrderBy(x => x.From).Last(); int time = 0; DateTime date = new DateTime(); //فرض شده است که شیفت بهم چسبیده نداریم //برای شیفتی که انتهای آن فردا است if (lastPair.To > DayMinutes && lastPair.To > midNight.Start && !EndOfDayIsForce) { date = shift.Date; time = lastPair.To;//+ (int)lAfterTelorance1; result = new VirtualMidNight(date, time, firstPair.BeforeTolerance, lastPair.AfterTolerance); } result = new VirtualMidNight(shift.Date, midNight.Start, midNight.BeforeTelorance, midNight.AfterTelorance); return(result); } catch (Exception ex) { throw ex; } }
public virtual object Clone() { MidNightTimeSt obj = new MidNightTimeSt(); obj.AfterTelorance = this.AfterTelorance; obj.BeforeTelorance = this.BeforeTelorance; obj.End = this.End; obj.Start = this.Start; return(obj); }
/// <summary> /// در صورتی که شروع و پایان شبانه روز در شیفت مشخص شده باشد آنرا جداگانه /// برمیگرداند در غیر این صورت شروع و پایان یکسان برمیگرداند /// </summary> /// <param name="date"></param> /// <returns></returns> private MidNightTimeSt GetMidNightTime(DateTime date) { MidNightTimeSt st = new MidNightTimeSt(); BaseShift shift = this.person.GetShiftByDate(date, "EndOfDay"); date = date.Date; st.Start = st.End = DayMinutes - 1; if (shift != null && shift.PairCount > 0) { st.Start = shift.Pairs.First().From; st.End = shift.Pairs.First().To; st.BeforeTelorance = shift.Pairs.First().BeforeTolerance; st.AfterTelorance = shift.Pairs.First().AfterTolerance; if (st.End - st.Start < 2) { st.End = st.Start; } } else { if (this.person.AssignedRuleList != null) { AssignedRule ar = this.person.AssignedRuleList.Where(x => x.FromDate <= date && x.ToDate >= date && x.IdentifierCode == 1015).FirstOrDefault(); if (ar != null) { IList <AssignedRuleParameter> asp = RuleParameterList.Where(x => x.RuleId == ar.RuleId && x.FromDate <= date && x.ToDate >= date).ToList(); if (asp != null) { AssignedRuleParameter firstParam = asp.Where(x => x.Name.ToLower().Equals("first")).FirstOrDefault(); if (firstParam != null) { st.Start = st.End = Utility.ToInteger(firstParam.Value); } } } } } return(st); }
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; } }