from datetime import datetime from enum import StrEnum, auto from aiogram import Bot from aiogram.types import Message, ReplyMarkupUnion from pydantic import BaseModel from sqlalchemy import JSON, ForeignKey from sqlalchemy.orm import Mapped, mapped_column from models import BaseTable, Invoice, User class ReceiptFileType(StrEnum): PHOTO = auto() DOCUMENT = auto() class ReceiptFile(BaseModel): type: ReceiptFileType file_id: str async def send( self, bot: Bot, user_id: int, caption: str | None = None, reply_markup: ReplyMarkupUnion | None = None, ) -> Message: if self.type == ReceiptFileType.DOCUMENT: return await bot.send_document( user_id, document=self.file_id, caption=caption, reply_markup=reply_markup, ) else: return await bot.send_photo( user_id, photo=self.file_id, caption=caption, reply_markup=reply_markup, ) class PaymentStatus(StrEnum): PENDING = auto() ACCEPTED = auto() REJECTED = auto() class Payment(BaseTable): __tablename__ = "payment" id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) user_id: Mapped[int] = mapped_column(ForeignKey(User.id)) invoice_id: Mapped[int] = mapped_column(ForeignKey(Invoice.id)) __receipt_file: Mapped[str] = mapped_column("receipt_file", JSON()) status: Mapped[PaymentStatus] = mapped_column(default=PaymentStatus.PENDING) datetime: Mapped[datetime] @property def receipt_file(self) -> ReceiptFile: return ReceiptFile.model_validate_json(self.__receipt_file) @receipt_file.setter def receipt_file(self, value: ReceiptFile) -> None: self.__receipt_file = value.model_dump_json()