Рабочие изменения: улучшения UI, настройки и бэкенд авторизации

Собрал накопившиеся изменения из рабочей директории:

UI улучшения:
- customer_detail.html: Расширен интерфейс детальной страницы клиента
- order_detail.html: Добавлены элементы отображения деталей заказа
- order_list.html: Улучшена визуализация списка заказов

Бэкенд:
- customers/views.py: Доработаны представления для работы с клиентами
- products/views/product_views.py: Минорные правки
- user_roles/auth_backend.py: Добавлен кастомный бэкенд авторизации

Настройки:
- myproject/settings.py: Обновлены конфигурации
- .gitignore: Добавлен для игнорирования служебных файлов
- requirements.txt: Удален (вероятно заменен на poetry/pipenv)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-12-03 01:08:53 +03:00
parent dcfb76121d
commit 9dab280def
9 changed files with 332 additions and 46 deletions

View File

@@ -87,8 +87,13 @@ def customer_detail(request, pk):
if customer.is_system_customer:
return render(request, 'customers/customer_system.html')
# Рассчитываем общий долг по активным заказам на стороне БД
total_debt_result = customer.orders.exclude(payment_status='paid').aggregate(
# Рассчитываем общий долг по заказам на стороне БД
# Долг = все заказы КРОМЕ отмененных и полностью оплаченных
# ВКЛЮЧАЕТ завершенные заказы с неполной оплатой!
total_debt_result = customer.orders.exclude(
Q(status__is_negative_end=True) | # Отмененные → учитываются в refund_amount
Q(payment_status='paid') # Полностью оплаченные
).aggregate(
total_debt=Coalesce(
Sum(Greatest(F('total_amount') - F('amount_paid'), Value(0), output_field=DecimalField())),
Value(0),
@@ -96,9 +101,25 @@ def customer_detail(request, pk):
)
)
total_debt = total_debt_result['total_debt'] or Decimal('0')
# Количество активных заказов
active_orders_count = customer.orders.exclude(payment_status='paid').count()
# Количество заказов с долгом (с той же логикой)
active_orders_count = customer.orders.exclude(
Q(status__is_negative_end=True) |
Q(payment_status='paid')
).count()
# Сумма к возврату (отмененные заказы с оплатой)
refund_amount_result = customer.orders.filter(
status__is_negative_end=True, # Отмененные
amount_paid__gt=0 # С оплатой
).aggregate(
total_refund=Coalesce(
Sum('amount_paid'),
Value(0),
output_field=DecimalField()
)
)
refund_amount = refund_amount_result['total_refund'] or Decimal('0')
# История транзакций кошелька (последние 20)
from .models import WalletTransaction
@@ -116,6 +137,7 @@ def customer_detail(request, pk):
'customer': customer,
'total_debt': total_debt,
'active_orders_count': active_orders_count,
'refund_amount': refund_amount,
'wallet_transactions': wallet_transactions,
'orders_page': orders_page,
}