Aller au contenu

ActuaryLab — Document de Référence

Module Épargne Salariale Universelle

Version 2.0 — Mise à jour post-implémentation
Date Mars 2026
Auteur Cabinet BFEV — Équipe ActuaryLab
Statut 🔒 Document de travail — Confidentiel
Historique v1.0 Mars 2026 — Document de vision initiale · v2.0 Mars 2026 — Mise à jour de conformité post-livraison

Note de version

La v2.0 documente l'architecture telle qu'elle est réellement implémentée dans ActuaryLab v2.0 au 14 mars 2026. Elle conserve intégralement la rigueur mathématique de la v1.0, y compris pour les deux points non encore implémentés (analyse de sensibilité §3.7 et projections multi-années §F-ES-005) qui constituent le backlog prescriptif pour les prochaines évolutions du moteur.


Table des matières

  1. Introduction et Vision Stratégique
  2. Architecture du Paramétrage — Workflow 4 Phases
  3. Phase 1 — Sélection des Données
  4. Phase 2 — Paramétrage en 7 Blocs
  5. Phase 3 — Calcul
  6. Phase 4 — Résultats
  7. Évaluation du Passif Social — Méthodologie
  8. Fonctionnalités de la Plateforme ActuaryLab
  9. Architecture Technique — Modèles et Structure des Données
  10. Extensions de la Bibliothèque actuariat_lib
  11. Feuille de Route — Évolutions Prescrites
  12. Récapitulatif

1. Introduction et Vision Stratégique

1.1 Positionnement du module

Le module Épargne Salariale Universelle s'inscrit dans la continuité directe du module IFC développé dans ActuaryLab. Son ambition est double :

  • accompagner les entreprises dans la conception de leurs régimes d'épargne salariale ;
  • assurer leur pilotage actuariel et comptable dans la durée, au fur et à mesure que ces dispositifs génèrent un passif social inscrit au bilan.

Principe fondateur

L'épargne salariale est d'abord un acte de gestion RH et sociale. Elle devient un passif social dès lors que l'entreprise contractualise un engagement futur envers ses salariés — garantie de rendement, abondement obligatoire, prime contractuelle. ActuaryLab couvre les deux faces : la conception du régime et l'évaluation du passif qui en résulte selon les normes SYSCOHADA / IAS 19.

1.2 Périmètre couvert

Dispositif Nature de l'engagement Type de passif
Plan d'Épargne Entreprise Abondement garanti sur cotisation salarié DB si taux garanti / DC si abondement seul
Plan d'Épargne Retraite Collectif Cotisation obligatoire employeur + salarié DB ou DC selon formule
Intéressement contractualisé Prime liée aux résultats ou objectifs Droits aléatoires — DB conditionnel
Participation aux bénéfices Quote-part du bénéfice distribuée Droits aléatoires
Prime d'ancienneté différée Montant acquis par années de service DB pur (similaire IFC)
Régime hybride sur mesure Combinaison paramétrable de sources Mixte DB + DC + aléatoire

1.3 Articulation avec actuariat_lib

Le module s'appuie intégralement sur les briques actuarielles de la Phase 1 d'ActuaryLab. Les extensions ciblées sont décrites en Section 6.

1.4 Cadre réglementaire — Zone CEMAC/OHADA

⚠️ Point de vigilance — Droit gabonais

Le Code du Travail gabonais ne dispose pas d'un cadre légal spécifique à l'épargne salariale comparable au droit français. Les régimes reposent entièrement sur des accords d'entreprise. La plateforme n'impose aucune contrainte liée au droit français (plafonds CEL, livret A, blocage PEE 5 ans obligatoire, etc.) non applicable au Gabon.

Les conventions collectives sectorielles gabonaises (Bâtiment, Banque, Pétrole, Commerce) peuvent prévoir des taux ou des modalités d'épargne différents de la loi générale.


2. Architecture du Paramétrage — Workflow 4 Phases

Le module est organisé en quatre phases séquentielles : Données → Paramétrage → Calcul → Résultats. Chaque phase correspond à un statut de l'EvaluationEpargne et à une URL dédiée.

EvaluationEpargne.statut :
  brouillon / donnees  →  Phase 1 : Données
  parametrage          →  Phase 2 : Paramétrage
  calcul               →  Phase 3 : Calcul
  calcule / valide     →  Phase 4 : Résultats

Phase 1 — Sélection des Données

L'utilisateur sélectionne la photographie salariés de référence et configure les règles d'éligibilité et de segmentation.

1.1 Photographie de référence

La photographie est un snapshot immuable de la population à une date donnée (CDC v2 §6). Elle contient 17 champs par salarié : matricule, nom, prénom, date naissance, date entrée entreprise, date entrée plan, CSP, type contrat, statut, salaire brut mensuel, salaire variable annuel, âge retraite, sexe, département, ancienneté reconnue.

Une fois la photographie sélectionnée et les données validées, elles sont gelées — toute modification nécessite un déverrouillage explicite (donnees_validees = False).

1.2 Filtres d'éligibilité

Filtre Paramètre Défaut
Type de contrat Inclure CDD / Stagiaires Non (CDI seuls)
Statut Inclure Suspendus / Détachés Non
Ancienneté minimale En mois 0 mois
Seuil salarial En FCFA Aucun seuil

1.3 Segmentation et barèmes

Trois axes de différenciation activables indépendamment :

Axe Tranches prédéfinies Usage
Par CSP CADRE / MAITRISE / EMPLOYE / OUVRIER Taux cotisation S1 par catégorie
Par ancienneté < 2 ans / 2–5 / 5–10 / 10–20 / > 20 ans Taux progressifs
Par âge < 30 / 30–40 / 40–50 / 50–60 / > 60 ans Taux différenciés

1.4 Règle d'ancienneté plan

La règle regle_anciennete_plan détermine la date de début des millésimes pour chaque salarié :

