Пример #1
0
        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;
            }
        }