HORIZON · Modèle de données
HHORIZON 04 · Documentation

Modèle de données PostgreSQL (Supabase)

Schéma relationnel normalisé (migration 0001_schema.sql), sécurité au niveau des lignes sur 100 % des tables métier (0002_rls.sql), audit par déclencheurs (0003_audit.sql), jeu de démonstration (0004_seed_demo.sql). Identifiants UUID générés en base, horodatages UTC, montants en numeric exacts. Nommage : français technique sans accents, tables au pluriel.

Vue d'ensemble des entités

organisations 1--N profils (roles)          organisations 1--N clients
profils (conseiller) N--N clients  via affectations
clients 1--N simulations 1--1 allocations (4 lignes)
simulations 1--N echeances            simulations 1--N projections (scenario x mois)
clients 1--N documents (PDF)          organisations 1--N hypotheses_scenarios (versionnees)
toutes entites --> audit_log (declencheurs)      profils 1--N notifications

Types énumérés

TypeValeurs
role_utilisateurconseiller · administrateur · conformite · direction
statut_kyca_jour · a_renouveler · expire
code_scenarioprudent · equilibre · dynamique
type_echeanceversement_initial · versement_mensuel · versement_exceptionnel · arbitrage
statut_echeanceplanifie · en_cours · valide · rejete · annule
statut_simulationbrouillon · active · archivee
classe_actifactions · obligations · fonds_euros · liquidites

Tables et champs

organisations · profils · affectations

ColonneTypeDescription
organisations.id / nomuuid / textCabinet ou réseau ; raison sociale affichée (rapports, en-têtes).
organisations.frais_gestion_defautnumeric(5,4)Frais annuels par défaut des nouvelles simulations (0.0060 = 0,60 %, H-06).
profils.user_iduuid (PK)Clé du compte d'authentification ; pivot de toutes les politiques RLS.
profils.organisation_id / roleuuid / enumRattachement (jamais modifiable par l'utilisateur) et rôle applicatif.
profils.prenom, nom, actiftext / booleanIdentité affichée ; désactivation immédiate sans suppression.
affectations.conseiller_id + client_iduuid (PK composite)Relation d'affectation ; fonde le droit d'accès du conseiller.

clients

ColonneTypeDescription
id, organisation_iduuidIdentifiant et rattachement d'organisation.
civilite, prenom, nomtextIdentité ; la civilité pilote l'accord des libellés (« Cliente depuis »).
date_naissance / date_entree_relationdateÂge affiché au bandeau ; badge d'ancienneté (« depuis 2016 »).
patrimoine_estimenumeric(14,2) ≥ 0Patrimoine déclaré, affiché en k€ (RG-17).
objectif_anneeint (2000 à 2100)Année cible du projet (« Objectif : 2040 »).
profil_investisseur / note_risquetext / int (1 à 10)Badge du bandeau (RG-09) ; note « n / 10 ».
statut_kyc / kyc_valide_jusqu_auenum / datePilotent RG-14 : badge et blocage de l'export.
archive, cree_le, modifie_leboolean / timestamptzArchivage logique ; horodatages de gestion.

simulations · allocations · hypotheses_scenarios

ColonneTypeDescription
simulations.libelle / statuttext / enumNom métier ; brouillon, active, archivee. Une seule active par client : index partiel unique (RG-02).
simulations.horizon_anneesint (1 à 40)Horizon de projection (titre du graphique).
simulations.objectif_capitalnumeric(14,2) > 0Requis pour la colonne progression (RG-13).
simulations.versement_initial / versement_mensuelnumeric(14,2) ≥ 0Paramètres du moteur (V0, Vm).
simulations.jour_prelevementint (1 à 28)Jour des occurrences mensuelles (RG-12).
simulations.scenario_defaut / frais_gestionenum / numeric(5,4)Scénario présenté par défaut ; frais figés à la création (rejouabilité).
simulations.hypotheses_versionintVersion des hypothèses utilisée : clé de la rejouabilité (RG-03).
allocations.simulation_id + classe / poidsPK composite / numeric(5,2)Quatre lignes par simulation ; somme contrôlée à 100,00 par déclencheur différé (RG-04).
hypotheses_scenarios.version, scenario, rendement_brut_annuelint / enum / numeric(6,4)Jeu versionné par organisation ; seule la version active alimente les nouvelles simulations.

echeances · projections · documents · notifications · audit_log

ColonneTypeDescription
echeances.date_echeance, type, montant, statutdate / enums / numericCœur de l'échéancier ; contrainte : montant nul si et seulement si arbitrage (RG-10) ; machine à états RG-11.
echeances.commentairetextMotif de rejet, note de replanification.
projections.simulation_id + scenario + moisPK compositeSéries mensuelles historisées : source unique du graphique et du PDF ; preuve datée (calcule_le, CA-12).
documents.type, chemin_storage, taille_octets, genere_partext / bigint / uuidRapport PDF dans le bucket privé « rapports » ; auteur tracé.
notifications.titre, corps, lutext / booleanNotification applicative (cloche) ; purge à 90 jours.
audit_log.entite, entite_id, action, avant, aprestext / jsonbPreuve d'audit : images avant et après ; table en ajout seul (RG-15), rétention 12 mois.

Sécurité au niveau des lignes (RLS)

La RLS est activée sur toutes les tables métier ; aucune requête n'y échappe, y compris via l'API REST générée. Fonctions d'aide et politique représentative :

create function fn_org() returns uuid ...        -- organisation de l'appelant
create function fn_role() returns role_utilisateur ...
create function fn_client_accessible(cid uuid) returns boolean ...
  -- meme organisation ET (role transverse OU affectation conseiller/client)

create policy clients_select on clients for select
  using (organisation_id = fn_org() and fn_client_accessible(id));
create policy simulations_all on simulations for all
  using (fn_client_accessible(client_id))
  with check (organisation_id = fn_org() and fn_client_accessible(client_id));
create policy audit_insert_only on audit_log for insert with check (true);
-- aucune politique update/delete sur audit_log : journal inalterable (RG-15)

Journal d'audit par déclencheurs

La fonction fn_audit() (security definer) insère auteur, horodatage UTC, organisation, entité, action et contenu avant/après (JSON) à chaque insertion, mise à jour ou suppression sur clients, simulations et echeances. Aucune écriture applicative directe : l'application ne peut ni omettre ni falsifier une entrée.

Index de performance

Jeu de démonstration (seed)

1 organisation, 4 utilisateurs (un par rôle), 25 clients dont Marie Dupont reproduisant les valeurs de la maquette (45 ans, 320 k€, objectif 2040, risque 5/10, profil équilibré, KYC à jour, entrée en relation 2016), sa simulation active (horizon 10 ans, versement initial 5 000 €, mensuel 150 €, allocation 45/30/20/5, frais 0,60 %) et ses 24 échéances dont les 4 lignes visibles de la maquette. Référence des tests visuels (CA-08) et des tests de calcul. Aucune donnée réelle hors production (C-05).