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), и работы (обычно без упаковки и артикула). Новая категория = новый шаблон свойств в данных, без изменения структуры базы.