8. Юридическое досье — Workflow через Service Layer
Date: 2026-01-22
Status
Accepted
Context
Переходы между статусами заключения имеют сложную бизнес-логику: валидация, расчёт скора, создание версий, уведомления.
Decision
Вынести бизнес-логику в сервисный слой LegalConclusionService с методами:
create_request()— создание запросаtake_to_work()— взятие в работуsubmit_for_review()— отправка на проверкуapprove()/reject()/return_for_revision()— действия руководителяcancel()— отмена
Обоснование
- Тестируемость — сервисы легко тестировать в изоляции
- Переиспользование — логика доступна из API, админки, Celery-задач
- Транзакционность —
@transaction.atomicгарантирует консистентность - Расширяемость — легко добавить хуки для уведомлений
Альтернативы
- Логика в ViewSet — отвергнуто из-за дублирования и сложности тестирования
- Django Signals — отвергнуто из-за неявности и сложности отладки
- django-fsm — рассмотрено, но избыточно для данного случая
Consequences
- (+) Явная, читаемая бизнес-логика
- (+) Легко расширять и тестировать
- (-) Дополнительный слой абстракции
Источник: backend/narmak_v2/app/legal_dossier/ADR.md (ADR-003)