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(Source $source, Releve $releve): View { $this->authorize('view', $releve); $source->load('sourceType.fields'); $releve->load('createur', 'modificateur'); return view('releves.show', compact('source', 'releve')); } public function edit(Source $source, Releve $releve): View { $this->authorize('update', $releve); $source->load('sourceType.fields'); return view('releves.edit', compact('source', 'releve')); } public function update(UpdateReleveRequest $request, Source $source, Releve $releve): RedirectResponse { $data = $this->buildData($request->validated()['data'] ?? [], $source); $releve->update([ 'data' => $data, 'updated_by' => $request->user()->id, ]); return redirect()->route('sources.releves.show', [$source, $releve]) ->with('success', 'Relevé mis à jour.'); } public function destroy(Source $source, Releve $releve): RedirectResponse { $this->authorize('delete', $releve); $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; } }