Посібник адміністратора: Управління уроками
Швидкий старт
Вхід в адмін панель
- Відкрийте
http://your-domain.com/admin/ - Введіть логін та пароль адміністратора
Створення уроку
Варіант 1: Через Django Admin
- Перейдіть до Ski School Vip Entry → Lessons
- Натисніть Add Lesson (Додати урок)
- Заповніть поля:
- Booking number: Номер бронювання (наприклад, SKI-2024-001)
- Instructor name: Ім'я інструктора
- Location: Місце проведення
- Status: Статус уроку (Active/Cancelled/Completed)
- Description: Опис уроку
- Start datetime: Час початку
- End datetime: Час завершення
-
Duration: Тривалість в годинах (опційно)
-
У розділі Participants натисніть Add another Lesson participant (Додати учасника):
- Виберіть або створіть Customer (Клієнта)
-
Додайте примітки якщо потрібно
-
Збережіть урок
-
Після збереження відкрийте учасника і додайте Skipasses (Скіпаси):
- Skipass number: Номер скіпасу
- Valid from / Valid until: Період дії
- Skipass type: Тип (Daily, Weekly, etc.)
- Skipass category: Категорія (Adult, Child, etc.)
Варіант 2: Через Web інтерфейс
- Перейдіть до
/skischool/ - Виберіть вкладку Створити урок
- Заповніть форму:
- Номер бронювання
- Інструктор
- Локація
- Час початку та завершення
-
Опис
-
Додайте учасників:
- Натисніть + Додати учасника
- Введіть дані клієнта (ім'я, прізвище, телефон, email)
- Натисніть + Додати скіпас
- Введіть номер скіпасу
-
Можна додати кілька скіпасів для одного учасника
-
Натисніть Створити урок
Варіант 3: Через API
curl -X POST http://your-domain.com/api/v1/lessons/ \
-H "Content-Type: application/json" \
-H "Authorization: Token YOUR_TOKEN" \
-d '{
"booking_number": "SKI-2024-001",
"instructor_name": "Іван Петренко",
"location": "Буковель, підйомник 5",
"description": "Груповий урок",
"start_datetime": "2024-11-04T10:00:00Z",
"end_datetime": "2024-11-04T12:00:00Z",
"status": "active",
"participants": [
{
"customer": {
"name": "Петро",
"surname": "Коваль",
"phone_number": "+380501234567",
"email_adress": "petro@example.com"
},
"skipasses": [
{
"skipass_number": "1-1-2-20907",
"valid_from": "2024-11-04T00:00:00Z",
"valid_until": "2024-11-05T00:00:00Z"
}
]
}
]
}'
Робота з учасниками
Додавання учасника до існуючого уроку
- Відкрийте урок в Admin панелі
- У розділі Participants натисніть Add another Lesson participant
- Виберіть клієнта або створіть нового
- Збережіть
Додавання скіпасів учаснику
- У Admin панелі перейдіть до Lesson participants
- Виберіть потрібного учасника
- У розділі Lesson skipasses натисніть Add another Lesson skipass
- Заповніть:
- Номер скіпасу
- Період дії (опційно, якщо не вказано - використовується час уроку)
- Тип та категорію (опційно)
- Збережіть
Множинні скіпаси
Один учасник може мати кілька скіпасів. Це корисно коли: - Батько бронює урок для сім'ї (власний скіпас + дитячі скіпаси) - Клієнт має кілька активних скіпасів - Груповий урок з різними типами скіпасів
Приклад:
Урок: SKI-2024-001
├─ Учасник 1: Іван Петренко (+380501234567)
│ ├─ Скіпас: 1-1-2-20907 (Adult, Daily)
│ └─ Скіпас: 1-1-2-20908 (Child, Daily) ← Дитячий скіпас для дитини
└─ Учасник 2: Марія Коваль (+380509876543)
└─ Скіпас: 1-1-2-20909 (Adult, Daily)
Перегляд уроків
Список уроків
- Admin панель: Перейдіть до Lessons
- Web інтерфейс: Відкрийте
/skischool/→ вкладка Переглянути уроки
Доступні фільтри: - За статусом (Active/Cancelled/Completed) - За датою - За інструктором - За номером бронювання - За номером скіпасу
Деталі уроку
В Admin панелі натисніть на урок щоб побачити: - Всіх учасників - Всі скіпаси кожного учасника - Загальну кількість учасників та скіпасів
Валідація скіпасів
Система автоматично валідує скіпаси при вході через турнікет.
Як працює валідація
- Турнікет відправляє номер скіпасу на
/api/v1/entry/validation/ - Система шукає:
- Чи є скіпас в активних уроках на сьогодні
- Чи входить поточний час в період дії скіпасу
- Чи входить поточний час в час уроку
- Повертає результат:
validабоinvalid
Перевірка скіпасу вручну
Через Web інтерфейс (/cashier/):
1. Введіть номер скіпасу
2. Натисніть Перевірити
3. Система покаже:
- Чи валідний скіпас
- До якого уроку прикріплений
- Період дії
- Інформацію про клієнта
Зміна статусу уроку
Active → Cancelled (Скасування)
- Відкрийте урок
- Змініть Status на Cancelled
- Збережіть
Ефект: Скіпаси цього уроку більше не будуть валідними для входу
Active → Completed (Завершення)
- Відкрийте урок
- Змініть Status на Completed
- Збережіть
Ефект: Урок архівується, скіпаси не валідні
Видалення
Видалення уроку
⚠️ УВАГА: При видаленні уроку автоматично видаляються: - Всі учасники цього уроку - Всі скіпаси всіх учасників
- Відкрийте урок в Admin панелі
- Натисніть Delete внизу сторінки
- Підтвердіть видалення
Видалення учасника
При видаленні учасника автоматично видаляються всі його скіпаси.
Видалення скіпасу
Можна видалити окремий скіпас не чіпаючи учасника та інші скіпаси.
Пошук та фільтрація
Знайти урок за номером скіпасу
Admin панель: 1. Перейдіть до Lesson skipasses 2. У пошуку введіть номер скіпасу 3. Відкрийте знайдений скіпас 4. Перейдіть до Participant → Lesson
Або через Lessons: 1. Перейдіть до Lessons 2. У пошуку введіть номер скіпасу 3. Система знайде уроки які містять цей скіпас
Знайти всі уроки клієнта
- Перейдіть до Customers
- Знайдіть клієнта за телефоном або ім'ям
- Внизу сторінки побачите розділ Lesson participations (Участі в уроках)
Знайти уроки на конкретну дату
- Перейдіть до Lessons
- Використайте Date hierarchy вгорі списку
- Виберіть рік → місяць → день
Звіти
Статистика за день
Web інтерфейс (/api/v1/reports/daily-entries/):
- Кількість валідних входів
- Кількість невалідних спроб
- Топ використовуваних скіпасів
- Розподіл за годинами
Статистика клієнтів
Web інтерфейс (/api/v1/reports/customer-stats/):
- Найактивніші клієнти
- Кількість відвідувань
- Середня тривалість уроків
Типові сценарії
Сценарій 1: Сімейний урок
Батько бронює урок для всієї сім'ї:
- Створіть урок
- Додайте батька як учасника
- Додайте йому всі скіпаси сім'ї:
- Власний (Adult)
- Дружини (Adult)
- Дитини 1 (Child)
- Дитини 2 (Child)
Сценарій 2: Груповий урок
Кілька клієнтів в одному уроці:
- Створіть урок
- Додайте кожного клієнта як окремого учасника
- Кожному учаснику додайте його скіпас(и)
Сценарій 3: Перенесення уроку
- Відкрийте урок
- Змініть Start datetime та End datetime
- При необхідності оновіть Valid from/until у скіпасів
- Збережіть
Сценарій 4: Додавання учасника до існуючого уроку
- Знайдіть урок за номером бронювання
- У розділі Participants додайте нового учасника
- Додайте скіпас(и) новому учаснику
- Збережіть
Помилки та вирішення
"Skipass not found in lessons or hotel bookings"
Причина: Скіпас не прикріплений до жодного активного уроку
Рішення: 1. Перевірте чи правильний номер скіпасу 2. Перевірте чи є урок на сьогодні 3. Перевірте статус уроку (має бути Active) 4. Переконайтесь що скіпас додано до учасника уроку
"Skipass expired (outside valid_from/valid_until)"
Причина: Поточний час не входить в період дії скіпасу
Рішення: 1. Відкрийте скіпас в Admin панелі 2. Перевірте Valid from та Valid until 3. Скоригуйте дати якщо потрібно
"Lesson time mismatch"
Причина: Поточний час не входить в час уроку
Рішення: 1. Перевірте час уроку (Start/End datetime) 2. Скоригуйте якщо потрібно
Не можу додати учасника: "Unique constraint"
Причина: Цей клієнт вже є учасником цього уроку
Рішення: - Кожен клієнт може бути учасником уроку тільки один раз - Якщо потрібно додати ще скіпаси - додайте їх до існуючого учасника
Безпека
Ролі та права доступу
- Cashier (Касир) - Тільки перевірка скіпасів
- Skischool (Лижна школа) - Управління уроками (CRUD)
- Hotel (Готель) - Управління бронюваннями
- Admin (Адміністратор) - Повний доступ
Призначення ролі
docker compose exec web python manage.py shell
>>> from django.contrib.auth import get_user_model
>>> from django.contrib.auth.models import Group
>>> User = get_user_model()
>>> user = User.objects.get(username='username')
>>> group = Group.objects.get(name='skischool')
>>> user.groups.add(group)
Резервне копіювання
Рекомендується робити backup перед масовими змінами:
# Backup БД
docker compose exec db pg_dump -U postgres dbname > backup_$(date +%Y%m%d).sql
# Відновлення
docker compose exec -T db psql -U postgres dbname < backup_20241104.sql
Підтримка
При виникненні питань або проблем:
1. Перевірте документацію: /docs/
2. Перегляньте логи: docker compose logs web
3. Зверніться до розробника