Добавлена отладочная страница для суперюзеров + исправлены ошибки полей

Реализация:
- Создан 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/ → видит полную картину изменений
This commit is contained in:
2025-12-01 10:04:00 +03:00
parent 8e036ba5e1
commit 337335ec58
2 changed files with 4 additions and 6 deletions

View File

@@ -341,7 +341,6 @@
<th>Склад</th> <th>Склад</th>
<th>Кол-во</th> <th>Кол-во</th>
<th>Цена продажи</th> <th>Цена продажи</th>
<th>Себестоимость</th>
<th>Заказ</th> <th>Заказ</th>
<th>Документ</th> <th>Документ</th>
<th>Создана</th> <th>Создана</th>
@@ -355,7 +354,6 @@
<td>{{ sale.warehouse.name }}</td> <td>{{ sale.warehouse.name }}</td>
<td><span class="badge bg-primary">{{ sale.quantity }}</span></td> <td><span class="badge bg-primary">{{ sale.quantity }}</span></td>
<td>{{ sale.sale_price|floatformat:2 }}</td> <td>{{ sale.sale_price|floatformat:2 }}</td>
<td>{{ sale.cost_price|floatformat:2 }}</td>
<td> <td>
{% if sale.order %} {% if sale.order %}
<strong>{{ sale.order.order_number }}</strong> <strong>{{ sale.order.order_number }}</strong>
@@ -364,10 +362,10 @@
{% endif %} {% endif %}
</td> </td>
<td class="text-muted-small">{{ sale.document_number|default:"-" }}</td> <td class="text-muted-small">{{ sale.document_number|default:"-" }}</td>
<td class="text-muted-small">{{ sale.created_at|date:"d.m.Y H:i:s" }}</td> <td class="text-muted-small">{{ sale.date|date:"d.m.Y H:i:s" }}</td>
</tr> </tr>
{% empty %} {% empty %}
<tr><td colspan="9" class="text-center text-muted">Нет продаж</td></tr> <tr><td colspan="8" class="text-center text-muted">Нет продаж</td></tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>

View File

@@ -34,7 +34,7 @@ def debug_inventory_page(request):
reservations = Reservation.objects.select_related( reservations = Reservation.objects.select_related(
'product', 'warehouse', 'order_item__order' 'product', 'warehouse', 'order_item__order'
).order_by('-reserved_at') ).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( allocations = SaleBatchAllocation.objects.select_related(
'sale__product', 'batch' 'sale__product', 'batch'
).order_by('-id') ).order_by('-id')
@@ -83,7 +83,7 @@ def debug_inventory_page(request):
orders = orders[:50] 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') warehouses = Warehouse.objects.filter(is_active=True).order_by('name')
context = { context = {