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.
This commit is contained in:
2026-03-18 14:55:21 -06:00
parent c944c84939
commit 35a5d576ea
5 changed files with 598 additions and 0 deletions
+51
View File
@@ -42,6 +42,7 @@
</button>
<button id="btn-new-check" class="btn-secondary">+ New Check</button>
<button id="btn-import" class="btn-secondary">Import .mdb</button>
<button class="btn-secondary" data-open-qbo="checks">Import QBO</button>
</div>
</div>
@@ -83,6 +84,7 @@
</div>
<div class="toolbar-right">
<button id="btn-new-deposit" class="btn-secondary">+ New Deposit</button>
<button class="btn-secondary" data-open-qbo="deposits">Import QBO</button>
</div>
</div>
<div class="table-wrap">
@@ -411,6 +413,55 @@
</div>
</div>
<!-- QBO Import modal -->
<div id="qbo-import-overlay" class="modal-overlay"></div>
<div id="qbo-import-modal" class="modal modal-wide" role="dialog" aria-labelledby="qbo-import-title">
<div class="modal-header">
<h2 id="qbo-import-title">Import from QuickBooks Online</h2>
<button id="btn-close-qbo-import" class="btn-icon" title="Close">×</button>
</div>
<div class="qbo-tabs">
<button class="qbo-tab active" data-tab="checks">Checks to Print</button>
<button class="qbo-tab" data-tab="deposits">Deposits</button>
</div>
<!-- Checks pane -->
<div class="qbo-pane" id="qbo-pane-checks">
<div class="modal-body">
<p class="modal-desc">Export a <strong>Transaction List</strong> or <strong>Check Detail</strong> report from QBO (filtered to checks) as CSV, then upload it here. Checks will be imported as unprinted.</p>
<div class="form-group">
<label for="qbo-checks-file">QBO CSV export</label>
<input type="file" id="qbo-checks-file" accept=".csv,.txt">
</div>
<div id="qbo-checks-preview" hidden></div>
<div id="qbo-checks-result" class="import-result" hidden></div>
<div id="qbo-checks-error" class="wizard-error" hidden></div>
</div>
<div class="modal-footer">
<button id="btn-qbo-checks-parse" class="btn-secondary">Preview</button>
<button id="btn-qbo-checks-import" class="btn-primary" hidden disabled>Import</button>
<button id="btn-qbo-checks-cancel" class="btn-ghost">Cancel</button>
</div>
</div>
<!-- Deposits pane -->
<div class="qbo-pane" id="qbo-pane-deposits" hidden>
<div class="modal-body">
<p class="modal-desc">Export a <strong>Deposit Detail</strong> report from QBO as CSV. Deposits are grouped by date — one deposit record per day.</p>
<div class="form-group">
<label for="qbo-deposits-file">QBO CSV export</label>
<input type="file" id="qbo-deposits-file" accept=".csv,.txt">
</div>
<div id="qbo-deposits-preview" hidden></div>
<div id="qbo-deposits-result" class="import-result" hidden></div>
<div id="qbo-deposits-error" class="wizard-error" hidden></div>
</div>
<div class="modal-footer">
<button id="btn-qbo-deposits-parse" class="btn-secondary">Preview</button>
<button id="btn-qbo-deposits-import" class="btn-primary" hidden disabled>Import</button>
<button id="btn-qbo-deposits-cancel" class="btn-ghost">Cancel</button>
</div>
</div>
</div>
<!-- Deposit slide-in panel -->
<div id="dep-panel-overlay"></div>
<aside id="deposit-panel">