"""Account contract model.""" from sqlalchemy import Column from sqlalchemy import Integer from sqlalchemy import literal_column from sqlalchemy import table from moneyhub.models.contract import Contract from moneyhub.models.mysql_base import BaseModel from moneyhub.models.reference_signing_entity import ReferenceSigningEntity class AccountContract(BaseModel): """Account contract model.""" __tablename__ = 'account_contract' account_contract_id = Column(Integer, primary_key=True) account_id = Column(Integer, nullable=False) contract_id = Column(Integer, nullable=False) @classmethod def get_contracts_by_payment_entity(cls, payment_entity_id: int): """Get contracts by payment entity.""" return cls.query.with_entities( cls.contract_id, cls.account_id, ReferenceSigningEntity.company_code, ReferenceSigningEntity.tax_entity_company_code) \ .select_from(cls) \ .join( table('account_payment_term'), literal_column('account_payment_term.account_id') == cls.account_id) \ .join( Contract, cls.contract_id == Contract.contract_id) \ .join( ReferenceSigningEntity, Contract.reference_signing_entity_id == ReferenceSigningEntity.reference_signing_entity_id) \ .filter( literal_column('account_payment_term.payment_entity_id') == payment_entity_id ).all() @classmethod def get_by_account(cls, account_id: int) -> list[int]: """Get contract for specified account. Args: account_id (int): The id of account Returns: list: list of account contract records """ filters = [cls.account_id == account_id] result = cls.query.with_entities(cls.contract_id).filter(*filters).all() return [c.contract_id for c in result]