## Fonctionnalités - Module Budgets : enveloppes, lignes budgétaires, arbitrage DSI/Direction - Suivi de l'exécution budgétaire avec alertes visuelles (dépassement, seuil 80%) - Blocage des commandes si budget insuffisant (store + update) - Audit trail complet des arbitrages via HistoriqueBudget - Page d'index budgets refaite en tableau avec filtres et tri côté client - Page Services avec sélecteur d'icônes FontAwesome (solid + regular + brands) ## Sécurité - BudgetPolicy centralisée (viewAny, view, create, update, addLigne, updateLigne, deleteLigne, arbitrerLigne) - Autorisation sur tous les endpoints LigneBudget et Budget - Protection XSS : remplacement v-html par classes dynamiques - Validation des paramètres d'export (type, envelope) - Validation montant_arbitre ≤ montant_propose côté serveur ## Performance - Eager loading lignes.commandes.commune dans execution() et exportPdf() - Calculs montant_consomme/engage en mémoire sur collections déjà chargées - Null-safety sur montant_arbitre dans getMontantDisponibleAttribute ## Technique - Migration historique_budgets, budgets, ligne_budgets, rôle raf - SearchableSelect avec affichage du disponible budgétaire - FontAwesome enregistré globalement (fas, far, fab) - 33 tests Feature (sécurité, performance, métier) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
37 lines
1.2 KiB
JavaScript
37 lines
1.2 KiB
JavaScript
import '../css/app.css';
|
|
import './bootstrap';
|
|
|
|
import { createInertiaApp } from '@inertiajs/vue3';
|
|
import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers';
|
|
import { createApp, h } from 'vue';
|
|
import { ZiggyVue } from '../../vendor/tightenco/ziggy';
|
|
|
|
// FontAwesome
|
|
import { library } from '@fortawesome/fontawesome-svg-core';
|
|
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';
|
|
import { fas } from '@fortawesome/free-solid-svg-icons';
|
|
import { far } from '@fortawesome/free-regular-svg-icons';
|
|
import { fab } from '@fortawesome/free-brands-svg-icons';
|
|
library.add(fas, far, fab);
|
|
|
|
const appName = import.meta.env.VITE_APP_NAME || 'Laravel';
|
|
|
|
createInertiaApp({
|
|
title: (title) => `${title} - ${appName}`,
|
|
resolve: (name) =>
|
|
resolvePageComponent(
|
|
`./Pages/${name}.vue`,
|
|
import.meta.glob('./Pages/**/*.vue'),
|
|
),
|
|
setup({ el, App, props, plugin }) {
|
|
return createApp({ render: () => h(App, props) })
|
|
.use(plugin)
|
|
.use(ZiggyVue)
|
|
.component('font-awesome-icon', FontAwesomeIcon)
|
|
.mount(el);
|
|
},
|
|
progress: {
|
|
color: '#4B5563',
|
|
},
|
|
});
|