From 69995cf0990f041ff7c0773afd38e90022bd88b4 Mon Sep 17 00:00:00 2001 From: kolo Date: Tue, 3 Mar 2026 22:27:11 +0300 Subject: [PATCH] update --- src/dutylog/application/__main__.py | 4 ++ .../bot/admin_dialogs/main_menu.py | 33 ++++++++++---- .../bot/user_dialogs/user_menu/history.py | 43 ++++++++++++++++++- .../bot/user_dialogs/user_menu/main_menu.py | 13 +++++- .../infrastructure/utils/bot_commands.py | 10 +++++ 5 files changed, 91 insertions(+), 12 deletions(-) create mode 100644 src/dutylog/infrastructure/utils/bot_commands.py diff --git a/src/dutylog/application/__main__.py b/src/dutylog/application/__main__.py index 3eb735b..a9524db 100644 --- a/src/dutylog/application/__main__.py +++ b/src/dutylog/application/__main__.py @@ -21,6 +21,7 @@ from dutylog.infrastructure.ioc import ( ServiceProvider, ) from dutylog.infrastructure.utils.config import load_config +from dutylog.infrastructure.utils.bot_commands import set_bot_commands async def main(): @@ -54,6 +55,9 @@ async def main(): setup_dialogs(dp) setup_dishka(container, dp, auto_inject=True) + # Устанавливаем команды бота + await set_bot_commands(bot) + await dp.start_polling(bot) diff --git a/src/dutylog/application/bot/admin_dialogs/main_menu.py b/src/dutylog/application/bot/admin_dialogs/main_menu.py index 37fc463..044f90a 100644 --- a/src/dutylog/application/bot/admin_dialogs/main_menu.py +++ b/src/dutylog/application/bot/admin_dialogs/main_menu.py @@ -13,6 +13,9 @@ from dutylog.infrastructure.database.repositories.users_repository import ( from dutylog.infrastructure.database.repositories.residents_repository import ( ResidentsRepository, ) +from dutylog.infrastructure.database.repositories.rooms_repository import ( + RoomsRepository, +) from dutylog.infrastructure.database.repositories.reporting_periods_repository import ( ReportingPeriodsRepository, ) @@ -68,8 +71,6 @@ async def get_admin_menu_data( days_passed = (datetime.now().date() - start_date).days period_info = f""" -━━━━━━━━━━━━━━━━━━━━ - 📅 Активный отчётный период
Месяц: {reporting_month} {reporting_year} Начало: {start_date.strftime('%d.%m.%Y')} @@ -81,7 +82,7 @@ async def get_admin_menu_data( content = f""" {greeting} -
📋 Панель управления
+📋 Панель управления {period_info} Выберите действие: """ @@ -93,33 +94,47 @@ async def get_admin_menu_data( async def get_statistics_data( users_repository: FromDishka[UsersRepository], residents_repository: FromDishka[ResidentsRepository], + rooms_repository: FromDishka[RoomsRepository], **kwargs, ): all_users = await users_repository.get_all_users() all_residents = await residents_repository.get_all_residents() + all_rooms = await rooms_repository.get_all_rooms() total_users = len(all_users) total_residents = len(all_residents) busy_residents = len([r for r in all_residents if r.is_busy]) - total_active_hours = sum(r.active_hours for r in all_residents) - total_inactive_hours = sum(r.inactive_hours for r in all_residents) + total_residents_active_hours = sum(r.active_hours for r in all_residents) + total_residents_inactive_hours = sum(r.inactive_hours for r in all_residents) admins_count = len([u for u in all_users if u.is_admin]) + total_rooms = len(all_rooms) + total_rooms_active_hours = sum(r.active_hours for r in all_rooms) + total_rooms_inactive_hours = sum(r.inactive_hours for r in all_rooms) + stats_text = f"""
📊 Статистика системы
👥 Всего пользователей: {total_users} 👨‍💼 Администраторов: {admins_count} +👤 РЕЗИДЕНТЫ + 🏠 Всего резидентов: {total_residents}Привязано к пользователям: {busy_residents}Свободных: {total_residents - busy_residents} -━━━━━━━━━━━━━━━━━━━━ +🟢 Отработанных часов: {total_residents_inactive_hours} ч +🔴 Неотработанных часов: {total_residents_active_hours} ч +📊 Итого: {total_residents_active_hours + total_residents_inactive_hours} ч -🟢 Всего отработанных часов: {total_inactive_hours} ч -🔴 Всего неотработанных часов: {total_active_hours} ч -📊 Общий итог: {total_active_hours + total_inactive_hours} ч +🚪 КОМНАТЫ + +🏠 Всего комнат: {total_rooms} + +🟢 Отработанных часов: {total_rooms_inactive_hours} ч +🔴 Неотработанных часов: {total_rooms_active_hours} ч +📊 Итого: {total_rooms_active_hours + total_rooms_inactive_hours} ч """ return {"stats_content": stats_text} diff --git a/src/dutylog/application/bot/user_dialogs/user_menu/history.py b/src/dutylog/application/bot/user_dialogs/user_menu/history.py index 679e3e8..4872868 100644 --- a/src/dutylog/application/bot/user_dialogs/user_menu/history.py +++ b/src/dutylog/application/bot/user_dialogs/user_menu/history.py @@ -9,9 +9,15 @@ from dutylog.application.bot.user_dialogs.states import MainMenuSG from dutylog.infrastructure.database.repositories.residents_repository import ( ResidentsRepository, ) +from dutylog.infrastructure.database.repositories.rooms_repository import ( + RoomsRepository, +) from dutylog.infrastructure.database.repositories.hours_transactions_repository import ( HoursTransactionsRepository, ) +from dutylog.infrastructure.database.repositories.room_hours_transactions_repository import ( + RoomHoursTransactionsRepository, +) from dutylog.infrastructure.utils.datetime import msk_now @@ -19,7 +25,9 @@ from dutylog.infrastructure.utils.datetime import msk_now async def get_history_data( event_from_user: User, residents_repository: FromDishka[ResidentsRepository], + rooms_repository: FromDishka[RoomsRepository], transactions_repository: FromDishka[HoursTransactionsRepository], + room_transactions_repository: FromDishka[RoomHoursTransactionsRepository], **kwargs, ) -> dict[str, str]: resident = await residents_repository.get_resident_by_user_id(event_from_user.id) @@ -31,20 +39,25 @@ async def get_history_data( ⚠️ Профиль не найден """ else: + # История резидента transactions = await transactions_repository.get_resident_history(resident.id) transactions_sorted = sorted(transactions, key=lambda x: x.created_at) last_10 = transactions_sorted[-10:] if not last_10: history_text = """ -
📜 История операций
+📜 История операций +👤 Ваши операции: История операций пуста + """ else: history_text = """ 📜 История операций +👤 Ваши операции: + """ for tx in last_10: operation = "Начислено" if tx.transaction_type == "increase" else "Списано" @@ -57,6 +70,34 @@ async def get_history_data( history_text += f"
{operation} {emoji}{tx.amount} ч\n📅 {date_str}{remark_text}
\n" + # История комнаты + room = await rooms_repository.get_room_by_id(resident.room) + if room: + room_transactions = await room_transactions_repository.get_room_history(room.id) + room_transactions_sorted = sorted(room_transactions, key=lambda x: x.created_at) + last_10_room = room_transactions_sorted[-10:] + + if not last_10_room: + history_text += """ +🚪 Операции комнаты: +История операций пуста +""" + else: + history_text += """ +🚪 Операции комнаты: + +""" + for tx in last_10_room: + operation = "Начислено" if tx.transaction_type == "increase" else "Списано" + emoji = "+" if tx.transaction_type == "increase" else "−" + + msk_time = tx.created_at.astimezone(msk_now().tzinfo).replace(tzinfo=None) + date_str = msk_time.strftime("%d.%m.%Y %H:%M") + + remark_text = f"\n💬 {tx.remark}" if tx.remark else "" + + history_text += f"
{operation} {emoji}{tx.amount} ч\n📅 {date_str}{remark_text}
\n" + return {"history_content": history_text} diff --git a/src/dutylog/application/bot/user_dialogs/user_menu/main_menu.py b/src/dutylog/application/bot/user_dialogs/user_menu/main_menu.py index 11d7d07..4202071 100644 --- a/src/dutylog/application/bot/user_dialogs/user_menu/main_menu.py +++ b/src/dutylog/application/bot/user_dialogs/user_menu/main_menu.py @@ -73,14 +73,23 @@ async def get_main_menu_data( """ has_resident = False else: + room = await rooms_repository.get_room_by_id(resident.room) + room_active = room.active_hours if room else 0 + room_inactive = room.inactive_hours if room else 0 + content = f""" {greeting} -━━━━━━━━━━━━━━━━━━━━ -📊 Статус отработки: +📊 Статус отработки: + +👤 Ваши часы:
✅ Выполнено: {resident.inactive_hours} ч. ⏳ Осталось: {resident.active_hours} ч.
+🚪 Часы комнаты: +
✅ Выполнено: {room_inactive} ч. +⏳ Осталось: {room_active} ч.
+ made by kolo """ has_resident = True diff --git a/src/dutylog/infrastructure/utils/bot_commands.py b/src/dutylog/infrastructure/utils/bot_commands.py new file mode 100644 index 0000000..839f701 --- /dev/null +++ b/src/dutylog/infrastructure/utils/bot_commands.py @@ -0,0 +1,10 @@ +from aiogram import Bot +from aiogram.types import BotCommand, BotCommandScopeDefault + + +async def set_bot_commands(bot: Bot): + commands = [ + BotCommand(command="start", description="🏠 Начало работы"), + ] + + await bot.set_my_commands(commands, scope=BotCommandScopeDefault())