shopbot/bot/services/stats.py

93 lines
3.8 KiB
Python
Raw Permalink Normal View History

2024-12-24 18:08:03 +00:00
import asyncio
import logging
from datetime import datetime, timedelta
from aiogram_dialog import DialogManager
from sqlalchemy import func, select
from sqlalchemy.exc import SQLAlchemyError
2024-12-25 01:30:33 +00:00
from shopbot.bot.database.db import async_session
from shopbot.bot.database.models import Account, UserModel
2024-12-24 18:08:03 +00:00
def _get_start_of_day():
return datetime.today().replace(hour=0, minute=0, second=0, microsecond=0)
async def get_admin_statistics(dialog_manager: DialogManager, **kwargs):
today_start = _get_start_of_day()
week_start = today_start - timedelta(days=7)
month_start = today_start - timedelta(days=30)
try:
async with async_session() as session:
async with session.begin():
total_sold_query = select(func.count(Account.id)).where(
Account.is_sold == True # noqa: E712
)
currently_for_sale_query = select(func.count(Account.id)).where(
Account.is_sold == False # noqa: E712
)
total_sales_query = select(func.sum(Account.price)).where(
Account.is_sold == True # noqa: E712
)
highest_sale_query = select(func.max(Account.price)).where(
Account.is_sold == True # noqa: E712
)
average_sale_query = select(func.avg(Account.price)).where(
Account.is_sold == True # noqa: E712
)
total_users_query = select(func.count(UserModel.id))
profit_today_query = select(func.sum(Account.price)).where(
Account.date_purchase >= today_start
)
profit_week_query = select(func.sum(Account.price)).where(
Account.date_purchase >= week_start
)
profit_month_query = select(func.sum(Account.price)).where(
Account.date_purchase >= month_start
)
(
total_sold,
currently_for_sale,
total_sales,
highest_sale,
average_sale,
total_users,
profit_today,
profit_week,
profit_month,
) = await asyncio.gather(
session.scalar(total_sold_query),
session.scalar(currently_for_sale_query),
session.scalar(total_sales_query),
session.scalar(highest_sale_query),
session.scalar(average_sale_query),
session.scalar(total_users_query),
session.scalar(profit_today_query),
session.scalar(profit_week_query),
session.scalar(profit_month_query),
)
return {
"total_sold": total_sold or 0,
"currently_for_sale": currently_for_sale or 0,
"total_sales": total_sales or 0.0,
"highest_sale": highest_sale or 0.0,
"average_sale": average_sale or 0.0,
"total_users": total_users or 0,
"profit_today": profit_today or 0.0,
"profit_week": profit_week or 0.0,
"profit_month": profit_month or 0.0,
"current_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
}
except SQLAlchemyError as e:
logging.error(f"Database error: {e}", exc_info=True)
return {"error": "Произошла ошибка при работе с базой данных."}
except Exception as e:
logging.error(f"An unexpected error occurred: {e}", exc_info=True)
return {"error": "Произошла непредвиденная ошибка."}