Adding sequence number for transactions and fixtures as well
This commit is contained in:
36
api/app/transaction/fixtures.py
Normal file
36
api/app/transaction/fixtures.py
Normal file
@@ -0,0 +1,36 @@
|
||||
import random
|
||||
from datetime import date, timedelta
|
||||
|
||||
from account.resource import AccountResource
|
||||
from transaction.models import TransactionCreate, Split
|
||||
from transaction.resource import TransactionResource
|
||||
|
||||
|
||||
def inject_fixtures(session):
|
||||
for f in fixtures_transaction:
|
||||
for i in range(f["count"]):
|
||||
data = prepare_dict(session, f, i)
|
||||
schema = TransactionCreate(**data)
|
||||
schema.splits.append(Split(**data))
|
||||
TransactionResource.create(session, schema)
|
||||
|
||||
def prepare_dict(session, entry, iteration):
|
||||
account = AccountResource.get_by_path(session, entry['account_path'])
|
||||
result = entry.copy()
|
||||
|
||||
result["account_id"] = account.id
|
||||
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["id"] = 0
|
||||
|
||||
return result
|
||||
|
||||
fixtures_transaction = [
|
||||
{
|
||||
"account_path": "/Accounts/Asset/Current Assets/Checking Account/",
|
||||
"start_date": date(1970, 1, 5),
|
||||
"count": 50
|
||||
},
|
||||
]
|
||||
@@ -3,7 +3,7 @@ from decimal import Decimal
|
||||
from typing import Optional
|
||||
from uuid import UUID, uuid4
|
||||
|
||||
from sqlmodel import Field, SQLModel, select, Relationship
|
||||
from sqlmodel import Field, SQLModel, Relationship
|
||||
from pydantic import Field as PydField
|
||||
|
||||
from account.models import Account
|
||||
@@ -20,36 +20,7 @@ class TransactionBaseId(TransactionBase):
|
||||
|
||||
class Transaction(TransactionBaseId, table=True):
|
||||
splits: list["Split"] = Relationship(back_populates="transaction")
|
||||
|
||||
@classmethod
|
||||
def create(cls, transaction, session):
|
||||
transaction_db = cls.model_validate(transaction)
|
||||
session.add(transaction_db)
|
||||
session.commit()
|
||||
session.refresh(transaction_db)
|
||||
|
||||
return transaction_db
|
||||
|
||||
@classmethod
|
||||
def list(cls):
|
||||
return select(Transaction).join(Split).join(Account)
|
||||
|
||||
@classmethod
|
||||
def get(cls, session, transaction_id):
|
||||
return session.get(Transaction, transaction_id)
|
||||
|
||||
@classmethod
|
||||
def update(cls, session, transaction_db, transaction_data):
|
||||
transaction_db.sqlmodel_update(cls.model_validate(transaction_data))
|
||||
session.add(transaction_db)
|
||||
session.commit()
|
||||
session.refresh(transaction_db)
|
||||
return transaction_db
|
||||
|
||||
@classmethod
|
||||
def delete(cls, session, transaction):
|
||||
session.delete(transaction)
|
||||
session.commit()
|
||||
sequence: Optional[int] = Field(default=None)
|
||||
|
||||
class SplitBase(SQLModel):
|
||||
account_id: UUID = Field(foreign_key="account.id")
|
||||
|
||||
@@ -1,12 +1,21 @@
|
||||
from sqlmodel import select
|
||||
from sqlmodel import select, func
|
||||
|
||||
from account.models import Account
|
||||
from transaction.models import Transaction, Split
|
||||
|
||||
class TransactionResource:
|
||||
@classmethod
|
||||
def create(cls, transaction, session):
|
||||
def get_sequence_number(cls, session):
|
||||
stmt = select(func.max(Transaction.sequence)).select_from(Transaction)
|
||||
|
||||
sequence = session.execute(stmt).first()
|
||||
|
||||
return sequence[0] + 1 if sequence[0] else 1
|
||||
|
||||
@classmethod
|
||||
def create(cls, session, transaction):
|
||||
transaction_db = Transaction.model_validate(transaction)
|
||||
transaction_db.sequence = cls.get_sequence_number(session)
|
||||
session.add(transaction_db)
|
||||
session.commit()
|
||||
session.refresh(transaction_db)
|
||||
|
||||
Reference in New Issue
Block a user