protected override async Task HandleCore(GenerateScheduleCommand request) { //In more complex scenario we can introduce repository and UOW to be able to inject them // sample of UOW + repos can be found here https://github.com/Boychenko/sample-todo/tree/master/server/Core //and add tests to handlers but often there are should pretty simple logic var engineers = await _context.Engineers.ToListAsync(); var lastDueDateEntries = await _context.ScheduleEntries .OrderByDescending(e => e.Date) .Take(Constants.ShiftsPerDay) .ToListAsync(); var generationRequest = new ScheduleGenerationRequest { Engineers = engineers, LastDueDayEntries = lastDueDateEntries, Date = DateTime.Today }; var result = _scheduleGenerator.GenerateSchedule(generationRequest); if (result.Any()) { foreach (var entry in result) { _context.Add(entry); } await _context.SaveChangesAsync(); } }
public List <ScheduleEntry> GenerateSchedule(ScheduleGenerationRequest request) { var date = request.Date; //var week = WorkingWeek.GetThisOrUpcoming(date); var week = new WorkingWeek(date); var lastDueDayEntries = request.LastDueDayEntries; var lastEntryDate = lastDueDayEntries.LastOrDefault()?.Date; if (!date.IsWeekDay() || week.Contains(lastEntryDate)) { week = week.GetNext(); } if (lastEntryDate.HasValue) { //if week have entries or future entries exists just exit if (!week.IsAfter(lastEntryDate)) { return(new List <ScheduleEntry>()); } //entries is too old to consider var previousWeek = week.GetPrevious(); if (!previousWeek.Contains(lastEntryDate)) { lastDueDayEntries = new List <ScheduleEntry>(); } } var result = GenerateSchedule(request.Engineers, week, lastDueDayEntries); if (week.Contains(date)) //first call was for current week let generate one more { result.AddRange( GenerateSchedule( request.Engineers, week.GetNext(), result.TakeLast(Constants.ShiftsPerDay).ToList())); } return(result); }