Как проверить что рабочая смена закончилась, паттерн State
Реализую паттерн State, и не получается реализовать переход из состояния working в work end. Есть следующая сущность, которая определяет текущую смену (их две пока что: с 8:00 до 20:00, с 20:00 до 8:00). Проблема в том, что ночная смена начинается (условно) 15 числа, а заканчивается утром 16 числа, но дневная смена начинается 15 и заканчивается 15 числа
Структура определяет начало и конец рабочего дня, а метод GetWorkingTime возвращает более конкретное значение (например для start: 07.10.2022 8:00:00, end: 07.10.2022 20:00:00)
public readonly struct Work
{
public Work(TimeSpan start, TimeSpan end)
{
WorkStart = start;
WorkEnd = end;
}
public TimeSpan WorkStart { get; }
public TimeSpan WorkEnd { get; }
public (DateTime, DateTime) GetWorkingTime(DateTime date)
{
var start = date.Date.Add(WorkStart);
DateTime endDate;
//Проверка является ли текущая смена "ночной" и если является,
//то конец рабочего дня будет утром следующего дня.
if (WorkStart > WorkEnd && WorkStart > date.TimeOfDay)
{
endDate = date.Date.Add(WorkEnd).AddDays(1);
}
else
{
endDate = date.Date.Add(WorkEnd);
}
return (start, endDate);
}
}
Метод Next в WorkingState работает для ночной смены (с 20:00 до 8:00), но не работает для дневной смены (с 8:00 до 20:00) и я не знаю как правильно сделать условие чтобы оно корректно работало для любой смены.
class WorkingState : StateBase
{
public override void Next()
{
StateBase next = this;
//Текущее реальное состояние которое должно определить состояние next
var lastDate = Context.GetLastItemDate();
var workDates = Context.CurrentWorkshift.Work.GetWorkingTime(lastDate);
//workDates.Item1 - дата и время НАЧАЛА текущей смены
//workDates.Item2 - дата и время КОНЦА текущей смены
if ((lastDate.TimeOfDay >= workDates.Item2.TimeOfDay && lastDate.TimeOfDay <= workDates.Item1.TimeOfDay) ||
(lastDate >= workDates.Item2 && lastDate <= workDates.Item1))
{
nextState = new WorkEndState(Context);
}
}
}