Добавлена отладочная страница для суперюзеров (Inventory Debug)

Реализация:
- Создан view debug_inventory_page (только для суперюзеров)
- URL: /inventory/debug/
- Компактный дизайн с минимальными отступами и маленьким шрифтом (10-11px)

Функционал:
1. Показывает полную картину инвентаризации на одной странице:
   - Заказы (Order) - номер, статус, покупатель, is_returned
   - Остатки (Stock) - доступно, зарезервировано, свободно
   - Партии (StockBatch) - количество, активность, дата поступления
   - Резервы (Reservation) - статус (reserved/converted_to_sale/released), заказ, даты
   - Продажи (Sale) - количество, цены, заказ
   - Списания (SaleBatchAllocation) - откуда списано, сколько

2. Фильтры:
   - По товару (dropdown с названием и SKU)
   - По номеру заказа (текстовое поле)
   - По складу (dropdown)
   - Кнопка 'Применить' и 'Сбросить'

3. UI:
   - Цветовая индикация статусов резервов
   - Бейджи для ключевых данных
   - Компактные таблицы Bootstrap
   - Неактивные партии выделены красным
   - Ограничение в 100 записей на таблицу для производительности

4. Навигация:
   - Ссылка 🔧 Debug в navbar (видна только суперюзерам)
   - Красный цвет для видимости

Юзкейс:
Суперюзер принимает товар на склад → оформляет заказ → меняет статусы →
переходит на /inventory/debug/ → видит полную картину всех изменений

Файлы:
- inventory/views/debug_views.py - новый view
- inventory/templates/inventory/debug_page.html - шаблон
- inventory/urls.py - добавлен роут
- templates/navbar.html - добавлена ссылка для суперюзеров
This commit is contained in:
2025-12-01 09:57:06 +03:00
parent 7b1922c186
commit 6bb15db5a0
4 changed files with 534 additions and 1 deletions

View File

@@ -0,0 +1,106 @@
"""
Отладочные 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('-created_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)