validate([ 'budget_id' => 'required|exists:budgets,id', 'nom' => 'required|string|max:255', 'description' => 'nullable|string', 'type_depense' => 'required|in:investissement,fonctionnement', 'montant_propose' => 'required|numeric|min:0', 'commune_id' => 'nullable|exists:communes,id', ]); $budget = Budget::findOrFail($request->budget_id); $this->authorize('addLigne', $budget); LigneBudget::create($request->only([ 'budget_id', 'nom', 'description', 'type_depense', 'montant_propose', 'commune_id', ])); return redirect()->back()->with('success', 'Ligne budgétaire ajoutée.'); } public function update(Request $request, LigneBudget $lignes_budget) { $this->authorize('updateLigne', $lignes_budget); $request->validate([ 'nom' => 'required|string|max:255', 'description' => 'nullable|string', 'type_depense' => 'required|in:investissement,fonctionnement', 'montant_propose' => 'required|numeric|min:0', 'commune_id' => 'nullable|exists:communes,id', ]); $lignes_budget->update($request->only([ 'nom', 'description', 'type_depense', 'montant_propose', 'commune_id', ])); return redirect()->back()->with('success', 'Ligne budgétaire mise à jour.'); } public function arbitrer(Request $request, LigneBudget $ligneBudget) { $this->authorize('arbitrerLigne', $ligneBudget); $request->validate([ 'statut_arbitrage' => 'required|in:propose,accepte_dsi,accepte_direction,valide_definitif,refuse,reporte', 'commentaire' => 'nullable|string|max:1000', 'montant_arbitre' => [ 'nullable', 'numeric', 'min:0', function ($attribute, $value, $fail) use ($ligneBudget) { if ($value !== null && $value > $ligneBudget->montant_propose) { $fail("Le montant arbitré ({$value} €) ne peut pas dépasser le montant proposé ({$ligneBudget->montant_propose} €)."); } }, ], ]); HistoriqueBudget::create([ 'ligne_budget_id' => $ligneBudget->id, 'user_id' => $request->user()->id, 'ancien_statut' => $ligneBudget->statut_arbitrage, 'nouveau_statut' => $request->statut_arbitrage, 'ancien_montant_arbitre' => $ligneBudget->montant_arbitre, 'nouveau_montant_arbitre'=> $request->montant_arbitre, 'commentaire' => $request->commentaire, ]); $ligneBudget->update([ 'statut_arbitrage' => $request->statut_arbitrage, 'montant_arbitre' => $request->montant_arbitre, ]); return redirect()->back()->with('success', 'Arbitrage enregistré.'); } public function destroy(LigneBudget $lignes_budget) { $this->authorize('deleteLigne', $lignes_budget); $lignes_budget->delete(); return redirect()->back()->with('success', 'Ligne budgétaire supprimée.'); } }