"""Blueprint for Ledger Accounting Run Balance API.""" import simplejson as json from abacus_common_logic.views.list_view import ListView from flask import Blueprint, request from owsrequest import flask_request from owsresponse import response from owsresponse.adaptors.flask import flaskify from ledger.constants.error import ERROR_CODE_AUTHORIZATION from ledger.logic.ledger_accounting_run_balance import ( bulk_create, get_ledger_acc_run_balance_by_period_id, get_ledger_accounting_run_balances, get_ledger_accounting_run_balances_contract_count_dataloader, ) from ledger.models.ledger_accounting_run_balance import LedgerAccountingRunBalance from ledger.schemas.ledger_accounting_run_balance import ( LedgerAccountingRunBalanceContractCountSchema, LedgerAccountingRunBalanceDetailSchema, ) ledger_accounting_run_balance_api = Blueprint( 'ledger_accounting_run_balance_api', __name__, url_prefix='/ledger-accounting-run-balance', ) @ledger_accounting_run_balance_api.route( '//bulk', methods=['POST'] ) def bulk_create_ledger_accounting_run_balance_entries(accounting_run_id): """POST one or more ledger_accounting_run_balance records.""" access_rule_decision = flask_request.verify_rules_access_standalone(request) if not access_rule_decision: return flaskify( response.create_error_response( code=ERROR_CODE_AUTHORIZATION, message='Unauthorized', status=403, ) ) parsed_body = json.loads(request.data.decode(), use_decimal=True) return flaskify(bulk_create(accounting_run_id, parsed_body)) class LedgerAccountingRunBalanceListView(ListView): """GET ledger_accounting_run_balance list.""" model_class = LedgerAccountingRunBalance object_detail_schema = LedgerAccountingRunBalanceDetailSchema() def get(self, accounting_run_id): """Retrieve ledger_accounting_run_balance list.""" access_rule_decision = flask_request.verify_rules_access_standalone(request) if not access_rule_decision: return flaskify( response.create_error_response( code=ERROR_CODE_AUTHORIZATION, message='Unauthorized', status=403, ) ) params = request.args return flaskify(get_ledger_accounting_run_balances(accounting_run_id, params)) class LedgerAccountingRunBalanceContractCountDataloader(ListView): """POST ledger_accounting_run_balance contract count dataloaded.""" model_class = LedgerAccountingRunBalance object_detail_schema = LedgerAccountingRunBalanceContractCountSchema() def post(self): """Retrieve ledger_accounting_run_balance contract count dataloaded.""" access_rule_decision = flask_request.verify_rules_access_standalone(request) if not access_rule_decision: return flaskify( response.create_error_response( code=ERROR_CODE_AUTHORIZATION, message='Unauthorized', status=403, ) ) accounting_run_ids = request.get_json() return flaskify( get_ledger_accounting_run_balances_contract_count_dataloader( accounting_run_ids ) ) ledger_accounting_run_balance_api.add_url_rule( '/', methods=['GET'], view_func=LedgerAccountingRunBalanceListView.as_view( 'get_ledger_accounting_run_balance_list' ), ) ledger_accounting_run_balance_api.add_url_rule( '/contract-count/dataloader', methods=['POST'], view_func=LedgerAccountingRunBalanceContractCountDataloader.as_view( 'get_ledger_accounting_run_balance_contract_count_dataloader' ), ) @ledger_accounting_run_balance_api.route( '/accounting-period//vat-category/', methods=['GET'], ) def get_ledger_acc_run_balance_by_acc_period_id(accounting_period_id, vat_category): """GET list of ledger accounting run balance for a specific accounting_period.""" access_rule_decision = flask_request.verify_rules_access_standalone(request) if not access_rule_decision: return flaskify( response.create_error_response( code=ERROR_CODE_AUTHORIZATION, message='Unauthorized', status=403, ) ) return flaskify( get_ledger_acc_run_balance_by_period_id( accounting_period_id, vat_category, request.args ) )