# Разбор ТЗ: чего ещё нет

Сверка того, что реализовано в KORZILLA X, с тем, что показывают скриншоты
действующей KORZILLA в `D:\Yandex.Disk\Projects\korzillaX\ТЗ\Админка\Типы страниц`
и инвентарь компонентов легаси (`D:\laragon\www\kzla\core\COMPONENTS.md`,
74 живых компонента).

Документ — рабочий список, а не описание готового узла. Сделанное отсюда
переезжает в профильные файлы `docs/`, строка удаляется.

Дата сверки: 28 августа 2026.

---

## 1. Общая рамка объекта — самый крупный пробел

В легаси у объекта ЛЮБОГО типа один и тот же набор вкладок, и он богаче нашего:

| Вкладка легаси | Что там | Есть в X |
|---|---|---|
| **Таргетинг** | «Содержание доступно только в городах (по умолчанию — везде)» + отдельный пункт «Для не выбранного города» | ❌ у объектов (есть только у блоков) |
| **Язык вывода** | русский / английский / казахский / японский | ❌ |
| **Системное** | Приоритет (сортировка) | ✅ `sort_order` |
| | «Без водяного знака (если он есть) на фото» | ❌ водяных знаков нет вовсе |
| **Теги** | список тегов сайта тумблерами | ❌ |
| **SEO** | Название в ссылке (слаг), Title, Description, Keywords | ⚠️ только слаг |
| низ модалки | «Включен» | ✅ `is_published` |
| | **«КОПИРОВАТЬ ОБЪЕКТ»** | ❌ |

Отсюда пять работ, которые нужно делать **один раз в ядре**, а не в каждом
модуле, — это и есть главный вывод разбора:

1. **Города у объекта.** Таблица вида `object_city_rules (site_id, component_key,
   object_id, city_id, mode)` плюс фильтр в `Component::listingQuery()`.
   Механика уже отработана на блоках (`block_city_rules`), переносится один
   в один. Нужен ответ на вопрос **В1** ниже.
2. **Теги.** Справочник тегов сайта + связь с объектом + вывод и фильтрация.
   В легаси это два компонента: `2266 Тэги` и `2263 Тэги: связь с объектами`.
3. **SEO объекта.** Сейчас `section_seo` даёт только шаблоны на разделе;
   у конкретной новости или товара своего Title/Description нет. Нужна
   таблица `object_seo` и последнее звено в цепочке наследования.
4. **Копирование объекта** — кнопка в модалке, одна операция в `ObjectWriter`.
5. **Водяной знак на фото** — настройка сайта (файл, позиция, прозрачность),
   применение при загрузке в медиатеку, флаг-исключение у объекта.

Мультиязычность (**В2**) — отдельный большой разговор, в план пока не ставлю.

---

## 2. Логотип (id 2047) — компонента нет вовсе

Владелец добавил в ТЗ новый тип. Смысл: **несколько логотипов на сайт**
(в шапке — цветной крупный, в подвале — белый мелкий), каждый выводится блоком
в своей зоне.

Поля по скриншотам:

| Поле | Тип | Примечание |
|---|---|---|
| Логотип | изображение | + alt («Наименования фото») |
| Название | строка | + **Размер шрифта** (число, по умолчанию 16) |
| Слоган | строка | + **Размер шрифта** (число, по умолчанию 14) |
| Ссылка с логотипа | строка | пусто = на главную |
| Текст над логотипом | текст | |
| Текст под логотипом | текст | |

Отдельная вкладка «Доп. текст» дублирует два последних поля — в X это одна
форма, дублировать не нужно.

Работа: модуль `modules/site/logo` по образцу `advantages` (самый простой),
шаблоны `listing` и `block`, классы `kz-logo`, `kz-logo__image`, `kz-logo__name`,
`kz-logo__slogan`. Размеры шрифта печатать инлайн-переменными
(`--kz-logo-name-size`), а не в атрибут `style` — чтобы вёрстка сайта могла
их переопределить.

⚠️ Разумнее сразу закрыть **В3**: логотип — это компонент (объекты в разделе)
или тип блока? В легаси — компонент, но по смыслу это блок шапки.

---

## 3. Что не хватает существующим компонентам

### Каталог товаров (id 2001)

Самый большой разрыв. Вкладки легаси: Главное · Фотографии · Описание · Цены ·
Остатки · Варианты и цвета · Таргетинг · Поля · Вывод · Язык вывода ·
Системное · Теги · SEO.

**Поля товара, которых нет:**

