"""This module contains the WorksheetAccountContractPayableDetails model.""" from typing import Iterable from abacus_common_logic.connectors.database import db from abacus_common_logic.models.base import BaseModel from abacus_common_logic.utils.users import get_flask_user_id from sqlalchemy import update from payment.constants import constants class WorksheetAccountContractPayableDetails(BaseModel): """Worksheet Account Contract Payable model.""" __tablename__ = 'worksheet_account_contract_payable_details' worksheet_account_contract_payable_details_id = db.Column( db.Integer, primary_key=True ) worksheet_account_contract_payable_after_tax_id = db.Column( db.Integer, db.ForeignKey( 'worksheet_account_contract_payable_after_tax.' 'worksheet_account_contract_payable_after_tax_id' ), nullable=False, ) contract_id = db.Column(db.Integer, nullable=False) account_id = db.Column(db.Integer, nullable=False) statement_period_id = db.Column(db.Integer, nullable=False) target_table = db.Column(db.String(255), nullable=False) target_id = db.Column(db.Integer, nullable=False) reference_target_table = db.Column(db.String(255), nullable=True) reference_target_id = db.Column(db.Integer, nullable=True) payable_detail_type_id = db.Column(db.Integer, nullable=True) amount_payable = db.Column(db.Numeric(20, 2), nullable=False) currency = db.Column(db.String(3), nullable=False) notes = db.Column(db.String(255), nullable=True) deleted_at = db.Column(db.DateTime) deleted_by = db.Column(db.String(255)) worksheet_account_contract_payable_after_tax = db.relationship( 'WorksheetPayableBalanceAfterTax', backref='details' ) @classmethod def bulk_create(cls, instances: list) -> None: """Bulk create instances using add_all.""" db.session.add_all(instances) db.session.commit() @classmethod def soft_delete_by_event_id(cls, event_id: int) -> None: """Soft delete by event_id.""" db.session.execute( update(cls) .where( cls.worksheet_account_contract_payable_after_tax.has( abacus_event_id=event_id ), cls.deleted_at.is_(None), ) .values( deleted_at=cls.current_timestamp(), deleted_by=get_flask_user_id(), ) .execution_options(synchronize_session=False) ) db.session.commit() @classmethod def soft_delete_by_worksheet_payable_after_tax_id( cls, worksheet_payable_after_tax_id: int, commit: bool = True ) -> None: """Soft delete by worksheet_payable_after_tax_id.""" db.session.execute( update(cls) .where( cls.worksheet_account_contract_payable_after_tax_id == worksheet_payable_after_tax_id, cls.deleted_at.is_(None), ) .values( deleted_at=cls.current_timestamp(), deleted_by=get_flask_user_id(), ) .execution_options(synchronize_session=False) ) if commit: db.session.commit() @classmethod def soft_delete_corrections_by_worksheet_payable_after_tax_ids( cls, worksheet_payable_after_tax_ids: Iterable[int], commit: bool = True, ) -> None: """Soft delete vat/wht correction rows by worksheet_payable_after_tax_ids.""" correction_type_ids = list( constants.CORRECTION_TYPE_TO_PAYABLE_DETAIL_TYPE_ID.values() ) db.session.execute( update(cls) .where( cls.worksheet_account_contract_payable_after_tax_id.in_( list(worksheet_payable_after_tax_ids) ), cls.payable_detail_type_id.in_(correction_type_ids), cls.deleted_at.is_(None), ) .values( deleted_at=cls.current_timestamp(), deleted_by=get_flask_user_id(), ) .execution_options(synchronize_session=False) ) if commit: db.session.commit()