"""ABACUS state logic.""" from sentry_sdk import capture_message from config import app_logger as logger from src.connectors.ows_abacus_state import create_states, get_all_states, update_state from src.constants.abacus_state import ( ACCOUNT_PAYEE_ACTION_NAMES, ACTION_STATUSES, BANKING_DETAILS_REVIEW_TRANSITIONS, PAYEE_ACTION_NAMES, ) from src.models.ows_abacus_state import AbacusStateGetResponseItemModel from src.models.payee import Payee def _set_states( payee: Payee, message: str, action_name_to_status: dict[str, str], action_name_to_state: dict[str, AbacusStateGetResponseItemModel], ) -> None: """Set ABACUS states. Args: payee: Payee object. message: New status message action_name_to_status: Action name to new action status mapping. action_name_to_state: Action name to current state object mapping. """ missing_action_names = list( set(action_name_to_status.keys()).difference(action_name_to_state.keys()) ) if missing_action_names: action_name_to_state.update(create_states(payee, missing_action_names)) logger.info(f'Created missing states: {missing_action_names}') for action_name, status in action_name_to_status.items(): state = action_name_to_state[action_name] update_state(state.abacus_state_id, status, message) logger.info( 'Updated state {id}({name}): from {curr} -> {next}'.format( id=state.abacus_state_id, name=action_name, curr=state.action_status, next=status, ) ) def set_states( payee: Payee, message: str, banking_details_review_status: str | None = None, payment_eligibility_status: str | None = None, banking_eligibility_status: str | None = None, ) -> bool: """Validate and set ABACUS states. Args: payee: Payee object. message: New status message. banking_details_review_status: banking_details_review action new status. payment_eligibility_status: payment_eligibility action new status. banking_eligibility_status: banking_eligibility action new status. Returns: banking_details_review action new status is valid or not. Raises: ValueError. """ action_name_to_state = get_all_states(payee) action_name_to_status = {} if banking_details_review_status: current_state = action_name_to_state.get( ACCOUNT_PAYEE_ACTION_NAMES.BANKING_DETAILS_REVIEW ) current_status = ( current_state.action_status if current_state else ACTION_STATUSES.INIT ) if banking_details_review_status not in BANKING_DETAILS_REVIEW_TRANSITIONS.get( current_status, [] ): capture_message( f'Cannot change banking_details_review {current_state and current_state.abacus_state_id}' f' status {current_status} -> {banking_details_review_status}', 'error', ) return False action_name_to_status[ACCOUNT_PAYEE_ACTION_NAMES.BANKING_DETAILS_REVIEW] = ( banking_details_review_status ) if payment_eligibility_status: action_name_to_status[ACCOUNT_PAYEE_ACTION_NAMES.PAYMENT_ELIGIBILITY] = ( payment_eligibility_status ) if banking_eligibility_status: action_name_to_status[PAYEE_ACTION_NAMES.BANKING_ELIGIBILITY] = ( banking_eligibility_status ) _set_states(payee, message, action_name_to_status, action_name_to_state) return True