# Закупки и инвентарь Модуль хранит заявки на закупку, позиции, маршруты согласования, бюджеты, оборудование, обслуживание, передачи и поставщиков. REST API опубликован под `/api/v1/procurement/`; точный контракт доступен в `/api/docs/`. ## Код модуля - `models.py` — доменные модели и состояния; - `services.py` — вычисление маршрутов согласования и общая бизнес-логика; - `activity.py` — журнал действий; - `notifications/` — verbs, handlers, signals и read-state integration; - `api/v1/procurement/` — serializers, permissions, viewsets и router; - `frontend/src/lib/api/procurement.ts` — frontend client. Router публикует resources `requests`, `items`, `budgets`, `equipment-categories`, `equipment`, `maintenance`, `suppliers` и `stats`. Workflow actions, фильтры и payload необходимо смотреть в OpenAPI, поскольку они меняются вместе с viewsets. ## Уведомления и realtime Закупки создают verb-based уведомления через `notifications.signals.notify.send`. Доставка выполняется общим channel router через Celery с учётом preferences и DND; прямого рабочего `NotificationService` в проекте нет. Изменение состояния заявки также может отправлять `procurement_update` через единый пользовательский endpoint `/ws/`. Отдельный procurement socket не нужен. - [Руководство по уведомлениям](../../docs/guides/NOTIFICATIONS.md) - [WebSocket contract](../../docs/guides/WEBSOCKET.md) - [HTTP API](../../docs/guides/API.md) При изменении workflow проверяйте object permissions, атомарность транзакции, activity log, получателей уведомлений и realtime payload. Уведомление следует планировать после commit, чтобы клиент не получил ссылку на ещё незафиксированное состояние.