Текущее состояние перед рефакторингом Transfer → TransferDocument. Все изменения с последнего коммита по улучшению системы поступлений. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
151 lines
7.0 KiB
Python
151 lines
7.0 KiB
Python
"""
|
||
Отладочные view для суперюзеров.
|
||
Для мониторинга работы системы инвентаризации.
|
||
"""
|
||
from django.contrib.auth.decorators import login_required, user_passes_test
|
||
from django.shortcuts import render
|
||
from django.db.models import Q, Sum, Count
|
||
from inventory.models import (
|
||
StockBatch, Stock, Reservation, Sale, SaleBatchAllocation, WriteOff,
|
||
WriteOffDocument, WriteOffDocumentItem, IncomingDocument, IncomingDocumentItem
|
||
)
|
||
from orders.models import Order
|
||
from products.models import Product
|
||
from inventory.models import Warehouse
|
||
|
||
|
||
def is_superuser(user):
|
||
"""Проверка что пользователь - суперюзер."""
|
||
return user.is_superuser
|
||
|
||
|
||
@login_required
|
||
@user_passes_test(is_superuser)
|
||
def debug_inventory_page(request):
|
||
"""
|
||
Отладочная страница для суперюзеров.
|
||
Показывает полную картину по инвентаризации: партии, остатки, резервы, продажи.
|
||
"""
|
||
# Получаем параметры фильтров
|
||
product_id = request.GET.get('product')
|
||
order_number = request.GET.get('order')
|
||
warehouse_id = request.GET.get('warehouse')
|
||
|
||
# Базовые querysets
|
||
stock_batches = StockBatch.objects.select_related('product', 'warehouse').order_by('-created_at')
|
||
stocks = Stock.objects.select_related('product', 'warehouse').order_by('product__name')
|
||
reservations = Reservation.objects.select_related(
|
||
'product', 'warehouse', 'order_item__order'
|
||
).order_by('-reserved_at')
|
||
sales = Sale.objects.select_related('product', 'warehouse', 'order').order_by('-date')
|
||
allocations = SaleBatchAllocation.objects.select_related(
|
||
'sale__product', 'batch'
|
||
).order_by('-id')
|
||
# Все списания: из продаж (WriteOff) и из документов списания (WriteOffDocumentItem)
|
||
writeoffs = WriteOff.objects.select_related('batch__product', 'batch__warehouse').order_by('-date')
|
||
writeoff_documents = WriteOffDocument.objects.select_related('warehouse').order_by('-date')
|
||
writeoff_document_items = WriteOffDocumentItem.objects.select_related(
|
||
'product', 'document__warehouse'
|
||
).order_by('-id')
|
||
# Документы поступления
|
||
incoming_documents = IncomingDocument.objects.select_related('warehouse', 'created_by', 'confirmed_by').order_by('-date', '-created_at')
|
||
incoming_document_items = IncomingDocumentItem.objects.select_related('product', 'document__warehouse').order_by('-id')
|
||
orders = Order.objects.prefetch_related('items').order_by('-created_at')
|
||
|
||
# Применяем фильтры
|
||
if product_id:
|
||
product = Product.objects.filter(id=product_id).first()
|
||
stock_batches = stock_batches.filter(product_id=product_id)
|
||
stocks = stocks.filter(product_id=product_id)
|
||
reservations = reservations.filter(product_id=product_id)
|
||
sales = sales.filter(product_id=product_id)
|
||
allocations = allocations.filter(sale__product_id=product_id)
|
||
writeoffs = writeoffs.filter(batch__product_id=product_id)
|
||
writeoff_document_items = writeoff_document_items.filter(product_id=product_id)
|
||
incoming_document_items = incoming_document_items.filter(product_id=product_id)
|
||
orders = orders.filter(items__product_id=product_id).distinct()
|
||
else:
|
||
product = None
|
||
|
||
if order_number:
|
||
# Парсим номер заказа: "ORD-103" -> 103 или "103" -> 103
|
||
try:
|
||
# Если формат "ORD-XXX", извлекаем число
|
||
if order_number.upper().startswith('ORD-'):
|
||
order_num = int(order_number.upper().replace('ORD-', ''))
|
||
else:
|
||
# Просто число
|
||
order_num = int(order_number)
|
||
|
||
order = Order.objects.filter(order_number=order_num).first()
|
||
except (ValueError, AttributeError):
|
||
order = None
|
||
|
||
if order:
|
||
reservations = reservations.filter(order_item__order=order)
|
||
sales = sales.filter(order=order)
|
||
# Фильтруем товары по заказу
|
||
product_ids = order.items.values_list('product_id', flat=True)
|
||
stock_batches = stock_batches.filter(product_id__in=product_ids)
|
||
stocks = stocks.filter(product_id__in=product_ids)
|
||
allocations = allocations.filter(sale__order=order)
|
||
# Фильтруем только этот заказ в таблице заказов
|
||
orders = orders.filter(id=order.id)
|
||
else:
|
||
order = None
|
||
|
||
if warehouse_id:
|
||
warehouse = Warehouse.objects.filter(id=warehouse_id).first()
|
||
stock_batches = stock_batches.filter(warehouse_id=warehouse_id)
|
||
stocks = stocks.filter(warehouse_id=warehouse_id)
|
||
reservations = reservations.filter(warehouse_id=warehouse_id)
|
||
sales = sales.filter(warehouse_id=warehouse_id)
|
||
writeoffs = writeoffs.filter(batch__warehouse_id=warehouse_id)
|
||
writeoff_documents = writeoff_documents.filter(warehouse_id=warehouse_id)
|
||
writeoff_document_items = writeoff_document_items.filter(document__warehouse_id=warehouse_id)
|
||
incoming_documents = incoming_documents.filter(warehouse_id=warehouse_id)
|
||
incoming_document_items = incoming_document_items.filter(document__warehouse_id=warehouse_id)
|
||
else:
|
||
warehouse = None
|
||
|
||
# Ограничиваем количество записей для производительности
|
||
stock_batches = stock_batches[:100]
|
||
stocks = stocks[:100]
|
||
reservations = reservations[:100]
|
||
sales = sales[:100]
|
||
allocations = allocations[:100]
|
||
writeoffs = writeoffs[:100]
|
||
writeoff_documents = writeoff_documents[:50]
|
||
writeoff_document_items = writeoff_document_items[:100]
|
||
incoming_documents = incoming_documents[:50]
|
||
incoming_document_items = incoming_document_items[:100]
|
||
orders = orders[:50]
|
||
|
||
# Списки для фильтров
|
||
products = Product.objects.filter(archived_at__isnull=True).order_by('name')[:200]
|
||
warehouses = Warehouse.objects.filter(is_active=True).order_by('name')
|
||
|
||
context = {
|
||
'stock_batches': stock_batches,
|
||
'stocks': stocks,
|
||
'reservations': reservations,
|
||
'sales': sales,
|
||
'allocations': allocations,
|
||
'writeoffs': writeoffs,
|
||
'writeoff_documents': writeoff_documents,
|
||
'writeoff_document_items': writeoff_document_items,
|
||
'incoming_documents': incoming_documents,
|
||
'incoming_document_items': incoming_document_items,
|
||
'orders': orders,
|
||
'products': products,
|
||
'warehouses': warehouses,
|
||
'selected_product': product,
|
||
'selected_order': order,
|
||
'selected_warehouse': warehouse,
|
||
'product_id': product_id,
|
||
'order_number': order_number,
|
||
'warehouse_id': warehouse_id,
|
||
}
|
||
|
||
return render(request, 'inventory/debug_page.html', context)
|