+ if type(entry) is Balance:
+ if is_match_balance(entry) or is_query_balance(entry):
+ match_balance = balance_accounts[entry.account][entry.amount.currency]
+ full_balance = match_balance.total
+ balance_match = None
+ for match in match_balance.matches:
+ if entry == match.entry:
+ balance_match = match
+ break
+ assert balance_match is not None
+ link_balance = balance_match.amount
+
+ bal_dict = entry._asdict()
+ entry.meta["amount"] = entry.amount
+ if "match" in entry.meta:
+ entry.meta["actual"] = link_balance
+ link_balance = entry.meta["actual"]
+ bal_dict["amount"] = amount.add(
+ full_balance,
+ amount.sub(entry.amount, link_balance))
+ entries[i] = Balance(**bal_dict)
+ match_balance.matches.remove(balance_match)
+ if len(match_balance.matches) == 0:
+ del balance_accounts[entry.account][entry.amount.currency]
+ if len(balance_accounts[entry.account]) == 0:
+ del balance_accounts[entry.account]
+ elif entry.account in pad_accounts:
+ # keep track of padding for remaining balances
+ pad_amount = amount.sub(entry.amount, full_balance)
+ match_balance.total = entry.amount
+ for match in match_balance.matches:
+ match.amount = amount.add(match.amount, pad_amount)
+ elif entry.account in pad_accounts and entry.account in balance_accounts:
+ if entry.amount.currency in balance_accounts[entry.account]:
+ balance_accounts[entry.account][entry.amount.currency].total = entry.amount
+ elif type(entry) is Pad and entry.account in balance_accounts:
+ pad_accounts.add(entry.account)
+ elif type(entry) is Transaction and len(balance_accounts) > 0:
+ for post in entry.postings:
+ post_amount = get_weight(post)
+ if post.account in balance_accounts and post_amount.currency in balance_accounts[post.account]:
+ balances = balance_accounts[post.account][post_amount.currency]
+ balances.total = amount.add(balances.total, post_amount)
+ for match in balances.matches: # oops matches/matches() is confusing
+ if match.matches(entry):
+ match.amount = amount.add(match.amount, post_amount)