""" Отладочные 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 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') 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) 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) else: warehouse = None # Ограничиваем количество записей для производительности stock_batches = stock_batches[:100] stocks = stocks[:100] reservations = reservations[:100] sales = sales[:100] allocations = allocations[: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, '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)