"""Payoneer Program model.""" from abacus_common_logic.connectors.database import db from abacus_common_logic.models.base import CRUDMixin from abacus_account.models.payment_entity_payoneer_program import \ PaymentEntityPayoneerProgram class ReferencePayoneerProgram(db.Model, CRUDMixin): """Payoneer Program model. NOTE: payoneer_program_id is equal to the program ID provided by Payoneer. It is not autoincrementing, but rather defined on the ID assigned by Payoneer. """ __tablename__ = 'reference_payoneer_program' payoneer_program_id = db.Column(db.Integer, primary_key=True) payoneer_program_name = db.Column(db.String(255), nullable=False) funding_currency = db.Column(db.String(3), nullable=False) reference_payment_type_id = db.Column(db.Integer, nullable=False) payment_entity_payoneer_programs = db.relationship( 'PaymentEntityPayoneerProgram', backref='reference_payoneer_program' ) account_payee = db.relationship( 'AccountPayee', backref='reference_payoneer_program', uselist=False ) @staticmethod def get_payoneer_program_by_params( currency_code: str, agreement_type_id: int, payment_entity_id: int, reference_payment_type_id: int | None = None ): """Build a query to get payoneer program by params.""" query = db.session.query( ReferencePayoneerProgram ).join( ReferencePayoneerProgram.payment_entity_payoneer_programs ).filter( PaymentEntityPayoneerProgram.payment_currency == currency_code, ) query = query.filter( PaymentEntityPayoneerProgram.agreement_type_id == agreement_type_id ) query = query.filter( PaymentEntityPayoneerProgram.reference_payment_entity_id == payment_entity_id # noqa: E501 ) if reference_payment_type_id: query = query.filter( ReferencePayoneerProgram.reference_payment_type_id == reference_payment_type_id # noqa: E501 ) return query.first()