1
0
Fork 0
mirror of https://github.com/maybe-finance/maybe.git synced 2025-08-08 15:05:22 +02:00

fix: Various account issues with balances

This commit is contained in:
Cameron Roudebush 2025-05-16 17:16:52 -04:00
parent 175d3dc753
commit 8d22d46420
4 changed files with 45 additions and 18 deletions

View file

@ -13,7 +13,6 @@ class Provider::Registry
end
def get_provider(name)
puts "NAME: #{name}"
send(name)
rescue NoMethodError
raise Error.new("Provider '#{name}' not found in registry")

View file

@ -84,19 +84,27 @@ class Provider::SimpleFin
# For more spec information, see: https://www.simplefin.org/protocol.html#setup-token
#
# @param [str] accountable_type The name of the account type we're looking for.
# @param [int?] trans_start_date A linux epoch of the start date to get transactions of.
# @param [int?] trans_end_date A linux epoch of the end date to get transactions between.
# @param [Boolean] trans_pending If we should include pending transactions. Default is true.
def get_available_accounts(accountable_type, trans_start_date = nil, trans_end_date = nil, trans_pending = true)
# @param [int?] trans_start_date A linux epoch of the start date to get transactions of. Default is based on the config
# @param [int?] trans_end_date A linux epoch of the end date to get transactions between. Default is now.
# @param [Boolean] trans_pending If we should include pending transactions. Default is false as I don't think maybe supports pending.
def get_available_accounts(accountable_type, trans_start_date = nil, trans_end_date = nil, trans_pending = false)
check_rate_limit
endpoint = "/accounts?pending=#{trans_pending}"
if trans_end_date == nil
trans_end_date = Time.now.to_i
end
if trans_start_date == nil
trans_start_date = Provider::SimpleFin.provider_config.look_back_days.days.ago.to_i
end
# Add any parameters we care about
if trans_start_date
endpoint += "&trans_start_date=#{trans_start_date}"
endpoint += "&start-date=#{trans_start_date}"
end
if trans_end_date
endpoint += "&trans_end_date=#{trans_end_date}"
endpoint += "&end-date=#{trans_end_date}"
end
# account_info = send_request_to_sf(endpoint)

View file

@ -19,31 +19,41 @@ class SimpleFinAccount < ApplicationRecord
class << self
# Gets what balance we should use as our account balance
def get_adjusted_balance(sf_account_data)
balance_from_sf = sf_account_data["balance"].to_d
account_type = sf_account_data["type"]
# Adjust balance: liabilities (CreditCard, Loan) should be negative
if [ "CreditCard", "Loan" ].include?(account_type)
balance_from_sf * -1
else
balance_from_sf
end
end
def find_or_create_from_simple_fin_data!(sf_account_data, sfc)
sfc.simple_fin_accounts.find_or_create_by!(external_id: sf_account_data["id"]) do |sfa|
sfa.current_balance = sf_account_data["balance"].to_d
sfa.available_balance = sf_account_data["balance"].to_d
balance = get_adjusted_balance(sf_account_data)
sfa.current_balance = balance
sfa.available_balance = balance
sfa.currency = sf_account_data["currency"]
new_account = sfc.family.accounts.new(
name: sf_account_data["name"],
balance: sf_account_data["balance"].to_d,
balance: 0,
currency: sf_account_data["currency"],
accountable: TYPE_MAPPING[sf_account_data["type"]].new,
subtype: sf_account_data["subtype"],
simple_fin_account: sfa, # Explicitly associate back
last_synced_at: Time.current, # Mark as synced upon creation
# Set cash_balance similar to how Account.create_and_sync might
cash_balance: sf_account_data["balance"].to_d
cash_balance: 0
)
# Add initial valuations
current_balance_amount = new_account.balance
new_account.entries.build(
name: "Current Balance",
date: Date.current,
amount: current_balance_amount,
amount: balance,
currency: new_account.currency,
entryable: Valuation.new
)
@ -72,13 +82,14 @@ class SimpleFinAccount < ApplicationRecord
# Syncs all account data for the given sf_account_data parameter
def sync_account_data!(sf_account_data)
accountable_attributes = { id: self.account.accountable_id }
balance = SimpleFinAccount.get_adjusted_balance(sf_account_data)
self.update!(
current_balance: sf_account_data["balance"].to_d,
current_balance: balance,
available_balance: sf_account_data["available-balance"]&.to_d,
currency: sf_account_data["currency"],
account_attributes: {
id: self.account.id,
balance: sf_account_data["balance"].to_d,
balance: balance,
last_synced_at: Time.current,
accountable_attributes: accountable_attributes
}
@ -159,8 +170,17 @@ class SimpleFinAccount < ApplicationRecord
entry.entryable = Transaction.new
end
entry.entryable.simple_fin_category = transaction_data.dig("extra", "category") if entry.entryable.respond_to?(:simple_fin_category=)
# Auto associate a category to our transaction
if entry.entryable.simple_fin_category.present?
category_name = entry.entryable.simple_fin_category
category = self.account.family.categories.find_or_create_by!(name: category_name)
entry.entryable.category = category
end
if entry.changed? || entry.entryable.changed? # Check if entryable also changed
entry.save!
else

View file

@ -4,7 +4,7 @@
<div class="bg-container p-5 shadow-border-xs rounded-xl" data-controller="focus-record" data-focus-record-id-value="<%= @focused_record ? dom_id(@focused_record) : nil %>">
<div class="flex items-center justify-between mb-4" data-testid="activity-menu">
<%= tag.h2 t(".title"), class: "font-medium text-lg" %>
<% unless @account.plaid_account_id.present? %>
<% unless (@account.plaid_account_id.present? || @account.simple_fin_account.present?) %>
<%= render MenuComponent.new(variant: "button") do |menu| %>
<% menu.with_button(text: "New", variant: "secondary", icon: "plus") %>