# Sprint 10 — расширенный seed + UX-полировка Цель: реалистичные год-данные для отчётов + дашборд-виджеты + глобальный Cmd+K-поиск + dark-mode полировка. Старт: 2026-06-06. Исполнитель: Claude Opus 4.7 (автономный режим). ## Принципы - Multi-tenant обязателен. - Каждый пункт: build + локальные тесты + `~/deploy-stage.sh` + retest на `https://test.admin.food-market.kz`. - НЕ трогать: `global.json`, прод-стек, POS WPF. ## Чек-лист - [x] **1. Расширенный SeedDemoData --years=1** — `YearDemoSeeder.cs`, POST `/api/admin/seed-demo?years=1`. Маркер `Y1-`, идемпотентен, жёсткий гард «tenant has activity» когда уже есть Supply/RetailSale. Реально создаёт: 8 групп / 200 товаров (25 на группу) / 30 контрагентов (15 поставщиков + 15 покупателей) / 80 приёмок равномерно по году / **1500 розничных продаж с месячной сезонностью** (Dec пик ×1.6, Jul-Aug спад ×0.7..0.75) / 20 customer-returns / 8 wholesale-demands / 10 списаний / 3 перемещения / 5 инвентаризаций. Stocks пересчитываются bulk'ом из StockMovement (5535 шт.). 16.5s на dev-vm. Проверено: Sales-stats показывает «revenuePrevMonth 789750», ABC даёт top «Колбаса сервелат» класс A с 3.1% доли. - [x] **2. Dashboard виджеты** — новый `DashboardController` с 4 endpoint'ами: `/api/dashboard/top-products`, `/low-stock`, `/recent-sales`, `/margin`. `SalesStatsResponse` расширен `revenueThisWeek/transactionsThisWeek`. UI: `components/DashboardWidgets.tsx` — TopProductsWidget, LowStockWidget, RecentSalesWidget, MarginWidget; все 4 lazy через `React.lazy` + Suspense с Skeleton-плейсхолдером. SignalR `SalePosted` инвалидирует все 4 виджета + sales-stats. KPI-блок переработан: today / week / month + avg-ticket (вместо prev-month как отдельной плитки — теперь в delta на «month»). Каталог-плитки (товары/контрагенты/склады/точки) остаются ниже. - [x] **3. Глобальный search Cmd+K** — backend `GET /api/search/global?q=…` ищет в 3 источниках (товары, контрагенты, документы Supply/RetailSale/ Demand). Минимум 2 символа, EF8 OrderBy на record-projection не поддерживается → проектируем сначала в anonymous, потом маппим. UI: `components/CommandPalette.tsx` — modal с глобальным хоткеем Cmd+K / Ctrl+K (listener в AppLayout), 20 статических страниц для быстрой навигации, дебаунс query 200мс → API, recent items в localStorage, подсветка совпадений через RegExp + ``, навигация ↑↓ Enter Esc. Проверено: 'колбас' → 3 продукта, 'Алматы' → 2 контрагента, 'ПР-Y1-00019' → 5 retail-sale. - [x] **4. Dark mode полировка** — script-патчер `/tmp/dark-mode-fix.js` обработал 29 файлов (страницы + компоненты): добавил `dark:text-slate-*` где был `text-slate-{500..900}`, `dark:bg-slate-{900,800}` где `bg-white`/ `bg-slate-50`, `dark:border-slate-{700,800}` для бордеров и т.д. Без ломки уже существующих dark-классов (skip-if-prefix-already-dark). Audit-spec `stage-ui-s10-dark-audit.spec.ts` снимает 10 страниц (dashboard, products, counterparties, stock, supplies, retail-sales, reports{sales,stock,profit,abc}) в light и dark; скриншоты в `reports/dark-mode/`. Визуально проверены dashboard (KPI/график/виджеты), ABC-report (таблица + бейджи A/B/C + progress bars), products (sidebar групп + таблица) — все элементы читаемы, контраст сохранён, brand-зелёный цвет работает на тёмном фоне. ## Журнал ### 2026-06-06 старт Прошёл verify-sprint (78/78 stage-ui specs ✓), `~/.fm-watchdog/DONE` снят. Поехали по чек-листу. ### 2026-06-06 п.1 `YearDemoSeeder` создан. Идемпотентен через маркер `Y1-`, жёсткий гард на свежем tenant'е. Bulk stock-agg вместо per-document SaveChanges — 16.5s. ### 2026-06-06 п.2 4 dashboard endpoint'a + lazy виджеты + week-stats в существующем `/api/sales/retail/stats`. Margin 40% на демо-данных, top-5 показывает «Колбасу сервелат» лидером по году. ### 2026-06-06 п.3 Глобальный Cmd+K + `/api/search/global`. Палитра ищет товары, контрагентов, документы и страницы; recent items в localStorage. ### 2026-06-06 п.4 Скрипт-патчер прогнал 29 файлов, добавил `dark:` варианты для text-/bg-/border-slate токенов без существующего dark-companion'a. Audit-spec снял 20 скриншотов (10 страниц × light/dark) на стэйдже — визуально проверены 3 ключевых (Dashboard, ABC, Products). ### Итог Все 4 пункта ✓. Stage: - POST `/api/admin/seed-demo?years=1` → 200 товаров / 1500 продаж с сезонностью. - 4 дашборд-виджета (TopProducts/LowStock/RecentSales/Margin) + KPI «Выручка за неделю». - Cmd+K палитра с 20 страницами + поиск товаров/контрагентов/документов. - Dark mode выглядит читаемо на топ-10 ключевых страниц.