From 6da61d79510f7e05310f3cc020515b4dd0b3eb34 Mon Sep 17 00:00:00 2001 From: Fringg Date: Thu, 5 Mar 2026 09:05:02 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20=D1=83=D0=B1=D1=80=D0=B0=D1=82=D1=8C=20W?= =?UTF-8?q?ITHDRAWAL=20=D0=B8=D0=B7=20=D0=B0=D0=B2=D1=82=D0=BE=D0=BD=D0=B5?= =?UTF-8?q?=D0=B3=D0=B0=D1=86=D0=B8=D0=B8,=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D1=82=D1=8C=20abs()=20=D0=B2=20=D0=B0=D0=B3=D1=80?= =?UTF-8?q?=D0=B5=D0=B3=D0=B0=D1=86=D0=B8=D0=B8,=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=B8=D1=82=D1=8C=20all=5Ftime=5Fstats?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Убран WITHDRAWAL из автонегации в create_transaction (ломал profit, expenses и display flip в admin_users) - Добавлен func.abs() в by_type агрегацию (transaction.py) - Добавлен func.abs() в total_spent user.py (_build_spending_stats_select) - Исправлен all_time_stats в боте и webapi: передаём явный диапазон дат вместо дефолтного текущего месяца --- app/database/crud/transaction.py | 6 +++--- app/database/crud/user.py | 2 +- app/handlers/admin/statistics.py | 4 +++- app/webapi/routes/stats.py | 4 +++- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/app/database/crud/transaction.py b/app/database/crud/transaction.py index 603f0c65..fb9e1d1d 100644 --- a/app/database/crud/transaction.py +++ b/app/database/crud/transaction.py @@ -39,8 +39,8 @@ async def create_transaction( is_completed: bool = True, created_at: datetime | None = None, ) -> Transaction: - # SUBSCRIPTION_PAYMENT and WITHDRAWAL are debits — always store as negative - if type in (TransactionType.SUBSCRIPTION_PAYMENT, TransactionType.WITHDRAWAL) and amount_kopeks > 0: + # SUBSCRIPTION_PAYMENT — always store as negative (debit from user balance) + if type == TransactionType.SUBSCRIPTION_PAYMENT and amount_kopeks > 0: amount_kopeks = -amount_kopeks transaction = Transaction( @@ -248,7 +248,7 @@ async def get_transactions_statistics( select( Transaction.type, func.count(Transaction.id).label('count'), - func.coalesce(func.sum(Transaction.amount_kopeks), 0).label('total_amount'), + func.coalesce(func.sum(func.abs(Transaction.amount_kopeks)), 0).label('total_amount'), ) .where( and_( diff --git a/app/database/crud/user.py b/app/database/crud/user.py index 05670354..9c8fd0fb 100644 --- a/app/database/crud/user.py +++ b/app/database/crud/user.py @@ -54,7 +54,7 @@ def _build_spending_stats_select(): case( ( Transaction.type == TransactionType.SUBSCRIPTION_PAYMENT.value, - Transaction.amount_kopeks, + func.abs(Transaction.amount_kopeks), ), else_=0, ) diff --git a/app/handlers/admin/statistics.py b/app/handlers/admin/statistics.py index 606c52a8..5c78a088 100644 --- a/app/handlers/admin/statistics.py +++ b/app/handlers/admin/statistics.py @@ -137,7 +137,9 @@ async def show_revenue_statistics(callback: types.CallbackQuery, db_user: User, month_start = now.replace(day=1, hour=0, minute=0, second=0, microsecond=0) month_stats = await get_transactions_statistics(db, month_start, now) - all_time_stats = await get_transactions_statistics(db) + all_time_stats = await get_transactions_statistics( + db, start_date=datetime(2020, 1, 1, tzinfo=UTC), end_date=now + ) current_time = format_datetime(datetime.now(UTC)) text = f""" diff --git a/app/webapi/routes/stats.py b/app/webapi/routes/stats.py index b0a0173a..78e7cca5 100644 --- a/app/webapi/routes/stats.py +++ b/app/webapi/routes/stats.py @@ -262,7 +262,9 @@ async def stats_full( users_stats = await get_users_statistics(db) subscriptions_stats = await get_subscriptions_statistics(db) trial_stats = await get_trial_statistics(db) - transactions_stats = await get_transactions_statistics(db) + transactions_stats = await get_transactions_statistics( + db, start_date=datetime(2020, 1, 1, tzinfo=UTC), end_date=datetime.now(UTC) + ) referral_stats = await get_referral_statistics(db) transactions_totals = transactions_stats.get('totals', {})