Skip to content

Méta-modèle multidimensionnel Heriade — Spécification technique

0. Contexte plateforme

Heriade est composé de plusieurs modules, rattachés à une entreprise cliente via une console d'administration centrale (création entreprise, utilisateurs, souscription aux modules). L'utilisateur navigue entre ses modules autorisés depuis un portail unique.

Console admin (entreprises, utilisateurs, modules souscrits)

Portail Heriade (point d'entrée utilisateur)

Formulaire  → fournisseur de données (collecte)

                   BDD  → hub de transformation (workflow planifiable et rejouable)

             Source Heriade (dossier de données prêtes)
                  ↙    ↘
            Addin Excel   Rapport
           (lecture directe)  (import dans Movement, cf. section 3)

Ce document (méta-modèle) et docs/spec-vue-pivot.md / docs/spec-bibliotheque-kpi.md concernent spécifiquement le module Rapport. BDD est responsable de produire les Sources Heriade dans un format exploitable, quel que soit le secteur du client — c'est ce qui rend le méta-modèle générique réellement opérationnel : BDD absorbe l'hétérogénéité des formats sources, Rapport n'a jamais à s'adapter au format brut d'un client.

À date, l'import d'une Source Heriade dans le modèle Movement de Rapport reste une action manuelle (déclenchement en un clic) — la Source elle-même peut être rafraîchie automatiquement en amont par BDD, mais ce rafraîchissement ne se répercute pas encore automatiquement dans Rapport.

1. Principe général

Le modèle ne doit jamais coder en dur des objets métier (Résident, Établissement, TO). Il définit des rôles génériques universels, que chaque client instancie avec son propre vocabulaire métier. Le moteur (structure de données, calculs) est générique ; l'interface visible par le client reste toujours en langage métier.

2. Deux natures d'objets dans le cube

  • Dimensions : axes d'analyse (qui, quand, où, quel type). Hiérarchiques.
  • Faits (mesures) : valeurs numériques agrégeables (montants, heures, quantités).

Ne jamais confondre les deux : une "Catégorie" actuelle (Gestion, Masse salariale, Activité) correspond en réalité à une table de faits, pas à une dimension.

3. Les 4 blocs de dimensions (niveau produit)

BlocNatureAlimentationContenu figé ou paramétrable
1. Axes sourceDimensions importées, une par source connectéeImport automatiqueParamétrable (nb et nature des sources variables)
2. RéférentielsDonnées saisies/maintenues manuellement dans l'outilSaisie utilisateurCoquille vide, remplie par le client
3. Segments d'analyseNiveaux hiérarchiques de dimension, rattachés à leur source d'origineImport ou dérivéParamétrable, structuré en hiérarchie (pas de liste plate)
4. Dimensions communesTemps + Structure, transverses à tout le modèleMixteTemps/Phase : préconfigurables en standard. Structure : paramétrable (libellé métier)

Règle clé : une entité individuelle à cardinalité élevée (Résident, Salarié, Lot de production) n'est PAS une dimension séparée des segments qui la caractérisent (Poste, Type d'hébergement). C'est le niveau hiérarchique le plus fin de la dimension Structure/Entité, les segments en étant les niveaux intermédiaires.

Exemple de hiérarchie :

Structure
└── Établissement (niveau agrégé)
    ├── Salarié (RH) → attributs : Poste, Type de contrat
    └── Résident (Métier) → attributs : Type d'hébergement

3bis. Nature du compte et convention de signe — pour un calcul favorable/défavorable robuste

Deux attributs indépendants, jamais déduits du signe brut d'une valeur observée, nécessaires pour déterminer correctement si un écart est favorable ou défavorable (Vues, Écarts, Pastilles) :

  • nature (charge | produit) : attribut sur le nœud de dimension (compte), au même titre que les autres DimAttribute. Défini une fois lors de l'organisation des dimensions (docs/spec-onboarding-entreprise.md).
  • conventionSigne (signe_comptable | valeur_absolue) : attribut au niveau de la connexion/source, pas du compte — propre à la façon dont l'entreprise exporte ses données. signe_comptable = charges négatives, produits positifs (convention standard). valeur_absolue = tout stocké en positif, y compris les charges.

