"""Blueprint for payee's KYC notifications.""" from http import HTTPStatus from typing import Any, Dict, Tuple from common_apispec import doc, marshal_with, use_kwargs from flask import Blueprint from payee.constants.constants import ( PERMISSIONS_RESOURCE_TYPES, PROFILES, ) from payee.logic import payee_kyc_notification as logic from payee.logic.payee import map_payee_id from payee.models.account_payee import AccountPayee from payee.models.payee import Payee from payee.models.payee_kyc_notification import ( AccountPayeeKycNotification, PayeeKycNotification, ) from payee.schemas.payee_kyc_notification import ( AccountPayeeKycNotificationOutputSchema, PayeeKycNotificationDataloaderOutputSchema, PayeeKycNotificationDataloaderSchema, PayeeKycNotificationOutputMapSchema, PayeeKycNotificationSchema, ) from payee.utils.permissions import check_access account_payee_kyc_notification_api = Blueprint( 'account_payee_kyc_notification_api', __name__, url_prefix='/account-payee' ) payee_kyc_notification_api = Blueprint( 'payee_kyc_notification_api', __name__, url_prefix='/payee' ) @account_payee_kyc_notification_api.route( '//kyc-notification', methods=['GET'] ) @check_access( resource_type=PERMISSIONS_RESOURCE_TYPES.BANK_INFO, allowed_profiles=[PROFILES.ABACUS], ) @doc( tags=['kyc notification'], description='Get account payee latest kyc notification', ) @marshal_with( AccountPayeeKycNotificationOutputSchema, code=HTTPStatus.OK, description=HTTPStatus.OK.phrase, ) def get_payee_latest_kyc_notification( account_payee_id: int, ) -> Tuple[Dict[str, Any] | None, int]: """Get account payee latest active kyc notification.""" result = AccountPayeeKycNotification.get_latest_by_payee_id(account_payee_id) return result, HTTPStatus.OK @payee_kyc_notification_api.route('/kyc-notification/dataloader', methods=['POST']) @doc( tags=['kyc notification'], description='Get payee latest kyc notification (dataloader)', ) @use_kwargs(PayeeKycNotificationDataloaderSchema, location='json', required=True) @marshal_with( PayeeKycNotificationDataloaderOutputSchema, code=HTTPStatus.OK, description=HTTPStatus.OK.phrase, ) def get_payee_latest_kyc_notification_dataloader( **payload: dict, ) -> Tuple[Dict[str, Any] | None, int]: """Get payee latest active kyc notification.""" payee_ids = payload.get('payee_ids') result = logic.get_payee_kyc_notification_dataloader(payee_ids) return result, HTTPStatus.OK @payee_kyc_notification_api.route('//kyc-notification', methods=['POST']) @account_payee_kyc_notification_api.route( '//kyc-notification', methods=['POST'] ) @map_payee_id @doc( tags=['kyc notification'], description='Create payee KYC notification', ) @use_kwargs(PayeeKycNotificationSchema, location='json') @marshal_with( PayeeKycNotificationOutputMapSchema, code=HTTPStatus.CREATED, description=HTTPStatus.CREATED.phrase, ) @marshal_with( None, code=HTTPStatus.BAD_REQUEST, description=HTTPStatus.BAD_REQUEST.phrase, ) def create_payee_kyc_notification(payee, **payload) -> Tuple[Dict[str, Any], int]: """Create a new KYC notification record.""" if isinstance(payee, Payee): result = PayeeKycNotification.create(payee_id=payee.payee_id, **payload) return result, HTTPStatus.CREATED if isinstance(payee, AccountPayee): result = AccountPayeeKycNotification.create( account_payee_id=payee.account_payee_id, **payload ) return result, HTTPStatus.CREATED return None, HTTPStatus.BAD_REQUEST @account_payee_kyc_notification_api.route( '//kyc-notification', methods=['DELETE'] ) @payee_kyc_notification_api.route( '//kyc-notification', methods=['DELETE'] ) @map_payee_id @doc( tags=['kyc notification'], description='Delete all payee KYC notifications', ) @marshal_with( None, code=HTTPStatus.NO_CONTENT, description=HTTPStatus.NO_CONTENT.phrase, apply=False, ) @marshal_with( None, code=HTTPStatus.BAD_REQUEST, description=HTTPStatus.BAD_REQUEST.phrase, ) def delete_payee_kyc_notifications(payee) -> Tuple[None, int]: """Delete all active account payee's KYC notifications.""" if isinstance(payee, Payee): PayeeKycNotification.soft_delete_by_payee_id(payee.payee_id) return None, HTTPStatus.NO_CONTENT if isinstance(payee, AccountPayee): AccountPayeeKycNotification.soft_delete_by_payee_id(payee.account_payee_id) return None, HTTPStatus.NO_CONTENT return None, HTTPStatus.BAD_REQUEST