"""Split Model.""" from datetime import datetime from typing import Optional from sqlalchemy import Enum, ForeignKey, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.sql import func from collaborator.connectors import mysql from collaborator.constants.split import RateType class Split(mysql.BaseModel): """Encapsulates split data.""" __tablename__ = "split" split_id: Mapped[int] = mapped_column("id", primary_key=True) identifier: Mapped[str] split_rate: Mapped[float] split_type_id: Mapped[int] = mapped_column(ForeignKey("split_type.id")) collaborator_id: Mapped[int] = mapped_column(ForeignKey("collaborator.id")) rate_type: Mapped[RateType] = mapped_column(Enum(RateType), default=RateType.NET) created_date: Mapped[datetime] = mapped_column(default=func.now()) created_by: Mapped[Optional[str]] updated_date: Mapped[Optional[datetime]] = mapped_column(onupdate=func.now()) updated_by: Mapped[Optional[str]] source: Mapped[Optional[str]] # Not used at runtime but required for tests __table_args__ = ( UniqueConstraint( "identifier", "collaborator_id", "split_type_id", name="split_unique_constraint", ), ) def to_dict(self): """Split data dictionary. Returns: dict """ return { "id": self.split_id, "identifier": self.identifier, "split_rate": (self.split_rate), "split_type_id": self.split_type_id, "collaborator_id": self.collaborator_id, "rate_type": self.rate_type, "created_date": ( self.created_date.isoformat() if self.created_date else None ), "updated_date": ( self.updated_date.isoformat() if self.updated_date else None ), "source": self.source, }