Skip to content

feat(procurement): суточный ре-парсинг прайсов поставщиков - #850

Merged
ShaerWare merged 1 commit into
mainfrom
local/feat/supplier-daily-sync
Sep 28, 2026
Merged

ShaerWare merged 1 commit into
mainfrom
local/feat/supplier-daily-sync

Conversation

@ShaerWare

Copy link
Copy Markdown
Owner

Summary

У каталога сайта суточная задача была, у поставщиков — нет: прайсы разбирались только руками через POST /admin/procurement/sync-suppliers. На проде офферы поставщиков из-за этого простояли нетронутыми с 24.07 по 28.09.2026 — два месяца ассистент считал цены и остатки по июльскому срезу.

  • procurement_supplier_sync — ежесуточно в 23:50 UTC, после каталога (23:30): оба источника пишут в одну таблицу, расходиться по времени им дешевле, чем толкаться.
  • Расчёт времени до цели вынесен в _seconds_until() — общий для обеих задач. Ошибка тут не падает, а тихо сдвигает синк на сутки, поэтому он под тестами.
  • Пустая папка прайсов аварией не считается: sync_all_suppliers логирует FileNotFoundError по каждому поставщику и не роняет остальных.

Прод уже настроен под это (вне этого PR): прайсы переехали в постоянный каталог вне репозитория /var/lib/ai-secretary/supplier-prices — прежний /tmp/stalker_prices слетал при ребуте, а внутри репо его снёс бы git clean; SUPPLIER_PRICES_DIR прописан в .env. Ре-синк по новому парсеру уже прогнан: все 20 738 ложных «НЕТ в наличии» ушли (в каждом поставщике in_stock=0 теперь ноль), 3 548 позиций подтверждены в наличии, остальные честно «уточняется».

NEWS

🔄 Цены и остатки поставщиков обновляются сами

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

Test plan

  • pytest tests/unit/test_procurement_task_schedule.py — 4 теста: цель впереди, цель прошла (переносится на завтра), точное попадание ждёт сутки, а не крутит пустой цикл, и синк поставщиков идёт позже каталога
  • Весь procurement-набор — 56 passed
  • ruff check . + ruff format --check . — чисто
  • Ручной прогон sync_all_suppliers() на проде с новым SUPPLIER_PRICES_DIR: 6/6 поставщиков, 27 645 офферов (SunWell 20 728, ЭКТ 2 998, Аксима 1 921, Chint РРЦ 1 637, X-Trade 250, Мегазаказ 111)
  • После деплоя: в логах при старте procurement supplier sync scheduled in Nh, назавтра в 23:50 UTC — строка с числом офферов

🤖 Generated with Claude Code

У каталога сайта суточная задача была, у поставщиков — нет: прайсы
разбирались только руками через `POST /admin/procurement/sync-suppliers`,
и положенный в папку свежий файл никто не подхватывал. На проде офферы
поставщиков из-за этого простояли нетронутыми с 24.07 по 28.09.2026 —
два месяца ассистент считал цены и остатки по июльскому срезу.

- `procurement_supplier_sync` — ежесуточно в 23:50 UTC, после каталога
  (23:30): оба источника пишут в одну таблицу, расходиться по времени им
  дешевле, чем толкаться.
- Расчёт времени до цели вынесен в `_seconds_until()` — общий для обеих
  задач, с тестами: ошибка тут не падает, а тихо сдвигает синк на сутки.
- Пустая папка прайсов аварией не считается: `sync_all_suppliers` логирует
  FileNotFoundError по каждому поставщику и не роняет остальных.

Прод настроен под это: прайсы переехали в постоянный каталог вне
репозитория `/var/lib/ai-secretary/supplier-prices` (прежний
`/tmp/stalker_prices` слетал при ребуте, а внутри репо его снёс бы
`git clean`), `SUPPLIER_PRICES_DIR` прописан в `.env`.

## NEWS

🔄 **Цены и остатки поставщиков обновляются сами**

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

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@ShaerWare
ShaerWare merged commit fa886f7 into main Sep 28, 2026
3 checks passed
@ShaerWare
ShaerWare deleted the local/feat/supplier-daily-sync branch September 28, 2026 18:12
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