Feature: Добавлены методы получения суммы заказов клиента

Добавлены методы в модель Customer для расчета суммы успешных заказов:
- get_successful_orders_total() - гибкий метод с фильтрацией по датам
- get_last_year_orders_total() - сумма за последний год

Удалено устаревшее поле total_spent:
- Методы предоставляют более точные и актуальные данные
- Используют агрегацию на уровне БД для производительности

Обновлен UI карточки клиента:
- Отображается сумма всех успешных заказов
- Отображается сумма заказов за последний год
- Убрана колонка total_spent из списка клиентов

Изменения:
- customers/models.py: добавлены методы, удалено поле total_spent
- customers/views.py: добавлен расчет сумм в контекст
- customers/templates: обновлены шаблоны
- customers/admin.py: удалены упоминания total_spent
- Создана миграция 0005_remove_total_spent

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-12-06 00:21:45 +03:00
parent 2f7fed4a1a
commit 8d50613876
6 changed files with 83 additions and 19 deletions

View File

@@ -24,13 +24,6 @@ class Customer(models.Model):
# Temporary field to store raw phone number during initialization
_raw_phone = None
total_spent = models.DecimalField(
max_digits=10,
decimal_places=2,
default=0,
verbose_name="Общая сумма покупок"
)
# Wallet balance for overpayments
wallet_balance = models.DecimalField(
@@ -259,6 +252,56 @@ class Customer(models.Model):
"""
return self.wallet_transactions.all()
def get_successful_orders_total(self, start_date=None, end_date=None):
"""
Получить сумму успешных заказов за указанный период.
Args:
start_date: Дата начала периода (DateField или None)
end_date: Дата окончания периода (DateField или None)
Returns:
Decimal: Сумма успешных заказов
"""
from django.db.models import Sum, Value, DecimalField
from django.db.models.functions import Coalesce
from decimal import Decimal
# Базовый queryset: только успешные заказы
queryset = self.orders.filter(status__is_positive_end=True)
# Фильтрация по датам (используем delivery_date)
if start_date:
queryset = queryset.filter(delivery_date__gte=start_date)
if end_date:
queryset = queryset.filter(delivery_date__lte=end_date)
# Агрегация суммы
result = queryset.aggregate(
total=Coalesce(
Sum('total_amount'),
Value(0),
output_field=DecimalField()
)
)
return result['total'] or Decimal('0')
def get_last_year_orders_total(self):
"""
Получить сумму успешных заказов за последний календарный год.
(С этой даты прошлого года по текущую дату)
Returns:
Decimal: Сумма успешных заказов за год
"""
from datetime import date, timedelta
today = date.today()
year_ago = today - timedelta(days=365)
return self.get_successful_orders_total(start_date=year_ago, end_date=today)
class WalletTransaction(models.Model):
"""