Skip to main content

Missions & Déplacements professionnels

Module de gestion des missions et déplacements professionnels avec workflow d'approbation à plusieurs niveaux, calcul automatique du per diem, suivi des dépenses et conformité SYSCOHADA. Conçu pour les organisations multi-sites (plantations, succursales, missions terrain) avec besoin d'audit trail complet.

Note SYSCOHADA — les missions sont mappées au compte 6384 — Missions (sous-compte de la classe 638 « Autres charges externes »). Le compte 6383 correspond aux Réceptions. Le compte 625 est Primes d'assurance, PAS les missions (erreur fréquente à éviter — voir feedback_ohada_625_vs_6384).

Workflow

Demande → Approbation (paliers) → Avance versée → Mission en cours
→ Soumission rapport (48h) → Réconciliation avance → Clôture

L'écran principal /hr/missions propose 3 onglets :

  • Mes demandes — vos missions personnelles avec leur statut
  • À approuver — visible uniquement pour managers (par palier d'approbation)
  • Historique — missions clôturées avec rapprochement avance / dépenses

Règles métier

RègleValeur
Jours autorisésMardi à Vendredi (4 jours/semaine — pas de départ lundi ni de retour samedi/dimanche)
Durée max3 jours consécutifs par mission
Délai de soumission du rapport48 h après la fin
Statutspending, approved, rejected, inProgress, completed, cancelled

Ces règles sont validées au niveau service (missionService.ts) et reflétées dans hr.missions.rules.*.

Approbation par paliers

L'approbation suit une cascade selon le montant total (per diem + avance + dépenses estimées) :

TierSeuilApprobateur(s)
Tier 1< seuil minimumManager direct
Tier 2montant intermédiaireManager + Chef de département
Tier 3au-delà du plafondManager + Département + PDG / Direction

Les seuils sont configurables par tenant via useMissionApprovalLevels. Le badge ApprovalTierBadge (src/modules/hr/components/missions/ApprovalTierBadge.tsx) affiche le palier en temps réel sur chaque demande.

Per diem (GSA-style)

Le per diem suit un modèle GSA-style (Government Services Administration — standard international). Le montant journalier est composé de plusieurs lignes plutôt qu'un forfait unique :

per_diem_jour = lodging_rate
+ breakfast_rate + lunch_rate + dinner_rate
+ incidentals_rate

avec ajustement de pourcentage pour le premier et le dernier jour (first_day_pct, last_day_pct — typiquement 75 % chacun pour refléter une demi-journée d'hébergement effective).

  • per_diem_rates (17 colonnes) — table de référence par tenant : country_code, region_code, city_code, lodging_rate, breakfast_rate, lunch_rate, dinner_rate, incidentals_rate, first_day_pct, last_day_pct, currency_code, effective_from, effective_to
  • PerDiemCalculator (src/modules/hr/components/missions/PerDiemCalculator.tsx) affiche la décomposition complète et reste lecture seule pour l'employé
  • Devise : portée par per_diem_rates.currency_code puis fallback sur la configuration tenant (tenants.settings.currency) — XAF/FCFA, XOF/FCFA, USD ou EUR
  • Versionnage temporel : effective_from/effective_to permettent de modifier les taux sans casser l'historique

Avance et réconciliation

L'avance est versée à l'approbation de la mission via salary_advances (compte SYSCOHADA 425 — Personnel, avances et acomptes). Au retour :

  1. L'employé soumet le rapport + reçus dans mission_expenses (catégories : transport, hébergement, repas, divers — chacune mappée à un sous-compte 638 via expense_category_gl_mapping)
  2. AdvanceReconciliationCard (src/modules/hr/components/missions/AdvanceReconciliation.tsx) calcule l'écart avance — dépenses justifiées
  3. Si dépenses > avance → remboursement complémentaire à l'employé
  4. Si dépenses < avance → trop-perçu retenu sur le prochain bulletin de paie

Audit trail

Toutes les actions sont journalisées dans mission_audit_log (12 colonnes : action, acteur, ancienne/nouvelle valeur, justification, timestamp) et visualisées via MissionAuditTimeline (src/modules/hr/components/missions/MissionAuditTimeline.tsx).

Cet audit alimente :

  • La conformité réglementaire (traçabilité des dépenses RH)
  • Les rapports CODIR (qui voyage le plus, où, pour combien)
  • Les analyses de productivité (mission ROI)

Tables de données

TableColonnesDescription
travel_missions22Demande principale (employé, dates, destination, motif, statut, budget estimé, dépenses réelles, avance)
mission_expenses9Dépenses post-mission (catégorie, montant, reçu, description)
mission_audit_log12Trail d'audit (action, acteur, ancien/nouveau statut, niveau d'approbation, commentaire)
per_diem_rates17Référence per diem GSA-style (pays, région, ville, taux hébergement/repas/divers, % 1er/dernier jour)
expense_category_gl_mapping8Mapping catégorie dépense → sous-compte SYSCOHADA

Comptabilité OHADA

Mappings GL automatiques :

CompteLibelléUsage
6384MissionsPer diem + dépenses validées
6383Réceptions(réservé)
425Personnel, avances et acomptesAvance versée avant départ
445État, TVA récupérableTVA sur dépenses (selon juridiction)

Les écritures sont générées par le bridge financier (financialBridgeService) lors de la clôture de mission, avec extourne automatique du compte 425 quand l'avance est réconciliée.

Multi-tenant et multi-juridiction

  • CEMAC (Cameroun, Tchad, Gabon...) — XAF/FCFA, TVA 19,25 % au Cameroun
  • UEMOA (Côte d'Ivoire, Sénégal...) — XOF/FCFA, TVA 18 %
  • Per diem rates configurables par zone géographique du tenant
  • RLS appliqué sur toutes les tables : tenant_id = public.tenant_id() OR public.is_super_admin()
  • Devise affichée via formatCurrency() selon tenants.settings.currency

Intégration KONA (chatbot RAG)

Le provider missionsDataSearch permet à l'assistant de répondre à :

  • « Quel est le statut de ma mission à Douala ? »
  • « Combien de per diem pour Yaoundé ? »
  • « Qui doit approuver ma demande de 250 000 FCFA ? »
  • « Combien de missions en attente ce mois-ci ? »

Réponses tenant-scopées via RBAC (rbac.tenant_id, role) et limitées aux missions visibles selon le rôle.

Liens utiles