112 lines
4.3 KiB
PHP
112 lines
4.3 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Supervisor;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Controllers\Supervisor\Concerns\ScopesSupervisorResources;
|
|
use App\Models\Wash;
|
|
use Illuminate\Http\Request;
|
|
use Inertia\Inertia;
|
|
use Inertia\Response;
|
|
|
|
class WashPageController extends Controller
|
|
{
|
|
use ScopesSupervisorResources;
|
|
|
|
public function index(Request $request): Response
|
|
{
|
|
$query = Wash::query()
|
|
->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<string, string>
|
|
*/
|
|
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,
|
|
};
|
|
}
|
|
}
|