refactor: стандартизация моделей документов перемещения

Приведение к единому паттерну именования документов:
- TransferBatch → TransferDocument
- TransferItem → TransferDocumentItem
- Удалена устаревшая модель Transfer (одиночные перемещения)
- Удалена неиспользуемая модель StockMovement

Изменения:
- models.py: переименование классов, обновление related_names
- admin.py: удаление регистраций Transfer/StockMovement
- forms.py: обновление TransferHeaderForm
- views/transfer.py: обновление всех view классов
- templates: замена transfer_batch → transfer_document
- urls.py: удаление путей для movements
- views/__init__.py: удаление импорта StockMovementListView
- views/movements.py: удален файл

Миграция: 0005_refactor_transfer_models
- RenameModel операции для сохранения данных
- DeleteModel для Transfer и StockMovement

Единый паттерн: *Document + *DocumentItem
(WriteOffDocument, IncomingDocument, 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 20:29:11 +03:00
parent c534e27c41
commit 08bae834c8
9 changed files with 84 additions and 170 deletions

View File

@@ -13,7 +13,6 @@ Inventory Views Package
- stock.py: Справочник остатков (view-only)
- batch.py: Справочник партий товара (view-only)
- allocation.py: Распределение продаж по партиям (view-only)
- movements.py: Журнал складских операций (view-only)
"""
from django.shortcuts import render
from django.contrib.auth.decorators import login_required
@@ -41,7 +40,6 @@ from .transfer import TransferListView, TransferBulkCreateView, TransferDetailVi
from .reservation import ReservationListView
from .stock import StockListView, StockDetailView
from .allocation import SaleBatchAllocationListView
from .movements import StockMovementListView
@login_required

View File

@@ -1,24 +0,0 @@
# -*- coding: utf-8 -*-
"""
StockMovement (Журнал всех складских операций) views - READ ONLY
GROUP 3: LOW PRIORITY - Аудит логирование
"""
from django.views.generic import ListView
from django.contrib.auth.mixins import LoginRequiredMixin
from ..models import StockMovement
class StockMovementListView(LoginRequiredMixin, ListView):
"""
Полный журнал всех складских операций (приход, продажа, списание, корректировка).
Используется для аудита и контроля.
"""
model = StockMovement
template_name = 'inventory/movements/movement_list.html'
context_object_name = 'movements'
paginate_by = 50
def get_queryset(self):
return StockMovement.objects.select_related(
'product', 'order'
).order_by('-created_at')

View File

@@ -13,7 +13,7 @@ from django.contrib import messages
from django.http import JsonResponse
from django.db import transaction
from django.shortcuts import redirect, render
from ..models import TransferBatch, TransferItem, Stock
from ..models import TransferDocument, TransferDocumentItem, Stock
from ..forms import TransferBulkForm
from inventory.utils.document_generator import generate_transfer_document_number
from inventory.services.batch_manager import StockBatchManager
@@ -24,19 +24,19 @@ class TransferListView(LoginRequiredMixin, ListView):
"""
View для просмотра списка документов перемещений товаров.
"""
model = TransferBatch
model = TransferDocument
template_name = 'inventory/transfer/transfer_list.html'
context_object_name = 'transfers'
paginate_by = 20
def get_queryset(self):
return TransferBatch.objects.select_related(
return TransferDocument.objects.select_related(
'from_warehouse', 'to_warehouse'
).order_by('-created_at')
# ============================================================================
# VIEWS ДЛЯ ПЕРЕМЕЩЕНИЯ ТОВАРОВ (TransferBatch + TransferItem)
# VIEWS ДЛЯ ПЕРЕМЕЩЕНИЯ ТОВАРОВ (TransferDocument + TransferDocumentItem)
# ============================================================================
class TransferBulkCreateView(LoginRequiredMixin, View):
@@ -100,8 +100,8 @@ class TransferBulkCreateView(LoginRequiredMixin, View):
# Начинаем транзакцию
try:
with transaction.atomic():
# 1. Создаем документ TransferBatch
transfer_batch = TransferBatch.objects.create(
# 1. Создаем документ TransferDocument
transfer_document = TransferDocument.objects.create(
from_warehouse=from_warehouse,
to_warehouse=to_warehouse,
document_number=generate_transfer_document_number(),
@@ -119,10 +119,10 @@ class TransferBulkCreateView(LoginRequiredMixin, View):
quantity=quantity
)
# Создаем TransferItem для каждого использованного batch
# Создаем TransferDocumentItem для каждого использованного batch
for source_batch, qty_transferred, new_batch in transfers:
TransferItem.objects.create(
transfer_batch=transfer_batch,
TransferDocumentItem.objects.create(
transfer_document=transfer_document,
product=product,
batch=source_batch,
quantity=qty_transferred,
@@ -136,11 +136,11 @@ class TransferBulkCreateView(LoginRequiredMixin, View):
# 3. Успешно создали документ
messages.success(
request,
f'Документ перемещения {transfer_batch.document_number} успешно создан. '
f'Документ перемещения {transfer_document.document_number} успешно создан. '
f'Перемещено {len(products)} видов товаров.'
)
return redirect('inventory:transfer-detail', pk=transfer_batch.id)
return redirect('inventory:transfer-detail', pk=transfer_document.id)
except Exception as e:
messages.error(request, f'Ошибка при создании документа перемещения: {str(e)}')
@@ -151,12 +151,12 @@ class TransferDetailView(LoginRequiredMixin, DetailView):
"""
View для просмотра деталей документа перемещения.
"""
model = TransferBatch
model = TransferDocument
template_name = 'inventory/transfer/transfer_detail.html'
context_object_name = 'transfer_batch'
context_object_name = 'transfer_document'
def get_queryset(self):
return TransferBatch.objects.select_related(
return TransferDocument.objects.select_related(
'from_warehouse', 'to_warehouse'
).prefetch_related(
'items__product', 'items__batch', 'items__new_batch'
@@ -164,10 +164,10 @@ class TransferDetailView(LoginRequiredMixin, DetailView):
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
transfer_batch = self.object
transfer_document = self.object
# Собираем статистику по документу
items = transfer_batch.items.all()
items = transfer_document.items.all()
total_items = items.count()
total_qty = sum(Decimal(str(item.quantity)) for item in items)
@@ -182,13 +182,13 @@ class TransferDeleteView(LoginRequiredMixin, DeleteView):
"""
View для удаления документа перемещения.
"""
model = TransferBatch
model = TransferDocument
template_name = 'inventory/transfer/transfer_confirm_delete.html'
success_url = reverse_lazy('inventory:transfer-list')
def form_valid(self, form):
transfer_batch = self.get_object()
messages.success(self.request, f'Документ перемещения {transfer_batch.document_number} удалён.')
transfer_document = self.get_object()
messages.success(self.request, f'Документ перемещения {transfer_document.document_number} удалён.')
return super().form_valid(form)