コード例 #1
0
        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();
            }
        }
コード例 #2
0
        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);
        }