UNPKG

@tricoteuses/senat

Version:

Handle French Sénat's open data

115 lines (114 loc) 5.38 kB
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(); }