"""Logic for updating account_payee action states.""" from marshmallow import ValidationError from owsresponse import response from abacus_state.constants.constants import ( ACCOUNT_PAYEE_ACTION_NAMES, ACTION_STATUSES, PARENT_TABLE_NAMES, ) from abacus_state.constants.error import ( ERROR_INVALID_ACTION_STATUS, ERROR_MESSAGE_IS_REQUIRED, ) from abacus_state.models.abacus_state import AbacusState from abacus_state.schemas.abacus_state import AbacusStateDetailSchema from abacus_state.utils.format_error import validation_error def update_account_payee_state( abacus_state: AbacusState, **params ) -> response.Response: """Update account_payee state by abacus_state_id. Args: abacus_state (AbacusState): AbacusState instance to be updated params (dict): dict of fields to be updated (i.e. action_status, message) Returns: an owsresponse Response object """ try: action_name = abacus_state.action_name action_status = params.get('action_status') message = params.get('message') _validate_status_update(action_name, action_status, message) abacus_state.update_attributes(**params) AbacusState.commit_changes() return response.Response( message=AbacusStateDetailSchema().dump(abacus_state), status=200 ) except ValidationError as e: return validation_error(e.messages[0]) def _validate_status_update( action_name: str, action_status: str | None, message: str | None ) -> None: """Validate if status update is valid. Args: action_name (str): either 'payment_eligibility' or 'tax_eligibility' action_status (str): status of action (i.e. 'completed', 'error', etc) message (str): optional message to save with status Raises: ValidationError Returns: None if no ValidationError was raised """ if action_name == ACCOUNT_PAYEE_ACTION_NAMES.TAX_ELIGIBILITY: if action_status not in [ ACTION_STATUSES.INIT, ACTION_STATUSES.RUNNING, ACTION_STATUSES.COMPLETE, ACTION_STATUSES.REJECTED, ]: raise ValidationError( message=ERROR_INVALID_ACTION_STATUS.format( action_name=action_name, action_status=action_status, parent_table_name=PARENT_TABLE_NAMES.ACCOUNT_PAYEE, ) ) if action_name == ACCOUNT_PAYEE_ACTION_NAMES.PAYMENT_ELIGIBILITY: if action_status == ACTION_STATUSES.REJECTED and not message: raise ValidationError( message=ERROR_MESSAGE_IS_REQUIRED.format(action_status=action_status) )