Skip to content

Commit

Permalink
fix: Add relationship on transactions object for transfer and add a t…
Browse files Browse the repository at this point in the history
…est.
  • Loading branch information
bvanelli committed Jan 29, 2025
1 parent a6a0092 commit 81ec7b0
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 2 deletions.
13 changes: 11 additions & 2 deletions actual/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -635,7 +635,9 @@ class Transactions(BaseModel, table=True):
default=None,
sa_column=Column("starting_balance_flag", Integer, server_default=text("0")),
)
transferred_id: Optional[str] = Field(default=None, sa_column=Column("transferred_id", Text))
transferred_id: Optional[str] = Field(
default=None, sa_column=Column("transferred_id", Text, ForeignKey("transactions.id"))
)
sort_order: Optional[float] = Field(default=None, sa_column=Column("sort_order", Float))
tombstone: Optional[int] = Field(default=None, sa_column=Column("tombstone", Integer, server_default=text("0")))
cleared: Optional[int] = Field(default=None, sa_column=Column("cleared", Integer, server_default=text("1")))
Expand All @@ -662,7 +664,8 @@ class Transactions(BaseModel, table=True):
},
)
parent: Optional["Transactions"] = Relationship(
back_populates="splits", sa_relationship_kwargs={"remote_side": "Transactions.id"}
back_populates="splits",
sa_relationship_kwargs={"remote_side": "Transactions.id", "foreign_keys": "Transactions.parent_id"},
)
splits: List["Transactions"] = Relationship(
back_populates="parent",
Expand All @@ -671,6 +674,12 @@ class Transactions(BaseModel, table=True):
"order_by": "remote(Transactions.sort_order.desc())",
},
)
transfer: Optional["Transactions"] = Relationship(
sa_relationship_kwargs={
"primaryjoin": "and_(Transactions.transferred_id == remote(Transactions.id), remote(Transactions.tombstone)==0)",
"foreign_keys": "Transactions.transferred_id",
}
)

def get_date(self) -> datetime.date:
"""Returns the transaction date as a datetime.date object, instead of as a string."""
Expand Down
26 changes: 26 additions & 0 deletions tests/test_database.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
get_transactions,
normalize_payee,
reconcile_transaction,
set_transaction_payee,
)
from actual.rules import Action, Condition, ConditionType, Rule

Expand Down Expand Up @@ -323,3 +324,28 @@ def test_get_preferences(session):
new_preferences = get_preferences(session)
assert len(new_preferences) == 1
assert new_preferences[0].value == "foobar"


def test_set_payee_to_transfer(session):
wallet = create_account(session, "Wallet")
bank = create_account(session, "Bank")
session.commit()
# Create a transaction setting the payee
t = create_transaction(session, date.today(), bank, wallet.payee, amount=-50)
session.commit()
transactions = get_transactions(session)
assert len(transactions) == 2
assert transactions[0].get_amount() == -transactions[1].get_amount()
assert transactions[0].transferred_id == transactions[1].id
assert transactions[1].transferred_id == transactions[0].id
# Set this payee to something else, transaction should be deleted
set_transaction_payee(session, t, None)
session.commit()
assert len(get_transactions(session)) == 1
assert t.payee_id is None
assert t.transferred_id is None
# Set payee_id back, transaction should be recreated
set_transaction_payee(session, t, wallet.payee.id)
session.commit()
assert t.payee_id == wallet.payee.id
assert t.transfer.transfer == t

0 comments on commit 81ec7b0

Please sign in to comment.