| Поле | Комментарий |
|---|---|
| Альтернативное название (h1) | у нас H1 берётся из SEO раздела — нужен свой у товара |
| Артикул-2 / Код | второй артикул |
| **Производитель** | в легаси — колонка товара и фасет по умолчанию; у нас только через характеристики |
| Лейблы: Акция / Новинка / Распродажа | **справочник сайта** (`lists_itemlabel` в настройках легаси), а не три флажка; у нас только `is_new` и `is_featured` |
| Спецпредложение, Хит продаж | |
| Габариты: Высота, Ширина, Глубина, Длина, Размер | есть только вес и объём |
| Внешняя ссылка | |
| «Запретить добавлять в корзину» | у нас это `purchase_mode` — покрыто |
| «Запретить заказывать товар» | отдельный запрет заявки |
| «Один товар в разделе (вывести всю инф-ию)» | режим раздела-одиночки |
| Краткое описание в списке — **HTML** | у нас простой текст |
| Ид. источника / Источник (r/o) | у нас `external_id`; «источник» (XLSX_224, 1С, YML) не хранится |

**Цены.** Мы сознательно ушли от `price..price11` к таблице, но потеряли
пользовательские свойства цены:

- «Не учитывать общую наценку» (значит, есть **общая наценка сайта** — её тоже нет)
- «Это нижняя граница цены товара (от)» — вывод «от 920 ₽»
- «Цена договорная (число не показывается)»
- «Возможен торг»
- **Валюта** (у нас только суффикс в настройках, пересчёта нет)
- ~~**Скидка**: процент и срок~~ — сделано: процент и тип цены, `docs/catalog.md`.
  Фиксированной цены со скидкой и таймера обратного отсчёта не будет:
  первая не сказала бы, к какой из цен товара относится, второй — украшение

**Варианты и цвета.** У нас `catalog_variants` существует, но в админке
не редактируется и на сайте печатается списком названий. В легаси:
основной вариант, название варианта, а у цвета — название, цвет-пикер, своя
цена, своё количество, номер фото; плюс «Обязательный выбор цвета товара».

**Вкладка «Вывод»** — целый пласт связей, которого нет совсем:

- список артикулов аналогичных товаров;
- «С этим товаром покупают» (артикулы);
- блок «Вам также может понравиться» с настройками (искать по всему каталогу /
  только с фото / отключить);
- **привязка объектов других компонентов к товару**: документы к товару,
  работы портфолио, сотрудники.

**Фотографии:** «Найти изображения» (по названию/артикулу) и «Ссылки на
картинки» — загрузка пачкой по URL. У нас только ручная загрузка.

**Дополнительные поля.** В легаси у товара пятнадцать слотов «Параметр 1..15»
(первый — HTML) плюс блок «Дополнительные характеристики товара» с именами
из справочника сайта `lists_params`. У нас вместо слотов — таблица
характеристик с типами и фасетами, то есть эта часть **сделана лучше**
и переносить слоты не нужно. Но справочник имён параметров сайта у нас
называется `catalog_options` и заводится вручную — стоит проверить, что импорт
из 1С кладёт туда всё, что приходит.

**Витрина каталога**, чего нет:

- сортировка («Сначала дешевле», «дороже», «по названию», «новинки»);
- «Показывать по: 15/30/60»;
- переключатель вида: плитка / список / таблица (шаблоны есть, переключателя нет);
- количество остатка в карточке («в наличии: 5 шт») — у нас только «в наличии»;
- счётчик количества ± рядом с кнопкой;
- «Купить в 1 клик» рядом с «В корзину» (у нас это взаимоисключающие режимы);
- «Получить консультацию»;
- «Срок доставки в {город}: 1 день»;
- кнопки «Поделиться» (соцсети);
- ~~табы карточки~~ — сделаны конструктором: вкладка это обычный блок внутри
  контейнера, и «Доставка в ваш город» не требует кода. Отзывов нет вовсе —
  это отдельный модуль;
- ~~блок «Вам может понравиться»~~ — блок `product_similar`, соседи по разделу;
  «с этим покупают» по истории заказов — отдельно;
- **сравнение товаров** (компонент `2076`) и **избранное** — обе иконки есть
  в каждой карточке легаси и в шапке;
- «Вы смотрели» (компонент `2058`).

### Новости (id 2003)

| Нет в X | Что это |
|---|---|
| Превью + галерея фотографий | у нас только текст |
| Автор, Источник, Ссылка на источник | есть только `source_url` |
| «Перейти по ссылке источника при открытии» | новость-ссылка на чужой сайт |
| «Вывести в отдельном блоке» | |
| **Привязка товаров к новости** | поиск по каталогу с автодополнением |
| Отдельные вкладки «Тэги» и «Теги» | в легаси это разные сущности (см. **В4**) |

