@tricoteuses/senat
Version:
Handle French Sénat's open data
486 lines (485 loc) • 19.3 kB
JavaScript
import { jsonArrayFrom, jsonObjectFrom } from "kysely/helpers/postgres";
import { dbSenat } from "../databases";
import { concat, nullIf, rtrim, toDateString } from "./util";
function circonscription(dptNum) {
return jsonObjectFrom(dbSenat
.withSchema("sens")
.selectFrom("dpt")
.leftJoin("reg", "dpt.regcod", "reg.regcod")
.where("dpt.dptnum", "=", dptNum)
.select(["dpt.dptcod as code", "dpt.dptlib as libelle_departement", "reg.reglib as libelle_region"]));
}
function textes(actId) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("activite_loi")
.where("actid", "=", actId)
.select(({ ref }) => [rtrim(ref("loicod")).as("loicod")]));
}
function delegations(actId) {
return jsonArrayFrom(dbSenat.withSchema("sens").selectFrom("activite_delegation").where("actid", "=", actId).orderBy("delegidx", "asc"));
}
function activites(senMat) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("activite")
.leftJoin("activite_participant", "activite.actid", "activite_participant.actid")
.leftJoin("type_activite", "activite.typactcod", "type_activite.typactcod")
.leftJoin("categorie_activite", "activite.catactcod", "categorie_activite.catactcod")
.where("activite_participant.senmat", "=", senMat)
.select(({ ref }) => [
delegations(ref("activite.actid")).as("delegations"),
textes(ref("activite.actid")).as("textes"),
])
.orderBy("activite.datdeb", "desc"));
}
function activitesPerso(senMat) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("activite_senateur")
.leftJoin("type_activite_senateur", "activite_senateur.typactsencod", "type_activite_senateur.typactsencod")
.where("activite_senateur.senmat", "=", senMat)
.orderBy("activite_senateur.datdeb", "desc"));
}
function fonctionsBureau(senMat) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("senbur")
.leftJoin("bur", "senbur.burcod", "bur.burcod")
.where("senbur.senmat", "=", senMat)
.select(({ eb, ref }) => [
toDateString(ref("senbur.senburdatdeb")).as("date_debut"),
toDateString(ref("senbur.senburdatfin")).as("date_fin"),
eb.fn.coalesce(nullIf(ref("bur.burlib")), nullIf(ref("bur.burlil")), nullIf(ref("bur.burlic"))).as("libelle"),
])
.orderBy("senbur.senburdatdeb", "desc"));
}
function mandatsEluConseillerGeneral(senMat) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("elucan")
.leftJoin("typman", "elucan.typmancod", "typman.typmancod")
.where("elucan.senmat", "=", senMat)
.select(({ ref }) => [circonscription(ref("elucan.dptnum").$notNull()).as("circonscription")])
.orderBy("elucan.eludatdeb", "desc"));
}
function mandatsEluDepute(senMat) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("eludep")
.leftJoin("typman", "eludep.typmancod", "typman.typmancod")
.where("eludep.senmat", "=", senMat)
.select(({ ref }) => [circonscription(ref("eludep.circo").$notNull()).as("circonscription")])
.orderBy("eludep.eludatdeb", "desc"));
}
function mandatsEluDivers(senMat) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("eludiv")
.leftJoin("typman", "eludiv.typmancod", "typman.typmancod")
.where("eludiv.senmat", "=", senMat)
.orderBy("eludiv.eludatdeb", "desc"));
}
function mandatsEluEuropeen(senMat) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("elueur")
.leftJoin("nation", "elueur.nationcod", "nation.nationcod")
.leftJoin("typman", "elueur.typmancod", "typman.typmancod")
.where("elueur.senmat", "=", senMat)
.orderBy("elueur.eludatdeb", "desc"));
}
function mandatsEluConseillerRegional(senMat) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("elureg")
.leftJoin("reg", "elureg.regcod", "reg.regcod")
.leftJoin("typman", "elureg.typmancod", "typman.typmancod")
.where("elureg.senmat", "=", senMat)
.orderBy("elureg.eludatdeb", "desc"));
}
function mandatsEluSenateur(senMat) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("elusen")
.leftJoin("etadebman", "elusen.etadebmancod", "etadebman.etadebmancod")
.leftJoin("etafinman", "elusen.etafinmancod", "etafinman.etafinmancod")
.leftJoin("typman", "elusen.typmancod", "typman.typmancod")
.where("elusen.senmat", "=", senMat)
.select(({ ref }) => [
"elusen.dptnum as code_circonscription",
toDateString(ref("elusen.eludatdeb")).as("date_debut"),
toDateString(ref("elusen.eludatfin")).as("date_fin"),
"elusen.temvalcod as etat",
"etadebman.etadebmanlib as etat_debut",
"etafinman.etafinman as etat_fin",
])
.orderBy("elusen.eludatdeb", "desc"));
}
function mandatsEluTerritorial(senMat) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("eluter")
.leftJoin("asster", "eluter.asstercod", "asster.asstercod")
.leftJoin("typman", "eluter.typmancod", "typman.typmancod")
.where("eluter.senmat", "=", senMat)
.orderBy("eluter.eludatdeb", "desc"));
}
function mandatsEluConseillerMunicipal(senMat) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("eluvil")
.leftJoin("typman", "eluvil.typmancod", "typman.typmancod")
.where("eluvil.senmat", "=", senMat)
.orderBy("eluvil.eludatdeb", "desc"));
}
function fonctionsMembreCommission(memComId) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("fonmemcom")
.leftJoin("foncom", "fonmemcom.foncomcod", "foncom.foncomcod")
.where("fonmemcom.memcomid", "=", memComId)
.select(({ eb, ref }) => [
toDateString(ref("fonmemcom.fonmemcomdatdeb")).as("date_debut"),
toDateString(ref("fonmemcom.fonmemcomdatfin")).as("date_fin"),
eb.fn
.coalesce(nullIf(ref("foncom.foncomlib")), nullIf(ref("foncom.foncomlil")), nullIf(ref("foncom.foncomlic")))
.as("libelle"),
])
.orderBy("fonmemcom.fonmemcomdatdeb", "desc"));
}
function mandatsMembreCommission(senMat) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("memcom")
.leftJoin("com", "memcom.orgcod", "com.orgcod")
.leftJoin("typorg", "com.typorgcod", "typorg.typorgcod")
.where("memcom.senmat", "=", senMat)
.select(({ ref }) => [
"com.typorgcod as type_code_organisme",
"memcom.orgcod as code_organisme",
"typorg.typorglib as type_organisme",
"com.comlilmin as libelle",
toDateString(ref("memcom.memcomdatdeb")).as("date_debut"),
toDateString(ref("memcom.memcomdatfin")).as("date_fin"),
"memcom.temvalcod as etat",
fonctionsMembreCommission(ref("memcom.memcomid")).as("fonctions"),
])
.orderBy("memcom.memcomdatdeb", "desc"));
}
function fonctionsMembreDelegation(memDelegaId) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("fonmemdelega")
.leftJoin("fondelega", "fonmemdelega.fondelcod", "fondelega.fondelcod")
.where("fonmemdelega.memdelegaid", "=", memDelegaId)
.select(({ eb, ref }) => [
toDateString(ref("fonmemdelega.fonmemdeldatdeb")).as("date_debut"),
toDateString(ref("fonmemdelega.fonmemdeldatfin")).as("date_fin"),
eb.fn
.coalesce(nullIf(ref("fondelega.fondellib")), nullIf(ref("fondelega.fondellil")), nullIf(ref("fondelega.fondellic")))
.as("libelle"),
])
.orderBy("fonmemdelega.fonmemdeldatdeb", "desc"));
}
function mandatsMembreDelegation(senMat) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("memdelega")
.leftJoin("delega", "memdelega.orgcod", "delega.orgcod")
.leftJoin("designorg", "memdelega.designcod", "designorg.designcod")
.leftJoin("typorg", "delega.typorgcod", "typorg.typorgcod")
.where("memdelega.senmat", "=", senMat)
.select(({ ref }) => [
"delega.typorgcod as type_code_organisme",
"memdelega.orgcod as code_organisme",
"typorg.typorglib as type_organisme",
"delega.evelib as libelle",
toDateString(ref("memdelega.memdelegadatdeb")).as("date_debut"),
toDateString(ref("memdelega.memdelegadatfin")).as("date_fin"),
"memdelega.temvalcod as etat",
fonctionsMembreDelegation(ref("memdelega.memdelegaid")).as("fonctions"),
])
.orderBy("memdelega.memdelegadatdeb", "desc"));
}
function mandatsMembreExtraParlementaire(senMat) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("memextpar")
.leftJoin("orgext", "memextpar.orgcod", "orgext.orgcod")
.leftJoin("design", "memextpar.designcod", "design.designcod")
.where("memextpar.senmat", "=", senMat)
.orderBy("memextpar.memextpardatdeb", "desc"));
}
function fonctionsMembreGroupePolitique(memGrpPolId) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("fonmemgrppol")
.leftJoin("fongrppol", "fonmemgrppol.fongrppolcod", "fongrppol.fongrppolcod")
.where("fonmemgrppol.memgrppolid", "=", memGrpPolId)
.select(({ eb, ref }) => [
toDateString(ref("fonmemgrppol.fonmemgrppoldatdeb")).as("date_debut"),
toDateString(ref("fonmemgrppol.fonmemgrppoldatfin")).as("date_fin"),
eb.fn
.coalesce(nullIf(ref("fongrppol.fongrppollib")), nullIf(ref("fongrppol.fongrppollil")), nullIf(ref("fongrppol.fongrppollic")))
.as("libelle"),
])
.orderBy("fonmemgrppol.fonmemgrppoldatdeb", "desc"));
}
function mandatsMembreGroupePolitique(senMat) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("memgrppol")
.leftJoin("grppol", "memgrppol.grppolcod", "grppol.grppolcod")
.leftJoin("typapppol", "memgrppol.typapppolcod", "typapppol.typapppolcod")
.leftJoin("typorg", "grppol.typorgcod", "typorg.typorgcod")
.where("memgrppol.senmat", "=", senMat)
.select(({ ref }) => [
"grppol.typorgcod as type_code_organisme",
"memgrppol.grppolcod as code_organisme",
"typorg.typorglib as type_organisme",
"grppol.grppollibcou as libelle",
toDateString(ref("memgrppol.memgrppoldatdeb")).as("date_debut"),
toDateString(ref("memgrppol.memgrppoldatfin")).as("date_fin"),
"memgrppol.temvalcod as etat",
fonctionsMembreGroupePolitique(ref("memgrppol.memgrppolid")).as("fonctions"),
])
.orderBy("memgrppol.memgrppoldatdeb", "desc"));
}
function fonctionsMembreGroupeSenatorial(memGrpSenId) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("fonmemgrpsen")
.leftJoin("fongrpsen", "fonmemgrpsen.fongrpsencod", "fongrpsen.fongrpsencod")
.where("fonmemgrpsen.memgrpsenid", "=", memGrpSenId)
.orderBy("fonmemgrpsen.fonmemgrpsendatdeb", "desc"));
}
function mandatsMembreGroupeSenatorial(senMat) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("memgrpsen")
.leftJoin("grpsenami", "memgrpsen.orgcod", "grpsenami.orgcod")
.leftJoin("typgrpsen", "grpsenami.typgrpsencod", "typgrpsen.typgrpsencod")
.where("memgrpsen.senmat", "=", senMat)
.select(({ ref }) => [fonctionsMembreGroupeSenatorial(ref("memgrpsen.memgrpsenid")).as("fonctions")])
.orderBy("memgrpsen.memgrpsendatent", "desc"));
}
function fonctionsMembreOrganisme(memOrgId) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("fonmemorg")
.leftJoin("fonorg", "fonmemorg.fonorgcod", "fonorg.fonorgcod")
.where("fonmemorg.memorgid", "=", memOrgId)
.orderBy("fonmemorg.fonmemorgdatdeb", "desc"));
}
function mandatsMembreOrganisme(senMat) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("memorg")
.leftJoin("org", "memorg.orgcod", "org.orgcod")
.leftJoin("typorg", "org.typorgcod", "typorg.typorgcod")
.leftJoin("designorg", "memorg.designcod", "designorg.designcod")
.where("memorg.senmat", "=", senMat)
.select(({ ref }) => [fonctionsMembreOrganisme(ref("memorg.memorgid")).as("fonctions")])
.orderBy("memorg.memorgdatdeb", "desc"));
}
function mandatsMinistre(senMat) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("minind")
.where("minind.senmat", "=", senMat)
.orderBy("minind.mindatdeb", "desc"));
}
function adressesPoicon(poiconId) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("adresse")
.where("adresse.poiconid", "=", poiconId)
.select([
"adresse.adrnumvoi as numero_voie",
"adresse.adrnomvoi as nom_voie",
"adresse.adrcmp as complement",
"adresse.adrcmp2 as complement2",
"adresse.adrcodpos as code_postal",
"adresse.adrcom as commune",
"adresse.adrcdxcod as code_cedex",
"adresse.adrcdxlib as libelle_cedex",
"adresse.adrburdis as bureau_distributeur",
])
.orderBy("adresse.adrnumtri", "asc"));
}
function telephonesPoicon(poiconId) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("telephone")
.where("telephone.poiconid", "=", poiconId)
.select(["telephone.typtelcod as type", "telephone.telnum as numero"])
.orderBy("telephone.telnumtri", "asc"));
}
function pointsContact(senMat) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("poicon")
.where("poicon.senmat", "=", senMat)
.select(({ ref }) => [
"poicon.poiconid as id",
"poicon.typpoiconcod as type",
"poicon.poiconlib as libelle",
adressesPoicon(ref("poicon.poiconid")).as("adresses"),
telephonesPoicon(ref("poicon.poiconid")).as("telephones"),
])
.orderBy("poicon.poiconnumtri", "asc"));
}
function urls(senMat) {
return jsonArrayFrom(dbSenat
.withSchema("sens")
.selectFrom("senurl")
.where("senurl.senmat", "=", senMat)
.select(["senurl.typurlcod as code_url", "senurl.senurlurl as url"])
.orderBy("senurl.senurlnumtri", "asc"));
}
const findAllQuery = dbSenat
.withSchema("sens")
.selectFrom("sen")
.leftJoin("etasen", "sen.etasencod", "etasen.etasencod")
.leftJoin("pcs", "sen.pcscod", "pcs.pcscod")
.leftJoin("pcs42", "pcs.pcs42cod", "pcs42.pcs42cod")
.leftJoin("pcs24", "pcs42.pcs24cod", "pcs24.pcs24cod")
.leftJoin("pcs8", "pcs24.pcs8cod", "pcs8.pcs8cod")
.leftJoin("grppol", "sen.sengrppolcodcou", "grppol.grppolcod")
.leftJoin("com", "sen.sencomcodcou", "com.orgcod")
.select(({ ref }) => [
"sen.senmat as matricule",
"sen.quacod as qualite",
"sen.sennomuse as nom_usuel",
"sen.senprenomuse as prenom_usuel",
"sen.etasencod as etat",
toDateString(ref("sen.sendatnai")).as("date_naissance"),
toDateString(ref("sen.sendatdec")).as("date_deces"),
"sen.sengrppolcodcou as code_groupe_politique",
"sen.sengrppolliccou as groupe_politique",
"sen.sencomcodcou as code_commission_permanente",
"com.comlilmin as commission_permanente",
"sen.sencirnumcou as code_circonscription",
"sen.sencircou as circonscription",
"sen.senburliccou as fonction_bureau_senat",
"sen.senema as courrier_electronique",
"pcs.pcslil as PCS_INSEE",
"pcs42.pcs42lib as PCS_INSEE_42",
"pcs24.pcs24lib as PCS_INSEE_24",
"pcs8.pcs8lil as PCS_INSEE_8",
"sen.sendespro as description_profession",
"sen.sennumsie as siege",
"sen.sendaiurl as url_hatvp",
urls(ref("sen.senmat")).as("urls"),
mandatsEluSenateur(ref("sen.senmat")).as("mandats_senateur"),
mandatsMembreCommission(ref("sen.senmat")).as("commissions"),
mandatsMembreDelegation(ref("sen.senmat")).as("delegations"),
mandatsMembreGroupePolitique(ref("sen.senmat")).as("groupes"),
fonctionsBureau(ref("sen.senmat")).as("fonctions_bureau"),
pointsContact(ref("sen.senmat")).as("points_contact"),
]);
const findAllCirconscriptionsQuery = dbSenat
.withSchema("sens")
.selectFrom("dpt")
.leftJoin("reg", "dpt.regcod", "reg.regcod")
.select(({ ref }) => [
"dpt.dptnum as identifiant",
"dpt.dptcod as code",
"dpt.dptlib as libelle_departement",
"dpt.dptart as article",
"reg.reglib as libelle_region",
"dpt.temvalcod as etat",
toDateString(ref("dpt.dptdatdeb")).as("date_debut"),
toDateString(ref("dpt.dptdatfin")).as("date_fin"),
"dpt.dptnbrsen as nombre_senateurs",
"dpt.dpturlcmp as url",
]);
const findAllOrganismesQuery = dbSenat
.withSchema("sens")
.selectFrom((eb) => eb
.selectFrom("com")
.select(["orgcod", "evelic", "evelib", "evelil", "typorgcod", "orgurlsim", "orgdatcre", "orgdatfin", "temvalcod"])
.union(eb
.selectFrom("delega")
.select([
"orgcod",
"evelic",
"evelib",
"evelil",
"typorgcod",
"orgurlsim",
"orgdatcre",
"orgdatfin",
"temvalcod",
]))
.union(eb
.selectFrom("grppol")
.select([
"grppolcod as orgcod",
"grppolliccou as evelic",
"grppollibcou as evelib",
"grppollilcou as evelil",
"typorgcod",
"grppolurlsim as orgurlsim",
"grppoldatcre as orgdatcre",
"grppoldatfin as orgdatfin",
"temvalcod",
]))
.union(eb
.selectFrom("grpsenami")
.select([
"orgcod",
"evelic",
"evelib",
"evelil",
"typorgcod",
"orgurlsim",
"orgdatcre",
"orgdatfin",
"temvalcod",
]))
.union(eb
.selectFrom("org")
.select([
"orgcod",
"evelic",
"evelib",
"evelil",
"typorgcod",
"orgurlsim",
"orgdatcre",
"orgdatfin",
"temvalcod",
]))
.as("all_organismes"))
.leftJoin("typorg", "all_organismes.typorgcod", "typorg.typorgcod")
.select(({ ref, val }) => [
"all_organismes.orgcod as code",
"all_organismes.evelic as libelle_court",
"all_organismes.evelib as libelle",
rtrim(ref("all_organismes.evelil")).as("libelle_long"),
"all_organismes.typorgcod as type_code",
rtrim(ref("typorg.typorglib")).as("type_libelle"),
concat(val("https://www.senat.fr"), ref("all_organismes.orgurlsim")).as("url"),
toDateString(ref("all_organismes.orgdatcre")).as("date_debut"),
toDateString(ref("all_organismes.orgdatfin")).as("date_fin"),
"all_organismes.temvalcod as etat",
]);
export function findAll() {
return findAllQuery.stream();
}
export function findAllCirconscriptions() {
return findAllCirconscriptionsQuery.stream();
}
export function findAllOrganismes() {
return findAllOrganismesQuery.stream();
}
export function findActif() {
return dbSenat
.withSchema("sens")
.selectFrom("sen")
.where("etasencod", "=", "ACTIF")
.select(["senmat", "sennomuse", "senprenomuse"])
.stream();
}