From 35a5d576ea58e40da934b3e746e421c8829ea3b1 Mon Sep 17 00:00:00 2001 From: Steve Dogiakos Date: Wed, 18 Mar 2026 14:55:21 -0600 Subject: [PATCH] Add QuickBooks Online CSV importer for checks and deposits Two-tab modal: "Checks to Print" parses QBO Transaction List / Check Detail CSV exports; "Deposits" parses QBO Deposit Detail CSV exports and groups by date. Both tabs show a preview before confirming import. --- public/css/style.css | 32 ++++ public/index.html | 51 +++++++ public/js/app.js | 198 ++++++++++++++++++++++++ src/app.js | 2 + src/routes/qbo-import.js | 315 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 598 insertions(+) create mode 100644 src/routes/qbo-import.js diff --git a/public/css/style.css b/public/css/style.css index d5bb7f0..c920b5c 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -85,6 +85,38 @@ header { line-height: 1.5; } +.modal-wide { width: min(720px, 96vw); } + +.qbo-tabs { + display: flex; + border-bottom: 1px solid var(--border); + background: #f9f9f9; + padding: 0 16px; +} +.qbo-tab { + background: none; + border: none; + border-bottom: 2px solid transparent; + padding: 8px 16px; + font-size: 13px; + font-weight: 500; + cursor: pointer; + color: var(--text-muted); + margin-bottom: -1px; +} +.qbo-tab.active { color: var(--primary); border-bottom-color: var(--primary); } +.qbo-tab:hover:not(.active) { color: var(--text); } + +.qbo-preview-count { font-size: 12px; color: var(--text-muted); margin-bottom: 6px; } +.qbo-warnings { font-size: 11px; color: #b45309; background: #fef9c3; border: 1px solid #ca8a04; border-radius: 3px; padding: 6px 8px; margin-bottom: 8px; } +.qbo-preview-scroll { max-height: 280px; overflow-y: auto; border: 1px solid var(--border); border-radius: 4px; } +.qbo-preview-table { width: 100%; border-collapse: collapse; font-size: 12px; } +.qbo-preview-table th { background: #f5f5f5; padding: 5px 8px; text-align: left; font-weight: 600; position: sticky; top: 0; border-bottom: 1px solid var(--border); } +.qbo-preview-table td { padding: 4px 8px; border-bottom: 1px solid #f0f0f0; } +.qbo-preview-table tr:last-child td { border-bottom: none; } +.qbo-preview-table .text-muted { color: var(--text-muted); } +.import-result { font-size: 13px; color: #15803d; background: #f0fdf4; border: 1px solid #86efac; border-radius: 4px; padding: 8px 12px; margin-top: 8px; } + /* ── Toolbar ── */ .toolbar { display: flex; diff --git a/public/index.html b/public/index.html index 4d099a7..2e8c028 100644 --- a/public/index.html +++ b/public/index.html @@ -42,6 +42,7 @@ + @@ -83,6 +84,7 @@
+
@@ -411,6 +413,55 @@
+ + + +