| 05-visibility-and-client-portal |
03 |
portal |
| portal |
| tickets |
| comments |
| conversation |
| payment-scaffold |
| subscriber |
|
| phase |
provides |
| 03-operational-modules |
Ticket model, TicketService with createTicket and status transitions |
|
| phase |
plan |
provides |
| 05-visibility-and-client-portal |
02 |
Portal auth (withPortalAuth, subscriberId in session), PortalService |
|
|
| TicketComment model for conversation threads |
| Portal ticket service (createPortalTicket, listPortalTickets, getPortalTicket, addTicketComment) |
| ensurePortalUser shadow User pattern for subscriber->User FK bridge |
| Portal ticket API routes (list, create, detail, comments) |
| Payment scaffold endpoint with outstanding balance and instructions |
|
| 05-04 (network monitoring may reference tickets) |
| 05-05 (e2e tests) |
|
| added |
patterns |
|
|
| ensurePortalUser shadow User for subscriber->User FK bridge |
| TicketComment append-only conversation thread on tickets |
| Payment scaffold returning balance + instructions (gateway deferred to v2) |
|
|
| created |
modified |
| prisma/schema.prisma (TicketComment model, paymentInstructions field) |
| src/lib/services/portal-ticket-service.ts |
| src/app/api/portal/tickets/route.ts |
| src/app/api/portal/tickets/[id]/route.ts |
| src/app/api/portal/tickets/[id]/comments/route.ts |
| src/app/api/portal/payments/coming-soon/route.ts |
| src/lib/__tests__/portal-ticket-service.test.ts |
|
|
|
| ensurePortalUser creates shadow User with CLIENT role and portal-{accountNumber}@portal.local email -- bridges Subscriber auth to User FK on Ticket.createdById |
| Portal tickets use source=SUBSCRIBER (not PORTAL) -- TicketSource enum has STAFF/SUBSCRIBER, SUBSCRIBER is semantically correct |
| TicketComment is append-only (no edits/deletes) -- conversation integrity preserved |
| Closed tickets reject new comments -- enforced at service layer |
| Payment scaffold computes outstanding balance in JS from SENT/PARTIAL/OVERDUE invoices -- same pattern as other derived aggregations |
|
| Shadow User pattern: portal subscribers get lazy-created User records for FK constraints |
| Ticket conversation threads via TicketComment with chronological ordering |
|
5min |
2026-03-05 |