Документ содержит приоритизированный план улучшений: Высокий приоритет: - Добавить проверку прав доступа в views - Покрыть тестами критические пути - Оптимизировать N+1 запросы в списках Средний приоритет: - Рефакторинг избыточности моделей - Bulk операции для массового импорта - Улучшение документации Низкий приоритет: - Асинхронная обработка больших документов - Аудит и история изменений 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
154 lines
5.6 KiB
Markdown
154 lines
5.6 KiB
Markdown
# Критичные улучшения системы поступления
|
||
|
||
## 🔴 Высокий приоритет
|
||
|
||
### 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
|
||
- Упростить код сигналов
|
||
- Меньше JOIN'ов в запросах
|
||
|
||
**Миграция:** Постепенная, требует переписывания signals и services
|
||
|
||
---
|
||
|
||
### 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. 📅 **Квартал 2:** Рефакторинг моделей (п.4)
|
||
5. 📅 **По необходимости:** Bulk операции (п.5), документация (п.6)
|
||
|
||
---
|
||
|
||
## Метрики успеха
|
||
|
||
- ✅ Все критические операции покрыты тестами (>80% coverage)
|
||
- ✅ Список документов загружается <500ms (при 1000+ документах)
|
||
- ✅ Нет уязвимостей прав доступа
|
||
- ✅ Документация актуальна
|
||
|
||
---
|
||
|
||
**Дата создания:** 2025-12-26
|
||
**Рейтинг текущей архитектуры:** 8.5/10
|