# Структура базы данных

## Обзор

База данных состоит из следующих основных таблиц:

## Таблицы

### 1. users
Основная таблица пользователей системы.

**Поля:**
- `id` - ID пользователя
- `name` - Имя пользователя
- `email` - Email (уникальный)
- `password` - Хешированный пароль
- `email_verified_at` - Дата подтверждения email
- `remember_token` - Токен для "запомнить меня"
- `created_at`, `updated_at` - Временные метки

**Связи:**
- `roles` (many-to-many через `role_user`)
- `employee` (one-to-one)
- `client` (one-to-one)
- `phones` (morphMany)
- `orders` (one-to-many)
- `reservations` (one-to-many)
- `addresses` (one-to-many)
- `chats` (one-to-many)
- `messages` (one-to-many)

### 2. roles
Таблица ролей пользователей.

**Поля:**
- `id` - ID роли
- `name` - Название роли (уникальное)
- `slug` - Уникальный идентификатор (admin, manager, waiter, customer)
- `description` - Описание роли
- `permissions` - JSON массив разрешений
- `created_at`, `updated_at`

**Роли:**
- `admin` - Администратор
- `manager` - Менеджер
- `waiter` - Официант
- `customer` - Клиент

### 3. role_user
Связующая таблица между пользователями и ролями (many-to-many).

**Поля:**
- `id` - ID записи
- `user_id` - ID пользователя
- `role_id` - ID роли
- `created_at`, `updated_at`

### 4. employees
Профили сотрудников ресторана.

**Поля:**
- `id` - ID сотрудника
- `user_id` - ID пользователя (FK)
- `first_name` - Имя
- `last_name` - Фамилия
- `birth_date` - Дата рождения
- `avatar_url` - URL аватара
- `initials` - Инициалы
- `active` - Активен ли сотрудник
- `created_at`, `updated_at`

**Связи:**
- `user` (belongsTo)
- `phones` (morphMany)

### 5. clients
Профили клиентов ресторана.

**Поля:**
- `id` - ID клиента
- `user_id` - ID пользователя (FK)
- `first_name` - Имя
- `last_name` - Фамилия
- `birth_date` - Дата рождения
- `avatar_url` - URL аватара
- `initials` - Инициалы
- `active` - Активен ли клиент
- `city` - Город
- `street` - Улица
- `house` - Дом
- `zip` - Почтовый индекс
- `created_at`, `updated_at`

**Связи:**
- `user` (belongsTo)
- `phones` (morphMany)

**Атрибуты:**
- `full_address` - Полный адрес (accessor)

### 6. phones
Таблица телефонов (полиморфная связь).

**Поля:**
- `id` - ID телефона
- `phoneable_id` - ID связанной модели
- `phoneable_type` - Тип модели (User, Employee, Client)
- `phone_number` - Номер телефона
- `type` - Тип телефона (mobile, work, home, other)
- `is_primary` - Основной телефон
- `is_verified` - Подтвержден ли телефон
- `created_at`, `updated_at`

**Особенности:**
- Полиморфная связь позволяет хранить телефоны для users, employees и clients
- Один пользователь/сотрудник/клиент может иметь несколько телефонов
- Можно отметить основной телефон через `is_primary`

### 7. categories
Категории блюд.

**Поля:**
- `id` - ID категории
- `name` - Название категории
- `slug` - Уникальный slug
- `description` - Описание
- `image` - Изображение категории
- `sort_order` - Порядок сортировки
- `is_active` - Активна ли категория
- `created_at`, `updated_at`
- `deleted_at` - Soft delete

**Связи:**
- `dishes` (one-to-many)

### 8. dishes
Блюда меню.

**Поля:**
- `id` - ID блюда
- `category_id` - ID категории (FK)
- `name` - Название блюда
- `slug` - Уникальный slug
- `description` - Описание
- `price` - Цена (decimal 10,2 - в центах/копейках)
- `image` - Изображение блюда
- `weight` - Вес в граммах (опционально)
- `is_available` - Доступно ли блюдо
- `sort_order` - Порядок сортировки
- `created_at`, `updated_at`
- `deleted_at` - Soft delete

**Связи:**
- `category` (belongsTo)
- `orderItems` (one-to-many)

### 9. orders
Заказы.

**Поля:**
- `id` - ID заказа
- `user_id` - ID пользователя (nullable для гостевых заказов)
- `order_number` - Уникальный номер заказа
- `type` - Тип заказа (delivery, pickup)
- `status` - Статус (pending, processing, cooking, delivering, completed, cancelled)
- `customer_name` - Имя клиента
- `customer_phone` - Телефон клиента
- `delivery_address` - Адрес доставки
- `delivery_time` - Время доставки
- `comment` - Комментарий к заказу
- `subtotal` - Сумма без доставки (decimal 10,2)
- `delivery_fee` - Стоимость доставки (decimal 10,2)
- `total` - Итоговая сумма (decimal 10,2)
- `payment_status` - Статус оплаты (pending, paid, failed, refunded)
- `payment_method` - Способ оплаты
- `stripe_payment_intent_id` - ID платежа Stripe
- `created_at`, `updated_at`
- `deleted_at` - Soft delete

