Каталоги поставщиков — это глобальные данные поставщиков, а не проекция
технологии изделия. Каждая разобранная исходная строка сохраняется в
supplier_products (доменное имя — SupplierPriceItem) вместе с сырой строкой,
исходным разделом, исходной страницей, размерами поставщика, ценами за единицу и
состоянием сопоставления. Позиция может бессрочно оставаться несопоставленной
или игнорируемой; ни одно из этих состояний не удаляет её из каталога.
SupplierPriceList ведёт ревизии по каждому поставщику. Новые загрузки имеют
статус DRAFT; публикация устанавливает published_at, замораживает строки
предложений, архивирует предыдущую опубликованную ревизию и делает
подтверждённые предложения доступными для новых расчётов. Снимки цен в расчётах
продолжают хранить исходную позицию поставщика, ревизию, цену и размеры.
Публикация более поздней ревизии не обновляет существующий снимок. Импорт CSV и
XLSX сохраняет сырые колонки. Извлечение из PDF намеренно помечается как
ненадёжное и остаётся процессом с ручной проверкой; при наличии сохраняются
подписи страниц и разделов. Корректность структуры таблиц для произвольных PDF
поставщиков не гарантируется.
Канонические записи Material хранят нормализованную идентичность (включая
семейство, подсемейство, производителя, код продукта и марку). MaterialMapping
связывает предложение поставщика с каноническим материалом. Подтверждённый
псевдоним поставщика хранит стабильную идентичность SKU/раздела поставщика, чтобы
следующая ревизия могла переиспользовать сопоставление. Автоматически
подтверждается только точно запомненный псевдоним. Совпадения по структуре
категории/толщины — это предложения, требующие проверки; предложения с высокой
уверенностью можно явно подтвердить пакетно. Никакой импорт не заменяет
канонический материал.
Технологии по-прежнему выбирают ID канонических материалов (и могут фильтровать
по каноническому семейству/подсемейству). Они не ссылаются на позиции
поставщиков. Предложения поставщиков находятся через подтверждённые
сопоставления после выбора канонического материала. Благодаря этому такие
продукты, как зеркальный акрил, прутки, трубки и клеи, остаются доступными, даже
если ни одна текущая технология их не использует.
Порядок работы через API #
POST /api/suppliers/{supplier_id}/price-listsсfileсоздаёт черновик.GET /api/price-lists/{id}/products— просмотр всех сохранённых позиций поставщика.- Свяжите через
POST /api/supplier-products/{id}/mapping, создайте
канонический материал из проверенной позиции или пометьте позицию как игнорируемую. POST /api/price-lists/{id}/publishпубликует неизменяемую ревизию. Старый
путь/activateостаётся как псевдоним для совместимости.- Подтверждённые предложения появляются в
/api/materials/{id}/offersи могут
выбираться для будущих расчётов. Существующие снимки остаются замороженными.
Парсер работает в существующем ограниченном подпроцессе и сохраняет действующие
лимиты на файлы, строки, ячейки, распаковку и страницы PDF. Регрессионный PDF в
формате IGEPA генерируется в backend/tests/test_supplier_price_lists.py;
оригинального PDF от IGEPA не было в этом репозитории/окружении, поэтому
точность разбора именно этого документа предстоит проверить, когда исходник
будет доступен.