Files
Verde-Web/app/Http/Controllers/Api/V1/Me/MyHouseholdController.php
admin 1bc1ea7282 feat(customer-web): Phase 2 — onboarding wizard + household management
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>
2026-05-01 18:55:38 +08:00

40 lines
1.1 KiB
PHP

<?php
namespace App\Http\Controllers\Api\V1\Me;
use App\Http\Controllers\Api\V1\ApiController;
use App\Http\Resources\HouseholdResource;
use App\Models\Household;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class MyHouseholdController extends ApiController
{
/**
* Resident fetches their own household without knowing the uuid.
* Returns `null` cleanly when none exists yet (used by the onboarding
* wizard to decide whether to start a new flow or show edit/status).
*/
public function show(Request $request): JsonResponse
{
$household = Household::with([
'head', 'barangay.cityMunicipality.province.region',
'members.user',
'assignedDropOffPoint',
])
->withCount('members')
->where('head_user_id', $request->user()->id)
->first();
if (! $household) {
return $this->ok([
'household' => null,
]);
}
return $this->ok([
'household' => new HouseholdResource($household),
]);
}
}