food-market/docs
nns 6b0fc68f77
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions
Docker Web / Build + push Web (push) Waiting to run
Docker Web / Deploy Web on stage (push) Blocked by required conditions
feat(invoices+inventory): порт улучшений 05.10.2026 из sklad
Диапазон коммитов f455fa9..b7eb637 + 3ced706 (handoff).

Backend (src/food-market.api/Infrastructure/Invoices):
- Ean.cs — контрольная цифра EAN-8/13/UPC-A/GTIN-14 (ловит одну ошибку в цифре).
- TableReader.cs — своя читалка .xlsx/.csv без библиотек, UTF-8/1251,
  .xls → понятная ошибка; TableInvoiceParser — шаблон накладной.
- InvoiceModels: +Photo/BarcodeSource/Note в InvoiceLine, PhotoHint,
  IInvoiceExtractor.ExtractPhotosAsync.
- InvoiceMatcher.FindByBarcode — для photo-matching.
- InvoiceProcessor: ветки photos/excel/vision, MatchFromPhoto с EAN-проверкой
  (barcode_source="read" → валидация), SweepAbandonedPhotosAsync раз в час
  убирает папки needs_review старше 24ч; DeleteStored (owner-policy: НЕ копить).
- ClaudeCliInvoiceExtractor: ExtractPhotosAsync + BuildPhotosPrompt +
  FromPhotosJson (barcode_source → BarcodeSource, comment → Note, unmatched_photos
  → Warnings); дефолт модели claude-sonnet-5-5, PhotoTimeoutSeconds=600.

Backend (Controllers):
- POST /purchases/invoices/upload-photos (≤80 файлов, 60 МБ) +
  GET /purchases/invoices/{id}/photo/{n}; Apply/Delete убирают папку (не только файл).
- InvoiceDetailDto +Source/+HasFiles — клиент не ломится за 404 миниатюрами.
- POST /inventory/inventories/import — xlsx/csv → {found, unknown}, повторы ШК
  суммируются, документ не создаётся.
- Program.cs: UseResponseCompression + GzipCompressionProvider для application/json.
- InventoriesController.mobile-catalog: weak ETag + If-None-Match → 304;
  Cache-Control private max-age=60. Замер 31k: JSON 3.60 МБ → gzip 0.98 МБ.

Frontend:
- lib/shots.ts — ZXing TRY_HARDER на 1x+1600; compress JPEG 0.85 до 2400.
- components/PhotoSession.tsx — полноэкранная пачка (камера + готовые фото).
- components/CameraScanner.tsx: onCodeRef + эффект [], камера не закрывается
  после каждого скана.
- pages/InvoicesPage.tsx — четыре способа: камера одиночными, файл (xlsx/csv/img/pdf),
  камера многостраничная, фото-приёмка (камера или готовые фото) + «Отправить ещё раз».
- pages/InvoiceReviewPage.tsx — автосохранение 700 мс + индикатор; row-picker панель
  «в какую строку?» если fuzzy-match неуверен; linesRef; глобальный keydown; миниатюра
  снимка у строки; пометки Note.
- pages/SupplyScanPage.tsx + InventoryMobilePage.tsx — глобальный keydown.
- InventoryMobilePage: поле сканера на виду + импорт Excel/CSV.
- docs/supplier-invoice-template.xlsx — шаблон для поставщиков (9-я строка заголовки).

Хранение файлов (owner-policy 2026-10-05): фото НЕ копим.
- Обычная загрузка → удаление сразу после разбора.
- Фото-приёмка → удаление при Apply/Delete/24h abandoned.
- KeepFilesDays удалён из флоу (конфиг-ключ игнорируется).

Тесты (unit, зелёные):
- EanTests (6): валидные/невалидные/one-digit error.
- TableReaderTests (5): xlsx cells, шапка «Поставщик/Номер/Дата», CSV UTF-8+BOM,
  CSV Windows-1251, .xls friendly error.
- ClaudeCliInvoicePhotosParseTests (4): decoded проходит, source=null чистит Barcode,
  unmatched_photos → Warnings, comment → Note.
- InvoicePhotoRetentionTests (3): DeleteStored файл/папка/идемпотентность.

Preexisting ApiReferenceDocsJob (Sprint 28) failure не связан с портом.

