"""Blueprint for Worksheet account contract payable details API.""" from http import HTTPStatus from abacus_common_logic.marshalling.base import PaginationSchema from common_apispec import doc, marshal_with, use_kwargs from flask import Blueprint from payment.constants.constants import DEFAULT_BULK_MAX_LIMIT from payment.logic import worksheet_account_contract_payable_details as logic from payment.schemas.request import FilterParamsPostSchema from payment.schemas.worksheet_account_contract_payable_details import ( PaginatedWorksheetAccountContractPayableDetailsOutputSchema, WorksheetAccountContractPayableDetailsBulkDeleteSchema, WorksheetAccountContractPayableDetailsCreateSchema, ) from payment.utils.authorization import check_access worksheet_account_contract_payable_details_api = Blueprint( 'worksheet_account_contract_payable_details_api', __name__, url_prefix='/worksheet-account-contract-payable-details', ) @worksheet_account_contract_payable_details_api.route( '/event//statement-period//bulk/', methods=['POST'], ) @doc( tags=['payable details'], description='Bulk create worksheet_account_contract_payable_details records.', ) @check_access @use_kwargs( WorksheetAccountContractPayableDetailsCreateSchema(many=True), location='json' ) @marshal_with( WorksheetAccountContractPayableDetailsCreateSchema(many=True), code=HTTPStatus.CREATED, description=HTTPStatus.CREATED.phrase, ) def bulk_create_worksheet_account_contract_payable_details( *create_params: dict, event_id: int, statement_period_id: int ): """Bulk create worksheet_account_contract_payable_details records.""" return logic.bulk_create( event_id, statement_period_id, create_params ), HTTPStatus.CREATED @worksheet_account_contract_payable_details_api.route( '/event//', methods=['DELETE'] ) @doc( tags=['payable details'], description='Delete Worksheet Account Contract Payable Details 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_payable_details(event_id: int): """Bulk delete worksheet_account_contract_payable_details by event_id.""" logic.bulk_delete(event_id) return None, HTTPStatus.NO_CONTENT @worksheet_account_contract_payable_details_api.route('/bulk', methods=['DELETE']) @doc( tags=['payable details'], description=( 'Bulk soft delete vat/wht correction rows of ' 'worksheet_account_contract_payable_details by ' 'worksheet_account_contract_payable_after_tax_id. ' f'Max ({DEFAULT_BULK_MAX_LIMIT})' ' items at once.' ), ) @check_access @use_kwargs(WorksheetAccountContractPayableDetailsBulkDeleteSchema, location='json') @marshal_with( None, code=HTTPStatus.NO_CONTENT, description=HTTPStatus.NO_CONTENT.phrase, apply=False, ) def bulk_soft_delete_worksheet_account_contract_payable_details_corrections( worksheet_account_contract_payable_after_tax_ids, ): """Bulk soft delete vat/wht correction worksheet_account_contract_payable_details. Only rows with `payable_detail_type_id` in (4/withholding_tax_correction, 5/vat_correction) are deleted. """ logic.bulk_soft_delete_corrections_by_worksheet_payable_after_tax_ids( worksheet_account_contract_payable_after_tax_ids ) return None, HTTPStatus.NO_CONTENT @worksheet_account_contract_payable_details_api.route( '/statement-period//', methods=['POST'] ) @doc( tags=['payable details'], description='Get Worksheet Account Contract Payable Details by statement_period_id', ) @check_access @use_kwargs(PaginationSchema, location='query') @use_kwargs(FilterParamsPostSchema, location='json') @marshal_with( PaginatedWorksheetAccountContractPayableDetailsOutputSchema, code=HTTPStatus.OK, description=HTTPStatus.OK.phrase, ) @marshal_with( None, code=HTTPStatus.BAD_REQUEST, description=HTTPStatus.BAD_REQUEST.phrase, ) def get_worksheet_account_contract_payable_details(statement_period_id: int, **payload): """Get worksheet_account_contract_payable_details by statement_period_id \ and optionally by list of worksheet_account_contract_payable_after_tax_ids and detail_groups. """ # noqa: E501 filters = payload.pop('filters', {}) worksheet_after_tax_ids = filters.get('worksheet_payable_after_tax_ids') detail_groups = filters.get('detail_groups') return logic.get_filtered_active_records( statement_period_id=statement_period_id, worksheet_after_tax_ids=worksheet_after_tax_ids, detail_groups=detail_groups, **payload, ), HTTPStatus.OK