2024-02-02 09:05:04 -06:00
class Family < ApplicationRecord
2024-03-18 11:21:00 -04:00
include Monetizable
2024-02-02 09:05:04 -06:00
has_many :users , dependent : :destroy
has_many :accounts , dependent : :destroy
2024-02-23 21:34:33 -05:00
has_many :transactions , through : :accounts
2024-03-07 19:15:50 +01:00
has_many :transaction_categories , dependent : :destroy , class_name : " Transaction::Category "
2024-03-04 08:31:22 -05:00
2024-03-18 11:21:00 -04:00
monetize :net_worth , :assets , :liabilities
2024-03-11 16:32:13 -04:00
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 " } )
}
2024-03-04 08:31:22 -05:00
end
2024-03-11 16:32:13 -04:00
def effective_start_date
accounts . active . joins ( :balances ) . minimum ( " account_balances.date " ) || Date . current
2024-03-04 08:31:22 -05:00
end
2024-03-11 16:32:13 -04:00
def net_worth
accounts . active . sum ( " CASE WHEN classification = 'asset' THEN balance ELSE -balance END " )
2024-03-04 08:31:22 -05:00
end
2024-03-11 16:32:13 -04:00
def assets
2024-03-18 11:21:00 -04:00
accounts . active . assets . sum ( :balance )
2024-03-04 08:31:22 -05:00
end
2024-03-11 16:32:13 -04:00
def liabilities
accounts . active . liabilities . sum ( :balance )
2024-03-04 08:31:22 -05:00
end
2024-02-02 09:05:04 -06:00
end