@tricoteuses/senat
Version:
Handle French Sénat's open data
149 lines (148 loc) • 7 kB
JavaScript
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();
}