Intégration fonctionnalites V1

This commit is contained in:
bastien
2026-07-04 22:30:18 +02:00
parent 55a558b536
commit 10ee859602
54 changed files with 4802 additions and 1018 deletions
@@ -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}.*");
}
}