mirror of
https://github.com/koloideal/DutyLog.git
synced 2026-06-10 10:25:29 +03:00
update
This commit is contained in:
@@ -38,13 +38,9 @@ from dutylog.application.bot.admin_dialogs.rooms_management import (
|
|||||||
room_history_window,
|
room_history_window,
|
||||||
room_delete_confirm_window,
|
room_delete_confirm_window,
|
||||||
room_add_hours_select_window,
|
room_add_hours_select_window,
|
||||||
room_remove_hours_select_window,
|
|
||||||
room_add_hours_custom_window,
|
room_add_hours_custom_window,
|
||||||
room_remove_hours_custom_window,
|
|
||||||
room_add_hours_remark_window,
|
room_add_hours_remark_window,
|
||||||
room_remove_hours_remark_window,
|
|
||||||
room_add_hours_confirm_window,
|
room_add_hours_confirm_window,
|
||||||
room_remove_hours_confirm_window,
|
|
||||||
create_room_select_floor_window,
|
create_room_select_floor_window,
|
||||||
create_room_input_window,
|
create_room_input_window,
|
||||||
create_room_confirm_window,
|
create_room_confirm_window,
|
||||||
@@ -106,13 +102,9 @@ admin_menu_dialog = Dialog(
|
|||||||
room_history_window,
|
room_history_window,
|
||||||
room_delete_confirm_window,
|
room_delete_confirm_window,
|
||||||
room_add_hours_select_window,
|
room_add_hours_select_window,
|
||||||
room_remove_hours_select_window,
|
|
||||||
room_add_hours_custom_window,
|
room_add_hours_custom_window,
|
||||||
room_remove_hours_custom_window,
|
|
||||||
room_add_hours_remark_window,
|
room_add_hours_remark_window,
|
||||||
room_remove_hours_remark_window,
|
|
||||||
room_add_hours_confirm_window,
|
room_add_hours_confirm_window,
|
||||||
room_remove_hours_confirm_window,
|
|
||||||
create_room_select_floor_window,
|
create_room_select_floor_window,
|
||||||
create_room_input_window,
|
create_room_input_window,
|
||||||
create_room_confirm_window,
|
create_room_confirm_window,
|
||||||
|
|||||||
@@ -257,14 +257,6 @@ async def on_room_add_hours_click(
|
|||||||
await dialog_manager.switch_to(AdminMenuSG.room_add_hours_select)
|
await dialog_manager.switch_to(AdminMenuSG.room_add_hours_select)
|
||||||
|
|
||||||
|
|
||||||
async def on_room_remove_hours_click(
|
|
||||||
callback: CallbackQuery,
|
|
||||||
button: Button,
|
|
||||||
dialog_manager: DialogManager,
|
|
||||||
):
|
|
||||||
await dialog_manager.switch_to(AdminMenuSG.room_remove_hours_select)
|
|
||||||
|
|
||||||
|
|
||||||
async def get_room_hours_select_data(**kwargs):
|
async def get_room_hours_select_data(**kwargs):
|
||||||
hours_options = [
|
hours_options = [
|
||||||
(5, "5"), (10, "10"), (15, "15"), (20, "20"),
|
(5, "5"), (10, "10"), (15, "15"), (20, "20"),
|
||||||
@@ -282,11 +274,7 @@ async def on_room_hours_selected(
|
|||||||
item_id: str,
|
item_id: str,
|
||||||
):
|
):
|
||||||
dialog_manager.dialog_data["selected_hours"] = int(item_id)
|
dialog_manager.dialog_data["selected_hours"] = int(item_id)
|
||||||
|
|
||||||
if dialog_manager.current_context().state == AdminMenuSG.room_add_hours_select:
|
|
||||||
await dialog_manager.switch_to(AdminMenuSG.room_add_hours_remark)
|
await dialog_manager.switch_to(AdminMenuSG.room_add_hours_remark)
|
||||||
else:
|
|
||||||
await dialog_manager.switch_to(AdminMenuSG.room_remove_hours_remark)
|
|
||||||
|
|
||||||
|
|
||||||
async def on_room_custom_hours_click(
|
async def on_room_custom_hours_click(
|
||||||
@@ -294,10 +282,7 @@ async def on_room_custom_hours_click(
|
|||||||
button: Button,
|
button: Button,
|
||||||
dialog_manager: DialogManager,
|
dialog_manager: DialogManager,
|
||||||
):
|
):
|
||||||
if dialog_manager.current_context().state == AdminMenuSG.room_add_hours_select:
|
|
||||||
await dialog_manager.switch_to(AdminMenuSG.room_add_hours_custom)
|
await dialog_manager.switch_to(AdminMenuSG.room_add_hours_custom)
|
||||||
else:
|
|
||||||
await dialog_manager.switch_to(AdminMenuSG.room_remove_hours_custom)
|
|
||||||
|
|
||||||
|
|
||||||
async def on_room_custom_hours_input(
|
async def on_room_custom_hours_input(
|
||||||
@@ -316,11 +301,7 @@ async def on_room_custom_hours_input(
|
|||||||
return
|
return
|
||||||
|
|
||||||
dialog_manager.dialog_data["selected_hours"] = hours
|
dialog_manager.dialog_data["selected_hours"] = hours
|
||||||
|
|
||||||
if dialog_manager.current_context().state == AdminMenuSG.room_add_hours_custom:
|
|
||||||
await dialog_manager.switch_to(AdminMenuSG.room_add_hours_remark)
|
await dialog_manager.switch_to(AdminMenuSG.room_add_hours_remark)
|
||||||
else:
|
|
||||||
await dialog_manager.switch_to(AdminMenuSG.room_remove_hours_remark)
|
|
||||||
except ValueError:
|
except ValueError:
|
||||||
await message.answer("⚠️ Пожалуйста, введите корректное число")
|
await message.answer("⚠️ Пожалуйста, введите корректное число")
|
||||||
|
|
||||||
@@ -335,10 +316,7 @@ async def on_room_remark_input(
|
|||||||
else:
|
else:
|
||||||
dialog_manager.dialog_data["remark"] = None
|
dialog_manager.dialog_data["remark"] = None
|
||||||
|
|
||||||
if dialog_manager.current_context().state == AdminMenuSG.room_add_hours_remark:
|
|
||||||
await dialog_manager.switch_to(AdminMenuSG.room_add_hours_confirm)
|
await dialog_manager.switch_to(AdminMenuSG.room_add_hours_confirm)
|
||||||
else:
|
|
||||||
await dialog_manager.switch_to(AdminMenuSG.room_remove_hours_confirm)
|
|
||||||
|
|
||||||
|
|
||||||
async def on_room_skip_remark(
|
async def on_room_skip_remark(
|
||||||
@@ -347,11 +325,7 @@ async def on_room_skip_remark(
|
|||||||
dialog_manager: DialogManager,
|
dialog_manager: DialogManager,
|
||||||
):
|
):
|
||||||
dialog_manager.dialog_data["remark"] = None
|
dialog_manager.dialog_data["remark"] = None
|
||||||
|
|
||||||
if dialog_manager.current_context().state == AdminMenuSG.room_add_hours_remark:
|
|
||||||
await dialog_manager.switch_to(AdminMenuSG.room_add_hours_confirm)
|
await dialog_manager.switch_to(AdminMenuSG.room_add_hours_confirm)
|
||||||
else:
|
|
||||||
await dialog_manager.switch_to(AdminMenuSG.room_remove_hours_confirm)
|
|
||||||
|
|
||||||
|
|
||||||
async def get_room_hours_confirm_data(
|
async def get_room_hours_confirm_data(
|
||||||
@@ -411,60 +385,6 @@ async def on_room_add_hours_confirm(
|
|||||||
await dialog_manager.switch_to(AdminMenuSG.room_info)
|
await dialog_manager.switch_to(AdminMenuSG.room_info)
|
||||||
|
|
||||||
|
|
||||||
@inject
|
|
||||||
async def on_room_remove_hours_confirm(
|
|
||||||
callback: CallbackQuery,
|
|
||||||
button: Button,
|
|
||||||
dialog_manager: DialogManager,
|
|
||||||
transactions_repository: FromDishka[HoursTransactionsRepository],
|
|
||||||
rooms_repository: FromDishka[RoomsRepository],
|
|
||||||
residents_repository: FromDishka[ResidentsRepository],
|
|
||||||
users_repository: FromDishka[UsersRepository],
|
|
||||||
**kwargs,
|
|
||||||
):
|
|
||||||
bot: Bot = dialog_manager.middleware_data.get("bot")
|
|
||||||
|
|
||||||
room_id = dialog_manager.dialog_data.get("selected_room_id")
|
|
||||||
hours = dialog_manager.dialog_data.get("selected_hours")
|
|
||||||
remark = dialog_manager.dialog_data.get("remark")
|
|
||||||
admin_id = callback.from_user.id
|
|
||||||
|
|
||||||
if room_id and hours:
|
|
||||||
residents = await residents_repository.get_residents_by_room(room_id)
|
|
||||||
|
|
||||||
for resident in residents:
|
|
||||||
if resident.active_hours < hours:
|
|
||||||
await callback.answer(
|
|
||||||
f"⚠️ Недостаточно часов! У резидента {resident.real_name or 'без имени'} только {resident.active_hours} неотработанных ч, а вы пытаетесь отнять {hours} ч",
|
|
||||||
show_alert=True
|
|
||||||
)
|
|
||||||
await dialog_manager.switch_to(AdminMenuSG.room_info)
|
|
||||||
return
|
|
||||||
|
|
||||||
results = await transactions_repository.remove_hours_from_room(
|
|
||||||
room_id=room_id,
|
|
||||||
amount=hours,
|
|
||||||
admin_id=admin_id,
|
|
||||||
remark=remark,
|
|
||||||
)
|
|
||||||
|
|
||||||
for transaction, resident in results:
|
|
||||||
if resident and resident.user_entity:
|
|
||||||
user = await users_repository.get_user_by_id(resident.user_entity)
|
|
||||||
if user:
|
|
||||||
try:
|
|
||||||
remark_text = f"\n💬 <i>{remark}</i>" if remark else ""
|
|
||||||
await bot.send_message(
|
|
||||||
user.id,
|
|
||||||
f"<blockquote>📢 <b>Уведомление</b></blockquote>\n\n"
|
|
||||||
f"С вашей комнаты списано <b>-{hours}</b> ч{remark_text}"
|
|
||||||
)
|
|
||||||
except (TelegramBadRequest, TelegramForbiddenError, TelegramRetryAfter):
|
|
||||||
pass
|
|
||||||
|
|
||||||
await dialog_manager.switch_to(AdminMenuSG.room_info)
|
|
||||||
|
|
||||||
|
|
||||||
async def on_room_hours_cancel(
|
async def on_room_hours_cancel(
|
||||||
callback: CallbackQuery,
|
callback: CallbackQuery,
|
||||||
button: Button,
|
button: Button,
|
||||||
@@ -603,18 +523,11 @@ rooms_list_window = Window(
|
|||||||
|
|
||||||
room_info_window = Window(
|
room_info_window = Window(
|
||||||
Format("{info_content}"),
|
Format("{info_content}"),
|
||||||
Row(
|
|
||||||
Button(
|
Button(
|
||||||
Const("Добавить часы"),
|
Const("Добавить часы"),
|
||||||
id="room_add_hours_btn",
|
id="room_add_hours_btn",
|
||||||
on_click=on_room_add_hours_click,
|
on_click=on_room_add_hours_click,
|
||||||
),
|
),
|
||||||
Button(
|
|
||||||
Const("Отнять часы"),
|
|
||||||
id="room_remove_hours_btn",
|
|
||||||
on_click=on_room_remove_hours_click,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Button(
|
Button(
|
||||||
Const("📜 История"),
|
Const("📜 История"),
|
||||||
id="room_history_btn",
|
id="room_history_btn",
|
||||||
@@ -678,32 +591,6 @@ room_add_hours_select_window = Window(
|
|||||||
getter=get_room_hours_select_data,
|
getter=get_room_hours_select_data,
|
||||||
)
|
)
|
||||||
|
|
||||||
room_remove_hours_select_window = Window(
|
|
||||||
Const("<blockquote>➖ <b>Отнять часы у комнаты</b></blockquote>\n\nВыберите количество часов:"),
|
|
||||||
Group(
|
|
||||||
Select(
|
|
||||||
Format("{item[1]} ч"),
|
|
||||||
id="room_hours_select_remove",
|
|
||||||
item_id_getter=lambda x: x[0],
|
|
||||||
items="hours_options",
|
|
||||||
on_click=on_room_hours_selected,
|
|
||||||
),
|
|
||||||
width=4,
|
|
||||||
),
|
|
||||||
Button(
|
|
||||||
Const("✏️ Ввести свое количество"),
|
|
||||||
id="room_custom_hours_remove_btn",
|
|
||||||
on_click=on_room_custom_hours_click,
|
|
||||||
),
|
|
||||||
SwitchTo(
|
|
||||||
Const("◀️ Отмена"),
|
|
||||||
id="cancel_room_remove_hours",
|
|
||||||
state=AdminMenuSG.room_info,
|
|
||||||
),
|
|
||||||
state=AdminMenuSG.room_remove_hours_select,
|
|
||||||
getter=get_room_hours_select_data,
|
|
||||||
)
|
|
||||||
|
|
||||||
room_add_hours_custom_window = Window(
|
room_add_hours_custom_window = Window(
|
||||||
Const("<blockquote>✏️ <b>Добавить часы</b></blockquote>\n\nВведите количество часов:"),
|
Const("<blockquote>✏️ <b>Добавить часы</b></blockquote>\n\nВведите количество часов:"),
|
||||||
MessageInput(on_room_custom_hours_input),
|
MessageInput(on_room_custom_hours_input),
|
||||||
@@ -715,17 +602,6 @@ room_add_hours_custom_window = Window(
|
|||||||
state=AdminMenuSG.room_add_hours_custom,
|
state=AdminMenuSG.room_add_hours_custom,
|
||||||
)
|
)
|
||||||
|
|
||||||
room_remove_hours_custom_window = Window(
|
|
||||||
Const("<blockquote>✏️ <b>Отнять часы</b></blockquote>\n\nВведите количество часов:"),
|
|
||||||
MessageInput(on_room_custom_hours_input),
|
|
||||||
SwitchTo(
|
|
||||||
Const("◀️ Отмена"),
|
|
||||||
id="cancel_room_custom_remove",
|
|
||||||
state=AdminMenuSG.room_remove_hours_select,
|
|
||||||
),
|
|
||||||
state=AdminMenuSG.room_remove_hours_custom,
|
|
||||||
)
|
|
||||||
|
|
||||||
room_add_hours_remark_window = Window(
|
room_add_hours_remark_window = Window(
|
||||||
Const("<blockquote>💬 <b>Примечание</b></blockquote>\n\nВведите примечание к операции (или пропустите):"),
|
Const("<blockquote>💬 <b>Примечание</b></blockquote>\n\nВведите примечание к операции (или пропустите):"),
|
||||||
MessageInput(on_room_remark_input),
|
MessageInput(on_room_remark_input),
|
||||||
@@ -742,22 +618,6 @@ room_add_hours_remark_window = Window(
|
|||||||
state=AdminMenuSG.room_add_hours_remark,
|
state=AdminMenuSG.room_add_hours_remark,
|
||||||
)
|
)
|
||||||
|
|
||||||
room_remove_hours_remark_window = Window(
|
|
||||||
Const("<blockquote>💬 <b>Примечание</b></blockquote>\n\nВведите примечание к операции (или пропустите):"),
|
|
||||||
MessageInput(on_room_remark_input),
|
|
||||||
Button(
|
|
||||||
Const("⏭ Пропустить"),
|
|
||||||
id="skip_room_remove_remark",
|
|
||||||
on_click=on_room_skip_remark,
|
|
||||||
),
|
|
||||||
SwitchTo(
|
|
||||||
Const("◀️ Отмена"),
|
|
||||||
id="cancel_room_remove_remark",
|
|
||||||
state=AdminMenuSG.room_info,
|
|
||||||
),
|
|
||||||
state=AdminMenuSG.room_remove_hours_remark,
|
|
||||||
)
|
|
||||||
|
|
||||||
room_add_hours_confirm_window = Window(
|
room_add_hours_confirm_window = Window(
|
||||||
Format("<blockquote>➕ <b>Подтверждение</b></blockquote>\n\nВы уверены, что хотите добавить <code>{hours}</code> часов?{remark_text}"),
|
Format("<blockquote>➕ <b>Подтверждение</b></blockquote>\n\nВы уверены, что хотите добавить <code>{hours}</code> часов?{remark_text}"),
|
||||||
Row(
|
Row(
|
||||||
@@ -776,24 +636,6 @@ room_add_hours_confirm_window = Window(
|
|||||||
getter=get_room_hours_confirm_data,
|
getter=get_room_hours_confirm_data,
|
||||||
)
|
)
|
||||||
|
|
||||||
room_remove_hours_confirm_window = Window(
|
|
||||||
Format("<blockquote>➖ <b>Подтверждение</b></blockquote>\n\nВы уверены, что хотите отнять <code>{hours}</code> часов?{remark_text}"),
|
|
||||||
Row(
|
|
||||||
Button(
|
|
||||||
Const("✅ Да"),
|
|
||||||
id="confirm_room_remove_hours",
|
|
||||||
on_click=on_room_remove_hours_confirm,
|
|
||||||
),
|
|
||||||
Button(
|
|
||||||
Const("❌ Нет"),
|
|
||||||
id="cancel_room_remove_hours_confirm",
|
|
||||||
on_click=on_room_hours_cancel,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
state=AdminMenuSG.room_remove_hours_confirm,
|
|
||||||
getter=get_room_hours_confirm_data,
|
|
||||||
)
|
|
||||||
|
|
||||||
create_room_select_floor_window = Window(
|
create_room_select_floor_window = Window(
|
||||||
Format("{content}"),
|
Format("{content}"),
|
||||||
Group(
|
Group(
|
||||||
|
|||||||
@@ -45,13 +45,9 @@ class AdminMenuSG(StatesGroup):
|
|||||||
room_history = State()
|
room_history = State()
|
||||||
room_delete_confirm = State()
|
room_delete_confirm = State()
|
||||||
room_add_hours_select = State()
|
room_add_hours_select = State()
|
||||||
room_remove_hours_select = State()
|
|
||||||
room_add_hours_custom = State()
|
room_add_hours_custom = State()
|
||||||
room_remove_hours_custom = State()
|
|
||||||
room_add_hours_remark = State()
|
room_add_hours_remark = State()
|
||||||
room_add_hours_confirm = State()
|
room_add_hours_confirm = State()
|
||||||
room_remove_hours_remark = State()
|
|
||||||
room_remove_hours_confirm = State()
|
|
||||||
create_room_select_floor = State()
|
create_room_select_floor = State()
|
||||||
create_room_input = State()
|
create_room_input = State()
|
||||||
create_room_confirm = State()
|
create_room_confirm = State()
|
||||||
|
|||||||
@@ -139,7 +139,6 @@ class HoursTransactionsRepository:
|
|||||||
is_active: bool = True,
|
is_active: bool = True,
|
||||||
remark: str | None = None,
|
remark: str | None = None,
|
||||||
) -> list[tuple[HoursTransaction, Resident | None]]:
|
) -> list[tuple[HoursTransaction, Resident | None]]:
|
||||||
"""Начисляет часы всем резидентам комнаты с флагом per_room=True"""
|
|
||||||
residents = await self.residents_dao.get_by_room(room_id)
|
residents = await self.residents_dao.get_by_room(room_id)
|
||||||
results = []
|
results = []
|
||||||
|
|
||||||
@@ -156,31 +155,7 @@ class HoursTransactionsRepository:
|
|||||||
|
|
||||||
return results
|
return results
|
||||||
|
|
||||||
async def remove_hours_from_room(
|
|
||||||
self,
|
|
||||||
room_id: int,
|
|
||||||
amount: int,
|
|
||||||
admin_id: int | None = None,
|
|
||||||
remark: str | None = None,
|
|
||||||
) -> list[tuple[HoursTransaction, Resident | None]]:
|
|
||||||
"""Списывает часы у всех резидентов комнаты с флагом per_room=True"""
|
|
||||||
residents = await self.residents_dao.get_by_room(room_id)
|
|
||||||
results = []
|
|
||||||
|
|
||||||
for resident in residents:
|
|
||||||
result = await self.move_hours_to_completed(
|
|
||||||
resident_id=resident.id,
|
|
||||||
amount=amount,
|
|
||||||
admin_id=admin_id,
|
|
||||||
remark=remark,
|
|
||||||
per_room=True,
|
|
||||||
)
|
|
||||||
results.append(result)
|
|
||||||
|
|
||||||
return results
|
|
||||||
|
|
||||||
async def get_room_transactions(self, room_id: int) -> list[HoursTransaction]:
|
async def get_room_transactions(self, room_id: int) -> list[HoursTransaction]:
|
||||||
"""Получает все транзакции резидентов комнаты с флагом per_room=True"""
|
|
||||||
residents = await self.residents_dao.get_by_room(room_id)
|
residents = await self.residents_dao.get_by_room(room_id)
|
||||||
all_transactions = []
|
all_transactions = []
|
||||||
|
|
||||||
@@ -189,6 +164,5 @@ class HoursTransactionsRepository:
|
|||||||
room_transactions = [t for t in transactions if t.per_room]
|
room_transactions = [t for t in transactions if t.per_room]
|
||||||
all_transactions.extend(room_transactions)
|
all_transactions.extend(room_transactions)
|
||||||
|
|
||||||
# Сортируем по дате создания
|
|
||||||
all_transactions.sort(key=lambda t: t.created_at, reverse=True)
|
all_transactions.sort(key=lambda t: t.created_at, reverse=True)
|
||||||
return all_transactions
|
return all_transactions
|
||||||
|
|||||||
Reference in New Issue
Block a user