Règle Date retenue Usage
date_entree_entreprise Date d'entrée dans l'entreprise Défaut — ancien régime
date_mise_en_place_plan Date de lancement du plan Régimes récents
champ_salarie Champ date_entree_plan individuel Maximum flexibilité

Règle de priorité : date_entree_plan_effective = max(date_entree_entreprise, date_mise_en_place_plan)

Un salarié entré le 2015-04-04 dans une entreprise dont le plan démarre le 2019-04-01 a sa première cotisation en avril 2019, pas en 2015.


Phase 2 — Paramétrage en 7 Blocs

Le paramétrage est organisé en 7 blocs thématiques sur une page unique (pas de wizard séquentiel). Chaque bloc dispose d'un bouton de sauvegarde HTMX individuel ainsi que d'une action globale "Sauvegarder tout" et "Lancer le calcul".

Bloc 2 — Sources d'alimentation S1/S2/S3/S4

Ce bloc définit comment et quand le régime est alimenté.

Source réglementaire :

Niveau Source Priorité
N1 — Légal Code du Travail gabonais Base non négociable
N2 — Sectoriel Convention collective de branche Supplante N1 si plus favorable
N3 — Entreprise Accord d'entreprise signé Supplante N1 et N2 si plus favorable
N4 — Individuel Contrat de travail / Avenant Supplante tout si plus favorable

Calendrier des versements :

Paramètre Options Défaut Impact actuariel
Fréquence \(m\) Mensuel \((m=12)\) / Trimestriel \((m=4)\) / Semestriel \((m=2)\) / Annuel \((m=1)\) \(m=12\) Taux fractionné \(i^{(m)}\)
Convention de date Fin de période / Début de période / Jour fixe Fin de période Rente immédiate ou due
Calendrier Exercice / Civil Exercice Date d'arrêté
Assiette temporelle Mois courant / Moyenne 3 mois / Moyenne 12 mois Mois courant Base de cotisation

Traitement actuariel du fractionnement

Le taux annuel effectif \(i\) est converti en taux périodique équivalent pour \(m\) versements par an :

\[i^{(m)} = m \left[(1+i)^{1/m} - 1\right]\]

L'approximation d'Euler–Maclaurin pour la correction de fractionnement donne :

\[\ddot{a}_{x:\overline{n|}}^{(m)} \approx \ddot{a}_{x:\overline{n|}} - \frac{m-1}{2m}\]

Le moteur applique cette correction via le facteur correction_fractionnement = (m-1)/(2m).

Sources d'alimentation :

Un régime peut combiner jusqu'à quatre sources indépendantes, chacune activable séparément :

# Source Mécanisme Type de passif
S1 Cotisation fixe employeur Taux % du salaire brut, versé automatiquement DC ou DB si rendement garanti
S2 Cotisation salarié + abondement Cotisation salarié + abondement employeur % de S2 Passif conditionnel
S3 Intéressement Formule paramétrable sur résultats / objectifs Passif probabilisé
S4 Participation Taux × résultat net Passif aléatoire

S1 — Cotisation employeur : taux unique, table par tranche de salaire, table par ancienneté, table par CSP ou par âge. Plafond de cotisation annuelle par salarié. Assiette : salaire brut total / base / plafonné CNSS / personnalisée.

S2 — Cotisation salarié et abondement employeur : - Taux de cotisation salarié (taux_cotisation_salarie) - Plancher de versement salarié pour déclenchement - Taux d'abondement employeur : \(\text{Abondement}_j = \min(S2_j \times \tau_{\text{abd}},\; P_{\text{abd}} / m)\) - Plafond annuel d'abondement par salarié

S3 — Intéressement (droits aléatoires) : - Mode taux_fixe : \(\text{Prime} = \tau \times \text{Assiette}\) - Mode loi_normale : \(\text{Prime} \sim \mathcal{N}(\mu, \sigma^2)\), espérance \(= \mu\) - Mode scenarios_discrets : \(\mathbb{E}[\text{Prime}] = \sum_s p_s V_s\) - Clé de répartition : uniforme / prorata \(S_i\) / prorata \(k_i\) / combinaison \(\alpha S_i + (1-\alpha)k_i\) - Plafond individuel en FCFA ou en mois de salaire

S4 — Participation : taux fixe appliqué à l'assiette salariale. Charge annuelle globale répartie individuellement selon la clé de répartition paramétrée.

Bloc 3 — Hypothèses Financières

Taux d'actualisation \(i\) :

Mode Saisie Description
Taux fixe Numérique Ex. : \(i = 6{,}00\,\%\) (défaut CEMAC)
Table calendaire Grille annuelle \(\{(\text{année},\,i_t)\}\)
Courbe par durée Grille par terme \(\{(d_j,\,i_j)\}\) avec interpolation linéaire

Interpolation linéaire entre les bornes \(b_j \leq d < b_{j+1}\) : $\(i(d) = i_j + \frac{i_{j+1} - i_j}{b_{j+1} - b_j}(d - d_j)\)$

Facteur d'actualisation avec table de taux \(\{i_t\}\) : $\(v(t_0,\,t_0+n) = \prod_{k=0}^{n-1} \frac{1}{1 + i_{t_0+k}}\)$

Taux de revalorisation des salaires \(g\) :

Mode Description
Taux fixe \(g = 3{,}00\,\%\) (défaut CEMAC)
Table par CSP Taux distincts par catégorie
Table par ancienneté Taux différenciés selon le stade de carrière
Table calendaire Scénario macroéconomique

Projection du salaire : $\(S_{t_0+n} = S_{t_0} \times \prod_{k=0}^{n-1}(1 + g_{t_0+k})\)$

Reconstruction rétrospective (millésimes passés) : $\(S(t_j) = S(t_0) \times (1 + g)^{-(t_0 - t_j)}\)$

