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
47 lines
1.5 KiB
Ruby
47 lines
1.5 KiB
Ruby
class Account::BalanceUpdater
|
|
def initialize(account, balance:, currency: nil, date: Date.current, notes: nil)
|
|
@account = account
|
|
@balance = balance.to_d
|
|
@currency = currency
|
|
@date = date.to_date
|
|
@notes = notes
|
|
end
|
|
|
|
def update
|
|
return Result.new(success?: true, updated?: false) unless requires_update?
|
|
|
|
Account.transaction do
|
|
if date == Date.current
|
|
account.balance = balance
|
|
account.currency = currency if currency.present?
|
|
account.save!
|
|
end
|
|
|
|
valuation_entry = account.entries.valuations.find_or_initialize_by(date: date) do |entry|
|
|
entry.entryable = Valuation.new(kind: "reconciliation")
|
|
end
|
|
|
|
valuation_entry.amount = balance
|
|
valuation_entry.currency = currency if currency.present?
|
|
valuation_entry.name = Valuation.build_reconciliation_name(account.accountable_type)
|
|
valuation_entry.notes = notes if notes.present?
|
|
valuation_entry.save!
|
|
end
|
|
|
|
account.sync_later
|
|
|
|
Result.new(success?: true, updated?: true)
|
|
rescue => e
|
|
message = Rails.env.development? ? e.message : "Unable to update account values. Please try again."
|
|
Result.new(success?: false, updated?: false, error_message: message)
|
|
end
|
|
|
|
private
|
|
attr_reader :account, :balance, :currency, :date, :notes
|
|
|
|
Result = Struct.new(:success?, :updated?, :error_message)
|
|
|
|
def requires_update?
|
|
date != Date.current || account.balance != balance || account.currency != currency
|
|
end
|
|
end
|