diff --git a/api/app/ledger/resource.py b/api/app/ledger/resource.py index 46fc1f7..724c002 100644 --- a/api/app/ledger/resource.py +++ b/api/app/ledger/resource.py @@ -1,4 +1,4 @@ -from sqlalchemy import and_, select +from sqlalchemy import and_, select, func from sqlalchemy.orm import aliased from ledger.schema import TransactionLedgerRead @@ -10,10 +10,18 @@ class LedgerResource: @classmethod def get_ledger(cls, session, account_id): split_account = aliased(Split) + split_balance = aliased(Split) + transaction_balance = aliased(Transaction) - stmt = select(Transaction, split_account).join( + 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) for transaction, split in session.exec(stmt).all()] + return [TransactionLedgerRead(transaction=transaction, account_split=split, balance=balance) for transaction, split, balance in session.exec(stmt).all()] diff --git a/api/app/ledger/schema.py b/api/app/ledger/schema.py index 2c09712..05f6198 100644 --- a/api/app/ledger/schema.py +++ b/api/app/ledger/schema.py @@ -1,7 +1,10 @@ +import decimal + from pydantic import BaseModel, Field from transaction.models import TransactionRead, SplitRead class TransactionLedgerRead(BaseModel): transaction: TransactionRead = Field() - account_split: SplitRead = Field() \ No newline at end of file + account_split: SplitRead = Field() + balance: decimal.Decimal = Field() \ No newline at end of file diff --git a/api/app/transaction/fixtures.py b/api/app/transaction/fixtures.py index fbd96ab..523e953 100644 --- a/api/app/transaction/fixtures.py +++ b/api/app/transaction/fixtures.py @@ -22,7 +22,7 @@ def prepare_dict(session, entry, iteration): result["payee_id"] = None result["splits"] = [] result["transaction_date"] = entry["start_date"] + timedelta(days=(iteration / 2)) - result["amount"] = ["10", "100", "1000"][random.Random().randint(0,2)] + result["amount"] = [10, 100, 1000][random.Random().randint(0,2)] * [1, -1][random.Random().randint(0,1)] result["id"] = 0 return result