"""Blueprint for Payment Group Payment Account API.""" from http import HTTPStatus from typing import Optional, Tuple from abacus_common_logic.marshalling.base import PaginationSchema from common_apispec import doc, marshal_with, use_kwargs from flask import Blueprint, Response from payment.constants import constants from payment.logic import ( payment_group_payment_account as logic, worksheet_account_contract_payable_details as payable_details_logic, ) from payment.schemas.payment_group_payment_account import ( LastPaymentBulkFilterParamsPostSchema, PaymentGroupPaymentAccountFilterParamsPostSchema, PaymentGroupPaymentAccountListResponseSchema, PaymentGroupPaymentAccountPutSchema, PaymentGroupPaymentAccountSchema, ) from payment.schemas.payment_group_payment_account_detail import ( PaymentDebitCreditDataEntrySchema, ) from payment.schemas.worksheet_account_contract_payable_details import ( PaginatedWorksheetAccountContractPayableDetailsOutputSchema, PayableDetailsBulkFilterParamsPostSchema, ) from payment.utils.authorization import check_access payment_group_payment_account_api = Blueprint( 'payment_group_payment_account_api', __name__, url_prefix='/payment-group-payment-account', ) @payment_group_payment_account_api.route('//', methods=['GET']) @doc( tags=['payment group payment account'], description='Get payment group payment account.', ) @check_access @marshal_with( PaymentGroupPaymentAccountSchema, code=HTTPStatus.OK, description=HTTPStatus.OK.phrase, ) def get_payment_group_payment_account(object_id: int): """Get a payment_group_payment_account by id.""" return logic.get_payment_group_payment_account(object_id), HTTPStatus.OK @payment_group_payment_account_api.route('//', methods=['PUT']) @doc( tags=['payment group payment account'], description='Update payment group payment account.', ) @check_access @use_kwargs(PaymentGroupPaymentAccountPutSchema, location='json') @marshal_with( PaymentGroupPaymentAccountSchema, code=HTTPStatus.CREATED, description=HTTPStatus.CREATED.phrase, ) def update_payment_group_payment_account(object_id: int, **params): """Update a payment_group_payment_account's note.""" return logic.update_payment_group_payment_account( object_id, params.get('note') ), HTTPStatus.CREATED @payment_group_payment_account_api.route('//', methods=['DELETE']) @doc( tags=['payment group payment account'], description='Delete payment group payment account.', ) @check_access @marshal_with(None, code=HTTPStatus.NO_CONTENT, apply=False) def delete_payment_group_payment_account(object_id: int): """Soft delete a payment_group_payment_account.""" logic.delete_payment_group_payment_account(object_id) return None, HTTPStatus.NO_CONTENT # DEPRECATED and will be removed, please use POST::/last-payment/bulk @payment_group_payment_account_api.route( '/last-payment/', methods=['GET'] ) @doc( deprecated=True, description='This endpoint is deprecated and will be removed. Please use POST::/last-payment/bulk instead.', ) @check_access @marshal_with( PaymentGroupPaymentAccountSchema, code=HTTPStatus.OK, description=HTTPStatus.OK.phrase, ) def get_last_posted_payment_by_account(account_id): """Handle getting an account's last posted payment.""" return logic.get_last_posted_payment_by_account(account_id), HTTPStatus.OK @payment_group_payment_account_api.route( '/pending-payment/', methods=['GET'] ) @check_access( constants.PERMISSIONS_RESOURCES.ACCOUNT, constants.PERMISSIONS_ACTIONS.VIEW_PENDING_PAYMENT, resource_id_param='account_id', tenant_type=constants.PERMISSIONS_TENANT_TYPES.ACCOUNT, ) @marshal_with( PaymentGroupPaymentAccountSchema, code=HTTPStatus.OK, description=HTTPStatus.OK.phrase, ) def get_pending_payment_by_account(account_id): """Handle getting an account's pending payments.""" return logic.get_pending_payment_by_account(account_id), HTTPStatus.OK @payment_group_payment_account_api.route( f'//' f'/credit' ) @doc( tags=['payment group payment account'], description='Get credit data for payment group payment account ' 'for "wht", "vat" or "payment" payment_type.', ) @check_access @marshal_with( PaymentDebitCreditDataEntrySchema(many=True), code=HTTPStatus.OK, description=HTTPStatus.OK.phrase, ) @marshal_with( None, code=HTTPStatus.BAD_REQUEST, description=HTTPStatus.BAD_REQUEST.phrase, apply=False, ) def get_payment_group_payment_account_credit_data( payment_group_payment_account_id: int, payment_type: str ): """Get credit data.""" return logic.get_credit_data( payment_group_payment_account_id, payment_type ), HTTPStatus.OK @payment_group_payment_account_api.route( '/last-payment/bulk', methods=['POST'], ) @doc( tags=['payment group payment account'], description='Get list of last payment group payments by account_ids and payment_statuses.', # noqa: E501 ) @check_access @use_kwargs(PaginationSchema, location='query') @use_kwargs(LastPaymentBulkFilterParamsPostSchema, location='json') @marshal_with( PaymentGroupPaymentAccountListResponseSchema, code=HTTPStatus.OK, description=HTTPStatus.OK.phrase, ) def get_paginated_list_of_last_payment_by_filters( filters: dict, limit: Optional[int] = constants.DEFAULT_PAGE_LIMIT, offset: Optional[int] = constants.DEFAULT_PAGE_OFFSET, ) -> Tuple[dict, int] | Response: """List endpoint to get last payments by filters.""" last_payment_list = logic.get_last_payments( limit=limit, offset=offset, **filters, ) return last_payment_list, HTTPStatus.OK @payment_group_payment_account_api.route( '/search', methods=['POST'], ) @check_access @use_kwargs(PaginationSchema, location='query') @use_kwargs(PaymentGroupPaymentAccountFilterParamsPostSchema, location='json') @marshal_with( PaymentGroupPaymentAccountListResponseSchema, code=HTTPStatus.OK, description=HTTPStatus.OK.phrase, ) def payments_search( filters: dict | None = None, limit: int | None = constants.DEFAULT_PAGE_LIMIT, offset: int | None = constants.DEFAULT_PAGE_OFFSET, ): """Search payment by criteria.""" results = logic.payments_search(limit=limit, offset=offset, **filters) return results, HTTPStatus.OK @payment_group_payment_account_api.route( '/payable-details/bulk', methods=['POST'], ) @doc( tags=['payment group payment account'], description='Get worksheet account contract payable details by payment_group_payment_account_ids.', ) @check_access @use_kwargs(PaginationSchema, location='query') @use_kwargs(PayableDetailsBulkFilterParamsPostSchema, location='json') @marshal_with( PaginatedWorksheetAccountContractPayableDetailsOutputSchema, code=HTTPStatus.OK, description=HTTPStatus.OK.phrase, ) def get_payable_details_bulk( filters: dict, limit: Optional[int] = constants.DEFAULT_PAGE_LIMIT, offset: Optional[int] = constants.DEFAULT_PAGE_OFFSET, ) -> Tuple[dict, int]: """Get worksheet account contract payable details by payment_group_payment_account_ids.""" payment_group_payment_account_ids = filters.get( 'payment_group_payment_account_ids', [] ) payable_detail_type_ids = filters.get('payable_detail_type_ids') results = payable_details_logic.get_by_payment_group_payment_account_ids( payment_group_payment_account_ids=payment_group_payment_account_ids, payable_detail_type_ids=payable_detail_type_ids, limit=limit, offset=offset, ) return results, HTTPStatus.OK