188 lines
6.0 KiB
PHP
188 lines
6.0 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Supervisor\Concerns;
|
|
|
|
use App\Models\Establishment;
|
|
use App\Models\Supervisor;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
|
trait ScopesSupervisorResources
|
|
{
|
|
protected function supervisor(): Supervisor
|
|
{
|
|
/** @var Supervisor $supervisor */
|
|
$supervisor = Auth::guard('supervisor')->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<int, int>
|
|
*/
|
|
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<int, array{id: int, name: string}>
|
|
*/
|
|
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<string, string|callable(Builder, string): void> $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}.*");
|
|
}
|
|
}
|