Посібник по роботі зі звітами

Огляд

Система звітності надає можливість переглядати та експортувати дані в Excel по: - 📚 Уроках лижної школи - 🏨 Бронюванням готелів - 🎫 Проходам через турнікети

Веб-інтерфейс звітів

Доступ

URL: http://your-domain.com/reports/

Права доступу: - Група admin - повний доступ - Група reports_manager - повний доступ

Функціонал

  1. Три вкладки:
  2. 🎿 Уроки
  3. 🏨 Бронювання
  4. 🎫 Проходи

  5. Фільтри:

  6. Дата від / Дата до
  7. Статус (активний, завершений, скасований)

  8. Дії:

  9. 🔍 Переглянути - показати дані в таблиці
  10. 📥 Експорт в Excel - завантажити звіт

API Endpoints

1. Експорт уроків

GET /api/v1/reports/export-lessons/?from=YYYY-MM-DD&to=YYYY-MM-DD

Параметри: - from (опційно) - Дата початку періоду - to (опційно) - Дата кінця періоду

Відповідь: Excel файл (.xlsx)

Приклад:

curl -X GET "http://127.0.0.1:8000/api/v1/reports/export-lessons/?from=2025-11-01&to=2025-11-30" \
  -H "Authorization: Token YOUR_TOKEN" \
  --output lessons_report.xlsx

