from sqlalchemy import and_, select, func from sqlalchemy.orm import aliased from ledger.schema import TransactionLedgerRead from transaction.models import Split, Transaction class LedgerResource: @classmethod def get_ledger(cls, session, account_id): 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 [TransactionLedgerRead(transaction=transaction, account_split=split, balance=balance) for transaction, split, balance in session.exec(stmt).all()]