Stage 7 - Integration: - Create notification types migration for procurement - Fix signals to use pre_save for status tracking - Add broadcast_request_update function for WebSocket events - Add procurement_update handler in UserConsumer - Add 6 integration tests for signals and notifications - Update README with integration details All 72 tests passing (66 base + 6 integration).
Модуль "Закупки и инвентарь" (Procurement)
Описание
Модуль для управления внутренними закупками по отделам и учета оборудования/инвентаря с полной интеграцией уведомлений и real-time обновлений.
Основные возможности
1. Заявки на закупку
- Создание заявок с позициями (товары/услуги)
- Автоматический маршрут согласования по ролям:
- Руководитель отдела
- Финансовый менеджер
- Генеральный директор
- Отслеживание статуса: черновик → согласование → одобрено → заказано → получено → завершено
- Уровни срочности: низкая, средняя, высокая, критическая
- Real-time уведомления при изменении статуса через WebSocket
- Email уведомления для согласующих
2. Бюджетный контроль
- Бюджеты по отделам и кварталам
- Автоматическая проверка доступности средств при создании заявки
- Отслеживание использования бюджета в процентах
- Резервирование средств на период согласования
3. Инвентаризация оборудования
- Учет оборудования с инвентарными номерами
- QR-коды для маркировки (автогенерация)
- Иерархические категории оборудования
- Статусы: на складе, в использовании, на обслуживании, списано
- Привязка к отделам и ответственным лицам
- Отслеживание гарантийных сроков
- История передач оборудования между отделами
4. Техническое обслуживание
- История обслуживания оборудования
- Типы ТО: осмотр, плановое ТО, ремонт, модернизация
- Учёт затрат на обслуживание
5. Поставщики
- База данных поставщиков
- Контактная информация
- Рейтинги поставщиков
Модели данных
- ProcurementRequest — заявки на закупку
- ProcurementItem — позиции в заявках
- Approval — записи согласований
- Budget — бюджеты отделов по кварталам
- Equipment — оборудование/инвентарь
- EquipmentCategory — категории оборудования (иерархические)
- MaintenanceRecord — записи техобслуживания
- EquipmentTransferLog — история передач оборудования
- Supplier — поставщики
Интеграция с системой
Уведомления
Модуль полностью интегрирован с системой уведомлений:
procurement_new_request— новая заявка созданаprocurement_pending_approval— требуется согласование (высокий приоритет)procurement_approved— заявка одобренаprocurement_rejected— заявка отклонена (высокий приоритет)procurement_stage_approved— этап согласования пройденprocurement_completed— закупка завершенаequipment_transferred— оборудование переданоequipment_maintenance— обслуживание оборудования
WebSocket события
Real-time обновления через realtime.consumers.UserConsumer:
procurement_update— изменение статуса заявки- События транслируются всем пользователям отдела и создателю заявки
Сигналы
pre_save— отслеживание изменений статусаpost_save— отправка уведомлений и broadcast событий- Автоматическое резервирование/освобождение бюджета
Stage 1: Базовая структура ✅
Выполнено:
- ✅ Создано Django-приложение
procurement - ✅ Определены все константы и enums в
constants.py - ✅ Созданы 8 моделей данных в
models.py - ✅ Созданы и применены миграции
- ✅ Настроена админ-панель с инлайнами и цветными бадами
- ✅ Приложение добавлено в
INSTALLED_APPS - ✅ Написано 20 unit-тестов (все прошли)
Stage 2: API и права доступа ✅
Выполнено:
-
✅ Созданы permissions для всех ролей
IsDepartmentHead- руководитель отделаIsFinanceManager- финансовый менеджерIsDirector- директорCanCreateProcurementRequest- создание заявокCanEditOwnProcurementRequest- редактирование своих заявокCanApproveProcurementRequest- согласование заявокCanManageEquipment- управление оборудованиемCanManageBudget- управление бюджетамиCanManageSupplier- управление поставщиками
-
✅ Созданы сериализаторы для всех моделей
- List/Detail варианты для разной степени детализации
- Вложенные сериализаторы для связанных объектов
- Computed fields (total_price, is_editable, budget_available)
-
✅ Созданы ViewSets с полным функционалом
- CRUD операции для всех моделей
- Фильтрация, поиск, сортировка
- Custom actions:
submit- отправить заявку на согласованиеapprove- одобрить заявкуreject- отклонить заявкуmy_requests- мои заявкиpending_approvals- заявки на согласованииmy_equipment- мое оборудованиеwarranty_expiring- истекающие гарантииcurrent_quarter- бюджеты текущего кварталаtop_rated- лучшие поставщики
-
✅ Подключен django-filter для фильтрации
-
✅ URL routing настроен
API Endpoints:
Заявки на закупку:
GET /api/procurement/requests/- список заявокPOST /api/procurement/requests/- создать заявкуGET /api/procurement/requests/{id}/- детали заявкиPUT/PATCH /api/procurement/requests/{id}/- обновить заявкуDELETE /api/procurement/requests/{id}/- удалить заявкуPOST /api/procurement/requests/{id}/submit/- отправить на согласованиеPOST /api/procurement/requests/{id}/approve/- одобритьPOST /api/procurement/requests/{id}/reject/- отклонитьGET /api/procurement/requests/my_requests/- мои заявкиGET /api/procurement/requests/pending_approvals/- на согласовании
Позиции заявок:
GET /api/procurement/items/- список позицийPOST /api/procurement/items/- создать позициюGET /api/procurement/items/{id}/- детали позицииPUT/PATCH /api/procurement/items/{id}/- обновитьDELETE /api/procurement/items/{id}/- удалить
Оборудование:
GET /api/procurement/equipment/- список оборудованияPOST /api/procurement/equipment/- добавить оборудованиеGET /api/procurement/equipment/{id}/- деталиPUT/PATCH /api/procurement/equipment/{id}/- обновитьDELETE /api/procurement/equipment/{id}/- удалитьGET /api/procurement/equipment/my_equipment/- мое оборудованиеGET /api/procurement/equipment/warranty_expiring/- истекающие гарантии
Категории оборудования:
GET /api/procurement/equipment-categories/- список категорийPOST /api/procurement/equipment-categories/- создать категориюGET /api/procurement/equipment-categories/tree/- дерево категорийGET /api/procurement/equipment-categories/{id}/children/- подкатегории
Техническое обслуживание:
GET /api/procurement/maintenance/- записи обслуживанияPOST /api/procurement/maintenance/- создать записьGET /api/procurement/maintenance/{id}/- деталиPUT/PATCH /api/procurement/maintenance/{id}/- обновитьDELETE /api/procurement/maintenance/{id}/- удалить
Бюджеты:
GET /api/procurement/budgets/- список бюджетовPOST /api/procurement/budgets/- создать бюджетGET /api/procurement/budgets/{id}/- деталиPUT/PATCH /api/procurement/budgets/{id}/- обновитьDELETE /api/procurement/budgets/{id}/- удалитьGET /api/procurement/budgets/current_quarter/- текущий квартал
Поставщики:
GET /api/procurement/suppliers/- список поставщиковPOST /api/procurement/suppliers/- создать поставщикаGET /api/procurement/suppliers/{id}/- деталиPUT/PATCH /api/procurement/suppliers/{id}/- обновитьDELETE /api/procurement/suppliers/{id}/- удалитьGET /api/procurement/suppliers/top_rated/- лучшие поставщики
Фильтрация и поиск:
Заявки:
- Фильтры:
?status=pending&urgency=high&department=1 - Поиск:
?search=ноутбук - Сортировка:
?ordering=-created_at
Оборудование:
- Фильтры:
?status=available&category=1&department=2 - Поиск:
?search=INV-2025
Бюджеты:
- Фильтры:
?year=2025&quarter=4&department=1
Поставщики:
- Фильтры:
?is_active=true - Поиск:
?search=ООО
Администрирование
Все модели доступны через Django Admin:
/admin/procurement/procurementrequest/— заявки/admin/procurement/equipment/— оборудование/admin/procurement/budget/— бюджеты/admin/procurement/supplier/— поставщики- и т.д.
Stage 3: Workflow и уведомления ✅
Выполнено:
- ✅ Установлен django-fsm 3.0.1
- ✅ Созданы сигналы для автоматических уведомлений (signals.py)
notify_on_request_status_change- уведомления при изменении статуса заявкиnotify_on_approval_change- уведомления при согласовании/отклоненииnotify_approvers- уведомление всех согласующихnotify_requestor- уведомление создателя заявки- Интеграция с NotificationService из существующей системы
- ✅ Интегрирована система уведомлений (NotificationService)
- Web уведомления через WebSocket (real-time)
- Email уведомления с HTML шаблонами
- Telegram уведомления через Bot API
- Настройки пользователя для каналов доставки
- ✅ Интегрированы уведомления в ViewSet actions
- При submit: отправка уведомлений всем согласующим
- При approve: уведомление создателя + статус этапа
- При reject: уведомление создателя с причиной
- ✅ Подключены сигналы в apps.py (ready())
- ✅ Написано 9 workflow тестов (test_workflow.py)
- 1/9 проходят (остальные падают из-за items_count bug из Stage 2)
Workflow согласований:
DRAFT (Черновик)
↓ submit()
PENDING (На согласовании)
↓ approve() [все одобрили] ↓ reject() [хотя бы один отклонил]
APPROVED (Одобрено) REJECTED (Отклонено)
↓ start_work()
IN_PROGRESS (В работе)
↓ complete()
COMPLETED (Завершено)
Типы уведомлений:
Все уведомления отправляются через NotificationService:
- ✅ Web - мгновенные уведомления в браузере через WebSocket
- ✅ Email - HTML письма с красивым оформлением
- ✅ Telegram - уведомления в мессенджере (если настроено)
События:
- При создании заявки: Web уведомление руководителю отдела
- При отправке на согласование: Web + Email всем согласующим
- При одобрении этапа: Web + Email создателю о прохождении этапа
- При полном одобрении: Web + Email создателю о возможности приступить к закупке
- При отклонении: Web + Email создателю с комментариями отклонившего
- При превышении бюджета: Уведомления через signals (реализовано в сигналах)
Известные проблемы (унаследованы из Stage 2):
- ❌ items_count property конфликтует с annotate() - требует SerializerMethodField
- ❌ Из-за этого 8/9 workflow тестов не могут выполнить get_object()
Архитектурные решения:
- ✅ Использована NotificationService вместо Celery
- Причина: встроенная система уже поддерживает Web/Email/Telegram
- Преимущества: простота, нет дополнительных процессов, легче debugging
- Масштаб: достаточно для 50-200 сотрудников и <10 заявок/день
- Задержка 0.5-2 секунды на отправку email приемлема для редких операций
Следующие шаги:
- Исправить баг items_count из Stage 2
- Добавить типы уведомлений в базу NotificationType (если не созданы)
- Добавить FSM transitions в модель (опционально, текущая реализация функциональна)
Следующие этапы
Stage 4: Бюджетный контроль
- Аналитика и отчеты по бюджетам
- Dashboard с графиками
- Прогнозирование расходов
Stage 5: Инвентаризация
- QR-коды для оборудования
- Мобильное сканирование
- Планирование ТО
Stage 6: Frontend
- Интерфейсы создания заявок
- Dashboard согласований
- Каталог оборудования
Stage 7: Интеграции
- Связь с финансовым модулем
- Интеграция с календарем (ТО)
- Экспорт отчетов в Excel/PDF
Stage 8: Тестирование
- Unit tests для моделей
- API tests
- Integration tests
Технологический стек
- Backend: Django 5.2.4
- State Machine: django-fsm 3.0.1 ✅
- Notifications: NotificationService (встроенная система) ✅
- Web уведомления: Django Channels + WebSocket
- Email: HTML шаблоны через common.emails
- Telegram: Bot API
- Scheduler: APScheduler 3.11+ (для periodic tasks)
- Charts: Chart.js (планируется)
- Barcodes: python-barcode, qrcode (планируется)
- Reports: reportlab (планируется)
Разработка
Подробный план на 1-2 месяца см. в PROCUREMENT_IMPLEMENTATION_PLAN.md