{{tag>Инвентаризация dev}} ====== Инвентаризация: 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** - неограниченные по размеру заметки ==== И как это все связано ==== попробуем зарисовать {{drawio>инвентаризация:расписания:diagram1.png}} ==== Определение расписания на дату ==== {{drawio>инвентаризация:расписания:diagram2.png}} {{drawio>инвентаризация:расписания:diagram3.png}}