### Текстовая страница (id 182)

| Нет в X | Что это |
|---|---|
| Анонс — **HTML**, а не простой текст | «Анонс для главной страницы» — отдельный редактор |
| «Спрятать текст под спойлер» | |

### Фотогалерея (id 2010)

Расхождение по модели данных: в легаси **объект = альбом до 20 фото**,
у каждого фото своя подпись и своя сортировка. У нас объект = одна фотография.

Плюс нет: вкладки **Видео** (ссылка на YouTube/Rutube/VK, файл видео, постер),
«Не выводить описание фото», «Id товаров для вывода», «В каких разделах
показывать» (объект в нескольких разделах), лайтбокса со счётчиком «9 из 9».

### Контакты

| Нет в X | Что это |
|---|---|
| Режим работы: Выключить / Каждый день / По дням недели | у нас одна строка `work_time` |
| Альтернативный текст времени | |
| Факс, Сайт, Skype, ICQ | |
| «Вывести соц. сети» | |
| **Таргетинг: код города / телефон города** | подмена телефона под город посетителя |
| Вкладка «Карта»: код карты 2GIS / Яндекс / Google | у нас только широта и долгота |

### Сотрудники

| Нет в X | Что это |
|---|---|
| Несколько телефонов (с новой строки) | у нас одна строка |
| Ссылки на MAX, Telegram, WhatsApp | |
| «Форма связи с менеджером» | тумблер, включает форму в карточке |
| Описание — отдельная вкладка | у нас одно поле `anons` |

### Отзывы

| Нет в X | Что это |
|---|---|
| **Ответ** администрации | на фронте — цитата с автором и «— с уважением, …» |
| Несколько изображений | у нас одно фото |
| Аватар автора | |
| Отзывы **к товару** с рейтингом | отдельные компоненты `2054`, `2252` |

### Документы

Почти совпадает. Нет: «Ссылка на файл с другого сайта» (документ на чужом
сервере) и «Изображение» (обложка документа).

### Преимущества

Нет: «Ссылка» и «Открывать ссылку в новом окне». Иконка у нас есть.

---

## 4. Компоненты легаси, которых нет как модулей

Из 74 живых компонентов легаси у нас реализовано десять. Явно нужные:

| Легаси | Что делает | Приоритет |
|---|---|---|
| `2047` Логотип | см. раздел 2 | владелец просит сейчас |
| `2004` Баннеры | слайдер/баннер с картинкой, ссылкой, сроком показа | высокий |
| `2011` Социальные сети | справочник ссылок с иконками, вывод блоком | высокий |
| `2059` Формы | у нас **есть** модуль `forms` | ✅ |
| `2041` Фильтры каталога | у нас **есть** фасеты | ✅ |
| `2076` Сравнение товаров | | средний |
| — Избранное | иконка в каждой карточке легаси | средний |
| `2058` Вы смотрели | история просмотров | средний |
| `2024` Счёт | счёт на оплату для юрлица (PDF) | зависит от **В8** |
| `2095` Вакансии | | низкий |
| `2259` Всплывающие окна | попапы по условию | низкий |
| `2088` Дилерская сеть | карта клиентов | низкий |
| `2266`/`2263` Тэги | см. раздел 1 | средний |
| `2270` Рекламации | | низкий |
| `2246`/`2247` Телеграм-боты и чаты | уведомления в телеграм | средний |
| `2257` Excel-экспорт, `2258` import YML, `2277` 1С-экспорт | обмен | средний |

---

## 5. Корзина и оформление заказа

⚠️ **В папке ТЗ «Корзина» лежат два посторонних скриншота** (DNS-зона и
GitHub deploy keys) — самого ТЗ там нет. Список ниже собран из легаси-кода
и из того, что видно на витрине.

### Что уже работает в X

Корзина в базе (гость по токену, слияние при входе), позиции, пересчёт
количества, удаление, очистка; оформление с полями имя/телефон/почта/адрес/
комментарий; выбор способа доставки с расчётом на сервере; выбор способа
оплаты; подтверждение телефона звонком; заказ снимком, статусы-справочник,
письма покупателю и владельцу; ЮKassa; повтор заказа из кабинета.
Справочники доставки и оплаты в админке есть.

### Чего нет

1. **Кастомные поля формы заказа.** В легаси форма собирается настройкой
   `oneClickForm`: тип поля (строка/число/скрытое/текст/список/файл/флажок),
   имя, подпись, подсказка, обязательность, значение по умолчанию.
   У нас шесть жёстко зашитых полей. Механика конструктора уже написана
   в модуле `forms` — её и переиспользовать.
