food-market/docs/sprint10-progress.md
nns 1044818fbb
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 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(s10): year-demo seeder + 4 dashboard виджета + week-stats
S10-1: YearDemoSeeder — POST /api/admin/seed-demo?years=1.
- 8 групп × 25 товаров = 200, 30 контрагентов, 80 приёмок равномерно
  по году, 1500 розничных продаж с месячной сезонностью (Dec пик ×1.6,
  Jul-Aug спад ×0.7), 20 customer-returns, 8 demands, 10 losses, 3
  transfers, 5 inventories.
- Маркер артикулов Y1- (параллельно с DEMO-короткий сидер). Гард на
  существующую активность чтобы не лить хаос поверх ручной работы.
- Bulk StockMovement + переагрегация Stocks в конце транзакции —
  16.5s на dev-vm vs 60+s если бы per-document SaveChanges.

S10-2: DashboardController + 4 виджета:
- GET /api/dashboard/top-products?days&limit — top-N по gross-выручке
  (без net-вычета returns; для точного есть /api/reports/sales).
- GET /api/dashboard/low-stock?limit — Stock.Quantity ≤ Product.MinStock.
- GET /api/dashboard/recent-sales?limit — последние N посt'ed чеков.
- GET /api/dashboard/margin?days — Σ(LineTotal) - Σ(qty × Product.Cost),
  marginPercent к выручке.
- /api/sales/retail/stats расширен revenueThisWeek + transactionsThisWeek.
- Frontend: components/DashboardWidgets.tsx с 4 виджетами через
  React.lazy + Suspense. SignalR SalePosted инвалидирует все 4.
- KPI блок: today / week / month + avg-ticket (4 плитки, prev-month
  стал delta на month-плитке).

Проверено на стэйдже год-демо: top-5 за 365 дн. — «Колбаса сервелат
300г» 286440 ₸ / 32 транзакции. Margin 40% за 30 дн.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-06 01:03:36 +05:00

56 lines
3.5 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 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»).
Каталог-плитки (товары/контрагенты/склады/точки) остаются ниже.
- [ ] **3. Глобальный search Cmd+K** — палитра команд: товары/контрагенты/
документы/страницы, подсветка совпадений, recent items.
- [ ] **4. Dark mode полировка** — найти страницы без `dark:`, добавить
Tailwind dark-префиксы, скрин до/после на топ-10 страниц.
## Журнал
### 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 показывает
«Колбасу сервелат» лидером по году.