"""Blueprint for payee's tax from information.""" from http import HTTPStatus from typing import Any, Dict, Tuple from abacus_common_logic.marshalling.base import PaginationSchema from common_apispec import doc, marshal_with, use_kwargs from flask import Blueprint from payee.config import Config from payee.constants.constants import ( PERMISSIONS_ACTIONS, PERMISSIONS_RESOURCE_TYPES, PROFILES, ) from payee.logic import tax_form as logic from payee.schemas.tax_form import ( FilterParamsPostSchema, TaxFormInfoDetailsOutputSchema, TaxFormInfoOutputSchema, TaxFormInputSchema, TaxFormOutputSchema, ) from payee.utils.permissions import check_access, check_jwt_identity, or_ tax_form_api = Blueprint('tax_form_api', __name__, url_prefix='/account-payee') @tax_form_api.route('/tax-form-info/bulk', methods=['POST']) @or_( check_jwt_identity(Config.TAX_FORM_SERVICE_IDENTITIES), check_access( resource_type=PERMISSIONS_RESOURCE_TYPES.TAX_INFO, allowed_profiles=[PROFILES.DOCUMENTS], ), check_access( resource_type=PERMISSIONS_RESOURCE_TYPES.TAX_INFO, allowed_profiles=[PROFILES.ABACUS, PROFILES.ACCOUNT360], bypass=True, ), ) @doc( tags=['tax form'], description='Get account payee tax form information', ) @use_kwargs(PaginationSchema, location='query') @use_kwargs(FilterParamsPostSchema, location='json') @marshal_with( TaxFormInfoOutputSchema, code=HTTPStatus.OK, description=HTTPStatus.OK.phrase, ) @marshal_with( None, code=HTTPStatus.BAD_REQUEST, description=HTTPStatus.BAD_REQUEST.phrase, ) def get_tax_form_info(**payload) -> Tuple[Dict[str, Any], int]: """Get account payee tax form information.""" response = logic.get_records(**payload) return response, HTTPStatus.OK @tax_form_api.route('/tax-form-info/details/bulk', methods=['POST']) @or_( check_jwt_identity(Config.TAX_FORM_SERVICE_IDENTITIES), check_access( resource_type=PERMISSIONS_RESOURCE_TYPES.TAX_INFO, allowed_profiles=[PROFILES.DOCUMENTS], ), check_access( resource_type=PERMISSIONS_RESOURCE_TYPES.TAX_INFO, allowed_profiles=[PROFILES.ABACUS, PROFILES.ACCOUNT360], bypass=True, ), ) @doc( tags=['tax form'], description='Get account payee tax form details', ) @use_kwargs(PaginationSchema, location='query') @use_kwargs(FilterParamsPostSchema, location='json') @marshal_with( TaxFormInfoDetailsOutputSchema, code=HTTPStatus.OK, description=HTTPStatus.OK.phrase, ) @marshal_with( None, code=HTTPStatus.BAD_REQUEST, description=HTTPStatus.BAD_REQUEST.phrase, ) def get_tax_form_details(obscure_pii=True, **payload) -> Tuple[Dict[str, Any], int]: """Get account payee tax form details records.""" response = logic.get_records_details(obscure_pii=obscure_pii, **payload) return response, HTTPStatus.OK @tax_form_api.route('//tax-form-info', methods=['POST']) @or_( check_jwt_identity(Config.TAX_FORM_SERVICE_IDENTITIES), check_access( resource_type=PERMISSIONS_RESOURCE_TYPES.TAX_INFO, action=PERMISSIONS_ACTIONS.EDIT, ), ) @doc( tags=['tax form'], description='Create or update the tax form', ) @use_kwargs(TaxFormInputSchema, location='json') @marshal_with( TaxFormOutputSchema, code=HTTPStatus.OK, description=HTTPStatus.OK.phrase, ) @marshal_with( None, code=HTTPStatus.BAD_REQUEST, description=HTTPStatus.BAD_REQUEST.phrase, ) def post_tax_form(account_payee_id, **payload) -> Tuple[object, int]: """Submit account payee tax form.""" response = logic.create_or_update_record(account_payee_id, **payload) return response, HTTPStatus.OK @tax_form_api.route('/tax-form-info/', methods=['DELETE']) @or_( check_jwt_identity(Config.TAX_FORM_SERVICE_IDENTITIES), check_access( resource_type=PERMISSIONS_RESOURCE_TYPES.TAX_INFO, action=PERMISSIONS_ACTIONS.DELETE, allowed_profiles=[PROFILES.ABACUS], ), ) @doc( tags=['tax form'], description='Soft delete the tax form', ) @marshal_with( None, code=HTTPStatus.NO_CONTENT, description=HTTPStatus.OK.phrase, apply=False, ) @marshal_with( None, code=HTTPStatus.BAD_REQUEST, description=HTTPStatus.BAD_REQUEST.phrase, ) def delete_tax_form(tax_form_info_id) -> Tuple[None, int]: """Soft delete account payee tax form.""" logic.delete_record(tax_form_info_id) return None, HTTPStatus.NO_CONTENT