From 602c0579ec2bea6c20d4ab160e89d731ee4483ec Mon Sep 17 00:00:00 2001 From: nns Date: Thu, 28 May 2026 16:10:35 +0500 Subject: [PATCH] =?UTF-8?q?docs(sprint5):=20=D1=87=D0=B5=D0=BA-=D0=BB?= =?UTF-8?q?=D0=B8=D1=81=D1=82=20=E2=80=94=20Demand,=20OrgAudit,=20Email-?= =?UTF-8?q?=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=D1=8B,=20ImportJob=20persi?= =?UTF-8?q?stence?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 --- docs/sprint5-progress.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 docs/sprint5-progress.md diff --git a/docs/sprint5-progress.md b/docs/sprint5-progress.md new file mode 100644 index 0000000..0a7d887 --- /dev/null +++ b/docs/sprint5-progress.md @@ -0,0 +1,31 @@ +# Спринт 5 — оптовые продажи, email, аудит, надёжность import-job + +Автономная работа. После каждого пункта: `dotnet build` (SDK 8.0.126), +unit + integration тесты, коммит порцией, отметка `[x]`, коммит прогресса. + +Multi-tenant: все новые сущности — `TenantEntity` с `OrganizationId` + +query filter. E2E на изоляцию A vs B где применимо. + +## Чек-лист + +1. [ ] **P1-5 Оптовая отгрузка (Demand)** — Domain `Demand`+`DemandLine` + (CounterpartyId юрлица, способ оплаты нал/безнал, цена опт., НДС). EF + + миграция. Контроллер CRUD + Post/Unpost. Web `/sales/demands`. + `StockMovement` тип `WholesaleSale`. Multi-tenant. Тесты. +2. [ ] **P1-18 Аудит мутаций tenant'а** — Domain `OrgAuditLog` (как + `SuperAdminAuditLog`, но per-org). Hook через EF SaveChangesInterceptor + на Supply/Sale/Demand/Product/Counterparty. UI: `/audit-log` для админа. + Multi-tenant строго. Тесты. +3. [ ] **P1-22 Email-шаблоны** — расширить MailKit-сервис: + `Resources/EmailTemplates/*.html`. Шаблоны: приглашение сотрудника с + временным паролем (sendInvite=true), еженедельный summary владельцу + (Hangfire recurring), low-stock alert (Hangfire daily). Тесты рендеринга. +4. [ ] **TD-5 ImportJobRegistry в БД** — сейчас in-memory `ConcurrentDictionary`, + теряется при рестарте. Перевод на таблицу `ImportJobs` (Id, OrgId, Status, + Progress, Total, StartedAt, FinishedAt, Errors JSON). Миграция. + `MoySkladImportController` использует. Тесты. + +## Лог + +- Каждый пункт: build + тесты + коммит порцией + отметка [x] + коммит прогресса. +- Все правки на `main` (origin Forgejo), без коммита `global.json`.