Игорь Надеин d04b5e38c2 feat: add procurement integration with notifications and real-time
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).
2025-12-09 12:23:02 +03:00

324 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Модуль "Закупки и инвентарь" (Procurement)
## Описание
Модуль для управления внутренними закупками по отделам и учета оборудования/инвентаря с полной интеграцией уведомлений и real-time обновлений.
## Основные возможности
### 1. Заявки на закупку
- Создание заявок с позициями (товары/услуги)
- Автоматический маршрут согласования по ролям:
- Руководитель отдела
- Финансовый менеджер
- Генеральный директор
- Отслеживание статуса: черновик → согласование → одобрено → заказано → получено → завершено
- Уровни срочности: низкая, средняя, высокая, критическая
- **Real-time уведомления** при изменении статуса через WebSocket
- **Email уведомления** для согласующих
### 2. Бюджетный контроль
- Бюджеты по отделам и кварталам
- Автоматическая проверка доступности средств при создании заявки
- Отслеживание использования бюджета в процентах
- Резервирование средств на период согласования
### 3. Инвентаризация оборудования
- Учет оборудования с инвентарными номерами
- QR-коды для маркировки (автогенерация)
- Иерархические категории оборудования
- Статусы: на складе, в использовании, на обслуживании, списано
- Привязка к отделам и ответственным лицам
- Отслеживание гарантийных сроков
- История передач оборудования между отделами
### 4. Техническое обслуживание
- История обслуживания оборудования
- Типы ТО: осмотр, плановое ТО, ремонт, модернизация
- Учёт затрат на обслуживание
### 5. Поставщики
- База данных поставщиков
- Контактная информация
- Рейтинги поставщиков
## Модели данных
1. **ProcurementRequest** — заявки на закупку
2. **ProcurementItem** — позиции в заявках
3. **Approval** — записи согласований
4. **Budget** — бюджеты отделов по кварталам
5. **Equipment** — оборудование/инвентарь
6. **EquipmentCategory** — категории оборудования (иерархические)
7. **MaintenanceRecord** — записи техобслуживания
8. **EquipmentTransferLog** — история передач оборудования
9. **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** - уведомления в мессенджере (если настроено)
**События:**
1. **При создании заявки**: Web уведомление руководителю отдела
2. **При отправке на согласование**: Web + Email всем согласующим
3. **При одобрении этапа**: Web + Email создателю о прохождении этапа
4. **При полном одобрении**: Web + Email создателю о возможности приступить к закупке
5. **При отклонении**: Web + Email создателю с комментариями отклонившего
6. **При превышении бюджета**: Уведомления через 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`