Aller au contenu

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 »)

  1. Depuis Comptabilité → Notes de frais, l'onglet Gérer liste les notes soumises par les équipes (visible avec accounting.expense.manage).
  2. 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.
  3. 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.
  4. 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

  1. Depuis Comptabilité → Budgets, cliquez sur Nouveau budget (panneau latéral).
  2. Renseignez le nom du budget et l'exercice fiscal (année, pré-rempli avec l'année en cours).
  3. Ajoutez une ou plusieurs lignes via Ajouter une ligne : chaque ligne associe un compte comptable (code) à un montant budgété.
  4. Enregistrez — le budget est créé au statut Brouillon.
  5. 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

  1. Sur une ligne de budget, cliquez sur Voir l'analyse.
  2. 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.
  3. 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) — champs category (chaîne libre, défaut OTHER) et status (chaîne libre, défaut SUBMITTED), 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) — statut DRAFT/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 exercice
    • POST /{budgetId}/lines (ajout/mise à jour de ligne, accounting.budget.manage)
    • GET /variance?year&month (accounting.budget.read) via BudgetService

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.

Voir aussi