with(['user:id,first_name,last_name,email', 'machine:id,uuid,name,establishment_id', 'machine.establishment:id,name']); $this->scopeMachineRelationQuery($query); $this->applyEstablishmentFilter($request, $query, 'machine'); $this->applyUserSearchFilter($request, $query); if ($request->filled('status')) { $query->where('status', $request->string('status')); } if ($request->filled('date')) { $query->whereDate('started_at', $request->string('date')); } $washes = $query ->tap(fn ($builder) => $this->applySort($request, $builder, [ 'started_at' => 'washes.started_at', 'user' => fn ($builder, string $direction) => $this->sortByRelatedUser($builder, 'washes', 'user_id', $direction), 'machine' => fn ($builder, string $direction) => $this->sortByRelatedMachine($builder, 'washes', $direction), 'status' => 'washes.status', 'duration_minutes' => 'washes.duration_minutes', 'cost' => 'washes.cost', ], 'started_at', 'desc')) ->paginate($this->supervisorListPerPage($request)) ->withQueryString() ->through(fn (Wash $wash) => [ 'uuid' => $wash->uuid, 'status' => $wash->status, 'status_label' => $this->statusLabel($wash->status), 'program' => $wash->program, 'trigger_method' => $wash->trigger_method, 'trigger_method_label' => $this->triggerMethodLabel($wash->trigger_method), 'started_at' => $wash->started_at?->toIso8601String(), 'ended_at' => $wash->ended_at?->toIso8601String(), 'duration_minutes' => $wash->duration_minutes, 'cost' => (float) $wash->cost, 'user' => $wash->user ? [ 'name' => trim($wash->user->first_name.' '.$wash->user->last_name), 'email' => $wash->user->email, ] : null, 'machine' => $wash->machine ? [ 'uuid' => $wash->machine->uuid, 'name' => $wash->machine->name, 'establishment_name' => $wash->machine->establishment?->name, ] : null, ]); return Inertia::render('Supervisor/Washes/Index', [ 'washes' => $washes, 'establishments' => $this->establishmentOptions(), 'filters' => [ 'establishment_id' => $request->filled('establishment_id') ? (int) $request->input('establishment_id') : null, 'user' => $request->string('user')->toString() ?: null, 'status' => $request->string('status')->toString() ?: null, 'date' => $request->string('date')->toString() ?: null, 'sort' => $request->string('sort')->toString() ?: 'started_at', 'direction' => $request->string('direction')->toString() === 'asc' ? 'asc' : 'desc', 'per_page' => $this->supervisorListPerPage($request), ], 'statusOptions' => $this->statusOptions(), ]); } /** * @return array */ private function statusOptions(): array { return [ 'pending_start' => 'En attente', 'running' => 'En cours', 'completed' => 'Terminé', 'failed' => 'Échoué', 'cancelled' => 'Annulé', ]; } private function statusLabel(string $status): string { return $this->statusOptions()[$status] ?? $status; } private function triggerMethodLabel(string $method): string { return match ($method) { 'qr_code' => 'QR code', 'booking' => 'Réservation', 'supervisor' => 'Superviseur', 'system' => 'Système', default => $method, }; } }