2024-02-02 09:05:04 -06:00
class Family < ApplicationRecord
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-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 " )
2024-03-21 13:39:10 -04:00
query = query . where ( " account_balances.date >= ? " , period . date_range . begin ) if period . date_range . begin
query = query . where ( " account_balances.date <= ? " , period . date_range . end ) if period . date_range . end
2024-03-19 09:10:40 -04:00
result = query . to_a
2024-03-11 16:32:13 -04:00
{
2024-03-19 09:10:40 -04:00
asset_series : TimeSeries . new ( result . map { | r | { date : r . date , value : Money . new ( r . assets , r . currency ) } } ) ,
liability_series : TimeSeries . new ( result . map { | r | { date : r . date , value : Money . new ( r . liabilities , r . currency ) } } ) ,
net_worth_series : TimeSeries . new ( result . map { | r | { date : r . date , value : Money . new ( r . net_worth , r . currency ) } } )
2024-03-11 16:32:13 -04:00
}
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
2024-03-21 13:39:10 -04:00
assets - liabilities
2024-03-04 08:31:22 -05:00
end
2024-03-11 16:32:13 -04:00
def assets
2024-03-21 13:39:10 -04:00
Money . new ( accounts . active . assets . map { | account | account . balance_money . exchange_to ( currency ) || 0 } . sum , currency )
2024-03-04 08:31:22 -05:00
end
2024-03-11 16:32:13 -04:00
def liabilities
2024-03-21 13:39:10 -04:00
Money . new ( accounts . active . liabilities . map { | account | account . balance_money . exchange_to ( currency ) || 0 } . sum , currency )
2024-03-04 08:31:22 -05:00
end
2024-02-02 09:05:04 -06:00
end