Инструмент для операций над графиком работ магазина.
Добавить в composer.json
:
{
"repositories": {
"schedule-expression": {
"type": "vcs",
"url": "[email protected]:andrew-svirin/schedule-expression.git"
}
}
}
Выполнить:
$ composer require andrew-svirin/schedule-expression:^1
- кодирование и декодирование выражения графика работ для организации
- редактирование графиков работ
- оценивание кодированного выражения графика работ для организации на статус работы и следующую дату работы
Выражение (Expression)
Выражение графика работ для организации.
Состоит из списка графиков работ.
Пример:H * 08.03.2021 *;W 10:00-17:30 * 1-5
График работ (Schedule)
Регулярно повторяющееся правило, описывающее единичный график работ.
Состоит из упорядоченных полей.
Пример:H * 08.03.2021 *
Поле (Field)
Простое повторяющееся правило для определеннного временного значения (времени, даты, дня недели).
Пример:*
илиH
или10:00-17:30
Значение графика работ (ScheduleValue)
Композиция из значений полей, предназначенная для сравнения с графиком работ, либо для выражения следующего значения.
Значение поля (FieldValue)
Простое значение которое используется для сравнения с полем либо для выражения следующего значения.
Type = W|D|H
Time = mm:hh-mm:hh
Date = j.n|j.n-j.n
Day_of_Week = N|N-N
Название | Приоритет | Type | Time | Date | Day_of_Week |
---|---|---|---|---|---|
Еженедельный график | 0 | W | ? | * | ? |
Специальный график для даты | 1 | D | ? | ? | * |
Праздники | 2 | H | * | ? | * |
Больше примеров прменения можно найти в папке tests\Functional
Перед сохранением в БД график работ следует закодировать в строку.
Ниже пример того, как добавить графики работ к общему выражению графика работ организации.
$sc = ScheduleExpression::create();
// Выходные с 01.01.2021 по 07.01.2021
$schedule1 = $sc->scheduleCreator()->createHoliday()
->setFromDate(1, 1, 2021)
->setToDate(7, 1, 2021);
// Выходной 08.03.2021
$schedule2 = $sc->scheduleCreator()->createHoliday()
->setDate(8, 3, 2021);
// Рабочие дни с Понедельника по Пятницу с 10:00 по 17:30
$schedule3 = $sc->scheduleCreator()->createDayOfWeek()
->setFromDayOfWeek(1)
->setToDayOfWeek(5)
->setFromTime(10)
->setToTime(17, 30);
// Рабочий день в Субботу с 11:00 по 16:00
$schedule4 = $sc->scheduleCreator()->createDayOfWeek()
->setDayOfWeek(6)
->setFromTime(11)
->setToTime(16);
// Особый распорядок дня с 15.05.2021-18.06.2021 с 10:00 по 18:00
$schedule5 = $sc->scheduleCreator()->createDayOfMonth()
->setFromDate(15, 5, 2021)
->setToDate(18, 6, 2021)
->setFromTime(10)
->setToTime(18);
// Особый распорядок дня 20.06.2021 с 10:00 по 18:00
$schedule6 = $sc->scheduleCreator()->createDayOfMonth()
->setDate(20, 6, 2021)
->setFromTime(10)
->setToTime(18);
// Создаем выражение из графиков работ
$expression = $sc->expressionCreator()->create()
->addSchedule($schedule1)
->addSchedule($schedule2)
->addSchedule($schedule3)
->addSchedule($schedule4)
->addSchedule($schedule5)
->addSchedule($schedule6);
// Проверка и обработка ошибок выражения.
$isValid = $sc->validator()->validateAndReturnResult($expression)->hasErrors();
$encodedExpression = $sc->encoder()->encode($expression);
// Результат:
// H * 01.01.2021-07.01.2021 *;H * 08.03.2021 *;W 10:00-17:30 * 1-5;
// W 11:00-16:00 * 6;D 10:00-18:00 15.05.2021-18.06.2021 *;
// D 10:00-18:00 20.06.2021 *
Для редактирования и последующего сохранения выражения графика работ для организации необходимо выполнить декодирование.
$sc = ScheduleExpression::create();
$encodedExpression = 'H * 01.01.2021-07.01.2021 *;H * 08.03.2021 *;W 10:00-17:30 * 1-5;';
$expression = $sc->decoder()->decode($encodedExpression);
// Редактируем выражение графика работ для организации
/* @var \AndrewSvirin\ScheduleExpression\Domain\Schedule\HolidaySchedule $schedule1 */
$schedule1 = $expression->getSchedules()[1];
$schedule1->setToDate(9, 3, 2021);
// Проверка и обработка ошибок выражения.
$isValid = $sc->validator()->validateAndReturnResult($expression)->hasErrors();
// Кодирование выражения графика работ для организации обратно в строку.
$encodedExpression = $sc->encoder()->encode($expression);
// Результат:
// H * 01.01.2021-07.01.2021 *;H * 08.03.2021-09.03.2021 *;W 10:00-17:30 * 1-5;
Для получения информации о том, работает организация в указанное время организация или нет.
$sc = ScheduleExpression::create();
$encodedExpression = 'H * 01.01.2021-07.01.2021 *;H * 08.03.2021 *;W 10:00-17:30 * 1-5;';
$expression = $sc->decoder()->decode($encodedExpression);
$currentTime = new DateTime();
$isDue = $sc->evaluator()->isDue($expression, $currentTime);
// Результат:
// true|false - рабочее ли сейчас время
Для получения информации о том когда у организации следующая рабочая дата и время.
$sc = ScheduleExpression::create();
$encodedExpression = 'H * 01.01.2021-07.01.2021 *;H * 08.03.2021 *;W 10:00-17:30 * 1-5;';
$expression = $sc->decoder()->decode($encodedExpression);
$currentTime = new DateTime();
$nextDueDateTime = $sc->evaluator()->resolveNextDueDateTime($expression, $currentTime);
// Результат:
// {DateTime} - следующая рабочая дата и время.