main
Клиенты (/clients): every phone number that's ever booked, aggregated — booking count, total (confirmed-only) revenue, last booking date. Click through to /clients/[phone] for the full history, newest first, linking back to each booking. Календарь (/calendar): month grid (Monday-start), a dot per day for confirmed bookings, click a day to see its agenda below with links into each booking. getCalendarBookings() queries with a 14-day lookback so a multi-day stay that started the previous month but checks out into this one still shows correctly on both. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Gh2UXUQUVBWroWEnn1FLFG
top-reservation
Бронирования Фестиваль-Парк: создание брони, список бронирований с фильтрами, статистика по объектам за месяц. Полная замена прежнего Telegram-бота — та же логика (/book, /week, /statistic), но обычной веб-формой, со справочником объектов вместо свободного текста и кнопкой копирования сводки бронирования.
Запуск в Docker
cp .env.example .env
# заполнить ADMIN_BOOTSTRAP_EMAIL / ADMIN_BOOTSTRAP_PASSWORD в .env
docker compose up --build -d
Приложение слушает :8087. При первом старте контейнер сам применяет миграции, создаёт админ-аккаунт из .env и засеивает стартовый список объектов (Баня, Афрейм, Дом с ванной и т.д. — можно менять в Настройки → Объекты).
Локальная разработка
npm install
cp .env.example .env
npm run db:migrate
npm run bootstrap-admin
npm run seed-objects
npm run dev
Установка как приложение
Страница отдаёт manifest.webmanifest — на телефоне через «Добавить на экран Домой» (Android Chrome) или «На экран Домой» (iOS Safari) можно поставить как обычное приложение, без адресной строки браузера.
Languages
TypeScript
93%
CSS
5.9%
Dockerfile
0.8%
JavaScript
0.3%