- 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
357 lines
8.8 KiB
JSON
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"
|
|
}
|
|
]
|
|
} |