Текущее состояние перед рефакторингом Transfer → TransferDocument. Все изменения с последнего коммита по улучшению системы поступлений. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
5.9 KiB
Критичные улучшения системы поступления
🔴 Высокий приоритет
1. Безопасность и права доступа
Проблема: Нет проверки прав доступа в views Риск: Любой авторизованный пользователь может подтверждать/отменять документы
# Добавить в views:
- PermissionRequiredMixin для confirm/cancel
- Проверка прав на склад (может ли пользователь работать с этим складом)
- Проверка прав на изменение подтвержденных документов
Файлы: inventory/views/incoming_document.py
2. Тестирование критических путей
Проблема: Нет автотестов для основных операций Риск: Регрессии при изменениях
Минимальный набор тестов:
# 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
Проблема: Избыточные запросы к БД при отображении списков Риск: Медленная работа при большом количестве документов
# 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 Решение:
# 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)
- ✅ Неделя 2: Тесты (критические пути, п.2)
- ✅ Неделя 3: Производительность (N+1, п.3)
- ✅ 26.12.2025: Рефакторинг моделей (п.4) - избавились от лишних сущностей
- 📅 По необходимости: Bulk операции (п.5), документация (п.6)
Метрики успеха
- ✅ Все критические операции покрыты тестами (>80% coverage)
- ✅ Список документов загружается <500ms (при 1000+ документах)
- ✅ Нет уязвимостей прав доступа
- ✅ Документация актуальна
Дата создания: 2025-12-26 Рейтинг текущей архитектуры: 8.5/10