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

Add Local Development Demo Data (#502)

* Clean up seeds, add development demo data

* Handle liability account display and sync

* Fix tests
This commit is contained in:
Zach Gollwitzer 2024-02-29 16:35:54 -05:00 committed by GitHub
parent dbf575c02a
commit 14641d16de
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 368 additions and 62 deletions

View file

@ -49,12 +49,13 @@ module ApplicationHelper
end
# Styles to use when displaying a change in value
def trend_styles(trend)
def trend_styles(trend, mode: :asset)
puts mode == :liability ? "it is a liability" : "it is an asset"
bg_class, text_class, symbol, icon = case trend.direction
when "up"
[ "bg-green-500/5", "text-green-500", "+", "arrow-up" ]
mode == :liability ? [ "bg-red-500/5", "text-red-500", "+", "arrow-up" ] : [ "bg-green-500/5", "text-green-500", "+", "arrow-up" ]
when "down"
[ "bg-red-500/5", "text-red-500", "-", "arrow-down" ]
mode == :liability ? [ "bg-green-500/5", "text-green-500", "-", "arrow-down" ] : [ "bg-red-500/5", "text-red-500", "-", "arrow-down" ]
when "flat"
[ "bg-gray-500/5", "text-gray-500", "", "minus" ]
else

View file

@ -12,6 +12,21 @@ class Account < ApplicationRecord
delegate :type_name, to: :accountable
before_create :check_currency
def classification
classifications = {
"Account::Depository" => :asset,
"Account::Investment" => :asset,
"Account::Property" => :asset,
"Account::Vehicle" => :asset,
"Account::OtherAsset" => :asset,
"Account::Loan" => :liability,
"Account::Credit" => :liability,
"Account::OtherLiability" => :liability
}
classifications[accountable_type]
end
def balance_series(period)
filtered_balances = balances.in_period(period).order(:date)
return nil if filtered_balances.empty?

View file

@ -11,6 +11,7 @@ class Account::BalanceCalculator
oldest_entry = [ valuations.first, transactions.first ].compact.min_by(&:date)
net_transaction_flows = transactions.sum(&:amount)
net_transaction_flows *= -1 if @account.classification == :liability
implied_start_balance = oldest_entry.is_a?(Valuation) ? oldest_entry.value : @account.balance + net_transaction_flows
prior_balance = implied_start_balance
@ -21,6 +22,7 @@ class Account::BalanceCalculator
current_balance = valuation.value
else
current_day_net_transaction_flows = transactions.select { |t| t.date == date }.sum(&:amount)
current_day_net_transaction_flows *= -1 if @account.classification == :liability
current_balance = prior_balance - current_day_net_transaction_flows
end

View file

@ -21,7 +21,7 @@
<div class="rounded-lg bg-white border-alpha-black-25 shadow-xs">
<%= turbo_frame_tag dom_id(Valuation.new) %>
<%= turbo_frame_tag "valuations_list" do %>
<%= render partial: "accounts/account_valuation_list", locals: { valuation_series: valuation_series } %>
<%= render partial: "accounts/account_valuation_list", locals: { valuation_series: valuation_series, classification: account.classification } %>
<% end %>
</div>
</div>

View file

@ -1,7 +1,7 @@
<%# locals: (valuation_series:) %>
<%# locals: (valuation_series:, classification:) %>
<% valuation_series.with_index do |valuation_item, index| %>
<% valuation, trend = valuation_item.values_at(:value, :trend) %>
<% valuation_styles = trend_styles(valuation_item[:trend]) %>
<% valuation_styles = trend_styles(valuation_item[:trend], mode: classification) %>
<%= turbo_frame_tag dom_id(valuation) do %>
<div class="p-4 flex items-center">
<div class="w-16">

View file

@ -1,5 +1,5 @@
<%= turbo_stream_from @account %>
<% balance_trend_styles = @balance_series.nil? ? {} : trend_styles(@balance_series[:trend]) %>
<% balance_trend_styles = @balance_series.nil? ? {} : trend_styles(@balance_series[:trend], mode: @account.classification) %>
<div class="space-y-4">
<div class="flex justify-between items-center">
<div class="flex items-center gap-3">