From 37fe34668faf98f6e9e222c73c9b5213b5e280ea Mon Sep 17 00:00:00 2001 From: padreug Date: Sun, 9 Nov 2025 23:35:36 +0100 Subject: [PATCH] Adjusts balance calculation for user perspective Inverts the sign of Beancount balances to represent the user's perspective, where liabilities are positive and receivables are negative. This change ensures that user balances accurately reflect the amount the castle owes the user (positive) or the amount the user owes the castle (negative). It simplifies the logic by consistently negating the Beancount balance rather than using conditional checks based on account type. --- fava_client.py | 65 ++++++++++++++++++++++---------------------------- 1 file changed, 29 insertions(+), 36 deletions(-) diff --git a/fava_client.py b/fava_client.py index df26f85..4aa7cd2 100644 --- a/fava_client.py +++ b/fava_client.py @@ -220,15 +220,12 @@ class FavaClient: for cost_str, amount in sats_positions.items(): amount_int = int(amount) - # Apply sign based on account type - if "Payable" in account_name: - # Liability: positive = castle owes user - total_sats += amount_int - account_balance["sats"] += amount_int - elif "Receivable" in account_name: - # Asset: positive = user owes castle (subtract from user balance) - total_sats -= amount_int - account_balance["sats"] -= amount_int + # For user balance perspective, negate Beancount balance + # - Payable (Liability): negative in Beancount → positive (castle owes user) + # - Receivable (Asset): positive in Beancount → negative (user owes castle) + adjusted_amount = -amount_int + total_sats += adjusted_amount + account_balance["sats"] += adjusted_amount # Extract fiat amount from cost basis # Format: "100.00 EUR" or "{100.00 EUR}" @@ -243,23 +240,22 @@ class FavaClient: if fiat_currency not in fiat_balances: fiat_balances[fiat_currency] = Decimal(0) - # Apply same sign logic - if "Payable" in account_name: - fiat_balances[fiat_currency] += fiat_amount - elif "Receivable" in account_name: - fiat_balances[fiat_currency] -= fiat_amount + # Apply same sign adjustment to fiat + # Cost basis is always positive, derive sign from amount + if amount_int < 0: + fiat_amount = -fiat_amount + adjusted_fiat = -fiat_amount + fiat_balances[fiat_currency] += adjusted_fiat except (ValueError, IndexError): logger.warning(f"Could not parse cost basis: {cost_str}") elif isinstance(sats_positions, (int, float)): # Simple number (no cost basis) amount_int = int(sats_positions) - if "Payable" in account_name: - total_sats += amount_int - account_balance["sats"] += amount_int - elif "Receivable" in account_name: - total_sats -= amount_int - account_balance["sats"] -= amount_int + # Negate Beancount balance for user perspective + adjusted_amount = -amount_int + total_sats += adjusted_amount + account_balance["sats"] += adjusted_amount accounts.append(account_balance) @@ -338,12 +334,10 @@ class FavaClient: for cost_str, amount in sats_positions.items(): amount_int = int(amount) - if "Payable" in account_name: - user_data[user_id]["balance"] += amount_int - account_info["sats"] += amount_int - elif "Receivable" in account_name: - user_data[user_id]["balance"] -= amount_int - account_info["sats"] -= amount_int + # Negate Beancount balance for user perspective + adjusted_amount = -amount_int + user_data[user_id]["balance"] += adjusted_amount + account_info["sats"] += adjusted_amount # Extract fiat if cost_str and cost_str != "SATS": @@ -357,21 +351,20 @@ class FavaClient: if fiat_currency not in user_data[user_id]["fiat_balances"]: user_data[user_id]["fiat_balances"][fiat_currency] = Decimal(0) - if "Payable" in account_name: - user_data[user_id]["fiat_balances"][fiat_currency] += fiat_amount - elif "Receivable" in account_name: - user_data[user_id]["fiat_balances"][fiat_currency] -= fiat_amount + # Apply sign from amount to fiat + if amount_int < 0: + fiat_amount = -fiat_amount + adjusted_fiat = -fiat_amount + user_data[user_id]["fiat_balances"][fiat_currency] += adjusted_fiat except (ValueError, IndexError): pass elif isinstance(sats_positions, (int, float)): amount_int = int(sats_positions) - if "Payable" in account_name: - user_data[user_id]["balance"] += amount_int - account_info["sats"] += amount_int - elif "Receivable" in account_name: - user_data[user_id]["balance"] -= amount_int - account_info["sats"] -= amount_int + # Negate Beancount balance for user perspective + adjusted_amount = -amount_int + user_data[user_id]["balance"] += adjusted_amount + account_info["sats"] += adjusted_amount user_data[user_id]["accounts"].append(account_info)