finances/merchant_map.json
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

357 lines
8.8 KiB
JSON

{
"_comment": "Staging merchant map. First match wins; specific before generic. account_id filled at resolve. category=safe existing default only; review:true => account is firm but Dane sets category+budget (Needs/Wants/Savings) per transaction.",
"_special_nonmerchant": {
"ach_7552_payment": "'ACH DEPOSIT INTERNET TRANSFER FROM ACCOUNT ENDING IN 7552' on Apple Card => TRANSFER PNC Checking -> Apple Credit Card.",
"daily_cash_adjustment": "'DAILY CASH ADJUSTMENT' => Apple Card Daily Cash; the ADJUSTMENT is NEGATIVE cashback income (clawback on a return). Sign follows amount; revenue acct 'Apple Card Cashback'."
},
"rules": [
{
"match": "DUQUESNE LIGHT",
"account_name": "Duquesne Light",
"category": "Utilities: Electric",
"budget": "Needs",
"type": "withdrawal"
},
{
"match": "UNIV PITTSBURGH (PAYROLL|SALARY)",
"regex": true,
"account_name": "Pitt Salary",
"category": "Wages",
"type": "deposit"
},
{
"match": "INTEREST PAYMENT",
"account_name": "Interest Income",
"category": "Investment: Interest",
"type": "deposit"
},
{
"match": "IRS TREAS 310",
"account_name": "IRS Refund",
"category": "Taxes",
"type": "deposit"
},
{
"match": "PITT TUITION",
"account_name": "University of Pittsburgh",
"category": "Education",
"type": "withdrawal"
},
{
"match": "DAILY CASH ADJUSTMENT",
"account_name": "Apple Card Cashback",
"category": "Other",
"type": "deposit",
"review": true
},
{
"match": "ATM SURCHARGE REIMB",
"account_name": "Don't Know",
"type": "deposit"
},
{
"match": "YARDI PENNY TEST",
"account_name": "Don't Know",
"type": "deposit",
"review": true
},
{
"match": "VENMO CASHOUT|CASH APP|ZEL FROM",
"regex": true,
"account_name": "Don't Know",
"type": "deposit",
"review": true
},
{
"match": "ATM DEPOSIT",
"account_name": "Don't Know",
"type": "deposit",
"review": true
},
{
"match": "AMZN|AMAZON",
"regex": true,
"account_name": "Amazon",
"review": true,
"type": "withdrawal",
"account_id": 720
},
{
"match": "EBAY",
"account_name": "eBay",
"review": true,
"type": "withdrawal",
"account_id": 622
},
{
"match": "SVDP",
"account_name": "St. Vincent de Paul",
"review": true,
"type": "withdrawal"
},
{
"match": "WINE AND SPIRITS",
"account_name": "Fine Wine & Good Spirits",
"review": true,
"type": "withdrawal"
},
{
"match": "COMCAST|XFINITY",
"regex": true,
"account_name": "Comcast / Xfinity",
"review": true,
"type": "withdrawal",
"account_id": 585
},
{
"match": "LIBERTY MUTUAL",
"account_name": "Liberty Mutual",
"review": true,
"type": "withdrawal",
"account_id": 871
},
{
"match": "JEGS",
"account_name": "JEGS",
"review": true,
"type": "withdrawal",
"account_id": 887
},
{
"match": "APEX RACE PARTS",
"account_name": "Apex Race Parts",
"review": true,
"type": "withdrawal",
"account_id": 594
},
{
"match": "ADVANCE AUTO",
"account_name": "Advance Auto Parts",
"review": true,
"type": "withdrawal"
},
{
"match": "SUBARU OF SOUTH HILLS",
"account_name": "Subaru of South Hills",
"review": true,
"type": "withdrawal",
"account_id": 555
},
{
"match": "ALLEGHENY ARMS",
"account_name": "Allegheny Arms",
"category": "Recreation: Firearms",
"review": true,
"type": "withdrawal",
"account_id": 657
},
{
"match": "WILLI S SKI|WILLIS SKI",
"regex": true,
"account_name": "Willi's Ski Shop",
"category": "Recreation: Snowboarding",
"review": true,
"type": "withdrawal"
},
{
"match": "CASTLE SHANNON SHOP",
"account_name": "Shop 'n Save",
"category": "Groceries",
"budget": "Needs",
"type": "withdrawal",
"account_id": 572
},
{
"match": "MARKET DISTRICT|GIANT EAGLE",
"regex": true,
"account_name": "Giant Eagle",
"category": "Groceries",
"budget": "Needs",
"type": "withdrawal",
"account_id": 592
},
{
"match": "KUHNS",
"account_name": "Kuhn's Market",
"category": "Groceries",
"budget": "Needs",
"type": "withdrawal",
"account_id": 563
},
{
"match": "COMPEER",
"account_name": "Compeer Investments",
"category": "Rent",
"budget": "Needs",
"type": "withdrawal"
},
{
"match": "UPMC STUDENT INSURANCE",
"account_name": "UPMC Student Insurance",
"category": "Medical",
"budget": "Needs",
"type": "withdrawal",
"account_id": 612
},
{
"match": "SPIEGEL FREEDMAN",
"account_name": "Spiegel Freedman Psychological Associates",
"category": "Medical",
"budget": "Needs",
"type": "withdrawal"
},
{
"match": "APPLE.COM",
"account_name": "Apple",
"category": "Subscriptions",
"budget": "Wants",
"type": "withdrawal"
},
{
"match": "CLAUDE.AI",
"account_name": "Claude.ai",
"category": "Subscriptions",
"budget": "Wants",
"type": "withdrawal"
},
{
"match": "OPENAI",
"account_name": "OpenAI",
"category": "Subscriptions",
"budget": "Wants",
"type": "withdrawal",
"account_id": 576
},
{
"match": "YOUTUBE TV",
"account_name": "YouTube TV",
"category": "Subscriptions",
"budget": "Wants",
"type": "withdrawal"
},
{
"match": "PEACOCK",
"account_name": "Peacock",
"category": "Subscriptions",
"budget": "Wants",
"type": "withdrawal",
"account_id": 607
},
{
"match": "MCDONALD",
"account_name": "McDonald's",
"category": "Restaurants",
"budget": "Wants",
"type": "withdrawal",
"account_id": 580
},
{
"match": "PAMELA.?.?S? ?DINER|PAMELA'SDINER",
"regex": true,
"account_name": "Pamela's Diner",
"category": "Restaurants",
"budget": "Wants",
"type": "withdrawal"
},
{
"match": "PRIMANTI BROS",
"account_name": "Primanti Bros",
"category": "Restaurants",
"budget": "Wants",
"type": "withdrawal",
"account_id": 747
},
{
"match": "MINEO'S|MINEOS",
"regex": true,
"account_name": "Mineo's Pizza",
"category": "Restaurants",
"budget": "Wants",
"type": "withdrawal"
},
{
"match": "DAVE AND ANDY|DAVE & ANDY",
"regex": true,
"account_name": "Dave & Andy's",
"category": "Restaurants",
"budget": "Wants",
"type": "withdrawal",
"account_id": 769
},
{
"match": "STARBUCKS",
"account_name": "Starbucks",
"category": "Coffee",
"budget": "Wants",
"type": "withdrawal",
"account_id": 611
},
{
"match": "TAZZA D|ENRICO'S TAZZA",
"regex": true,
"account_name": "Tazza D'Oro",
"category": "Coffee",
"budget": "Wants",
"type": "withdrawal"
},
{
"match": "LA GOURMANDINE",
"account_name": "La Gourmandine",
"category": "Coffee",
"budget": "Wants",
"type": "withdrawal",
"account_id": 595
},
{
"match": "NEEDLE & BEAN|NEEDLE & BEAN|NEEDLE AND BEAN",
"regex": true,
"account_name": "Needle & Bean",
"category": "Coffee",
"budget": "Wants",
"type": "withdrawal",
"account_id": 660
},
{
"match": "SHEETZ",
"account_name": "Sheetz",
"category": "Auto: Fuel",
"type": "withdrawal",
"account_id": 566
},
{
"match": "BP#9604786|UKANI BRO",
"regex": true,
"account_name": "BP",
"category": "Auto: Fuel",
"type": "withdrawal"
},
{
"match": "24 7 TRAVEL ST",
"account_name": "24/7 Travel Store",
"category": "Auto: Fuel",
"type": "withdrawal"
},
{
"match": "PITT PARKING",
"account_name": "Pitt Parking",
"category": "Auto: Parking",
"type": "withdrawal",
"account_id": 870
},
{
"match": "T2\\* MT LEBANON",
"regex": true,
"account_name": "Mt Lebanon Parking",
"category": "Auto: Parking",
"type": "withdrawal"
},
{
"match": "GLOSS\\* JAYME|XCEPTIONAL STYLE",
"regex": true,
"account_name": "Xceptional Style",
"category": "Personal Care",
"budget": "Wants",
"type": "withdrawal"
}
]
}