Инвентаризация: DEV: Расписания
Для себя схема работы класса расписаний, чтобы была дока и не запутаться
- Расписания не в курсе про часовой пояс. Т.е. все они живут в одном поясе
- Расписание только недельное. Нет вариантов «каждый 3й день начиная с даты». Нет варианта «каждый 2й вторник месяца». Такое нужно реализовывать дополнительным движком и пока не нужно
- Расписание на день может залезать на следующий день: 22:00-06:00
- Объявленное расписание на день (то что удобно читать) и реальное расписание (то что реально надо проверять) на день отличаются (т.к. часть того что мы объявили может уходить на следующий день и обрезается, а часть сегодняшнего расписания может прилетать с предыдущего дня).
- В описании функций желательно подписывать:
- Учитывает ли функция наличие у расписания границ действия
- Учитывает ли функция наличие у расписания родителей
- Учитывает ли функция наличие у расписания перекрытий (периодов когда всё расписание на неделю меняется)
- Учитывает ли дни-исключения
- Учитывает ли периоды-исключения
- Возвращает данные в читаемом виде (22:00-06:00) или в рабочем (00:00-06:00,22:00-23:59)
Schedules
Класс расписания
- id - ключ
- parent_id - родительское расписание
- override_id - перекрываемое расписание (это расписание является периодом-исключением в другом расписании)
- name - ну как-то без имени не получается
- start_date - дата начала действия расписания
- end_date - дата окончания действия расписания
- description - короткое пояснение
- history - неограниченные по размеру заметки
Ну а где собственно время то?. Ниже
Schedules Entries
Запись в расписание. Может представлять из себя
- расписание на каждый день
- расписание на день недели
- расписание на дату
- период рабочего/нерабочего времени с даты-времени1 до даты-времени2
для этого у нас есть такие поля
- id - ключ
- schedule_id - к какому расписанию запись
- date - дата на которую делается запись времени работы. может иметь значение
- def - расписание на каждый день
- 1-7 - день недели начиная с понедельника
- YYYY-MM-DD - расписание на конкретную дату
- YYYY-MM-DD HH:MM:SS - начало периода неработоспособности (или наоборот включения работы), если эта запись не расписание на день, а запись о «периоде» непрерывной работы/отключения (is_period)
- date_end - окончание периода работы/неработоспособности (если is_period)
- schedule - текстовое расписание в формате HH:MM-HH:MM,HH:MM-HH:MM.
Также к каждому периоду работы можно добавлять «метаданные» в JSON формате, например: 08:00-12:30{«user»:«musaev.al»},12:30-17:00{«user»:«bardina.m»}.
потом можно будет через API запрашивать текущие (из активного в настоящее время интервала) метаданные из расписания Х или метаданные за период который будет активен следующим (если сейчас нерабочее время)
Отдельным валидным значением является прочерк/минус «-», означающий что в этот день рабочего времени нет. - is_period - флаг того что эта запись не расписание на день, а период включения/выключения
- is_work - переключатель типа периода (рабочий/нерабочий), если выставлен is_period
- comment - коротенький камент к записи
- history - неограниченные по размеру заметки
И как это все связано
попробуем зарисовать
Определение расписания на дату