diff --git a/app/models/family.rb b/app/models/family.rb index d98debb5..ce875c64 100644 --- a/app/models/family.rb +++ b/app/models/family.rb @@ -46,7 +46,8 @@ class Family < ApplicationRecord .where("account_entries.date <= ?", period.date_range.end) .where("account_entries.marked_as_transfer = ?", false) .where("account_entries.entryable_type = ?", "Account::Transaction") - .group("id") + .group("accounts.id") + .having("SUM(ABS(account_entries.amount)) > 0") .to_a results.each do |r| diff --git a/test/models/family_test.rb b/test/models/family_test.rb index 2a2649d7..3b78401c 100644 --- a/test/models/family_test.rb +++ b/test/models/family_test.rb @@ -105,25 +105,24 @@ class FamilyTest < ActiveSupport::TestCase test "calculates top movers" do checking_account = create_account(balance: 500, accountable: Depository.new) savings_account = create_account(balance: 1000, accountable: Depository.new) - create_transaction(account: checking_account, date: 2.days.ago.to_date, amount: -1000) create_transaction(account: checking_account, date: 1.day.ago.to_date, amount: 10) create_transaction(account: savings_account, date: 2.days.ago.to_date, amount: -5000) + zero_income_zero_expense_account = create_account(balance: 200, accountable: Depository.new) + create_transaction(account: zero_income_zero_expense_account, amount: 0) + snapshot = @family.snapshot_account_transactions top_spenders = snapshot[:top_spenders] top_earners = snapshot[:top_earners] top_savers = snapshot[:top_savers] - assert_equal 10, top_spenders.first.spending - - assert_equal 5000, top_earners.first.income - assert_equal 1000, top_earners.second.income - - assert_equal 1, top_savers.first.savings_rate - assert_equal ((1000 - 10).to_f / 1000), top_savers.second.savings_rate + assert_equal [ 10 ], top_spenders.map(&:spending) + assert_equal [ 5000, 1000 ], top_earners.map(&:income) + assert_equal [ 1, 0.99 ], top_savers.map(&:savings_rate) end + test "calculates rolling transaction totals" do account = create_account(balance: 1000, accountable: Depository.new) create_transaction(account: account, date: 2.days.ago.to_date, amount: -500)