/// <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()); }
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)); }