"""contract_lifecycle_schedule Model.""" from abacus_common_logic.connectors.database import db from abacus_common_logic.models import BaseModel, NormalizedDate, NormalizedDateTime from sqlalchemy import Enum from abacus_contract.constants.constants import ( CONTRACT_LIFECYCLE_SCHEDULE_RENEWAL_TYPES, ) class ContractLifecycleSchedule(BaseModel): """contract_lifecycle_schedule Model.""" __tablename__ = 'contract_lifecycle_schedule' contract_lifecycle_schedule_id = db.Column(db.Integer, primary_key=True) contract_id = db.Column( db.Integer, db.ForeignKey('contract.contract_id'), nullable=False ) termination_notice_detail_id = db.Column( db.Integer, db.ForeignKey( 'contract_lifecycle_schedule_detail.contract_lifecycle_schedule_detail_id' ), nullable=True, ) renewal_offset_detail_id = db.Column( db.Integer, db.ForeignKey( 'contract_lifecycle_schedule_detail.contract_lifecycle_schedule_detail_id' ), nullable=True, ) collection_period_detail_id = db.Column( db.Integer, db.ForeignKey( 'contract_lifecycle_schedule_detail.contract_lifecycle_schedule_detail_id' ), nullable=True, ) renewal_type = db.Column( Enum( *CONTRACT_LIFECYCLE_SCHEDULE_RENEWAL_TYPES, name='renewal_type', create_type=False, ), nullable=False, ) schedule_end = db.Column(NormalizedDate(), nullable=True) deleted_at = db.Column(NormalizedDateTime(), nullable=True) deleted_by = db.Column(db.String(180), nullable=True) termination_notice_detail = db.relationship( 'ContractLifecycleScheduleDetail', foreign_keys='[ContractLifecycleSchedule.termination_notice_detail_id]', ) renewal_offset_detail = db.relationship( 'ContractLifecycleScheduleDetail', foreign_keys='[ContractLifecycleSchedule.renewal_offset_detail_id]', ) collection_period_detail = db.relationship( 'ContractLifecycleScheduleDetail', foreign_keys='[ContractLifecycleSchedule.collection_period_detail_id]', ) contract_lifecycle = db.relationship( 'ContractLifecycle', backref='contract_lifecycle_schedule', uselist=False ) @classmethod def get_by_ids(cls, contract_lifecycle_schedule_ids: list) -> list: """Get contract lifecycle schedules by their identifiers. Args: contract_lifecycle_schedule_ids(list): a list of ids of the contract_lifecycle_schedule """ return cls.query.filter( cls.contract_lifecycle_schedule_id.in_(contract_lifecycle_schedule_ids), cls.deleted_at.is_(None), cls.deleted_by.is_(None), ).all() @classmethod def get_contract_lifecycle_schedules_by_contract_id(cls, contract_id: int) -> list: """Get contract lifecycle schedules by contract_id. Args: contract_id(int): id of the contract """ return cls.query.filter( cls.contract_id == contract_id, cls.deleted_at.is_(None), cls.deleted_by.is_(None), ).all()