diff --git a/HISTORY.md b/HISTORY.md index a8065b2..fc39941 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,25 @@ # Bill Tracker β€” Changelog +## v0.33.8.3 + +### πŸš€ Features + +- **Subscription badge (indigo)** β€” `Sub` badge in all four locations (desktop tracker, mobile tracker, desktop bills table, mobile bills row), toggleable via Bills page display preferences. +- **SimpleFIN Sync status card** β€” New card in Operations grid on Status page showing connections, accounts, last sync, next check, interval, and any errors. +- **Daily worker now starts** β€” `dailyWorker.start()` was never called; autopay marking, notifications, session pruning, and scheduled cleanup are now active. + +### πŸ› Bug Fixes + +- **Tracker overdue count** β€” `overdue_count` now runs a real SQL query: active monthly bills where due_day < today, no payment this month, and not skipped. +- **Status page accuracy** β€” Header subtitle reflects `data.ok` ("All systems operational" / "One or more systems need attention"). Application card shows "Degraded" in red when not ok. Worker status pill now checks `last_error` β€” a running worker with errors shows "Error" red instead of "Running" green. "Stopped" renamed to "Error" for accuracy. +- **SimpleFIN Recommendations title** β€” Removed redundant "SimpleFIN" prefix from card title on Subscriptions page. + +### πŸ›  Internal + +- `routes/status.js` β€” `bank_sync` block returns config, worker state, DB aggregates. + +--- + ## v0.33.8.2 ### πŸ› Bug Fixes diff --git a/client/components/BillsTableInner.jsx b/client/components/BillsTableInner.jsx index e907dc0..d3660b1 100644 --- a/client/components/BillsTableInner.jsx +++ b/client/components/BillsTableInner.jsx @@ -71,6 +71,11 @@ function BillCard({ bill, prefs = ALL_ON, onEdit, onToggle, onDelete, onHistory, 2FA )} + {prefs.showSubscription && !!bill.is_subscription && ( + + Sub + + )} {hasHistory && ( 2FA )} + {bill.is_subscription && ( + Sub + )} diff --git a/client/components/MobileTrackerRow.jsx b/client/components/MobileTrackerRow.jsx index 4c82f2a..7c0f64d 100644 --- a/client/components/MobileTrackerRow.jsx +++ b/client/components/MobileTrackerRow.jsx @@ -195,6 +195,14 @@ export const MobileTrackerRow = React.memo(function MobileTrackerRow({ row, year AP )} + {row.is_subscription && ( + + Sub + + )} {row.monthly_notes && (

diff --git a/client/pages/BillsPage.jsx b/client/pages/BillsPage.jsx index 222bc1e..a86909f 100644 --- a/client/pages/BillsPage.jsx +++ b/client/pages/BillsPage.jsx @@ -186,20 +186,22 @@ const PREFS_DEFAULTS = { showApr: true, showBalance: true, showMinPayment: true, - showAutopay: true, - show2fa: true, + showAutopay: true, + show2fa: true, + showSubscription: true, }; const PREFS_LABELS = [ - ['showCategory', 'Category'], - ['showDueDay', 'Due day'], - ['showAmount', 'Amount'], - ['showCycle', 'Billing cycle'], - ['showApr', 'APR'], - ['showBalance', 'Balance'], - ['showMinPayment', 'Min payment'], - ['showAutopay', 'Autopay badge'], - ['show2fa', '2FA badge'], + ['showCategory', 'Category'], + ['showDueDay', 'Due day'], + ['showAmount', 'Amount'], + ['showCycle', 'Billing cycle'], + ['showApr', 'APR'], + ['showBalance', 'Balance'], + ['showMinPayment', 'Min payment'], + ['showAutopay', 'Autopay badge'], + ['show2fa', '2FA badge'], + ['showSubscription', 'Subscription badge'], ]; function useDisplayPrefs() { diff --git a/client/pages/StatusPage.jsx b/client/pages/StatusPage.jsx index ded3002..be46211 100644 --- a/client/pages/StatusPage.jsx +++ b/client/pages/StatusPage.jsx @@ -124,7 +124,7 @@ function ReleaseNotesSection({ version, historyMeta }) { return ( - +

Preview

@@ -285,14 +285,26 @@ export default function StatusPage() { const server = data?.server ?? data?.clock ?? {}; const tracker = data?.tracker ?? data?.tracker_health ?? {}; const cleanup = data?.cleanup ?? {}; + const bankSync = data?.bank_sync ?? data?.simplefin ?? {}; const errors = data?.errors ?? data?.recent_errors ?? []; const dbOk = db.connected ?? (db.status === 'connected') ?? true; - const workerOk = worker.running ?? worker.enabled ?? null; + const workerOk = !worker.enabled ? null : worker.last_error ? false : true; const notificationsConfigured = notifications.configured ?? notifications.smtp_configured ?? null; const backupsEnabled = backups.enabled ?? null; const recentErrors = Array.isArray(errors) ? errors : []; + const bankSyncEnabled = bankSync.enabled ?? false; + const bankSyncStatus = !bankSyncEnabled ? 'Disabled' + : bankSync.running ? 'Syncing' + : bankSync.last_error ? 'Error' + : bankSync.source_count > 0 ? 'Connected' + : 'No Sources'; + const bankSyncTone = !bankSyncEnabled ? 'muted' + : bankSync.last_error ? 'warn' + : bankSync.source_count > 0 ? 'good' + : 'warn'; + return (
@@ -301,7 +313,7 @@ export default function StatusPage() {

Server Status

- {data ? 'All systems operational' : 'Loading…'} + {!data ? 'Loading…' : data.ok ? 'All systems operational' : 'One or more systems need attention'}