food-market/docs/supply-inventory-mobile-progress.md
nns 693832f51c feat(s31): web — список накладных + экран проверки + apply → Supply (2/8)
InvoicesPage: карточки загрузок со статусом (бейдж + иконка),
поллинг каждые 3с пока есть pending/parsing (останавливается на
needs_review/applied/failed). Две кнопки загрузки:
- 'Снять камерой' (<input capture="environment" accept="image/*">)
- 'Загрузить файл' (image/* + pdf, multi-select)
Mobile-first: кнопки большие, grid 2-col; на desktop растёт.

InvoiceReviewPage: карточками-строками (телефон читается, desktop
масштабируется). Редактируемые поля qty/price, авто-сумма.
- Шапка: supplier, №, дата, сумма (editable). Предупреждение если
  сумма строк отличается от «Итого» больше чем на 1.
- Общий сканер (input Enter) → в первую несопоставленную строку.
- Для несопоставленной строки — 'Найти товар' (debounced search
  по /api/catalog/products?q=) с ссылкой 'Создать товар' если
  ничего не нашлось.
- Save → PUT /lines (пишет alias'ы автоматически).
- Apply → ApplyDialog: выбор поставщика (search с БИН),
  склад (default main), валюта (default KZT). POST /apply →
  редирект в /purchases/supplies/:id.

Routes добавлены в App.tsx: /purchases/invoices и /purchases/
invoices/:id.

tsc зелёный.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-10-04 21:33:02 +05:00

3.8 KiB
Raw Blame History

Supply + Inventory mobile — прогресс

Задача: добавить в food-market два мобильных варианта приёмки (по фото накладной + сканированием штрихкодов) и инвентаризацию с телефона с офлайн-режимом. Образец логики — ~/ref/sklad/sklad/ (read-only); но документы создаются в НАШЕЙ базе (Supply/Inventory), а не черновиками в МойСклад.

Все три фичи — основные (видны в простом режиме), доступны Admin + Storekeeper.

Чек-лист

Приёмка

  • 1. Приёмка по фото/PDF накладной — загрузка, фоновое распознавание через Claude CLI (claude -p --output-format json, промпт из ClaudeCliInvoiceExtractor.cs), запуск локально или через ssh на RemoteHost. Статусы: queued → extracting → review | failed. Платные API-ключи не заводим.
  • 2. Экран проверки накладной. Редактируемые строки, помощь в сопоставлении с товаром (barcode → saved-mapping → ручной), создание товара прямо из строки, проверка «итого», предложение создать контрагента. Коммит → наш Supply (Draft).
  • 3. Приёмка сканированием. Непрерывная камера, +1 к строке на скан, последняя закупочная подставляется, неизвестный штрихкод → предложить создать товар или отложить.

Инвентаризация

  • 4. Инвентаризация с телефона. Выбор склада + опц. группы, офлайн-каталог в IndexedDB, прогресс сохраняется локально; скан / ручной ввод; неизвестные штрихкоды в отдельный список.
  • 5. Расхождения видны сразу. Учёт/факт/дельта в шт. и в деньгах, фильтр «только расхождения». Частичная (по группе) НЕ обнуляет непосчитанные; полная — явный выбор.
  • 6. Учётный остаток подставляется автоматически (без ручной кнопки «Пересчитать»): при создании bookQty = текущий Stock; при добавлении позиции — тоже; перед проведением пересчёт + warning о расхождениях с момента создания (продажи/приёмки). Если где-то экспорт в МойСклад — там тоже явный расчётный остаток.

Общее

  • 7. Мобильная вёрстка 375×667 + PWA. Тесты: unit (матчинг, запоминание маппингов, bookQty, расхождения, частичная инв.), integration (накладная → Supply Draft; частичная инв. не трогает другие товары; bookQty = текущий Stock), e2e на стенде.
  • 8. ~/deploy-stage.sh, ретест, docs/supply-inventory.md — пользовательская инструкция.

Правила

НЕ трогать: ~/ref/sklad (только читать), прод admin.food-market.kz, global.json, gateway nginx, POS WPF.

После каждого пункта: build + тесты + коммит порцией + [x].