"""Blueprint for payee's bank details.""" from http import HTTPStatus import logging from common_apispec import doc, marshal_with, use_kwargs from flask import Blueprint from payee.config import Config from payee.constants import error from payee.constants.constants import ( PERMISSIONS_ACTIONS, PERMISSIONS_RESOURCE_TYPES, PROFILES, ) from payee.logic import bank_details as logic from payee.logic.payee import map_payee_id from payee.logic.secure_document import has_secure_document_details from payee.models.account_payee import AccountPayee from payee.models.bank_details import BankDetailsDocument from payee.models.payee import Payee from payee.schemas.bank_details import ( BankDetailsDetailedSchema, BankDetailsInputSchema, ) from payee.schemas.bank_details_migration import ( MigrationBankDetailsDetailedSchema, MigrationBankDetailsInputSchema, ) from payee.utils.format_data import flatten_input_data from payee.utils.permissions import check_access, check_jwt_identity, or_ bank_details_api = Blueprint('bank_details_api', __name__) logger = logging.getLogger('segment_logger') @bank_details_api.route( '/account-payee//bank-details', methods=['GET'] ) @bank_details_api.route('/payee//bank-details', methods=['GET']) @map_payee_id @or_( check_jwt_identity(Config.BANK_DETAILS_SERVICE_IDENTITIES), check_access(resource_type=PERMISSIONS_RESOURCE_TYPES.BANK_INFO), ) @doc( tags=['bank details'], description='Get account payee bank details', ) @marshal_with( BankDetailsDetailedSchema, code=HTTPStatus.OK, description=HTTPStatus.OK.phrase, ) @marshal_with( None, code=HTTPStatus.BAD_REQUEST, description=HTTPStatus.BAD_REQUEST.phrase, ) def get_payee_bank_details(payee: Payee | AccountPayee): """Get payee bank details.""" bank_details_document = has_secure_document_details( payee.payoneer_client_reference_id, BankDetailsDocument ) if not bank_details_document: return ( error.ERROR_PAYEE_BANK_DETAILS_NOT_FOUND.format( id_name=payee.entity_id_name, payee_id=payee.payee_entity_id ), HTTPStatus.NOT_FOUND, ) message = BankDetailsDocument.build_response( payee.payoneer_client_reference_id, bank_details_document, is_obscured=True ) return message, HTTPStatus.OK @bank_details_api.route( '/account-payee//bank-details', methods=['DELETE'] ) @check_jwt_identity(Config.BANK_DETAILS_SERVICE_IDENTITIES) @doc( tags=['bank details'], description='Delete account payee bank details', ) @marshal_with( None, code=HTTPStatus.NO_CONTENT, description=HTTPStatus.NO_CONTENT.phrase, apply=False, ) def delete_payee_bank_details(account_payee_id): """Delete payee bank details.""" logic.purge_bank_details_info(account_payee_id) return None, HTTPStatus.NO_CONTENT @bank_details_api.route( '/account-payee//sync-whitelabel-profile', methods=['POST'] ) @bank_details_api.route( '/payee//sync-whitelabel-profile', methods=['POST'] ) @map_payee_id @check_access( resource_type=PERMISSIONS_RESOURCE_TYPES.BANK_INFO, action=PERMISSIONS_ACTIONS.EDIT, allowed_profiles=[PROFILES.DOCUMENTS, PROFILES.COLLABORATORS], ) @doc( tags=['bank details'], description='Sync account payee bank details', ) @use_kwargs(BankDetailsInputSchema, location='json', required=True) @marshal_with( BankDetailsDetailedSchema, code=HTTPStatus.CREATED, description=HTTPStatus.OK.phrase, ) def sync_payee_bank_details(payee: Payee | AccountPayee, **params: dict): """Sync payee bank details.""" flatten_input_data(params) message = logic.sync_bank_details(payee, **params) return message, HTTPStatus.CREATED @bank_details_api.route( '/account-payee//bank-details', methods=['POST'] ) @check_jwt_identity(Config.BANK_DETAILS_SERVICE_IDENTITIES) @doc( tags=['bank details'], description='Save payee bank details', ) @use_kwargs(MigrationBankDetailsInputSchema, location='json', required=True) @marshal_with( MigrationBankDetailsDetailedSchema, code=HTTPStatus.CREATED, description=HTTPStatus.OK.phrase, ) def save_payee_bank_details(**params: dict): """Save payee bank details.""" flatten_input_data(params) message = logic.save_payee_bank_details(**params) return message, HTTPStatus.CREATED @bank_details_api.route( '/account-payee//reset-banking-states/', methods=['POST'], ) @check_jwt_identity(Config.PAYONEER_SERVICE_IDENTITIES) @doc( tags=['bank details'], description='Reset banking states to INIT', ) @marshal_with( None, code=HTTPStatus.OK, description=HTTPStatus.OK.phrase, apply=False, ) def reset_banking_states(account_payee_id: int): """Reset banking states.""" logic.reset_banking_states(account_payee_id) return None, HTTPStatus.OK @bank_details_api.route( '/account-payee//register-whitelabel-profile', methods=['POST'], ) @check_jwt_identity(Config.BANK_DETAILS_SERVICE_IDENTITIES) @doc( tags=['bank details'], description='Register whitelabel profile', ) @marshal_with( None, code=HTTPStatus.OK, description=HTTPStatus.OK.phrase, apply=False, ) def register_whitelabel_profile(account_payee_id: int): """Register whitelabel profile.""" logic.register_whitelabel_profile(account_payee_id) return None, HTTPStatus.OK