From 337335ec58bda7ec3025ae50294d99502fb94281 Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Mon, 1 Dec 2025 10:04:00 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BE=D1=82=D0=BB=D0=B0=D0=B4=D0=BE=D1=87=D0=BD?= =?UTF-8?q?=D0=B0=D1=8F=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D0=B0?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D1=81=D1=83=D0=BF=D0=B5=D1=80=D1=8E?= =?UTF-8?q?=D0=B7=D0=B5=D1=80=D0=BE=D0=B2=20+=20=D0=B8=D1=81=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BE=D1=88=D0=B8=D0=B1?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=BF=D0=BE=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Реализация: - Создан view debug_inventory_page (только для суперюзеров) - URL: /inventory/debug/ - Компактный дизайн с минимальными отступами (10-11px) - Ссылка 🔧 Debug в navbar (видна только суперюзерам) Функционал: 1. Показывает полную картину инвентаризации на одной странице: - Заказы (Order) - номер, статус, покупатель, is_returned - Остатки (Stock) - доступно, зарезервировано, свободно - Партии (StockBatch) - количество, активность, дата поступления - Резервы (Reservation) - статус, заказ, все даты - Продажи (Sale) - количество, цена продажи, заказ - Списания (SaleBatchAllocation) - откуда списано, сколько 2. Фильтры: - По товару (dropdown) - По номеру заказа (текстовое поле) - По складу (dropdown) 3. UI: - Цветовая индикация статусов резервов - Бейджи для ключевых данных - Компактные таблицы Bootstrap - Неактивные партии выделены красным Исправления: - Reservation.created_at → reserved_at (у модели нет created_at) - Sale.created_at → date (дата операции хранится в поле date) - Product.is_active → archived_at__isnull=True (используется soft delete) - Удалена колонка себестоимости из Sale (это поле не хранится в модели) Файлы: - inventory/views/debug_views.py - новый view - inventory/templates/inventory/debug_page.html - шаблон - inventory/urls.py - добавлен роут - templates/navbar.html - добавлена ссылка Юзкейс: Суперюзер принимает товар → оформляет заказ → меняет статусы → переходит на /inventory/debug/ → видит полную картину изменений --- myproject/inventory/templates/inventory/debug_page.html | 6 ++---- myproject/inventory/views/debug_views.py | 4 ++-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/myproject/inventory/templates/inventory/debug_page.html b/myproject/inventory/templates/inventory/debug_page.html index 85eb8f0..cdc9823 100644 --- a/myproject/inventory/templates/inventory/debug_page.html +++ b/myproject/inventory/templates/inventory/debug_page.html @@ -341,7 +341,6 @@ Склад Кол-во Цена продажи - Себестоимость Заказ Документ Создана @@ -355,7 +354,6 @@ {{ sale.warehouse.name }} {{ sale.quantity }} {{ sale.sale_price|floatformat:2 }} - {{ sale.cost_price|floatformat:2 }} {% if sale.order %} {{ sale.order.order_number }} @@ -364,10 +362,10 @@ {% endif %} {{ sale.document_number|default:"-" }} - {{ sale.created_at|date:"d.m.Y H:i:s" }} + {{ sale.date|date:"d.m.Y H:i:s" }} {% empty %} - Нет продаж + Нет продаж {% endfor %} diff --git a/myproject/inventory/views/debug_views.py b/myproject/inventory/views/debug_views.py index 368caa6..5182fc4 100644 --- a/myproject/inventory/views/debug_views.py +++ b/myproject/inventory/views/debug_views.py @@ -34,7 +34,7 @@ def debug_inventory_page(request): 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') + sales = Sale.objects.select_related('product', 'warehouse', 'order').order_by('-date') allocations = SaleBatchAllocation.objects.select_related( 'sale__product', 'batch' ).order_by('-id') @@ -83,7 +83,7 @@ def debug_inventory_page(request): orders = orders[:50] # Списки для фильтров - products = Product.objects.filter(is_active=True).order_by('name')[:200] + products = Product.objects.filter(archived_at__isnull=True).order_by('name')[:200] warehouses = Warehouse.objects.filter(is_active=True).order_by('name') context = {