d38efaad60
Avec ->shallow(), show/edit/update/destroy deviennent /releves/{releve}.
Le contrôleur bindait Source $source depuis la route (introuvable) →
Laravel l'instanciait vide via DI → id null → route() échouait dans la vue.
Correction : charger $source via $releve->source dans les 4 actions shallow.
Redirect update() corrigé : releves.show (shallow) et non sources.releves.show.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
118 lines
3.5 KiB
PHP
118 lines
3.5 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Enums\FieldType;
|
|
use App\Http\Requests\StoreReleveRequest;
|
|
use App\Http\Requests\UpdateReleveRequest;
|
|
use App\Models\Releve;
|
|
use App\Models\Source;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\View\View;
|
|
|
|
class ReleveController extends Controller
|
|
{
|
|
public function index(Source $source): View
|
|
{
|
|
$this->authorize('viewAny', [Releve::class, $source]);
|
|
|
|
$source->load('sourceType.fields');
|
|
|
|
// Keyset pagination sur id (évite le COUNT sur des millions de lignes)
|
|
$releves = $source->releves()
|
|
->orderBy('id')
|
|
->cursorPaginate(25);
|
|
|
|
return view('releves.index', compact('source', 'releves'));
|
|
}
|
|
|
|
public function create(Source $source): View
|
|
{
|
|
$this->authorize('create', [Releve::class, $source]);
|
|
|
|
$source->load('sourceType.fields');
|
|
|
|
return view('releves.create', compact('source'));
|
|
}
|
|
|
|
public function store(StoreReleveRequest $request, Source $source): RedirectResponse
|
|
{
|
|
$data = $this->buildData($request->validated()['data'] ?? [], $source);
|
|
|
|
$source->releves()->create([
|
|
'data' => $data,
|
|
'created_by' => $request->user()->id,
|
|
'updated_by' => $request->user()->id,
|
|
]);
|
|
|
|
return redirect()->route('sources.releves.index', $source)
|
|
->with('success', 'Relevé ajouté.');
|
|
}
|
|
|
|
public function show(Releve $releve): View
|
|
{
|
|
$this->authorize('view', $releve);
|
|
|
|
$source = $releve->source->load('sourceType.fields');
|
|
$releve->load('createur', 'modificateur');
|
|
|
|
return view('releves.show', compact('source', 'releve'));
|
|
}
|
|
|
|
public function edit(Releve $releve): View
|
|
{
|
|
$this->authorize('update', $releve);
|
|
|
|
$source = $releve->source->load('sourceType.fields');
|
|
|
|
return view('releves.edit', compact('source', 'releve'));
|
|
}
|
|
|
|
public function update(UpdateReleveRequest $request, Releve $releve): RedirectResponse
|
|
{
|
|
$source = $releve->source->load('sourceType.fields');
|
|
$data = $this->buildData($request->validated()['data'] ?? [], $source);
|
|
|
|
$releve->update([
|
|
'data' => $data,
|
|
'updated_by' => $request->user()->id,
|
|
]);
|
|
|
|
return redirect()->route('releves.show', $releve)
|
|
->with('success', 'Relevé mis à jour.');
|
|
}
|
|
|
|
public function destroy(Releve $releve): RedirectResponse
|
|
{
|
|
$this->authorize('delete', $releve);
|
|
|
|
$source = $releve->source;
|
|
$releve->delete();
|
|
|
|
return redirect()->route('sources.releves.index', $source)
|
|
->with('success', 'Relevé supprimé.');
|
|
}
|
|
|
|
// Normalise les données POST en structure JSONB propre
|
|
private function buildData(array $raw, Source $source): array
|
|
{
|
|
$data = [];
|
|
|
|
foreach ($source->sourceType->fields as $field) {
|
|
$value = $raw[$field->name] ?? null;
|
|
|
|
$data[$field->name] = match ($field->type) {
|
|
FieldType::Boolean => (bool) ($value ?? false),
|
|
FieldType::Number => $value !== null && $value !== '' ? (float) $value : null,
|
|
FieldType::Date => [
|
|
'valeur' => $value['valeur'] ?? null,
|
|
'calendrier' => $value['calendrier'] ?? 'gregorien',
|
|
],
|
|
default => $value === '' ? null : $value,
|
|
};
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
}
|