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`.