# 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).