**Связи:**
- `user` (belongsTo, nullable)
- `items` (one-to-many)

**Методы:**
- `generateOrderNumber()` - Генерация уникального номера заказа

### 10. order_items
Позиции заказа.

**Поля:**
- `id` - ID позиции
- `order_id` - ID заказа (FK)
- `dish_id` - ID блюда (nullable, FK)
- `dish_name` - Название блюда (snapshot)
- `dish_price` - Цена блюда (snapshot, decimal 10,2)
- `quantity` - Количество
- `subtotal` - Сумма позиции (decimal 10,2)
- `created_at`, `updated_at`

**Связи:**
- `order` (belongsTo)
- `dish` (belongsTo, nullable)

**Особенности:**
- Хранит snapshot данных блюда на момент заказа
- Позволяет сохранить историю даже если блюдо удалено

### 11. tables
Столы ресторана.

**Поля:**
- `id` - ID стола
- `number` - Номер стола (уникальный)
- `capacity` - Вместимость (количество мест)
- `is_available` - Доступен ли стол
- `created_at`, `updated_at`
- `deleted_at` - Soft delete

**Связи:**
- `reservations` (one-to-many)

### 12. reservations
Бронирования столов.

**Поля:**
- `id` - ID бронирования
- `user_id` - ID пользователя (nullable)
- `table_id` - ID стола (FK)
- `customer_name` - Имя клиента
- `customer_phone` - Телефон клиента
- `customer_email` - Email клиента (nullable)
- `reservation_date` - Дата бронирования
- `reservation_time` - Время бронирования
- `number_of_guests` - Количество гостей
- `status` - Статус (pending, confirmed, cancelled, completed)
- `special_requests` - Особые пожелания
- `created_at`, `updated_at`
- `deleted_at` - Soft delete

**Связи:**
- `user` (belongsTo, nullable)
- `table` (belongsTo)

### 13. chats
Чаты поддержки.

**Поля:**
- `id` - ID чата
- `user_id` - ID пользователя-клиента (nullable)
- `customer_name` - Имя клиента
- `customer_phone` - Телефон клиента
- `operator_id` - ID оператора (nullable, FK на users)
- `status` - Статус (open, closed)
- `created_at`, `updated_at`

**Связи:**
- `user` (belongsTo, nullable) - клиент
- `operator` (belongsTo, nullable) - оператор
- `messages` (one-to-many)

### 14. messages
Сообщения в чатах.

**Поля:**
- `id` - ID сообщения
- `chat_id` - ID чата (FK)
- `user_id` - ID пользователя (nullable)
- `sender_type` - Тип отправителя (customer, operator)
- `message` - Текст сообщения
- `is_read` - Прочитано ли сообщение
- `created_at`, `updated_at`

**Связи:**
- `chat` (belongsTo)
- `user` (belongsTo, nullable)

### 15. addresses
Сохраненные адреса пользователей.

**Поля:**
- `id` - ID адреса
- `user_id` - ID пользователя (FK)
- `address` - Адрес (текст)
- `is_default` - Адрес по умолчанию
- `created_at`, `updated_at`

**Связи:**
- `user` (belongsTo)

## Особенности структуры

### Полиморфные связи
- Таблица `phones` использует полиморфную связь для хранения телефонов пользователей, сотрудников и клиентов

### Soft Deletes
Следующие таблицы используют soft deletes:
- `categories`
- `dishes`
- `orders`
- `tables`
- `reservations`

### Индексы
Индексы созданы для:
- Уникальных полей (email, slug, order_number и т.д.)
- Внешних ключей
- Часто используемых полей для фильтрации (status, dates)

### Типы данных
- Цены хранятся в формате `decimal(10,2)` для точности
- Даты используют соответствующие типы (`date`, `datetime`, `timestamp`)
- JSON поля для хранения массивов (permissions в roles)

## Миграции

Все миграции находятся в `database/migrations/` и следуют порядку:
1. Базовые таблицы (users, roles)
2. Профили (employees, clients)
3. Телефоны (phones)
4. Меню (categories, dishes)
5. Заказы (orders, order_items)
6. Бронирования (tables, reservations)
7. Чат (chats, messages)
8. Адреса (addresses)

## Модели

Все модели находятся в `app/Models/` и включают:
- Определение fillable полей
- Casts для типизации
- Relationships (связи)
- Дополнительные методы и accessors где необходимо






