"""Tax reset logic.""" from abacus_common_logic.connectors.database import db from flask import g from payee.constants.constants import TAX_TYPES from payee.logic.exceptions import LogicError from payee.logic.secure_document import save_secure_document_details_by_payee_id from payee.logic.tax_details import delete_record as delete_tax_details_record from payee.logic.tax_form import delete_record as delete_tax_form_record from payee.models.account_payee import AccountPayee from payee.models.reports_tax_info import ReportsTaxInfo from payee.models.tax_form import TaxFormInfo def reset_by_account_payee_id(account_payee_id: int) -> None: """Reset tax data by account payee id.""" account_payee = AccountPayee.get_by_id_or_error(account_payee_id) tax_form_info = TaxFormInfo.get_by_account_payee_id(account_payee_id) tax_details_deleted_revision, tax_details_deleted_document = None, None tax_form_deleted_revision, tax_form_deleted_document = None, None try: tax_details_deleted_revision, tax_details_deleted_document = ( delete_tax_details_record(account_payee_id) ) except LogicError: g.log.info( f'No secure tax details to delete in Dynamo for account_payee_id {account_payee_id}' ) if tax_form_info: try: tax_form_deleted_revision, tax_form_deleted_document = ( delete_tax_form_record( tax_form_info.account_payee_tax_form_info_id, False ) ) except LogicError: g.log.info( f'No secure tax form to delete in Dynamo for account_payee_id {account_payee_id}' ) tax_info = account_payee.account_tax_info if not tax_info: g.log.warning(f'No account_tax_info for account_payee_id {account_payee_id}') return try: _commit_deletion( tax_details_deleted_revision, tax_form_deleted_revision, tax_info ) db.session.commit() except Exception: db.session.rollback() _rollback_documents( account_payee_id, tax_details_deleted_document, tax_form_deleted_document ) raise def _commit_deletion(tax_details_deleted_revision, tax_form_deleted_revision, tax_info): """Create reports tax info records.""" tax_info.update_attributes( country_of_tax_residence=None, is_sba_signed=False, is_tax_treaty_claimed=False, tax_employment_type=None, certificate_of_residence_expiration_date=None, is_wht_applicable=True, is_resident_of_spanish_islands=None, wht_rate_override=None, ) db.session.flush() history_id = next( reversed(tax_info.account_tax_info_history) ).account_tax_info_history_id if tax_details_deleted_revision: ReportsTaxInfo.build( account_tax_info_history_id=history_id, tax_type=TAX_TYPES.DETAILS, revision_id=tax_details_deleted_revision, ) if tax_form_deleted_revision: ReportsTaxInfo.build( account_tax_info_history_id=history_id, tax_type=TAX_TYPES.FORM, revision_id=tax_form_deleted_revision, ) def _rollback_documents( account_payee_id, tax_details_deleted_document, tax_form_deleted_document ): """Rollback secure documents in case of failure during tax reset.""" if tax_details_deleted_document: save_secure_document_details_by_payee_id( account_payee_id, tax_details_deleted_document.__class__, **tax_details_deleted_document.values, ) if tax_form_deleted_document: save_secure_document_details_by_payee_id( account_payee_id, tax_form_deleted_document.__class__, **tax_form_deleted_document.values, )