Taux de rendement des actifs \(\rho\) :

  • Rendement garanti (DB) : génère un passif certain
  • Rendement attendu non garanti (DC) : paramètre de projection uniquement

Taux net effectif (après frais de gestion \(f\)) : $\(\rho_{\text{net}} = \frac{1 + \rho}{1 + f} - 1\)$

Actifs de couverture \(A(t_0)\) : $\(\text{Déficit net} = \max(0,\; \text{DBO}_{t_0} - A(t_0))\)$ $\(\text{Taux de couverture} = \frac{A(t_0)}{\text{DBO}_{t_0}} \times 100\)$

Passifs additionnels optionnels : - Garantie indexation inflation : \(\text{Passif}_{\text{inflation}} = \text{DBO} \times \tau_{\text{inflation garanti}}\) - Participation bénéfices fonds : \(\text{Passif}_{\text{PB}} = \text{DBO} \times \max(0,\, \rho_{\text{min garanti}} - \rho)\)

Bloc 4 — Vesting et Blocage

Modes de vesting :

Mode Formule Statut millésime
Immédiat \(V(k) = 100\,\%\) dès le premier jour acquis
Cliff \(V(k) = 0\,\%\) si \(k < d_v\), \(100\,\%\) si \(k \geq d_v\) non_acquis puis acquis
Linéaire \(V(k) = \min\!\left(100, \dfrac{k}{d_v} \times 100\right)\,\%\) en_cours
Grille Paliers \(\{(\text{de}_l, \text{à}_l, V_l)\}\) configurables Variable par palier

Calcul de l'horizon de déblocage \(H_j\) :

\[H_j = \begin{cases} t_j + n_{\text{bloc}} & \text{si mode\_blocage = durée fixe}\\ \min(t_j + n_{\text{bloc}},\; \text{date\_retraite}) & \text{si plafonné retraite}\\ \text{date\_retraite} & \text{si mode\_blocage = jusqu\_retraite} \end{cases}\]

Mode de sortie :

Pour une sortie en rente viagère, le capital accumulé est converti : $\(R_{\text{mensuelle}} = \frac{C_{H_j}}{12\,\ddot{a}_r^{(12)}}\)$

Pour une sortie mixte avec fraction \(\alpha_{\text{rente}} \in [0,1]\) en rente : $\(R_{\text{mensuelle}} = \frac{\alpha_{\text{rente}} \times C_{H_j}}{12\,\ddot{a}_r^{(12)}}\)$

Bloc 5 — Décréments et Déblocages Anticipés

Les déblocages anticipés constituent des décréments supplémentaires dans la table composite.

# Motif Notation Activation Taux probabiliste
1 Mariage / PACS \(q_x^{(\mathrm{mar})}\) Oui / Non Table ou taux fixe
2 Naissance / adoption \(q_x^{(\mathrm{nais})}\) Oui / Non Table ou taux fixe
3 Acquisition résidence principale \(q_x^{(\mathrm{immo})}\) Oui / Non Table + plafond FCFA
4 Décès du conjoint Oui / Non Lié table mortalité
5 Invalidité 2ème / 3ème catégorie \(q_x^{(i)}\) Oui / Non Table ou taux fixe
6 Rupture contrat de travail \(\beta\,q_x^{(w)}\) Toujours actif \(\beta \in [0,1]\)
7 Surendettement \(q_x^{(\mathrm{sur})}\) Oui / Non Taux fixe annuel
8 Liquidation judiciaire Systématique Événement binaire
+ Motifs personnalisés Configurables Oui / Non Table par âge saisie

Note d'implémentation v2.0 : Dans le moteur actuel, le taux de rotation w stocké dans HypothesesEpargne.taux_rotation est un taux de sortie global pré-calculé qui absorbe rotation volontaire et rupture de contrat. La table composite multi-décréments complète (avec chaque déblocage comme décrément distinct) est le modèle cible décrit en §3.6 et constitue une évolution prescrite du moteur (§7).

Bloc 6 — Hypothèses Démographiques

Paramètre Options Défaut CEMAC
Table de mortalité CIMA 2018 / INSEE TD 88-90 / Custom CSV CIMA 2018
Mode âge retraite Légal / Individuel (champ salarié) / Uniforme Individuel
Âge retraite uniforme 50–70 ans (si mode uniforme)
Mode taux rotation Taux fixe / Table par âge / Table par ancienneté Taux fixe
Taux de rotation \(w\) Décimal 5,00 %
Inclure CDD Booléen Non
Inclure suspendus Booléen Non
Inclure salaire variable Booléen Non

Bloc 7 — Fiscalité et Charges Sociales

Paramètre Options Défaut
Exonération charges patronales Oui/Non + plafond FCFA/an Oui
Taux de charges sur dépassement % 0,00 %
Exonération IR salarié Oui/Non Oui
Fiscalité sortie capital Exonéré / IR ordinaire / Taux forfaitaire Exonéré
Fiscalité sortie rente Exonéré / IR ordinaire / Taux réduit / Forfaitaire Exonéré
Provision charges patronales Oui/Non Non
Exonération déblocages anticipés Oui/Non Oui

Coût net annuel pour l'employeur : $\(C_{\text{net}} = C_{\text{brut}}\,(1 - \tau_{\text{exo}}) + C_{\text{brut}} \cdot \mathbf{1}_{\{C_{\text{brut}} > P_{\text{exo}}\}} \cdot \tau_{\text{charges}}\)$


Phase 3 — Calcul

Le calcul est déclenché par l'action "Lancer le calcul" en Phase 2 ou directement depuis la Phase 3. Le moteur calculer_resultats_epargne() s'exécute de façon synchrone (sans Celery) et produit la structure resultats stockée dans EvaluationEpargne.resultats (JSONField).

Prérequis bloquants avant calcul : - Photographie sélectionnée (photographie_id non null) - Plan d'épargne configuré (plan_id non null) - Hypothèses créées (HypothesesEpargne lié par OneToOne)

