mirror of
https://github.com/we-promise/sure.git
synced 2026-04-11 16:24:51 +00:00
* Initial account sharing changes * Update schema.rb * Update schema.rb * Change sharing UI to modal * UX fixes and sharing controls * Scope include in finances better * Update totals.rb * Update totals.rb * Scope reports to finance account scope * Update impersonation_sessions_controller_test.rb * Review fixes * Update schema.rb * Update show.html.erb * FIX db validation * Refine edit permissions * Review items * Review * Review * Add application level helper * Critical review * Address remaining review items * Fix modals * more scoping * linter * small UI fix * Fix: Sync broadcasts push unscoped balance sheet to all users * Update sync_complete_event.rb The fix removes the sidebar broadcasts (which rendered unscoped account groups using family.balance_sheet without user context) along with the now-unused sidebar_targets, account_group, and family_balance_sheet private methods. The sidebar will still update correctly — when the sync completes, Family::SyncCompleteEvent#broadcast fires family.broadcast_refresh, which triggers a morph-based page refresh for each user with their own authenticated session, rendering properly scoped sidebar content.
62 lines
1.9 KiB
Ruby
62 lines
1.9 KiB
Ruby
class BalanceSheet::ClassificationGroup
|
|
include Monetizable
|
|
|
|
monetize :total, as: :total_money
|
|
|
|
attr_reader :classification, :currency
|
|
|
|
def initialize(classification:, currency:, accounts:)
|
|
@classification = normalize_classification!(classification)
|
|
@name = name
|
|
@currency = currency
|
|
@accounts = accounts
|
|
end
|
|
|
|
def name
|
|
classification.titleize.pluralize
|
|
end
|
|
|
|
def icon
|
|
classification == "asset" ? "plus" : "minus"
|
|
end
|
|
|
|
def total
|
|
accounts.select { |a| a.respond_to?(:included_in_finances?) ? a.included_in_finances? : true }.sum(&:converted_balance)
|
|
end
|
|
|
|
def syncing?
|
|
accounts.any?(&:syncing?)
|
|
end
|
|
|
|
# For now, we group by accountable type. This can be extended in the future to support arbitrary user groupings.
|
|
def account_groups
|
|
groups = accounts.group_by(&:accountable_type)
|
|
.transform_keys { |at| Accountable.from_type(at) }
|
|
.map do |accountable, account_rows|
|
|
BalanceSheet::AccountGroup.new(
|
|
name: I18n.t("accounts.types.#{accountable.name.underscore}", default: accountable.display_name),
|
|
color: accountable.color,
|
|
accountable_type: accountable,
|
|
accounts: account_rows,
|
|
classification_group: self
|
|
)
|
|
end
|
|
|
|
# Sort the groups using the manual order defined by Accountable::TYPES so that
|
|
# the UI displays account groups in a predictable, domain-specific sequence.
|
|
groups.sort_by do |group|
|
|
manual_order = Accountable::TYPES
|
|
type_name = group.key.camelize
|
|
manual_order.index(type_name) || Float::INFINITY
|
|
end
|
|
end
|
|
|
|
private
|
|
attr_reader :accounts
|
|
|
|
def normalize_classification!(classification)
|
|
raise ArgumentError, "Invalid classification: #{classification}" unless %w[asset liability].include?(classification)
|
|
classification
|
|
end
|
|
end
|