mirror of
https://github.com/maybe-finance/maybe.git
synced 2025-07-18 20:59:39 +02:00
* Add kind field to valuation * Fix schema conflict * Add kind to valuation * Scaffold opening balance manager * Opening balance manager implementation * Update account import to use opening balance manager + tests * Update account to use opening balance manager * Fix test assertions, usage of current balance manager * Lint fixes * Add Opening Balance manager, add tests to forward calculator * Add credit card to "all cash" designation * Simplify valuation model * Add current balance manager with tests * Add current balance logic to reverse calculator and plaid sync * Tweaks to initial calc logic * Ledger testing helper, tweak assertions for reverse calculator * Update test assertions * Extract balance transformer, simplify calculators * Algo simplifications * Final tweaks to calculators * Cleanup * Fix error, propagate sync errors up to parent * Update migration script, valuation naming
30 lines
1.1 KiB
Ruby
30 lines
1.1 KiB
Ruby
# The current system calculates a single, end-of-day balance every day for each account for simplicity.
|
|
# In most cases, this is sufficient. However, for the "Activity View", we need to show intraday balances
|
|
# to show users how each entry affects their balances. This class calculates intraday balances by
|
|
# interpolating between end-of-day balances.
|
|
class Balance::TrendCalculator
|
|
BalanceTrend = Struct.new(:trend, :cash, keyword_init: true)
|
|
|
|
def initialize(balances)
|
|
@balances = balances
|
|
end
|
|
|
|
def trend_for(date)
|
|
balance = @balances.find { |b| b.date == date }
|
|
prior_balance = @balances.find { |b| b.date == date - 1.day }
|
|
|
|
return BalanceTrend.new(trend: nil) unless balance.present?
|
|
|
|
BalanceTrend.new(
|
|
trend: Trend.new(
|
|
current: Money.new(balance.balance, balance.currency),
|
|
previous: prior_balance.present? ? Money.new(prior_balance.balance, balance.currency) : nil,
|
|
favorable_direction: balance.account.favorable_direction
|
|
),
|
|
cash: Money.new(balance.cash_balance, balance.currency),
|
|
)
|
|
end
|
|
|
|
private
|
|
attr_reader :balances
|
|
end
|