Structure resultats produite (à la racine du JSONField) :

resultats
├── version_moteur      : 'audit_v2'
├── meta                : {date_calcul, nb_salaries_evalues, methode}
├── global              : {dbo_totale, pm_totale, capital_projete_total,
│                          cout_services_rendus, cout_interet,
│                          actifs_couverture_fcfa, deficit_net_fcfa,
│                          taux_couverture_pct, nb_salaries_evalues, ...}
├── par_csp             : [{csp, nb, dbo, pct_dbo, salaire_moyen, ...}]
├── par_anciennete      : [] (réservé)
├── par_source          : {S1_cotisation, S2_abondement,
│                          S3_interessement, S4_participation}
├── waterfall           : {dbo_ouverture, cout_services_rendus,
│                          cout_interet, prestations_versees,
│                          reevaluations_experience, dbo_cloture, ...}
├── sensibilite         : [] (évolution prescrite — §7)
├── projections         : [{annee, dbo, csr, ci, cotisations, effectif}]
├── detail_salaries     : [{matricule, nom, prenom, csp, age,
│                           anciennete_plan, salaire_brut,
│                           assiette_cotisation, taux_cotisation,
│                           cotisation_annuelle, dbo_dc, pm_dc,
│                           capital_projete, millesimes[], ...}]
├── collectif           : {population_base, population_retenue, ...}
├── audit_parametres    : {plan{}, hypotheses{}, eligibilite{}, ...}
└── audit_individuel    : [lignes individuelles — compatibilité]

Accès aux données individuelles : La structure réelle utilise resultats['detail_salaries'] (pas de clé 'calcul'). Toutes les vues accèdent au détail individuel via la fonction _resultats_detail_salaries(resultats) qui gère le fallback vers audit_individuel.


Phase 4 — Résultats

Les résultats sont présentés en 6 onglets HTMX chargés à la demande :

Onglet Contenu
1 — Synthèse KPIs globaux, DBO par source, répartition CSP
2 — Décomposition IAS 19 Waterfall CSR + IC + réévaluations
3 — Répartitions CSP, ancienneté, sources
4 — Détail individuel Tableau paginé, filtrable, triable par colonne
5 — Projections DBO et cotisations projetées N+1 → N+5
6 — Sensibilité Évolution prescrite — §7

Documents disponibles depuis la Phase 4 : - Fiche technique actuarielle (imprimable PDF, 1-2 pages A4) - Fiche de spécification du régime (document reproductibilité complet) - Fiche individuelle millésimée (par salarié, export JSON audit) - Sauvegarde snapshot d'audit (ResultatAuditEpargne)


3. Évaluation du Passif Social — Méthodologie

3.1 Principe général selon le type de régime

Type de régime Méthode Formule centrale Norme
DB — Prestation garantie PUC (IAS 19) \(\mathrm{DBO} = PP \times \dfrac{k}{K} \times v^n \times {}_{n}p_x^{(\tau)}\) IAS 19 / SYSCOHADA
DC — Cotisation fixe VA cotisations futures \(\mathrm{DBO}_{\mathrm{DC}} = \sum_j c_j \times v^{t_j} \times {}_{t_j}p_x^{(\tau)}\) IAS 19 §BC141
Aléatoire — Intéressement Espérance actuarielle \(\mathrm{DBO} = \mathbb{E}[\text{Prime}] \times \dfrac{k}{K} \times v^n \times {}_{n}p_x^{(\tau)}\) IAS 19 §BC105
Hybride DB + DC Additive \(\mathrm{DBO}_{\mathrm{total}} = \mathrm{DBO}_{\mathrm{DB}} + \mathrm{DBO}_{\mathrm{DC}}\) IAS 19

3.2 Méthode PUC pour les régimes DB

Identique à la méthode IFC — utilise dbo_individuelle_puc de actuariat_lib.engagements.

Étape 1 — Prestation projetée à la retraite $\(PP = \text{Prestation}(K,\,S_r), \quad S_r = S \cdot \prod_{j=0}^{r-x-1}(1 + g_{t_0+j})\)$

Étape 2 — Unité de crédit $\(UC = \frac{PP}{K}\)$

Étape 3 — Droits acquis $\(DA = UC \times k = PP \times \frac{k}{K}\)$

Étape 4 — DBO actualisée $\(\boxed{\mathrm{DBO} = PP \times \frac{k}{K} \times {}_{r-x}E_x^{(\tau)}}, \quad {}_{n}E_x^{(\tau)} = v^n \times {}_{n}p_x^{(\tau)}\)$

3.3 Calcul des Provisions Mathématiques (PM) — Formule Centrale

Les PM représentent la valeur de marché des engagements envers les bénéficiaires ayant déjà des droits constitués via les versements passés (millésimes).

PM individuelle — salarié avec un seul millésime $\(PM_i = C_i \times v(t_0,\,H_i) \times p^{(\tau)}(x_i,\,t_0,\,H_i)\)$

PM individuelle — multi-millésimes (cas général — F-ES-003)

Si le salarié a effectué des versements à différentes dates \(\{t_j\}_{j=1}^{J}\), chaque versement \(j\) ayant son propre horizon \(H_j = t_j + n_{\mathrm{bloc}}\) :

\[\boxed{PM_i = \sum_{j=1}^{J} C_{ij} \times v(t_0,\,H_j) \times p^{(\tau)}(x_i,\,t_0,\,H_j)}\]

avec : - \(C_{ij}\) = capital du millésime \(j\) revalorisé à \(t_0\) : \(C_{ij} = c_j \times (1+\rho_{\text{net}})^{(t_0-t_j)}\) - \(v(t_0,\,H_j) = (1+i)^{-(H_j-t_0)}\) en taux fixe, produit en taux variable - \(p^{(\tau)}(x_i,\,t_0,\,H_j)\) = probabilité de maintien sur \((H_j - t_0)\) années