Прогресс: docs/sklad-port-20261005-progress.md. Пользовательская инструкция:
docs/supply-inventory.md обновлена.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-10-06 00:02:13 +05:00
..
sprint17-screenshots feat(s17): onboarding wizard + help kb + feedback + diagnostic + whats-new 2026-06-07 17:04:26 +05:00
24x7.md ci: move POS (Windows, 2x multiplier) to tag/manual only; document budget 2026-04-22 11:36:29 +05:00
analytics.md feat(s20): Mapster + SSO scaffold + maintenance automation (7 пунктов) 2026-06-07 21:54:12 +05:00
api-reference.md fix(s28): api-reference handle ~/path ASP.NET convention 2026-06-09 03:41:15 +05:00
ARCHITECTURE.md feat(s22): data tooling — export/import + schema docs + anon dump (7 пунктов) 2026-06-07 23:00:54 +05:00
architecture.md Phase 0: project scaffolding and end-to-end auth 2026-04-21 13:59:13 +05:00
audit-2026-04-27.md fix(auth): закрыть критические дыры — orphan login, self-delete, owner-delete, override-баннер 2026-04-27 09:28:18 +05:00
audit-2026-05-06.md docs(audit): полный аудит цепочки авторизации — 2026-05-06 2026-05-06 11:32:07 +05:00
audit-moysklad.md docs: audit of our domain entities vs. live OtherSystem API 2026-04-23 12:57:06 +05:00
backup-restore.md feat(deploy): авто-бэкап БД+uploads — systemd timer/service + скрипт (P0-6) 2026-05-27 02:49:08 +05:00
catalog-import-progress.md test(s32): stage-ui-catalog-import spec + финал в progress-doc 2026-10-04 23:46:11 +05:00
DEVELOPER-GUIDE.md test(s15): axe a11y + focus traps + unit coverage 80% + property tests + backup drill 2026-06-07 14:53:38 +05:00
error-codes.md docs(s24): docs cross-check + auto-gen + onboarding + test gap-fill (8/8 ✓) 2026-06-08 02:15:56 +05:00
flaky-tests.md feat(s26): flaky-test detection + observability dashboards (8/8 ✓ 10/10 cert) 2026-06-08 14:44:19 +05:00
food-market-server-postgres-role.md feat(s13): security headers + rate-limits + sensitive-ops audit + session revoke + Grafana 2026-06-07 12:30:10 +05:00
forgejo.md ops: Forgejo on git.zat.kz as primary, GitHub as mirror 2026-04-23 12:27:45 +05:00
glossary.md docs(s24): docs cross-check + auto-gen + onboarding + test gap-fill (8/8 ✓) 2026-06-08 02:15:56 +05:00
hotfix-invoice500-403-progress.md docs(hotfix): финал 7/7 + root cause ssh/claude + file retention policy 2026-10-05 01:05:07 +05:00
imports.md feat(s22): data tooling — export/import + schema docs + anon dump (7 пунктов) 2026-06-07 23:00:54 +05:00
logging.md feat(logging): структурные log-fields в Serilog (TD-4) 2026-05-28 17:46:17 +05:00
menu-links-progress.md test(menu): e2e-прогон 5/5 на stage + финал в progress-doc 2026-10-04 22:58:12 +05:00
menu-orphans-report.md feat(menu): новые экраны s31 в sidebar+Cmd+K+Cmd+J + split-кнопки, orphan-audit 2026-10-04 22:50:14 +05:00
MULTI-TENANCY.md test(s15): axe a11y + focus traps + unit coverage 80% + property tests + backup drill 2026-06-07 14:53:38 +05:00
observability.md docs(s28): api-reference 195→240 + observability + integration #7 + CI 2026-06-09 03:26:39 +05:00
ofd-integration.md feat(s11): ОФД-scaffolding — IFiscalProvider + 4 провайдера + UI/тесты 2026-06-07 02:27:17 +05:00
ONBOARDING.md docs: ONBOARDING sprint-history до 28 + quality marathon summary 2026-06-09 03:42:51 +05:00
openapi.md feat(openapi): улучшенный Swagger + TS-клиент через openapi-typescript (P1-19) 2026-05-28 11:39:22 +05:00
openiddict-keys.md feat(auth): prod X509-ключи OpenIddict с persistent self-signed (P0-1) 2026-05-27 02:47:00 +05:00
performance-baseline.md docs(s24): docs cross-check + auto-gen + onboarding + test gap-fill (8/8 ✓) 2026-06-08 02:15:56 +05:00
public-test-url-progress.md feat(public): :test ↔ test.admin, :latest ↔ admin; HTTPS-safe redirects 2026-10-04 17:14:55 +05:00
quality-status.md feat(s25): autonomous continuous quality monitoring (8/8) 2026-06-08 12:50:35 +05:00
quick-login-progress.md feat(s30): sentinel pwd для SPA — реальный мастер-пароль только в server-env 2026-10-04 21:02:36 +05:00
quick-login.md feat(s30): sentinel pwd для SPA — реальный мастер-пароль только в server-env 2026-10-04 21:02:36 +05:00
release-checklist.md docs: чек-лист релиза (P0-9) 2026-05-27 02:52:16 +05:00
RUNBOOK.md feat(public): :test ↔ test.admin, :latest ↔ admin; HTTPS-safe redirects 2026-10-04 17:14:55 +05:00
secrets.md docs(s24): docs cross-check + auto-gen + onboarding + test gap-fill (8/8 ✓) 2026-06-08 02:15:56 +05:00
simple-mode-progress.md docs(s29): simple-mode user guide + стейдж задеплоен + e2e 7/7 ✓ (шаг 8/8) 2026-10-04 12:11:03 +05:00
simple-mode.md docs(s29): simple-mode user guide + стейдж задеплоен + e2e 7/7 ✓ (шаг 8/8) 2026-10-04 12:11:03 +05:00
sklad-port-20261005-progress.md feat(invoices+inventory): порт улучшений 05.10.2026 из sklad 2026-10-06 00:02:13 +05:00
sprint-incident-1780974301.md docs(s28): incident 1780974301 — false-positive из-за external network 2026-06-09 08:26:08 +05:00
sprint-incident-1780985101.md docs(s28): incident 1780985101 — patch v2 watchdog run-level suppression 2026-06-09 11:24:33 +05:00
sprint-ui-deep-progress.md test(ui-deep): items 10-14 — все 59/59 ✓ на стейдже 2026-05-30 13:53:57 +05:00
sprint1-progress.md docs(sprint1): P1-21 done — все 9 пунктов выполнены, итог 2026-05-27 03:16:25 +05:00
sprint2-progress.md docs(sprint2): P1-16 done — все 7 пунктов выполнены, итог 2026-05-28 10:07:53 +05:00
sprint3-progress.md docs(sprint3): P1-19 done — все 5 пунктов выполнены, итог 2026-05-28 11:40:01 +05:00
sprint4-progress.md docs(sprint4): P1-17 done — все 3 пункта выполнены, итог 2026-05-28 12:20:50 +05:00
sprint5-progress.md docs(sprint5): TD-5 done — все 4 пункта выполнены, итог 2026-05-28 16:47:32 +05:00
sprint6-progress.md docs(sprint6): P2-4 done — все 5 пунктов выполнены, итог 2026-05-28 17:59:47 +05:00
sprint7-progress.md docs(sprint7): пункты 6-7 ✓ + итог по спринту 2026-05-30 11:52:00 +05:00
sprint8-progress.md test(s8-4): MinIO stage e2e + final progress 2026-05-31 20:25:19 +05:00
sprint9-progress.md docs(sprint9): итог — все 4 пункта ✓, stage 8/8 e2e зелёные 2026-05-31 21:38:26 +05:00
sprint10-progress.md feat(s10-4): dark mode полировка + Cmd+K палитра + аудит-spec 2026-06-06 01:30:41 +05:00
sprint11-progress.md feat(s11): ОФД-scaffolding — IFiscalProvider + 4 провайдера + UI/тесты 2026-06-07 02:27:17 +05:00
sprint12-progress.md docs(s12): ARCHITECTURE/MULTI-TENANCY/RUNBOOK/DEVELOPER-GUIDE + k6 baseline + stage-verify CI 2026-06-07 03:19:25 +05:00
sprint13-progress.md feat(s13): security headers + rate-limits + sensitive-ops audit + session revoke + Grafana 2026-06-07 12:30:10 +05:00
sprint14-progress.md perf(s14): индексы + N+1 fix + bundle -50% + WebP variants + pool + Hangfire timing 2026-06-07 13:21:39 +05:00
sprint15-progress.md test(s15): axe a11y + focus traps + unit coverage 80% + property tests + backup drill 2026-06-07 14:53:38 +05:00
sprint16-progress.md test(s16): regression suite 35 flows + visual 60 snapshots + nightly + CI badges 2026-06-07 16:14:11 +05:00
sprint17-progress.md feat(s17): onboarding wizard + help kb + feedback + diagnostic + whats-new 2026-06-07 17:04:26 +05:00
sprint18-progress.md docs(s18): итог — 7/7 ✓ + retest 5 stage scenarios + 44 UI specs 2026-06-07 19:10:08 +05:00
sprint19-progress.md docs(s19): итог — 7/7 ✓ + 13/13 endpoint smoke + 14 UI specs 2026-06-07 21:23:02 +05:00
sprint20-progress.md docs(s20): итог — 7/7 ✓ + 6/6 endpoint smoke + 10 recurring jobs зарегистрировано 2026-06-07 22:00:50 +05:00
sprint21-progress.md feat(s21): stage→prod migration toolchain (7 скриптов + workflow) 2026-06-07 22:31:10 +05:00
sprint22-progress.md docs(s22): итог — 7/7 ✓ + 10/10 endpoint smoke + ARCHITECTURE финал 2026-06-07 23:14:42 +05:00
sprint23-progress.md docs(s23): итог — 4 bugs found, 4 fixed, all retested ✓ 2026-06-08 01:42:28 +05:00
sprint24-progress.md docs(s24): итог — 8/8 ✓ + coverage delta estimate +6-9% 2026-06-08 02:21:16 +05:00
sprint25-progress.md feat(s25): autonomous continuous quality monitoring (8/8) 2026-06-08 12:50:35 +05:00
sprint26-progress.md feat(s27): cross-feature integration + soak + crash recovery (8/8 ✓) 2026-06-09 03:09:17 +05:00
sprint27-progress.md docs(s27): финальные результаты 4h-soak — 718k iter, 0 mem leak 2026-06-09 07:25:06 +05:00
sprint28-progress.md docs(s28): сводка interim soak (31min, 91k iter, 0 fail) + overnight work 2026-06-09 03:47:03 +05:00
sso.md feat(s20): Mapster + SSO scaffold + maintenance automation (7 пунктов) 2026-06-07 21:54:12 +05:00
stage-access.md docs(stage): switch stage subdomain to food-market.zat.kz 2026-04-22 20:31:20 +05:00
stage-prod-isolation-progress.md feat(stage): полная изоляция стенда от прод-ресурсов на prod-vm 2026-10-05 12:21:51 +05:00
stage-setup.md ci/deploy: stage deploy workflow + notifications + server plan 2026-04-22 13:46:03 +05:00
stage-testing-progress.md docs(stage): итоговый отчёт — все 14 пунктов ✓ (94/94 шагов зелёные) 2026-05-29 17:59:04 +05:00
supplier-invoice-template.xlsx feat(invoices+inventory): порт улучшений 05.10.2026 из sklad 2026-10-06 00:02:13 +05:00
supply-inventory-mobile-progress.md docs(s31): прогресс 8/8 ✓ + итог деплоя (ретест на stage auth'd) 2026-10-04 21:57:43 +05:00
supply-inventory.md feat(invoices+inventory): порт улучшений 05.10.2026 из sklad 2026-10-06 00:02:13 +05:00
telegram-bridge.md feat(ops): Telegram <-> tmux bridge + local docker-registry unit 2026-04-23 10:53:45 +05:00
TZ-доработка.md docs: ТЗ на доработку и тестирование (полный аудит 2026-05-22) 2026-05-22 15:30:04 +05:00
TZ-тестирование.md docs: ТЗ на доработку и тестирование (полный аудит 2026-05-22) 2026-05-22 15:30:04 +05:00
verify-progress.md test(verify-sprint): итог 78/78 stage-ui specs + V-13/14/15 verify specs + smtp4dev manual check 2026-06-04 22:25:41 +05:00