mirror of
https://github.com/maybe-finance/maybe.git
synced 2025-08-02 03:55:20 +02:00
* Balance reconcilations with new components * Fix materializer and test assumptions * Fix investment valuation calculations and recon display * Lint fixes * Balance series uses new component fields
72 lines
2.6 KiB
Ruby
72 lines
2.6 KiB
Ruby
module BalanceTestHelper
|
|
def create_balance(account:, date:, balance:, cash_balance: nil, **attributes)
|
|
# If cash_balance is not provided, default to entire balance being cash
|
|
cash_balance ||= balance
|
|
|
|
# Calculate non-cash balance
|
|
non_cash_balance = balance - cash_balance
|
|
|
|
# Set default component values that will generate the desired end_balance
|
|
# flows_factor should be 1 for assets, -1 for liabilities
|
|
flows_factor = account.classification == "liability" ? -1 : 1
|
|
|
|
defaults = {
|
|
date: date,
|
|
balance: balance,
|
|
cash_balance: cash_balance,
|
|
currency: account.currency,
|
|
start_cash_balance: cash_balance,
|
|
start_non_cash_balance: non_cash_balance,
|
|
cash_inflows: 0,
|
|
cash_outflows: 0,
|
|
non_cash_inflows: 0,
|
|
non_cash_outflows: 0,
|
|
net_market_flows: 0,
|
|
cash_adjustments: 0,
|
|
non_cash_adjustments: 0,
|
|
flows_factor: flows_factor
|
|
}
|
|
|
|
account.balances.create!(defaults.merge(attributes))
|
|
end
|
|
|
|
def create_balance_with_flows(account:, date:, start_balance:, end_balance:,
|
|
cash_portion: 1.0, cash_flow: 0, non_cash_flow: 0,
|
|
market_flow: 0, **attributes)
|
|
# Calculate cash and non-cash portions
|
|
start_cash = start_balance * cash_portion
|
|
start_non_cash = start_balance * (1 - cash_portion)
|
|
|
|
# Calculate adjustments needed to reach end_balance
|
|
expected_end_cash = start_cash + cash_flow
|
|
expected_end_non_cash = start_non_cash + non_cash_flow + market_flow
|
|
expected_total = expected_end_cash + expected_end_non_cash
|
|
|
|
# Calculate adjustments if end_balance doesn't match expected
|
|
total_adjustment = end_balance - expected_total
|
|
cash_adjustment = cash_portion * total_adjustment
|
|
non_cash_adjustment = (1 - cash_portion) * total_adjustment
|
|
|
|
# flows_factor should be 1 for assets, -1 for liabilities
|
|
flows_factor = account.classification == "liability" ? -1 : 1
|
|
|
|
defaults = {
|
|
date: date,
|
|
balance: end_balance,
|
|
cash_balance: expected_end_cash + cash_adjustment,
|
|
currency: account.currency,
|
|
start_cash_balance: start_cash,
|
|
start_non_cash_balance: start_non_cash,
|
|
cash_inflows: cash_flow > 0 ? cash_flow : 0,
|
|
cash_outflows: cash_flow < 0 ? -cash_flow : 0,
|
|
non_cash_inflows: non_cash_flow > 0 ? non_cash_flow : 0,
|
|
non_cash_outflows: non_cash_flow < 0 ? -non_cash_flow : 0,
|
|
net_market_flows: market_flow,
|
|
cash_adjustments: cash_adjustment,
|
|
non_cash_adjustments: non_cash_adjustment,
|
|
flows_factor: flows_factor
|
|
}
|
|
|
|
account.balances.create!(defaults.merge(attributes))
|
|
end
|
|
end
|