from sqlalchemy import and_, select, func from sqlalchemy.orm import aliased from transaction.models import Split, Transaction class LedgerResource: @classmethod def get_ledger(cls, account_id, filters): split_account = aliased(Split) split_balance = aliased(Split) transaction_balance = aliased(Transaction) balance_stmt = select(func.sum(split_balance.amount)) \ .join(transaction_balance) \ .where(and_( split_balance.account_id == split_account.account_id, transaction_balance.sequence <= Transaction.sequence) ).scalar_subquery() stmt = select(Transaction,split_account,balance_stmt.label('balance')) \ .join( split_account, and_(Transaction.id == split_account.transaction_id, split_account.account_id == account_id) ) return filters.filter(stmt)