"""Report Model.""" from datetime import datetime from decimal import Decimal from typing import Optional from sqlalchemy import Enum, Numeric from sqlalchemy.orm import Mapped, mapped_column from collaborator.connectors import mysql from collaborator.constants.reports import ReportStatus def _serialise_datetime(datetime): return datetime.isoformat() if datetime else None class Report(mysql.BaseModel): """Encapsulates a collaborator report. Represents a collaborator revenue split report in the collaborator database. """ __tablename__ = "report" report_id: Mapped[int] = mapped_column("id", primary_key=True) report_run_id: Mapped[Optional[int]] collaborator_id: Mapped[Optional[int]] transaction_id: Mapped[Optional[int]] exclude_transaction_types: Mapped[Optional[str]] filename: Mapped[str] file_location: Mapped[Optional[str]] amount: Mapped[Optional[Decimal]] = mapped_column(Numeric(18, 6)) currency: Mapped[Optional[str]] status: Mapped[Optional[ReportStatus]] = mapped_column( Enum(ReportStatus), default=ReportStatus.REQUESTED ) requested_datetime: Mapped[Optional[datetime]] generated_datetime: Mapped[Optional[datetime]] deleted_by: Mapped[Optional[str]] deleted_datetime: Mapped[Optional[datetime]] snowflake_query_id: Mapped[Optional[str]] collaborator_dp_enabled: Mapped[bool] = mapped_column(default=True) def to_dict(self): """Report data dictionary. Returns: dict """ amount = float(self.amount) if isinstance(self.amount, Decimal) else self.amount return { "id": self.report_id, "report_run_id": self.report_run_id, "collaborator_id": self.collaborator_id, "transaction_id": self.transaction_id, "exclude_transaction_types": self.exclude_transaction_types, "filename": self.filename, "file_location": self.file_location, "amount": amount, "currency": self.currency, "status": self.status, "requested_datetime": _serialise_datetime(self.requested_datetime), "generated_datetime": _serialise_datetime(self.generated_datetime), "deleted_by": self.deleted_by, "deleted_datetime": _serialise_datetime(self.deleted_datetime), "collaborator_dp_enabled": self.collaborator_dp_enabled, }