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:
@@ -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
|
||||
|
||||
@@ -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')
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user