From cd325154da1fd7419132c7b4c7b393a5482ba23e Mon Sep 17 00:00:00 2001 From: ewandor Date: Mon, 17 Feb 2025 17:36:38 +0100 Subject: [PATCH] Adding sequence number for transactions and fixtures as well --- api/app/account/account_routes.py | 2 -- api/app/account/resource.py | 2 ++ api/app/initialize_db.py | 2 ++ api/app/transaction/fixtures.py | 36 +++++++++++++++++++++++++++++++ api/app/transaction/models.py | 33 ++-------------------------- api/app/transaction/resource.py | 13 +++++++++-- 6 files changed, 53 insertions(+), 35 deletions(-) create mode 100644 api/app/transaction/fixtures.py diff --git a/api/app/account/account_routes.py b/api/app/account/account_routes.py index 2e797e0..4447c12 100644 --- a/api/app/account/account_routes.py +++ b/api/app/account/account_routes.py @@ -12,8 +12,6 @@ from account.models import Account from account.resource import AccountResource from db import SessionDep -from transaction.models import TransactionRead -from transaction.resource import TransactionResource from user.manager import get_current_user diff --git a/api/app/account/resource.py b/api/app/account/resource.py index 3d12cd3..10e0cbb 100644 --- a/api/app/account/resource.py +++ b/api/app/account/resource.py @@ -7,6 +7,7 @@ from sqlmodel import select from account.models import Account from account.schemas import OpeningTransaction from transaction.models import Split, Transaction +from transaction.resource import TransactionResource class AccountResource: @@ -30,6 +31,7 @@ class AccountResource: equity_account = cls.get_by_path(session, "/Equity/") t = Transaction() t.transaction_date = schema.opening_date + t.sequence = TransactionResource.get_sequence_number(session) split_opening = Split() split_opening.id = 0 split_opening.transaction = t diff --git a/api/app/initialize_db.py b/api/app/initialize_db.py index 7368e8e..861bc76 100644 --- a/api/app/initialize_db.py +++ b/api/app/initialize_db.py @@ -3,6 +3,7 @@ import main from account.resource import AccountResource from account.fixtures import inject_fixtures as account_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 user import create_admin_user @@ -14,3 +15,4 @@ create_admin_user(session) AccountResource.create_equity_account(session) account_inject_fixtures(session) payee_inject_fixtures(session) +transaction_inject_fixtures(session) diff --git a/api/app/transaction/fixtures.py b/api/app/transaction/fixtures.py new file mode 100644 index 0000000..fbd96ab --- /dev/null +++ b/api/app/transaction/fixtures.py @@ -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 + }, +] diff --git a/api/app/transaction/models.py b/api/app/transaction/models.py index e434417..556fa39 100644 --- a/api/app/transaction/models.py +++ b/api/app/transaction/models.py @@ -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") diff --git a/api/app/transaction/resource.py b/api/app/transaction/resource.py index 9e85750..26f0fd5 100644 --- a/api/app/transaction/resource.py +++ b/api/app/transaction/resource.py @@ -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)