Files
sure/app/models/lunchflow_account/processor.rb
soky srm e8f935bc6f Remove plaid initialiser (#317)
* Remove plaid initialiser

The initializer can be safely removed because:
  - Config is lazily loaded via Provider::Registry
  - reload_configuration is called after settings updates
  - All calling code handles nil configs gracefully
  - Initial nil state is fine - config loads on first use

* Fix for missing config

* Actually don't pollute application.rb

* Add currency loading for balances

* Fix race condition on lazy load

* Allow loans to be imported in lunch flow also

* Fix currency processor
2025-11-12 16:01:19 +01:00

74 lines
2.3 KiB
Ruby

class LunchflowAccount::Processor
include CurrencyNormalizable
attr_reader :lunchflow_account
def initialize(lunchflow_account)
@lunchflow_account = lunchflow_account
end
def process
unless lunchflow_account.current_account.present?
Rails.logger.info "LunchflowAccount::Processor - No linked account for lunchflow_account #{lunchflow_account.id}, skipping processing"
return
end
Rails.logger.info "LunchflowAccount::Processor - Processing lunchflow_account #{lunchflow_account.id} (account #{lunchflow_account.account_id})"
begin
process_account!
rescue StandardError => e
Rails.logger.error "LunchflowAccount::Processor - Failed to process account #{lunchflow_account.id}: #{e.message}"
Rails.logger.error "Backtrace: #{e.backtrace.join("\n")}"
report_exception(e, "account")
raise
end
process_transactions
end
private
def process_account!
if lunchflow_account.current_account.blank?
Rails.logger.error("Lunchflow account #{lunchflow_account.id} has no associated Account")
return
end
# Update account balance from latest Lunchflow data
account = lunchflow_account.current_account
balance = lunchflow_account.current_balance || 0
# For liability accounts (credit cards and loans), ensure positive balances
# LunchFlow may return negative values for liabilities, but Sure expects positive
if account.accountable_type == "CreditCard" || account.accountable_type == "Loan"
balance = balance.abs
end
# Normalize currency with fallback chain: parsed lunchflow currency -> existing account currency -> USD
currency = parse_currency(lunchflow_account.currency) || account.currency || "USD"
# Update account balance
account.update!(
balance: balance,
cash_balance: balance,
currency: currency
)
end
def process_transactions
LunchflowAccount::Transactions::Processor.new(lunchflow_account).process
rescue => e
report_exception(e, "transactions")
end
def report_exception(error, context)
Sentry.capture_exception(error) do |scope|
scope.set_tags(
lunchflow_account_id: lunchflow_account.id,
context: context
)
end
end
end