Aller au contenu

Core HR (HRCORE) — Hybride PRD+FSD

Code du module : HRCORE
Produit : Papillon HR Suite + ALTARYS ENTERPRISE HR Suite
Pays concernés : CI (Côte d'Ivoire) — MVP
Version : 1.0
Date : 01/03/2026
Auteur : ANALYST (Claude Code)


PARTIE A — Exigences du produit (PRD)


A.1 Résumé

Le problème

Les entreprises en Côte d'Ivoire doivent tenir à jour un dossier du personnel pour chaque employé, conformément au Code du travail 2015 (loi n° 2015-532) et aux obligations d'enregistrement des employeurs. La plupart des PME gèrent cela à l'aide de dossiers papier, de feuilles de calcul Excel ou de photos de documents sur WhatsApp. Cela entraîne :

  • Risque de non-conformité : documents obligatoires manquants (certificats médicaux, attestations CNPS, copies de pièces d'identité) découverts uniquement lors des inspections du travail.
  • Fragilité des données : dossiers des employés dispersés dans des dossiers physiques, des clés USB et plusieurs fichiers Excel — aucune source unique de vérité.
  • Inefficacité opérationnelle : les responsables RH passent des heures à rechercher des informations sur les employés, à générer manuellement des registres et à répondre aux demandes des employés concernant des certificats ou des informations sur leur profil.
  • Risque lié à la confidentialité : les données personnelles sensibles (numéros d'identité nationaux, informations bancaires, dossiers médicaux) sont stockées dans des fichiers non protégés, sans piste d'audit ni contrôle d'accès.

La solution

Core HR (HRCORE) est la couche de données enrichies sur les employés qui transforme le dossier de base des employés du Control Plane en un dossier du personnel complet, conforme et consultable. Il s'agit :

  • D'un module d'enrichissement des données : couche 2 au-dessus de l'entité de base des employés du Control Plane (couche 1). Il ajoute des données personnelles, des informations bancaires, des contacts d'urgence, des photos, des documents et la gestion des personnes à charge.
  • PAS un module de processus : la gestion du cycle de vie des contrats, les workflows d'intégration/de départ, les événements administratifs, les déclarations, le suivi des périodes d'essai et les procédures de licenciement relèvent de Employee Management (EMPMGT). Core HR concerne les données, EMPMGT concerne les processus.
  • Un module optionnel commercialisable : Les tenants qui n'utilisent pas Core HR utilisent la base de référence Control Plane, qui est suffisante pour les absences, les présences et la paie. Core HR enrichit le dossier des employés à des fins de conformité, de reporting et pour offrir une expérience utilisateur plus riche.

Position du module dans la plateforme

Control Plane (couche 1 — toujours présente)
  └── Employé de base : nom, prénom, e-mail, téléphone,
      numéro d'employé, type de contrat, unité organisationnelle, poste,
      catégorie, date d'embauche, statut, contact préféré
      ↓ Suffisant pour les absences, les présences et la paie

Core HR (couche 2 — optionnel, vendable) 
 └── Employé enrichi : date_of_birth, nationality, national_id,
      cnps_number, marital_status, dependents[], bank_info,
      emergency_contacts[], photo, documents[], address,
      gender, blood_type, place_of_birth, parents, qualifications,
      previous_employer, change_history_view 
      ↓ « Dossier du personnel » complet

Gestion des employés (couche 3 — facultative, commercialisable)
  └── Couche de processus : intégration, départ, cycle de vie du contrat,
      suivi de la période d'essai, événements administratifs, déclarations
      ↓ « Actes administratifs »

A.2 Personnages utilisateurs

P2 : Responsable RH / HR Manager —

  • Utilisateur principal de Core HR
  • Utilisations : crée et enrichit les profils des employés, gère les documents, génère le registre du personnel, gère les informations bancaires, répond aux demandes de données des employés
  • Préoccupation principale : « Compléter les dossiers des employés, trouver rapidement les informations, être prêt pour les inspections. »
  • Contexte Papillon : Souvent une seule personne (conjoint(e) du DG, assistant(e) de confiance) gérant 5 à 50 dossiers d'employés. Transition depuis le papier/Excel. Besoin de simplicité et d'accompagnement — par exemple, indicateurs visuels des dossiers d'employés incomplets.
  • Contexte Entreprise : Responsable RH professionnel gérant des centaines de profils. Besoin d'opérations groupées et d'une saisie de données efficace. (Remarque : Core HR est sans différenciation de marque pour la V1.)

P1 : Directeur général (DG) / PDG —

  • Utilisateur secondaire
  • Utilisations : consulte les profils des employés, n'approuve rien dans Core HR (les workflows d'approbation se trouvent dans EMPMGT), accède aux tableaux de bord et aux statistiques
  • Contexte Papillon : dans les très petites entreprises (S1-S2), le DG EST le responsable RH — la même personne occupe les deux fonctions.

P4 : Employé —

  • Utilisateur en libre-service
  • Utilisations : consulte son propre profil (enrichi lorsque HR Core est actif), met à jour ses coordonnées personnelles (téléphone, e-mail, adresse), gère ses contacts d'urgence, télécharge/met à jour sa photo
  • Préoccupation principale : « Voir mes informations, mettre à jour mon numéro de téléphone, vérifier que mon numéro CNPS est correct. »
  • Contexte Papillon : faible maîtrise du numérique, téléphone Android, connectivité intermittente. Besoin d'une simplicité absolue.

P3 : Comptable —

  • Utilisateur financier en lecture seule
  • Utilisations : lit les données financières des employés (informations bancaires, catégorie d'employé) pour le rapprochement des salaires/comptes
  • Préoccupation principale : « Vérifier que les coordonnées bancaires correspondent aux registres de paie. »
  • NE FAIT PAS : modifier les profils des employés, accéder aux données personnelles (numéro d'identification national, documents médicaux)

P-MGR : Manager (N+1) —

  • Utilisateur en lecture seule de l'équipe
  • Utilisations : consulte les profils de ses subordonnés directs (employés de son unité organisationnelle). Accès en lecture seule.
  • Préoccupation principale : « Connaître les informations clés sur les membres de mon équipe sans passer par les RH. »

A.3 Users stories

US-HRCORE-001 : Profil d'employé enrichi

En tant que responsable RH, je souhaite enrichir le profil d'un employé avec des données personnelles, des contacts d'urgence, des informations bancaires, une photo et des documents, afin de conserver un dossier du personnel complet et conforme.

Critères d'acceptation : - Étant donné que j'ai le module HRCORE actif et le rôle de responsable RH, Lorsque j'ouvre le profil d'un employé, je vois tous les champs de la couche 2 disponibles pour modification. - Étant donné que je remplis tous les champs obligatoires de HR Core, lorsque j'enregistre le profil, le système consigne les modifications dans la piste d'audit et publie un événement EmployeeUpdated. - Étant donné que je laisse le champ du numéro CNPS vide, lorsque j'enregistre, le système enregistre correctement mais crée une alerte persistante me rappelant d'enregistrer l'employé auprès du CNPS.

US-HRCORE-002 : Affichage du profil en libre-service des employés

En tant qu' employé, je souhaite afficher mon profil complet (données personnelles, résumé des informations bancaires, contacts d'urgence, documents), afin de pouvoir vérifier que mes informations sont correctes et à jour.

Critères d'acceptation : - Étant donné que je suis un employé avec un compte actif et que HR Core est actif pour mon tenant, lorsque je navigue vers « Mon profil », je vois alors mon profil enrichi avec toutes les données de couche 2. - Étant donné que je consulte mes informations bancaires, je ne vois alors que les 4 derniers chiffres de mon numéro de compte (affichage masqué). - Étant donné que je suis hors ligne, lorsque je consulte mon profil, je vois alors la version mise en cache de ma dernière connexion en ligne.

US-HRCORE-003 : Modification par l'employé en libre-service

En tant qu' employé, je souhaite mettre à jour mon numéro de téléphone, mon adresse e-mail personnelle, mon adresse, mes contacts d'urgence et ma photo, afin que mes informations restent à jour sans avoir à attendre le service RH.

Critères d'acceptation : - Étant donné que je suis un employé, lorsque je modifie mon numéro de téléphone et que j'enregistre, la modification prend effet immédiatement (aucune approbation n'est nécessaire) et un événement EmployeeUpdated est publié. - Étant donné que je suis hors ligne, lorsque je modifie mon adresse et que j'enregistre, la modification est mise en file d'attente dans IndexedDB et synchronisée lorsque la connexion est rétablie dans les 30 secondes. - Étant donné que j'essaie de modifier mon numéro d'identité national, le champ est en lecture seule et le message « Contactez les RH pour modifier cette information » s'affiche.

US-HRCORE-004 : Gestion des informations bancaires

En tant que responsable RH, je souhaite gérer les informations bancaires des employés (nom de la banque, numéro de compte, IBAN/RIB), afin que le service de paie puisse traiter correctement les paiements de salaire (post-MVP).

Critères d'acceptation : - Étant donné que j'ai le rôle de responsable RH ou de DG, lorsque je mets à jour les informations bancaires d'un employé, la modification est alors enregistrée dans la piste d'audit et un événement EmployeeBankInfoChanged est publié. - Étant donné que je suis un employé, lorsque j'essaie de modifier mes informations bancaires, le champ est alors en lecture seule. - Étant donné que je suis comptable, lorsque je consulte les informations bancaires d'un employé, je vois alors toutes les coordonnées bancaires (en lecture seule).

US-HRCORE-005 : Pièce jointe de document avec taxonomie

En tant que responsable RH, je souhaite joindre des documents au profil d'un employé avec des catégories structurées (contrat, certificat médical, identité, attestation CNPS, etc.), afin de pouvoir organiser et trouver facilement les documents et vérifier que les dossiers sont complets.

Critères d'acceptation : - Étant donné que je télécharge un document, lorsque je sélectionne une catégorie dans le menu déroulant, le document est stocké dans MinIO avec les métadonnées de la catégorie. - Étant donné que le système a pré-rempli les catégories, lorsque j'ai besoin d'une catégorie qui ne figure pas dans la liste, alors je peux contacter le DG/l'administrateur pour ajouter une catégorie personnalisée (V1 : gérée par l'administrateur ; V2 : création en ligne). - Étant donné que je consulte l'onglet « Documents » d'un employé, lorsque je filtre par catégorie, je ne vois alors que les documents de cette catégorie.

US-HRCORE-006 : Recherche plein texte des employés

En tant que responsable RH, je souhaite disposer d'un champ de recherche unique qui recherche les noms des employés et les champs configurables à l'aide de la recherche plein texte PostgreSQL, afin de pouvoir trouver rapidement n'importe quel employé sans avoir à naviguer dans des formulaires de filtrage complexes.

Critères d'acceptation : - Étant donné que je tape « Kouassi » dans le champ de recherche, lorsque j'appuie sur Entrée, je vois tous les employés dont le nom ou le prénom correspond à « Kouassi ». - Si je tape « Comptabilité » dans le champ de recherche, lorsque j'appuie sur Entrée, je vois tous les employés du service Comptabilité (le service est un champ de recherche par défaut). - Si je suis directeur général/directeur des ressources humaines, lorsque je vais dans la configuration de la recherche, je peux ajouter ou supprimer des champs de l'index de recherche en texte intégral (par exemple, ajouter cnps_number ou national _id_number).

US-HRCORE-007 : Importation groupée d'employés

En tant que responsable RH ou DG, je souhaite importer en masse des employés via Excel avec les champs d'enrichissement HR Core inclus, afin de pouvoir migrer rapidement nos données existantes sur les employés au lieu de saisir les profils un par un.

Critères d'acceptation : - Étant donné que HR Core est actif, lorsque je télécharge le modèle d'importation, celui-ci inclut tous les champs de la couche 1 (CP) + les champs d'enrichissement de la couche 2 (HR Core). - Étant donné que je télécharge un fichier Excel rempli, lorsque le système l'analyse, je vois alors un tableau de confirmation modifiable avec les erreurs de validation mises en évidence (par exemple, numéros d'employés en double, format CNPS non valide). - Étant donné que certains champs HR Core sont laissés vides dans l'importation, lorsque je soumets, les employés sont alors créés avec les données fournies, sans échec de validation sur les champs HR Core facultatifs vides.

US-HRCORE-008 : Exportation du registre du personnel (Fascicule 1)

En tant que responsable RH, je souhaite exporter le registre du personnel (Fascicule 1 — données personnelles) sous forme de document PDF ou Excel conforme, afin d'être prêt pour les inspections du travail et les audits de la CNPS.

Critères d'acceptation : - Étant donné que je clique sur « Exporter le registre du personnel », lorsque l'exportation est générée, elle contient tous les employés actifs et licenciés avec les champs légalement requis (numéro d'enregistrement séquentiel, nom complet, date de naissance, nationalité, poste, catégorie, date d'embauche, numéro CNPS, etc.). - Étant donné que le numéro CNPS d'un employé est manquant, lorsque l'exportation est générée, le champ affiche « Non renseigné » et l'exportation inclut un résumé d'avertissement indiquant que les enregistrements sont incomplets.

US-HRCORE-009 : Gestion des photos des employés

En tant que responsable RH ou employé (libre-service), je souhaite télécharger et recadrer une photo d'employé pour son profil, afin que l'employé soit identifiable visuellement sur la plateforme et sur les badges d'identification.

Critères d'acceptation : - Lorsque je télécharge une photo, lorsque j'atteins l'étape du recadrage, je vois un outil de recadrage imposant un rapport d'aspect portrait de 3:4. - Une fois le recadrage confirmé, le système génère une vignette (48 px pour les vues en liste) et une version moyenne (150 px pour la fiche de profil), stockées dans MinIO. - Si la photo dépasse 2 Mo, lorsque je la télécharge, le message d'erreur « La photo ne doit pas dépasser 2 Mo » s'affiche.

US-HRCORE-010 : Gestion des personnes à charge

En tant que responsable RH, je souhaite gérer une liste détaillée des personnes à charge des employés (conjoint, enfants, autres personnes à charge) avec leurs informations personnelles, afin que le service de paie puisse calculer correctement les retenues fiscales (ITS) et les cotisations sociales (allocations familiales CNPS).

Critères d'acceptation : - Étant donné que j'ajoute une personne à charge, lorsque je remplis le nom, la date de naissance, la relation (conjoint(e), enfant, autre personne à charge), le sexe, la personne à charge est alors enregistrée et dependents_count et number_of_children sont automatiquement recalculés. - Étant donné que je marque un enfant à charge comme « scolarisé » et que je joins une attestation scolaire, alors l'indicateur school_attestation_attached est défini sur true. - Si je supprime une personne à charge, alors les comptes sont recalculés et la modification est consignée dans la piste d'audit.

US-HRCORE-011 : Affichage de l'historique des modifications

En tant que responsable RH, je souhaite voir un historique lisible des modifications apportées au profil d'un employé, afin de pouvoir retracer qui a modifié quoi et quand à des fins d'audit et de conformité.

Critères d'acceptation : - Étant donné que j'ouvre l'onglet « Historique des modifications » d'un employé, lorsque je le consulte, je vois une liste chronologique des modifications avec : la date, l'utilisateur qui a effectué la modification, le nom du champ (en français), l'ancienne valeur, la nouvelle valeur. - Étant donné que l'historique des modifications provient de la piste d'audit de la plateforme (AuditEntry), lorsque je le consulte, les données d'audit brutes sont alors traduites dans un format français convivial.

US-HRCORE-012 : Alertes de données manquantes

En tant que responsable RH, je souhaite que le système m'alerte lorsque des informations essentielles manquent dans les profils des employés (numéro CNPS, certificat médical, pièce d'identité), afin que je puisse compléter les dossiers de manière proactive avant les inspections ou les audits.

Critères d'acceptation : - Étant donné que le numéro CNPS d'un employé est vide, lorsque je consulte le tableau de bord RH ou la liste des employés, je vois alors un badge d'alerte persistant. - Étant donné que l'alerte est active depuis plus de 30 jours, lorsque je consulte le tableau de bord, l'alerte est alors escaladée (surlignée en rouge) . - Étant donné que je remplis le numéro CNPS manquant, l'alerte est automatiquement supprimée.


A.4 Exigences non fonctionnelles

Exigence Cible Remarques
Temps de chargement du profil < 1,5 seconde avec une connexion 3G Page de profil de l'employé (tous les onglets)
Temps de réponse de la recherche < 500 ms pour une recherche en texte intégral avec jusqu'à 350 employés PostgreSQL FTS doit être indexé
Importation en masse Traitement de 500 employés en moins de 30 secondes Tâche en arrière-plan avec indicateur de progression
Téléchargement de photos < 3 secondes (téléchargement + recadrage + génération de vignettes) Recadrage côté client, vignettes côté serveur
Exportation du registre < 10 secondes pour 350 employés Génération en arrière-plan avec lien de téléchargement
Affichage du profil hors ligne Disponible dans les 200 ms à partir d'IndexedDB Mis en cache lors du premier affichage en ligne
Modifications simultanées du profil Modifications en ligne uniquement pour le responsable RH → aucun risque de conflit Modifications en libre-service hors ligne → éditeur unique (l'employé), aucun conflit
Stockage des documents Compartiment MinIO par tenant, soumis à des quotas de stockage par segment (S1-S6) Conforme aux quotas de stockage de la vision de la plateforme §A.8
Piste d'audit Chaque création/mise à jour/suppression de données d'employé génère une entrée d'audit immuable Exigence à l'échelle de la plateforme (FR-PV-090-091)

A.5 Portée du MVP (Core HR V1)

Dans la V1 (première version de Core HR)

  • Profil enrichi de l'employé (tous les champs de la couche 2 selon §B.1)
  • Liste détaillée des personnes à charge (nom, date de naissance, lien de parenté, sexe, attestation scolaire)
  • Contacts d'urgence (1 à 2 par employé)
  • Photo de l'employé (téléchargement + recadrage côté client + génération de vignettes)
  • Gestion des informations bancaires (écriture réservée aux RH, affichage masqué pour les employés, lecture complète pour les comptables)
  • Pièce jointe avec taxonomie structurée (catégories prédéfinies par le système + catégories personnalisées par l'administrateur)
  • Affichage du profil en libre-service pour les employés (enrichi lorsque Core HR est actif)
  • Modification minimale en libre-service pour les employés (téléphone, e-mail personnel, adresse, contacts d'urgence, photo)
  • Champ de recherche plein texte unique (PostgreSQL FTS, champs de recherche configurables)
  • Importation groupée des employés (modèle dynamique incluant les champs HR Core)
  • Exportation du Registre du personnel Fascicule 1 (PDF/Excel)
  • Historique des modifications formaté (affichage de l'interface utilisateur sur la piste d'audit de la plateforme)
  • Génération automatique du numéro d'employé ({PREFIX}-{YEAR}-{MM}-{SEQ})
  • Alertes de données manquantes (numéro CNPS, documents obligatoires)
  • Matrice des autorisations : DG/RH complète, Manager lecture équipe, Comptable lecture financière, Employé libre-service

Hors V1 — Core HR V2 (améliorations futures)

  • Champs personnalisés pour les employés (champs supplémentaires définis par le tenant au-delà du schéma standard)
  • Exportation des données des employés vers Excel/CSV avec sélection des colonnes
  • Gestion avancée des photos (téléchargement groupé de photos, génération d'un répertoire de photos)
  • Libre-service pour les employés : demande de modification du profil avec workflow d'approbation (soumission de la modification des informations bancaires → approbation par les RH)
  • Organigramme des employés (organigramme visuel)
  • Répertoire des employés (répertoire des employés consultable à l'échelle de l'entreprise)
  • Intégration avec les portails gouvernementaux (CNPS en ligne, e-impôts CI)
  • Expansion multi-pays (champs et registres spécifiques aux pays BJ, CM)
  • Politiques de conservation personnalisées par catégorie de documents (nécessite ADVDOC)

A.6 Questions ouvertes

# Question Priorité Statut
OQ-HRCORE-01 Confidentialité des données CI (loi n°2013-450) : Core HR stocke les données les plus sensibles des employés (numéro d'identification national, informations bancaires, certificats médicaux, état civil). Quelles sont les obligations spécifiques en matière de collecte, de stockage et de traitement de ces données ? Quel consentement est requis de la part des employés ? L'employeur doit-il enregistrer le traitement des données auprès de l'ARTCI ? 🔴 CRITIQUE Non résolue — reportée depuis la vision de la plateforme OQ-01. Nécessite une recherche juridique ciblée sur la loi 2013-450 telle qu'elle s'applique au traitement des données RH par l'employeur.
OQ-HRCORE-02 Statut actuel de la CCI 1977 : les catégories d'employés (cadre, agent de maîtrise, employé, ouvrier) sont issues de la CCI 1977. Cette convention a-t-elle été révisée ou remplacée ? Si oui, les noms et définitions des catégories ont peut-être changé. 🟡 ÉLEVÉ Non résolu. Utilisation des catégories CCI 1977 par défaut. Voir TV-HRCORE-01.
OQ-HRCORE-03 Seuil de délégué du personnel (CI) : à partir de quel effectif les employeurs CI sont-ils tenus d'avoir des délégués du personnel ? Affecte les flux de travail des PME(cible Papillon : 2 à 350 employés). De nombreux tenants se situeront en dessous ou à proximité de ce seuil. 🟡 ÉLEVÉ Non résolu. Signalé dans l'audit juridique CHECK 4 + CHECK 5 écart n° 3. Pertinent pour EMPMGT plus que pour Core HR, mais le seuil affecte le tableau de bord du nombre d'employés que Core HR peut afficher.
OQ-HRCORE-04 Conservation des documents : base légale : conservation de 10 ans adoptée (alignée sur l'OHADA AUDCIF pour plus de simplicité). Mais aucune base légale CI explicite n'a été trouvée pour la conservation des données personnelles des employés en particulier. La déduction de 5 ans (délai de prescription + audits CNPS) provient de la recherche juridique. À confirmer. 🟢 MOYEN Validé temporairement à 10 ans. Voir TV-HRCORE-02.
OQ-HRCORE-05 Validation du format du numéro CNPS : quel est le format exact d'un numéro d'enregistrement CNPS CI ? Combien de chiffres/caractères ? Y a-t-il un chiffre de contrôle ? Le système doit valider le format lors de la saisie. 🟢 MOYEN Non résolu. À mettre en œuvre sous forme de texte libre avec validation regex facultative lorsque le format est confirmé.
OQ-HRCORE-06 Exigences en matière de certificat d'aptitude médicale : quand un certificat doit-il être obtenu (avant l'embauche ? périodiquement ?) ? Par qui ? À quelle fréquence ? Coût à la charge de l'employeur ? A une incidence sur les contrôles d'exhaustivité des documents. 🟢 MOYEN Non résolu. Signalé dans l'audit juridique CHECK 5, lacune n° 13. Le module RH de base devrait assurer le suivi du document, mais la logique de fréquence/renouvellement pourrait relever du module HSE.
OQ-HRCORE-07 Registre d'employeur : obligatoire pour toutes les tailles d'entreprise ? : Le registre de l'employeur en 3 fascicules est-il obligatoire pour tous les employeurs, quelle que soit leur taille, y compris ceux qui n'ont qu'un seul employé ? Cela affecte l'applicabilité de la fonctionnalité d'exportation du registre. 🟢 MOYEN Non résolu. Signalé dans l'audit juridique CHECK 4. Considéré comme obligatoire pour tous pour Core HR V1.

A.7 Temporairement validé

# Élément Valeur actuelle Risque Action requise
TV-HRCORE-01 Catégories d'employés (CCI 1977) Valeurs par défaut du système : Cadre, Cadre supérieur, Agent de maîtrise, Employé/Technicien, Ouvrier. Source : CCI 1977. La CCI a peut-être été révisée. Les catégories et leurs définitions ont peut-être changé. Vérifier l'état actuel de la CCI 1977. Si elle a été mise à jour, ajuster les catégories pré-définies.
TV-HRCORE-02 Période de conservation des données des employés 10 ans après la fin du contrat (conforme à la conservation des données salariales/comptables de l'OHADA AUDCIF). Aucune base légale explicite dans le CI pour les données personnelles des employés en particulier. Il se peut que les données personnelles soient conservées trop longtemps, ce qui pourrait entrer en conflit avec les principes de minimisation des données de la loi 2013-450. Confirmer auprès d'un conseiller juridique si la conservation des données personnelles (numéro d'identité national, informations bancaires) pendant 10 ans est proportionnée ou si une période plus courte avec anonymisation est requise.
TV-HRCORE-03 CI Art. 14.x numérotation décimale Les citations de recherche juridique utilisent une numérotation décimale (Art. 14.1, 14. 2, 14.4, etc.) pour le Code du travail 2015. Ce format de numérotation n'a pas été vérifié par rapport à une copie physique/numérique de la loi. Il pourrait s'agir d'un artefact de Perplexity. Vérification ponctuelle : vérifier le Code du travail 2015 CI actuel pour confirmer le format de numérotation des articles. Si cela est confirmé, toutes les citations sont fiables.

PARTIE B — Spécifications fonctionnelles (FSD)


B.1 Modèle de données — Enrichissement des données sur les employés (couche 2)

Champs d'enrichissement des données sur les employés (Core HR s'ajoute à la base de référence CP)

Champ Type Obligatoire ? Modifiable par l'employé ? Remarques
last_name VARCHAR(100) OUI NON Correction CP : remplace full_name.
first_name VARCHAR(150) OUI NON Peut contenir plusieurs prénoms (courant en CI : « Jean-Pierre Koffi »)
date_of_birth DATE OUI NON Format JJ/MM/AAAA
place_of_birth VARCHAR(200) NON NON Lieu de naissance — courant sur les formulaires administratifs CI
gender ENUM(MALE, FEMALE) OUI NON
nationality VARCHAR(100) OUI NON Par défaut : Ivoirienne
national_id_number VARCHAR(50) NON NON Numéro de CNI ou de passeport
national_id_type ENUM(CNI, PASSPORT, TITRE_SEJOUR, OTHER) NON NON Type de document d'identité
cnps_registration_number VARCHAR(30) NON (avec alerte) NON Facultatif à la création, alerte persistante en cas d'absence. Voir FR-HRCORE-020.
tax_id VARCHAR(50) NON NON Identifiant fiscal personnel (le cas échéant)
marital_status ENUM(CELIBATAIRE, MARIE, DIVORCE, VEUF, UNION_LIBRE) NON NON Affecte les déductions fiscales
blood_type ENUM(A_POS, A_NEG, B_POS, B_NEG, AB_POS, AB_NEG, O_POS, O_NEG, UNKNOWN) NON NON Informations médicales d'urgence
father_name VARCHAR(200) NON NON Courant dans les documents administratifs CI
mother_name VARCHAR(200) NON NON Courant dans les documents administratifs CI
professional_qualifications TEXT NON NON Diplômes, certifications (texte libre pour V1)
previous_employer VARCHAR(200) NON NON Pour les calculs de transfert/ancienneté
previous_employer_exit_date DATE NON NON Pour les calculs de continuité d'ancienneté

Champs d'adresse (semi-structurés)

Champ Type Obligatoire ? Modifiable par l'employé ? Remarques
address_city VARCHAR(100) NON OUI Liste déroulante avec les principales villes CI + option de texte libre
address_commune VARCHAR(150) NON OUI Commune / Quartier (texte libre)
address_details VARCHAR(500) NON OUI Rue, point de repère, bâtiment (texte libre)

Champs relatifs aux informations bancaires

Champ Type Obligatoire ? Modifiable par l'employé ? Remarques
bank_name VARCHAR(100) NON NON Gestion réservée aux RH
bank_account_number VARCHAR(50) NON NON Affichage masqué pour l'employé (4 derniers chiffres)
bank_iban VARCHAR(50) NON NON Numéro de compte bancaire international (le cas échéant)
bank_rib_key VARCHAR(10) NON NON Clé RIB (spécifique aux banques de l'UEMOA)
bank_branch_code VARCHAR(20) NON NON Code agence

Champs de contact (modifiables par l'employé)

Champ Type Obligatoire ? Modifiable par l'employé ? Remarques
personal_email VARCHAR(255) NON OUI Distinct de l'adresse e-mail professionnelle (dans CP)
personal_phone VARCHAR (20) NON OUI Distinct du numéro de téléphone professionnel (dans CP)

Photo

Champ Type Remarques
photo_original_key VARCHAR(500) Clé d'objet MinIO pour la photo originale

| photo_medium_key | VARCHAR(500) | Version 150px | | photo_thumbnail_key | VARCHAR(500) | Version 48px |


B.2 Sous-entités

Contact d'urgence

Champ Type Obligatoire ? Remarques
id UUID
employee_id FK OUI
tenant_id FK OUI Portée multi-tenants
full_name VARCHAR(200) OUI
relationship ENUM(CONJOINT, PERE, MERE, FRERE_SOEUR, ENFANT, AUTRE) OUI Liste déroulante
phone_number VARCHAR(20) OUI Numéro de téléphone principal
phone_number_2 VARCHAR(20) NON Numéro de téléphone secondaire
priority_order SMALLINT OUI 1 ou 2

Contrainte : minimum 0, maximum 2 contacts d'urgence par employé.

Personne à charge

Champ Type Obligatoire ? Remarques
id UUID
employee_id FK OUI
tenant_id FK OUI Portée multi-tenants
full_name VARCHAR(200) OUI
date_of_birth DATE OUI Utilisé pour le calcul des prestations liées à l'âge
relationship ENUM(CONJOINT, ENFANT, AUTRE_PERSONNE_A_CHARGE) OUI
gender ENUM(MALE, FEMALE) NON
is_school_enrolled BOOLEAN NON Par défaut : faux. Pour les enfants — affecte les allocations familiales
school_attestation_attached BOOLEAN NON Par défaut : faux. Document suivi via une pièce jointe

Champs calculés (à partir de la liste des personnes à charge) : - dependents_count = COUNT(personnes à charge) - number_of_children = COUNT(personnes à charge WHERE relation = ENFANT)

Pièce jointe

Champ Type Obligatoire ? Remarques
id UUID
employee_id FK OUI
tenant_id FK OUI Portée multi-tenants
category_code VARCHAR(50) OUI FK vers la table de référence des catégories de documents
file_name VARCHAR(255) OUI Nom du fichier d'origine
minio_object_key VARCHAR(500) OUI Clé de stockage MinIO
file_size_bytes BIGINT OUI Pour le suivi du quota de stockage
mime_type VARCHAR( 100) OUI
uploaded_by FK (Utilisateur) OUI
uploaded_at TIMESTAMP OUI
description VARCHAR(500) NON Note facultative concernant le document

Catégorie de document (table de référence)

Champ Type Remarques
code VARCHAR(50) PK Par exemple, CONTRAT, MEDICAL_CERT, IDENTITY, CNPS_ATTESTATION
tenant_id FK (nullable) NULL = attribué par le système (partagé). Non nul = personnalisé par le tenant.
display_name_fr VARCHAR(100) Libellé français
sort_order SMALLINT Ordre d'affichage
is_system BOOLEAN true = ne peut être supprimé/modifié par le tenant

Catégories attribuées par le système (CI) :

Code Nom d'affichage (FR) Remarques
CONTRAT_TRAVAIL Contrat de travail
AVENANT Avenant au contrat
CERTIFICAT_MEDICAL Certificat médical d'aptitude
PIECE_IDENTITE Pièce d'identité (CNI/ Passeport)
ATTESTATION_CNPS Attestation CNPS
CERTIFICAT_TRAVAIL Certificat de travail Délivré au départ
DIPLOMES Diplômes et qualifications
RIB Relevé d'identité bancaire
BULLETIN_PAIE Bulletin de paie Le bulletin de paie sera automatiquement joint si HRCORE est actif
ATTESTATION_SCOLAIRE Att estation de scolarité (enfant) Pour l'inscription scolaire des personnes à charge
PHOTO_IDENTITE Photo d'identité
AUTRE Autre document Fourre-tout

Configuration de la recherche

Champ Type Remarques
id UUID
tenant_id FK Une configuration par tenant
search_fields VARCHAR[] (tableau) Liste des noms de colonnes inclus dans l'index plein texte. Par défaut : [“last_name”, “first_name”, “department_name”]
updated_by FK (Utilisateur)
updated_at TIMESTAMP

Configuration du numéro d'employé

Champ Type Remarques
tenant_id FK PK Une configuration par tenant
prefix VARCHAR(10) Généré automatiquement à partir du nom de l'entreprise (trigramme/4-6 lettres). Modifiable par l'administrateur.
next_sequence INTEGER Incrémenté automatiquement à chaque création d'employé. Jamais décrémenté.

Format : {prefix}-{YEAR}-{MM}-{SEQ} → Exemple : ALT-2026-03-001


B.3 Règles fonctionnelles

Gestion du profil des employés

Règle Description
FR-HRCORE-001 SI le module HR Core est ACTIF pour un tenant, ALORS les employés de ce tenant ont accès aux champs d'enrichissement de la couche 2 en plus des champs de base de la couche 1 (CP).
FR-HRCORE-002 SI le module HR Core est INACTIF pour un tenant, ALORS seuls les champs de base de la couche 1 (CP) sont visibles et modifiables. Les données de niveau 2, si elles ont été saisies précédemment, sont masquées conformément aux règles de rétrogradation du module (FR-PV-040 à FR-PV-044).
FR-HRCORE-003 Les champs last_name et first_name de l'employé sont séparés. La valeur d'affichage full_name est calculée comme suit : UPPER(last_name) || “ ” || first_name pour l'affichage officiel (par exemple, « KOUASSI Jean-Pierre »). Cette convention suit les normes administratives de dénomination CI.
FR-HRCORE-004 Tous les champs de la couche 2 sont facultatifs lors de la création d'un employé, SAUF : date_of_birth, gender, nationality. Ceux-ci sont obligatoires lorsque HR Core est actif, car ils sont requis par le registre du personnel.
FR-HRCORE-005 SI un enregistrement d'employé est sauvegardé avec des champs facultatifs laissés vides, ALORS le système suit l'exhaustivité sous forme de pourcentage (nombre de champs remplis / nombre total de champs) . Ce pourcentage est affiché sur le profil de l'employé et utilisé pour les alertes de données manquantes (FR-HRCORE-020).

Libre-service des employés

Règle Description
FR-HRCORE-010 Les employés peuvent MODIFIER les champs suivants sur leur propre profil (libre-service) :personal_phone, personal_email, address_city, address_commune, address_details, contacts d'urgence et photo.
FR-HRCORE-011 Les employés NE PEUVENT PAS modifier : last_name, first_name, date_of_birth, national_id_number, cnps_registration_number, marital_status, dependents, bank_*, gender, nationality, blood_type, father_name, mother_name, professional_qualifications, previous_employer. Ces champs nécessitent l'intervention du responsable RH ou du directeur général.
FR-HRCORE-012 Les modifications apportées par les employés en libre-service (champs FR-HRCORE-010) prennent effet immédiatement — aucun workflow d'approbation n'est nécessaire pour la version 1.
*FR-HRCORE-013 * Les modifications en libre-service par les employés sont disponibles HORS LIGNE. Les modifications sont mises en file d'attente dans IndexedDB et synchronisées dans les 30 secondes suivant la reconnexion. Étant donné que chaque employé ne peut modifier que son propre profil, il n'y a aucun risque de conflit.
FR-HRCORE-014 Les modifications apportées par le responsable RH à n'importe quel champ employé nécessitent une connexion EN LIGNE. Les modifications hors ligne du responsable RH ne sont pas prises en charge dans la version V1 afin d'éviter les conflits de modification simultanés.

Sécurité des informations bancaires

Règle Description
FR-HRCORE-015 Les champs d'informations bancaires (bank_name, bank_account_number, bank_iban, bank_rib_key, bank_branch_code) ne peuvent être CRÉÉS ou MIS À JOUR que par les utilisateurs ayant le rôle DG ou RH Manager.
FR-HRCORE-016 Lorsqu'un employé consulte ses propres informations bancaires, bank_account_number et bank_iban sont MASQUÉS : seuls les 4 derniers caractères sont affichés (par exemple, « ●●●●●●●4523 »). bank_name est affiché dans son intégralité.
FR-HRCORE-017 Les utilisateurs ayant le rôle Comptable peuvent consulter l'intégralité des (non masquées) en mode LECTURE SEULE. Cela est nécessaire pour le rapprochement des paies/comptes.
FR-HRCORE-018 Chaque modification des informations bancaires déclenche un événement EmployeeBankInfoChanged. Cet événement comporte un attribut security_flag: true pour permettre la surveillance de la sécurité en aval (par exemple, détecter si quelqu'un modifie rapidement les informations bancaires de plusieurs employés —potentiellement frauduleux).
FR-HRCORE-019 L'historique des modifications des informations bancaires est conservé : le système stocke les valeurs précédentes des informations bancaires dans la piste d'audit. Les informations bancaires actuelles sont les plus récentes. Il n'existe pas de tableau d'historique des informations bancaires distinct — la piste d'audit de la plateforme (AuditEntry avec JSON avant/après) remplit cette fonction.

Numéro CNPS et alertes

Règle Description
FR-HRCORE-020 SI le cnps_registration_number d'un employé est NULL ou vide, ALORS le système crée une alerte persistante visible par les utilisateurs DG et RH Manager. Message d'alerte : « Numéro CNPS manquant pour {last_name} {first_name} — veuillez procéder à l'immatriculation CNPS et mettre à jour le dossier. »
FR-HRCORE-021 L'alerte CNPS réapparaît sur le tableau de bord RH TOUS LES MOIS jusqu'à ce que le champ soit rempli. Après 30 jours sans résolution, l'alerte est escaladée (affichée en rouge/style urgent).
FR-HRCORE-022 SI le champ cnps_registration_number est rempli, l'alerte est automatiquement supprimée.
FR-HRCORE-023 L'alerte relative au numéro CNPS s'applique uniquement aux employés ayant le statut ACTIF. Les employés licenciés dont le numéro CNPS est manquant ne génèrent pas d'alerte.

Gestion des personnes à charge

Règle Description
FR-HRCORE-025 Chaque employé peut avoir 0 ou plusieurs personnes à charge. Il n'y a pas de limite maximale au nombre de personnes à charge.
FR-HRCORE-026 Lorsqu'une personne à charge est ajoutée, mise à jour ou supprimée, le système recalcule automatiquement : dependents_count = nombre total de personnes à charge, number_of_children = nombre de personnes à charge où relationship = ENFANT.
FR-HRCORE-027 SI dependents_count ou number_of_children change, ALORS le système publie un événement EmployeeUpdated avec changedFields: [“dependents_count”, “number_of_children”]. La paie utilise ces informations pour recalculer les retenues fiscales.
FR-HRCORE-028 La date_of_birth d'un enfant à charge est utilisée pour déterminer l'éligibilité aux allocations familiales en fonction de l'âge. Les règles de calcul de l'âge appartiennent au module Paie — Core HR ne stocke que les données.
FR-HRCORE-029 Les personnes à charge sont gérées exclusivement par le DG ou le responsable RH. Les employés ne peuvent pas ajouter/modifier/supprimer leurs propres personnes à charge (cela a des implications sur la paie).

Pièce jointe

Règle Description
FR-HRCORE-030 Chaque document joint à un employé doit avoir un category_code provenant du tableau de référence des catégories de documents. Le système fournit des catégories prédéfinies (voir §B.2) et les tenants peuvent ajouter des catégories personnalisées via la configuration administrateur.
FR-HRCORE-031 Contraintes de téléchargement de fichiers : taille maximale de 10 Mo, types MIME acceptés : application/pdf, image/jpeg, image/png, image/webp, application/vnd.openxmlformats-officedocument.wordprocessingml.document (DOCX) .
FR-HRCORE-032 Chaque document téléchargé est pris en compte dans le quota de stockage du tenant (conformément à la section §A.8 de la vision de la plateforme). SI le téléchargement d'un document dépasse le quota de stockage du tenant, ALORS le téléchargement est bloqué et le message suivant s'affiche : « Quota de stockage atteint. Veuillez supprimer des documents ou acheter de l'espace supplémentaire. »
FR-HRCORE-033 Les documents peuvent être téléchargés par la DG, le responsable RH ou l'employé lui-même (en libre-service, par exemple pour télécharger une nouvelle copie d'une pièce d'identité).
FR-HRCORE-034 Les documents ne peuvent être SUPPRIMÉS que par la DG ou le responsable RH. Les employés ne peuvent pas supprimer leurs propres documents. La suppression est une suppression temporaire (marquée comme supprimée, mais pas physiquement supprimée de MinIO — conservée conformément à la règle OHADA de 10 ans pour les types de documents concernés).
FR-HRCORE-035 SI le module ADVDOC (gestion avancée des documents) est ACTIF, les téléchargements de documents bénéficient automatiquement d'un contrôle des versions, de politiques de conservation et d'une gestion du cycle de vie conformément à FR-PV-036. L'interface utilisateur de Core HR pour les pièces jointes délègue de manière transparente à ADVDOC lorsqu'elle est active.

Photo de l'employé

Règle Description
FR-HRCORE-040 Formats acceptés pour le téléchargement de photos : JPEG, PNG, WebP. Taille maximale du fichier : 2 Mo.
FR-HRCORE-041 Après le téléchargement, le système présente un outil de recadrage côté client imposant un format portrait 3:4. L'utilisateur doit confirmer le recadrage avant que la photo ne soit enregistrée.
FR-HRCORE-042 Une fois le recadrage confirmé, le système génère 3 versions stockées dans MinIO : originale (telle que recadrée), moyenne (150 px de largeur, hauteur proportionnelle), vignette (48 px de largeur, hauteur proportionnelle).
FR-HRCORE-043 Les photos peuvent être téléchargées par : l'employé lui-même (libre-service) OU le responsable RH/DG.
FR-HRCORE-044 Le téléchargement d'une nouvelle photo remplace la précédente. La photo précédente n'est PAS conservée (pas de gestion des versions dans la V1 — ADVDOC l'ajouterait).

Génération du numéro d'employé

Règle Description
FR-HRCORE-050 Les numéros d'employé sont générés automatiquement selon le format : {PREFIX}-{YEAR}-{MOIS}-{SÉQUENCE}. Exemple : ALT-2026-03-001.
FR-HRCORE-051 {PRÉFIXE} est dérivé automatiquement du nom de la société du tenant lors de la création du tenant : le système extrait un trigramme/une abréviation de 3 à 6 lettres. Exemple : « ALTARYS ENTERPRISE » → « ALT », « Boulangerie Mama Kadi » → « BMK ».
FR-HRCORE-052 Le PREFIX est stocké dans la configuration du numéro d'employé (par tenant) et est modifiable par l'administrateur du tenant (DG ou responsable RH). Le système affiche une notification lors de l'intégration : « Le préfixe de numérotation de vos employés est {PREFIX}. Vous pouvez le modifier dans les paramètres. »
FR-HRCORE-053 {YEAR} correspond à l'année à 4 chiffres de création de l'employé. {MM} correspond au mois à 2 chiffres. {SEQ} est un numéro séquentiel à 3 chiffres complété par des zéros qui s'incrémente automatiquement par tenant. Exemple : le 15e employé créé en mars 2026 → ALT-2026-03-015.
FR-HRCORE-054 Les numéros d'employés ne sont JAMAIS réutilisés. SI un employé est licencié, son numéro n'est PAS recyclé. La séquence ne fait qu'augmenter.
FR-HRCORE-055 Lors d'une importation en masse, SI le fichier Excel importé contient des numéros d'employés, ALORS le système les utilise (pour la migration). SI la colonne des numéros d'employés est vide, ALORS le système les génère automatiquement selon les règles ci-dessus. Les numéros importés sont validés pour garantir leur unicité au sein du tenant.

Recherche en texte intégral

Règle Description
FR-HRCORE-060 Core HR fournit un champ de recherche unique utilisant la recherche en texte intégral PostgreSQL (tsvector/tsquery). Le champ de recherche accepte du texte libre et effectue des recherches dans les champs configurés.
FR-HRCORE-061 Champs de recherche par défaut : last_name, first_name, department_name (dénormalisés ou joints à partir de l'unité organisationnelle). Ces valeurs par défaut s'appliquent à tous les nouveaux tenants.
FR-HRCORE-062 Le DG ou le responsable RH peut CONFIGURER les champs à inclure dans l'index de recherche plein texte via un écran de paramètres. Champs disponibles à inclure : last_name, first_name, nom_du_département, intitulé_du_poste, numéro_d'employé, numéro_d'immatriculation_cnps, numéro_d'identification_national, téléphone_personnel, e-mail, ville_de_l'adresse, commune_de_l'adresse.
FR-HRCORE-063 Lorsque la configuration de recherche change, le système reconstruit l'index de recherche plein texte pour ce tenant. Pour les tenants comptant jusqu'à 350 employés, cette opération devrait prendre moins de 5 secondes.
FR-HRCORE-064 Les résultats de recherche sont limités par le niveau d'accès de l'utilisateur : le directeur général/directeur régional voit tous les employés ; le responsable ne voit que les employés de son unité organisationnelle ; le comptable voit tous les employés (données financières) ; Employé ne voit que son propre dossier.
FR-HRCORE-065 La recherche prend en charge les correspondances partielles et la recherche insensible aux accents (important pour le français : « Koné » correspond à « kone »). L'extension PostgreSQL unaccent doit être utilisée.

Importation en masse

Règle Description
FR-HRCORE-070 SI HR Core est ACTIF pour le tenant, ALORS le modèle Excel d'importation des employés comprend à la fois les colonnes de la couche 1 (CP) et de la couche 2 (HR Core). SI HR Core est INACTIF, ALORS seules les colonnes de la couche 1 sont incluses. (L'importation de la couche 1 est une fonctionnalité du plan de contrôle ; HR Core étend le modèle.)
FR-HRCORE-071 Tous les champs de la couche 2 (HR Core) dans le modèle d'importation sont FACULTATIFS. L'importation réussit même si toutes les colonnes HR Core sont vides : les employés sont créés avec les données de la couche 1 et l'enrichissement HR Core peut être effectué ultérieurement.
FR-HRCORE-072 Après le téléchargement Excel, le système affiche un tableau de confirmation modifiable (conformément à FR-PV-051). Les erreurs de validation sont mises en évidence par ligne et par champ : numéros d'employés en double, formats de date non valides, valeurs d'énumération non valides (sexe, état civil, etc.).
FR-HRCORE-073 L'importation est traitée comme une tâche en arrière-plan avec un indicateur de progression. Pour 500 employés, l'importation devrait être terminée en moins de 30 secondes.
FR-HRCORE-074 Chaque employé importé avec succès déclenche un événement EmployeeCreated (à partir de CP) et, si les champs HR Core sont renseignés, un événement EmployeeUpdated (provenant de HR Core).
FR-HRCORE-075 L'importation doit valider l'unicité du employee_number au sein du tenant. SI un doublon est détecté, la ligne est rejetée avec l'erreur suivante : « Numéro matricule en doublon : {number} ».

Registre du Personnel (Fascicule 1)

Règle Description
FR-HRCORE-080 Core HR génère le Fascicule 1 (Registre du Personnel) contenant les données des employés. Le Fascicule 2 (Salaires) appartient à la Paie. Le Fascicule 3 (Visas d'inspection) appartient à la Gestion des employés ou à HSE.
FR-HRCORE-081 L'exportation du Fascicule 1 comprend les colonnes suivantes par employé : numéro d'ordre (séquentiel), nom, prénom, date_de_naissance, lieu_de_naissance, sexe, nationalité, numéro_d'identification_national, numéro_d'enregistrement_cnps, intitulé_du_poste, catégorie_d'employé, date_d'embauche, type_de_contrat, adresse, date_de_cessation_d'emploi(le cas échéant), motif_de_licenciement (le cas échéant).
FR-HRCORE-082 L'exportation comprend TOUS les employés : ACTIFS, EN CONGÉ, SUSPENDUS et LICENCIÉS. Les employés licenciés sont répertoriés avec leur date et leur motif de licenciement.
FR-HRCORE-083 L'exportation est disponible en deux formats : PDF (formaté pour l'impression, A4 paysage) et Excel (pour l'archivage numérique et la soumission d'inspection).
FR-HRCORE-084 SI un employé dans l'exportation a des champs obligatoires manquants (par exemple, le numéro CNPS), ALORS l'exportation inclut un résumé d'avertissement à la fin, répertoriant les employés dont les dossiers sont incomplets. L'exportation n'est PAS bloquée — elle est générée avec « Non renseigné » dans les champs manquants.
FR-HRCORE-085 L'exportation est générée en tant que tâche en arrière-plan. Un lien de téléchargement est fourni une fois l'opération terminée. Pour 350 employés, la génération devrait prendre moins de 10 secondes.

Affichage de l'historique des modifications

Règle Description
FR-HRCORE-090 Core HR fournit un onglet « Historique des modifications » sur le profil de chaque employé. Cet onglet affiche une chronologie lisible par l'utilisateur des modifications provenant de la piste d'audit de la plateforme (AuditEntry) .
FR-HRCORE-091 L'historique des modifications traduit les données brutes AuditEntry en libellés français. Exemple : { field: « address_city », old: “Cocody”, new: « Plateau » } → « Ville de résidence : Cocody → Plateau ».
FR-HRCORE-092 L'historique des modifications affiche : la date de la modification, l'utilisateur qui a effectué la modification (nom d'affichage + rôle), le nom du champ (libellé français), l'ancienne valeur, la nouvelle valeur.
FR-HRCORE-093 L'historique des modifications est visible par la DG et le responsable RH. Les employés voient une version simplifiée sur leur propre profil qui indique uniquement : la date de la modification et le champ qui a été modifié (pas les anciennes/nouvelles valeurs, afin d'éviter toute fuite d'informations sur l'auteur de la modification).
FR-HRCORE-094 Aucun stockage séparé n'est conservé. La vue formatée est une couche de présentation de l'interface utilisateur qui interroge la table AuditEntry filtrée par entity_type = “Employee” et entity_id = {employeeId}.

B.4 Machines à états

Core HR n'introduit pas de nouveaux états de cycle de vie. Le cycle de vie des employés (ACTIF → EN CONGÉ → SUSPENDU → LICENCIÉ) est géré par le plan de contrôle / la gestion des employés, et non par Core HR.

Cependant, Core HR introduit le concept d'état d'exhaustivité du profil :

stateDiagram-v2
    [*] --> INCOMPLET : Employé créé (champs HR Core principalement vides) INCOMPLETE --> PARTIAL : Certains champs HR Core remplis
    INCOMPLETE --> COMPLETE : Tous les champs obligatoires + les champs facultatifs clés remplis

    PARTIAL --> COMPLETE : Champs restants remplis
    PARTIAL --> INCOMPLETE : Champs effacés/supprimés

    COMPLETE --> PARTIAL : Champ obligatoire effacé (par exemple, correction des données)
    Remarque à droite de INCOMPLET : déclenche des alertes de données manquantes (FR-HRCORE-020)
    Remarque à droite de COMPLET : aucune alerte. Exportation du registre propre.

Niveaux d'exhaustivité du profil : - INCOMPLET (0-40 %) : champs obligatoires manquants (date_de_naissance, sexe, nationalité) ou données critiques (numéro CNPS). Indicateur rouge. - PARTIEL (41-80 %) : champs obligatoires remplis mais champs facultatifs (coordonnées bancaires, contacts d'urgence, documents) manquants. Indicateur jaune. - COMPLET (81-100 %) : tous les champs obligatoires + les champs facultatifs clés (CNPS, au moins 1 contact d'urgence, photo, 1 pièce d'identité) remplis. Indicateur vert.

Il s'agit d'états CALCULÉS (non stockés), dérivés du remplissage des champs au moment de l'affichage.


B.5 Tableaux de décision

Matrice des autorisations

Action DG Responsable RH Responsable Comptable Employé
Afficher le profil de n'importe quel employé (couche 2) ⚠️ Équipe uniquement ⚠️ Champs financiers uniquement ❌ (propre uniquement)
Modifier n'importe quel profil d'employé (couche 2)
Modifier son propre profil (champs en libre-service)
Afficher les informations bancaires (complètes) ✅ (lecture seule) ❌ (masqué)
Modifier les informations bancaires
Gérer les personnes à charge
Télécharger des documents ✅ (propres documents)
Supprimer des documents
Configurer les champs de recherche
Configurer le préfixe du numéro d'employé
Gérer les catégories de documents
Exporter le registre du personnel
Importer des employés en masse
Afficher l'historique des modifications (complet)
Afficher l'historique des modifications (simplifié, propre)

Matrice des capacités hors ligne

Opération Hors ligne ? Utilisateur Comportement de synchronisation
Afficher le profil de l'employé ✅ Oui Tous les rôles Lecture à partir du cache IndexedDB
Modifier les champs en libre-service ✅ Oui Employé Mise en file d'attente dans IndexedDB, synchronisation lors de la reconnexion
Télécharger une photo (en libre-service) ✅ Oui Employé Mise en file d'attente localement, téléchargement lors de la reconnexion
Modifier le profil de l'employé (RH) ❌ Non DG/RH Nécessite une connexion
Modifier les informations bancaires ❌ Non DG/RH Nécessite une connexion
Gérer les personnes à charge ❌ Non DG/RH Nécessite une connexion
Télécharger des documents ❌ Non DG/RH/Employé Nécessite une connexion (téléchargement MinIO)
Rechercher des employés ⚠️ Partiel Tous les rôles Recherche dans les données mises en cache (peuvent être obsolètes)
Exporter le registre ❌ Non DG/RH Nécessite une connexion (génération côté serveur)
Importation en masse ❌ Non DG/RH Nécessite une connexion

Visibilité des catégories de documents

Code de catégorie Ajouté automatiquement par Visible par l'employé ? Supprimable ?
CONTRAT_TRAVAIL Gestion des employés (V2) ❌ (conservation légale)
BULLETIN_PAIE Paie (jointe automatiquement) ❌ (conservation légale)
CERTIFICAT_MEDICAL Responsable RH ❌ (confidentialité médicale) ❌ (conservation légale)
PIECE_IDENTITE Responsable RH / Employé Suppression temporaire uniquement
ATTESTATION_CNPS Responsable RH Suppression temporaire uniquement
DIPLOMES Responsable RH / Employé Suppression temporaire uniquement
RIB Responsable RH ❌ (confidentialité financière) Suppression temporaire uniquement
AUTRE Responsable RH / Employé Suppression temporaire uniquement

B.6 Dépendances entre modules

Événements publiés par Core HR

Événement Déclencheur Charge utile Consommé par
EmployeeUpdated Toute modification d'un champ de la couche 2 (faible risque : adresse, téléphone, photo, contacts d'urgence, qualifications) { employeeId, tenantId, changedFields[], timestamp, changedBy } Modules mettant en cache les données des employés
EmployeeBankInfoChanged Toute modification du champ bank_* { employeeId, tenantId, bankName, maskedAccountNumber, changedBy, timestamp, security_flag: true } Paie(rechargement des informations de paiement), audit/surveillance de la sécurité
EmployeeCategoryChanged Modification de la catégorie d'employé (via CP, mais HR Core peut l'afficher/le déclencher) { employeeId, tenantId, oldCategoryId, newCategoryId, effectiveDate } Paie (recalcul du taux de cotisation)
EmployeeProfileCompleted Le profil atteint l'état COMPLET `{ employeeId, tenantId, completenessPercent, timestamp } Gestion des employés (liste de contrôle d'intégration), tableau de bord
EmployeeDocumentAttached Document téléchargé vers l'employé { employeeId, tenantId, documentId, categoryCode, fileName } ADVDOC (si actif — pour la gestion des versions/la conservation) , Tableau de bord

Événements consommés par Core HR

Événement Publié par Réaction Core HR
EmployeeCreated Plan de contrôle Crée un enregistrement de couche 2 vide pour le nouvel employé. Déclenche une alerte CNPS si le numéro CNPS n'est pas fourni.
EmployeeTerminated Gestion des employés / CP Supprime les alertes CNPS actives pour l'employé licencié (FR-HRCORE-023). Marque le profil comme historique.
EmployeeReassigned Gestion des employés Met à jour le nom du service mis en cache pour l'index de recherche en texte intégral (si le service est un champ de recherche).
PayslipGenerated Paie SI HRCORE actif ALORS joint automatiquement le bulletin de paie en tant que document (catégorie : BULLETIN_PAIE) à l'employé.

Dépendances API (Synchrone)

Appelant Appels Point de terminaison Objectif
Core HR Plan de contrôle GET /api/v1/cp/employees/{id} Lire les données de référence de la couche 1 (lecture en direct pour l'affichage de l'aperçu du contrat)
Core HR Plan de contrôle GET /api/v1/cp/org-units/{id} Lire les détails de l'unité organisationnelle (nom du service pour la recherche, responsable pour l'affichage)
Core HR Plan de contrôle GET /api/v1/cp/positions/{id} Lire le titre du poste pour l'affichage
RH de base MinIO (stockage) PUT /upload, GET /download, DELETE Stockage de documents et de photos
Paie RH de base GET /api/v1/hrcore/employees/{id}/bank-info Lecture des informations bancaires pour le traitement des paiements (post-MVP)
Paie RH de base GET /api/v1/hrcore/employees/{id}/dependents/ summary Lecture du nombre de personnes à charge + nombre d'enfants pour le calcul des impôts
Gestion des employés RH de base GET /api/v1/hrcore/employees/{id}/profile Lecture du profil enrichi pour la création d'événements administratifs
Tout module RH de base GET /api/v1/hrcore/employees/{id}/photo/thumbnail Lecture de la vignette de l'employé pour affichage dans les listes

API exposée par Core HR

Point de terminaison Méthode Objectif Consommateurs
/api/v1/hrcore/employees/{id} GET Profil enrichi complet de l'employé (couches 1 + 2) Frontend, Gestion des employés
/api/v1/hrcore/employees/{id} PATCH Mettre à jour les champs de la couche 2 Frontend (Responsable RH)
/api/v1/hrcore/employees/{id}/self-service PATCH Mise à jour des champs en libre-service (FR-HRCORE-010) Frontend (employé)
/api/v1/hrcore/employees/{id} /bank-info GET Informations bancaires (masquées ou complètes selon le rôle) Frontend, Paie
/api/v1/hrcore/employees/{id}/bank-info PUT Mettre à jour les informations bancaires (DG/RH uniquement) Frontend
/api/v1/hrcore/employees/{id}/dependents GET/POST/PUT/DELETE CRUD personnes à charge Frontend
/api/v1/hrcore/employees/{id}/dependents/summary GET Nombres calculés (nombre_de_personnes_à_charge, nombre_d'enfants) Paie
/api/v1/hrcore/employees/{id}/emergency-contacts GET/POST/PUT/ DELETE CRUD contacts d'urgence (max. 2) Frontend
/api/v1/hrcore/employees/{id}/documents GET/POST/DELETE Document CRUD avec catégorie Frontend, ADVDOC
/api/v1/hrcore/employees/{id}/photo GET/POST Téléchargement/récupération de photos récupération (3 tailles) Frontend, tout module
/api/v1/hrcore/employees/{id}/change-history GET Historique des modifications formaté (à partir de AuditEntry) Frontend
/api/v1/hrcore/employees/search GET Recherche en texte intégral (paramètre de requête : q) Frontend
/api/v1/hrcore/employees/import POST Importation en masse (téléchargement Excel multipart) Frontend
/api/v1/hrcore/registre/fascicule-1 POST Générer l'exportation du registre (renvoie l'ID du travail) Frontend
/api/v1/hrcore/registre/fascicule-1/{jobId} GET Télécharger le registre généré Frontend
/api/v1/hrcore/config/search-fields GET/PUT Configuration de la recherche Frontend (Admin)
/api/v1/hrcore/config/employee-number GET/PUT Configuration du préfixe du numéro d'employé Frontend (Admin)
/api/v1/hrcore/config/document-categories GET/POST/PUT/DELETE Gestion des catégories de documents Frontend (Admin)
/api/v1/hrcore/dashboard/alerts GET Alertes de données manquantes (CNPS, profils incomplets) Interface utilisateur (tableau de bord)

B.7 Implications multi-tenants

Préoccupation Base de données partagée Schéma par tenant Base de données par tenant BYO-DB
Données d'enrichissement des employés Colonne tenant_id dans la table employee_enrichment. Chaque requête inclut WHERE tenant_id = ?. Table par schéma. Aucun filtre tenant_id nécessaire. Table par base de données. Table par base de données.
Stockage des documents Compartiment MinIO au niveau du tenant : tenant-{tenantId}/employees/{employeeId}/docs/ Même structure de chemin MinIO. Identique. Le tenant fournit le stockage ou utilise la plateforme MinIO.
Stockage des photos tenant-{tenantId}/employees/{employeeId}/photos/ Identique. Identique. Identique.
Index de recherche en texte intégral Colonne tsvector par tenant, filtrée par tenant_id. Configuration de recherche stockée par tenant. Index par schéma. Plus efficace (pas de filtrage par tenant). Index par base de données. Index par base de données.
Catégories de documents Catégories définies par le système (tenant_id = NULL) + personnalisées par le tenant (tenant_id = X). Catégories système dans le schéma partagé. Catégories personnalisées par le tenant dans le schéma du tenant. Par base de données. Par base de données.
Séquence des numéros d'employés Séquence par tenant (stockée dans la table de configuration, pas une séquence de base de données — pour la portabilité). Identique — séquence au niveau de l'application. Identique. Identique.
Quotas de stockage Suivis dans la base de données de la plateforme (plan de contrôle). Vérifiés avant chaque téléchargement. Identique. Identique. Identique.

Principe de conception : tous les modèles multi-tenants suivent la vision de la plateforme (§B.5). Conception pour BYO-DB en premier lieu. Les séquences de numéros d'employés sont au niveau de l'application (et non des objets PostgreSQL SEQUENCE) afin de garantir la portabilité sur les 4 profils de base de données.


PARTIE C — Contraintes et limites


C.1 Conformité réglementaire — CI (Côte d'Ivoire)

CI Registre d'Employeur (Code du Travail 2015)

Le Code du Travail de la CI (loi n°2015-532) exige que chaque employeur tienne un registre d'employeur en 3 fascicules :

  1. Fascicule 1 — Personnel : liste séquentielle des employés avec leurs données personnelles et professionnelles. Core HR génère ce document.
  2. Fascicule 2 — Salaires : registre des salaires. * Module Paie.*
  3. Fascicule 3 — Visas d'inspection : registre des visites d'inspection. Module Gestion des employés / HSE.

Le registre doit être : - Conservé sur le lieu de travail - Disponible pour inspection par l'Inspecteur du Travail à tout moment - Tenu en français

L'exportation du registre par Core HR (FR-HRCORE-080-085) génère le Fascicule 1 dans un format conforme.

Exigences relatives au dossier des employés CI (Loi 2013-546, Décret 2016-851)

La loi CI autorise les dossiers électroniques des employés (loi n°2013-546 sur les transactions électroniques + décret n°2016-851 sur les signatures et archives électroniques). Le dossier numérique du personnel de Core HR est légalement valide à condition que : - Les documents soient stockés avec des garanties d'intégrité (sommes de contrôle MinIO). - La piste d'audit permette de suivre toutes les modifications (plateforme AuditEntry). - Les copies électroniques des documents signés soient acceptables.

Inscription à la CNPS en Côte d'Ivoire

Chaque employé doit être inscrit à la CNPS (Caisse Nationale de Prévoyance Sociale) dès le premier jour de son embauche (partie 3.1 de la recherche juridique). Core HR : - Stocke le numéro d'enregistrement CNPS (FR-HRCORE-020) - Génère des alertes lorsque le numéro est manquant - Ne gère PAS la déclaration CNPS proprement dite (qui relève de la gestion des employés)

Lacune en matière de conformité : tenants sans HR Core

Lacune reconnue : les tenants qui n'achètent pas le module HR Core ne peuvent pas tenir un registre du personnel conforme au sein de la plateforme. Ils doivent gérer le registre en externe (sur papier ou Excel). Cela est acceptable car : 1. La base de référence du plan de contrôle fournit suffisamment de données pour les modules opérationnels (absences, présences, paie). 2. HR Core est commercialisé comme un module de conformité et d'organisation — les tenants soucieux de la conformité l'achèteront. 3. La fenêtre de vente incitative du module dans l'interface utilisateur Papillon peut mettre en avant l'avantage de la conformité du registre.


C.2 Exigences de localisation — CI

Aspect Exigence
Langue Français (toutes les étiquettes de l'interface utilisateur, les messages de validation, les en-têtes d'exportation, les noms de catégories de documents)
Affichage du nom Formel : UPPER(nom_de_famille) prénom (par exemple, « KOUASSI Jean-Pierre »). Informel : prénom nom_de_famille.
Devise N/A — Core HR ne gère pas directement les champs de devise. Les informations bancaires sont basées sur des identifiants (numéros de compte) et non sur des montants.
Format de date JJ/MM/AAAA pour tous les champs de date
Format de numéro de téléphone Mobile CI : +225 XX XX XX XX XX (10 chiffres après l'indicatif du pays). Validation de la saisie avec ce format.
Adresse Semi-structurée : ville (liste déroulante avec les villes de CI), commune/quartier (texte libre), détails (texte libre). Pas de codes postaux.
Jours fériés N/A — Core HR ne gère pas les jours fériés (module Absence).
Liste déroulante des villes Préremplie avec les principales villes CI : Abidjan, Bouaké, Daloa, Yamoussoukro, San-Pédro, Korhogo, Man, Divo, Gagnoa, Abengourou + « Autre » pour texte libre

C.3 Exigences en matière de sécurité

Exigence Mise en œuvre
Classification des données sensibles Les informations bancaires et le numéro d'identité national sont classés comme SENSIBLES. Les documents médicaux (catégorie : CERTIFICAT_MEDICAL) sont classés comme MEDICAL_SENSITIVE.
Masquage des informations bancaires Le libre-service des employés n'affiche que les 4 derniers caractères. Le point de terminaison API renvoie des données masquées, sauf si l'appelant a le rôle COMPTABLE ou RH_MANAGER/DG.
Accès aux documents médicaux Les documents de la catégorie CERTIFICAT_MEDICAL ne sont visibles que par le DG et le responsable RH. Les employés peuvent voir qu'un certificat médical existe, mais ne peuvent pas en consulter le contenu (métadonnées du document visibles, téléchargement bloqué).
Accès aux documents financiers Les documents de la catégorie RIB ne sont visibles que par le DG, le responsable RH et le comptable.
Piste d'audit Chaque modification apportée aux données d'enrichissement des employés, aux personnes à charge, aux contacts d'urgence, aux informations bancaires, aux documents et aux photos génère une entrée AuditEntry immuable. Les modifications des informations bancaires sont signalées comme sensibles sur le plan de la sécurité (FR-HRCORE-018).
Stockage des photos Les photos sont stockées dans un compartiment MinIO au niveau du tenant. L'accès est contrôlé via des URL signées avec expiration (pas d'URL publiques).
Stockage des documents Les documents sont stockés dans un compartiment MinIO à l'échelle du tenant avec des URL signées. Le téléchargement nécessite un JWT valide avec le rôle approprié.
Sécurité des importations en masse Le fichier Excel importé est analysé pour détecter le contenu des macros (rejet des fichiers .xlsm). Le fichier est supprimé du serveur après traitement. Enregistrements du journal d'audit des importations : qui a importé, quand, combien d'enregistrements, erreurs de validation éventuelles.
Sensibilité du numéro CNPS Le numéro d'enregistrement CNPS est un identifiant national — traité comme sensible. Il n'apparaît pas dans les résultats de recherche ni dans les listes d'employés. Il n'est visible que dans la vue complète du profil de l'employé (DG, responsable RH, l'employé lui-même).

# C.4 Hors champ d'application

Élément Raison Propriétaire
Gestion du cycle de vie des contrats (création, renouvellement, modifications, suivi CDD) Couche de processus — appartient à la gestion des employés (EMPMGT) EMPMGT PRD
Workflows d'intégration/départ Couche de processus — appartient à la gestion des employés EMPMGT PRD
Suivi et alertes de la période d'essai Couche de processus — appartient à la gestion des employés EMPMGT PRD
Procédures de licenciement et calcul des indemnités de départ Couche de processus — appartient à la gestion des employés + paie EMPMGT + PAYROL PRDs
Déclarations CNPS (embauche, départ, DISA) Gestion des déclarations — appartient à la gestion des employés EMPMGT PRD
Règles relatives aux heures de travail, heures supplémentaires, travail de nuit Gestion du temps — appartient à Temps et activités (TIMACT) TIMACT PRD
Informations salariales (salaire actuel, historique salarial, grade) Données financières — appartient à la Paie. Core HR affiche un aperçu du contrat via une lecture en direct depuis CP/EMPMGT. PAYROL + EMPMGT PRDs
Registre du Personnel Fascicule 2 (Salaires) Données salariales — appartient à la Paie PAYROL PRD
Registre du Personnel Fascicule 3 (Visas d'inspection) Données d'inspection — appartiennent à la gestion des employés ou à HSE EMPMGT/HSE PRD
Champs personnalisés pour les employés (définis par le tenant) Amélioration V2 Core HR V2
Organigramme des employés (organigramme visuel) Amélioration V2 Core HR V2
Annuaire des employés (à l'échelle de l'entreprise) Amélioration V2 Core HR V2
Gestion des versions des documents, politiques de conservation, gestion du cycle de vie Nécessite le module Advanced Document Management (ADVDOC) ADVDOC PRD
Génération de documents (contrats, certificats, attestations à partir de modèles) Nécessite ADVDOC V2 ADVDOC V2 PRD
Prise en charge multi-pays (champs et registres BJ, CM) Extension à d'autres pays prévue pour le mois 9 Extension à d'autres pays Core HR PRD
Authentification SSO/SAML pour le libre-service des employés Fonctionnalité Enterprise V2 Plateforme V2
Libre-service des employés : demande de modifications avec workflow d'approbation V2 — nécessite un moteur d'approbation Core HR V2
Suivi des certificats d'aptitude médicale (dates de renouvellement, examens périodiques) Portée du module HSE HSE PRD
Règles spécifiques au secteur des conventions collectives V2 — la plateforme ne prend en charge que la CCI interprofessionnelle pour MVP Plateforme V2

Glossaire (termes spécifiques au module)

Terme (FR) Terme (EN) Définition
Dossier du personnel Dossier de l'employé Enregistrement complet des données personnelles, professionnelles et administratives d'un employé. Core HR est la couche de données pour cela.
Registre d'employeur Registre de l'employeur Document légal requis par le Code du travail. 3 fascicules : personnel, salaires, visas d'inspection. Core HR génère le fascicule 1.
Immatriculation CNPS Immatriculation CNPS Immatriculation d'un employé auprès de la Caisse Nationale de Prévoyance Sociale (CI sécurité sociale). Le numéro d'immatriculation est stocké dans Core HR.
Certificat médical d'aptitude Certificat médical d'aptitude Certificat médical confirmant qu'un employé est apte au travail. Requis dans le dossier personnel. Stocké sous forme de pièce jointe.
Certificat de travail Certificat de travail Document délivré par l'employeur au moment du départ, confirmant les dates d'emploi et le poste occupé. Obligatoire (art. 16.14 CT 2015).
RIB Coordonnées bancaires Relevé d'Identité Bancaire — Document bancaire CI identifiant un compte. Stocké en tant que pièce jointe + champs d'informations bancaires structurés.
Avenant Modification du contrat Modification d'un contrat de travail existant. Stocké sous forme de pièce jointe. La gestion du cycle de vie du contrat relève de l'EMPMGT.
Personne à charge Personne à charge Personne financièrement dépendante de l'employé (conjoint, enfants, autres). A une incidence sur l'impôt (ITS) et les cotisations sociales (allocations familiales).
Numéro matricule Numéro d'employé Identifiant séquentiel unique pour un employé au sein d'un tenant. Format : {PREFIX}-{YEAR}-{MM}-{SEQ}.
Fascicule Section/volume L'un des 3 volumes du registre d'employeur. Fascicule 1 = personnel, 2 = salaires, 3 = visas d'inspection.

Ce PRD+FSD a été produit par la personnalité ANALYST sur la base d'un entretien exhaustif avec le Business Analyst/Product Owner. Il sert de référence officielle pour l'architecture, la conception et la mise en œuvre du module Core HR.