usawa

Signed, immutable accounting.
Log | Files | Refs | Submodules | LICENSE

commit 0b0a955926badc1aea2e1bbb75958fffb27f5c17
parent 81ee3d4f0914110cf75df09a7f02e5977de62e70
Author: lash <dev@holbrook.no>
Date:   Mon, 15 Jun 2026 07:52:31 -0600

Entries can again be saved

Diffstat:
Mdummy/usawa/account.py | 2++
Mdummy/usawa/context.py | 1+
Mdummy/usawa/gui/controllers/entry_controller.py | 1+
Mdummy/usawa/gui/core/entry_service.py | 4++--
Mdummy/usawa/storage/entry_mapper.py | 34+++++++++++++++++++---------------
Mdummy/usawa/storage/ledger_repository.py | 23++++++++++++++++++++++-
6 files changed, 47 insertions(+), 18 deletions(-)

diff --git a/dummy/usawa/account.py b/dummy/usawa/account.py @@ -55,6 +55,8 @@ class Account: path_parser = from_account_path def __init__(self, sym, typ, segments, virt=False): + if isinstance(typ, str): + typ = getattr(AccountType, typ) if not isinstance(typ, AccountType): raise ValueError('invalid account type: ' + typ) self.sym = sym diff --git a/dummy/usawa/context.py b/dummy/usawa/context.py @@ -69,6 +69,7 @@ class UsawaContext: self.ledger_path_out = self.ledger_path_in if self.ledger_path_in != None: self.load_ledger() + self.set('ledger_path', self.ledger_path_in) self.create_store(store_scope=store_scope) self.create_resolver() self.load_accounts() diff --git a/dummy/usawa/gui/controllers/entry_controller.py b/dummy/usawa/gui/controllers/entry_controller.py @@ -37,6 +37,7 @@ class EntryController: return None try: entry = LedgerEntry( + serial=self.next_serial(), external_reference=view.ref_entry.get_text().strip() or None, description=view.desc_entry.get_text().strip() or None, amount=float(view.amount_entry.get_text() or "0"), diff --git a/dummy/usawa/gui/core/entry_service.py b/dummy/usawa/gui/core/entry_service.py @@ -50,8 +50,8 @@ class EntryService: logg.error(f"Unexpected error: {e}", exc_info=True) return False, error_msg - def save_wallet(self, wallet, passphrase): - return self.repository.save_wallet(wallet=wallet, passphrase=passphrase) +# def save_wallet(self, wallet, passphrase): +# return self.repository.save_wallet(wallet=wallet, passphrase=passphrase) def get_all_entries(self): return self.repository.get_all_entries() diff --git a/dummy/usawa/storage/entry_mapper.py b/dummy/usawa/storage/entry_mapper.py @@ -3,6 +3,7 @@ from datetime import datetime, date from usawa.entry import Entry, EntryPart from usawa.ledger import Ledger +from usawa.account import Account from usawa.unit import UnitIndex from ..gui.core.models import LedgerEntry from usawa import Entry, EntryPart @@ -39,7 +40,7 @@ class EntryMapper: ref = domain.transaction_ref if domain.transaction_ref else None entry = Entry( - serial=ledger.serial, + serial=ledger.next_serial(), tx_date=tx_date, parent=parent, description=domain.description or "", @@ -52,23 +53,26 @@ class EntryMapper: ) dest_amount = -source_amount + account = Account(unitindex.default_unit, domain.source_type.lower(), domain.source_path) source_part = EntryPart( - unitindex.default_unit, - domain.source_type.lower(), - domain.source_path, + #unitindex.default_unit, + #domain.source_type.lower(), + #domain.source_path, + account, source_amount, debit=True, ) - entry.add_part(source_part, debit=True) + #entry.add_part(source_part, debit=True) + entry.add_part(source_part) + account = Account(unitindex.default_unit, domain.dest_type.lower(), domain.dest_path) dest_part = EntryPart( - unitindex.default_unit, - domain.dest_type.lower(), - domain.dest_path, + account, dest_amount, debit=False, ) - entry.add_part(dest_part, debit=False) + #entry.add_part(dest_part, debit=False) + entry.add_part(dest_part) return entry @@ -91,9 +95,9 @@ class EntryMapper: dest_path = "" if storage_entry.debit: debit_part = storage_entry.debit[0] - source_unit = debit_part.unit - source_type = debit_part.typ - source_path = debit_part.account + source_unit = debit_part.get_unit() + source_type = debit_part.get_type() + source_path = debit_part.account_path_only() amount = abs(float(debit_part.amount)) else: source_unit = source_type = source_path = "" @@ -101,9 +105,9 @@ class EntryMapper: if storage_entry.credit: credit_part = storage_entry.credit[0] - dest_unit = credit_part.unit - dest_type = credit_part.typ - dest_path = credit_part.account + dest_unit = credit_part.get_unit() + dest_type = credit_part.get_type() + dest_path = credit_part.account_path_only() else: dest_unit = dest_type = dest_path = "" diff --git a/dummy/usawa/storage/ledger_repository.py b/dummy/usawa/storage/ledger_repository.py @@ -44,11 +44,32 @@ class LedgerRepository: self.resolver = ctx.resolver self.wallet = ctx.wallet self.store = ctx.store + self.db = ctx.db self.ledger = ctx.ledger + self.ledger_path = ctx.get('ledger_path') def _init_store(self, write=False) -> tuple[LedgerStore, Ledger, Wallet]: - return self.store, self.ledger, self.wallet + ledger_tree = load(self.ledger_path) + ledger = Ledger.from_tree(ledger_tree) + + if write: + logg.info("init store for write") + self.store = LedgerStore(self.db, ledger) + else: + logg.info("init store for read") + self.store = LedgerStore(self.db, ledger) + + logg.info("wallet ready, pubkey: %s...", self.wallet.pubkey().hex()[:16]) + + ledger.set_wallet(self.wallet) + ledger.acl = ACL.from_wallet(self.wallet) + self.store.load(acl=ledger.acl) + return self.store, ledger, self.wallet + + + #def _init_store(self, write=False) -> tuple[LedgerStore, Ledger, Wallet]: + # return self.store, self.ledger, self.wallet def save(self, domain_entry: LedgerEntry) -> None: