# Hotel 777 - Система бронирования отеля

## Общее описание
Hotel 777 — это веб-приложение для бронирования номеров в гостинице, расположенной на берегу моря в Абхазии (п. Мгудзырхуа, набережная ул. 1). Проект представляет собой полнофункциональную систему управления бронированиями с публичной частью для клиентов и административной панелью.

## Технологический стек
- **Backend**: Node.js + Express 5.x
- **База данных**: SQLite3
- **Аутентификация**: JWT (jsonwebtoken) + bcryptjs
- **Обработка изображений**: Sharp (конвертация в WebP)
- **Frontend**: Bootstrap 5, Font Awesome, кастомные шрифты (Inter, Playfair Display)
- **Контейнеризация**: Docker + Docker Compose

## Структура проекта
```
hotell777_260507/
├── server.js              # Основной файл сервера (633 строки)
├── package.json           # Зависимости проекта
├── Dockerfile             # Сборка Docker образа
├── docker-compose.yml     # Оркестрация контейнера
├── .env                   # Переменные окружения (только API_KEY)
├── .gitignore
├── PROJECT_INFO.md        # Описание проекта
├── data/
│   └── bookings.db       # База данных SQLite
├── public/
│   ├── index.html        # Публичная страница
│   ├── admin.html        # Админ-панель
│   ├── css/              # Стили (Bootstrap, шрифты, кастомные стили)
│   │   └── files/        # Шрифты Inter и Playfair Display
│   ├── js/
│   │   ├── main.js       # Логика публичной части
│   │   └── bootstrap.bundle.min.js
│   ├── img/              # Изображения отеля и номеров
│   │   └── rooms/        # Фотографии номеров
│   └── webfonts/         # Шрифты Font Awesome
└── node_modules/
```

## База данных
### Таблицы:
1. **bookings** — бронирования
   - Поля: id, name, phone, adults, children, checkin_date, checkout_date, wishes, status, room_type, comment, base_price, discount_percent, discount_amount, total_price, promocode_id, created_at
   - Статусы: 'новая', 'оплачена', 'зарезервирована', 'заселена', 'выехала', 'отменена'

2. **rooms** — номера отеля
   - Типы: 'Эконом' (2500₽/ночь), 'Стандарт' (4000₽/ночь), 'VIP Люкс' (8000₽/ночь)
   - Поля: type, name, description, rooms_count, single_beds, double_beds, has_sofa, has_ac, has_wifi, has_shower, max_guests, price_per_guest, image_path, is_active
   - Номера по умолчанию: 'Эконом 1' (3 шт, 2 односпальные кровати), 'Стандарт 1' (2 шт, 1 двуспальная + диван), 'VIP Люкс 1' (1 шт, 1 двуспальная + диван, до 4 гостей)

3. **promocodes** — промокоды
   - Поля: code, discount_percent (1-99%), valid_from, valid_to, valid_days, is_active

4. **booking_history** — история изменений бронирований
   - Отслеживает изменения полей: status, room_type, comment, discount_percent

5. **users** — пользователи системы
   - Роли: 'admin', 'user'
   - Суперадмин создается при первом запуске (пароль задается через .env)

## API Endpoints

### Публичные:
- `GET /` — главная страница (index.html)
- `GET /admin` — админ-панель (admin.html)
- `GET /api/rooms` — список доступных номеров
- `POST /api/bookings` — создание бронирования
- `POST /api/promocodes/validate` — проверка промокода и расчет скидки
- `GET /api/bookings` — получение всех бронирований (требуется API_KEY в заголовке X-API-Key)

### Аутентификация:
- `POST /api/auth/login` — вход в систему (login, password)
- `PUT /api/auth/me` — обновление профиля (full_name, email)
- `POST /api/auth/change-password` — смена пароля (current_password, new_password)

### Административные (требуется JWT + роль admin):
- `GET /api/admin/bookings` — список всех бронирований
- `GET /api/admin/bookings/:id/history` — история изменений бронирования
- `PATCH /api/admin/bookings/:id` — изменение статуса бронирования
- `PATCH /api/admin/bookings/:id/room` — изменение типа номера
- `PATCH /api/admin/bookings/:id/comment` — добавление комментария
- `PATCH /api/admin/bookings/:id/discount` — изменение скидки
- `GET /api/admin/rooms` — управление номерами
- `POST /api/admin/rooms` — создание номера
- `PUT /api/admin/rooms/:id` — обновление номера
- `DELETE /api/admin/rooms/:id` — удаление номера
- `GET /api/admin/promocodes` — управление промокодами
- `POST /api/admin/promocodes` — создание промокода
- `PUT /api/admin/promocodes/:id` — обновление промокода
- `DELETE /api/admin/promocodes/:id` — удаление промокода
- `GET /api/admin/users` — список пользователей
- `POST /api/admin/users` — создание пользователя
- `PUT /api/admin/users/:id` — обновление пользователя
- `DELETE /api/admin/users/:id` — удаление пользователя

## Основные функции
1. **Публичная часть**:
   - Просмотр номеров и цен (цена за ночь)
   - Бронирование номера с указанием дат, количества гостей
   - Применение промокодов
   - Галерея изображений
   - Информация о гостинице, развлечениях, отзывах

2. **Админ-панель**:
   - Просмотр всех бронирований
   - Изменение статусов бронирований
   - Управление номерами (создание, редактирование, удаление)
   - Управление промокодами
   - Управление пользователями (создание, редактирование, удаление)
   - История изменений по каждому бронированию

3. **Аутентификация и пользователи**:
   - Вход по логину и паролю (JWT токен на 24 часа)
   - Смена пароля пользователем
   - Обновление профиля (имя, email)
   - Разграничение прав: admin и user

4. **Дополнительно**:
   - Автоматическая конвертация изображений в WebP (при наличии в папке img)
   - Автоматическое создание номеров по умолчанию
   - Проверка доступности промокодов по датам
   - Расчет стоимости с учетом скидок (calculateBasePrice)

## Переменные окружения (.env)
```
HOTEL777KEY=<секретный_ключ_API>
```
- PORT=3000 (по умолчанию)
- JWT_SECRET (опционально, по умолчанию 'fallback-secret-change-in-production')
- Пароль администратора задается при первом запуске через регистрацию

## Docker развертывание
- Образ: `kalugin66/hotell777_260507`
- Порт: 3000 (проброшен через внешний прокси)
- Сеть: applications (внешняя сеть Docker)
- Тома: `/docker/hotell777_260507/data:/app/data`
- Healthcheck: проверка доступности через wget

## Запуск проекта
```bash
# Установка зависимостей
npm install

# Запуск в production режиме
npm start

# Запуск в development режиме (с nodemon)
npm run dev
```

## Docker команды
```bash
# Сборка и запуск
docker compose up -d --build

# Пересборка без кэша
docker compose build --no-cache && docker compose up -d

# Создание внешней сети (если не существует)
docker network create applications
```

## Git репозиторий
- URL: https://git.dadehard.ru/kalugin66/hotell777_260507.git
- Ветка по умолчанию: main

## Автор
- GitHub: kalugin66

## Особенности реализации
- Все цены указаны в рублях за номер за ночь
- Количество ночей рассчитывается как разница между датами заезда и выезда
- История изменений сохраняется автоматически при любом изменении бронирования
- Администраторы создаются через API (`POST /api/admin/users`)
- Автоматическая конвертация изображений в WebP (функция convertImages)
- CORS настроен через заголовки (не требуется отдельный middleware)
- Multer удален (загрузка изображений через админ-панель отключена)
