from uuid import UUID, uuid4 from enum import Enum from sqlmodel import Field, SQLModel, select class AccountType(Enum): Asset = "Asset" # < Denotes a generic asset account. Checkings = "Checkings" # < Standard checking account Savings = "Savings" # < Typical savings account Cash = "Cash" # < Denotes a shoe-box or pillowcase stuffed with cash Liability = "Liability" # < Denotes a generic liability account. CreditCard = "CreditCard" # < Credit card accounts Loan = "Loan" # < Loan and mortgage accounts (liability) CertificateDep = "CertificateDep" # < Certificates of Deposit Investment = "Investment" # < Investment account MoneyMarket = "MoneyMarket" # < Money Market Account Currency = "Currency" # < Denotes a currency trading account. AssetLoan = "AssetLoan" # < Denotes a loan (asset of the owner of this object) Stock = "Stock" # < Denotes an security account as sub-account for an investment Equity = "Equity" # < Denotes an equity account e.g. opening/closing balance Income = "Income" # < Denotes an income account Expense = "Expense" # < Denotes an expense account class AccountBase(SQLModel): name: str = Field(index=True) type: AccountType = Field(index=True) class AccountBaseId(AccountBase): id: UUID | None = Field(default_factory=uuid4, primary_key=True) class Account(AccountBaseId, table=True): @classmethod def create(cls, account, session): account_db = cls.model_validate(account) session.add(account_db) session.commit() session.refresh(account_db) return account_db @classmethod def list(cls): return select(Account) @classmethod def get(cls, session, account_id): return session.get(Account, account_id) @classmethod def update(cls, session, account_db, account_data): account_db.sqlmodel_update(account_data) session.add(account_db) session.commit() session.refresh(account_db) return account_db @classmethod def delete(cls, session, account): session.delete(account) session.commit() class AccountRead(AccountBaseId): pass class AccountWrite(AccountBase): pass class AccountCreate(AccountWrite): pass class AccountUpdate(AccountWrite): pass