Pourquoi ces deux attributs, et pas une déduction depuis le signe brut : un produit peut légitimement être négatif (avoir, note de crédit), et certaines entreprises exportent leurs charges en valeur absolue plutôt qu'en convention comptable standard. Le signe d'une valeur à un instant donné ne suffit donc jamais à en déduire ni sa nature, ni la convention de la source.

Formule de détermination favorable/défavorable, utilisée partout où cette notion apparaît (Vues, Écarts, Pastilles) :

multiplicateur =
  nature = 'produit'                                   → +1
  nature = 'charge' ET convention = 'signe_comptable'   → +1   (charge moins négative = favorable)
  nature = 'charge' ET convention = 'valeur_absolue'    → -1   (charge plus petite en absolu = favorable)

favorable = (valeur − référence) × multiplicateur > 0

Cette formule est la référence unique — docs/spec-bibliotheque-widgets-restitution.md (Pastilles) et l'écran Écarts doivent tous deux s'y conformer, sans réimplémenter une logique de coloration propre.

4. Rôles génériques (table de correspondance sectorielle)

Rôle génériqueEHPADBTPAgroalimentaire
Entité structurelleÉtablissementChantierSite de production
Entité individuelle métierRésidentLot de production
Entité individuelle RHSalariéSalariéSalarié
Référentiel de capacitéCapacité lits, jours théoriquesCapacité horaire équipeCapacité machine (cadence, heures dispo)
Mesure de remplissage/rendementTOTaux d'avancementTRS

Critère de définition d'une "entité individuelle" (générique, non limité aux personnes) : grain fin + cardinalité élevée + attributs propres + suivi dans le temps ou traçabilité.

5. Archétypes de tables de faits (génériques, à industrialiser)

ArchétypeDéfinitionExemple EHPADExemple Agro
Fait transactionnelÉvénement daté, grain finJournée facturée par résidentQuantité produite par lot
Fait périodique (snapshot)Mesure figée à une dateEffectif au 1er du moisStock matières premières à date
Fait cumuléCompteur qui s'accumuleAnciennetéDurée de vie restante avant DLC

Ne pas fusionner les tables de faits de sources différentes dans une table unique : elles n'ont pas le même grain (ex. facturation au jour, paie au mois, référentiel saisi au mois). Fusionner dégraderait le grain le plus fin et empêcherait certains calculs (distribution, cohortes, drill-down individuel).

6. Pattern générique de KPI "remplissage/rendement"

Formule universelle, indépendante du secteur :

Taux = Volume réalisé (fait transactionnel)
       / Capacité théorique disponible (référentiel)

Exemple EHPAD (TO) :

TO = SUM(Faits Facturation.journées)
     / (Référentiel.capacité × jours_période − Référentiel.jours_fermeture)

Ce pattern doit être livrable comme formule KPI prête à l'emploi dans Heriade, où le client mappe juste ses propres champs (capacité, volume réalisé, indisponibilité) au lieu de recoder le calcul à chaque client.

Point structurant : ce type de KPI croise toujours au moins deux objets : un fait transactionnel ET un référentiel. Sans bloc Référentiels distinct, aucun dénominateur n'est disponible dans le cube — d'où la nécessité de le garder séparé des axes source.

7. Implications produit (back-office / éditeur de dimensions)

  1. Éditeur de dimension générique avec possibilité d'ajouter des niveaux hiérarchiques (pas listes plates) — fonctionnalité transverse, pas un cas spécifique EHPAD.
  2. Type de dimension "Entité individuelle" paramétrable : le client crée l'entité, la nomme, l'attache à une ou plusieurs sources, lui définit des attributs (= anciens "segments").
  3. Bibliothèque de formules KPI génériques (à commencer par le pattern remplissage/rendement) avec mapping de champs par le client, plutôt que du calcul codé en dur par secteur.
  4. Dimensions Temps et Phase : livrées préconfigurées, non modifiables dans leur structure (uniquement les membres, ex. années disponibles).
  5. Dimension Structure : toujours présente, libellé paramétrable ("Établissement", "Chantier", "Site").

8. Anti-pattern à éviter

Sur-abstraire l'interface utilisateur (ex. afficher "Entité individuelle type 1" au client). L'abstraction doit rester interne au moteur ; le client ne voit que son vocabulaire métier (Résident, Salarié, Lot, Chantier...).