resolveSupervisor($request); if ($supervisor === null) { return response()->json([ 'message' => 'Superviseur non authentifié.', ], 401); } if (! $supervisor->is_active) { return response()->json([ 'message' => 'Compte superviseur désactivé.', ], 403); } $request->attributes->set('supervisor', $supervisor); return $next($request); } public static function resolveSupervisor(Request $request): ?Supervisor { $user = $request->user(); return $user instanceof Supervisor ? $user : null; } public static function machinesQuery(Supervisor $supervisor): Builder { $query = Machine::query()->with(['establishment', 'machineIntegration']); return self::applyEstablishmentScope($query, $supervisor, 'establishment_id'); } public static function bookingsQuery(Supervisor $supervisor): Builder { $query = Booking::query() ->with(['user', 'machine.establishment']) ->whereHas('machine.establishment', function (Builder $query) use ($supervisor) { self::applyOrganizationFilter($query, $supervisor); }); if ($supervisor->establishment_id !== null) { $query->whereHas('machine', fn (Builder $q) => $q->where('establishment_id', $supervisor->establishment_id)); } return $query; } public static function washesQuery(Supervisor $supervisor): Builder { $query = Wash::query() ->with(['user', 'machine.establishment', 'booking']) ->whereHas('machine.establishment', function (Builder $query) use ($supervisor) { self::applyOrganizationFilter($query, $supervisor); }); if ($supervisor->establishment_id !== null) { $query->whereHas('machine', fn (Builder $q) => $q->where('establishment_id', $supervisor->establishment_id)); } return $query; } public static function pricingRulesQuery(Supervisor $supervisor): Builder { $query = PricingRule::query()->with(['establishment', 'machine']); return self::applyEstablishmentScope($query, $supervisor, 'establishment_id'); } public static function promotionsQuery(Supervisor $supervisor): Builder { $query = Promotion::query()->with('establishment'); return self::applyEstablishmentScope($query, $supervisor, 'establishment_id'); } public static function dailyStatsQuery(Supervisor $supervisor): Builder { $query = DailyEstablishmentStat::query()->with('establishment'); return self::applyEstablishmentScope($query, $supervisor, 'establishment_id'); } private static function applyEstablishmentScope(Builder $query, Supervisor $supervisor, string $column): Builder { if ($supervisor->establishment_id !== null) { return $query->where($column, $supervisor->establishment_id); } return $query->whereHas('establishment', function (Builder $query) use ($supervisor) { self::applyOrganizationFilter($query, $supervisor); }); } private static function applyOrganizationFilter(Builder $query, Supervisor $supervisor): void { $query->where('organization_id', $supervisor->organization_id); } }