food-market/docs/sprint9-progress.md
nns 76a175f491
Some checks are pending
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 Web / Build + push Web (push) Waiting to run
Docker Web / Deploy Web on stage (push) Blocked by required conditions
feat(pwa+mobile+s9): PWA owner read-only + mobile tweaks + S9 stage specs
Sprint 9 пункт 3 (mobile-адаптация):
- DataTable: min-w-max sm:min-w-[640px] → узкие таблицы (Loyalty, Promotions)
  влезают на 375px без horizontal-scroll, широкие (Products) скроллятся
  внутри overflow-auto родителя.
- Mobile-audit спека (stage-ui-s9-mobile-audit) — 20 screenshot'ов в
  reports/mobile/ (375 + 768 viewport × 10 страниц + seed-demo).
  Smoke: no console-errors, layouts читаемы.

Sprint 9 пункт 4 (P2-9 PWA):
- public/manifest.webmanifest — read-only PWA владельца. Shortcuts:
  Дашборд, Sales/Profit/Stock отчёты. display=standalone (homescreen icon).
- public/sw.js — service worker:
  • SPA navigate: network-first + offline-fallback на /offline.html.
  • GET /api/*: network-first + cache-fallback (read-only кеш).
  • CSS/JS/SVG: stale-while-revalidate.
  • Мутации (POST/PUT/DELETE): не вмешиваемся, сеть.
- public/offline.html — статический fallback с кнопкой «Открыть дашборд».
- index.html: <link rel='manifest'>, apple-touch-meta, lang=ru-KZ.
- main.tsx: navigator.serviceWorker.register('/sw.js') в production only
  (dev hot-reload не мешает).
- deploy/nginx.conf: /sw.js no-cache, /manifest.webmanifest правильный
  content-type, /offline.html static.

Stage e2e:
- stage-ui-s9-loyalty.spec (4/4 ✓): programs/cards/promotions endpoints
  + UI рендер + SALE20 на 500₸ → total=400 (валидно через API).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-31 21:22:30 +05:00

31 lines
2.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Sprint 9 — лояльность, акции, mobile-адаптация, PWA
Цель: программы лояльности (баллы/% скидка) для постоянных покупателей,
промокоды/акции в чеке, починить узкие экраны (телефон/планшет),
PWA-обёртка владельца для отчётов с homescreen-икоником.
Старт: 2026-06-01. Исполнитель: Claude Opus 4.7 (автономный режим).
Это последний автономно-безопасный спринт. Дальше нужен человек:
ОФД-интеграция, MoySklad-токены, POS WPF на Windows, kz-локализация,
прод-деплой.
## Принципы
- Multi-tenant обязателен (`OrganizationId` на каждой новой таблице, query filter).
- Каждый пункт: `dotnet build` + локальные тесты + `~/deploy-stage.sh` + retest на `https://test.admin.food-market.kz` (включая mobile viewport 375x667).
- НЕ трогать: `global.json`, прод-стек (admin.food-market.kz), POS WPF.
## Чек-лист
- [x] **1. P2-12 Loyalty (программы + карты)** — Phase9b миграция. `LoyaltyProgramsController` + `LoyaltyCardsController` (/issue, /lookup, /block). RetailSale: input.LoyaltyCardNumber → расчёт скидки/баллов; Post начисляет в card.Balance. UI: `/loyalty/programs`, `/loyalty/cards`. Тесты: 3/3 integration + 2/2 stage.
- [x] **2. P2-13 Promotions (промокоды/акции)**`Promotion` (Percent|FixedDiscount, Scope, jsonb-массивы Guid, период, Code unique per org). `PromotionsController`. RetailSale: input.PromotionCode → lookup+matchingSubtotal+snapshot. UI: `/promotions`. Тесты: 2/2 integration + 2/2 stage.
- [ ] **3. Mobile-адаптация** — 375x667 + 768x1024 audit всех ключевых страниц. Таблицы → карточный режим на узких. Sidebar → drawer (уже есть). Screenshots до/после.
- [ ] **4. P2-9 PWA владельца (read-only)** — manifest.json + SW + offline-fallback на /dashboard/sales/profit/stock. Установка на homescreen. Lighthouse-аудит.
## Журнал
### 2026-06-01 — старт
Sprint 8 закрыт (`docs/sprint8-progress.md`, 4/4 ✓, 8/8 stage e2e). Перехожу к пункту 1 (Loyalty).