Реалізація управління розкладом спеціалістів на веб-сайту
Управління розкладом — це інструмент для самих спеціалістів та адміністраторів: задати рабочі години, додати вихідний, поставити блокировку на час зустрічи, переглянути хто записався на наступний тиждень. Розклад повинен бути гнучким і не потребувати участі розробника при кожній зміні.
Рівні розкладу
Розклад будується з трьох шарів, кожен наступний перекриває попередній:
1. Базовий шаблон — стандартні рабочі години за днями тижня:
Пн–Пт: 09:00–18:00, слот 60 хв, перерва 0 хв
Сб: 10:00–14:00, слот 30 хв
Нд: вихідний
2. Переопределення дат — конкретна дата працює інакше:
2025-05-09: вихідний (святкування)
2025-06-01: 10:00–16:00 (скорочений день)
2025-07-01–2025-07-14: відпустка
3. Блокировки — закриті інтервали всередині рабочого дня:
2025-04-15 12:00–13:00: обід
2025-04-16 14:00–15:00: засідання
Інтерфейс управління для спеціаліста
Спеціаліст управляє розкладом через особистий кабінет. Ключові операції:
| Дія | Як реалізується |
|---|---|
| Задати базові години | Форма за днями тижня з полями start/end/slot |
| Закрити дату | Клік на дату в календарі → модальне вікно → тип: вихідний/відпустка |
| Відкрити нерабочу дату | Той же модал, тип: custom hours |
| Додати блокировку | Drag на часовій шкалі або форма з датою та часом |
| Переглянути записи | Недельний calendar view з бронями |
API endpoints
GET /api/specialists/{id}/schedule?date=2025-04-15
→ { slots: [...], overrides: [...], blocks: [...] }
GET /api/specialists/{id}/available-slots?from=2025-04-15&to=2025-04-21
→ { "2025-04-15": [{ start, end }], ... }
POST /api/specialists/{id}/overrides
{ override_date: "2025-05-01", type: "day_off" }
POST /api/specialists/{id}/blocks
{ starts_at: "2025-04-16T14:00", ends_at: "2025-04-16T15:00", reason: "Засідання" }
DELETE /api/specialists/{id}/overrides/{override_id}
DELETE /api/specialists/{id}/blocks/{block_id}
PATCH /api/specialists/{id}/schedule/{weekday}
{ start_time: "10:00", end_time: "18:00", slot_duration: 45 }
Масові зміни (відпустка, святковання)
Відпустка на 2 тижні — не 14 окремих записів, а одна запис із діапазоном:
CREATE TABLE specialist_overrides (
id SERIAL PRIMARY KEY,
specialist_id INTEGER NOT NULL,
date_from DATE NOT NULL,
date_until DATE NOT NULL, -- включно
override_type VARCHAR(20) NOT NULL, -- 'day_off' | 'vacation' | 'custom_hours'
start_time TIME, -- лише для custom_hours
end_time TIME,
created_by INTEGER, -- хто створив: спеціаліст або адміністратор
reason VARCHAR(255)
);
При генерації слотів діапазони розгортаються в окремі дні в коді, не в БД.
Автоматичні святкування
Налаштування: при створенні розкладу можна включити опцію «закривати державні святкування автоматично». Список святкувань завантажується через API (наприклад, calendarific.com) або зберігається в таблиці налаштувань із щорічним обновленням:
def populate_holidays(country: str, year: int):
resp = requests.get(
'https://calendarific.com/api/v2/holidays',
params={'api_key': API_KEY, 'country': country, 'year': year, 'type': 'national'}
)
holidays = resp.json()['response']['holidays']
for h in holidays:
db.execute("""
INSERT INTO public_holidays (country, date, name)
VALUES (%s, %s, %s)
ON CONFLICT DO NOTHING
""", [country, h['date']['iso'], h['name']])
Сповіщення про зміни
Коли спеціаліст закриває дату, на яку вже есть бронювання — система автоматично:
- Знаходить всі активні брони на закривану період
- Відправляє клієнтам лист із вибаченням і пропозицією вибрати інший час
- Переводит брони в статус
needs_reschedule - Повідомляє адміністратора
def close_date(specialist_id: int, date: date, reason: str):
affected_bookings = get_bookings_for_date(specialist_id, date)
with db.transaction():
create_override(specialist_id, date, 'day_off', reason=reason)
for booking in affected_bookings:
update_booking_status(booking.id, 'needs_reschedule')
send_reschedule_request_email(booking, specialist_id, reason)
notify_admin(specialist_id, booking, 'date_closed')
Експорт у зовнішні календарі
Спеціаліст може синхронізувати розклад з Google Calendar або Outlook через iCal feed:
GET /api/specialists/{id}/calendar.ics?token={private_token}
Цей URL додається в Google Calendar як підписка — обновляется щих 15 хвилин автоматично.
Строки реалізації
Базове управління шаблоном розкладу та блокировками, без зовнішніх інтеграцій — 5–7 робочих днів. Діапазонні переопределення, автосвяткування, сповіщення клієнтів при закритті, iCal-експорт, ролевий доступ (спеціаліст vs адміністратор) — 9–12 робочих днів.







