from decimal import Decimal from typing import Optional from uuid import UUID, uuid4 from sqlalchemy.orm import aliased from sqlmodel import Field, SQLModel, select, Relationship from pydantic import Field as PydField from account.models import Account from account.schemas import AccountRead from transaction.models import Transaction, Split from payee.models import Payee, PayeeRead class TransactionResource: @classmethod def create(cls, transaction, session): transaction_db = Transaction.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 get_opening_transaction(cls, session, account_id): split_account = aliased(Split) split_equity = aliased(Split) account_filter = aliased(Account) return session.exec(select(Transaction) .join(split_account, split_account.account_id == account_id) .join(split_equity) .join(account_filter, account_filter.id == split_equity.account_id and Account.path == "/Equity/")).first() @classmethod def update(cls, session, transaction_db, transaction_data): transaction_db.sqlmodel_update(Transaction.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()