"""Contract advance model.""" from sqlalchemy import Column from sqlalchemy import Date from sqlalchemy import DateTime from sqlalchemy import Enum from sqlalchemy import Integer from sqlalchemy import Numeric from sqlalchemy import String from sqlalchemy.engine.row import Row from moneyhub.constants.constants import AdvanceStatus from moneyhub.constants.constants import Milestone from moneyhub.models.account_contract import AccountContract from moneyhub.models.mysql_base import BaseModel class ContractAdvance(BaseModel): """Contract advance model.""" __tablename__ = 'contract_advance' contract_advance_id = Column(Integer, primary_key=True, nullable=False) contract_id = Column(Integer, nullable=False) advance_description = Column(String(180), nullable=True) amount = Column(Numeric(20, 2), nullable=False) currency_code = Column(String(3), nullable=False) milestone = Column( Enum( *Milestone, name='milestone', create_type=False ), nullable=True ) milestone_description = Column(String(255), nullable=True) milestone_date = Column(Date, nullable=True) advance_status = Column( Enum( *AdvanceStatus, name='advance_status', create_type=False ), nullable=True ) note = Column(String(255), nullable=True) created_by = Column(String(255), nullable=True) created_at = Column(DateTime, nullable=True) last_modified_by = Column(String(255), nullable=True) last_modified = Column(DateTime, nullable=True) deleted_at = Column(DateTime, nullable=True) deleted_by = Column(String(180), nullable=True) @classmethod def get_account_advance_activity(cls, account_id: int) -> Row: """Get the first row associated with a given account. Args: account_id (int): Account ID to filter by Returns: Row: SqlAlchemy row """ return cls.query \ .join( AccountContract, AccountContract.contract_id == cls.contract_id) \ .filter(AccountContract.account_id == account_id) \ .first()