authorize('viewAny', Source::class); $user = auth()->user(); $query = Source::with(['sourceType', 'depot']) ->withCount('releves'); if (! $user->isSectionManager()) { // Membre : sources terminées + sources assignées $assignedIds = $user->sourcesAssignees()->pluck('sources.id'); $query->where(function ($q) use ($assignedIds) { $q->where('status', SourceStatus::Termine) ->orWhereIn('id', $assignedIds); }); } $sources = $query->orderBy('nom')->paginate(25); return view('sources.index', compact('sources')); } public function create(): View { $this->authorize('create', Source::class); $sourceTypes = SourceType::orderBy('nom')->get(['id', 'nom']); $depots = Depot::orderBy('nom')->get(['id', 'nom']); return view('sources.create', compact('sourceTypes', 'depots')); } public function store(StoreSourceRequest $request): RedirectResponse { $source = Source::create($request->validated()); return redirect()->route('sources.show', $source) ->with('success', 'Source créée.'); } public function show(Source $source): View { $this->authorize('view', $source); $source->load(['sourceType.fields', 'depot', 'membres', 'releves']); $availableUsers = User::orderBy('name')->get(['id', 'name', 'email']); return view('sources.show', compact('source', 'availableUsers')); } public function edit(Source $source): View { $this->authorize('update', $source); $sourceTypes = SourceType::orderBy('nom')->get(['id', 'nom']); $depots = Depot::orderBy('nom')->get(['id', 'nom']); return view('sources.edit', compact('source', 'sourceTypes', 'depots')); } public function update(UpdateSourceRequest $request, Source $source): RedirectResponse { $source->update($request->validated()); return redirect()->route('sources.show', $source) ->with('success', 'Source mise à jour.'); } public function destroy(Source $source): RedirectResponse { $this->authorize('delete', $source); $source->delete(); return redirect()->route('sources.index') ->with('success', 'Source supprimée.'); } public function addMembre(Request $request, Source $source): RedirectResponse { $this->authorize('assignMembre', $source); $data = $request->validate([ 'user_id' => ['required', 'exists:users,id'], ]); $source->membres()->syncWithoutDetaching([$data['user_id']]); // Passer automatiquement en_cours si la source est à_faire if ($source->status === SourceStatus::AFaire) { $source->update(['status' => SourceStatus::EnCours]); } return back()->with('success', 'Membre assigné.'); } public function removeMembre(Source $source, User $user): RedirectResponse { $this->authorize('assignMembre', $source); $source->membres()->detach($user->id); return back()->with('success', 'Membre retiré.'); } public function transition(Request $request, Source $source): RedirectResponse { $this->authorize('transition', $source); $data = $request->validate([ 'status' => ['required', 'string'], ]); $newStatus = SourceStatus::from($data['status']); if (! $source->canTransitionTo($newStatus, auth()->user())) { return back()->with('error', 'Transition non autorisée.'); } $source->update(['status' => $newStatus]); return back()->with('success', 'Statut mis à jour : ' . $newStatus->label()); } }