Corp/backend/procurement
Игорь Надеин c94de51c31 feat: добавление управления оборудованием через UI
- Добавлена кнопка 'Добавить оборудование' на странице списка
- Создан модал для добавления нового оборудования
- Создан модал для редактирования существующего оборудования
- Добавлена кнопка редактирования в dropdown меню каждой карточки
- Реализованы JavaScript обработчики для создания/редактирования через API
- Добавлен импорт User в views_frontend.py для передачи списка пользователей
- Все поля модели Equipment доступны для редактирования (включая статус, отдел)
2025-12-09 13:04:56 +03:00
..

Модуль "Закупки и инвентарь" (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