mirror of
https://github.com/maybe-finance/maybe.git
synced 2025-08-08 06:55:21 +02:00
Finish account processor
This commit is contained in:
parent
13b1560438
commit
67e5705905
4 changed files with 83 additions and 10 deletions
|
@ -73,12 +73,6 @@ class Account < ApplicationRecord
|
|||
end
|
||||
end
|
||||
|
||||
def set_name(name)
|
||||
if enrichable?(:name)
|
||||
self.name = name
|
||||
end
|
||||
end
|
||||
|
||||
def institution_domain
|
||||
url_string = plaid_account&.plaid_item&.institution_url
|
||||
return nil unless url_string.present?
|
||||
|
|
|
@ -34,8 +34,12 @@ module Enrichable
|
|||
ActiveRecord::Base.transaction do
|
||||
enrichable_attrs.each do |attr, value|
|
||||
self.send("#{attr}=", value)
|
||||
|
||||
# If it's a new record, this isn't technically an "enrichment". No logging necessary.
|
||||
unless self.new_record?
|
||||
log_enrichment(attribute_name: attr, attribute_value: value, source: source, metadata: metadata)
|
||||
end
|
||||
end
|
||||
|
||||
save
|
||||
end
|
||||
|
|
17
app/models/plaid_account/investment_balance_processor.rb
Normal file
17
app/models/plaid_account/investment_balance_processor.rb
Normal file
|
@ -0,0 +1,17 @@
|
|||
# Plaid Investment balances have a ton of edge cases. This processor is responsible
|
||||
# for deriving "brokerage cash" vs. "total value" based on Plaid's reported balances and holdings.
|
||||
class PlaidAccount::InvestmentBalanceProcessor
|
||||
attr_reader :plaid_account
|
||||
|
||||
def initialize(plaid_account)
|
||||
@plaid_account = plaid_account
|
||||
end
|
||||
|
||||
def balance
|
||||
plaid_account.current_balance || plaid_account.available_balance
|
||||
end
|
||||
|
||||
def cash_balance
|
||||
plaid_account.available_balance || 0
|
||||
end
|
||||
end
|
|
@ -1,6 +1,17 @@
|
|||
class PlaidAccount::Processor
|
||||
attr_reader :plaid_account
|
||||
|
||||
UnknownAccountTypeError = Class.new(StandardError)
|
||||
|
||||
# Plaid Account Types -> Accountable Types
|
||||
TYPE_MAPPING = {
|
||||
"depository" => Depository,
|
||||
"credit" => CreditCard,
|
||||
"loan" => Loan,
|
||||
"investment" => Investment,
|
||||
"other" => OtherAsset
|
||||
}
|
||||
|
||||
def initialize(plaid_account)
|
||||
@plaid_account = plaid_account
|
||||
end
|
||||
|
@ -11,12 +22,59 @@ class PlaidAccount::Processor
|
|||
plaid_account_id: plaid_account.id
|
||||
)
|
||||
|
||||
account.set_name(plaid_account.name)
|
||||
# Name is the only attribute a user can override for Plaid accounts
|
||||
account.enrich_attribute(
|
||||
:name,
|
||||
plaid_account.name,
|
||||
source: "plaid"
|
||||
)
|
||||
|
||||
account.assign_attributes(
|
||||
accountable: accountable,
|
||||
balance: balance,
|
||||
currency: plaid_account.currency,
|
||||
cash_balance: cash_balance
|
||||
)
|
||||
|
||||
account.save!
|
||||
end
|
||||
|
||||
PlaidAccount::TransactionsProcessor.new(plaid_account).process
|
||||
PlaidAccount::InvestmentsProcessor.new(plaid_account).process
|
||||
end
|
||||
|
||||
private
|
||||
def family
|
||||
plaid_account.plaid_item.family
|
||||
end
|
||||
|
||||
def accountable
|
||||
accountable_class = TYPE_MAPPING[plaid_account.plaid_type]
|
||||
|
||||
raise UnknownAccountTypeError, "Unknown account type: #{plaid_account.plaid_type}" unless accountable_class
|
||||
|
||||
accountable_class.new
|
||||
end
|
||||
|
||||
def balance
|
||||
case plaid_account.plaid_type
|
||||
when "investment"
|
||||
investment_balance_processor.balance
|
||||
else
|
||||
plaid_account.current_balance || plaid_account.available_balance
|
||||
end
|
||||
end
|
||||
|
||||
def cash_balance
|
||||
case plaid_account.plaid_type
|
||||
when "investment"
|
||||
investment_balance_processor.cash_balance
|
||||
else
|
||||
plaid_account.available_balance || 0
|
||||
end
|
||||
end
|
||||
|
||||
def investment_balance_processor
|
||||
PlaidAccount::InvestmentBalanceProcessor.new(plaid_account)
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue