Esempio n. 1
0
        private bool CanWorkMinTotalWorkTime(Person person, Demand demand, int today)
        {
            var totalWorkTime            = person.State.TotalWorkTime + demand.Shift.Duration;
            var remaingingDays           = _model.SchedulePeriod.ExclusiveEnd - today;
            var maxPossibleTotalWorkTime = totalWorkTime + remaingingDays * _longestShift.Duration;

            if (maxPossibleTotalWorkTime < person.WorkSchedule.MinTotalWorkTime)
            {
                return(true);
            }
            if (totalWorkTime >= person.WorkSchedule.MinTotalWorkTime)
            {
                return(true);
            }
            if (today == _model.SchedulePeriod.End)
            {
                return(totalWorkTime >= person.WorkSchedule.MinTotalWorkTime);
            }

            var originalState       = person.State.Clone();
            var originalAssignments = person.Assignments.Clone();

            person.Assignments.Add(today, new Assignment(person, today, demand.Shift));
            var canWorkMinTotalWorkTime = false;

            foreach (var day in Range.Of(today + 1, _model.SchedulePeriod.End))
            {
                _stateCalculator.RefreshState(person, day);

                if (person.State.TotalWorkTime >= person.WorkSchedule.MinTotalWorkTime)
                {
                    canWorkMinTotalWorkTime = true;
                    break;
                }

                if (_workEligibilityChecker.CanWorkOnDay(person, day))
                {
                    person.Assignments.Add(day, new Assignment(person, day, _longestShift));
                }
            }

            _stateCalculator.RefreshState(person, _model.SchedulePeriod.End);
            canWorkMinTotalWorkTime = person.State.TotalWorkTime >= person.WorkSchedule.MinTotalWorkTime;

            person.State       = originalState;
            person.Assignments = originalAssignments;

            return(canWorkMinTotalWorkTime);
        }
 protected List <Person> SelectPeopleForDay(int day)
 => _model.People
 .Where(p => _workEligibilityChecker.CanWorkOnDay(p, day))
 .ToList();