diff --git a/app/models/simplefin_account/processor.rb b/app/models/simplefin_account/processor.rb index 569f515cd..37d211673 100644 --- a/app/models/simplefin_account/processor.rb +++ b/app/models/simplefin_account/processor.rb @@ -46,7 +46,9 @@ class SimplefinAccount::Processor avail = to_decimal(simplefin_account.available_balance) # Choose an observed value prioritizing posted balance first - observed = bal.nonzero? ? bal : avail + # Use available_balance only when current_balance is truly missing (nil), + # not when it's explicitly zero (e.g., dormant credit card with no debt) + observed = simplefin_account.current_balance.nil? ? avail : bal # Determine if this should be treated as a liability for normalization is_linked_liability = [ "CreditCard", "Loan" ].include?(account.accountable_type) diff --git a/test/models/simplefin_account_processor_test.rb b/test/models/simplefin_account_processor_test.rb index 0b13f0e97..11b9b4456 100644 --- a/test/models/simplefin_account_processor_test.rb +++ b/test/models/simplefin_account_processor_test.rb @@ -178,4 +178,24 @@ class SimplefinAccountProcessorTest < ActiveSupport::TestCase # Mapper should infer liability from name; final should be negative assert_equal BigDecimal("-100.00"), acct.reload.balance end + + test "dormant credit card with zero balance and negative available-balance shows zero debt" do + sfin_acct = SimplefinAccount.create!( + simplefin_item: @item, + name: "Discover Card", + account_id: "cc_dormant", + currency: "USD", + account_type: "credit", + current_balance: BigDecimal("0"), + available_balance: BigDecimal("-3800") # credit limit reported as negative + ) + + acct = accounts(:credit_card) + acct.update!(simplefin_account: sfin_acct) + + SimplefinAccount::Processor.new(sfin_acct).send(:process_account!) + + # Should use explicit zero balance, not negative available_balance + assert_equal BigDecimal("0"), acct.reload.balance + end end