Analyser les dossiers législatifs du Sénat
Explorer la structure relationnelle des dossiers législatifs du Sénat pour analyser lectures, étapes, textes, rapports et indices procéduraux dans le schéma `senat` de `canutes`.
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. Cette recette cible senat.
Pour le pendant Assemblée de cette recette, voyez Analyser les dossiers législatifs (actes législatifs, PLF).
Contrairement à assemblee.dossiers, le Sénat ne stocke pas le parcours d'un dossier dans un grand arbre JSONB d'actesLegislatifs. L'analyse passe par plusieurs tables relationnelles :
senat.dosleg_loipour le dossier,senat.dosleg_lecturepour les lectures,senat.dosleg_lecasspour les étapes par assemblée au sein d'une lecture,senat.dosleg_textepour les différentes versions de texte,senat.dosleg_rapetsenat.dosleg_lecassrappour les rapports.
Le bon modèle mental n'est donc pas "un dossier contient un arbre d'actes", mais plutôt :
- un dossier contient une ou plusieurs lectures,
- une lecture peut comporter plusieurs étapes par assemblée,
- les textes, rapports et liasses d'amendements se rattachent ensuite à ces étapes.
Modèle métier recommandé
Pour une UI ou une analyse métier, le modèle le plus robuste est :
dossierlectures[]etapes[]par lecturetextes[]rapports[]indices_proceduraux[](liasses d'amendements, petites lois, texte de commission, etc.)
Il ne faut pas supposer que :
- une lecture ne concerne qu'une seule chambre,
- une étape produit toujours une petite loi,
- un texte de commission a toujours une colonne dédiée clairement renseignée dans
dosleg_lecass, - tous les scrutins d'un dossier sont rattachables par une clé étrangère simple.
1. Résumer rapidement un dossier
Cette requête permet de mesurer la matière disponible avant d'aller plus loin.
SELECT
trim(l.loicod) AS dossier_code,
trim(l.loiint) AS dossier_titre,
count(DISTINCT le.lecidt)::int AS nb_lectures,
count(DISTINCT la.lecassidt)::int AS nb_etapes,
count(DISTINCT tex.texcod)::int AS nb_textes,
count(DISTINCT r.rapcod)::int AS nb_rapports
FROM senat.dosleg_loi AS l
LEFT JOIN senat.dosleg_lecture AS le
ON le.loicod = l.loicod
LEFT JOIN senat.dosleg_lecass AS la
ON la.lecidt = le.lecidt
LEFT JOIN senat.dosleg_texte AS tex
ON trim(tex.lecassidt) = trim(la.lecassidt)
LEFT JOIN senat.dosleg_lecassrap AS lr
ON trim(lr.lecassidt) = trim(la.lecassidt)
LEFT JOIN senat.dosleg_rap AS r
ON r.rapcod = lr.rapcod
WHERE trim(l.loicod) = '82760'
GROUP BY l.loicod, l.loiint;
2. Reconstituer la liste des lectures d'un dossier
dosleg_lecture donne la structure principale des lectures.
SELECT
trim(l.loicod) AS dossier_code,
trim(l.loiint) AS dossier_titre,
trim(le.lecidt) AS lecture_code,
trim(le.leccom) AS lecture,
trim(ty.typleclib) AS type_lecture
FROM senat.dosleg_lecture AS le
LEFT JOIN senat.dosleg_typlec AS ty
ON ty.typleccod = le.typleccod
LEFT JOIN senat.dosleg_loi AS l
ON l.loicod = le.loicod
WHERE trim(l.loicod) = '82760'
ORDER BY ty.typlecord ASC NULLS LAST, le.lecidt ASC;
3. Voir les étapes procédurales par assemblée dans une lecture
La table clé est dosleg_lecass : une lecture peut contenir plusieurs étapes, éventuellement Sénat puis Assemblée nationale.
SELECT
trim(le.loicod) AS dossier_code,
trim(le.lecidt) AS lecture_code,
trim(le.leccom) AS lecture,
trim(ty.typleclib) AS type_lecture,
trim(ass.libass) AS assemblee,
la.ordreass,
trim(la.orgcod) AS organe_code,
trim(COALESCE(com.comlilmin, com.evelib, com.evelic)) AS organe_libelle,
trim(la.loiintmod) AS titre_modifie,
la.depot_only
FROM senat.dosleg_lecass AS la
LEFT JOIN senat.dosleg_lecture AS le
ON le.lecidt = la.lecidt
LEFT JOIN senat.dosleg_typlec AS ty
ON ty.typleccod = le.typleccod
LEFT JOIN senat.dosleg_ass AS ass
ON ass.codass = la.codass
LEFT JOIN senat.sens_com AS com
ON com.orgcod = la.orgcod
WHERE trim(le.loicod) = '76565'
ORDER BY le.lecidt ASC, la.ordreass ASC;
Lecture métier utile :
assembleeindique la chambre de l'étape,ordreassdonne l'ordre de l'étape dans la lecture,orgcodpermet souvent d'identifier la commission saisie au fond,loiintmodsignale un intitulé retravaillé à cette étape,depot_only = 'oui'indique une étape encore incomplètement caractérisée.
4. Identifier les indices procéduraux d'une étape
dosleg_lecass porte plusieurs indices de procédure qu'il faut exploiter ensemble.
SELECT
trim(le.loicod) AS dossier_code,
trim(le.lecidt) AS lecture_code,
trim(le.leccom) AS lecture,
trim(ass.libass) AS assemblee,
la.ordreass,
trim(la.lecassamecom) AS amendements_commission,
TO_CHAR(la.lecassamecomdat, 'YYYY-MM-DD') AS amendements_commission_date,
trim(la.lecassamecomado) AS amendements_commission_adoptes,
TO_CHAR(la.lecassamecomadodat, 'YYYY-MM-DD') AS amendements_commission_adoptes_date,
trim(la.lecassame) AS amendements_seance,
TO_CHAR(la.lecassamedat, 'YYYY-MM-DD') AS amendements_seance_date,
trim(la.lecassameado) AS amendements_seance_adoptes,
TO_CHAR(la.lecassameadodat, 'YYYY-MM-DD') AS amendements_seance_adoptes_date,
la.ptlnum,
la.ptlurl,
la.ptlnumcom,
la.ptlurlcom
FROM senat.dosleg_lecass AS la
LEFT JOIN senat.dosleg_lecture AS le
ON le.lecidt = la.lecidt
LEFT JOIN senat.dosleg_ass AS ass
ON ass.codass = la.codass
WHERE trim(le.loicod) = '76565'
ORDER BY le.lecidt ASC, la.ordreass ASC;
Les colonnes les plus utiles sont :
lecassamecom/lecassamecomdat: liasse d'amendements de commission,lecassame/lecassamedat: liasse d'amendements de séance,lecassamecomadoetlecassameado: liasses des amendements adoptés,ptlnum/ptlurl: petite loi,ptlnumcom/ptlurlcom: texte ou petite loi de commission quand l'information est disponible.
Important : l'absence de ptlnumcom ne signifie pas forcément l'absence d'un texte de commission. Certaines versions sont mieux retrouvées dans dosleg_texte via leur origine.
Autre point important : lecassamedat et lecassamecomdat ne suffisent pas toujours à décrire l'agenda réel de la discussion. Il existe des dossiers pour lesquels ces colonnes sont vides alors qu'une programmation de séance est bien visible sur senat.fr.
5. Récupérer les dates d'inscription à l'ordre du jour
La table senat.dosleg_date_seance complète utilement dosleg_lecass pour les dates structurées de séance par lecture.
SELECT
trim(ds.lecidt) AS lecture_code,
trim(le.leccom) AS lecture,
ds.date_s::date AS date_seance,
trim(ds.statut) AS statut
FROM senat.dosleg_date_seance AS ds
JOIN senat.dosleg_lecture AS le
ON trim(le.lecidt) = trim(ds.lecidt)
WHERE trim(le.loicod) = '82342'
ORDER BY ds.date_s ASC;
Lecture métier utile :
dosleg_date_seancedonne des inscriptions à l'ordre du jour parlecidt,- cette table peut fournir plusieurs dates pour une même lecture,
- elle est utile quand
dosleg_lecass.lecassamedatest vide, - elle peut toutefois contenir des dates obsolètes ou incohérentes.
Contrôle de cohérence recommandé : ne pas réutiliser automatiquement une date de séance antérieure à la date de dépôt du texte de la lecture ou à la chronologie générale du dossier.
6. Reconstituer les différentes versions de texte d'un dossier
dosleg_texte est la source de vérité pour les versions successives du texte.
SELECT
trim(l.loicod) AS dossier_code,
trim(l.loiint) AS dossier_titre,
trim(tex.texnum::text) AS numero_public,
trim(tt.typtxtlib) AS type_texte,
trim(ori.oritxtlib) AS origine,
TO_CHAR(tex.txtoritxtdat, 'YYYY-MM-DD') AS date_texte,
trim(tex.texurl) AS texurl
FROM senat.dosleg_texte AS tex
LEFT JOIN senat.dosleg_typtxt AS tt
ON tt.typtxtcod = tex.typtxtcod
LEFT JOIN senat.dosleg_oritxt AS ori
ON ori.oritxtcod = tex.oritxtcod
LEFT JOIN senat.dosleg_lecass AS la
ON trim(la.lecassidt) = trim(tex.lecassidt)
LEFT JOIN senat.dosleg_lecture AS le
ON le.lecidt = la.lecidt
LEFT JOIN senat.dosleg_loi AS l
ON l.loicod = le.loicod
WHERE trim(le.loicod) = '76565'
ORDER BY tex.txtoritxtdat DESC NULLS LAST, tex.texcod DESC;
Le champ origine est fondamental pour l'analyse métier. On y rencontre par exemple :
déposé au Sénat,de la commission,adopté par le Sénat,transmis à l'Assemblée nationale,adopté par l'Assemblée nationale,adopté définitivement par le Sénat.
Cela permet de reconstruire un parcours sans avoir besoin d'un arbre JSON d'actes.
7. Lister les rapports d'un dossier
Les rapports se rattachent via dosleg_lecassrap.
SELECT
trim(le.loicod) AS dossier_code,
trim(r.rapcod::text) AS rapcod,
trim(r.rapnum::text) AS numero_public,
trim(COALESCE(NULLIF(r.raptitcou, ''), NULLIF(r.raptil, ''), l.loiint)) AS libelle,
TO_CHAR(r.date_depot, 'YYYY-MM-DD') AS date_depot
FROM senat.dosleg_rap AS r
LEFT JOIN senat.dosleg_lecassrap AS lr
ON lr.rapcod = r.rapcod
LEFT JOIN senat.dosleg_lecass AS la
ON trim(la.lecassidt) = trim(lr.lecassidt)
LEFT JOIN senat.dosleg_lecture AS le
ON le.lecidt = la.lecidt
LEFT JOIN senat.dosleg_loi AS l
ON l.loicod = le.loicod
WHERE trim(le.loicod) = '76565'
ORDER BY r.date_depot DESC NULLS LAST;
8. Recommandation de reconstruction procédurale
Pour chaque dossier Sénat, la séquence la plus robuste est :
- partir de
dosleg_loi, - récupérer les
dosleg_lecture, - dérouler les
dosleg_lecassparordreass, - compléter avec
dosleg_date_seancepour l'ordre du jour et les dates de séance, - enrichir avec
dosleg_textepour les versions du texte, - enrichir avec
dosleg_rappour les rapports, - utiliser
lecassame*etptl*comme indices procéduraux supplémentaires.
Autrement dit, dosleg_lecass donne la structure procédurale, dosleg_date_seance complète l'agenda de séance, tandis que dosleg_texte donne les objets documentaires à afficher.
9. Ce qu'il ne faut pas supposer
- qu'une lecture Sénat correspond toujours à une seule étape,
- qu'une lecture contient toujours un texte de commission explicitement balisé dans
ptlurlcom, - qu'une petite loi existe à chaque étape,
- que
lecassamedatsuffit à reconstruire toutes les dates de séance, - que
dosleg_date_seanceest toujours parfaitement alignée avec la page publiquesenat.fr, - qu'il existe une clé directe dossier -> scrutin comparable à un identifiant d'acte unique.
Pour les scrutins, passez ensuite par la recette Analyser les scrutins du Sénat. Pour les documents détaillés, voyez Reconstruire les dossiers et documents du Sénat.
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.
Explorer la structure des dossiers législatifs et de leurs actes pour analyser le parcours d'un texte ou d'un dossier budgétaire.
Requêtes SQL pour reconstruire la synthèse d'un scrutin Sénat, sa ventilation par position, par groupe et les votes nominatifs à partir des tables `dosleg_*` et `sens_sen`.
Requêtes SQL de travail pour lister les dossiers législatifs du Sénat et rattacher textes, rapports et étapes via les tables `dosleg_*`.
Recettes qui citent celle-ci
Recettes qui renvoient vers cette page depuis leur propre contenu.
Rechercher des textes, rapports et documents divers du Sénat via les tables `dosleg_texte`, `dosleg_rap` et `dosleg_doc`.
Comprendre la structure du schéma `senat` dans `canutes`, ses grandes familles de tables relationnelles et ses colonnes principales.
À 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