Adding balance to ledger record
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
from sqlalchemy import and_, select
|
from sqlalchemy import and_, select, func
|
||||||
from sqlalchemy.orm import aliased
|
from sqlalchemy.orm import aliased
|
||||||
|
|
||||||
from ledger.schema import TransactionLedgerRead
|
from ledger.schema import TransactionLedgerRead
|
||||||
@@ -10,10 +10,18 @@ class LedgerResource:
|
|||||||
@classmethod
|
@classmethod
|
||||||
def get_ledger(cls, session, account_id):
|
def get_ledger(cls, session, account_id):
|
||||||
split_account = aliased(Split)
|
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,
|
split_account,
|
||||||
and_(Transaction.id == split_account.transaction_id, split_account.account_id == account_id)
|
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()]
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import decimal
|
||||||
|
|
||||||
from pydantic import BaseModel, Field
|
from pydantic import BaseModel, Field
|
||||||
|
|
||||||
from transaction.models import TransactionRead, SplitRead
|
from transaction.models import TransactionRead, SplitRead
|
||||||
@@ -5,3 +7,4 @@ from transaction.models import TransactionRead, SplitRead
|
|||||||
class TransactionLedgerRead(BaseModel):
|
class TransactionLedgerRead(BaseModel):
|
||||||
transaction: TransactionRead = Field()
|
transaction: TransactionRead = Field()
|
||||||
account_split: SplitRead = Field()
|
account_split: SplitRead = Field()
|
||||||
|
balance: decimal.Decimal = Field()
|
||||||
@@ -22,7 +22,7 @@ def prepare_dict(session, entry, iteration):
|
|||||||
result["payee_id"] = None
|
result["payee_id"] = None
|
||||||
result["splits"] = []
|
result["splits"] = []
|
||||||
result["transaction_date"] = entry["start_date"] + timedelta(days=(iteration / 2))
|
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
|
result["id"] = 0
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|||||||
Reference in New Issue
Block a user