initial commit

This commit is contained in:
bastien
2026-06-28 12:29:53 +02:00
parent 03e85d2f9d
commit b2443b654c
220 changed files with 24969 additions and 1 deletions
@@ -0,0 +1,60 @@
<?php
namespace App\Http\Controllers\Api\V1\Supervisor;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Concerns\RespondsWithJson;
use App\Http\Middleware\EnsureSupervisorScope;
use App\Models\Supervisor;
use Carbon\Carbon;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class DashboardController extends Controller
{
use RespondsWithJson;
public function index(Request $request): JsonResponse
{
/** @var Supervisor $supervisor */
$supervisor = $request->attributes->get('supervisor') ?? $request->user();
$today = Carbon::today();
$statsQuery = EnsureSupervisorScope::dailyStatsQuery($supervisor)
->where('stat_date', $today);
$todayStats = $statsQuery->get();
$machinesQuery = EnsureSupervisorScope::machinesQuery($supervisor);
$offlineThreshold = now()->subMinutes((int) config('laverie.machine.offline_threshold_minutes', 10));
return $this->success([
'summary' => [
'machines_total' => (clone $machinesQuery)->count(),
'machines_available' => (clone $machinesQuery)->where('status', 'available')->count(),
'machines_running' => (clone $machinesQuery)->where('status', 'running')->count(),
'machines_offline' => (clone $machinesQuery)->where(function ($q) use ($offlineThreshold) {
$q->where('status', 'offline')
->orWhere(fn ($q) => $q->where('last_heartbeat_at', '<', $offlineThreshold));
})->count(),
'bookings_today' => EnsureSupervisorScope::bookingsQuery($supervisor)
->whereDate('slot_start', $today)
->count(),
'washes_today' => EnsureSupervisorScope::washesQuery($supervisor)
->whereDate('started_at', $today)
->count(),
'revenue_today' => (float) $todayStats->sum('total_revenue'),
'top_up_today' => (float) $todayStats->sum('top_up_amount'),
],
'establishments' => $todayStats->map(fn ($stat) => [
'establishment_id' => $stat->establishment_id,
'establishment_name' => $stat->establishment?->name,
'total_washes' => $stat->total_washes,
'total_revenue' => (float) $stat->total_revenue,
'bookings_count' => $stat->bookings_count,
'no_show_count' => $stat->no_show_count,
'occupancy_rate' => (float) $stat->occupancy_rate,
]),
]);
}
}