Структура звіту: | № Уроку | Номер бронювання | Дата початку | Дата закінчення | Статус | Інструктор | Клієнт (Ім'я) | Клієнт (Прізвище) | Телефон | Email | Скіпаси | |---------|------------------|--------------|-----------------|--------|------------|---------------|-------------------|---------|-------|---------| | 1 | BOOKING-001 | 2025-11-10...| 2025-11-10... | active | John Doe | Іван | Петренко | +38050...| test@...| 1-1-2-20907 |


2. Експорт бронювань

GET /api/v1/reports/export-bookings/?from=YYYY-MM-DD&to=YYYY-MM-DD

Параметри: - from (опційно) - Дата заїзду від - to (опційно) - Дата заїзду до

Відповідь: Excel файл (.xlsx)

Приклад:

curl -X GET "http://127.0.0.1:8000/api/v1/reports/export-bookings/?from=2025-11-01&to=2025-11-30" \
  -H "Authorization: Token YOUR_TOKEN" \
  --output bookings_report.xlsx

Структура звіту: | № Резервації | ID Готелю | Клієнт (Ім'я) | Клієнт (Прізвище) | Телефон | Email | Дата заїзду | Дата виїзду | Кількість днів | Статус | Скіпаси | Дата створення | Дата оновлення | |--------------|-----------|---------------|-------------------|---------|-------|-------------|-------------|----------------|--------|---------|----------------|----------------| | RES-001 | HOTEL-01 | Іван | Петренко | +38050...| test@...| 2025-11-01 | 2025-11-05 | 4 | active | 30-2167...| 2025-11-01... | 2025-11-01... |


3. Експорт валідацій (проходів)

GET /api/v1/reports/export-validations/?from=YYYY-MM-DD&to=YYYY-MM-DD&status=valid

Параметри: - from (опційно) - Дата/час від - to (опційно) - Дата/час до - status (опційно) - Статус валідації (valid або invalid)

Відповідь: Excel файл (.xlsx)

Приклад:

curl -X GET "http://127.0.0.1:8000/api/v1/reports/export-validations/?from=2025-11-10&to=2025-11-10&status=valid" \
  -H "Authorization: Token YOUR_TOKEN" \
  --output validations_report.xlsx

Структура звіту: | № | Дата/Час проходу | Номер скіпасу | Номер турнікета | Номер MITZ | Статус | Система доступу | Документ доступу | Клієнт (Ім'я) | Клієнт (Прізвище) | Телефон | Email | Валідація SKIDATA | Створено | |---|------------------|---------------|-----------------|------------|--------|-----------------|------------------|---------------|-------------------|---------|-------|-------------------|----------| | 1 | 2025-11-10 10:30 | 1-1-2-20907 | T001 | MITZ-01 | ✅ Дозволено | lesson_vip_entry | Lesson-5 | Іван | Петренко | +38050...| test@...| Так | 2025-11-10... |

Особливості: - Рядки з дозволеними проходами підсвічені зеленим 🟢 - Рядки із забороненими проходами підсвічені червоним 🔴 - Внизу звіту є підсумки: всього проходів, дозволених, заборонених


Додаткові API для веб-інтерфейсу

4. Отримання списку уроків

GET /api/v1/lessons/?start_datetime_after=YYYY-MM-DD&start_datetime_before=YYYY-MM-DD&status=active

5. Отримання списку бронювань

GET /api/v1/bookings/?check_in_date_after=YYYY-MM-DD&check_in_date_before=YYYY-MM-DD&status=active

6. Журнал валідацій

GET /api/v1/reports/entries/?from=YYYY-MM-DD&to=YYYY-MM-DD&validation_status=valid

7. Щоденний звіт

GET /api/v1/reports/daily-entries/?date=YYYY-MM-DD

Відповідь (JSON):

{
  "date": "2025-11-10",
  "summary": {
    "total_entries": 150,
    "valid_entries": 145,
    "invalid_entries": 5,
    "unique_skipasses": 120
  },
  "by_hour": [
    {"hour": "09:00", "valid": 12, "invalid": 0},
    {"hour": "10:00", "valid": 25, "invalid": 1}
  ],
  "invalid_entries": [
    {
      "timestamp": "2025-11-10T10:15:00",
      "skipass_number": "1-1-2-99999",
      "turnstile_number": "T001",
      "reason": "Skipass not found"
    }
  ]
}

Тестування

Веб-інтерфейс

  1. Увійдіть як адміністратор або користувач з групою reports_manager
  2. Перейдіть на /reports/
  3. Виберіть вкладку (Уроки, Бронювання або Проходи)
  4. Встановіть фільтри (дати, статус)
  5. Натисніть "🔍 Переглянути" для перегляду в браузері
  6. Натисніть "📥 Експорт в Excel" для завантаження файлу

API через curl

Використовуйте test_reports_api.py скрипт:

docker compose exec web python test_reports_api.py

Або вручну через curl (див. приклади вище).


Автоматизація звітів

Приклад: Щоденний звіт через cron

Створіть скрипт daily_report.sh:

#!/bin/bash
DATE=$(date +%Y-%m-%d)
TOKEN="your_api_token_here"

# Експорт уроків за день
curl -X GET "http://127.0.0.1:8000/api/v1/reports/export-lessons/?from=$DATE&to=$DATE" \
  -H "Authorization: Token $TOKEN" \
  --output "/reports/lessons_$DATE.xlsx"

# Експорт бронювань за день
curl -X GET "http://127.0.0.1:8000/api/v1/reports/export-bookings/?from=$DATE&to=$DATE" \
  -H "Authorization: Token $TOKEN" \
  --output "/reports/bookings_$DATE.xlsx"

# Експорт валідацій за день
curl -X GET "http://127.0.0.1:8000/api/v1/reports/export-validations/?from=$DATE&to=$DATE" \
  -H "Authorization: Token $TOKEN" \
  --output "/reports/validations_$DATE.xlsx"

echo "Daily reports generated for $DATE"

Додайте в crontab:

0 23 * * * /path/to/daily_report.sh

Формат Excel файлів

Стилізація

  • Заголовки: Синій фон, білий текст, жирний шрифт
  • Дані: Чорний текст, автоматична висота рядків
  • Границі: Тонкі границі для всіх комірок
  • Ширина колонок: Автоматично підбирається під вміст
  • Статуси: Кольорові індикатори (зелений/червоний)

Підсумки

В кінці кожного звіту: - Загальна кількість записів - Додаткова статистика (для валідацій)


Налаштування прав доступу

Створення групи reports_manager

docker compose exec web python manage.py shell
from django.contrib.auth.models import Group, Permission

# Створення групи
group, created = Group.objects.get_or_create(name='reports_manager')

# Додавання прав
permissions = Permission.objects.filter(
    content_type__app_label__in=['skischool_vip_entry', 'hms_vip_entry', 'requests_logs'],
    codename__startswith='view_'
)
group.permissions.set(permissions)

print(f"Group 'reports_manager' {'created' if created else 'updated'}")

Додавання користувача до групи

from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group

User = get_user_model()
user = User.objects.get(username='manager_username')
group = Group.objects.get(name='reports_manager')
user.groups.add(group)

print(f"User {user.username} added to reports_manager group")

Troubleshooting

Помилка: "У вас немає прав доступу"

Рішення: Переконайтеся що користувач в групі admin або reports_manager

Помилка: "Invalid date format"

Рішення: Використовуйте формат YYYY-MM-DD для дат

Excel файл порожній

Рішення: 1. Перевірте фільтри (дати) 2. Переконайтеся що в базі є дані за вказаний період 3. Перегляньте дані через веб-інтерфейс спочатку

Повільна генерація звітів

Рішення: - Зменшіть період вибірки - Використовуйте додаткові фільтри - Звіти генеруються в пам'яті, для великих обсягів розгляньте фонову обробку


Технічні деталі

Бібліотеки

  • openpyxl - генерація Excel файлів
  • Django REST Framework - API endpoints
  • Django ORM - оптимізовані запити з select_related/prefetch_related

Оптимізація

Запити оптимізовані через: - select_related() для ForeignKey - prefetch_related() для ManyToMany - Індекси на полях дат

Безпека

  • Всі endpoints вимагають авторизації
  • Перевірка прав доступу через декоратори
  • CSRF токени для веб-інтерфейсу
  • Sanitization вхідних даних