class Family < ApplicationRecord include Monetizable has_many :users, dependent: :destroy has_many :accounts, dependent: :destroy has_many :transactions, through: :accounts has_many :transaction_categories, dependent: :destroy, class_name: "Transaction::Category" monetize :net_worth, :assets, :liabilities def snapshot(period = Period.all) query = accounts.active.joins(:balances) .where("account_balances.currency = ?", self.currency) .select( "account_balances.currency", "account_balances.date", "SUM(CASE WHEN accounts.classification = 'liability' THEN account_balances.balance ELSE 0 END) AS liabilities", "SUM(CASE WHEN accounts.classification = 'asset' THEN account_balances.balance ELSE 0 END) AS assets", "SUM(CASE WHEN accounts.classification = 'asset' THEN account_balances.balance WHEN accounts.classification = 'liability' THEN -account_balances.balance ELSE 0 END) AS net_worth", ) .group("account_balances.date, account_balances.currency") .order("account_balances.date") query = query.where("account_balances.date BETWEEN ? AND ?", period.date_range.begin, period.date_range.end) if period.date_range { asset_series: MoneySeries.new(query, { trend_type: :asset, amount_accessor: "assets" }), liability_series: MoneySeries.new(query, { trend_type: :liability, amount_accessor: "liabilities" }), net_worth_series: MoneySeries.new(query, { trend_type: :asset, amount_accessor: "net_worth" }) } end def effective_start_date accounts.active.joins(:balances).minimum("account_balances.date") || Date.current end def net_worth accounts.active.sum("CASE WHEN classification = 'asset' THEN balance ELSE -balance END") end def assets accounts.active.assets.sum(:balance) end def liabilities accounts.active.liabilities.sum(:balance) end end