Skip to content

fix(procurement): не выдавать умолчание WooCommerce за наличие - #847

Merged
ShaerWare merged 1 commit into
mainfrom
local/fix/stock-honesty
Sep 1, 2026
Merged

ShaerWare merged 1 commit into
mainfrom
local/fix/stock-honesty

Conversation

@ShaerWare

Copy link
Copy Markdown
Owner

Summary

Пункт 4 заказчика: «если у товара есть цена, но нет в наличии — бот должен говорить, что товара нет, и предлагать технически подходящую замену».

Проверил живой WooCommerce — оказалось хуже, чем предполагалось:

{'stock_status': 'instock', 'manage_stock': False, 'stock_quantity': None, ...}
stock_status на странице: {'instock': 100}

У всех 30 163 товаров manage_stock: false и stock_quantity: null, а stock_status равен instock просто по умолчанию. Учёт остатков в каталоге не ведётся вообще, а адаптер писал in_stock = (stock_status == "instock") → True для всего. Ассистент на этом основании отвечал клиенту «✅ В наличии» про любую позицию — то есть утверждал то, чего не знает. Это прямо запрещено §5.5 и §44.12 MASTER WORKFLOW: «прайс не является подтверждением наличия».

Что сделано

  • site_adapter._stock(): False при outofstock/onbackorder, True только когда учёт включён и остаток положительный, иначе None — неизвестно
  • В блоке позиций три состояния вместо двух: «в наличии» / «НЕТ в наличии» / «наличие уточняется»
  • Инструкция ассистенту: позицию с «НЕТ в наличии» так и назвать и сразу предложить из того же списка технически подходящую замену (близкий номинал, то же напряжение и тип контактов), прямо сказав, что это замена и чем она отличается. «наличие уточняется» — не выдавать за наличие

Ранжирование по номиналу (#843) для подбора замены уже работает — ближайшие по току позиции и так попадают в список.

Заодно: поиск стал быстрее

Ранжирование шло по полным ORM-объектам — 57 808 штук на каждое сообщение чата. Теперь скоринг по лёгким Core-кортежам, полные строки достаются второй фазой только для попавших в выдачу. Замер на проде:

ORM полные объекты: 1.51s (57808 строк)
Core кортежи:       0.81s
Core 3 колонки:     0.28s

Важно

  • У поставщиков остатки настоящие (3 548 в наличии, 20 738 нет, 3 359 неизвестно) — их отображение не меняется.
  • Данные по сайту станут честными после ближайшего procurement-site-sync (ежедневно 23:30 UTC) или ручного POST /admin/procurement/sync.
  • Полноценный ответ «товара нет» требует настоящего источника остатков — это открытый вопрос №1 из docs/stalker-workflow-plan.md (витрина сайта против кабинета остатков). Пока источника нет, максимум честного ответа — «наличие уточняется».
  • §5.12 MASTER WORKFLOW запрещает предлагать аналог без согласования директора. Пункт 4 заказчика это прямо отменяет для чата — реализую по указанию заказчика, флажок ставлю здесь.

NEWS

📦 Ассистент больше не обещает наличие, которого не знает

Раньше про любой товар с сайта он писал «в наличии» — хотя учёт остатков в каталоге не ведётся. Теперь честно пишет «наличие уточняется», а если товара точно нет — говорит об этом и сразу предлагает технически подходящую замену.

Test plan

  • tests/unit/test_site_stock_mapping.py — 6 кейсов маппинга наличия
  • pytest tests/unit — 314 passed (те же 3 падения и 2 ошибки, что и на чистом дереве)
  • ruff check + format — чисто
  • После деплоя: POST /admin/procurement/sync, затем проверить, что в блоке позиций стоит «наличие уточняется»

🤖 Generated with Claude Code

Ассистент отвечал «✅ В наличии» про любую позицию каталога. Проверка
живого WooCommerce: у всех 30 163 товаров manage_stock=false,
stock_quantity=null, а stock_status="instock" стоит по умолчанию. То есть
наличие никто не ведёт, а бот его утверждал — ровно то, что запрещено
§5.5 и §44.12 MASTER WORKFLOW («прайс не является подтверждением
наличия»).

- site_adapter._stock(): False при outofstock/onbackorder, True только
  когда учёт включён и остаток положительный, иначе None — неизвестно
- в блоке позиций: «в наличии» / «НЕТ в наличии» / «наличие уточняется»
- инструкция ассистенту: позицию без наличия так и назвать и сразу
  предложить из того же списка технически подходящую замену (близкий
  номинал, то же напряжение и тип контактов), прямо сказав, что это
  замена и чем она отличается

Заодно поиск перестал поднимать 57 808 ORM-объектов на каждое сообщение:
ранжирование идёт по лёгким Core-кортежам, полные строки достаются
второй фазой только для попавших в выдачу. Замер на проде: полная
ORM-выборка 1,51 с против 0,81 с у Core тех же колонок и 0,28 с у трёх.

Внимание: у поставщиков остатки настоящие (3 548 в наличии, 20 738 нет),
их отображение не меняется. Данные по сайту станут честными после
ближайшего procurement-site-sync.

## NEWS

📦 **Ассистент больше не обещает наличие, которого не знает**

Раньше про любой товар с сайта он писал «в наличии» — хотя учёт остатков
в каталоге не ведётся. Теперь честно пишет «наличие уточняется», а если
товара точно нет — говорит об этом и сразу предлагает технически
подходящую замену.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@ShaerWare
ShaerWare merged commit b022a7d into main Sep 1, 2026
3 checks passed
@ShaerWare
ShaerWare deleted the local/fix/stock-honesty branch September 1, 2026 17:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant