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>
3.8 KiB
3.8 KiB
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].