3.8 KiB
3.8 KiB
Спринт 3 — отчёты и аналитика (P1)
Автономная работа. После каждого пункта: dotnet build (SDK 8.0.126),
unit + integration тесты этого пункта, коммит порцией, отметка [x] здесь,
коммит прогресса.
Multi-tenant: все запросы фильтруются по OrganizationId через query filter
AppDbContext. Каждый отчёт — отдельный e2e/integration на изоляцию orgA vs orgB.
Чек-лист
- P1-8 Отчёт «Продажи» —
/api/reports/salesс группировкой по период (день/неделя/месяц), товар, кассир, касса, способ оплаты; фильтры (от/до, магазин, группа товаров). Web/reports/sales: фильтр периода, табы по группировкам, экспорт CSV+XLSX. ✅ Реализация: проекция в плоский ряд на сервере + агрегация в C# (EF8 не переводит «distinct count» в group-проекции с nullable-ключами).CsvHelper+ClosedXML. Bonus: исправлен багRetailSalesController.Update(DbUpdateConcurrency на свеже-созданном возврате). 5 интеграционных тестов. - P1-9 Отчёт «Остатки на дату» —
/api/reports/stockвосстанавливает остатки на произвольную дату через журналStockMovement(Σ движений до даты по продукту). Web/reports/stock: выбор даты, фильтр магазин/группа, экспорт. Edge: дата в будущем, дата раньше первой операции. ✅ Реконструкция через ΣStockMovement.QuantityгдеOccurredAt ≤ date. Стоимость — последнийUnitCostдвижения до даты + fallback наProduct.Cost. Edge'ы покрыты тестами: 5 интеграционных (today=current, before-first→empty, future=current, future-supply исключается на «сегодня», tenant-изоляция). - P1-10 Отчёт «Прибыль» —
/api/reports/profit= выручка − себестоимость по периодам/группам/товарам. Cost-snapshot уже есть вRetailSaleLine(черезUnitCostmovement'а). Защита от деления на ноль при нулевой выручке. ✅ Cost-snapshot —Product.Cost(скользящее среднее; точный FIFO потребует партий и вынесен из scope). Margin = profit/revenue·100, при revenue=0 возвращаем 0. Возврат вычитает и выручку, и COGS симметрично. 3 интеграционных. - P1-11 Отчёт «ABC-анализ» — топ товаров по выручке за период, классы A/B/C по Парето (A=80%, B=15%, C=5% накопительной выручки). Параметр метрики (выручка/прибыль/маржа). Web с визуализацией.
- P1-19 OpenAPI / Swagger —
Swashbuckle.AspNetCore,/swagger/v1/swagger.jsonв Development. Сгенерировать TS-клиент для food-market.web (openapi-typescript/nswag) и подключить для пары контроллеров как образец.
Лог
- Каждый пункт: build + тесты + коммит порцией + отметка [x] + коммит прогресса.
- Все правки на
main(origin Forgejo), без коммитаglobal.json.