Files
octopus/myproject/УЛУЧШИТЬ ПОСТУПЛЕНИЕ.md
Andrey Smakotin c534e27c41 refactor: подготовка к стандартизации Transfer моделей
Текущее состояние перед рефакторингом Transfer → TransferDocument.
Все изменения с последнего коммита по улучшению системы поступлений.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-26 19:55:50 +03:00

156 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Критичные улучшения системы поступления
## 🔴 Высокий приоритет
### 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