# Шаг 2. База данных и связи ## Что сделано Создана SQL-схема `database/schema.sql` для MariaDB/MySQL и стартовые данные `database/seed.sql`. Также создана локальная страница установки `public/install.php`. Она применяет: - `database/schema.sql`; - `database/seed.sql`. Важно: установка пересоздает таблицы, поэтому использовать ее только на старте или в локальной разработке. Схема покрывает основные части проекта: - администраторы; - категории и подкатегории; - товары; - фасовки и цены; - изображения товаров; - поисковые термины; - промокоды и их привязки; - расчеты доставки; - заказы и позиции заказов; - история статусов заказа; - вход клиента по email-коду; - отзывы; - акции; - популярные товары; - настройки сайта; - праздничные/нерабочие дни. - старые URL и 301-редиректы для сохранения индексации. ## Главная логика связей ### Категории Таблица `categories` поддерживает вложенность через `parent_id`. Это позволяет хранить: - главные категории; - подкатегории; - меню каталога; - SEO-текст для страниц категорий. Для переноса со старого сайта у категорий есть поле `legacy_path`. Если старый URL отличается от нового slug, старый путь нужно сохранить и добавить 301-редирект в таблицу `redirects`. Для SEO у категорий есть поля `h1`, `seo_title`, `seo_description`, `seo_keywords`. ### Товары Таблица `products` хранит основную карточку товара: - название; - slug; - категорию; - описание; - основное фото; - базовую единицу; - режим отображения цены; - публикацию; - доступность; - признаки "новинка", "хит", "акция". Для товаров также есть поле `legacy_path`, чтобы переносить старые ссылки без потери индексации. Для SEO у товаров есть поля `h1`, `seo_title`, `seo_description`, `seo_keywords`. ### Фасовки Таблица `product_variants` хранит отдельные фасовки товара. Именно фасовка попадает в корзину, а не просто товар. Пример: - товар: горбуша неразделанная; - фасовка: пласт 10 кг; - `package_quantity`: 10; - `step_quantity`: 10; - `price_per_unit`: 600; - `package_price`: 6000. Так можно корректно сделать плюс/минус кратно фасовке. ### Заказы Таблица `orders` хранит заказ целиком: - имя; - телефон; - email; - тип получения; - адрес; - суммы; - промокод; - расчет доставки; - статус. Таблица `order_items` хранит снимок каждой позиции заказа. Снимок нужен, чтобы старые заказы не менялись при изменении цены или названия товара в каталоге. ### Промокоды Таблица `promocodes` хранит сам промокод. Таблица `promocode_targets` хранит ограничения: - на категорию; - на товар. Если промокод действует на весь заказ, targets не нужны. Для отображения выгодных цен в каталоге у промокодов есть поля: - `show_in_price_tiers` - показывать как градацию цены; - `price_tier_label` - подпись для карточки товара. Так можно показывать покупателю базовую цену, цену от 20 000 руб. наличными и цену от 50 000 руб. наличными. ### Доставка Таблица `delivery_calculations` хранит результат расчета: - тип доставки; - адрес; - сумма заказа; - расстояние от МКАД; - порог бесплатной доставки; - стоимость доставки; - стоимость подъема; - объяснение расчета. Это нужно, чтобы в заказе сохранялся расчет, который видел клиент. ### История заказов по email Таблица `customer_login_codes` хранит одноразовые коды входа по email. SMS не используются. ### Настройки Таблица `site_settings` хранит настройки сайта: - телефон; - email администратора; - правила доставки; - температуры камер; - тексты и числовые параметры. ## Как применить схему 1. Открыть в браузере `/install.php?token=rybstock-local-install`. 2. Нажать кнопку "Создать таблицы и стартовые данные". 3. После успешной установки база будет содержать таблицы проекта и стартовые категории/настройки. Страница работает только при `APP_ENV=local` и правильном `INSTALL_TOKEN` из `.env`. ## Что нужно сделать следующим шагом Шаг 3: 1. Создать базовые PHP-классы для работы с таблицами: - `CategoryRepository`; - `ProductRepository`; - `ProductVariantRepository`; - `OrderRepository`; - `PromocodeRepository`; - `SettingRepository`. 2. Сделать первый вывод категорий на главной странице. 3. Подготовить основу админки: вход администратора и список разделов.