feat: dashboard amélioré, exports budgets, alertes expiration et correctifs

## Dashboard
- Refonte complète du tableau de bord avec widgets budgets, commandes, contrats
- Intégration des données d'exécution budgétaire en temps réel

## Exports & Rapports
- BudgetExecutionExport : export Excel de l'exécution budgétaire
- Template PDF budgets (budgets_pdf.blade.php)
- Routes d'export PDF et Excel

## Alertes & Notifications
- Commande CheckExpirations : détection des contrats/assets arrivant à échéance
- Mail ExpiringElementsMail avec template Blade
- Planification via routes/console.php

## Correctifs
- CommandePolicy et ContratPolicy : ajustements des règles d'autorisation
- ContratController : corrections mineures
- Commande model : ajustements relations/casts
- AuthenticatedLayout : refonte navigation avec icônes budgets
- Assets/Form.vue : corrections formulaire
- Seeder rôles/permissions mis à jour
- Dépendances composer mises à jour (barryvdh/laravel-dompdf, maatwebsite/excel)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
jeremy bayse
2026-04-11 20:20:49 +02:00
parent 0ad77de412
commit 04fc56cd70
18 changed files with 1403 additions and 229 deletions

View File

@@ -19,7 +19,7 @@ class ContratController extends Controller
$query = Contrat::with(['fournisseur', 'service']);
if (!$request->user()->hasRole('admin')) {
if (!$request->user()->hasAnyRole(['admin', 'raf'])) {
$query->where('service_id', $request->user()->service_id);
}
@@ -29,7 +29,7 @@ class ContratController extends Controller
->orWhereHas('fournisseur', fn($f) => $f->where('nom', 'like', "%{$search}%"));
});
})->when($request->service_id, function ($q, $serviceId) use ($request) {
if ($request->user()->hasRole('admin')) {
if ($request->user()->hasAnyRole(['admin', 'raf'])) {
$q->where('service_id', $serviceId);
}
})->when($request->fournisseur_id, function ($q, $fournisseurId) {
@@ -50,7 +50,7 @@ class ContratController extends Controller
return Inertia::render('Contrats/Index', [
'contrats' => $contrats,
'services' => $request->user()->hasRole('admin') ? Service::all() : Service::where('id', $request->user()->service_id)->get(),
'services' => $request->user()->hasAnyRole(['admin', 'raf']) ? Service::all() : Service::where('id', $request->user()->service_id)->get(),
'fournisseurs' => Fournisseur::active()->orderBy('nom')->get(),
'communes' => \App\Models\Commune::orderBy('nom')->get(),
'filters' => $request->only(['search', 'service_id', 'fournisseur_id', 'statut']),
@@ -63,7 +63,7 @@ class ContratController extends Controller
$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(),
'services' => $request->user()->hasAnyRole(['admin', 'raf']) ? Service::all() : Service::where('id', $request->user()->service_id)->get(),
'fournisseurs' => Fournisseur::active()->orderBy('nom')->get(),
'communes' => \App\Models\Commune::orderBy('nom')->get(),
'statuts' => Contrat::STATUTS_LABELS,
@@ -86,13 +86,13 @@ class ContratController extends Controller
];
// Only admins can select other services, otherwise we force the user's service
if ($request->user()->hasRole('admin')) {
if ($request->user()->hasAnyRole(['admin', 'raf'])) {
$rules['service_id'] = 'required|exists:services,id';
}
$validated = $request->validate($rules);
if (!$request->user()->hasRole('admin')) {
if (!$request->user()->hasAnyRole(['admin', 'raf'])) {
$validated['service_id'] = $request->user()->service_id;
}
@@ -120,7 +120,7 @@ class ContratController extends Controller
return Inertia::render('Contrats/Edit', [
'contrat' => $contrat,
'services' => $request->user()->hasRole('admin') ? Service::all() : Service::where('id', $request->user()->service_id)->get(),
'services' => $request->user()->hasAnyRole(['admin', 'raf']) ? Service::all() : Service::where('id', $request->user()->service_id)->get(),
'fournisseurs' => Fournisseur::active()->orderBy('nom')->get(),
'communes' => \App\Models\Commune::orderBy('nom')->get(),
'statuts' => Contrat::STATUTS_LABELS,
@@ -142,7 +142,7 @@ class ContratController extends Controller
'preavis_jours' => 'nullable|integer|min:0',
];
if ($request->user()->hasRole('admin')) {
if ($request->user()->hasAnyRole(['admin', 'raf'])) {
$rules['service_id'] = 'required|exists:services,id';
}