"""Blueprint for Worksheet account contract closing balance API.""" from http import HTTPStatus from typing import List, Optional, Tuple from abacus_common_logic.marshalling.base import PaginationSchema from common_apispec import doc, marshal_with, use_kwargs from flask import Blueprint from payment.constants import constants from payment.logic import worksheet_account_contract_closing_balance as logic from payment.schemas.request import DataloaderParamsPostSchema from payment.schemas.worksheet_account_contract_closing_balance import ( PaginatedWorksheetAccountContractClosingBalanceInputSchema, PaginatedWorksheetAccountContractClosingBalanceOutputSchema, WorksheetAccountContractClosingBalanceBulkFilterParamsPostSchema, WorksheetAccountContractClosingBalanceDataloaderSchema, WorksheetAccountContractClosingBalanceInputSchema, WorksheetAccountContractClosingBalanceSchema, ) from payment.utils.authorization import check_access worksheet_account_contract_closing_balance_api = Blueprint( 'worksheet_account_contract_closing_balance_api', __name__, url_prefix='/worksheet-account-contract-closing-balance', ) @worksheet_account_contract_closing_balance_api.route( """/event//statement-period//payment-entity//bulk/""", # noqa: E501 methods=['POST'], ) @doc( tags=['closing balance'], description='Bulk create worksheet_account_contract_closing_balance records.', ) @check_access @use_kwargs( WorksheetAccountContractClosingBalanceInputSchema( many=True, ), location='json', required=True, ) @marshal_with( WorksheetAccountContractClosingBalanceSchema(many=True), code=HTTPStatus.CREATED, description=HTTPStatus.CREATED.phrase, ) def bulk_create_worksheet_account_contract_closing_balance( *create_params: dict, event_id: int, statement_period_id: int, payment_entity_id: int, ): """Bulk create worksheet_account_contract_closing_balance records.""" return logic.bulk_create( event_id, statement_period_id, payment_entity_id, create_params ), HTTPStatus.CREATED @worksheet_account_contract_closing_balance_api.route( """/event//bulk/""", methods=['DELETE'], ) @doc( tags=['closing balance'], description='Bulk delete worksheet_account_contract_closing_balance by event_id.', ) @check_access @marshal_with( None, code=HTTPStatus.NO_CONTENT, description=HTTPStatus.NO_CONTENT.phrase, apply=False, ) def bulk_delete_worksheet_account_contract_closing_balance(event_id: int): """Bulk delete worksheet_account_contract_closing_balance by event_id.""" logic.bulk_delete(event_id) return None, HTTPStatus.NO_CONTENT @worksheet_account_contract_closing_balance_api.route( """/statement-period//""", methods=['GET'], ) @check_access @doc( tags=['closing balance'], description='Get list of Worksheet Account Contract Closing Balances for a statement period', # noqa: E501 ) @use_kwargs( PaginatedWorksheetAccountContractClosingBalanceInputSchema, location='query' ) @marshal_with( PaginatedWorksheetAccountContractClosingBalanceOutputSchema, code=HTTPStatus.OK, description=HTTPStatus.OK.phrase, ) @marshal_with( None, code=HTTPStatus.BAD_REQUEST, description=HTTPStatus.BAD_REQUEST.phrase, ) def get_worksheet_account_contract_closing_balance_by_statement_period_id( statement_period_id: int, **payload ): """Get worksheet_account_contract_closing_balance by statement_period_id.""" response = logic.get_by_statement_period_id( statement_period_id=statement_period_id, **payload ) return response, HTTPStatus.OK @worksheet_account_contract_closing_balance_api.route('/bulk', methods=['POST']) @doc( tags=['closing balance'], description='Get list of Worksheet Account Contract Closing Balances by IDs.', ) @check_access @use_kwargs(PaginationSchema, location='query') @use_kwargs( WorksheetAccountContractClosingBalanceBulkFilterParamsPostSchema, location='json' ) @marshal_with( PaginatedWorksheetAccountContractClosingBalanceOutputSchema, code=HTTPStatus.OK, description=HTTPStatus.OK.phrase, ) @marshal_with( None, code=HTTPStatus.BAD_REQUEST, description=HTTPStatus.BAD_REQUEST.phrase, ) def get_worksheet_account_contract_closing_balance_bulk( filters: dict = None, limit: Optional[int] = constants.DEFAULT_PAGE_LIMIT, offset: Optional[int] = constants.DEFAULT_PAGE_OFFSET, ) -> Tuple[dict, int]: """Get worksheet_account_contract_closing_balance by list of IDs.""" filters = filters or {} return logic.get_by_ids( worksheet_closing_balance_ids=filters.get('worksheet_closing_balance_ids'), limit=limit, offset=offset, ), HTTPStatus.OK @worksheet_account_contract_closing_balance_api.route( '/by-payment-account-ids/dataloader', methods=['POST'] ) @doc(tags=['closing balance'], description='Dataloader for closing balances instances') @check_access @use_kwargs(DataloaderParamsPostSchema(), location='json') @marshal_with( WorksheetAccountContractClosingBalanceDataloaderSchema(), code=HTTPStatus.OK, description=HTTPStatus.OK.phrase, ) @marshal_with( None, code=HTTPStatus.BAD_REQUEST, description=HTTPStatus.BAD_REQUEST.phrase, ) def worksheets_by_payment_account_ids_dataloader(ids: List[int]): """Dataloader endpoint.""" return logic.dataload_by_payment_account_ids(ids), HTTPStatus.OK @worksheet_account_contract_closing_balance_api.route( '/event//taxable-revenue/copy/', methods=['POST'], ) @doc( tags=['closing balance'], description='Endpoint for bulk copy from close balance to taxable revenue.', ) @check_access @marshal_with( None, code=HTTPStatus.CREATED, description=HTTPStatus.CREATED.phrase, apply=False ) def bulk_copy_close_balances_to_taxable_revenues(event_id: int): """Bulk copy close_balance into taxable_revenue records by event id.""" logic.bulk_copy_into_taxable_revenue_by_event_id(event_id) return constants.BULK_ENDPOINT_SUCCESS_RESPONSE, HTTPStatus.CREATED