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),