From 9bc13b0617e532c388536a09e9a6325e3f316527 Mon Sep 17 00:00:00 2001 From: kolo Date: Sun, 1 Mar 2026 17:00:49 +0300 Subject: [PATCH] update --- src/dutylog/application/__main__.py | 1 + .../bot/admin_dialogs/hours_management.py | 59 +++++++++++++++++++ .../bot/user_dialogs/user_menu/faq.py | 2 +- 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/src/dutylog/application/__main__.py b/src/dutylog/application/__main__.py index b05e501..3eb735b 100644 --- a/src/dutylog/application/__main__.py +++ b/src/dutylog/application/__main__.py @@ -42,6 +42,7 @@ async def main(): DAOProvider(), RepositoryProvider(), ServiceProvider(), + context={Bot: bot} ) dp.include_router(user_router) diff --git a/src/dutylog/application/bot/admin_dialogs/hours_management.py b/src/dutylog/application/bot/admin_dialogs/hours_management.py index cd8d744..2163328 100644 --- a/src/dutylog/application/bot/admin_dialogs/hours_management.py +++ b/src/dutylog/application/bot/admin_dialogs/hours_management.py @@ -1,4 +1,6 @@ +from aiogram import Bot from aiogram.types import Message, CallbackQuery +from aiogram.exceptions import TelegramForbiddenError from aiogram_dialog import Window, DialogManager from aiogram_dialog.widgets.text import Format, Const from aiogram_dialog.widgets.kbd import Row, SwitchTo, Button, Select, Group @@ -13,6 +15,9 @@ from dutylog.infrastructure.database.repositories.residents_repository import ( from dutylog.infrastructure.database.repositories.hours_transactions_repository import ( HoursTransactionsRepository, ) +from dutylog.infrastructure.database.repositories.users_repository import ( + UsersRepository, +) async def on_add_hours_click( @@ -145,6 +150,9 @@ async def on_add_hours_confirm( button: Button, dialog_manager: DialogManager, transactions_repository: FromDishka[HoursTransactionsRepository], + residents_repository: FromDishka[ResidentsRepository], + users_repository: FromDishka[UsersRepository], + bot: FromDishka[Bot], ): resident_id = dialog_manager.dialog_data.get("selected_resident_id") hours = dialog_manager.dialog_data.get("selected_hours") @@ -159,6 +167,24 @@ async def on_add_hours_confirm( is_active=True, remark=remark, ) + + resident = await residents_repository.get_resident_by_id(resident_id) + if resident and resident.user_entity: + admin = await users_repository.get_user_by_id(admin_id) + admin_username = f"@{admin.username}" if admin and admin.username else "Администратор" + + notification_text = ( + f"
Начислены часы
\n\n" + f"Количество: {hours} ч\n" + f"Причина: {remark}\n" + f"Администратор: {admin_username}\n\n" + f"Всего неотработанных часов: {resident.active_hours} ч" + ) + + try: + await bot.send_message(resident.user_entity, notification_text) + except TelegramForbiddenError: + pass await dialog_manager.switch_to(AdminMenuSG.resident_info) @@ -170,6 +196,8 @@ async def on_remove_hours_confirm( dialog_manager: DialogManager, transactions_repository: FromDishka[HoursTransactionsRepository], residents_repository: FromDishka[ResidentsRepository], + users_repository: FromDishka[UsersRepository], + bot: FromDishka[Bot], ): resident_id = dialog_manager.dialog_data.get("selected_resident_id") hours = dialog_manager.dialog_data.get("selected_hours") @@ -192,6 +220,37 @@ async def on_remove_hours_confirm( admin_id=admin_id, remark=remark, ) + + resident = await residents_repository.get_resident_by_id(resident_id) + if resident and resident.user_entity: + admin = await users_repository.get_user_by_id(admin_id) + admin_username = f"@{admin.username}" if admin and admin.username else "Администратор" + + if resident.active_hours == 0: + notification_text = ( + f"
🎉 Поздравляем!
\n\n" + f"Вы отработали все часы! Теперь у вас 0 неотработанных часов.\n\n" + f"Списано: {hours} ч\n" + ) + if remark: + notification_text += f"Причина: {remark}\n" + notification_text += f"Администратор: {admin_username}" + else: + notification_text = ( + f"
Списаны часы
\n\n" + f"Количество: {hours} ч\n" + ) + if remark: + notification_text += f"Причина: {remark}\n" + notification_text += ( + f"Администратор: {admin_username}\n\n" + f"Осталось неотработанных часов: {resident.active_hours} ч" + ) + + try: + await bot.send_message(resident.user_entity, notification_text) + except TelegramForbiddenError: + pass await dialog_manager.switch_to(AdminMenuSG.resident_info) diff --git a/src/dutylog/application/bot/user_dialogs/user_menu/faq.py b/src/dutylog/application/bot/user_dialogs/user_menu/faq.py index 3673c7f..1bdef70 100644 --- a/src/dutylog/application/bot/user_dialogs/user_menu/faq.py +++ b/src/dutylog/application/bot/user_dialogs/user_menu/faq.py @@ -23,7 +23,7 @@ faq_window = Window( ⏳ Неотработанные — текущий долг, который нужно закрыть. 👨‍💻 Как найти администратора? -
Обычно это староста этажа или комендант. Если возникла техническая ошибка в боте — пиши в чат общежития.
+
Обычно это воспитатель или член совета общежития. Если возникла техническая ошибка в боте — пиши в группу общежития.
""") , SwitchTo(Const("◀️ Назад"), id="back_to_main", state=MainMenuSG.main),