"""Account statements Handler.""" from fastapi import APIRouter from moneyhub.logic import account_statement_period as account_statement_period_logic from moneyhub.logic import advances as advances_logic from moneyhub.logic import ledger_adjustment as adjustment_logic from moneyhub.logic import statement_attachment as attachments_logic from moneyhub.logic import statement_reserves as reserves_logic from moneyhub.schemas.account_statement_period import AccountPaymentDetailStatusSchema from moneyhub.schemas.account_statement_period import AccountStatementPeriodBalanceSchema from moneyhub.schemas.account_statement_period import AccountStatementPeriodPaymentDetailSchema from moneyhub.schemas.account_statement_period import AccountStatementPeriodVatDetailSchema from moneyhub.schemas.account_statements import AccountStatementsDataloaderSchema from moneyhub.schemas.account_statements import AccountStatementsReservesSchema from moneyhub.schemas.account_statements import FlowthroughPayableBalanceSchema from moneyhub.schemas.account_statements import PaymentAllocationDetailSchema from moneyhub.schemas.advance import AdvanceSchema from moneyhub.schemas.ledger_adjustment import LedgerAdjustmentAppliedSchema from moneyhub.schemas.ledger_adjustment import LedgerAdjustmentExpenseSchema from moneyhub.schemas.statement_attachment import StatementAttachmentDetailSchema from moneyhub.utils.request import extract_json_body account_statements_router = APIRouter(prefix='/account-statements', tags=['account_statements']) @account_statements_router.post( '/dataloader/account/{account_id}/ledger-adjustments', status_code=200 ) def load_adjustments_by_account_and_statement_periods( account_id: int, payload: AccountStatementsDataloaderSchema, ) -> list[LedgerAdjustmentAppliedSchema]: """Dataload ledger adjustments for a specified account. Args: payload (AccountStatementsDataloaderSchema): JSON body payload Returns: list: list of ledger adjustments """ body = extract_json_body(payload) return adjustment_logic.get_adjustments_by_account_and_statement_periods( account_id, body.get('contract_id'), body['statement_period_ids'] ) @account_statements_router.post( '/dataloader/account/{account_id}/reserves', status_code=200 ) def load_reserves_by_account_and_statement_periods( account_id: int, payload: AccountStatementsDataloaderSchema ) -> list[AccountStatementsReservesSchema]: """Dataload physical reserves for a specified account. Args: payload (AccountStatementsDataloaderSchema): JSON body payload Returns: list: list of physical reserves """ body = extract_json_body(payload) return reserves_logic.get_statement_reserves_by_statement_periods( account_id, body.get('contract_id'), body['statement_period_ids'] ) @account_statements_router.post( '/dataloader/account/{account_id}/statement-attachments', status_code=200 ) def load_statement_attachments_by_account_and_statement_periods( account_id: int, payload: AccountStatementsDataloaderSchema ) -> list[StatementAttachmentDetailSchema]: """Dataload statement attachments for a specified account. Args: account_id (int): The id of an account payload (AccountStatementsDataloaderSchema): JSON body payload Returns: list: list of statement attachments """ body = extract_json_body(payload) return attachments_logic.get_statement_attachments_by_account_and_statement_periods( account_id, body['statement_period_ids'], body.get('contract_id') ) @account_statements_router.post( '/dataloader/account/{account_id}/payments', status_code=200 ) def load_payments_by_account_and_statement_periods( account_id: int, payload: AccountStatementsDataloaderSchema ) -> list[AccountStatementPeriodPaymentDetailSchema]: """Dataload payments for a specified account. Args: payload (AccountStatementsDataloaderSchema): JSON body payload Returns: list: list of payments """ body = extract_json_body(payload) return account_statement_period_logic.get_payments_by_account_and_statement_periods( account_id, body.get('contract_id'), body['statement_period_ids'] ) @account_statements_router.post( '/dataloader/account/{account_id}/payment-allocations', status_code=200 ) def load_payment_allocation_details( account_id: int, payload: AccountStatementsDataloaderSchema ) -> list[PaymentAllocationDetailSchema]: """Dataload payment allocations for a specified contract. Args: account_id (int): The id of the account payload (AccountStatementsDataloaderSchema): JSON body payload Returns: list: list of payments """ return account_statement_period_logic.get_payment_allocation_details( account_id, payload.contract_id, payload.statement_period_ids ) @account_statements_router.post( '/dataloader/account/{account_id}/payment-details', status_code=200 ) def load_payment_details_by_account_and_statement_periods( account_id: int, payload: AccountStatementsDataloaderSchema ) -> list[AccountPaymentDetailStatusSchema]: """Dataload payment details for a specified account and statement period. Args: account_id (int): The id of the account payload (AccountStatementsDataloaderSchema): JSON body payload Returns: list: list of payments """ body = extract_json_body(payload) return account_statement_period_logic.get_payments_details_by_account_and_statement_periods( account_id, body.get('contract_id'), body['statement_period_ids'] ) @account_statements_router.post( '/dataloader/account/{account_id}/expenses', status_code=200 ) def load_expenses_by_account_and_statement_periods( account_id: int, payload: AccountStatementsDataloaderSchema ) -> list[LedgerAdjustmentExpenseSchema]: """Dataload expenses for a specified account. Args: account_id (int): The id of an account payload (AccountStatementsDataloaderSchema): JSON body payload Returns: list: list of expenses """ body = extract_json_body(payload) return adjustment_logic.get_expenses_by_account_and_statement_periods( account_id, body['statement_period_ids'], body.get('contract_id') ) @account_statements_router.post( '/dataloader/account/{account_id}/balance', status_code=200 ) def load_balances_by_account_and_statement_periods( account_id: int, payload: AccountStatementsDataloaderSchema ) -> list[AccountStatementPeriodBalanceSchema] | None: """Dataload balances for a specified account. Args: account_id (int): The id of an account payload (AccountStatementsDataloaderSchema): JSON body payload Returns: list: list of balances """ body = extract_json_body(payload) return account_statement_period_logic.get_balance_by_account_statement_periods( account_id, body['statement_period_ids'], body.get('contract_id') ) @account_statements_router.post( '/dataloader/account/{account_id}/applied-advances', status_code=200 ) def load_advances_by_account_and_statement_periods( account_id: int, payload: AccountStatementsDataloaderSchema ) -> list[AdvanceSchema]: """Dataload applied advances for a specified account. Args: account_id (int): The id of an account payload (AccountStatementsDataloaderSchema): JSON body payload Returns: list: list of balances """ body = extract_json_body(payload) return advances_logic.get_by_account_and_statement_periods( account_id, body['statement_period_ids'], body.get('contract_id') ) @account_statements_router.post( '/dataloader/account/{account_id}/vat', status_code=200 ) def load_vat_by_account_and_statement_periods( account_id: int, payload: AccountStatementsDataloaderSchema ) -> list[AccountStatementPeriodVatDetailSchema]: """Dataload VAT specified account. Args: account_id (int): The id of an account payload (AccountStatementsDataloaderSchema): JSON body payload Returns: list: list of VAT entries """ body = extract_json_body(payload) return account_statement_period_logic.get_vat_by_account_and_statement_periods( account_id, body.get('contract_id'), body['statement_period_ids'] ) @account_statements_router.post( '/dataloader/account/{account_id}/flowthrough-balances', status_code=200 ) def load_flowthrough_payable_balances( account_id: int, payload: AccountStatementsDataloaderSchema ) -> list[FlowthroughPayableBalanceSchema]: """Dataload flowthrough balance for an account, contract, and statement periods. Args: account_id (int): ID of the account payload (FlowthroughPayableBalanceSchema): JSON body payload Returns: list: list of flowthrough balances """ if not payload.contract_id or not payload.statement_period_ids: return [] return account_statement_period_logic.get_flowthrough_payable_balances( [payload.contract_id], payload.statement_period_ids )