Adding sequence number for transactions and fixtures as well
This commit is contained in:
@@ -12,8 +12,6 @@ from account.models import Account
|
|||||||
from account.resource import AccountResource
|
from account.resource import AccountResource
|
||||||
|
|
||||||
from db import SessionDep
|
from db import SessionDep
|
||||||
from transaction.models import TransactionRead
|
|
||||||
from transaction.resource import TransactionResource
|
|
||||||
from user.manager import get_current_user
|
from user.manager import get_current_user
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ from sqlmodel import select
|
|||||||
from account.models import Account
|
from account.models import Account
|
||||||
from account.schemas import OpeningTransaction
|
from account.schemas import OpeningTransaction
|
||||||
from transaction.models import Split, Transaction
|
from transaction.models import Split, Transaction
|
||||||
|
from transaction.resource import TransactionResource
|
||||||
|
|
||||||
|
|
||||||
class AccountResource:
|
class AccountResource:
|
||||||
@@ -30,6 +31,7 @@ class AccountResource:
|
|||||||
equity_account = cls.get_by_path(session, "/Equity/")
|
equity_account = cls.get_by_path(session, "/Equity/")
|
||||||
t = Transaction()
|
t = Transaction()
|
||||||
t.transaction_date = schema.opening_date
|
t.transaction_date = schema.opening_date
|
||||||
|
t.sequence = TransactionResource.get_sequence_number(session)
|
||||||
split_opening = Split()
|
split_opening = Split()
|
||||||
split_opening.id = 0
|
split_opening.id = 0
|
||||||
split_opening.transaction = t
|
split_opening.transaction = t
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import main
|
|||||||
from account.resource import AccountResource
|
from account.resource import AccountResource
|
||||||
from account.fixtures import inject_fixtures as account_inject_fixtures
|
from account.fixtures import inject_fixtures as account_inject_fixtures
|
||||||
from payee.fixtures import inject_fixtures as payee_inject_fixtures
|
from payee.fixtures import inject_fixtures as payee_inject_fixtures
|
||||||
|
from transaction.fixtures import inject_fixtures as transaction_inject_fixtures
|
||||||
from db import create_db_and_tables, get_session, drop_tables
|
from db import create_db_and_tables, get_session, drop_tables
|
||||||
from user import create_admin_user
|
from user import create_admin_user
|
||||||
|
|
||||||
@@ -14,3 +15,4 @@ create_admin_user(session)
|
|||||||
AccountResource.create_equity_account(session)
|
AccountResource.create_equity_account(session)
|
||||||
account_inject_fixtures(session)
|
account_inject_fixtures(session)
|
||||||
payee_inject_fixtures(session)
|
payee_inject_fixtures(session)
|
||||||
|
transaction_inject_fixtures(session)
|
||||||
|
|||||||
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 typing import Optional
|
||||||
from uuid import UUID, uuid4
|
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 pydantic import Field as PydField
|
||||||
|
|
||||||
from account.models import Account
|
from account.models import Account
|
||||||
@@ -20,36 +20,7 @@ class TransactionBaseId(TransactionBase):
|
|||||||
|
|
||||||
class Transaction(TransactionBaseId, table=True):
|
class Transaction(TransactionBaseId, table=True):
|
||||||
splits: list["Split"] = Relationship(back_populates="transaction")
|
splits: list["Split"] = Relationship(back_populates="transaction")
|
||||||
|
sequence: Optional[int] = Field(default=None)
|
||||||
@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()
|
|
||||||
|
|
||||||
class SplitBase(SQLModel):
|
class SplitBase(SQLModel):
|
||||||
account_id: UUID = Field(foreign_key="account.id")
|
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 account.models import Account
|
||||||
from transaction.models import Transaction, Split
|
from transaction.models import Transaction, Split
|
||||||
|
|
||||||
class TransactionResource:
|
class TransactionResource:
|
||||||
@classmethod
|
@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 = Transaction.model_validate(transaction)
|
||||||
|
transaction_db.sequence = cls.get_sequence_number(session)
|
||||||
session.add(transaction_db)
|
session.add(transaction_db)
|
||||||
session.commit()
|
session.commit()
|
||||||
session.refresh(transaction_db)
|
session.refresh(transaction_db)
|
||||||
|
|||||||
Reference in New Issue
Block a user