renovation-estimator · приложение к схеме БД
Карточка товара: какие данные мы собираем
Каждая позиция каталога — материал, объект наполнения или работа — описывается одним и тем же набором блоков. Ниже карточка на живых демо-данных из базы: переключите тип, чтобы увидеть, чем они отличаются.
Полный перечень собираемых данных
«Мин.» — без этого позицию не завести; «жел.» — желательно, работает и без него; «авто» — модуль заполняет сам.
| Поле | Что содержит | Статус | Пример |
| Идентификация |
name | Торговое название позиции | мин. | Ламинат Дуб Натур 33 класс 8 мм |
category | Категория из дерева каталога; определяет тип (материал / наполнение / работа) и набор свойств | мин. | flooring.laminate |
description | Развёрнутое описание | жел. | — |
image_url | Фото/изображение | жел. | ссылка на фото |
| Измерение и упаковка |
base_unit | Базовая единица, в которой считается объём | мин. | м², м, шт, л |
package_qty + package_unit | Сколько базовых единиц в упаковке — для округления закупки вверх до целых пачек/вёдер/хлыстов | жел. | 2.13 м²/пачка; 9 л/ведро; 2.4 м/хлыст |
| Свойства (attrs — свой набор на категорию) |
attrs.* | Характеристики по шаблону категории: размеры, класс, цвет, мощность, число мест… По ним работает подбор «диван до 2.4 м». Обязательность каждого свойства задаётся в шаблоне категории | по шаблону | толщина 8 мм, класс 33; ширина 2200, мест 3 |
| Цены (может быть несколько на позицию) |
price + currency | Цена | мин.* | 1 290.00 RUB |
price.unit | За какую единицу цена — за м² или сразу за упаковку | мин.* | за м² / за ведро |
supplier | Чья цена; у поставщика есть приоритет для выбора при расчёте | жел. | Поставщик А |
price_type | Розница / опт / сметная оценка | жел. | retail |
collected_at, is_current | Когда получена и актуальна ли; старые цены сохраняются как история | авто | — |
| Происхождение (для импорта) |
external_key | Артикул/SKU/URL в источнике — по нему повторная загрузка прайса обновляет позицию, а не плодит дубли | мин. при импорте | LM-90064221 |
source | Из какого источника пришло (прайс, API, ручной ввод) | авто | demo_price_csv |
raw_snapshot | Сырая строка источника как есть — для разбора спорных случаев | авто | — |
| Служебные |
is_active | Позиция доступна для подбора и расчёта | авто | да |
created_at, updated_at | Когда заведена и обновлена | авто | — |
* Цену можно не знать: позиция заведётся, попадёт в смету с пометкой «нет цены» — и не уронит расчёт.
Как это присылают в базу
Один канонический JSON для любого источника — прайса Excel/CSV, API поставщика или ручного ввода. Разнобой чужих колонок приводится к нему маппинг-профилем.
{
"external_key": "LM-90064221", ← артикул в источнике (ключ от дублей)
"category_code": "flooring.laminate", ← категория каталога
"name": "Ламинат Дуб Натур 33 класс 8 мм",
"base_unit": "m2",
"package": { "qty": 2.13, "unit": "m2" },
"attrs": { ← свойства по шаблону категории
"thickness_mm": 8,
"class": 33,
"color": "дуб натур"
},
"prices": [
{ "supplier": "demo_a", "price": 1290.00, "currency": "RUB",
"unit": "m2", "price_type": "retail" }
],
"image_url": null,
"is_active": true
}
Тот же набор блоков покрывает и мебель с сантехникой (другие attrs), и работы (обычно без упаковки и артикула). Новая категория = новый шаблон свойств в данных, без изменения структуры базы.