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¶
- Introduction et Vision Stratégique
- Architecture du Paramétrage — Workflow 4 Phases
- Phase 1 — Sélection des Données
- Phase 2 — Paramétrage en 7 Blocs
- Phase 3 — Calcul
- Phase 4 — Résultats
- Évaluation du Passif Social — Méthodologie
- Fonctionnalités de la Plateforme ActuaryLab
- Architecture Technique — Modèles et Structure des Données
- Extensions de la Bibliothèque
actuariat_lib - Feuille de Route — Évolutions Prescrites
- 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\) :
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 versaudit_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}}\) :
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) :
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 :
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).
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 :
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 = 0en 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 :
| 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.
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
}]
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_donnees → phase4_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