54 lines
1.7 KiB
Python
54 lines
1.7 KiB
Python
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()
|