From 880be11bd811825c11d0196a8a5a1604a3afc8b5 Mon Sep 17 00:00:00 2001 From: nns Date: Thu, 28 May 2026 09:04:35 +0500 Subject: [PATCH] =?UTF-8?q?docs(sprint2):=20=D1=87=D0=B5=D0=BA-=D0=BB?= =?UTF-8?q?=D0=B8=D1=81=D1=82=20=E2=80=94=207=20=D0=B4=D0=BE=D0=BA=D1=83?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=B2=20=D1=83=D1=87=D1=91=D1=82?= =?UTF-8?q?=D0=B0=20(P1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 7 пунктов: Enter, Loss, Transfer, Inventory, CustomerReturn, SupplierReturn, Hangfire dashboard. Co-Authored-By: Claude Opus 4.7 --- docs/sprint2-progress.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 docs/sprint2-progress.md diff --git a/docs/sprint2-progress.md b/docs/sprint2-progress.md new file mode 100644 index 0000000..1fcad13 --- /dev/null +++ b/docs/sprint2-progress.md @@ -0,0 +1,39 @@ +# Спринт 2 — складские документы (P1) + +Автономная работа. После каждого пункта: `dotnet build` (SDK 8.0.126), +unit + integration + (где применимо) E2E тесты этого пункта, коммит порцией, +отметка `[x]` здесь, коммит прогресса. + +Multi-tenant: все новые сущности — `TenantEntity` с `OrganizationId` + +query filter. Stock-инвариант: после каждого Post/Unpost +`Stock.Quantity ≡ Σ StockMovement` для (Product, Store). + +## Чек-лист + +1. [ ] **P1-1 Оприходование (Enter)** — Domain `Enter`+`EnterLine`, EF, миграция, + контроллер CRUD + Post/Unpost (Stock + StockMovement тип `Enter`), Web + `/inventory/enters`. Без поставщика (источник — начальные остатки, излишек инвентаризации). +2. [ ] **P1-2 Списание (Loss)** — Domain `Loss`+`LossLine` + enum `LossReason` + (Defect/Expired/Damage/Shortage/Other). EF, миграция, контроллер, Web, + `StockMovement` тип `WriteOff`. +3. [ ] **P1-3 Перемещение (Transfer)** — Domain `Transfer`+`TransferLine` + (FromStoreId → ToStoreId, обязательны и различны). Атомарная транзакция: + `TransferOut` из From + `TransferIn` в To. EF, миграция, контроллер + Post/Unpost, + Web. Кейс: post→unpost не оставляет orphan-движений. +4. [ ] **P1-4 Инвентаризация (Inventory)** — Domain `Inventory`+`InventoryLine` + (productId, bookQty, actualQty, diff). EF, миграция. Контроллер: создание + подгружает текущие остатки; Post создаёт `InventoryAdjustment` на diff. Web: + форма со списком товаров склада, импорт CSV факта. +5. [ ] **P1-6 Возврат от покупателя (CustomerReturn)** — расширение `RetailSale` + опцией возврата (referenceSaleId или без). Контроллер: создание возврата из + проведённой продажи, `CustomerReturn` тип уже есть. Web: кнопка «Создать возврат». +6. [ ] **P1-7 Возврат поставщику (SupplierReturn)** — по аналогии для Supply. + Domain `SupplierReturn`+`Line` (referenceSupplyId). Контроллер. Web. +7. [ ] **P1-16 Hangfire dashboard + cleanup** — `Hangfire.Dashboard` с + авторизацией только для SuperAdmin. Scheduled: ежедневный cleanup + `StockMovement` старше 2 лет, audit-log старше 90 дней. + +## Лог + +- Каждый пункт: build + тесты + коммит порцией + отметка [x] + коммит прогресса. +- Все правки на ветке `main` (origin Forgejo), без коммита `global.json`.