PTR Tax Prep · Phase 1 handoff · Phase 2 normalized

Reference markup — My Inbox & Case Detail

Every component of the two core views as copy-paste HTML with documented .tp-* classes, all states enumerated, mapped to suggested Django partials with the HTMX seams marked. Companion: reference.css (the class contract) · index.html (the interactive kit) · app.js (business-logic spec). Roadmap: root Product Surface Plan.html.

Conventions — matched to the priority_hub codebase:

1 · Status system

Status pillpartial _status_pill.html — context: label, groupclasses .tp-pill .tp-pill--{group}
The 8 tint/ink groups — tokens --case-{group}-bg/-fg in package/brand.css (shipped July 17)
donereadypendingholdstoppedinfobusinessreview
Working case-level statuses — all 25 (inbox list + filter dropdown)
a) Pending Billingb) Not Startedc) Pending Documentsd) Drafts / Pen Reviewe) Pending Signaturesf) Rejectedg) Pending Filingh) Reso Reviewi) Do Not Filej) Cold Casek) Filedl) Dead CaseTri-CitiesReady for ReviewAll Docs InFuture TPPending THSPCOMPending ResoSeverancePending StartIn ProgressRADNo TP SoldDelinquent
Finalized per-year statuses — all 17 (Case Detail year table + tracking form)
Reviewed for Filing - Tax Prep DoneClient FiledQA ReviewedAll Docs InReturn Filed - Additional TP NeededPending Reso Review for FilingPending Docs/InfoPending SignaturesReviewed for Filling - State IncompleteDraft - Information NeededPending BillingPending QA ReviewLTR No Tax Prep Until RequiredLTR Future Tax PrepNo Filing RequirementRejectedNon-Responsive Client - Tax Prep Suspended
Best-judgment grouping. The finalized-17 grouping matches the kit's shipped color logic exactly. Recolored July 17: the in-between states — Return Filed - Additional TP Needed and Pending Reso Review for Filing — moved to the blue info group; the rule is gray = no action, red = negative action, amber = pending/waiting, blue = in-between, green = done. The working-25 grouping is a proposal — the wireframe only styled 10 of them (rest fell back to gray). E-001.7 reconciled best-judgment (July 17): the STATUS filter uses the finalized 17 (matches per-year statuses) and the Overall TP pill displays the working value mapped through WORKING_TO_FINAL (one re-mappable table in app.js / the templatetag; raw Logics value in the pill tooltip). The 25→17 mapping below needs business sign-off. the group → status map is one table in _status_pill.html's templatetag, so re-mapping is a one-line-per-status change.
Read-only Logics status · chips · doc-progress dotspartials _doc_dots.html · _scope_chips.html
Case Status from Logics — always read-only
Reso ReviewA/S Completed
Type + state chips · bookkeeping-sold badge
Tax Prep RequestAS Casework TicketFuture PrepPaymentsNCBK
Scope chips — personal / business / none
Personal 22–25Business 23–24No business scope
Doc-progress dots — order is Intuit Link → Docs In → Signatures; states done / part / empty

2 · My Inbox

Filter barpartial _filter_bar.htmlstatus list finalized-17 (E-001.7 reconciled July 17) — matches per-year statuseshtmx seam whole bar is a form: each control hx-gets the list view, hx-target="#tp-list", hx-include="closest .tp-filters"; search debounces keyup changed delay:300ms
Quick tabspartial _quick_tabs.html — context: tabs (key, label, count, warn), active_keyhtmx seam hx-get the list with ?quick={key}, target #tp-liststates default · active · warn+active
E-003.4 / E-005.7: the overdue threshold (14 vs 30 days) and the urgency override's UI home (possible 8th tab) are open decisions — the tab list must come from the view context, not be hard-coded.
Group header + case rows — all statespartials _group_header.html · _case_row.htmlhtmx seams row: hx-get Case Detail → hx-target="#tp-tab-region" + hx-push-url; star/flag: hx-posthx-target="closest .tp-row" hx-swap="outerHTML"alpine checkbox multi-select is client state (x-model on a selection array)
Awaiting You5action's on your desk — start, draft, or finalize
#90938
PHAISON, Kevin
Tax Prep RequestMAPersonal 22–24Business 22–24
Tax debt$51,000
All Docs In
Fee paid$7,750
3d agoDec 28
#117120
RIVERS, Joe
Tax Prep RequestSCPersonal 23Business 23
Tax debt$25,000
Pending QA Review
Fee paid$200
3d agoDec 28
#92170
JONES, Amanda
Future PrepCAPersonal 25No business scope
Tax debt
Pending Docs/Info
Fee paid$4,801
3mo agoSep 25
#163207
NIMMO, Stephen
AS Casework TicketNCBKPersonal 22–25Business 22–25
Tax debt$92,000
Pending Docs/Info
Fee paid$16,000
2d agoDec 29
#113802
KLEEKPO, Prince
PaymentsMDNo personal scopeNo business scope
Tax debt$22,000
Pending Billing
Fee paid$250
1mo agoNov 3
Empty state (_empty_state.html — context: title, body, optional icon block)
No cases match these filters
Clear a filter to see more of your caseload.
Doc-progress legend (_doc_legend.html)
Doc progress Complete In progress Not doneOrderIntuit Link → Docs In → Signatures

