# Критичные улучшения системы поступления ## 🔴 Высокий приоритет ### 1. Безопасность и права доступа **Проблема:** Нет проверки прав доступа в views **Риск:** Любой авторизованный пользователь может подтверждать/отменять документы ```python # Добавить в views: - PermissionRequiredMixin для confirm/cancel - Проверка прав на склад (может ли пользователь работать с этим складом) - Проверка прав на изменение подтвержденных документов ``` **Файлы:** `inventory/views/incoming_document.py` --- ### 2. Тестирование критических путей **Проблема:** Нет автотестов для основных операций **Риск:** Регрессии при изменениях **Минимальный набор тестов:** ```python # tests/test_incoming_document_service.py - test_create_document() - test_add_item() - test_confirm_document_creates_stock() - test_cancel_document_reverses_stock() - test_cannot_confirm_empty_document() - test_cannot_edit_confirmed_document() ``` --- ### 3. N+1 запросы в list views **Проблема:** Избыточные запросы к БД при отображении списков **Риск:** Медленная работа при большом количестве документов ```python # inventory/views/incoming_document.py:27 def get_queryset(self): return IncomingDocument.objects.select_related( 'warehouse', 'created_by', 'confirmed_by' ).prefetch_related( 'items__product' # ← Добавить ).annotate( items_count=Count('items'), # ← Добавить total_quantity=Sum('items__quantity'), # ← Добавить total_cost=Sum(F('items__quantity') * F('items__cost_price')) # ← Добавить ).order_by('-date', '-created_at') ``` --- ## 🟡 Средний приоритет ### 4. ✅ Рефакторинг модельной избыточности (ВЫПОЛНЕНО) **Проблема:** IncomingDocument → IncomingBatch → Incoming создавало 3 уровня данных **Решение:** ✅ Миграция к упрощенной структуре завершена **Текущая архитектура:** ``` IncomingDocument (документ) ↓ IncomingDocumentItem (позиции документа) ↓ StockBatch (напрямую создается из items при подтверждении) ``` **Достигнутые результаты:** - ✅ Удалены промежуточные модели Incoming/IncomingBatch - ✅ Упрощен код сигналов (удалены create_stock_batch_on_incoming и update_stock_batch_on_incoming_edit) - ✅ Упрощен IncomingDocumentService.confirm_document() - напрямую создает StockBatch - ✅ Меньше JOIN'ов в запросах - ✅ Применены миграции БД для удаления таблиц **Дата выполнения:** 2025-12-26 --- ### 5. Bulk операции для массового добавления товаров **Проблема:** Добавление товаров по одному при импорте из Excel **Решение:** ```python # inventory/services/incoming_document_service.py @staticmethod def add_items_bulk(document, items_data): """ items_data = [ {'product': product1, 'quantity': 10, 'cost_price': 100}, {'product': product2, 'quantity': 20, 'cost_price': 200}, ] """ IncomingDocumentItem.objects.bulk_create([ IncomingDocumentItem( document=document, product=item['product'], quantity=item['quantity'], cost_price=item['cost_price'] ) for item in items_data ]) ``` --- ### 6. Документация и комментарии **Добавить:** - Docstrings с примерами для всех методов service - Диаграмма потока данных в README: `IncomingDocument → IncomingBatch → Incoming → StockBatch → Stock` - Примеры использования API в комментариях --- ## 🟢 Низкий приоритет (будущее) ### 7. Асинхронное подтверждение больших документов **Для документов с 1000+ позициями:** - Celery task для confirm_document() - WebSocket уведомления о прогрессе - Фоновая обработка --- ### 8. Аудит и логирование **Отслеживание изменений:** - django-simple-history для IncomingDocument - Логирование всех операций с товарами - История изменений cost_price --- ## Порядок внедрения 1. ✅ **Неделя 1:** Безопасность (права доступ, п.1) 2. ✅ **Неделя 2:** Тесты (критические пути, п.2) 3. ✅ **Неделя 3:** Производительность (N+1, п.3) 4. ✅ **26.12.2025:** Рефакторинг моделей (п.4) - избавились от лишних сущностей 5. 📅 **По необходимости:** Bulk операции (п.5), документация (п.6) --- ## Метрики успеха - ✅ Все критические операции покрыты тестами (>80% coverage) - ✅ Список документов загружается <500ms (при 1000+ документах) - ✅ Нет уязвимостей прав доступа - ✅ Документация актуальна --- **Дата создания:** 2025-12-26 **Рейтинг текущей архитектуры:** 8.5/10