diff --git a/src/dutylog/application/bot/admin_dialogs/admin_menu_dialog.py b/src/dutylog/application/bot/admin_dialogs/admin_menu_dialog.py index 2a7509a..6637412 100644 --- a/src/dutylog/application/bot/admin_dialogs/admin_menu_dialog.py +++ b/src/dutylog/application/bot/admin_dialogs/admin_menu_dialog.py @@ -85,6 +85,7 @@ from dutylog.application.bot.creator_dialogs.admins_management import ( from dutylog.application.bot.creator_dialogs.transactions_history import ( transactions_history_window, transactions_history_detail_window, + transactions_history_delete_confirm_window, ) @@ -151,4 +152,5 @@ admin_menu_dialog = Dialog( add_admin_confirm_window, transactions_history_window, transactions_history_detail_window, + transactions_history_delete_confirm_window, ) diff --git a/src/dutylog/application/bot/creator_dialogs/__init__.py b/src/dutylog/application/bot/creator_dialogs/__init__.py index 0e49ba7..cdff8a6 100644 --- a/src/dutylog/application/bot/creator_dialogs/__init__.py +++ b/src/dutylog/application/bot/creator_dialogs/__init__.py @@ -1,6 +1,11 @@ from dutylog.application.bot.creator_dialogs.transactions_history import ( transactions_history_window, transactions_history_detail_window, + transactions_history_delete_confirm_window, ) -__all__ = ["transactions_history_window", "transactions_history_detail_window"] +__all__ = [ + "transactions_history_window", + "transactions_history_detail_window", + "transactions_history_delete_confirm_window", +] diff --git a/src/dutylog/application/bot/creator_dialogs/transactions_history.py b/src/dutylog/application/bot/creator_dialogs/transactions_history.py index a784994..0403ed7 100644 --- a/src/dutylog/application/bot/creator_dialogs/transactions_history.py +++ b/src/dutylog/application/bot/creator_dialogs/transactions_history.py @@ -1,9 +1,9 @@ from aiogram import Bot from aiogram.enums import ContentType from aiogram.types import CallbackQuery, InputMediaPhoto -from aiogram_dialog import Window +from aiogram_dialog import Window, DialogManager from aiogram_dialog.widgets.text import Format, Const -from aiogram_dialog.widgets.kbd import SwitchTo, ScrollingGroup, Select, Button +from aiogram_dialog.widgets.kbd import SwitchTo, ScrollingGroup, Select, Button, Row from aiogram_dialog.widgets.media import DynamicMedia from aiogram_dialog.api.entities.media import MediaAttachment, MediaId from magic_filter import F @@ -112,6 +112,29 @@ async def on_creator_transaction_selected( await dialog_manager.switch_to(AdminMenuSG.transactions_history_detail) +@inject +async def on_delete_transaction_click( + callback: CallbackQuery, + button: Button, + dialog_manager: DialogManager, +): + await dialog_manager.switch_to(AdminMenuSG.transactions_history_delete_confirm) + + +@inject +async def on_delete_transaction_confirm( + callback: CallbackQuery, + button: Button, + dialog_manager: DialogManager, + transactions_repository: FromDishka[HoursTransactionsRepository], +): + tx_id = dialog_manager.dialog_data.get("selected_transaction_id") + if tx_id: + await transactions_repository.delete_transaction(int(tx_id)) + await callback.answer("✅ Транзакция удалена", show_alert=True) + await dialog_manager.switch_to(AdminMenuSG.transactions_history) + + @inject async def get_transaction_detail_data( dialog_manager, @@ -209,6 +232,13 @@ transactions_history_window = Window( transactions_history_detail_window = Window( DynamicMedia("photo_media"), Format("{detail_content}", when=F["detail_content"]), + Row( + Button( + Const("🗑 Удалить"), + id="delete_transaction_btn", + on_click=on_delete_transaction_click, + ), + ), SwitchTo( Const("◀️ К списку"), id="back_to_transactions_from_detail", @@ -217,3 +247,20 @@ transactions_history_detail_window = Window( state=AdminMenuSG.transactions_history_detail, getter=get_transaction_detail_data, ) + +transactions_history_delete_confirm_window = Window( + Const("
🗑 Удаление транзакции\n\n⚠️ Вы уверены, что хотите удалить эту транзакцию?\nЭто действие нельзя отменить."), + Row( + Button( + Const("✅ Да, удалить"), + id="confirm_delete_transaction_btn", + on_click=on_delete_transaction_confirm, + ), + ), + SwitchTo( + Const("◀️ Назад"), + id="back_to_transaction_detail", + state=AdminMenuSG.transactions_history_detail, + ), + state=AdminMenuSG.transactions_history_delete_confirm, +) diff --git a/src/dutylog/application/bot/user_dialogs/states.py b/src/dutylog/application/bot/user_dialogs/states.py index 9c32c66..f824c08 100644 --- a/src/dutylog/application/bot/user_dialogs/states.py +++ b/src/dutylog/application/bot/user_dialogs/states.py @@ -73,6 +73,7 @@ class AdminMenuSG(StatesGroup): add_admin_confirm = State() transactions_history = State() transactions_history_detail = State() + transactions_history_delete_confirm = State() class CreatorMenuSG(StatesGroup): diff --git a/src/dutylog/infrastructure/database/repositories/hours_transactions_repository.py b/src/dutylog/infrastructure/database/repositories/hours_transactions_repository.py index 2c3af27..711aea7 100644 --- a/src/dutylog/infrastructure/database/repositories/hours_transactions_repository.py +++ b/src/dutylog/infrastructure/database/repositories/hours_transactions_repository.py @@ -144,6 +144,9 @@ class HoursTransactionsRepository: ) -> HoursTransaction | None: return await self.transactions_dao.get_by_id(transaction_id) + async def delete_transaction(self, transaction_id: int) -> None: + await self.transactions_dao.delete(transaction_id) + async def get_by_period(self, start_date, end_date) -> list[HoursTransaction]: return await self.transactions_dao.get_by_period(start_date, end_date)