mirror of
https://github.com/maybe-finance/maybe.git
synced 2025-07-21 14:19:39 +02:00
87 lines
3.6 KiB
Ruby
87 lines
3.6 KiB
Ruby
module AccountsHelper
|
|
def period_label(period)
|
|
return "since account creation" if period.date_range.begin.nil?
|
|
start_date, end_date = period.date_range.first, period.date_range.last
|
|
|
|
return "Starting from #{start_date.strftime('%b %d, %Y')}" if end_date.nil?
|
|
return "Ending at #{end_date.strftime('%b %d, %Y')}" if start_date.nil?
|
|
|
|
days_apart = (end_date - start_date).to_i
|
|
|
|
# Handle specific cases
|
|
if start_date == Date.current.beginning_of_week && end_date == Date.current
|
|
return "Current Week to Date (CWD)"
|
|
elsif start_date == Date.current.beginning_of_month && end_date == Date.current
|
|
return "Current Month to Date (MTD)"
|
|
elsif start_date == Date.current.beginning_of_quarter && end_date == Date.current
|
|
return "Current Quarter to Date (CQD)"
|
|
elsif start_date == Date.current.beginning_of_year && end_date == Date.current
|
|
return "Current Year to Date (YTD)"
|
|
end
|
|
|
|
# Default cases
|
|
case days_apart
|
|
when 1
|
|
"vs. yesterday"
|
|
when 7
|
|
"vs. last week"
|
|
when 30, 31
|
|
"vs. last month"
|
|
when 90
|
|
"vs. last 3 months"
|
|
when 365, 366
|
|
"vs. last year"
|
|
else
|
|
"from #{start_date.strftime('%b %d, %Y')} to #{end_date.strftime('%b %d, %Y')}"
|
|
end
|
|
end
|
|
|
|
def summary_card(title:, &block)
|
|
content = capture(&block)
|
|
render "accounts/summary_card", title: title, content: content
|
|
end
|
|
|
|
def to_accountable_title(accountable)
|
|
accountable.model_name.human
|
|
end
|
|
|
|
def accountable_text_class(accountable_type)
|
|
class_mapping(accountable_type)[:text]
|
|
end
|
|
|
|
def accountable_fill_class(accountable_type)
|
|
class_mapping(accountable_type)[:fill]
|
|
end
|
|
|
|
def accountable_bg_class(accountable_type)
|
|
class_mapping(accountable_type)[:bg]
|
|
end
|
|
|
|
def accountable_bg_transparent_class(accountable_type)
|
|
class_mapping(accountable_type)[:bg_transparent]
|
|
end
|
|
|
|
def accountable_color(accountable_type)
|
|
class_mapping(accountable_type)[:hex]
|
|
end
|
|
|
|
def account_groups(period: nil)
|
|
assets, liabilities = Current.family.accounts.active.by_group(currency: Current.family.currency, period: period || Period.last_30_days).values_at(:assets, :liabilities)
|
|
[ assets.children.sort_by(&:name), liabilities.children.sort_by(&:name) ].flatten
|
|
end
|
|
|
|
private
|
|
|
|
def class_mapping(accountable_type)
|
|
{
|
|
"CreditCard" => { text: "text-red-500", bg: "bg-red-500", bg_transparent: "bg-red-500/10", fill: "fill-red-500", hex: "#F13636" },
|
|
"Loan" => { text: "text-fuchsia-500", bg: "bg-fuchsia-500", bg_transparent: "bg-fuchsia-500/10", fill: "fill-fuchsia-500", hex: "#D444F1" },
|
|
"OtherLiability" => { text: "text-gray-500", bg: "bg-gray-500", bg_transparent: "bg-gray-500/10", fill: "fill-gray-500", hex: "#737373" },
|
|
"Depository" => { text: "text-violet-500", bg: "bg-violet-500", bg_transparent: "bg-violet-500/10", fill: "fill-violet-500", hex: "#875BF7" },
|
|
"Investment" => { text: "text-blue-600", bg: "bg-blue-600", bg_transparent: "bg-blue-600/10", fill: "fill-blue-600", hex: "#1570EF" },
|
|
"OtherAsset" => { text: "text-green-500", bg: "bg-green-500", bg_transparent: "bg-green-500/10", fill: "fill-green-500", hex: "#12B76A" },
|
|
"Property" => { text: "text-cyan-500", bg: "bg-cyan-500", bg_transparent: "bg-cyan-500/10", fill: "fill-cyan-500", hex: "#06AED4" },
|
|
"Vehicle" => { text: "text-pink-500", bg: "bg-pink-500", bg_transparent: "bg-pink-500/10", fill: "fill-pink-500", hex: "#F23E94" }
|
|
}.fetch(accountable_type, { text: "text-gray-500", bg: "bg-gray-500", bg_transparent: "bg-gray-500/10", fill: "fill-gray-500", hex: "#737373" })
|
|
end
|
|
end
|