From 3ded4db73a36bc269970da0f1e72360275858d52 Mon Sep 17 00:00:00 2001 From: nns Date: Thu, 28 May 2026 11:14:41 +0500 Subject: [PATCH] docs(sprint3): P1-9 done Co-Authored-By: Claude Opus 4.7 --- docs/sprint3-progress.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/sprint3-progress.md b/docs/sprint3-progress.md index c467e03..ebbf088 100644 --- a/docs/sprint3-progress.md +++ b/docs/sprint3-progress.md @@ -17,10 +17,14 @@ Multi-tenant: все запросы фильтруются по `OrganizationId` (EF8 не переводит «distinct count» в group-проекции с nullable-ключами). `CsvHelper` + `ClosedXML`. Bonus: исправлен баг `RetailSalesController.Update` (DbUpdateConcurrency на свеже-созданном возврате). 5 интеграционных тестов. -2. [ ] **P1-9 Отчёт «Остатки на дату»** — `/api/reports/stock` восстанавливает +2. [x] **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-изоляция). 3. [ ] **P1-10 Отчёт «Прибыль»** — `/api/reports/profit` = выручка − себестоимость по периодам/группам/товарам. Cost-snapshot уже есть в `RetailSaleLine` (через `UnitCost` movement'а). Защита от деления на ноль при нулевой выручке.