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

3.5 KiB
Raw Blame History

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.

Чек-лист

  • 1. Расширенный SeedDemoData --years=1YearDemoSeeder.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% доли.
  • 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 показывает «Колбасу сервелат» лидером по году.