PM totale de la population : $\(PM_{\text{totale}} = \sum_{i=1}^{N} PM_i\)$

3.4 Conventions de durée (implémentation effective)

Grandeur Convention Formule
Capitalisation \(C_{ij}\) Mois entiers / 12 \(n_{\text{mois}} = (\text{année}_{t_0} - \text{année}_{t_j}) \times 12 + (\text{mois}_{t_0} - \text{mois}_{t_j})\)
Actualisation \(v(t_0,H_j)\) Jours exacts / 365,25 \(n_j = (H_j - t_0)\text{.days} / 365{,}25\)
Probabilité \(p^{(\tau)}\) Idem actualisation \((1-w)^{n_j}\) avec \(n_j\) en années

Convention d'arrondi : Arrondi à l'unité FCFA après chaque calcul intermédiaire dans l'ordre : salaire → S1 → S2 → Abondement → Total → Capital revalorisé → DBO millésime.

3.5 Table composite de décréments \(p^{(\tau)}\)

Modèle théorique complet (cible) :

\[p_x^{(\tau)} = \Bigl(1 - q_x^{(d)}\Bigr) \Bigl(1 - q_x^{(w)}\Bigr) \Bigl(1 - q_x^{(i)}\Bigr) \Bigl(1 - q_x^{(\mathrm{mar})}\Bigr) \Bigl(1 - q_x^{(\mathrm{nais})}\Bigr) \Bigl(1 - q_x^{(\mathrm{immo})}\Bigr) \cdots\]

La survie sur \(n\) années : $\({}_{n}p_x^{(\tau)} = \prod_{k=0}^{n-1} p_{x+k}^{(\tau)}\)$

Implémentation effective (v2.0) : Le moteur utilise un taux de sortie global \(w\) qui absorbe rotation volontaire et rupture de contrat :

\[p^{(\tau)}(x_i,\,t_0,\,H_j) = (1 - w)^{H_j - t_0}\]

où $w = $ HypothesesEpargne.taux_rotation. Cette simplification est actuariellement acceptable en zone CEMAC où les données de sinistralité fine par âge ne sont pas disponibles. La migration vers la table composite complète est prescrite en §7.

3.6 Valeur actuelle des cotisations futures — Régimes DC (DBO moteur)

La DBO moteur affichée dans les résultats individuels est la valeur actuelle des cotisations futures que l'employeur s'est engagé à verser jusqu'à la retraite — distincte de la PM (droits déjà constitués).

\[\mathrm{DBO}_{\mathrm{DC},i} = \sum_{j=1}^{n_i \cdot m} \frac{c_i^{(m)}}{m} \times v^{j/m} \times {}_{j/m}p_x^{(\tau)}\]

En notation compacte : $\(\mathrm{DBO}_{\mathrm{DC},i} = \frac{c_i^{(m)}}{m} \times \ddot{a}_{x:\overline{n_i|}}^{(m)}\)$

Note terminologique importante

Grandeur Définition Usage
PM Valeur actuelle des capitaux déjà constitués jusqu'à \(H_j\) Droits acquis passés
DBO moteur Valeur actuelle des cotisations futures jusqu'à la retraite Engagement total employeur

Pour un régime DC pur en cours de vie, DBO moteur > PM est la situation normale : l'employeur s'engage encore à verser des cotisations futures. La fiche individuelle affiche les deux grandeurs et documente explicitement leur différence.

3.7 Passif probabilisé — Intéressement (droits aléatoires)

Loi discrète \(\{(p_s, V_s)\}\) (scénarios) : $\(\mathbb{E}[\text{Prime}] = \sum_{s=1}^{S} p_s\,V_s, \qquad \sum_s p_s = 1\)$

Loi normale \(\mathcal{N}(\mu_P, \sigma_P^2)\) : $\(\mathbb{E}[\text{Prime}] = \mu_P\)$

DBO dans les deux cas : $\(\mathrm{DBO}_{\text{aléatoire}} = \mathbb{E}[\text{Prime}] \times \frac{k}{K} \times v^n \times {}_{n}p_x^{(\tau)}\)$

Variance du passif pour l'analyse de risque stochastique : $\(\mathrm{Var}(\mathrm{DBO}) = \sigma_P^2 \times \left(\frac{k}{K}\right)^2 \times \Bigl(v^n \times {}_{n}p_x^{(\tau)}\Bigr)^2\)$

3.8 Illustration numérique — Gestion des millésimes

Salarié de 38 ans, blocage 5 ans, \(i = 6\,\%\) fixe, versements annuels en fin d'exercice, \(\rho_{\text{net}} = 3{,}85\,\%\) :

Millésime Date versement Capital \(C_{ij}\) (FCFA) Horizon \(H_j\) \(v(t_0,H_j)\) \({}_{H_j-t_0}p_{x}^{(\tau)}\)
2021 31/12/2021 450 000 31/12/2026 \((1{,}06)^{-6}\) \({}_6p_{37}^{(\tau)}\)
2022 31/12/2022 480 000 31/12/2027 \((1{,}06)^{-5}\) \({}_5p_{38}^{(\tau)}\)
2023 31/12/2023 510 000 31/12/2028 \((1{,}06)^{-4}\) \({}_4p_{39}^{(\tau)}\)
2024 31/12/2024 540 000 31/12/2029 \((1{,}06)^{-3}\) \({}_3p_{40}^{(\tau)}\)
2025 31/12/2025 570 000 31/12/2030 \((1{,}06)^{-2}\) \({}_2p_{41}^{(\tau)}\)
Total 2 550 000 \(PM_i = \sum_{j} PM_{ij}\)

3.9 Décomposition IAS 19 — Waterfall annuel

L'équation de réconciliation s'applique identiquement aux régimes d'épargne salariale :