3 · Case Detail

Case header + actionspartial _case_header.htmlnote Case Status is read-only from Logics; "Remind client" / "Request docs" are undefined (E-004.6/.7) — render disabled or behind a flag until spec'd

NIMMO, Stephen #163207

Case Status · LogicsReso Review
Overall TP StatusPending Docs/Info
TypeAS Casework Ticket NC
BookkeepingSold
Tax years & status tablepartial _year_status_table.html (region #tp-year-table)htmx seams status select: hx-post on change → swap #tp-year-table; add-state select + add-year form: hx-post → same swapmodel per-year × return-type (personal/business) × jurisdiction (federal + per-state) — E-001.2/E-003.1

Tax years & status

2
2024
PPersonal return
Federal
NC
BBusiness return
Federal
2025New
PPersonal return
Federal
E-001.2 / E-003.1Each return tracks a federal status plus a status per state. The tracking form's Agency + State(s) map straight onto these lines. Select tint = the status's group class (.tp-ystat--{group}).
Documents & Signatures · Notespartials _doc_progress.html · _notes_card.htmlhtmx seams action buttons hx-post → swap the card body; note tabs hx-get the list; add-note hx-post hx-swap="beforeend" on the list + clear input

Documents & Signatures

1/3
Intuit organizer link
Organizer sent to client
Client documents
Some documents received · last reminder Dec 29
Signatures
Signature not requested yet
E-004.1"Via mailed" signature path flagged for confirmation before a DocuSign-only flow is hard-coded.

Notes

You · Dec 29
Left voicemail re: missing W-2s. Will follow up Monday.
Front desk · earlier
Client called to confirm appointment time.
E-001.5Client-contact and tax-prep notes are split so prep notes aren't buried in call logs.
Financial · Contact attempts · Linked systemspartials _financial_card.html · _contact_attempts.html · _linked_systems.htmlnote IRS/State split source unconfirmed (E-005.9); attempts ring % is an inline style driven by the server value

Financial

sample
IRS debt
$62,600
State debt
$29,400
Total tax debt$92,000
Total fees$16,000
Fee paid in$16,000
Fee due$0
✓ Paid in full Balance due $2,300
E-005.9IRS/State split is sample data — source system unconfirmed.

Contact attempts

3
3 attempts
Within normal range
E-003.5Feeds the "Non-Responsive Client" suggested status once a threshold is hit.

Linked systems

Formstack Personal OrganizerLinked
Intuit LinkNot sent
Zapier · TP TrackingE-003.1Active
E-004.5Zapier TP Tracking shown pending the keep-or-retire decision.

4 · App shell

Sidebar nav + case tab barpartials components/sidebar_nav.html · partials/case_tabs.htmlhtmx seam nav + tabs hx-get the view into #tp-tab-region with hx-push-url; open-tab list is server session state so tabs survive reloadstates nav: default · hover · active · with count — tab: pinned · active · closable
Workspace
My Inbox
#163207 · NIMMO, Stephen×
#90938 · PHAISON, Kevin×
#tp-tab-region — views load here

5 · Form field vocabulary

Fields + statesscope the shared field kit the three tracking forms build on — full form specs (fields, rules, HTMX contract): §8, forms.htmlstates default · error (.tp-fld.err) · read-only/locked
Optional helper text.
Select a status.
Assign the follow-up.
#163207 · NIMMO, Stephen
Pulled from the open case — no lookup needed.
NCSC

6 · Django partial map & seam contract

BlockSuggested partialHTMX seam
Inbox viewtax_prep/inbox.html (extends the app base)Full page; owns #tp-list + #tp-tab-region
Filter barpartials/_filter_bar.htmlControls hx-get list view → #tp-list, hx-include siblings; search delay:300ms
Quick tabspartials/_quick_tabs.htmlhx-get ?quick={key}#tp-list
Group + rows listpartials/_case_list.html (loops _group_header.html + _case_row.html)The swap payload for every filter/tab change
Case rowpartials/_case_row.htmlRow hx-get detail → #tp-tab-region + hx-push-url; star/flag hx-postclosest .tp-row outerHTML; checkbox = Alpine
Status pillpartials/_status_pill.htmlNone (render-only); group map lives in one templatetag
Doc dots / scope chips / legend / empty state_doc_dots.html · _scope_chips.html · _doc_legend.html · _empty_state.htmlNone (render-only)
Case Detailtax_prep/case_detail.html — served as a fragment for #tp-tab-region, full page on direct URL (HX-Request header check)Composes the cards below
Case headerpartials/_case_header.htmlAction buttons hx-post; undefined actions disabled (E-004.6/.7)
Year/status tablepartials/_year_status_table.htmlAll writes hx-post → swap #tp-year-table
Docs & signaturespartials/_doc_progress.htmlButtons hx-post → swap card body
Financial / attempts / linked systems_financial_card.html · _contact_attempts.html · _linked_systems.htmlRender-only (data from Logics sync)
Notespartials/_notes_card.htmlTabs hx-get#tp-notes; add hx-post beforeend
Shellcomponents/header.html · components/sidebar_nav.html · partials/case_tabs.htmlNav/tabs hx-get#tp-tab-region + hx-push-url; tab list in session
Modals (3 tracking forms)§8 (forms.html): partials/_tracking_form.html · _handpull_form.html · _bk_form.html (+ _form_field.html, _bk_points_bar.html)hx-get open → #tp-modal + showModal() · delayed inline validation · submit → close + toast + owning-region swap
Open items that gate build-out (owners business-side, tracked in the kit's plan notes): E-001.7 status reconciliation (25↔17) · E-003.4 overdue threshold · E-005.7 urgency override placement · E-004.6/.7 remind/request behavior · E-005.9 debt-split source · E-004.1 mailed-signature path.

7 · Class contract — the Phase-2 collapse map (applied July 17)

The custom-CSS budgetRule (Product Surface Plan · Phase 2): 1) DaisyUI component first · 2) used by 2+ apps → package/product.css (shared layer, v0.2) · 3) app-prefixed CSS only for the truly bespoke, tokens never hex. Target: ~30 surviving .tp-* classes.
.tp-* class(es)Collapses onto (Phase 2)Notes
tp-btn + --primary/--ghost/--smDaisyUI btn btn-primary / btn-ghost / btn-smDrops the class entirely
tp-inp · tp-ta · tp-fsel · tp-add-stateinput / textarea / select (+ select-sm)2px borders + 4/4/8 radii from the theme; dashed add-state stays a thin modifier
tp-chk · tp-chkbox · tp-chklinecheckbox checkbox-primary + labelReal <input type="checkbox"> — also fixes a11y
tp-pill + 8 group modifiersDaisyUI badge shape + --case-{group}-bg/-fg tokensMoves to package/product.css — shared with any status-bearing surface
tp-qtab · tp-ntab · tp-ptabtabs / btn btn-xs patterns (per the app's division-filter tiles)Pinned-tab pin icon stays custom
tp-toggle · tp-segchoice · tp-seg-togs · tp-ytog · tp-optchipbtn group / join + btn-activeSelected-state colors from theme tokens
tp-card (+ .ch/.cb/.note) · tp-filterscard / bg-base-100 border border-base-300 rounded-… utility patternMatches the app's existing card idiom
Modal shells (Phase 3 forms)DaisyUI modal + <dialog>As the app already does (.modal[open])
tp-msel · tp-chip · tp-fld error/hint statesPartly — badge chips + DaisyUI validator classesMulti-select shell likely survives as .tp-msel
tp-empty · toast · tp-legendpackage/product.css (shared vocabulary)The app hand-built its own (.og-empty-state, .og-toast) — converge, don't copy
tp-row grid + states · tp-who/tp-debt/tp-fee/tp-upd/tp-docpStays .tp-*Bespoke responsive case-row grid — no DaisyUI equivalent
tp-yr-row · tp-juris-line(s) · tp-ret-head · tp-rl-tag · tp-ystat + tintsStays .tp-*Year × return-type × jurisdiction table — the product's core bespoke component
tp-dot · tp-scope · tp-ro-badge · tp-ctype · tp-bk-badgeStays — candidates for product.css if a second surface needs themTokens only, no hex, per budget rule 3
tp-ghead · tp-cd-* · tp-doc-row · tp-fin · tp-att · tp-ls-* · tp-note-*Stays .tp-* (layout-only, thin)Mostly flex/grid scaffolding around DaisyUI pieces

8 · Form specs — the three tracking modals (shipped July 17)

Sibling specimen: forms.html — per-form field tables (name, type, required, conditional-on, error copy lifted verbatim from app.js), copy-paste modal markup on DaisyUI modal + native <dialog> (the §7 collapse, applied — the interactive kit now runs the same <dialog> shells, logic untouched), and the HTMX contract: open as fragment → #tp-modal + showModal(), delayed inline validation, submit → close + toast + owning-region swap (#tp-year-table / case row / transcripts card / bookkeeping card). Bookkeeping points recompute server-side — BK_PTS weights are sample values, backend-configured.