This commit is contained in:
2026-03-01 17:00:49 +03:00
parent 186de7af75
commit 9bc13b0617
3 changed files with 61 additions and 1 deletions
@@ -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"<blockquote> <b>Начислены часы</b></blockquote>\n\n"
f"<b>Количество:</b> <code>{hours}</code> ч\n"
f"<b>Причина:</b> {remark}\n"
f"<b>Администратор:</b> {admin_username}\n\n"
f"<b>Всего неотработанных часов:</b> <code>{resident.active_hours}</code> ч"
)
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"<blockquote>🎉 <b>Поздравляем!</b></blockquote>\n\n"
f"Вы отработали все часы! Теперь у вас <code>0</code> неотработанных часов.\n\n"
f"<b>Списано:</b> <code>{hours}</code> ч\n"
)
if remark:
notification_text += f"<b>Причина:</b> {remark}\n"
notification_text += f"<b>Администратор:</b> {admin_username}"
else:
notification_text = (
f"<blockquote> <b>Списаны часы</b></blockquote>\n\n"
f"<b>Количество:</b> <code>{hours}</code> ч\n"
)
if remark:
notification_text += f"<b>Причина:</b> {remark}\n"
notification_text += (
f"<b>Администратор:</b> {admin_username}\n\n"
f"<b>Осталось неотработанных часов:</b> <code>{resident.active_hours}</code> ч"
)
try:
await bot.send_message(resident.user_entity, notification_text)
except TelegramForbiddenError:
pass
await dialog_manager.switch_to(AdminMenuSG.resident_info)
@@ -23,7 +23,7 @@ faq_window = Window(
⏳ <b>Неотработанные</b> — текущий долг, который нужно закрыть.</blockquote>
👨‍💻 <b>Как найти администратора?</b>
<blockquote>Обычно это староста этажа или комендант. Если возникла техническая ошибка в боте — пиши в чат общежития.</blockquote>
<blockquote>Обычно это воспитатель или член совета общежития. Если возникла техническая ошибка в боте — пиши в группу общежития.</blockquote>
""")
,
SwitchTo(Const("◀️ Назад"), id="back_to_main", state=MainMenuSG.main),