Exemple #1
0
        /// <summary>
        ///     Create a new schedule from a given day.
        ///     Some demo settings are in place here.
        /// </summary>
        /// <param name="scheduleRequest">Parameters for the search</param>
        /// <returns>Scheduled shifts</returns>
        public async Task <ScheduleDto> GetNewScheduleAsync(ScheduleRequestDto scheduleRequest)
        {
            // Get team members from repository
            var teamMembers = await _employeeRepository.QueryNoTracking()
                              .Where(w => w.IsActive)                  // Active ones for next schedule
                              .OrderBy(c => new Random().Next())       // Shuffle staff order
                              .Take(scheduleRequest.NumberOfEmployees) // we take a number from all employees in demo
                              .ToListAsync();

            // Get transition set rules from repository
            var transitionSet = await _transitionSetRepository.QueryNoTracking()
                                .Where(w => w.Id == scheduleRequest.TransitionSetId && w.IsActive) // active transition set
                                .FirstOrDefaultAsync();

            // We only have that number of employees
            if (teamMembers.Count < scheduleRequest.NumberOfEmployees)
            {
                throw new ArgumentOutOfRangeException($"Invalid number of employees for scheduling.");
            }

            // Check we have the active transition set
            if (transitionSet == null)
            {
                throw new ArgumentOutOfRangeException($"Invalid transition set defined.");
            }

            var ruleSet = TransitionSet.FromRuleSetString(transitionSet.Name, transitionSet.RuleSetString).RuleSet;

            // Take 5 solutions as a demo result
            var schedules = await _teamShiftScheduler.CreateNewScheduleAsync(ruleSet, teamMembers, scheduleRequest.StartDate.Date,
                                                                             scheduleRequest.Days, scheduleRequest.TeamSize, scheduleRequest.MinShiftsPerCycle,
                                                                             scheduleRequest.StartHour, scheduleRequest.ShiftHours, 5);

            // Play with results for demo
            if (schedules.Count > 0)
            {
                return(ScheduleDto.FromEntity(schedules[new Random().Next(schedules.Count)], GetLatestStatistics()));
            }

            // Return default with statistics on model error
            return(new ScheduleDto()
            {
                Statistics = GetLatestStatistics(), Error = GetLatestError()
            });

            // Or just return first.
            // return ScheduleToDto(schedules.FirstOrDefault());
        }
Exemple #2
0
        public async Task ReturnsDemoSchedule()
        {
            var startDate = DateTime.SpecifyKind(Utils.GetNextWeekday(DateTime.Now, DayOfWeek.Monday), DateTimeKind.Unspecified);

            var request = new ScheduleRequestDto()
            {
                TransitionSetId   = 1,
                StartDate         = startDate,
                Days              = 14,
                MinShiftsPerCycle = 2,
                NumberOfEmployees = 10,
                ShiftHours        = 12,
                StartHour         = 7,
                TeamSize          = 2,
            };
            var byteContent = new ByteArrayContent(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(request)));

            byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

            var response = await _client.PostAsync("/v1/schedules", byteContent);

            response.EnsureSuccessStatusCode();

            var webResponse = await response.Content.ReadAsStringAsync();

            var schedules = JsonConvert.DeserializeObject <ScheduleDto>(webResponse);

            Assert.NotNull(schedules.Name);
            Assert.NotNull(schedules.Statistics);

            Assert.Equal(startDate.Date, schedules.StartDate);
            Assert.Equal(startDate.AddDays(14).Date, schedules.EndDate);

            Assert.Equal(140, schedules.Shifts.Count());
            foreach (var shift in schedules.Shifts)
            {
                Assert.NotNull(shift.Employee);
                //...
            }
        }
 public async Task <ScheduleDto> Get([FromBody] ScheduleRequestDto request)
 {
     // Generating a sample schedule for demo purposes
     return(await _schedulerService.GetNewScheduleAsync(request));
 }