authorize('viewAny', Contrat::class); $query = Contrat::with(['fournisseur', 'service']); if (!$request->user()->hasRole('admin')) { $query->where('service_id', $request->user()->service_id); } $query->when($request->search, function ($q, $search) { $q->where(function ($sub) use ($search) { $sub->where('titre', 'like', "%{$search}%") ->orWhereHas('fournisseur', fn($f) => $f->where('nom', 'like', "%{$search}%")); }); })->when($request->service_id, function ($q, $serviceId) use ($request) { if ($request->user()->hasRole('admin')) { $q->where('service_id', $serviceId); } })->when($request->fournisseur_id, function ($q, $fournisseurId) { $q->where('fournisseur_id', $fournisseurId); })->when($request->statut, function ($q, $statut) { $q->where('statut', $statut); }); $contrats = $query->orderBy('date_echeance', 'asc')->paginate(20)->withQueryString(); // Calculate estProcheEcheance for the frontend $contrats->getCollection()->transform(function ($contrat) { $contrat->append(['est_proche_echeance', 'est_en_retard']); return $contrat; }); return Inertia::render('Contrats/Index', [ 'contrats' => $contrats, 'services' => $request->user()->hasRole('admin') ? Service::all() : Service::where('id', $request->user()->service_id)->get(), 'fournisseurs' => Fournisseur::active()->orderBy('nom')->get(), 'filters' => $request->only(['search', 'service_id', 'fournisseur_id', 'statut']), 'statuts' => Contrat::STATUTS_LABELS, ]); } public function create(Request $request): Response { $this->authorize('create', Contrat::class); return Inertia::render('Contrats/Create', [ 'services' => $request->user()->hasRole('admin') ? Service::all() : Service::where('id', $request->user()->service_id)->get(), 'fournisseurs' => Fournisseur::active()->orderBy('nom')->get(), 'statuts' => Contrat::STATUTS_LABELS, ]); } public function store(Request $request): RedirectResponse { $this->authorize('create', Contrat::class); $rules = [ 'titre' => 'required|string|max:255', 'description' => 'nullable|string', 'fournisseur_id' => 'required|exists:fournisseurs,id', 'date_debut' => 'nullable|date', 'date_echeance' => 'required|date', 'statut' => 'required|in:actif,a_renouveler,expire,resilie', 'montant' => 'nullable|numeric|min:0', 'preavis_jours' => 'nullable|integer|min:0', ]; // Only admins can select other services, otherwise we force the user's service if ($request->user()->hasRole('admin')) { $rules['service_id'] = 'required|exists:services,id'; } $validated = $request->validate($rules); if (!$request->user()->hasRole('admin')) { $validated['service_id'] = $request->user()->service_id; } $contrat = Contrat::create($validated); return redirect()->route('contrats.index') ->with('success', 'Contrat créé avec succès.'); } public function show(Contrat $contrat): Response { $this->authorize('view', $contrat); $contrat->load(['fournisseur', 'service', 'piecesJointes.user']); $contrat->append(['est_proche_echeance', 'est_en_retard']); return Inertia::render('Contrats/Show', [ 'contrat' => $contrat, ]); } public function edit(Contrat $contrat, Request $request): Response { $this->authorize('update', $contrat); return Inertia::render('Contrats/Edit', [ 'contrat' => $contrat, 'services' => $request->user()->hasRole('admin') ? Service::all() : Service::where('id', $request->user()->service_id)->get(), 'fournisseurs' => Fournisseur::active()->orderBy('nom')->get(), 'statuts' => Contrat::STATUTS_LABELS, ]); } public function update(Request $request, Contrat $contrat): RedirectResponse { $this->authorize('update', $contrat); $rules = [ 'titre' => 'required|string|max:255', 'description' => 'nullable|string', 'fournisseur_id' => 'required|exists:fournisseurs,id', 'date_debut' => 'nullable|date', 'date_echeance' => 'required|date', 'statut' => 'required|in:actif,a_renouveler,expire,resilie', 'montant' => 'nullable|numeric|min:0', 'preavis_jours' => 'nullable|integer|min:0', ]; if ($request->user()->hasRole('admin')) { $rules['service_id'] = 'required|exists:services,id'; } $validated = $request->validate($rules); $contrat->update($validated); return redirect()->route('contrats.show', $contrat) ->with('success', 'Contrat mis à jour.'); } public function destroy(Contrat $contrat): RedirectResponse { $this->authorize('delete', $contrat); $contrat->delete(); return redirect()->route('contrats.index') ->with('success', 'Contrat supprimé.'); } }