Analyser les dossiers législatifs (actes législatifs, PLF)
Explorer la structure des dossiers législatifs et de leurs actes pour analyser le parcours d'un texte ou d'un dossier budgétaire.
Contenu de la recette
Cette recette est indexée par Moulineuse et peut servir de point de départ pour vos explorations SQL, Typesense ou scripts agents.
Vue d'ensemble
La base unique canutes expose les schémas assemblee, legifrance et senat. Utilisez query_sql pour explorer les dossiers législatifs, avec des tables explicitement qualifiées comme assemblee.dossiers ou assemblee.documents. Le cœur de l'information se trouve dans le champ actesLegislatifs du JSONB data, qui forme un arbre retraçant toute la vie de la loi.
Pour le pendant Sénat de cette recette, voyez Analyser les dossiers législatifs du Sénat.
Structure des Actes (actesLegislatifs)
Chaque acte possède un xsiType qui définit sa nature.
Types courants d'actes
Etape_Type: Un conteneur pour une étape (ex: 1ère lecture). Regroupe souvent des sous-actes viaactesLegislatifs.DepotInitiative_Type: Dépôt du texte initial.DiscussionCommission_Type/DiscussionSeancePublique_Type: Débats.SaisineConseilConstit_Type: Saisine du Conseil constitutionnel.Decision_Type: Décision (souvent finale d'une étape).Promulgation_Type: Acte de promulgation de la loi.
Champs fréquents dans les actes
| Champ | Description |
|---|---|
uid |
Identifiant unique de l'acte |
dateActe |
Date de l'évènement (ISO) |
libelleActe.nomCanonique |
Libellé lisible pour l'humain |
organeRef |
UID de l'organe concerné (PO...) |
auteursRefs |
Tableau d'UIDs d'acteurs (PA...) |
rapporteurs |
Tableau d'objets avec acteurRef |
voteRefs |
Tableau d'identifiants de scrutins (VT...) |
texteAssocieRef |
UID du document associé (ex: projet de loi) |
texteAdopteRef |
UID du texte adopté à cette étape |
textesAssocies |
Tableau d'objets avec texteAssocieRef |
Documents et dossiers
Dans le schéma assemblee, les documents sont associés à un dossier via dossier_uid. Cependant, les actes législatifs peuvent référencer des documents qui ne sont pas directement liés au dossier en cours (ex: un texte adopté dans une autre législature ou un document d'un dossier connexe).
Lors de la récupération des données pour un dossier, il ne faut pas se limiter aux documents filtrés par dossier_uid, mais aussi collecter tous les UIDs référencés dans les actes et les récupérer individuellement si nécessaire.
Cas particulier : Conseil Constitutionnel (SaisineConseilConstit_Type)
Pour les saisines et décisions du CC, on trouve des champs spécifiques :
motif: Le fondement textuel (ex: "En application de l'article 61§2 de la Constitution").numDecision: Numéro de la décision.statutConclusion.libelle: Le sort (ex: "Conforme", "Partiellement conforme").urlConclusion: Lien vers le texte de la décision.
Traversée des actes
Pour traiter tous les actes d'un dossier (par exemple pour extraire tous les UIDs d'acteurs cités), il est recommandé d'utiliser une fonction récursive ou un utilitaire comme walkActes de @tricoteuses/assemblee.
import { walkActes } from "@tricoteuses/assemblee"
for (const acte of walkActes(dossier.actesLegislatifs)) {
if (acte.voteRefs) {
// Les IDs de scrutins (VT...) se trouvent ici
}
}
Requête pour les scrutins référencés
Attention : La table scrutins ne possède pas de colonne numero. Le numéro public doit être extrait du JSONB :
SELECT uid, data ->> 'numero' as numero
FROM assemblee.scrutins
WHERE uid IN (...);
Le champ plf (dossiers de loi de finances)
Les dossiers budgétaires (PLF, PLFSS…) contiennent un champ plf dans leur JSONB data. Ce tableau liste, pour chaque mission budgétaire, la commission saisie, le rapport ou avis associé, et les rapporteurs désignés.
{
"plf": [
{
"uid": "ETDR5L17PLF2026N6457",
"organeRef": "PO59048",
"texteAssocie": "RAPPANR5L17B1996-tIII-a1",
"rapporteurs": [{ "acteurRef": "PA795454", "typeRapporteur": "rapporteur spécial" }],
"missionMinefi": { "codeMission": "AA", "libelleLong": "Action extérieure de l'État", ... },
"ordreDiqs": "2",
"ordreCommission": "1"
},
...
]
}
Point critique : texteAssocie est un UID de division
Dans plf, le champ texteAssocie référence presque toujours une division d'un document (tome, annexe budgétaire), et non un document racine. Ces UIDs n'existent pas comme lignes directes dans la table documents — une requête WHERE uid = 'RAPPANR5L17B1996-tIII-a1' ne retournera rien.
Il faut les chercher via jsonb_array_elements sur les divisions imbriquées du document parent. Voir la recipe Divisions de documents et champ PLF pour le détail complet et les requêtes SQL.
Références à collecter dans plf
Lors du chargement d'un dossier PLF, ne pas oublier de collecter depuis chaque entrée plf :
organeRef→ à résoudre dans la tableorganesrapporteurs[].acteurRef→ à résoudre dans la tableacteurstexteAssocie→ à résoudre comme division (voir recipe dédiée)
Tri des entrées PLF
ordreCommission est une chaîne numérique. Pour trier correctement en TypeScript :
const sorted = [...dossier.plf].sort((a, b) =>
a.ordreCommission.localeCompare(b.ordreCommission, undefined, {
numeric: true,
}),
)
Recettes liées
Poursuivez l'exploration avec des recettes proches : celles citées par cette page wiki et celles qui la référencent.
Recettes citées
Recettes vers lesquelles cette page pointe directement.
À propos de ces recettes
Les recettes Moulineuse documentent des requêtes et des méthodes réutilisables pour analyser les données juridiques et parlementaires avec les outils Tricoteuses. Elles servent aussi directement au serveur MCP Moulineuse pour guider les usages et les extractions possibles.
Voir le serveur MCP Moulineuse