2. **Промокоды и скидки.** Колонка `discount_total` в заказе есть, механики нет:
   ни промокода, ни скидки от суммы, ни персональной скидки покупателя.
   Скидка у товара (процент, «действует до», таймер) — тоже нет.
3. **Минимальная сумма заказа** и «доставка бесплатно от N» (второе есть
   у фиксированного способа доставки, общей настройки нет).
4. **Юрлицо**: переключатель «физлицо/юрлицо», организация, ИНН, КПП,
   счёт на оплату (компонент `2024`), договор.
5. **Доставка**: только фиксированная цена и самовывоз. Нет расчёта по весу
   и габаритам, зон доставки, интеграций (СДЭК с выбором ПВЗ — в легаси лежит
   `resurs/cdek_pvz.json`, Деловые линии — компонент `2040`, Яндекс.Доставка —
   настройки `yandexdelivery_*`, Почта России), нет срока доставки в город.
6. **Оплата**: ЮKassa и «при получении». Нет Сбербанка, Тинькофф, Robokassa,
   рассрочки, оплаты по счёту.
7. **Чеки 54-ФЗ** — отложено сознательно, вместе с первым живым магазином.
8. **Сохранённые адреса** покупателя в кабинете.
9. **Уведомления**: только почта. Нет SMS и телеграма (`2246`).
10. **Экспорт заказов** в Excel (в легаси `bc/order_xls.php`) и **выгрузка
    заказов в 1С** — у нас обмен только в одну сторону.
11. **Корзина на витрине**: нет счётчика ±, нет промокода, нет комментария
    к позиции, нет «купить в 1 клик» рядом с «в корзину».

---

## 6. Базовая вёрстка

`public/kz-base.css` уже закрывает каркас, списки, карточки, таблицы,
характеристики, фильтр, формы, кнопки, пагинацию. Чего в нём нет, потому что
нет самой разметки:

- ~~слайдер (баннеры, галерея товара)~~ — `kz-slider.js` и `kz-gallery.js`
  сделаны: лента баннеров со стрелками и точками, галерея с миниатюрами;
- ~~лайтбокс галереи~~ — `kz-lightbox`, со стрелками и Esc; счётчика снимков
  пока нет;
- ~~табы карточки товара~~ — `kz-tabs`, разметка развёрнута без скрипта;
- лейблы товара (`kz-label--sale`, `--new`, `--hit`);
- счётчик количества (`kz-qty`);
- иконки сравнения и избранного в карточке;
- всплывающие окна (`kz-modal`);
- «хлебная крошка + назад» на карточке.

---

## 7. Предлагаемый порядок работ

Порядок — от того, что дёшево и разблокирует остальное, к дорогому.

**Шаг 1. Рамка объекта (ядро).** Копирование объекта, SEO объекта
(Title/Description/Keywords), теги, города у объекта. Один раз — работает
во всех компонентах, включая собранные конструктором. ~2–3 дня.

~~**Шаг 2. Логотип, баннеры, социальные сети.**~~ Логотип — тип блока
(`logo`), баннеры — модуль `banners` со своей базой и блоком вывода, `kz-slider`
в базовом слое сделан прокруткой с привязкой вместо библиотеки. Осталось:
социальные сети. Подробности — [layout.md](layout.md).

**Шаг 3. Долги существующих компонентов.** Поля из раздела 3 по всем типам,
кроме каталога: новости (превью, галерея, автор, источник), текстовая (HTML-анонс,
спойлер), контакты (режим работы, мессенджеры, код города, карта), сотрудники
(мессенджеры, несколько телефонов), отзывы (ответ, несколько фото), документы
(внешняя ссылка, обложка), преимущества (ссылка). Галерея-альбом — отдельно,
это смена модели данных. ~3–4 дня.

**Шаг 4. Каталог, часть первая — товар.** Производитель, второй артикул,
альтернативный H1, лейблы, габариты, HTML-анонс, «от», договорная цена,
скидка со сроком. ~3 дня.

**Шаг 5. Каталог, часть вторая — витрина.** Сортировка, «показывать по N»,
переключатель вида, остаток числом, счётчик ±, табы карточки, «вам может
понравиться», аналоги и «с этим покупают». ~3–4 дня.

**Шаг 6. Корзина.** Кастомные поля формы заказа, промокоды и скидки,
минимальная сумма, счётчик ± в корзине, «купить в 1 клик» рядом с кнопкой.
~3 дня.

