""" Отладочные 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('-created_at') 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: order = Order.objects.filter(order_number=order_number).first() 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) 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(is_active=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)