diff --git a/app/models/simplefin_account/liabilities/overpayment_analyzer.rb b/app/models/simplefin_account/liabilities/overpayment_analyzer.rb index 0c2a16ad6..3de6aa9d8 100644 --- a/app/models/simplefin_account/liabilities/overpayment_analyzer.rb +++ b/app/models/simplefin_account/liabilities/overpayment_analyzer.rb @@ -180,6 +180,15 @@ class SimplefinAccount::Liabilities::OverpaymentAnalyzer end eps = [ epsilon_base, (@observed.abs * BigDecimal("0.005")) ].max + net = m[:charges_total] - m[:payments_total] + + # Sanity check: if transaction net is way off from observed balance, data is likely incomplete + # (e.g., pending charges not in history yet). Use 10% tolerance or minimum $5. + # Note: SimpleFIN always sends negative for liabilities, so we compare magnitudes only. + tolerance = [ BigDecimal("5"), @observed.abs * BigDecimal("0.10") ].max + if (net.abs - @observed.abs).abs > tolerance + return [ :unknown, "net-balance-mismatch" ] + end # Overpayment (credit): payments exceed charges by at least the observed balance (within eps) if (m[:payments_total] - m[:charges_total]) >= (@observed.abs - eps)