**Шаг 7. Сравнение, избранное, «вы смотрели».** Одна механика на три
функции — список идентификаторов у посетителя. ~2 дня.

**Шаг 8. Дорогое и внешнее.** Варианты и цвета товара, интеграции доставки
(СДЭК/ДЛ/Яндекс), новые платёжные провайдеры, телеграм-уведомления, экспорт
заказов, водяные знаки, мультиязычность. Каждый пункт — отдельный разговор.

---

## 8. Вопросы владельцу

### Ответы получены (27 августа 2026)

| Вопрос | Решение |
|---|---|
| В1. Города у объектов | нужны — блокам и контентным объектам, **товарам нет** |
| В2. Языки | не делаем: используется почти никогда |
| В3. Логотип | **блоком**, а не компонентом; файл грузится в настройках блока |
| В5. Галерея | одна фотография — одна запись, но **загрузка пачкой из папки** |
| В6. Производитель | подразделами раздела «Производители» (тип «Каталог»), выводятся блоком типа «меню»; позже — выборка товаров в такой раздел по критерию фильтра |
| В8. Юрлица | нужны: несколько реквизитов, какие показать — выбирается в способе оплаты |
| В9. Скидки | **скидка на товар: только процент и от какого типа цены** (чтобы оптовые цены не скидывались); фиксированной цены со скидкой не делаем. Промокоды — отдельный модуль, позже |
| В10. Сравнение и избранное | нужны обе, как системные страницы |
| Баннеры | своя база в админке, в блоке только вывод; выбор блока показа, срок показа, таргетинг по городам; **статистики не нужно** |
| Интеграции | отдельный раздел админки: платежи, доставки, CRM, уведомления в ТГ/MAX и приложение Korzilla.Admin |

Сделано по этим решениям: рамка объекта (копия, SEO, города), скидка на товар,
логотип блоком, баннеры своим модулем. Дальше: социальные сети.

**В1. Города у объектов.** Ставить таргетинг по городам каждому объекту
(как в легаси) или достаточно того, что есть у блоков? Первое — это ещё одна
таблица и фильтр в каждом списке; на каталоге в 100 тыс. товаров фильтр
по городу пойдёт в тот же индекс, что и публикация, и стоит денег.

**В2. Языки.** «Язык вывода» есть у каждого объекта легаси (русский,
английский, казахский, японский). Нужна ли многоязычность в X вообще, и если
да — на каком этапе? Сейчас у сайта одна локаль, и это заложено в схему.

**В3. Логотип — компонент или блок?** В легаси это компонент с объектами
в разделе. Но логотип не имеет своей страницы и живёт только в зоне. Может,
правильнее сделать его типом блока (как «меню» и «крошки»), а не разделом
с объектами? Тогда в шапке и подвале — просто два блока с разными настройками.

**В4. «Тэги» и «Теги» — это две разные сущности?** У новости в легаси две
вкладки с почти одинаковым названием. Похоже, одно — теги-рубрики объекта,
второе — что-то системное. Что именно нужно в X?

**В5. Галерея.** Переделывать объект в альбом (до 20 фото с подписями, как
в легаси) или оставить «одна фотография — один объект»? Второе проще, но
альбомы придётся собирать разделами.

**В6. Производитель у товара.** Отдельная колонка и справочник (как в легаси)
или характеристика с фильтром (как сейчас)? Отдельная колонка означает
фасет по умолчанию и «Производитель: Delovy» в карточке без настройки.

**В7. Цена «от», договорная, торг.** Нужны ли все три режима или достаточно
«цена по запросу», которая уже есть?

**В8. Юрлица.** Нужен ли счёт на оплату (компонент «Счёт»), поля организации
и ИНН в заказе? Это меняет и форму оформления, и печатные формы.

**В9. Скидки.** Что именно нужно в первую очередь: промокод, скидка от суммы
заказа, персональная скидка покупателя (у нас есть группы покупателей
с ценами — может, этого хватит) или скидка на товар с таймером?

**В10. Сравнение и избранное.** Нужны ли обе функции или достаточно одной?
И должны ли они переживать вход — то есть храниться в базе, а не в куке?

**В11. Водяные знаки.** Ставить ли их в X? Это обработка на загрузке,
хранение оригинала и настройка на сайт.

**В12. Что из этого списка вообще НЕ нужно?** Легаси накопил 74 живых
компонента за годы; часть наверняка мёртвый груз, который не стоит переносить.
Отметьте, что можно вычеркнуть, — это сэкономит больше времени, чем любая
оптимизация.
