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:
@@ -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):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user