27 lines
938 B
Python
27 lines
938 B
Python
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)
|