UNPKG

@tricoteuses/senat

Version:

Handle French Sénat's open data

149 lines (148 loc) 7 kB
import { sql } from "kysely"; import { jsonArrayFrom } from "kysely/helpers/postgres"; import { dbSenat } from "../databases"; import { concat, rtrim, toDateString } from "./util"; function auteurs(amendementId) { return jsonArrayFrom(dbSenat .selectFrom("ameli.amdsen") .leftJoin("ameli.sen_ameli", "ameli.amdsen.senid", "ameli.sen_ameli.entid") .leftJoin("ameli.grppol_ameli", "ameli.amdsen.grpid", "ameli.grppol_ameli.entid") .where("ameli.amdsen.amdid", "=", amendementId) .select([ "ameli.amdsen.prenomuse as prenom", "ameli.amdsen.hom as homonyme", "ameli.amdsen.nomuse as nom", "ameli.amdsen.qua as qualite", "ameli.amdsen.rng as rang", "ameli.sen_ameli.mat as matricule", "ameli.amdsen.grpid as groupe_politique_id", "ameli.grppol_ameli.cod as group_politique_code", "ameli.grppol_ameli.libcou as groupe_politique_libelle_court", "ameli.grppol_ameli.lilcou as groupe_politique_libelle", ]) .orderBy("ameli.amdsen.rng", "asc")); } function scrutin(amendementNum, sesann, lecassidt) { return dbSenat .selectFrom("dosleg.amescr") .leftJoin("dosleg.scr", (join) => join .onRef("dosleg.amescr.scrnum", "=", "dosleg.scr.scrnum") .onRef("dosleg.amescr.sesann", "=", "dosleg.scr.sesann")) .leftJoin("dosleg.date_seance", "dosleg.scr.code", "dosleg.date_seance.code") .where("dosleg.amescr.amescrnum", "=", amendementNum) .where("dosleg.amescr.sesann", "=", sesann) .where("dosleg.date_seance.lecidt", "=", lecassidt) .select(["dosleg.amescr.scrnum as scrutin_num"]) .limit(1) .as("scrutin_num"); } const findAllAmendementsQuery = dbSenat .selectFrom("ameli.amd") .leftJoin("ameli.sub", "ameli.amd.subid", "ameli.sub.id") .leftJoin("ameli.typsub", "ameli.sub.typid", "ameli.typsub.id") .leftJoin("ameli.typrect", "ameli.amd.typrectid", "ameli.typrect.id") .leftJoin("ameli.txt_ameli", "ameli.amd.txtid", "ameli.txt_ameli.id") .leftJoin("ameli.etatxt", "ameli.txt_ameli.txtetaid", "ameli.etatxt.id") .leftJoin("ameli.ses", "ameli.txt_ameli.sesdepid", "ameli.ses.id") .leftJoin("ameli.typses", "ameli.typses.id", "ameli.ses.typid") .leftJoin("ameli.nat", "ameli.txt_ameli.natid", "ameli.nat.id") .leftJoin("ameli.lec_ameli", "ameli.txt_ameli.lecid", "ameli.lec_ameli.id") .leftJoin("dosleg.texte", (join) => join.onRef("ameli.ses.ann", "=", "dosleg.texte.sesann").onRef("ameli.txt_ameli.numabs", "=", "dosleg.texte.texnum")) .leftJoin("dosleg.lecass", "dosleg.texte.lecassidt", "dosleg.lecass.lecassidt") .leftJoin("ameli.mot", "ameli.amd.motid", "ameli.mot.id") .leftJoin("ameli.avicom", "ameli.amd.avcid", "ameli.avicom.id") .leftJoin("ameli.avigvt", "ameli.amd.avgid", "ameli.avigvt.id") .leftJoin("ameli.sor", "ameli.amd.sorid", "ameli.sor.id") .leftJoin("ameli.irr", "ameli.amd.irrid", "ameli.irr.id") .leftJoin("ameli.grppol_ameli", "ameli.amd.nomentid", "ameli.grppol_ameli.entid") .leftJoin("ameli.com_ameli", "ameli.amd.nomentid", "ameli.com_ameli.entid") .leftJoin("ameli.cab", "ameli.amd.nomentid", "ameli.cab.entid") .select(({ eb, ref, val }) => [ "ameli.ses.ann as session", "ameli.ses.lil as session_libelle", "ameli.typses.lib as type_session", "ameli.txt_ameli.doslegsignet as signet_dossier_legislatif", "ameli.nat.libcourt as nature_texte", "ameli.nat.lib as nature_texte_libelle", "ameli.txt_ameli.numabs as numero_texte", "ameli.txt_ameli.numado as numero_adoption_texte", "ameli.txt_ameli.int as intitule_texte", "ameli.etatxt.lic as etat_texte", "ameli.etatxt.lib as etat_texte_libelle", "ameli.etatxt.txttyp as type_texte", "ameli.lec_ameli.lib as lecture", eb .case() .when("ameli.amd.typ", "=", "A") .then(val("Amendement")) .when("ameli.amd.typ", "=", "M") .then(val("Motion")) .when("ameli.amd.typ", "=", "S") .then(val("Sous-amendement")) .else("") .end() .as("nature"), "ameli.amd.id as id", "ameli.amd.amdperid as parent_id", "ameli.amd.ideid as identique_id", "ameli.amd.discomid as discussion_commune_id", "ameli.amd.num as numero", "ameli.amd.numabs as numero_absolu", "ameli.amd.ord as ordre", "ameli.amd.accgou as accepte_gouvernement", "ameli.amd.txtid as texte_id", "ameli.sub.lib as subdivision_libelle", "ameli.sub.lic as subdivision_libelle_court", "ameli.sub.pos as subdivision_position_texte", "ameli.sub.posder as subdivision_position_discussion", "ameli.sub.merid as subdivision_mere_id", "ameli.sub.sig as subdivision_signet", "ameli.sub.comdelid as subdivision_commission_id", "ameli.sub.dupl as subdivision_dupliquee", "ameli.typsub.lib as subdivision_type", "ameli.amd.alinea as alinea", "ameli.amd.obs as observations", "ameli.amd.mot as observations_additionnelles", toDateString(ref("ameli.amd.datdep")).as("date_depot"), "ameli.amd.dis as dispositif", "ameli.amd.obj as objet", "ameli.typrect.lib as type_rectification", "ameli.mot.lib as motion_libelle", eb .case() .when("ameli.amd.etaid", "=", 7) .then(val("Diffusé")) .when("ameli.amd.etaid", "=", 8) .then(val("Retiré avant réunion ou séance")) .when("ameli.amd.etaid", "=", 9) .then(val("Examiné en commission ou séance")) .when("ameli.amd.etaid", "=", 10) .then(val("Irrecevable")) .when("ameli.amd.etaid", "=", 11) .then(val("Irrecevable")) .else("") .end() .as("etat"), "ameli.avicom.lib as avis_commission", "ameli.avigvt.lib as avis_gouvernement", eb.fn.coalesce("ameli.sor.lib", "ameli.irr.libirr").as("sort"), "ameli.amd.rev as revision", concat(eb .case() .when("ameli.amd.num", "like", "%COM%") .then(val("https://www.senat.fr/amendements/commissions/")) .else(val("https://www.senat.fr/amendements/")) .end(), ref("ameli.ses.ann"), val("-"), sql `(ameli.ses.ann + 1)`, val("/"), ref("ameli.txt_ameli.numabs"), val("/Amdt_"), ref("ameli.amd.num"), val(".html")).as("url"), "ameli.grppol_ameli.lilcou as au_nom_de_groupe_politique", rtrim(ref("ameli.com_ameli.lil")).as("au_nom_de_commission"), rtrim(ref("ameli.com_ameli.cod")).as("code_commission"), eb.case().when("ameli.cab.entid", "is not", null).then(true).else(false).end().as("auteur_est_gouvernement"), scrutin(ref("ameli.amd.num"), ref("ameli.ses.ann"), ref("dosleg.texte.lecassidt")), auteurs(ref("ameli.amd.id")).as("auteurs"), ]); export function findAllAmendements(fromSession) { if (fromSession !== undefined) { return findAllAmendementsQuery.where("ameli.ses.ann", ">=", fromSession).stream(); } return findAllAmendementsQuery.stream(); }