1
0
Fork 0
mirror of https://github.com/maybe-finance/maybe.git synced 2025-07-25 08:09:38 +02:00

Preserve original transaction names when enriching (#1556)
Some checks are pending
Publish Docker image / ci (push) Waiting to run
Publish Docker image / Build docker image (push) Blocked by required conditions

* Preserve original transaction name

* Remove stale method

* Fix tests
This commit is contained in:
Zach Gollwitzer 2024-12-19 10:16:09 -05:00 committed by GitHub
parent 68617514b0
commit 7be6a372bf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
22 changed files with 100 additions and 76 deletions

View file

@ -119,7 +119,7 @@ module EntryableResource
def entry_params
params.require(:account_entry).permit(
:account_id, :name, :date, :amount, :currency, :excluded, :notes, :nature,
:account_id, :name, :enriched_name, :date, :amount, :currency, :excluded, :notes, :nature,
entryable_attributes: self.class.permitted_entryable_attributes
)
end

View file

@ -151,6 +151,7 @@ class Account < ApplicationRecord
else
entries.create! \
date: Date.current,
name: "Balance update",
amount: balance,
currency: currency,
entryable: Account::Valuation.new

View file

@ -50,7 +50,7 @@ class Account::DataEnricher
category.save! if category.present?
entry.update!(
enriched_at: Time.current,
name: entry.enriched_at.nil? && info.name ? info.name : entry.name,
enriched_name: info.name,
entryable_attributes: entryable_attributes
)
end

View file

@ -10,7 +10,7 @@ class Account::Entry < ApplicationRecord
delegated_type :entryable, types: Account::Entryable::TYPES, dependent: :destroy
accepts_nested_attributes_for :entryable
validates :date, :amount, :currency, presence: true
validates :date, :name, :amount, :currency, presence: true
validates :date, uniqueness: { scope: [ :account_id, :entryable_type ] }, if: -> { account_valuation? }
validates :date, comparison: { greater_than: -> { min_supported_date } }
@ -47,14 +47,6 @@ class Account::Entry < ApplicationRecord
account.sync_later(start_date: sync_start_date)
end
def inflow?
amount <= 0 && account_transaction?
end
def outflow?
amount > 0 && account_transaction?
end
def entryable_name_short
entryable_type.demodulize.underscore
end
@ -63,6 +55,10 @@ class Account::Entry < ApplicationRecord
Account::BalanceTrendCalculator.new(self, entries, balances).trend
end
def display_name
enriched_name.presence || name
end
class << self
# arbitrary cutoff date to avoid expensive sync operations
def min_supported_date

View file

@ -11,7 +11,8 @@ class Account::Syncer
update_account_info(balances, holdings) unless account.plaid_account_id.present?
convert_records_to_family_currency(balances, holdings) unless account.currency == account.family.currency
if account.family.data_enrichment_enabled?
# Enrich if user opted in or if we're syncing transactions from a Plaid account
if account.family.data_enrichment_enabled? || account.plaid_account_id.present?
account.enrich_data_later
else
Rails.logger.info("Data enrichment is disabled, skipping enrichment for account #{account.id}")

View file

@ -26,11 +26,6 @@ class Account::Trade < ApplicationRecord
qty > 0
end
def name
prefix = sell? ? "Sell " : "Buy "
prefix + "#{qty.abs} shares of #{security.ticker}"
end
def unrealized_gain_loss
return nil if sell?
current_price = security.current_price

View file

@ -31,7 +31,11 @@ class Account::TradeBuilder
end
def build_trade
prefix = type == "sell" ? "Sell " : "Buy "
trade_name = prefix + "#{qty.to_i.abs} shares of #{security.ticker}"
account.entries.new(
name: trade_name,
date: date,
amount: signed_amount,
currency: currency,

View file

@ -48,10 +48,6 @@ class Account::Transaction < ApplicationRecord
end
end
def name
entry.name || (entry.amount.positive? ? "Expense" : "Income")
end
def eod_balance
entry.amount_money
end

View file

@ -33,11 +33,11 @@ class Account::Transfer < ApplicationRecord
end
def inflow_transaction
entries.find { |e| e.inflow? }
entries.find { |e| e.amount.negative? }
end
def outflow_transaction
entries.find { |e| e.outflow? }
entries.find { |e| e.amount.positive? }
end
def update_entries!(params)

View file

@ -10,8 +10,4 @@ class Account::Valuation < ApplicationRecord
false
end
end
def name
"Balance update"
end
end

View file

@ -303,6 +303,7 @@ class Demo::Generator
date: date,
amount: amount,
currency: "USD",
name: "Balance update",
entryable: Account::Valuation.new
end

View file

@ -13,14 +13,14 @@
<div class="max-w-full">
<%= tag.div class: ["flex items-center gap-2"] do %>
<div class="flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-gray-600/5 text-gray-600">
<%= trade.name.first.upcase %>
<%= entry.display_name.first.upcase %>
</div>
<div class="truncate">
<% if entry.new_record? %>
<%= content_tag :p, trade.name %>
<%= content_tag :p, entry.display_name %>
<% else %>
<%= link_to trade.name,
<%= link_to entry.display_name,
account_entry_path(entry),
data: { turbo_frame: "drawer", turbo_prefetch: false },
class: "hover:underline hover:text-gray-800" %>

View file

@ -11,17 +11,17 @@
<div class="max-w-full">
<%= content_tag :div, class: ["flex items-center gap-2"] do %>
<% if entry.account_transaction.merchant&.icon_url %>
<%= image_tag entry.account_transaction.merchant.icon_url, class: "w-6 h-6 rounded-full" %>
<% if transaction.merchant&.icon_url %>
<%= image_tag transaction.merchant.icon_url, class: "w-6 h-6 rounded-full" %>
<% else %>
<%= render "shared/circle_logo", name: transaction.name, size: "sm" %>
<%= render "shared/circle_logo", name: entry.display_name, size: "sm" %>
<% end %>
<div class="truncate">
<% if entry.new_record? %>
<%= content_tag :p, transaction.name %>
<%= content_tag :p, entry.display_name %>
<% else %>
<%= link_to transaction.name,
<%= link_to entry.display_name,
entry.transfer.present? ? account_transfer_path(entry.transfer) : account_entry_path(entry),
data: { turbo_frame: "drawer", turbo_prefetch: false },
class: "hover:underline hover:text-gray-800" %>
@ -41,7 +41,7 @@
<% end %>
<div class="col-span-2">
<%= render "account/transfers/account_logos", transfer: entry.transfer, outflow: entry.outflow? %>
<%= render "account/transfers/account_logos", transfer: entry.transfer, outflow: entry.amount.positive? %>
</div>
<% else %>
<div class="flex items-center gap-1 col-span-2">
@ -65,7 +65,7 @@
<div class="col-span-2 ml-auto">
<%= content_tag :p,
format_money(-entry.amount_money),
class: ["text-green-600": entry.inflow?] %>
class: ["text-green-600": entry.amount.negative?] %>
</div>
<% if balance_trend %>

View file

@ -9,7 +9,8 @@
url: account_transaction_path(@entry),
class: "space-y-2",
data: { controller: "auto-submit-form" } do |f| %>
<%= f.text_field :name,
<%= f.text_field @entry.enriched_at.present? ? :enriched_name : :name,
label: t(".name_label"),
"data-auto-submit-form-target": "auto" %>

View file

@ -8,6 +8,7 @@
<% end %>
<div class="space-y-3">
<%= form.hidden_field :name, value: "Balance update" %>
<%= form.date_field :date, label: true, required: true, value: Date.current, min: Account::Entry.min_supported_date, max: Date.current %>
<%= form.money_field :amount, label: t(".amount"), required: true %>
</div>

View file

@ -18,9 +18,9 @@
<div class="truncate text-gray-900">
<% if entry.new_record? %>
<%= content_tag :p, entry.entryable.name %>
<%= content_tag :p, entry.display_name %>
<% else %>
<%= link_to entry.entryable.name,
<%= link_to entry.display_name,
account_entry_path(entry),
data: { turbo_frame: "drawer", turbo_prefetch: false },
class: "hover:underline hover:text-gray-800" %>