\[\boxed{ \mathrm{DBO}_t = \mathrm{DBO}_{t-1} + \underbrace{CSR}_{\text{service rendu}} + \underbrace{IC}_{\text{intérêt}} - \underbrace{\text{Prest.}}_{\text{versé}} \pm \underbrace{\text{Rééval.}}_{\text{OCI}} \pm \underbrace{\text{Modif.}}_{\text{P\&L}} }\]

Coût des services rendus (CSR) — Régime DC : $\(CSR_{\mathrm{DC}} = c_{\text{exercice}} \times v^{1/2} \times {}_{1/2}p_x^{(\tau)}\)$

Coût d'intérêt (IC) : $\(IC = \mathrm{DBO}_{t-1} \times i_t\)$

Note d'implémentation v2.0 — DBO ouverture

En première évaluation, dbo_ouverture = 0 (aucun historique disponible). cout_interet = 0 en conséquence. Les réévaluations absorbent la totalité de la DBO clôture moins le CSR. Le waterfall multi-années (lecture de la DBO clôture N-1 depuis l'évaluation précédente) est une évolution prescrite (§7).

3.10 Analyse de Sensibilité — Prescrite

Statut : resultats['sensibilite'] = [] dans le moteur v2.0. L'onglet Sensibilité est présent dans l'interface mais non alimenté. Cette section documente la spécification complète à implémenter (§7).

Duration actuarielle : $\(\mathcal{D} \approx -\frac{1}{\mathrm{DBO}}\,\frac{\partial\,\mathrm{DBO}}{\partial i} \approx \frac{\mathrm{DBO}(i-\Delta i) - \mathrm{DBO}(i+\Delta i)}{2\,\Delta i\cdot\mathrm{DBO}(i)}\)$

Pour un régime avec horizon moyen de 7 ans et \(i = 6\,\%\), typiquement \(\mathcal{D} \approx 6{,}5\,\text{ans}\) soit \(\approx 6{,}5\,\%\) de variation de la DBO par point de taux.

Matrice de sensibilité à produire (6 scénarios minimum) :

Paramètre \(-1\,\%\) \(-0{,}5\,\%\) Base \(+0{,}5\,\%\) \(+1\,\%\)
Taux d'actualisation \(i\) \(\Delta\mathrm{DBO}\) \(\Delta\mathrm{DBO}\) Référence \(\Delta\mathrm{DBO}\) \(\Delta\mathrm{DBO}\)
Revalorisation salaires \(g\) \(\Delta\mathrm{DBO}\) Référence \(\Delta\mathrm{DBO}\)
Taux de rotation \(w\) \(\Delta\mathrm{DBO}\) Référence \(\Delta\mathrm{DBO}\)
Rendement \(\rho\) \(\Delta\mathrm{DBO}\) Référence \(\Delta\mathrm{DBO}\)

Chaque cellule \(\Delta\mathrm{DBO}\) est calculée en recalculant la DBO totale avec le paramètre modifié, tous les autres fixés. Le résultat est exprimé en FCFA et en % de la DBO de référence.


4. Fonctionnalités de la Plateforme ActuaryLab

4.1 Vue d'ensemble — Statut de livraison

# Fonctionnalité Description Statut
F01 Paramétrage universel 7 blocs, page unique, HTMX ✅ Livré
F02 Générateur de jeux de test Seed reproductible, 8 axes aléatoires ✅ Livré
F03 Évaluation du passif social PM millésimée + DBO moteur ✅ Livré
F04 Décomposition IAS 19 / SYSCOHADA Waterfall CSR + IC + réévaluations ✅ Livré (1ère éval.)
F05 Détail individuel Fiche millésimée, tableau PM/DBO, export JSON ✅ Livré
F06 Fiche de spécification du régime Reproductibilité complète, export PDF ✅ Livré
F07 Fiche technique actuarielle Synthèse 1-2 pages, export PDF ✅ Livré
F08 Audit snapshots ResultatAuditEpargne — validation actuarielle ✅ Livré
F09 Projections N+1→N+5 DBO + cotisations projetées ✅ Livré (simplifié)
F10 Analyse de sensibilité Duration + matrice \(\Delta i / \Delta g / \Delta w / \Delta\rho\) 🔲 Prescrit — §7
F11 Waterfall multi-années Lecture DBO N-1 depuis éval. précédente 🔲 Prescrit — §7
F12 Table composite complète Décréments déblocages anticipés distincts 🔲 Prescrit — §7
F13 Projections réelles N+1→N+10 Renouvellement population, décréments réels 🔲 Prescrit — §7

4.2 Projections individuelles à la sortie (F05)

Pour chaque salarié, le relevé de compte affiche 3 scénarios de capital à la sortie :

\[C_{\text{sortie}}^{(\text{scén})} = C_{\text{acquis}} \times (1+\rho^{(\text{scén})})^T + c_{\text{annuelle}} \times \frac{(1+\rho^{(\text{scén})})^T - (1+g^{(\text{scén})})^T}{\rho^{(\text{scén})} - g^{(\text{scén})}}\]
Scénario \(\rho^{(\text{scén})}\) \(g^{(\text{scén})}\)
Pessimiste \(\max(\rho_{\text{net}} - 1{,}5\,\%, 0{,}5\,\%)\) \(\max(g - 1\,\%, 0{,}5\,\%)\)
Central \(\rho_{\text{net}}\) \(g\)
Optimiste \(\rho_{\text{net}} + 1{,}5\,\%\) \(g + 1\,\%\)

5. Architecture Technique — Modèles et Structure des Données

5.1 Modèles Django

PlanEpargne — Régime d'épargne (paramètres structurels)

Champ clé Type Description
dossier FK DossierMission Plan rattaché à un dossier de mission
type_regime CharField DC / DB / hybride / aléatoire
taux_cotisation_employeur DecimalField(6,4) Taux S1 par défaut
assiette_cotisation CharField salaire_brut / base / plafond_cnss / personnalisée
frequence_versement SmallIntegerField 1 / 2 / 4 / 12 versements/an
mode_vesting CharField immediat / lineaire / cliff / grille
duree_blocage SmallIntegerField Années de blocage obligatoire
abondement_actif BooleanField Active la source S2
frais_gestion_annuels DecimalField(5,4) Déduit du rendement brut

EvaluationEpargne — Évaluation concrète

Champ clé Type Description
dossier FK DossierMission Évaluation rattachée au dossier
photographie FK PhotographieSalaries Snapshot population utilisé
plan FK PlanEpargne Régime évalué
statut CharField brouillon / donnees / parametrage / calcul / calcule / valide / archive
resultats JSONField Structure complète des résultats (§2 Phase 3)
config_eligibilite JSONField Filtres phase 1
config_segmentation JSONField Axes et barèmes phase 1
referentiel_comptable CharField syscohada / ias19 / double
source_reglementaire CharField legal / sectoriel / entreprise / individuel

HypothesesEpargne — Hypothèses actuarielles (OneToOne → EvaluationEpargne)

Contient tous les taux (avec modes fixe/table), la table de mortalité, les configurations de déblocages anticipés, les paramètres fiscaux et les données de couverture d'actifs. Valeurs par défaut CEMAC : \(i=6\,\%\), \(g=3\,\%\), \(\rho=5{,}5\,\%\), \(w=5\,\%\), CIMA 2018.

ResultatAuditEpargne — Snapshot d'audit

Snapshot immuable d'un résultat de calcul pour validation actuarielle. Contient les paramètres utilisés, les KPIs agrégés et le JSON complet des résultats. Statut : brouillon / validé / rejeté.

5.2 Rôles et cloisonnement d'accès

Rôle Code Accès module épargne
Administrateur BFEV AD Accès total, tous clients
Actuaire responsable AC Clients et dossiers affectés — calcul + validation
Consultant CO Dossiers affectés — consultation + import données

Toutes les vues du module appliquent _assert_dossier_access(request, dossier) pour vérifier côté serveur que l'utilisateur a bien accès au dossier concerné.


6. Extensions de la Bibliothèque actuariat_lib

6.1 Fonctions implémentées (intégrées dans services.py et millesimes_service.py)

Les fonctions F-ES-001 à F-ES-005 sont implémentées directement dans le module Django plutôt que comme fonctions formelles d'actuariat_lib. Cette approche pragmatique évite une couche d'abstraction inutile pour la taille actuelle des populations traitées.

F-ES-001 — Évaluation du taux (inline dans services.py)

Gestion des taux fixes et tables via les champs mode_taux_* et table_taux_* de HypothesesEpargne. Pour un mode fixe, le taux est lu directement. Pour une table, la lecture suit la logique de palier ou d'interpolation selon le mode.

F-ES-002 — Calcul de la base distribuable (inline dans services.py)

inter = _montant_interessement(assiette, salaire_mensuel, hypotheses)
part  = assiette * taux_participation  # si participation_active

Répartition prorata salaire × ancienneté avec paramètre \(\alpha\) : $\(P_i = P_{\text{global}} \times \frac{S_i \cdot k_i^{\alpha}}{\sum_j S_j \cdot k_j^{\alpha}}\)$

F-ES-003 — DBO millésimée individuelle (millesimes_service._calculer_millesimes)

Implémentation complète de la formule : $\(PM_i = \sum_{j=1}^{J_i} C_{ij} \times v(t_0,H_j) \times p^{(\tau)}(x_i,t_0,H_j)\)$

Avec \(p^{(\tau)} = (1-w)^n\) dans la version actuelle (taux global — voir §3.5).

F-ES-004 — DBO population (boucle dans services.calculer_resultats_epargne)

Somme des DBO individuelles sur la population retenue. Implémentation en boucle Python — vectorisation NumPy \((N \times J_{\max})\) prescrite pour les grandes populations (§7).

F-ES-005 — Projection des cotisations futures (millesimes_service.calculer_projections_individuelles)

Projection du capital de sortie sur 3 scénarios (pessimiste/central/optimiste) : $\(C_H = C_0(1+\rho)^n + c \cdot \frac{(1+\rho)^n - (1+g)^n}{\rho - g}\)$

La projection multi-années avec renouvellement de population est prescrite en §7.

6.2 Structures de données prescrites (évolution future)

TauxVariable — Dataclass rétrocompatible

@dataclass(frozen=True)
class TauxVariable:
    mode: str = 'FIXE'
    valeur_fixe: Optional[float] = None
    table: Optional[List[Tuple]] = None
    interpolation: str = 'LINEAIRE'

    def evaluer(self, x: float = 0.0, anciennete: float = 0.0, annee: int = 0) -> float:
        """Retourne le taux au point (x, ancienneté, année) selon le mode."""
        ...

Un float passé là où TauxVariable est attendu est automatiquement converti — aucun test existant à réécrire.

\[\tau(x, k, t) = \begin{cases} \tau_{\text{fixe}} & \text{si mode = FIXE} \\[4pt] \tau_j + \dfrac{\tau_{j+1} - \tau_j}{b_{j+1} - b_j}(z - b_j) & \text{si TABLE, LINEAIRE} \\[4pt] \tau_j & \text{si TABLE, PALIER} \end{cases}\]

MillesimeVersement — Versement individuel horodaté

@dataclass
class MillesimeVersement:
    date_versement:     date   # Date exacte du versement
    montant:            float  # Montant en FCFA
    source:             str    # 'S1_COTISATION' | 'S2_ABONDEMENT' | ...
    horizon_deblocage:  date   # Première date de disponibilité
    capital_revalorise: float = 0.0

7. Feuille de Route — Évolutions Prescrites

Les points suivants constituent le backlog technique prescrit pour rapprocher le moteur de la spécification mathématique complète de ce document.

7.1 Évolution E1 — Analyse de sensibilité (F10)

Priorité : Haute — fonctionnalité attendue par les actuaires BFEV
Effort : Moyen (3–5 jours)

Implémenter dans services.calculer_resultats_epargne() le calcul de la matrice de sensibilité en recalculant la DBO pour chaque variation paramétrique. Alimenter resultats['sensibilite'] avec la structure :

[{
  'parametre': 'taux_actualisation',  # ou 'taux_revalorisation', 'taux_rotation', 'taux_rendement'
  'variation': -0.01,                 # en décimal
  'dbo': 12_500_000.0,               # DBO recalculée en FCFA
  'ecart_pct': 6.2,                  # % d'écart vs DBO de référence
}]
Calculer la duration \(\mathcal{D}\) et l'inclure dans resultats['global']['duration_actuarielle'].

7.2 Évolution E2 — Waterfall multi-années (F11)

Priorité : Haute — requis pour les rapports IAS 19 des exercices N+1 et suivants
Effort : Moyen (3–4 jours)

Implémenter la lecture de la DBO clôture de l'évaluation N-1 (même dossier, exercice précédent) pour alimenter dbo_ouverture du waterfall. La liaison sera dossier.exercice - 1. En l'absence d'évaluation N-1, dbo_ouverture = 0 (comportement actuel).

7.3 Évolution E3 — Table composite complète (F12)

Priorité : Moyenne
Effort : Moyen (4–6 jours)

Remplacer \(p^{(\tau)} = (1-w)^n\) par le produit multi-décréments complet : $\(p_x^{(\tau)} = (1-q_x^{(d)})(1-q_x^{(w)})(1-q_x^{(i)})(1-q_x^{(\mathrm{mar})})\cdots\)$

Utiliser construire_table_composite d'actuariat_lib.probabilites en intégrant les décréments de déblocage anticipé (config_deblocages) comme causes de sortie additionnelles.

7.4 Évolution E4 — Projections multi-années réelles (F13)

Priorité : Moyenne
Effort : Élevé (8–12 jours)

Implémenter F-ES-005 complet avec renouvellement de population sur N années : $\(\hat{c}_t = \sum_{i \in \text{actifs}(t)} \frac{c_i^{(m)}(t)}{m} \times {}_{t-t_0}p_{x_i}^{(\tau)}\)$

avec la cotisation projetée : $\(c_i^{(m)}(t) = \tau_i \times S_i \times \prod_{s=0}^{t-t_0-1}(1+g_{t_0+s})\)$

Sortie : DataFrame { annee, cotisation_projetee, dbo_projetee, effectif_projete, csr, ci } sur 10 ans.

7.5 Évolution E5 — Vectorisation NumPy F-ES-004

Priorité : Basse (acceptable jusqu'à ~2 000 salariés)
Effort : Moyen (2–3 jours)

Remplacer la boucle Python de calculer_resultats_epargne par des matrices NumPy \((N \times J_{\max})\) :

C_matrix   = np.array([[C_ij]])          # (N, J_max) capitaux
H_matrix   = np.array([[H_ij - t_0]])   # durées résiduelles
v_matrix   = actualiser_vectorise(H_matrix, i)
p_matrix   = prob_maintien_vectorise(X, H_matrix, w)
DBO_matrix = C_matrix * v_matrix * p_matrix
DBO_totale = DBO_matrix.sum()


8. Récapitulatif

8.1 Ce qui est implémenté — Bilan v2.0

Composante Statut Référence code
Workflow 4 phases (Données → Résultats) views.py : phase1_donneesphase4_resultats
Paramétrage 7 blocs — page unique HTMX phase2_parametrage.html + _sauvegarder_bloc()
Filtres éligibilité + segmentation services.appliquer_filtres_eligibilite()
Formule PM millésimée F-ES-003 millesimes_service._calculer_millesimes()
Vesting 4 modes millesimes_service._calculer_vesting()
Sources S1/S2/S3/S4 services.calculer_resultats_epargne()
Waterfall IAS 19 (1ère évaluation) resultats['waterfall']
Projections N+1→N+5 (simplifiées) resultats['projections']
Fiche individuelle millésimée views.fiche_individuelle_salarie()
Export JSON audit views.fiche_individuelle_export_json()
Fiche de spécification reproductibilité views.fiche_specification_regime()
Générateur jeux de test reproductibles generateur.py — seed UUID
Snapshot audit ResultatAuditEpargne models.ResultatAuditEpargne
Analyse de sensibilité 🔲 Prescrite — §7.1
Waterfall multi-années 🔲 Prescrit — §7.2
Table composite multi-décréments 🔲 Prescrite — §7.3
Projections réelles N+1→N+10 🔲 Prescrites — §7.4

8.2 Validations actuarielles — Résultats terrain

Salarié PM reconstituée PM moteur Écart
EMP-196 SOMARE 1 613 100 FCFA 1 613 100 FCFA 0,000 %
EMP-066 BALDE 1 473 545 FCFA 1 473 545 FCFA 0,000 %

Audit conduit par 5 IA indépendantes sur la population réelle EGCC (192 salariés).

8.3 Conclusion

Le module Épargne Salariale est fonctionnellement complet pour les besoins immédiats de Cabinet BFEV sur la zone CEMAC/OHADA.

La formule centrale PM millésimée (F-ES-003) est implémentée correctement et validée à 0,000 % d'écart. Les quatre évolutions prescrites (§7) constituent un backlog ordonné par priorité pour renforcer progressivement la rigueur actuarielle du moteur sans remettre en cause les résultats existants.

Aucun concurrent dans la zone OHADA ne propose aujourd'hui un outil combinant la conception de régimes d'épargne salariale et l'évaluation actuarielle du passif social sur une seule plateforme.


Document de référence — Module Épargne Salariale Universelle v2.0 Cabinet BFEV — Plateforme ActuaryLab — Mars 2026 Usage interne confidentiel