diff --git a/routes/summary.js b/routes/summary.js index 2e5ef34..0a38912 100644 --- a/routes/summary.js +++ b/routes/summary.js @@ -28,7 +28,9 @@ function buildBankTrackingSummary(db, userId, year, month) { const effectivePendingDays = Number.isInteger(pendingDays) && pendingDays >= 0 ? pendingDays : DEFAULT_PENDING_DAYS; - // Payments made in the tracker recently that may not have cleared the bank yet + // Only count manually-entered payments as pending — bank-synced payments + // (provider_sync) are already reflected in the live bank balance, so + // including them would double-deduct. const pendingRow = effectivePendingDays > 0 ? db.prepare(` SELECT COALESCE(SUM(p.amount), 0) AS pending_total @@ -38,6 +40,7 @@ function buildBankTrackingSummary(db, userId, year, month) { AND p.paid_date >= date('now', '-' || ? || ' days') AND p.paid_date <= date('now') AND b.deleted_at IS NULL + AND (p.payment_source IS NULL OR p.payment_source != 'provider_sync') `).get(userId, effectivePendingDays) : { pending_total: 0 }; diff --git a/services/trackerService.js b/services/trackerService.js index a853a8b..701ed9a 100644 --- a/services/trackerService.js +++ b/services/trackerService.js @@ -24,6 +24,9 @@ function buildBankTracking(db, userId, year, month) { const pendingDays = parseInt(settings.bank_tracking_pending_days, 10); const days = Number.isInteger(pendingDays) && pendingDays >= 0 ? pendingDays : DEFAULT_PENDING_DAYS; + // Only count manually-entered payments as pending — bank-synced payments + // (provider_sync) are already reflected in the live bank balance, so + // including them would double-deduct. const pendingRow = days > 0 ? db.prepare(` SELECT COALESCE(SUM(p.amount), 0) AS pending_total @@ -31,6 +34,7 @@ function buildBankTracking(db, userId, year, month) { WHERE b.user_id = ? AND p.paid_date >= date('now', '-' || ? || ' days') AND p.paid_date <= date('now') AND b.deleted_at IS NULL + AND (p.payment_source IS NULL OR p.payment_source != 'provider_sync') `).get(userId, days) : { pending_total: 0 }; @@ -445,8 +449,9 @@ function getTracker(userId, query = {}, now = new Date()) { cashflow, rows: bankTracking.enabled ? rows.map(r => { - // Flag recently-paid rows as pending-cleared when bank tracking is on - if (r.status === 'paid' && r.last_paid_date) { + // Only flag manually-entered payments as pending-cleared — bank-synced + // payments are already in the balance so they don't need the badge. + if (r.status === 'paid' && r.last_paid_date && r.payment_source !== 'provider_sync') { const cutoff = new Date(); cutoff.setDate(cutoff.getDate() - bankTracking.pending_days); const paidAt = new Date(r.last_paid_date);