finances/migration/pnc_review_preview.html
Dane Sabo 26fb19ca9a Migration runbook + rebuild tooling; 10 PNC/income/Don't Know rules
- migration/README.md: cold-start rebuild runbook (reconciliation gate,
  classification rules, transfer pairing, investment policy, execution order)
- migration/build_rebuild_dataset.py: consolidated 3-QFX builder with PNC-
  owned transfers, counterpart pairing & drop, per-account reconciliation
- migration/rebuild_clusters.{json,md}: clustering proposal for the rebuild
- migration/rebuild_review.html: read-only browser review for the 1017-txn
  rebuild plan (transfers under PNC, category fixes baked in)
- migration/{pnc_review,review_preview_mixed}.html: earlier UI previews
- merchant_map.json: add 10 settled deterministic rules (Duquesne Light,
  Pitt Salary, Interest Payment, IRS, Pitt Tuition, Daily Cash Adjustment,
  ATM Surcharge/Yardi/Venmo/Zelle->Don't Know) so the skill stops flagging
  pre-classified PNC lines as UNMATCHED
2026-05-25 18:54:50 -04:00

300 lines
51 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Firefly import review</title>
<style>
:root { --bg:#0f1115; --panel:#181b22; --line:#2a2f3a; --fg:#e7e9ee;
--muted:#9aa3b2; --accent:#4f9cf9; --ok:#3fb950; --no:#f85149;
--warn:#d29922; }
* { box-sizing:border-box; }
body { margin:0; font:14px/1.45 -apple-system,Segoe UI,Roboto,sans-serif;
background:var(--bg); color:var(--fg); }
header { position:sticky; top:0; z-index:5; background:var(--panel);
border-bottom:1px solid var(--line); padding:12px 18px;
display:flex; gap:18px; align-items:center; flex-wrap:wrap; }
header h1 { font-size:15px; margin:0; font-weight:600; }
.counts { display:flex; gap:14px; color:var(--muted); font-size:13px; }
.counts b { color:var(--fg); }
.spacer { flex:1; }
button { font:inherit; cursor:pointer; border:1px solid var(--line);
background:#222732; color:var(--fg); border-radius:6px;
padding:7px 12px; }
button:hover { border-color:var(--accent); }
button.primary { background:var(--accent); border-color:var(--accent);
color:#06203f; font-weight:600; }
section { margin:22px auto; max-width:1200px; padding:0 18px; }
h2 { font-size:15px; border-bottom:1px solid var(--line);
padding-bottom:6px; }
h2 .sub { color:var(--muted); font-weight:400; font-size:12px;
margin-left:8px; }
table { width:100%; border-collapse:collapse; }
th,td { text-align:left; padding:7px 8px; border-bottom:1px solid var(--line);
vertical-align:top; font-size:13px; }
th { color:var(--muted); font-weight:600; }
td.amt { text-align:right; font-variant-numeric:tabular-nums;
white-space:nowrap; }
.desc { color:var(--fg); }
.desc small { color:var(--muted); display:block; }
input[type=text], select { font:inherit; background:#11141a; color:var(--fg);
border:1px solid var(--line); border-radius:5px; padding:5px 6px;
width:100%; }
.toggle { display:inline-flex; border:1px solid var(--line);
border-radius:6px; overflow:hidden; }
.toggle button { border:0; border-radius:0; padding:5px 10px;
background:#11141a; }
.toggle button.on-ok { background:var(--ok); color:#04210b;
font-weight:600; }
.toggle button.on-no { background:var(--no); color:#2a0606;
font-weight:600; }
.pill { font-size:11px; padding:1px 7px; border-radius:999px;
border:1px solid var(--line); color:var(--muted); }
.pill.review { color:var(--warn); border-color:var(--warn); }
.pill.unmatched { color:var(--no); border-color:var(--no); }
.pill.create { color:var(--ok); border-color:var(--ok); }
.pill.transfer { color:#fff; background:#8e5cf7; border-color:#8e5cf7; }
.pill.dup { color:var(--muted); }
tr.is-transfer td { background:rgba(142,92,247,0.10); }
.sugg { color:var(--muted); font-size:12px; margin-top:3px; }
.sugg a { color:var(--accent); cursor:pointer; text-decoration:underline; }
.readonly td { color:var(--muted); }
.empty { color:var(--muted); padding:10px 0; }
footer { max-width:1200px; margin:30px auto 60px; padding:0 18px;
color:var(--muted); font-size:12px; }
</style>
</head>
<body>
<header>
<h1>Firefly import review</h1>
<div class="counts" id="counts"></div>
<div class="spacer"></div>
<button id="approveAuto">Approve all auto</button>
<button id="export" class="primary">Export decisions</button>
</header>
<section>
<h2>Needs Clarity <span class="sub">UNMATCHED + REVIEW &mdash; set the
canonical account, category, budget, then approve</span></h2>
<table><thead><tr>
<th>Date</th><th>Amount</th><th>Description</th><th>Account</th>
<th>Category</th><th>Budget</th><th>Comment</th><th>Decision</th>
</tr></thead><tbody id="tb-clarity"></tbody></table>
<div class="empty" id="empty-clarity" hidden>Nothing needs clarification.</div>
</section>
<section>
<h2>Auto-Proposed <span class="sub">matched a rule &mdash; approved by
default, deny or edit if wrong</span></h2>
<table><thead><tr>
<th>Date</th><th>Amount</th><th>Description</th><th>Account</th>
<th>Category</th><th>Budget</th><th>Comment</th><th>Decision</th>
</tr></thead><tbody id="tb-auto"></tbody></table>
<div class="empty" id="empty-auto" hidden>No auto-proposed rows.</div>
</section>
<section>
<h2>All Transactions <span class="sub">complete picture, read-only
(includes skipped duplicates)</span></h2>
<table><thead><tr>
<th>Date</th><th>Amount</th><th>Type</th><th>Description</th>
<th>Bucket</th><th>Target</th>
</tr></thead><tbody id="tb-all"></tbody></table>
</section>
<footer>
Decisions are exported as <code>decisions.json</code> (keyed by
external_id). Re-run
<code>firefly_import.py &lt;normalized&gt; --decisions decisions.json --post</code>
to post only approved rows.
</footer>
<script>
const PLAN = {"meta": {"generated": "2026-05-17", "config": ".firefly.json", "record_count": 90, "note": "REAL PNC June-window classification — browser-test the reviewer on your own data", "rendered": "2026-05-17T14:35:41"}, "rows": [{"external_id": "pnc:952673929534609207#1#001#2026-05-15#", "bucket": "TRANSFER", "date": "2026-05-15", "amount": "78.41", "type": "transfer", "description": "CITI AUTOPAY PAYMENT ACH WEB-REC CITI AUTOPAY PAYMENT ACH WE", "asset_account": "PNC Checking", "destination_account": "Costco Visa Card", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#2#001#2026-05-08#", "bucket": "CREATE", "date": "2026-05-08", "amount": "0.05", "type": "deposit", "description": "INTEREST PAYMENT INTEREST PAYMENT", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Interest Income", "proposed_account_id": null, "proposed_category": "Investment: Interest", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2026-05-08#", "bucket": "REVIEW", "date": "2026-05-08", "amount": "2150.00", "type": "withdrawal", "description": "CHECK 143 xxxxx2209 CHECK 143 xxxxx2209", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "CHECK (payee?)", "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": true}, {"external_id": "pnc:952673929534609207#1#001#2026-05-05#", "bucket": "REVIEW", "date": "2026-05-05", "amount": "2150.00", "type": "withdrawal", "description": "CHECK 142 xxxxx1771 CHECK 142 xxxxx1771", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "CHECK (payee?)", "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": true}, {"external_id": "pnc:952673929534609207#2#001#2026-05-04#", "bucket": "CREATE", "date": "2026-05-04", "amount": "48.09", "type": "withdrawal", "description": "DUQUESNE LIGHT PAYMENT ACH DEBIT DUQUESNE LIGHT PAYMENT ACH ", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Duquesne Light", "proposed_account_id": null, "proposed_category": "Utilities: Electric", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2026-05-04#", "bucket": "CREATE", "date": "2026-05-04", "amount": "1025.00", "type": "withdrawal", "description": "COMPEER-COMP-CP WEB PMTS ACH WEB COMPEER-COMP-CP WEB PMTS AC", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Compeer Investments", "proposed_account_id": null, "proposed_category": "Rent", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2026-05-01#", "bucket": "TRANSFER", "date": "2026-05-01", "amount": "1650.72", "type": "transfer", "description": "APPLECARD GSBANK PAYMENT ACH WEB APPLECARD GSBANK PAYMENT AC", "asset_account": "PNC Checking", "destination_account": "Apple Credit Card", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2026-04-30#", "bucket": "CREATE", "date": "2026-04-30", "amount": "2778.70", "type": "deposit", "description": "UNIV PITTSBURGH PAYROLL ACH CRED UNIV PITTSBURGH PAYROLL ACH", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Pitt Salary", "proposed_account_id": null, "proposed_category": "Wages", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2026-04-28#", "bucket": "TRANSFER", "date": "2026-04-28", "amount": "3550.00", "type": "transfer", "description": "SCHWAB BROKERAGE MONEYLINK ACH C SCHWAB BROKERAGE MONEYLINK ", "asset_account": "PNC Checking", "destination_account": "Schwab (Stocks/Savings?)", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": true}, {"external_id": "pnc:952673929534609207#2#001#2026-04-27#", "bucket": "REVIEW", "date": "2026-04-27", "amount": "60.00", "type": "withdrawal", "description": "CHECK 144 xxxxx4324 CHECK 144 xxxxx4324", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "CHECK (payee?)", "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": true}, {"external_id": "pnc:952673929534609207#1#001#2026-04-27#", "bucket": "TRANSFER", "date": "2026-04-27", "amount": "4000.00", "type": "transfer", "description": "SCHWAB BROKERAGE MONEYLINK ACH C SCHWAB BROKERAGE MONEYLINK ", "asset_account": "PNC Checking", "destination_account": "Schwab (Stocks/Savings?)", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": true}, {"external_id": "pnc:952673929534609207#1#001#2026-04-17#", "bucket": "REVIEW", "date": "2026-04-17", "amount": "258.96", "type": "deposit", "description": "VENMO CASHOUT ACH CREDIT xxxxxxx VENMO CASHOUT ACH CREDIT xx", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Don't Know", "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": true}, {"external_id": "pnc:952673929534609207#1#001#2026-04-15#", "bucket": "TRANSFER", "date": "2026-04-15", "amount": "116.09", "type": "transfer", "description": "CITI AUTOPAY PAYMENT ACH WEB-REC CITI AUTOPAY PAYMENT ACH WE", "asset_account": "PNC Checking", "destination_account": "Costco Visa Card", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2026-04-14#", "bucket": "TRANSFER", "date": "2026-04-14", "amount": "50.00", "type": "transfer", "description": "ATM WITHDRAWAL PNCPM1896 N0414 3 ATM WITHDRAWAL PNCPM1896 N0", "asset_account": "PNC Checking", "destination_account": "Cash", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#2#001#2026-04-13#", "bucket": "REVIEW", "date": "2026-04-13", "amount": "1.05", "type": "deposit", "description": "ZEL FROM MHER KARAKOUZIAN ZEL FROM MHER KARAKOUZIAN", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Don't Know", "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": true}, {"external_id": "pnc:952673929534609207#1#001#2026-04-13#", "bucket": "REVIEW", "date": "2026-04-13", "amount": "3.45", "type": "deposit", "description": "ZEL FROM Luis Benitez ZEL FROM Luis Benitez", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Don't Know", "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": true}, {"external_id": "pnc:952673929534609207#1#001#2026-04-08#", "bucket": "CREATE", "date": "2026-04-08", "amount": "0.08", "type": "deposit", "description": "INTEREST PAYMENT INTEREST PAYMENT", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Interest Income", "proposed_account_id": null, "proposed_category": "Investment: Interest", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#2#001#2026-04-02#", "bucket": "CREATE", "date": "2026-04-02", "amount": "36.55", "type": "withdrawal", "description": "DUQUESNE LIGHT PAYMENT ACH DEBIT DUQUESNE LIGHT PAYMENT ACH ", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Duquesne Light", "proposed_account_id": null, "proposed_category": "Utilities: Electric", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2026-04-02#", "bucket": "CREATE", "date": "2026-04-02", "amount": "1025.00", "type": "withdrawal", "description": "COMPEER-COMP-CP WEB PMTS ACH WEB COMPEER-COMP-CP WEB PMTS AC", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Compeer Investments", "proposed_account_id": null, "proposed_category": "Rent", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#2#001#2026-04-01#", "bucket": "TRANSFER", "date": "2026-04-01", "amount": "3000.00", "type": "transfer", "description": "SCHWAB BROKERAGE MONEYLINK ACH D SCHWAB BROKERAGE MONEYLINK ", "asset_account": "PNC Checking", "destination_account": "Schwab (Stocks/Savings?)", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": true}, {"external_id": "pnc:952673929534609207#1#001#2026-04-01#", "bucket": "TRANSFER", "date": "2026-04-01", "amount": "5000.00", "type": "transfer", "description": "SCHWAB BROKERAGE MONEYLINK ACH W SCHWAB BROKERAGE MONEYLINK ", "asset_account": "PNC Checking", "destination_account": "Schwab (Stocks/Savings?)", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": true}, {"external_id": "pnc:952673929534609207#1#001#2026-03-31#", "bucket": "CREATE", "date": "2026-03-31", "amount": "2778.70", "type": "deposit", "description": "UNIV PITTSBURGH PAYROLL ACH CRED UNIV PITTSBURGH PAYROLL ACH", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Pitt Salary", "proposed_account_id": null, "proposed_category": "Wages", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#2#001#2026-03-30#", "bucket": "TRANSFER", "date": "2026-03-30", "amount": "9976.38", "type": "transfer", "description": "APPLECARD GSBANK PAYMENT ACH WEB APPLECARD GSBANK PAYMENT AC", "asset_account": "PNC Checking", "destination_account": "Apple Credit Card", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2026-03-30#", "bucket": "CREATE", "date": "2026-03-30", "amount": "124.00", "type": "deposit", "description": "IRS TREAS 310 TAX REF ACH CREDIT IRS TREAS 310 TAX REF ACH C", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "IRS Refund", "proposed_account_id": null, "proposed_category": "Taxes", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#2#001#2026-03-18#", "bucket": "TRANSFER", "date": "2026-03-18", "amount": "100.00", "type": "transfer", "description": "ATM WITHDRAWAL PNCPJ6207 N0318 3 ATM WITHDRAWAL PNCPJ6207 N0", "asset_account": "PNC Checking", "destination_account": "Cash", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2026-03-18#", "bucket": "TRANSFER", "date": "2026-03-18", "amount": "14715.00", "type": "transfer", "description": "ATM DEPOSIT xxxx5883 DEPOSIT 403 ATM DEPOSIT xxxx5883 DEPOSI", "asset_account": "PNC Checking", "destination_account": "Coverdell", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": true}, {"external_id": "pnc:952673929534609207#1#001#2026-03-16#", "bucket": "TRANSFER", "date": "2026-03-16", "amount": "194.65", "type": "transfer", "description": "CITI AUTOPAY PAYMENT ACH WEB-REC CITI AUTOPAY PAYMENT ACH WE", "asset_account": "PNC Checking", "destination_account": "Costco Visa Card", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2026-03-09#", "bucket": "CREATE", "date": "2026-03-09", "amount": "0.07", "type": "deposit", "description": "INTEREST PAYMENT INTEREST PAYMENT", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Interest Income", "proposed_account_id": null, "proposed_category": "Investment: Interest", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2026-03-04#", "bucket": "CREATE", "date": "2026-03-04", "amount": "38.22", "type": "withdrawal", "description": "DUQUESNE LIGHT PAYMENT ACH DEBIT DUQUESNE LIGHT PAYMENT ACH ", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Duquesne Light", "proposed_account_id": null, "proposed_category": "Utilities: Electric", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2026-03-03#", "bucket": "CREATE", "date": "2026-03-03", "amount": "1025.00", "type": "withdrawal", "description": "COMPEER-COMP-CP WEB PMTS ACH WEB COMPEER-COMP-CP WEB PMTS AC", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Compeer Investments", "proposed_account_id": null, "proposed_category": "Rent", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2026-03-02#", "bucket": "TRANSFER", "date": "2026-03-02", "amount": "5755.53", "type": "transfer", "description": "APPLECARD GSBANK PAYMENT ACH WEB APPLECARD GSBANK PAYMENT AC", "asset_account": "PNC Checking", "destination_account": "Apple Credit Card", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2026-02-27#", "bucket": "CREATE", "date": "2026-02-27", "amount": "2778.70", "type": "deposit", "description": "UNIV PITTSBURGH SALARY ACH CREDI UNIV PITTSBURGH SALARY ACH ", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Pitt Salary", "proposed_account_id": null, "proposed_category": "Wages", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2026-02-17#", "bucket": "TRANSFER", "date": "2026-02-17", "amount": "164.55", "type": "transfer", "description": "CITI AUTOPAY PAYMENT ACH WEB-REC CITI AUTOPAY PAYMENT ACH WE", "asset_account": "PNC Checking", "destination_account": "Costco Visa Card", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2026-02-09#", "bucket": "CREATE", "date": "2026-02-09", "amount": "0.09", "type": "deposit", "description": "INTEREST PAYMENT INTEREST PAYMENT", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Interest Income", "proposed_account_id": null, "proposed_category": "Investment: Interest", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2026-02-03#", "bucket": "CREATE", "date": "2026-02-03", "amount": "1025.00", "type": "withdrawal", "description": "COMPEER-COMP-CP WEB PMTS ACH WEB COMPEER-COMP-CP WEB PMTS AC", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Compeer Investments", "proposed_account_id": null, "proposed_category": "Rent", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#3#001#2026-02-02#", "bucket": "TRANSFER", "date": "2026-02-02", "amount": "230.00", "type": "transfer", "description": "ATM WITHDRAWAL PNCPM1896 N0202 3 ATM WITHDRAWAL PNCPM1896 N0", "asset_account": "PNC Checking", "destination_account": "Cash", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#2#001#2026-02-02#", "bucket": "CREATE", "date": "2026-02-02", "amount": "41.63", "type": "withdrawal", "description": "DUQUESNE LIGHT PAYMENT ACH DEBIT DUQUESNE LIGHT PAYMENT ACH ", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Duquesne Light", "proposed_account_id": null, "proposed_category": "Utilities: Electric", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2026-02-02#", "bucket": "TRANSFER", "date": "2026-02-02", "amount": "3107.16", "type": "transfer", "description": "APPLECARD GSBANK PAYMENT ACH WEB APPLECARD GSBANK PAYMENT AC", "asset_account": "PNC Checking", "destination_account": "Apple Credit Card", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2026-01-30#", "bucket": "CREATE", "date": "2026-01-30", "amount": "3032.50", "type": "deposit", "description": "UNIV PITTSBURGH SALARY ACH CREDI UNIV PITTSBURGH SALARY ACH ", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Pitt Salary", "proposed_account_id": null, "proposed_category": "Wages", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2026-01-27#", "bucket": "CREATE", "date": "2026-01-27", "amount": "30.00", "type": "withdrawal", "description": "PITT TUITION PITTPAYMNT ACH WEB PITT TUITION PITTPAYMNT ACH ", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "University of Pittsburgh", "proposed_account_id": null, "proposed_category": "Education", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2026-01-15#", "bucket": "REVIEW", "date": "2026-01-15", "amount": "200.00", "type": "withdrawal", "description": "CHECK 141 xxxxx4572 CHECK 141 xxxxx4572", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "CHECK (payee?)", "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": true}, {"external_id": "pnc:952673929534609207#2#001#2026-01-09#", "bucket": "CREATE", "date": "2026-01-09", "amount": "10.00", "type": "deposit", "description": "OTHER FIN INST ATM SURCHARGE REI OTHER FIN INST ATM SURCHARG", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Don't Know", "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2026-01-09#", "bucket": "CREATE", "date": "2026-01-09", "amount": "0.12", "type": "deposit", "description": "INTEREST PAYMENT INTEREST PAYMENT", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Interest Income", "proposed_account_id": null, "proposed_category": "Investment: Interest", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2026-01-05#", "bucket": "CREATE", "date": "2026-01-05", "amount": "1025.00", "type": "withdrawal", "description": "COMPEER-COMP-CP WEB PMTS ACH WEB COMPEER-COMP-CP WEB PMTS AC", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Compeer Investments", "proposed_account_id": null, "proposed_category": "Rent", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#3#001#2026-01-02#", "bucket": "TRANSFER", "date": "2026-01-02", "amount": "5408.31", "type": "transfer", "description": "APPLECARD GSBANK PAYMENT ACH WEB APPLECARD GSBANK PAYMENT AC", "asset_account": "PNC Checking", "destination_account": "Apple Credit Card", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#2#001#2026-01-02#", "bucket": "TRANSFER", "date": "2026-01-02", "amount": "111.99", "type": "transfer", "description": "ATM WITHDRAWAL MACNVTCOA0N1231 3 ATM WITHDRAWAL MACNVTCOA0N1", "asset_account": "PNC Checking", "destination_account": "Cash", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#2#001#2025-12-31#", "bucket": "CREATE", "date": "2025-12-31", "amount": "48.01", "type": "withdrawal", "description": "DUQUESNE LIGHT PAYMENT ACH DEBIT DUQUESNE LIGHT PAYMENT ACH ", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Duquesne Light", "proposed_account_id": null, "proposed_category": "Utilities: Electric", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-12-31#", "bucket": "CREATE", "date": "2025-12-31", "amount": "2703.46", "type": "deposit", "description": "UNIV PITTSBURGH SALARY ACH CREDI UNIV PITTSBURGH SALARY ACH ", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Pitt Salary", "proposed_account_id": null, "proposed_category": "Wages", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-12-17#", "bucket": "REVIEW", "date": "2025-12-17", "amount": "100.00", "type": "deposit", "description": "ZEL FROM MATTHEW BARRY ZEL FROM MATTHEW BARRY", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Don't Know", "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": true}, {"external_id": "pnc:952673929534609207#1#001#2025-12-16#", "bucket": "REVIEW", "date": "2025-12-16", "amount": "9.10", "type": "deposit", "description": "ZEL FROM Luis Benitez ZEL FROM Luis Benitez", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Don't Know", "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": true}, {"external_id": "pnc:952673929534609207#1#001#2025-12-15#", "bucket": "TRANSFER", "date": "2025-12-15", "amount": "223.79", "type": "transfer", "description": "CITI AUTOPAY PAYMENT ACH WEB-REC CITI AUTOPAY PAYMENT ACH WE", "asset_account": "PNC Checking", "destination_account": "Costco Visa Card", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-12-08#", "bucket": "CREATE", "date": "2025-12-08", "amount": "0.12", "type": "deposit", "description": "INTEREST PAYMENT INTEREST PAYMENT", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Interest Income", "proposed_account_id": null, "proposed_category": "Investment: Interest", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-12-02#", "bucket": "CREATE", "date": "2025-12-02", "amount": "1025.00", "type": "withdrawal", "description": "COMPEER-COMP-CP WEB PMTS ACH WEB COMPEER-COMP-CP WEB PMTS AC", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Compeer Investments", "proposed_account_id": null, "proposed_category": "Rent", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#2#001#2025-12-01#", "bucket": "CREATE", "date": "2025-12-01", "amount": "41.26", "type": "withdrawal", "description": "DUQUESNE LIGHT PAYMENT ACH DEBIT DUQUESNE LIGHT PAYMENT ACH ", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Duquesne Light", "proposed_account_id": null, "proposed_category": "Utilities: Electric", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-12-01#", "bucket": "TRANSFER", "date": "2025-12-01", "amount": "2402.93", "type": "transfer", "description": "APPLECARD GSBANK PAYMENT ACH WEB APPLECARD GSBANK PAYMENT AC", "asset_account": "PNC Checking", "destination_account": "Apple Credit Card", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-11-26#", "bucket": "CREATE", "date": "2025-11-26", "amount": "2703.46", "type": "deposit", "description": "UNIV PITTSBURGH SALARY ACH CREDI UNIV PITTSBURGH SALARY ACH ", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Pitt Salary", "proposed_account_id": null, "proposed_category": "Wages", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-11-17#", "bucket": "TRANSFER", "date": "2025-11-17", "amount": "15.67", "type": "transfer", "description": "CITI AUTOPAY PAYMENT ACH WEB-REC CITI AUTOPAY PAYMENT ACH WE", "asset_account": "PNC Checking", "destination_account": "Costco Visa Card", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#2#001#2025-11-10#", "bucket": "CREATE", "date": "2025-11-10", "amount": "3.00", "type": "deposit", "description": "OTHER FIN INST ATM SURCHARGE REI OTHER FIN INST ATM SURCHARG", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Don't Know", "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-11-10#", "bucket": "CREATE", "date": "2025-11-10", "amount": "0.16", "type": "deposit", "description": "INTEREST PAYMENT INTEREST PAYMENT", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Interest Income", "proposed_account_id": null, "proposed_category": "Investment: Interest", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-11-04#", "bucket": "CREATE", "date": "2025-11-04", "amount": "1025.00", "type": "withdrawal", "description": "COMPEER-COMP-CP WEB PMTS ACH WEB COMPEER-COMP-CP WEB PMTS AC", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Compeer Investments", "proposed_account_id": null, "proposed_category": "Rent", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-11-03#", "bucket": "TRANSFER", "date": "2025-11-03", "amount": "4487.09", "type": "transfer", "description": "APPLECARD GSBANK PAYMENT ACH WEB APPLECARD GSBANK PAYMENT AC", "asset_account": "PNC Checking", "destination_account": "Apple Credit Card", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-10-31#", "bucket": "CREATE", "date": "2025-10-31", "amount": "2703.46", "type": "deposit", "description": "UNIV PITTSBURGH SALARY ACH CREDI UNIV PITTSBURGH SALARY ACH ", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Pitt Salary", "proposed_account_id": null, "proposed_category": "Wages", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-10-16#", "bucket": "CREATE", "date": "2025-10-16", "amount": "94.52", "type": "withdrawal", "description": "DUQUESNE LIGHT PAYMENT ACH DEBIT DUQUESNE LIGHT PAYMENT ACH ", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Duquesne Light", "proposed_account_id": null, "proposed_category": "Utilities: Electric", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-10-15#", "bucket": "TRANSFER", "date": "2025-10-15", "amount": "1194.30", "type": "transfer", "description": "CITI AUTOPAY PAYMENT ACH WEB-REC CITI AUTOPAY PAYMENT ACH WE", "asset_account": "PNC Checking", "destination_account": "Costco Visa Card", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#2#001#2025-10-14#", "bucket": "TRANSFER", "date": "2025-10-14", "amount": "63.00", "type": "transfer", "description": "ATM WITHDRAWAL MACPxx2261N1012 3 ATM WITHDRAWAL MACPxx2261N1", "asset_account": "PNC Checking", "destination_account": "Cash", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-10-08#", "bucket": "CREATE", "date": "2025-10-08", "amount": "0.15", "type": "deposit", "description": "INTEREST PAYMENT INTEREST PAYMENT", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Interest Income", "proposed_account_id": null, "proposed_category": "Investment: Interest", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-10-06#", "bucket": "REVIEW", "date": "2025-10-06", "amount": "80.00", "type": "deposit", "description": "CASH APP*DANE SABO*CAS Oakland C CASH APP*DANE SABO*CAS Oakl", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Don't Know", "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": true}, {"external_id": "pnc:952673929534609207#1#001#2025-10-02#", "bucket": "CREATE", "date": "2025-10-02", "amount": "1025.00", "type": "withdrawal", "description": "COMPEER-COMP-CP WEB PMTS ACH WEB COMPEER-COMP-CP WEB PMTS AC", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Compeer Investments", "proposed_account_id": null, "proposed_category": "Rent", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-10-01#", "bucket": "REVIEW", "date": "2025-10-01", "amount": "10.72", "type": "deposit", "description": "ZEL FROM Luis Benitez ZEL FROM Luis Benitez", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Don't Know", "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": true}, {"external_id": "pnc:952673929534609207#1#001#2025-09-30#", "bucket": "CREATE", "date": "2025-09-30", "amount": "2703.46", "type": "deposit", "description": "UNIV PITTSBURGH SALARY ACH CREDI UNIV PITTSBURGH SALARY ACH ", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Pitt Salary", "proposed_account_id": null, "proposed_category": "Wages", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-09-15#", "bucket": "TRANSFER", "date": "2025-09-15", "amount": "107.31", "type": "transfer", "description": "CITI AUTOPAY PAYMENT ACH WEB-REC CITI AUTOPAY PAYMENT ACH WE", "asset_account": "PNC Checking", "destination_account": "Costco Visa Card", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-09-09#", "bucket": "CREATE", "date": "2025-09-09", "amount": "0.19", "type": "deposit", "description": "INTEREST PAYMENT INTEREST PAYMENT", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Interest Income", "proposed_account_id": null, "proposed_category": "Investment: Interest", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-09-08#", "bucket": "CREATE", "date": "2025-09-08", "amount": "130.00", "type": "withdrawal", "description": "PITT TUITION PITTPAYMNT ACH WEB PITT TUITION PITTPAYMNT ACH ", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "University of Pittsburgh", "proposed_account_id": null, "proposed_category": "Education", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#2#001#2025-09-03#", "bucket": "CREATE", "date": "2025-09-03", "amount": "75.45", "type": "withdrawal", "description": "DUQUESNE LIGHT PAYMENT ACH DEBIT DUQUESNE LIGHT PAYMENT ACH ", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Duquesne Light", "proposed_account_id": null, "proposed_category": "Utilities: Electric", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-09-03#", "bucket": "CREATE", "date": "2025-09-03", "amount": "1025.00", "type": "withdrawal", "description": "COMPEER-COMP-CP WEB PMTS ACH WEB COMPEER-COMP-CP WEB PMTS AC", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Compeer Investments", "proposed_account_id": null, "proposed_category": "Rent", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#3#001#2025-09-02#", "bucket": "TRANSFER", "date": "2025-09-02", "amount": "200.00", "type": "transfer", "description": "ATM WITHDRAWAL PNCPJ6274 N0902 3 ATM WITHDRAWAL PNCPJ6274 N0", "asset_account": "PNC Checking", "destination_account": "Cash", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#2#001#2025-09-02#", "bucket": "TRANSFER", "date": "2025-09-02", "amount": "6923.08", "type": "transfer", "description": "APPLECARD GSBANK PAYMENT ACH WEB APPLECARD GSBANK PAYMENT AC", "asset_account": "PNC Checking", "destination_account": "Apple Credit Card", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-09-02#", "bucket": "REVIEW", "date": "2025-09-02", "amount": "200.00", "type": "deposit", "description": "ATM DEPOSIT xxxx2199 DEPOSIT 560 ATM DEPOSIT xxxx2199 DEPOSI", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "ATM deposit (source?)", "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": true}, {"external_id": "pnc:952673929534609207#1#001#2025-08-29#", "bucket": "CREATE", "date": "2025-08-29", "amount": "2703.46", "type": "deposit", "description": "UNIV PITTSBURGH SALARY ACH CREDI UNIV PITTSBURGH SALARY ACH ", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Pitt Salary", "proposed_account_id": null, "proposed_category": "Wages", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-08-25#", "bucket": "REVIEW", "date": "2025-08-25", "amount": "1100.00", "type": "withdrawal", "description": "WITHDRAWAL xxxxx8118 WITHDRAWAL xxxxx8118", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Withdrawal (where?)", "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": true}, {"external_id": "pnc:952673929534609207#1#001#2025-08-19#", "bucket": "REVIEW", "date": "2025-08-19", "amount": "50.00", "type": "withdrawal", "description": "CAPITAL ONE TRANSFER ACH WEB RT0 CAPITAL ONE TRANSFER ACH WE", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Capital One?", "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": true}, {"external_id": "pnc:952673929534609207#2#001#2025-08-18#", "bucket": "REVIEW", "date": "2025-08-18", "amount": "14.77", "type": "deposit", "description": "CAPITAL ONE TRANSFER ACH WEB PAY CAPITAL ONE TRANSFER ACH WE", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Capital One?", "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": true}, {"external_id": "pnc:952673929534609207#1#001#2025-08-18#", "bucket": "REVIEW", "date": "2025-08-18", "amount": "2503.39", "type": "deposit", "description": "CAPITAL ONE TRANSFER ACH WEB PAY CAPITAL ONE TRANSFER ACH WE", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Capital One?", "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": true}, {"external_id": "pnc:952673929534609207#1#001#2025-08-15#", "bucket": "TRANSFER", "date": "2025-08-15", "amount": "2505.53", "type": "transfer", "description": "CITI AUTOPAY PAYMENT ACH WEB-REC CITI AUTOPAY PAYMENT ACH WE", "asset_account": "PNC Checking", "destination_account": "Costco Visa Card", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-08-11#", "bucket": "TRANSFER", "date": "2025-08-11", "amount": "22000.00", "type": "transfer", "description": "CARVANA PAYOUT CVNA x6542 CORPOR CARVANA PAYOUT CVNA x6542 C", "asset_account": "PNC Checking", "destination_account": "Illiquid Assets", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-08-08#", "bucket": "CREATE", "date": "2025-08-08", "amount": "0.04", "type": "deposit", "description": "INTEREST PAYMENT INTEREST PAYMENT", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Interest Income", "proposed_account_id": null, "proposed_category": "Investment: Interest", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-08-06#", "bucket": "CREATE", "date": "2025-08-06", "amount": "47.39", "type": "withdrawal", "description": "DUQUESNE LIGHT PAYMENT ACH DEBIT DUQUESNE LIGHT PAYMENT ACH ", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Duquesne Light", "proposed_account_id": null, "proposed_category": "Utilities: Electric", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#2#001#2025-08-04#", "bucket": "CREATE", "date": "2025-08-04", "amount": "1029.95", "type": "withdrawal", "description": "YSI*Compeer Investment 412-xxx57 YSI*Compeer Investment 412-", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Compeer Investments", "proposed_account_id": null, "proposed_category": "Rent", "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-08-04#", "bucket": "CREATE", "date": "2025-08-04", "amount": "0.43", "type": "deposit", "description": "YARDI PENNY TEST ACCTVERIFY ACH YARDI PENNY TEST ACCTVERIFY ", "asset_account": "PNC Checking", "destination_account": null, "proposed_account": "Don't Know", "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}, {"external_id": "pnc:952673929534609207#1#001#2025-08-01#", "bucket": "TRANSFER", "date": "2025-08-01", "amount": "3218.03", "type": "transfer", "description": "APPLECARD GSBANK PAYMENT ACH WEB APPLECARD GSBANK PAYMENT AC", "asset_account": "PNC Checking", "destination_account": "Apple Credit Card", "proposed_account": null, "proposed_account_id": null, "proposed_category": null, "proposed_budget": null, "suggestions": [], "review": false}]};
const BUDGETS = ["", "Needs", "Wants", "Savings"];
const rows = PLAN.rows || [];
// Per-row decision state, keyed by external_id (the stable id).
const state = {};
for (const r of rows) {
const isAuto = r.bucket === "CREATE" || r.bucket === "TRANSFER";
state[r.external_id] = {
approved: isAuto, // auto rows default-approved; clarity not
account: r.proposed_account || "",
account_id: (r.proposed_account_id != null) ? r.proposed_account_id : null,
category: r.proposed_category || "",
budget: r.proposed_budget || "",
comment: ""
};
}
function esc(s) {
return String(s == null ? "" : s)
.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");
}
function budgetOptions(sel) {
return BUDGETS.map(b =>
`<option value="${esc(b)}"${b===sel?" selected":""}>${esc(b||"—")}</option>`
).join("");
}
function decisionCell(id) {
const s = state[id];
return `<div class="toggle" data-id="${esc(id)}">
<button class="d-ok${s.approved?" on-ok":""}">Approve</button>
<button class="d-no${!s.approved?" on-no":""}">Deny</button></div>`;
}
function editableRow(r) {
const id = r.external_id, s = state[id];
const pill = r.bucket === "UNMATCHED"
? '<span class="pill unmatched">UNMATCHED</span>'
: r.bucket === "TRANSFER"
? '<span class="pill transfer">TRANSFER</span>'
: (r.review ? '<span class="pill review">REVIEW</span>'
: '<span class="pill create">CREATE</span>');
const canon = r.bucket === "TRANSFER"
? `Transfer &rarr; <b>${esc(r.destination_account || "?")}</b>`
: (r.proposed_account
? `Canonical account &rarr; <b>${esc(r.proposed_account)}</b>` +
(r.proposed_account_id != null
? ` <span style="color:#888">#${esc(r.proposed_account_id)}</span>`
: ` <span style="color:#888">(new)</span>`)
: `Canonical account &rarr; <b style="color:#c0392b">unset</b> ` +
`<span style="color:#888">&mdash; set it below</span>`);
let sugg = "";
if (r.suggestions && r.suggestions.length) {
sugg = `<div class="sugg">did you mean: ` +
r.suggestions.map(x =>
`<a data-id="${esc(id)}" data-acct="${esc(x)}">${esc(x)}</a>`
).join(", ") + `</div>`;
}
return `<tr data-id="${esc(id)}" class="${r.bucket==="TRANSFER"?"is-transfer":""}">
<td>${esc(r.date)}</td>
<td class="amt">${esc(r.amount)}</td>
<td class="desc">${esc(r.description)}
<small>${esc(r.asset_account)} ${pill}</small>
<div class="canon" style="margin-top:3px;font-size:12px">${canon}</div>${sugg}</td>
<td><input type="text" class="f-account" value="${esc(s.account)}"
placeholder="canonical account"></td>
<td><input type="text" class="f-category" value="${esc(s.category)}"
placeholder="category"></td>
<td><select class="f-budget">${budgetOptions(s.budget)}</select></td>
<td><input type="text" class="f-comment" value="${esc(s.comment)}"
placeholder="note"></td>
<td>${decisionCell(id)}</td></tr>`;
}
function readonlyRow(r) {
let tgt = "";
if (r.bucket === "TRANSFER") tgt = "→ " + esc(r.destination_account || "?");
else if (r.proposed_account) tgt = "→ " + esc(r.proposed_account) +
(r.proposed_account_id != null ? " #" + esc(r.proposed_account_id)
: " (new)");
else if (r.bucket === "SKIP-dup") tgt = "dup";
const cls = {"SKIP-dup":"dup","UNMATCHED":"unmatched","TRANSFER":"transfer",
"REVIEW":"review","CREATE":"create"}[r.bucket] || "";
return `<tr class="readonly${r.bucket==="TRANSFER"?" is-transfer":""}">
<td>${esc(r.date)}</td><td class="amt">${esc(r.amount)}</td>
<td>${esc(r.type)}</td><td>${esc(r.description)}</td>
<td><span class="pill ${cls}">${esc(r.bucket)}</span></td>
<td>${tgt}</td></tr>`;
}
function render() {
const clarity = rows.filter(r =>
r.bucket === "UNMATCHED" || r.bucket === "REVIEW");
const auto = rows.filter(r =>
r.bucket === "CREATE" || r.bucket === "TRANSFER");
const tbC = document.getElementById("tb-clarity");
const tbA = document.getElementById("tb-auto");
const tbAll = document.getElementById("tb-all");
tbC.innerHTML = clarity.map(editableRow).join("");
tbA.innerHTML = auto.map(editableRow).join("");
tbAll.innerHTML = rows.map(readonlyRow).join("");
document.getElementById("empty-clarity").hidden = clarity.length > 0;
document.getElementById("empty-auto").hidden = auto.length > 0;
const nApproved = Object.values(state).filter(s => s.approved).length;
document.getElementById("counts").innerHTML =
`<span><b>${rows.length}</b> rows</span>` +
`<span><b>${clarity.length}</b> need clarity</span>` +
`<span><b>${auto.length}</b> auto</span>` +
`<span><b>${rows.filter(r=>r.bucket==="SKIP-dup").length}</b> dup</span>` +
`<span><b>${nApproved}</b> approved</span>`;
}
// --- event wiring (delegated, so re-render keeps working) ------------------
document.body.addEventListener("input", e => {
const tr = e.target.closest("tr[data-id]");
if (!tr) return;
const id = tr.dataset.id, s = state[id];
if (e.target.classList.contains("f-account")) {
s.account = e.target.value; s.account_id = null; // typed name => re-resolve
} else if (e.target.classList.contains("f-category")) {
s.category = e.target.value;
} else if (e.target.classList.contains("f-budget")) {
s.budget = e.target.value;
} else if (e.target.classList.contains("f-comment")) {
s.comment = e.target.value;
}
});
document.body.addEventListener("click", e => {
// suggestion chip -> fill account
if (e.target.matches(".sugg a")) {
const id = e.target.dataset.id;
state[id].account = e.target.dataset.acct;
state[id].account_id = null;
render();
return;
}
const tog = e.target.closest(".toggle");
if (tog) {
const id = tog.dataset.id;
if (e.target.classList.contains("d-ok")) state[id].approved = true;
else if (e.target.classList.contains("d-no")) state[id].approved = false;
render();
}
});
document.getElementById("approveAuto").addEventListener("click", () => {
for (const r of rows) {
if (r.bucket === "CREATE" || r.bucket === "TRANSFER")
state[r.external_id].approved = true;
}
render();
});
document.getElementById("export").addEventListener("click", () => {
// Only emit rows the user can act on (clarity + auto). SKIP-dup rows are
// read-only context and are never posted, so they stay out of decisions.
const out = {};
for (const r of rows) {
if (r.bucket === "SKIP-dup") continue;
const s = state[r.external_id];
out[r.external_id] = {
approved: !!s.approved,
account: s.account || null,
account_id: (s.account_id != null) ? s.account_id : null,
category: s.category || null,
budget: s.budget || null,
comment: s.comment || ""
};
}
const blob = new Blob([JSON.stringify(out, null, 2)],
{ type: "application/json" });
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url; a.download = "decisions.json";
document.body.appendChild(a); a.click(); a.remove();
setTimeout(() => URL.revokeObjectURL(url), 1000);
});
render();
</script>
</body>
</html>