Intégration fonctionnalites V1
This commit is contained in:
@@ -2,8 +2,10 @@
|
||||
|
||||
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
|
||||
@@ -16,6 +18,21 @@ trait ScopesSupervisorResources
|
||||
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();
|
||||
@@ -47,4 +64,124 @@ trait ScopesSupervisorResources
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
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}.*");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user