"""Logic for updating worksheet_payment_contract_advance actions state.""" from owsresponse import response from abacus_state.constants.constants import ( ACTION_STATUSES, WORKSHEET_PAYMENT_CONTRACT_ADVANCE_ACTION_NAMES as ACTIONS, ) from abacus_state.constants.error import ERROR_PREVIOUS_ACTIONS_STATUS 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 ORDERED_ACTIONS = [ ACTIONS.SALESFORCE_ID_LINKED, ACTIONS.SALESFORCE_ID_CONFIRMED, ACTIONS.FUNDS_CONFIRMED, ACTIONS.SEND_PAYMENTS, ] def update_worksheet_payment_contract_advance_state(abacus_state, **params): """Update worksheet_payment_contract_advance by action_state_id.""" actions = AbacusState.get_formatted_action_statuses( 'worksheet_payment_contract_advance', abacus_state.parent_table_id ) if not _are_previous_actions_completed(actions, abacus_state.action_name): return validation_error( ERROR_PREVIOUS_ACTIONS_STATUS.format(abacus_state.action_name) ) abacus_state.update_attributes(**params) AbacusState.commit_changes() return response.Response( message=AbacusStateDetailSchema().dump(abacus_state), status=200 ) def _are_previous_actions_completed(actions, current_action_name): """Validate payment group payments' earlier actions are completed or not.""" current_action_index = ORDERED_ACTIONS.index(current_action_name) validation_status = all( [ actions.get(action_name) == ACTION_STATUSES.COMPLETE for action_name in ORDERED_ACTIONS[:current_action_index] ] ) return validation_status