refactor: подготовка к стандартизации Transfer моделей

Текущее состояние перед рефакторингом Transfer → TransferDocument.
Все изменения с последнего коммита по улучшению системы поступлений.

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-26 19:55:50 +03:00
parent 0da2995a74
commit c534e27c41
14 changed files with 198 additions and 313 deletions

View File

@@ -14,7 +14,7 @@ from django.utils import timezone
from django.core.exceptions import ValidationError
from inventory.models import (
IncomingDocument, IncomingDocumentItem, IncomingBatch, Incoming
IncomingDocument, IncomingDocumentItem, StockBatch, Stock
)
from inventory.utils.document_generator import generate_incoming_document_number
@@ -165,10 +165,9 @@ class IncomingDocumentService:
Процесс:
1. Проверяем что документ - черновик и имеет позиции
2. Создаем IncomingBatch с номером документа
3. Для каждой позиции создаем Incoming запись
4. Сигнал create_stock_batch_on_incoming автоматически создаст StockBatch
5. Меняем статус документа на 'confirmed'
2. Для каждой позиции создаем StockBatch напрямую
3. Обновляем Stock
4. Меняем статус документа на 'confirmed'
Args:
document: IncomingDocument
@@ -188,30 +187,30 @@ class IncomingDocumentService:
if not document.items.exists():
raise ValidationError("Нельзя провести пустой документ")
# Создаем IncomingBatch
incoming_batch = IncomingBatch.objects.create(
warehouse=document.warehouse,
document_number=document.document_number,
receipt_type=document.receipt_type,
supplier_name=document.supplier_name if document.receipt_type == 'supplier' else '',
notes=document.notes
)
# Создаем Incoming записи для каждого товара
incomings_created = []
# Создаем StockBatch напрямую для каждого товара
batches_created = []
total_cost = Decimal('0')
for item in document.items.select_related('product'):
incoming = Incoming.objects.create(
batch=incoming_batch,
# Создаем партию товара на складе
stock_batch = StockBatch.objects.create(
product=item.product,
warehouse=document.warehouse,
quantity=item.quantity,
cost_price=item.cost_price,
notes=item.notes
is_active=True
)
incomings_created.append(incoming)
batches_created.append(stock_batch)
total_cost += item.total_cost
# Обновляем или создаем запись в Stock
stock, _ = Stock.objects.get_or_create(
product=item.product,
warehouse=document.warehouse
)
# Пересчитываем остаток из всех активных партий
stock.refresh_from_batches()
# Обновляем статус документа
document.status = 'confirmed'
document.confirmed_by = confirmed_by
@@ -220,8 +219,7 @@ class IncomingDocumentService:
return {
'document': document,
'incoming_batch': incoming_batch,
'incomings_created': len(incomings_created),
'batches_created': len(batches_created),
'total_quantity': document.total_quantity,
'total_cost': total_cost
}