"""TransferWise Transaction Model.""" from datetime import datetime from decimal import Decimal from typing import Optional from sqlalchemy import BigInteger, ForeignKey, Integer, Numeric from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.sql import func from collaborator.connectors import mysql class TransferwiseTransaction(mysql.BaseModel): """Encapsulates TransferWise transaction data. Represents TransferWise transaction in the collaborator database. """ __tablename__ = "transferwise_transaction" transaction_id: Mapped[int] = mapped_column( "id", BigInteger().with_variant(Integer, "sqlite"), primary_key=True, ) profile_id: Mapped[int] recipient_id: Mapped[int] collaborator_id: Mapped[int] transferwise_batch_id: Mapped[Optional[int]] = mapped_column( ForeignKey("transferwise_batch.id") ) transfer_id: Mapped[int] quote_id: Mapped[Optional[str]] source_currency: Mapped[str] source_amount: Mapped[Decimal] = mapped_column(Numeric(18, 6)) target_currency: Mapped[str] target_amount: Mapped[Decimal] = mapped_column(Numeric(18, 6)) wire_fee: Mapped[Optional[Decimal]] = mapped_column(Numeric(18, 2)) transferwise_fee: Mapped[Optional[Decimal]] = mapped_column(Numeric(18, 2)) conversion_rate: Mapped[Optional[Decimal]] = mapped_column(Numeric(18, 6)) status: Mapped[str] created_date: Mapped[datetime] = mapped_column(default=func.now()) status_updated_date: Mapped[Optional[datetime]] def to_dict(self) -> dict: """Convert model into dictionary. Returns: dict """ return { "id": self.transaction_id, "profile_id": self.profile_id, "recipient_id": self.recipient_id, "collaborator_id": self.collaborator_id, "transferwise_batch_id": self.transferwise_batch_id, "transfer_id": self.transfer_id, "quote_id": self.quote_id, "source_currency": self.source_currency, "source_amount": self.source_amount, "target_currency": self.target_currency, "target_amount": self.target_amount, "wire_fee": self.wire_fee, "transferwise_fee": self.transferwise_fee, "conversion_rate": self.conversion_rate, "status": self.status, "created_date": self.created_date, "status_updated_date": self.status_updated_date, }