Backend:
- New GET /api/v1/me/household endpoint. Returns the resident's
household (with members + barangay + assigned DOP) or { household:
null }. Used by the wizard to gate-keep the onboarding flow.
Frontend (customer-web/):
- /onboarding — 5-step wizard (Address+map, Size, Proof, Members,
Review). Submits POST /households then uploads proof + adds
members in sequence. Server-side guard redirects to /household
when one already exists.
- /household — full status view:
- Pending: live polling every 30s, "Refresh" button, status pill
- Approved: success state, link back to dashboard
- Rejected: shows reviewer's reason, ResubmitCard re-uploads
proof and flips status back to pending automatically
- Members card with add/remove (head is protected)
- /home now checks household state server-side:
- No household → redirect /onboarding
- Pending/rejected → status banner + link
- Approved → full dashboard with QR balance + next pickup +
quick-action grid
- New components:
- MapPicker — click-to-place pin via Leaflet (CDN-loaded), drag
to fine-tune, returns {lat, lng}
- ProofUpload — drag-and-drop with image preview, jpg/png/pdf,
8MB cap, file size + type validation
- API client adds me.household() and reuses existing household.*
+ uploadProof multipart helpers
Build: 12 routes compile clean, biggest first-load JS 122 kB
(/register), Wizard + Household views 5–7 kB each.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>