From 7cab70e8b02f9034944c91c68ace2ef6170d800c Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Mon, 5 Jan 2026 01:38:59 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B0=D1=81=D1=88=D0=B8=D1=80=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20debug=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=86=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D0=BE=D1=82=D1=81=D0=BB?= =?UTF-8?q?=D0=B5=D0=B6=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D1=82=D1=83=D1=81=D0=BE=D0=B2=20ShowcaseItem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - inventory/templates/inventory/debug_page.html: добавлена секция ShowcaseItem * Таблица с полями: ID, Название, Статус, OrderItem, Locked By * Цветовые индикаторы статусов (available/in_cart/reserved/sold) * Ссылки на связанные OrderItem - inventory/views/debug_views.py: добавлены данные ShowcaseItem в контекст * showcase_items queryset с select_related для оптимизации * Статистика по статусам ShowcaseItem - Инструмент для тестирования lifecycle витринных букетов --- .../templates/inventory/debug_page.html | 92 ++++++++++++++++++- myproject/inventory/views/debug_views.py | 22 ++++- 2 files changed, 112 insertions(+), 2 deletions(-) diff --git a/myproject/inventory/templates/inventory/debug_page.html b/myproject/inventory/templates/inventory/debug_page.html index 19944dd..2381ac3 100644 --- a/myproject/inventory/templates/inventory/debug_page.html +++ b/myproject/inventory/templates/inventory/debug_page.html @@ -69,6 +69,11 @@ .status-reserved { background-color: #fff3cd; } .status-converted { background-color: #d1ecf1; } .status-released { background-color: #d4edda; } + .showcase-available { background-color: #d4edda; } + .showcase-in-cart { background-color: #fff3cd; } + .showcase-reserved { background-color: #ffeaa7; } + .showcase-sold { background-color: #d1ecf1; } + .showcase-dismantled { background-color: #f8d7da; } .inactive-row { background-color: #f8d7da; opacity: 0.7; } .section-card { border: 1px solid #dee2e6; @@ -367,7 +372,92 @@ - + +
+

🌺 Витринные экземпляры ShowcaseItem ({{ showcase_items.count }})

+
+ Available: {{ showcase_items_stats.available|default:0 }} +
+
+ In Cart: {{ showcase_items_stats.in_cart|default:0 }} +
+
+ Reserved: {{ showcase_items_stats.reserved|default:0 }} +
+
+ Sold: {{ showcase_items_stats.sold|default:0 }} +
+
+ Dismantled: {{ showcase_items_stats.dismantled|default:0 }} +
+
+ + + + + + + + + + + + + + + {% for item in showcase_items %} + + + + + + + + + + + {% empty %} + + {% endfor %} + +
IDКомплектВитринаСтатусЗаказПроданоСозданОбновлён
{{ item.id }} + {{ item.product_kit.name }} + {% if item.product_kit.is_temporary %} + TEMP + {% endif %} + {{ item.showcase.name }} + {% if item.status == 'available' %} + Доступен + {% elif item.status == 'in_cart' %} + В корзине + {% elif item.status == 'reserved' %} + Зарезервирован + {% elif item.status == 'sold' %} + Продан + {% elif item.status == 'dismantled' %} + Разобран + {% else %} + {{ item.get_status_display }} + {% endif %} + + {% if item.sold_order_item %} + {{ item.sold_order_item.order.order_number }} + (#{{ item.sold_order_item.id }}) + {% else %} + - + {% endif %} + + {% if item.sold_at %}{{ item.sold_at|date:"d.m.Y H:i:s" }}{% else %}-{% endif %} + {{ item.created_at|date:"d.m.Y H:i" }}{{ item.updated_at|date:"d.m.Y H:i:s" }}
Нет витринных экземпляров
+
+

💰 Продажи Sale ({{ sales.count }})

diff --git a/myproject/inventory/views/debug_views.py b/myproject/inventory/views/debug_views.py index fee76a4..3037c85 100644 --- a/myproject/inventory/views/debug_views.py +++ b/myproject/inventory/views/debug_views.py @@ -7,7 +7,8 @@ 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 + WriteOffDocument, WriteOffDocumentItem, IncomingDocument, IncomingDocumentItem, + ShowcaseItem ) from orders.models import Order from products.models import Product @@ -51,6 +52,11 @@ def debug_inventory_page(request): 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') + + # Витринные экземпляры + showcase_items = ShowcaseItem.objects.select_related( + 'product_kit', 'showcase', 'sold_order_item__order' + ).order_by('-updated_at') # Применяем фильтры if product_id: @@ -91,6 +97,8 @@ def debug_inventory_page(request): allocations = allocations.filter(sale__order=order) # Фильтруем только этот заказ в таблице заказов orders = orders.filter(id=order.id) + # Фильтруем витринные экземпляры по заказу + showcase_items = showcase_items.filter(sold_order_item__order=order) else: order = None @@ -120,6 +128,16 @@ def debug_inventory_page(request): incoming_documents = incoming_documents[:50] incoming_document_items = incoming_document_items[:100] orders = orders[:50] + showcase_items = showcase_items[:100] + + # Статистика по статусам ShowcaseItem + showcase_items_stats = ShowcaseItem.objects.aggregate( + available=Count('id', filter=Q(status='available')), + in_cart=Count('id', filter=Q(status='in_cart')), + reserved=Count('id', filter=Q(status='reserved')), + sold=Count('id', filter=Q(status='sold')), + dismantled=Count('id', filter=Q(status='dismantled')), + ) # Списки для фильтров products = Product.objects.filter(archived_at__isnull=True).order_by('name')[:200] @@ -137,6 +155,8 @@ def debug_inventory_page(request): 'incoming_documents': incoming_documents, 'incoming_document_items': incoming_document_items, 'orders': orders, + 'showcase_items': showcase_items, + 'showcase_items_stats': showcase_items_stats, 'products': products, 'warehouses': warehouses, 'selected_product': product,