docs: добавлен план критичных улучшений системы поступления
Документ содержит приоритизированный план улучшений: Высокий приоритет: - Добавить проверку прав доступа в views - Покрыть тестами критические пути - Оптимизировать N+1 запросы в списках Средний приоритет: - Рефакторинг избыточности моделей - Bulk операции для массового импорта - Улучшение документации Низкий приоритет: - Асинхронная обработка больших документов - Аудит и история изменений 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
153
myproject/УЛУЧШИТЬ ПОСТУПЛЕНИЕ.md
Normal file
153
myproject/УЛУЧШИТЬ ПОСТУПЛЕНИЕ.md
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
# Критичные улучшения системы поступления
|
||||||
|
|
||||||
|
## 🔴 Высокий приоритет
|
||||||
|
|
||||||
|
### 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
|
||||||
Reference in New Issue
Block a user