2.9 KiB
2.9 KiB
Спринт 5 — оптовые продажи, email, аудит, надёжность import-job
Автономная работа. После каждого пункта: dotnet build (SDK 8.0.126),
unit + integration тесты, коммит порцией, отметка [x], коммит прогресса.
Multi-tenant: все новые сущности — TenantEntity с OrganizationId +
query filter. E2E на изоляцию A vs B где применимо.
Чек-лист
- P1-5 Оптовая отгрузка (Demand) — Domain
Demand+DemandLine(CounterpartyId юрлица, способ оплаты нал/безнал, цена опт., НДС). EF + миграция. Контроллер CRUD + Post/Unpost. Web/sales/demands.StockMovementтипWholesaleSale. Multi-tenant. Тесты. ✅ Зеркалит RetailSale без RetailPoint/Cashier;DemandPayment.Credit(постоплата/дебиторка),PaidAmountдля отслеживания. Permissions переиспользуют существующиеDemandsEdit/Post. Метрикиdocuments_posted{type="demand"}. 3 интеграционных теста. - P1-18 Аудит мутаций tenant'а — Domain
OrgAuditLog(какSuperAdminAuditLog, но per-org). Hook через EF SaveChangesInterceptor на Supply/Sale/Demand/Product/Counterparty. UI:/audit-logдля админа. Multi-tenant строго. Тесты. ✅OrgAuditInterceptorснимает diff наSavingChanges(до commit) — атомарно с мутацией. ChangesJson:{"field":{"before":X,"after":Y}}. Белый список типов: Supply/SupplierReturn/RetailSale/Demand/Product/ ProductPrice/ProductBarcode/Counterparty. Web/audit-logс фильтрами и diff-viewer'ом. Tenant-isolation через query-filter. 3 интеграционных. - P1-22 Email-шаблоны — расширить MailKit-сервис:
Resources/EmailTemplates/*.html. Шаблоны: приглашение сотрудника с временным паролем (sendInvite=true), еженедельный summary владельцу (Hangfire recurring), low-stock alert (Hangfire daily). Тесты рендеринга. - TD-5 ImportJobRegistry в БД — сейчас in-memory
ConcurrentDictionary, теряется при рестарте. Перевод на таблицуImportJobs(Id, OrgId, Status, Progress, Total, StartedAt, FinishedAt, Errors JSON). Миграция.MoySkladImportControllerиспользует. Тесты.
Лог
- Каждый пункт: build + тесты + коммит порцией + отметка [x] + коммит прогресса.
- Все правки на
main(origin Forgejo), без коммитаglobal.json.