user(); return $supervisor; } protected function supervisorListPerPage(Request $request): int { $perPage = $request->integer('per_page', 10); return in_array($perPage, $this->supervisorPerPageOptions(), true) ? $perPage : 10; } /** * @return array */ protected function supervisorPerPageOptions(): array { return [10, 25, 50]; } protected function scopeEstablishmentQuery(Builder $query, string $establishmentColumn = 'establishment_id'): Builder { $supervisor = $this->supervisor(); $query->whereHas('establishment', function (Builder $query) use ($supervisor) { $query->where('organization_id', $supervisor->organization_id); if ($supervisor->establishment_id !== null) { $query->where('id', $supervisor->establishment_id); } }); if ($supervisor->establishment_id !== null && $establishmentColumn !== '') { $query->where($establishmentColumn, $supervisor->establishment_id); } return $query; } protected function scopeMachineRelationQuery(Builder $query): Builder { $supervisor = $this->supervisor(); return $query->whereHas('machine.establishment', function (Builder $query) use ($supervisor) { $query->where('organization_id', $supervisor->organization_id); if ($supervisor->establishment_id !== null) { $query->where('id', $supervisor->establishment_id); } }); } protected function applyEstablishmentFilter(Request $request, Builder $query, string $mode = 'direct'): void { if (! $request->filled('establishment_id')) { return; } $establishmentId = (int) $request->input('establishment_id'); $this->assertEstablishmentAccessible($establishmentId); if ($mode === 'machine') { $query->whereHas('machine', fn (Builder $query) => $query->where('establishment_id', $establishmentId)); } else { $query->where('establishment_id', $establishmentId); } } protected function applyUserSearchFilter(Request $request, Builder $query): void { if (! $request->filled('user')) { return; } $search = $request->string('user'); $query->whereHas('user', function (Builder $query) use ($search) { $query->where(function (Builder $query) use ($search) { $query->where('first_name', 'like', "%{$search}%") ->orWhere('last_name', 'like', "%{$search}%") ->orWhere('email', 'like', "%{$search}%"); }); }); } protected function assertEstablishmentAccessible(int $establishmentId): void { $supervisor = $this->supervisor(); $exists = Establishment::query() ->where('id', $establishmentId) ->where('organization_id', $supervisor->organization_id) ->when($supervisor->establishment_id, fn ($query) => $query->where('id', $supervisor->establishment_id)) ->exists(); abort_unless($exists, 403); } /** * @return array */ protected function establishmentOptions(): array { $supervisor = $this->supervisor(); return Establishment::query() ->where('organization_id', $supervisor->organization_id) ->when($supervisor->establishment_id, fn ($query) => $query->where('id', $supervisor->establishment_id)) ->orderBy('name') ->get(['id', 'name']) ->map(fn (Establishment $establishment) => [ 'id' => $establishment->id, 'name' => $establishment->name, ]) ->all(); } /** * @param array $sortableColumns */ protected function applySort( Request $request, Builder $query, array $sortableColumns, string $defaultColumn, string $defaultDirection = 'asc', ): void { $sort = $request->string('sort')->toString(); $direction = strtolower($request->string('direction')->toString()) === 'desc' ? 'desc' : 'asc'; if ($sort === '' || ! array_key_exists($sort, $sortableColumns)) { $sort = $defaultColumn; $direction = $defaultDirection; } $handler = $sortableColumns[$sort]; if (is_callable($handler)) { $handler($query, $direction); return; } $query->orderBy($handler, $direction); } protected function sortByRelatedUser(Builder $query, string $parentTable, string $foreignKey, string $direction): void { $query->leftJoin('users', "{$parentTable}.{$foreignKey}", '=', 'users.id') ->orderBy('users.last_name', $direction) ->orderBy('users.first_name', $direction) ->select("{$parentTable}.*"); } protected function sortByRelatedMachine(Builder $query, string $parentTable, string $direction): void { $query->leftJoin('machines', "{$parentTable}.machine_id", '=', 'machines.id') ->orderBy('machines.name', $direction) ->select("{$parentTable}.*"); } protected function sortByRelatedEstablishment( Builder $query, string $parentTable, string $foreignKeyColumn, string $direction, ): void { $query->leftJoin('establishments', "{$parentTable}.{$foreignKeyColumn}", '=', 'establishments.id') ->orderBy('establishments.name', $direction) ->select("{$parentTable}.*"); } }