Ejemplo n.º 1
0
        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;
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// مشخص سازی قسمت اصلی بازه با توجه به شیفت
        /// </summary>
        /// <param name="vmn"></param>
        /// <param name="_person"></param>
        public FirstOrSecond GetMainDayRegion(VirtualMidNight vmn, Person _person)
        {
            if (vmn.SecondMid.Length == 0)
            {
                return(FirstOrSecond.First);
            }
            if (vmn.FirstMid.Length == 0)
            {
                return(FirstOrSecond.Second);
            }


            DateTime firstRegDate  = vmn.FirstMid.Date;
            DateTime secondRegDate = vmn.SecondMid.Date;

            AssignedWGDShift shift1 = (AssignedWGDShift)_person.GetShiftByDate(firstRegDate);
            AssignedWGDShift shift2 = (AssignedWGDShift)_person.GetShiftByDate(secondRegDate);

            if (shift1.PairCount > 0 && shift2.PairCount > 0)
            {
                if (HasIntersect(shift1, vmn.FirstMid))
                {
                    return(FirstOrSecond.First);
                }
                else if (HasIntersect(shift2, vmn.SecondMid))
                {
                    return(FirstOrSecond.Second);
                }
            }
            else if (shift2.PairCount == 0)
            {
                return(FirstOrSecond.First);
            }
            else if (shift1.PairCount == 0)
            {
                return(FirstOrSecond.Second);
            }

            return(FirstOrSecond.First);
        }
Ejemplo n.º 3
0
        public VirtualMidNight GetMidNight(DateTime date, int time, bool enter, bool applyMidNightTelorance)
        {
            if (time < 0)
            {
                time += DayMinutes;
            }
            List <VirtualMidNight> vmnList;
            VirtualMidNight        tmpVmn = new VirtualMidNight(date, time);

            if (applyMidNightTelorance)
            {
                vmnList = _vmnList
                          .Where(x => (x.FirstMid.StartDateTime.AddMinutes(-1 * x.BeforeTelorance) <= tmpVmn.DateTime &&
                                       x.FirstMid.EndDateTime >= tmpVmn.DateTime)
                                 ||
                                 (x.SecondMid.IsNotEmpty && x.SecondMid.StartDateTime <= tmpVmn.DateTime &&
                                  x.SecondMid.EndDateTime /*.AddMinutes(x.AfterTelorance)*/ >= tmpVmn.DateTime)
                                 ).ToList();
            }
            else
            {
                vmnList = _vmnList
                          .Where(x => (x.FirstMid.StartDateTime <= tmpVmn.DateTime &&
                                       x.FirstMid.EndDateTime >= tmpVmn.DateTime)
                                 ||
                                 (x.SecondMid.IsNotEmpty && x.SecondMid.StartDateTime <= tmpVmn.DateTime &&
                                  x.SecondMid.EndDateTime >= tmpVmn.DateTime)
                                 ).ToList();
            }
            if (!EndOfDayIsForce)
            {
                //تکرار با اعمال تلورانس
                //falat 00086011 1388/2/11 عامل ایجاد این کار بود

                if (vmnList.Count == 0)
                {
                    int telorance = HourTelorance;
                    if (enter)
                    {
                        vmnList = _vmnList
                                  .Where(x => (x.FirstMid.StartDateTime.AddHours(telorance) <= tmpVmn.DateTime &&
                                               x.FirstMid.EndDateTime >= tmpVmn.DateTime)
                                         ||
                                         (x.SecondMid.IsNotEmpty && x.SecondMid.StartDateTime <= tmpVmn.DateTime &&
                                          x.SecondMid.EndDateTime >= tmpVmn.DateTime)
                                         ).ToList();
                    }
                    else
                    {
                        vmnList = _vmnList
                                  .Where(x => (x.FirstMid.StartDateTime <= tmpVmn.DateTime &&
                                               x.FirstMid.EndDateTime >= tmpVmn.DateTime)
                                         ||
                                         (x.SecondMid.IsNotEmpty && x.SecondMid.StartDateTime <= tmpVmn.DateTime &&
                                          x.SecondMid.EndDateTime.AddHours(telorance) >= tmpVmn.DateTime)
                                         ).ToList();
                    }
                }
            }

            vmnList = vmnList.OrderBy(x => x.FirstMid.StartDateTime).ToList();

            if (vmnList.Count > 0)
            {
                if (vmnList.Count == 0 && !enter)
                {
                    vmnList.Add(tmpVmn);
                }
                if (enter)
                {
                    return(vmnList.Last());
                }
                else
                {
                    return(vmnList.First());
                }
            }

            int midNightTime = this.GetMidNightTime(date).Start;

            return(new VirtualMidNight(date, midNightTime, 0, 0));
        }
Ejemplo n.º 4
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;
            }
        }