@tricoteuses/senat
Version:
Handle French Sénat's open data
115 lines (114 loc) • 5.38 kB
JavaScript
import { sql } from "kysely";
import { jsonArrayFrom } from "kysely/helpers/postgres";
import { dbSenat } from "../databases";
import { rtrim, toDateString } from "./util";
function votes(scrutinNum, scrutinSession, scrutinDate) {
return jsonArrayFrom(dbSenat
.selectFrom("dosleg.votsen")
.leftJoin("dosleg.titsen", "dosleg.titsen.titsencod", "dosleg.votsen.titsencod")
.leftJoin("dosleg.stavot", "dosleg.stavot.stavotidt", "dosleg.votsen.stavotidt")
.leftJoin("dosleg.posvot", "dosleg.posvot.posvotcod", "dosleg.votsen.posvotcod")
.leftJoin("sens.memgrppol", (join) => join
.onRef("sens.memgrppol.senmat", "=", "dosleg.votsen.senmat")
.onRef("sens.memgrppol.memgrppoldatdeb", "<=", scrutinDate)
.on((eb) => eb.or([
eb("sens.memgrppol.memgrppoldatfin", ">=", scrutinDate),
eb("sens.memgrppol.memgrppoldatfin", "is", null),
])))
.where("dosleg.votsen.scrnum", "=", scrutinNum)
.where("dosleg.votsen.sesann", "=", scrutinSession)
.orderBy("sens.memgrppol.memgrppoldatdeb", "desc")
.select([
"dosleg.votsen.senmat as matricule_votant",
"dosleg.votsen.senmatdel as matricule_delegant",
"dosleg.posvot.posvotlib as position",
"dosleg.stavot.stavotlib as statut_votant",
"dosleg.titsen.titsenlib as titre_votant",
"sens.memgrppol.memgrppolid as groupe_politique_id",
"sens.memgrppol.grppolcod as groupe_politique_code",
]));
}
function groupesVotants(scrutinNum, scrutinSession, scrutinDate) {
return jsonArrayFrom(dbSenat
.selectFrom((eb) => eb
.selectFrom("dosleg.votsen")
.leftJoin("dosleg.posvot", "dosleg.posvot.posvotcod", "dosleg.votsen.posvotcod")
.leftJoin("dosleg.stavot", "dosleg.stavot.stavotidt", "dosleg.votsen.stavotidt")
.leftJoin("sens.memgrppol", (join) => join
.onRef("sens.memgrppol.senmat", "=", "dosleg.votsen.senmat")
.onRef("sens.memgrppol.memgrppoldatdeb", "<=", scrutinDate)
.on((eb) => eb.or([
eb("sens.memgrppol.memgrppoldatfin", ">=", scrutinDate),
eb("sens.memgrppol.memgrppoldatfin", "is", null),
])))
.where("dosleg.votsen.scrnum", "=", scrutinNum)
.where("dosleg.votsen.sesann", "=", scrutinSession)
.orderBy("sens.memgrppol.memgrppoldatdeb", "desc")
.select([
"dosleg.votsen.senmat",
"dosleg.posvot.posvotlib",
"dosleg.stavot.stavotlib",
"sens.memgrppol.grppolcod",
])
.as("unique_votes"))
.groupBy(["unique_votes.grppolcod"])
.select(({ fn, eb }) => [
"unique_votes.grppolcod as groupe_politique_code",
fn.sum(eb.case().when("unique_votes.posvotlib", "=", "pour").then(1).else(0).end()).as("nombre_pour"),
fn.sum(eb.case().when("unique_votes.posvotlib", "=", "contre").then(1).else(0).end()).as("nombre_contre"),
fn
.sum(eb.case().when("unique_votes.posvotlib", "=", "abstention").then(1).else(0).end())
.as("nombre_abstentions"),
fn
.sum(eb.case().when("unique_votes.posvotlib", "=", "non-votant").then(1).else(0).end())
.as("nombre_non_votants"),
fn.count("unique_votes.senmat").as("nombre_votants"),
]));
}
function misesAuPoint(scrutinNum) {
return jsonArrayFrom(dbSenat
.withSchema("dosleg")
.selectFrom("corscr")
.where("corscr.scrnum", "=", scrutinNum)
.select(["corscr.corscrtxt as texte", "corscr.corscrord as ordre", "corscr.corscrurl as url"]));
}
const findAllScrutinsQuery = dbSenat
.withSchema("dosleg")
.selectFrom("scr")
.leftJoin("date_seance", "scr.code", "date_seance.code")
.leftJoin("lecass", "date_seance.lecidt", "lecass.lecassidt")
.leftJoin("lecture", "lecture.lecidt", "lecass.lecidt")
.leftJoin("loi", "loi.loicod", "lecture.loicod")
.leftJoin("typlec", "typlec.typleccod", "lecture.typleccod")
.select(({ eb, ref, val }) => [
"scr.sesann as session",
"scr.scrnum as numero",
rtrim(ref("date_seance.lecidt")).as("lecture_id"),
rtrim(ref("lecture.leccom")).as("lecture_libelle"),
"loi.signet as signet_dossier",
rtrim(ref("typlec.typleclib")).as("type_lecture"),
toDateString(ref("scr.scrdat")).as("date_scrutin"),
toDateString(ref("scr.scrdateff")).as("date_scrutin_effective"),
sql `REPLACE(scr.scrint, E'\\u0092', '''')`.as("intitule"),
"scr.scrbaspag as note",
"scr.scrmaj as nombre_majorite",
"scr.scrmajsea as nombre_majorite_seance",
"scr.scrvot as nombre_votants",
"scr.scrvotsea as nombre_votants_seance",
"scr.scrsuf as nombre_suffrages",
"scr.scrsufsea as nombre_suffrages_seance",
"scr.scrcon as nombre_contre",
"scr.scrconsea as nombre_contre_seance",
"scr.scrpou as nombre_pour",
"scr.scrpousea as nombre_pour_seance",
votes(ref("scr.scrnum"), ref("scr.sesann"), ref("scr.scrdat")).as("votes"),
groupesVotants(ref("scr.scrnum"), ref("scr.sesann"), ref("scr.scrdat")).as("groupes_votants"),
misesAuPoint(ref("scr.scrnum")).as("mises_au_point"),
])
.$narrowType();
export function findAllScrutins(fromSession) {
if (fromSession !== undefined) {
return findAllScrutinsQuery.where("scr.sesann", ">=", fromSession).stream();
}
return findAllScrutinsQuery.stream();
}