Notes de frais & budgets¶
À quoi ça sert¶
Ce module couvre deux volets côté comptabilité/management : l'approbation et le remboursement des notes de frais soumises par les employés (/dashboard/accounting/expense-claims), et la création/suivi des budgets par compte comptable avec analyse d'écart (/dashboard/accounting/budget). La saisie initiale d'une note de frais par un employé est documentée dans Notes de frais — cette page couvre le traitement côté gestionnaire/comptabilité.
Prérequis¶
Prérequis
- Modules sous licence :
ACCOUNTING - Permissions :
accounting.expense.own,accounting.expense.manage,accounting.budget.read,accounting.budget.manage - Rôles :
MANAGER,ACCOUNTANT,CFO,ORG_ADMIN
Comment ça marche¶
Traiter une note de frais (onglet « Gérer »)¶
- Depuis Comptabilité → Notes de frais, l'onglet Gérer liste les notes soumises par les équipes (visible avec
accounting.expense.manage). - Sur une ligne au statut Soumise, deux actions sont disponibles : Approuver (coche) ou Rejeter (croix). Après approbation, le statut passe à Approuvée par le manager.
- Une fois une note Approuvée par le manager (ou déjà En attente de paiement), le bouton Marquer remboursée (icône billet) ouvre un panneau latéral pour saisir le mode de paiement (virement ou espèces) et une note libre, puis confirme le remboursement — le statut passe à Remboursée.
- L'onglet Mes notes affiche les notes de frais soumises par l'utilisateur connecté lui-même (
accounting.expense.own), indépendamment de son rôle.
Cycle de vie complet d'une note de frais : Soumise → Approuvée (manager) → En attente de paiement → Remboursée, avec une sortie possible vers Rejetée depuis le statut Soumise.
| Statut | Signification |
|---|---|
SUBMITTED (Soumise) |
Note créée par l'employé, en attente de traitement |
MANAGER_APPROVED (Approuvée) |
Validée par le manager ou la comptabilité |
PENDING_PAYMENT (En attente de paiement) |
Programmée pour remboursement |
REIMBURSED (Remboursée) |
Remboursement effectué |
REJECTED (Rejetée) |
Refusée, aucun remboursement |
Étape « programmer le paiement » non exposée dans l'écran
Le backend expose un endpoint dédié POST /accounting/expense-claims/{id}/schedule-payment pour faire transiter une note de MANAGER_APPROVED vers PENDING_PAYMENT avant remboursement. L'écran actuel ne propose pas ce bouton intermédiaire : le bouton Marquer remboursée est disponible directement dès l'approbation et couvre les deux statuts. En pratique, une note peut donc être remboursée directement après approbation sans passer visiblement par « En attente de paiement ».
Créer et activer un budget¶
- Depuis Comptabilité → Budgets, cliquez sur Nouveau budget (panneau latéral).
- Renseignez le nom du budget et l'exercice fiscal (année, pré-rempli avec l'année en cours).
- Ajoutez une ou plusieurs lignes via Ajouter une ligne : chaque ligne associe un compte comptable (code) à un montant budgété.
- Enregistrez — le budget est créé au statut Brouillon.
- La liste des budgets affiche pour chaque exercice : nom, statut, montant budgété total, montant réalisé et l'écart (avec une icône de tendance : rouge si dépassement, verte si sous le budget).
Activation d'un budget : fonction serveur uniquement
Le backend expose POST /accounting/budgets/{budgetId}/activate (accounting.budget.manage) pour faire passer un budget de Brouillon à Actif — et clôture automatiquement tout autre budget déjà actif sur le même exercice fiscal (un seul budget actif par exercice). Ce bouton n'est pas encore présent dans l'écran /dashboard/accounting/budget ; l'activation doit être demandée au support ou effectuée via l'API en attendant.
Consulter l'analyse d'écart¶
- Sur une ligne de budget, cliquez sur Voir l'analyse.
- Un tableau détaillé apparaît sous la ligne, avec pour chaque compte : le montant budgété, le montant réalisé, l'écart en valeur et en pourcentage, et une étiquette Dépassé ou Sous budget.
- Cette analyse s'appuie uniquement sur le budget Actif de l'exercice consulté — un budget resté en Brouillon n'apparaît jamais dans le calcul d'écart.
Qui peut faire quoi¶
| Permission requise | Rôles concernés |
|---|---|
accounting.expense.own |
MANAGER, ACCOUNTANT, CFO, ORG_ADMIN |
accounting.expense.manage |
MANAGER, ACCOUNTANT, CFO, ORG_ADMIN |
accounting.budget.read |
MANAGER, ACCOUNTANT, CFO, ORG_ADMIN |
accounting.budget.manage |
MANAGER, ACCOUNTANT, CFO, ORG_ADMIN |
| Action | Permission requise |
|---|---|
| Soumettre / consulter ses propres notes de frais | accounting.expense.own |
| Consulter et gérer les notes de frais de l'équipe (approuver, rejeter, programmer, rembourser) | accounting.expense.manage |
| Consulter les budgets et l'analyse d'écart | accounting.budget.read |
| Créer, modifier des lignes, activer un budget | accounting.budget.manage |
D'après la matrice V185 : EMPLOYEE n'a que accounting.expense.own (ses propres notes). MANAGER a accounting.expense.own + accounting.expense.manage mais aucun accès aux budgets. ACCOUNTANT cumule les quatre permissions (notes de frais + budgets, lecture et gestion). CFO n'a que accounting.budget.read (consultation des budgets, aucune gestion des notes de frais ni des budgets).
Détails techniques¶
Détails techniques
- Entité
ExpenseClaim(app.jigi.accounting.expense.domain) — champscategory(chaîne libre, défautOTHER) etstatus(chaîne libre, défautSUBMITTED), non modélisés en@Enumerated. - Endpoints (
ExpenseClaimController, base/accounting/expense-claims) :GET /my-claims(accounting.expense.own)POST(soumission,accounting.expense.own)GET(liste de gestion,accounting.expense.manage)POST /{id}/approve,POST /{id}/reject,POST /{id}/schedule-payment,POST /{id}/mark-reimbursed(accounting.expense.manage)
- Service
ExpenseClaimService(app.jigi.accounting.expense.service) pilote les transitions de statut. - Entité
Budget/ lignes de budget (app.jigi.accounting.budget.domain) — statutDRAFT/ACTIVE/CLOSED. - Endpoints (
BudgetController, base/accounting/budgets) :POST(création,accounting.budget.manage),GET(liste,accounting.budget.read)POST /{budgetId}/activate(accounting.budget.manage) — clôture l'ancien budget actif du même exercicePOST /{budgetId}/lines(ajout/mise à jour de ligne,accounting.budget.manage)GET /variance?year&month(accounting.budget.read) viaBudgetService
Cas d'erreur et FAQ¶
Une note de frais rejetée peut-elle être renvoyée ?
Non, REJECTED est un statut final côté backend — l'employé doit soumettre une nouvelle note de frais.
Pourquoi certaines catégories de notes de frais s'affichent-elles en anglais brut (OTHER, TRAVEL, MEAL, SUPPLIES) ? Les valeurs de catégorie ne sont actuellement pas traduites dans l'écran — c'est un écart d'interface connu, la donnée elle-même est correcte côté serveur.
Je ne trouve pas de bouton pour activer un budget, comment faire ? L'action existe côté serveur mais n'est pas encore reliée à un bouton dans l'écran Budgets. Contactez le support en attendant l'ajout de ce bouton.
Pourquoi l'analyse d'écart d'un budget que je viens de créer est-elle vide ? Le calcul d'écart ne prend en compte que le budget Actif de l'exercice — un budget en Brouillon doit d'abord être activé pour apparaître dans les écarts.
Qui peut approuver une note de frais ?
Tout titulaire de accounting.expense.manage — en pratique MANAGER et ACCOUNTANT sur la matrice standard. Un simple EMPLOYEE ne voit que ses propres notes.