diff --git a/app/models/income_statement.rb b/app/models/income_statement.rb index dc239ee3..ed45ede7 100644 --- a/app/models/income_statement.rb +++ b/app/models/income_statement.rb @@ -20,8 +20,7 @@ class IncomeStatement ScopeTotals.new( transactions_count: result.sum(&:transactions_count), income_money: Money.new(total_income, family.currency), - expense_money: Money.new(total_expense, family.currency), - missing_exchange_rates?: result.any?(&:missing_exchange_rates?) + expense_money: Money.new(total_expense, family.currency) ) end @@ -61,8 +60,8 @@ class IncomeStatement end private - ScopeTotals = Data.define(:transactions_count, :income_money, :expense_money, :missing_exchange_rates?) - PeriodTotal = Data.define(:classification, :total, :currency, :missing_exchange_rates?, :category_totals) + ScopeTotals = Data.define(:transactions_count, :income_money, :expense_money) + PeriodTotal = Data.define(:classification, :total, :currency, :category_totals) CategoryTotal = Data.define(:category, :total, :currency, :weight) def categories @@ -102,7 +101,6 @@ class IncomeStatement classification: classification, total: category_totals.reject { |ct| ct.category.subcategory? }.sum(&:total), currency: family.currency, - missing_exchange_rates?: totals.any?(&:missing_exchange_rates?), category_totals: category_totals ) end diff --git a/app/models/income_statement/category_stats.rb b/app/models/income_statement/category_stats.rb index c08d016e..87a01e65 100644 --- a/app/models/income_statement/category_stats.rb +++ b/app/models/income_statement/category_stats.rb @@ -10,14 +10,13 @@ class IncomeStatement::CategoryStats category_id: row["category_id"], classification: row["classification"], median: row["median"], - avg: row["avg"], - missing_exchange_rates?: row["missing_exchange_rates"] + avg: row["avg"] ) end end private - StatRow = Data.define(:category_id, :classification, :median, :avg, :missing_exchange_rates?) + StatRow = Data.define(:category_id, :classification, :median, :avg) def query_sql ActiveRecord::Base.sanitize_sql_array([ @@ -35,8 +34,7 @@ class IncomeStatement::CategoryStats c.id as category_id, date_trunc(:interval, ae.date) as period, CASE WHEN ae.amount < 0 THEN 'income' ELSE 'expense' END as classification, - SUM(ae.amount * COALESCE(er.rate, 1)) as total, - BOOL_OR(ae.currency <> :target_currency AND er.rate IS NULL) as missing_exchange_rates + SUM(ae.amount * COALESCE(er.rate, 1)) as total FROM transactions t JOIN entries ae ON ae.entryable_id = t.id AND ae.entryable_type = 'Transaction' JOIN accounts a ON a.id = ae.account_id @@ -54,8 +52,7 @@ class IncomeStatement::CategoryStats category_id, classification, ABS(PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY total)) as median, - ABS(AVG(total)) as avg, - BOOL_OR(missing_exchange_rates) as missing_exchange_rates + ABS(AVG(total)) as avg FROM period_totals GROUP BY category_id, classification; SQL diff --git a/app/models/income_statement/family_stats.rb b/app/models/income_statement/family_stats.rb index 7c71f889..8659e5c4 100644 --- a/app/models/income_statement/family_stats.rb +++ b/app/models/income_statement/family_stats.rb @@ -9,14 +9,13 @@ class IncomeStatement::FamilyStats StatRow.new( classification: row["classification"], median: row["median"], - avg: row["avg"], - missing_exchange_rates?: row["missing_exchange_rates"] + avg: row["avg"] ) end end private - StatRow = Data.define(:classification, :median, :avg, :missing_exchange_rates?) + StatRow = Data.define(:classification, :median, :avg) def query_sql ActiveRecord::Base.sanitize_sql_array([ @@ -33,8 +32,7 @@ class IncomeStatement::FamilyStats SELECT date_trunc(:interval, ae.date) as period, CASE WHEN ae.amount < 0 THEN 'income' ELSE 'expense' END as classification, - SUM(ae.amount * COALESCE(er.rate, 1)) as total, - BOOL_OR(ae.currency <> :target_currency AND er.rate IS NULL) as missing_exchange_rates + SUM(ae.amount * COALESCE(er.rate, 1)) as total FROM transactions t JOIN entries ae ON ae.entryable_id = t.id AND ae.entryable_type = 'Transaction' JOIN accounts a ON a.id = ae.account_id @@ -50,8 +48,7 @@ class IncomeStatement::FamilyStats SELECT classification, ABS(PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY total)) as median, - ABS(AVG(total)) as avg, - BOOL_OR(missing_exchange_rates) as missing_exchange_rates + ABS(AVG(total)) as avg FROM period_totals GROUP BY classification; SQL diff --git a/app/models/income_statement/totals.rb b/app/models/income_statement/totals.rb index 437daf7c..3f99b23c 100644 --- a/app/models/income_statement/totals.rb +++ b/app/models/income_statement/totals.rb @@ -11,14 +11,13 @@ class IncomeStatement::Totals category_id: row["category_id"], classification: row["classification"], total: row["total"], - transactions_count: row["transactions_count"], - missing_exchange_rates?: row["missing_exchange_rates"] + transactions_count: row["transactions_count"] ) end end private - TotalsRow = Data.define(:parent_category_id, :category_id, :classification, :total, :transactions_count, :missing_exchange_rates?) + TotalsRow = Data.define(:parent_category_id, :category_id, :classification, :total, :transactions_count) def query_sql ActiveRecord::Base.sanitize_sql_array([ @@ -36,8 +35,7 @@ class IncomeStatement::Totals c.parent_id as parent_category_id, CASE WHEN ae.amount < 0 THEN 'income' ELSE 'expense' END as classification, ABS(SUM(ae.amount * COALESCE(er.rate, 1))) as total, - COUNT(ae.id) as transactions_count, - BOOL_OR(ae.currency <> :target_currency AND er.rate IS NULL) as missing_exchange_rates + COUNT(ae.id) as transactions_count FROM (#{@transactions_scope.to_sql}) at JOIN entries ae ON ae.entryable_id = at.id AND ae.entryable_type = 'Transaction' LEFT JOIN categories c ON c.id = at.category_id