Aller au contenu

07 — Schéma de données révisé

Comment faire évoluer le schéma Supabase actuel (migrations 0001-0004) pour porter l'analyse et la refonte (docs 02-06). Proposition de design, pas des migrations prêtes à coder — à affiner avant implémentation.

⚠️ Révisé par le doc 08. Aligner blocs sur le schéma réel de blocs.jsonl (theme/titre/niveau/texte/mots/annee/resultat/agence/sourceId/ sourceLien) et séparer corpus RAG vs bibliothèque canonique ; ajouter cadres/rubriques_cadre (avec points) comme pilote de l'éditeur ; rétrograder statut_mapping en surcharge (la reconnaissance par motifs couvre les 12 agences) ; traiter les références en records structurés, pas en blocs de prose. Voir doc 08 §6.

1. Ce que le schéma actuel couvre déjà (et qu'on garde)

agences, users, statut_mapping, appels_offres, documents, corpus_chunks (pgvector 512 + HNSW), assets_visuels, memoires, memoire_sections, projets_scores, app_config, RPC match_corpus_chunks, RLS par agence. → bon socle. Les évolutions ci-dessous étendent ce socle.

2. Étendre appels_offres — porter la qualification (doc 05 §2.1)

Ajouts (extraits du DCE par Gemini) :

reference_affaire   text        -- clé [Lettre][AA][NNN], régularité forte (doc 01 §4)
type_prestation     text[]      -- tags métier (élagage, débroussaillage, sylvicole…)
nature_marche       text        -- forfait | accord_cadre | accord_cadre_pluriannuel
type_procedure      text        -- mapa | ao_ouvert | …
montant_estime_ht   numeric     -- (déjà montant_estime ; préciser HT)
montant_estime_ttc  numeric
nb_lots             int
duree_mois          int
date_limite_remise  date        -- (déjà présent)
validite_offre_j    int
emetteur_type       text        -- collectivite | etablissement_public | grand_compte
cadre_impose        boolean     -- cadré (true) vs libre (false)
ponderations        jsonb       -- {prix: 40, technique: 60, delais: 0} (⚠ ex RC)
extraction_status   text        -- pending | extracted | validated
extraction_meta     jsonb       -- confiance, modèle, date

3. Nouvelle table criteres_ao — la grille de notation (doc 03 §4)

Pilote le mapping critère → section du mémoire.

criteres_ao(
  id, ao_id → appels_offres,
  intitule text,            -- « Valeur technique », « Prix », « Délais »…
  ponderation numeric,      -- % ou points
  sous_criteres jsonb,      -- détail si le RC en donne
  ordre int
)

4. Enrichir memoires / memoire_sections — l'éditeur (doc 06 §5)

memoires : ajouter mode (libre | cadre), limite_pages int, trame_source (réf. du template/mémoire similaire), statut (brouillon|en_relecture|depose).

memoire_sections : refléter les 3 types de sections.

memoire_sections(
  ... (existant : id, memoire_id, ordre, titre, contenu, genere_par, valide)
  type_section text,        -- fige | parametree | selection
  critere_id → criteres_ao, -- rattachement à un critère du RC (nullable)
  bloc_id → blocs,          -- si figée : quel bloc/version inséré
  statut text,              -- a_faire | genere | valide
  source_generation jsonb,  -- réf. similaire, contraintes, prompt, tokens
  assets jsonb              -- visuels/annexes rattachés
)

5. Nouvelles tables — la bibliothèque (Module C, docs 04 §2, 06 §7)

Source unique de vérité du corpus réutilisable — c'est le quick win.

blocs(                       -- blocs figés + trames réutilisables
  id, agence_id (null = groupe),
  titre, type text,          -- fige | trame | asset
  verticale text,            -- toutes | sncf | dreal | collectivite | …
  frequence_maj text,        -- stable | annuel | quotidien
  externe_url text,          -- ex. portail Attestations Légales (doc 04 §2.C)
  contenu text,              -- pour les blocs texte
  embedding vector(512)      -- pour retrouver le bon bloc
)
blocs_versions(              -- versionnement daté (fin des désynchros)
  id, bloc_id → blocs, version text, contenu text,
  publie_le date, publie_par → users, actif boolean
)

references_clients(          -- base de références taggée (doc 04 §2.B)
  id, agence_id,
  maitre_ouvrage text, contact text, objet text,
  montant_ht numeric, annee int,
  type_prestation text[],    -- pour filtrer par pertinence
  ao_source_id → appels_offres  -- alimentée par les affaires gagnées
)

materiel(                    -- parc matériel / fiches engins (doc 03 §5)
  id, designation, categorie text,
  photo_url text, fiche_technique_url text,
  rendement text, quantite_groupe int, quantite_agence int
)

moyens_humains(              -- table maître RH filtrable (doc 03 §2 §8)
  id, agence_id, nom, poste,
  diplomes text[], caces text[], habilitations text[]
)

6. Contraintes / solutions taggées (doc 03 §3)

Générateur « contrainte → réponse type ». Peut vivre comme un bloc de type parametree OU une table dédiée si on veut un moteur fin :

contraintes_solutions(
  id, tag text,              -- urbain | rural | cours_eau | route | site_classe…
  contrainte text,           -- formulation de la contrainte
  reponse_type text,         -- engagement Serpe associé
  embedding vector(512)
)
Alimenté par extraction des CCTP (contraintes de site) + des mémoires existants.

7. Qualification agrégée (doc 05 §2.3) & scoring de similarité

  • Les stats agrégées (répartition, taux, montants) se calculent en vues SQL sur appels_offres — pas de table dédiée nécessaire.
  • projets_scores (déjà présent) porte le scoring de similarité entre un nouvel AO et les affaires de référence (RAG) — préciser criteres avec les axes de similarité du doc 05 §1 : {type_prestation, montant, zone, acheteur}.

8. Ingestion & RLS

  • Ingestion Drive : read-only (métadonnées d'abord, cf. audit de l'autre instance), puis contenu → OCR/extraction → corpus_chunks + champs appels_offres. La clé reference_affaire sert d'ancrage.
  • RLS : les nouvelles tables métier (criteres_ao, references_clients, moyens_humains) suivent le cloisonnement par agence_id déjà en place ; blocs/blocs_versions/materiel groupe sont lisibles par tous les authentifiés (référentiel commun) mais écrits par admin (source de vérité).

9. Résumé des évolutions

Objet Action Sert
appels_offres (+ colonnes) étendre Qualification (doc 05)
criteres_ao créer Mapping critère→section (doc 03 §4)
memoires / memoire_sections (+ colonnes) étendre Éditeur section par section (doc 06 §5)
blocs / blocs_versions créer Source unique de vérité (quick win, doc 04 §1)
references_clients · materiel · moyens_humains créer Blocs sélection (doc 03 §7)
contraintes_solutions créer Générateur contraintes/solutions (doc 03 §3)
projets_scores préciser Similarité RAG (doc 05 §1)

À valider avant d'écrire les migrations : dimension d'embedding (512, imposée), granularité blocs vs contraintes_solutions, et le modèle exact des versions.