Рабочие изменения: улучшения 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:
@@ -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,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user