Импорт прайс-листов поставщиков и сопоставление

1 мин. чтения

Статус Актуально
Последняя проверка 2026-10-07 (соответствует Git на момент импорта; содержание повторно не проверялось)
Источник Git
Исходный файл docs/SUPPLIER_PRICE_LIST_IMPORT.md — открыть на GitHub
Язык статьи перевод с английского оригинала (файл перевода: translations/ru/docs/SUPPLIER_PRICE_LIST_IMPORT.md)
Git-репозиторий git@github.com:advertech/signage-estimator.git (сервер: /root/signage-estimator)
Git-коммит d22587c1f7e3add9efd54c7ffc0be0a01b296fa3 (master)
Файл последний раз изменён cef2f3af2e89 от 2026-09-27
Последний импорт 2026-10-07T09:14:19+02:00
Примечание Источник истины — Git. Меняйте файл в репозитории и перезапускайте /root/wiki-sign-expert/import_git_docs.py; правки, сделанные здесь, будут перезаписаны следующим импортом.

Каталоги поставщиков — это глобальные данные поставщиков, а не проекция
технологии изделия. Каждая разобранная исходная строка сохраняется в
supplier_products (доменное имя — SupplierPriceItem) вместе с сырой строкой,
исходным разделом, исходной страницей, размерами поставщика, ценами за единицу и
состоянием сопоставления. Позиция может бессрочно оставаться несопоставленной
или игнорируемой; ни одно из этих состояний не удаляет её из каталога.

SupplierPriceList ведёт ревизии по каждому поставщику. Новые загрузки имеют
статус DRAFT; публикация устанавливает published_at, замораживает строки
предложений, архивирует предыдущую опубликованную ревизию и делает
подтверждённые предложения доступными для новых расчётов. Снимки цен в расчётах
продолжают хранить исходную позицию поставщика, ревизию, цену и размеры.
Публикация более поздней ревизии не обновляет существующий снимок. Импорт CSV и
XLSX сохраняет сырые колонки. Извлечение из PDF намеренно помечается как
ненадёжное и остаётся процессом с ручной проверкой; при наличии сохраняются
подписи страниц и разделов. Корректность структуры таблиц для произвольных PDF
поставщиков не гарантируется.

Канонические записи Material хранят нормализованную идентичность (включая
семейство, подсемейство, производителя, код продукта и марку). MaterialMapping
связывает предложение поставщика с каноническим материалом. Подтверждённый
псевдоним поставщика хранит стабильную идентичность SKU/раздела поставщика, чтобы
следующая ревизия могла переиспользовать сопоставление. Автоматически
подтверждается только точно запомненный псевдоним. Совпадения по структуре
категории/толщины — это предложения, требующие проверки; предложения с высокой
уверенностью можно явно подтвердить пакетно. Никакой импорт не заменяет
канонический материал.

Технологии по-прежнему выбирают ID канонических материалов (и могут фильтровать
по каноническому семейству/подсемейству). Они не ссылаются на позиции
поставщиков. Предложения поставщиков находятся через подтверждённые
сопоставления после выбора канонического материала. Благодаря этому такие
продукты, как зеркальный акрил, прутки, трубки и клеи, остаются доступными, даже
если ни одна текущая технология их не использует.

Порядок работы через API #

  1. POST /api/suppliers/{supplier_id}/price-lists с file создаёт черновик.
  2. GET /api/price-lists/{id}/products — просмотр всех сохранённых позиций поставщика.
  3. Свяжите через POST /api/supplier-products/{id}/mapping, создайте
    канонический материал из проверенной позиции или пометьте позицию как игнорируемую.
  4. POST /api/price-lists/{id}/publish публикует неизменяемую ревизию. Старый
    путь /activate остаётся как псевдоним для совместимости.
  5. Подтверждённые предложения появляются в /api/materials/{id}/offers и могут
    выбираться для будущих расчётов. Существующие снимки остаются замороженными.

Парсер работает в существующем ограниченном подпроцессе и сохраняет действующие
лимиты на файлы, строки, ячейки, распаковку и страницы PDF. Регрессионный PDF в
формате IGEPA генерируется в backend/tests/test_supplier_price_lists.py;
оригинального PDF от IGEPA не было в этом репозитории/окружении, поэтому
точность разбора именно этого документа предстоит проверить, когда исходник
будет доступен.

Обновлено 07.10.2026