@tricoteuses/senat 2.22.11 → 2.22.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/lib/config.d.ts +21 -0
  2. package/lib/config.js +27 -0
  3. package/lib/databases.d.ts +2 -0
  4. package/lib/databases.js +26 -0
  5. package/lib/datasets.d.ts +34 -0
  6. package/lib/datasets.js +233 -0
  7. package/lib/git.d.ts +26 -0
  8. package/lib/git.js +167 -0
  9. package/lib/index.d.ts +13 -0
  10. package/lib/index.js +1 -0
  11. package/lib/loaders.d.ts +58 -0
  12. package/lib/loaders.js +286 -0
  13. package/lib/model/agenda.d.ts +6 -0
  14. package/lib/model/agenda.js +148 -0
  15. package/lib/model/ameli.d.ts +51 -0
  16. package/lib/model/ameli.js +147 -0
  17. package/lib/model/commission.d.ts +18 -0
  18. package/lib/model/commission.js +269 -0
  19. package/lib/model/debats.d.ts +67 -0
  20. package/lib/model/debats.js +95 -0
  21. package/lib/model/documents.d.ts +12 -0
  22. package/lib/model/documents.js +138 -0
  23. package/lib/model/dosleg.d.ts +7 -0
  24. package/lib/model/dosleg.js +326 -0
  25. package/lib/model/index.d.ts +7 -0
  26. package/lib/model/index.js +7 -0
  27. package/lib/model/questions.d.ts +45 -0
  28. package/lib/model/questions.js +89 -0
  29. package/lib/model/scrutins.d.ts +13 -0
  30. package/lib/model/scrutins.js +114 -0
  31. package/lib/model/seance.d.ts +3 -0
  32. package/lib/model/seance.js +267 -0
  33. package/lib/model/sens.d.ts +146 -0
  34. package/lib/model/sens.js +454 -0
  35. package/lib/model/texte.d.ts +7 -0
  36. package/lib/model/texte.js +228 -0
  37. package/lib/model/util.d.ts +9 -0
  38. package/lib/model/util.js +38 -0
  39. package/lib/parsers/texte.d.ts +7 -0
  40. package/lib/parsers/texte.js +228 -0
  41. package/lib/raw_types/ameli.d.ts +914 -0
  42. package/lib/raw_types/ameli.js +5 -0
  43. package/lib/raw_types/debats.d.ts +207 -0
  44. package/lib/raw_types/debats.js +5 -0
  45. package/lib/raw_types/dosleg.d.ts +1619 -0
  46. package/lib/raw_types/dosleg.js +5 -0
  47. package/lib/raw_types/questions.d.ts +423 -0
  48. package/lib/raw_types/questions.js +5 -0
  49. package/lib/raw_types/senat.d.ts +11372 -0
  50. package/lib/raw_types/senat.js +5 -0
  51. package/lib/raw_types/sens.d.ts +8248 -0
  52. package/lib/raw_types/sens.js +5 -0
  53. package/lib/raw_types_schemats/ameli.d.ts +539 -0
  54. package/lib/raw_types_schemats/ameli.js +2 -0
  55. package/lib/raw_types_schemats/debats.d.ts +127 -0
  56. package/lib/raw_types_schemats/debats.js +2 -0
  57. package/lib/raw_types_schemats/dosleg.d.ts +977 -0
  58. package/lib/raw_types_schemats/dosleg.js +2 -0
  59. package/lib/raw_types_schemats/questions.d.ts +237 -0
  60. package/lib/raw_types_schemats/questions.js +2 -0
  61. package/lib/raw_types_schemats/sens.d.ts +6915 -0
  62. package/lib/raw_types_schemats/sens.js +2 -0
  63. package/lib/scripts/convert_data.d.ts +1 -0
  64. package/lib/scripts/convert_data.js +354 -0
  65. package/lib/scripts/data-download.d.ts +1 -0
  66. package/lib/scripts/data-download.js +12 -0
  67. package/lib/scripts/datautil.d.ts +8 -0
  68. package/lib/scripts/datautil.js +34 -0
  69. package/lib/scripts/parse_textes.d.ts +1 -0
  70. package/lib/scripts/parse_textes.js +44 -0
  71. package/lib/scripts/retrieve_agenda.d.ts +1 -0
  72. package/lib/scripts/retrieve_agenda.js +132 -0
  73. package/lib/scripts/retrieve_cr_commission.d.ts +1 -0
  74. package/lib/scripts/retrieve_cr_commission.js +364 -0
  75. package/lib/scripts/retrieve_cr_seance.d.ts +6 -0
  76. package/lib/scripts/retrieve_cr_seance.js +347 -0
  77. package/lib/scripts/retrieve_documents.d.ts +3 -0
  78. package/lib/scripts/retrieve_documents.js +219 -0
  79. package/lib/scripts/retrieve_open_data.d.ts +1 -0
  80. package/lib/scripts/retrieve_open_data.js +316 -0
  81. package/lib/scripts/retrieve_senateurs_photos.d.ts +1 -0
  82. package/lib/scripts/retrieve_senateurs_photos.js +147 -0
  83. package/lib/scripts/retrieve_videos.d.ts +1 -0
  84. package/lib/scripts/retrieve_videos.js +461 -0
  85. package/lib/scripts/shared/cli_helpers.d.ts +95 -0
  86. package/lib/scripts/shared/cli_helpers.js +91 -0
  87. package/lib/scripts/shared/util.d.ts +4 -0
  88. package/lib/scripts/shared/util.js +35 -0
  89. package/lib/scripts/test_iter_load.d.ts +1 -0
  90. package/lib/scripts/test_iter_load.js +12 -0
  91. package/lib/src/model/sens.d.ts +36 -0
  92. package/lib/src/model/sens.js +35 -4
  93. package/lib/src/scripts/retrieve_cr_commission.js +12 -0
  94. package/lib/src/scripts/retrieve_cr_seance.js +12 -0
  95. package/lib/src/scripts/retrieve_videos.js +13 -1
  96. package/lib/src/utils/nvs-timecode.d.ts +17 -0
  97. package/lib/src/utils/nvs-timecode.js +79 -0
  98. package/lib/src/utils/weights_scoring_config.d.ts +2 -0
  99. package/lib/src/utils/weights_scoring_config.js +15 -0
  100. package/lib/strings.d.ts +1 -0
  101. package/lib/strings.js +18 -0
  102. package/lib/types/agenda.d.ts +44 -0
  103. package/lib/types/agenda.js +1 -0
  104. package/lib/types/ameli.d.ts +5 -0
  105. package/lib/types/ameli.js +1 -0
  106. package/lib/types/compte_rendu.d.ts +83 -0
  107. package/lib/types/compte_rendu.js +1 -0
  108. package/lib/types/debats.d.ts +2 -0
  109. package/lib/types/debats.js +1 -0
  110. package/lib/types/dosleg.d.ts +70 -0
  111. package/lib/types/dosleg.js +1 -0
  112. package/lib/types/questions.d.ts +2 -0
  113. package/lib/types/questions.js +1 -0
  114. package/lib/types/sens.d.ts +10 -0
  115. package/lib/types/sens.js +1 -0
  116. package/lib/types/sessions.d.ts +5 -0
  117. package/lib/types/sessions.js +84 -0
  118. package/lib/types/texte.d.ts +74 -0
  119. package/lib/types/texte.js +16 -0
  120. package/lib/utils/cr_spliting.d.ts +28 -0
  121. package/lib/utils/cr_spliting.js +265 -0
  122. package/lib/utils/date.d.ts +10 -0
  123. package/lib/utils/date.js +100 -0
  124. package/lib/utils/nvs-timecode.d.ts +7 -0
  125. package/lib/utils/nvs-timecode.js +79 -0
  126. package/lib/utils/reunion_grouping.d.ts +11 -0
  127. package/lib/utils/reunion_grouping.js +337 -0
  128. package/lib/utils/reunion_odj_building.d.ts +5 -0
  129. package/lib/utils/reunion_odj_building.js +154 -0
  130. package/lib/utils/reunion_parsing.d.ts +23 -0
  131. package/lib/utils/reunion_parsing.js +209 -0
  132. package/lib/utils/scoring.d.ts +14 -0
  133. package/lib/utils/scoring.js +147 -0
  134. package/lib/utils/string_cleaning.d.ts +7 -0
  135. package/lib/utils/string_cleaning.js +57 -0
  136. package/lib/validators/config.d.ts +9 -0
  137. package/lib/validators/config.js +10 -0
  138. package/package.json +1 -1
@@ -0,0 +1,269 @@
1
+ import * as cheerio from "cheerio";
2
+ import path from "path";
3
+ import { makeReunionUid } from "../utils/reunion_parsing";
4
+ import { norm } from "../utils/string_cleaning";
5
+ import { frDateToISO, hourShortToStartTime } from "../utils/date";
6
+ import { toCRDate } from "./util";
7
+ const PARA_h3_SEL = "p.sh_justify, p.sh_center, p.sh_marge, p[align], li, h3";
8
+ function findDayRoot($, targetISO) {
9
+ let $root = $();
10
+ $("h2").each((_, el) => {
11
+ const txt = norm($(el).text());
12
+ const m = txt.match(/(?:Lundi|Mardi|Mercredi|Jeudi|Vendredi|Samedi|Dimanche)\s+(.+)$/i);
13
+ const iso = m ? frDateToISO(m[1]) : undefined;
14
+ if (iso === targetISO && $root.length === 0)
15
+ $root = $(el);
16
+ });
17
+ return $root;
18
+ }
19
+ function normalizeSpaces(s) {
20
+ return s.replace(/[\u00A0\u202F\u2009]/g, " ");
21
+ }
22
+ function stripIntroPunct(s) {
23
+ return s.replace(/^[\s]*[.:;]?\s*(?:[–—-]\s*)+/u, "");
24
+ }
25
+ function collectLeadingHeaderStrongEls($, $clone) {
26
+ const els = [];
27
+ const nodes = $clone.contents().toArray();
28
+ for (const node of nodes) {
29
+ if (node.type === "text") {
30
+ if (norm(node.data || ""))
31
+ break;
32
+ continue;
33
+ }
34
+ if (node.type === "tag") {
35
+ const $n = $(node);
36
+ if ($n.is("strong, b")) {
37
+ els.push(node);
38
+ continue;
39
+ }
40
+ if ($n.is("a") && $n.children("strong, b").length) {
41
+ $n.children("strong, b").each((_, el) => {
42
+ els.push($(el));
43
+ });
44
+ continue;
45
+ }
46
+ break;
47
+ }
48
+ }
49
+ return els;
50
+ }
51
+ // Remove orateur's name from text and clean intro punct
52
+ export function getRemainingTextAfterSpeakerHeader($, $p) {
53
+ const $clone = $p.clone();
54
+ // 1) Remove <strong> at start
55
+ const headerStrongEls = collectLeadingHeaderStrongEls($, $clone);
56
+ for (const el of headerStrongEls)
57
+ $(el).remove();
58
+ // 2) normalize + clean intro punct
59
+ let remainingHtml = $clone.html() || "";
60
+ remainingHtml = normalizeSpaces(cheerio.load(remainingHtml).text());
61
+ remainingHtml = stripIntroPunct(remainingHtml);
62
+ const remainingText = norm(remainingHtml || "");
63
+ return remainingText;
64
+ }
65
+ function buildPointsFromParagraphs($, paras) {
66
+ const points = [];
67
+ let ordreAbsoluSeance = 0;
68
+ const normSpeaker = (s) => s
69
+ .normalize("NFKC")
70
+ .replace(/\s+/g, " ")
71
+ .replace(/[:\.]\s*$/, "")
72
+ .trim();
73
+ const normQual = (s) => s
74
+ .normalize("NFKC")
75
+ .replace(/\s+/g, " ")
76
+ .replace(/^\s*,\s*|\s+$/g, "")
77
+ .replace(/[\s\u00A0]*[.,;:–—-]+$/u, "")
78
+ .trim();
79
+ let currentOrateur = null;
80
+ let currentQualite = "";
81
+ let currentTexte = "";
82
+ function isPresidentQual(qual) {
83
+ return /\bprésident(e)?\b/i.test(qual);
84
+ }
85
+ // Flush the buffered speaker’s text into points[] if any.
86
+ function flush() {
87
+ if (!currentOrateur || !currentTexte.trim())
88
+ return;
89
+ ordreAbsoluSeance++;
90
+ points.push({
91
+ code_grammaire: "PAROLE_GENERIQUE",
92
+ roledebat: isPresidentQual(currentQualite) ? "président" : "",
93
+ ordre_absolu_seance: String(ordreAbsoluSeance),
94
+ orateurs: { orateur: { nom: currentOrateur, id: "", qualite: currentQualite || "" } },
95
+ texte: { _: currentTexte.trim() },
96
+ });
97
+ currentOrateur = null;
98
+ currentQualite = "";
99
+ currentTexte = "";
100
+ }
101
+ function addPoint(payload) {
102
+ ordreAbsoluSeance++;
103
+ points.push({ ...payload, ordre_absolu_seance: String(ordreAbsoluSeance) });
104
+ }
105
+ for (const $p of paras) {
106
+ if ($p.closest("table").length)
107
+ continue;
108
+ const tagName = ($p.prop("tagName") || "").toString().toLowerCase();
109
+ const rawText = ($p.text() || "").replace(/\u00a0/g, " ").trim();
110
+ const text = norm(rawText);
111
+ if (!text || text.length <= 3)
112
+ continue;
113
+ const html = ($p.html() || "").trim();
114
+ const italicSpans = $p.find("i, em, span[style*='italic']");
115
+ const firstItalicOuter = italicSpans.length ? $(italicSpans[0]).prop("outerHTML") || "" : "";
116
+ const htmlBeforeFirstItalic = firstItalicOuter ? html.split(firstItalicOuter)[0].trim() : "";
117
+ const isPureItalic = italicSpans.length > 0 && italicSpans.length === $p.find("span,i,em").length && htmlBeforeFirstItalic === "";
118
+ if (tagName === "h3") {
119
+ flush();
120
+ addPoint({
121
+ code_style: "Titre",
122
+ code_grammaire: "TITRE_TEXTE_DISCUSSION",
123
+ texte: { _: text },
124
+ });
125
+ continue;
126
+ }
127
+ const boldSpans = $p.find("strong, b");
128
+ const joinedBold = norm(boldSpans
129
+ .map((_, el) => $(el).text() || "")
130
+ .get()
131
+ .join(""));
132
+ const [namePartRaw, qualPartRaw] = joinedBold.split(/\s*,\s+/, 2);
133
+ const namePart = namePartRaw ? normSpeaker(namePartRaw) : "";
134
+ const qualPart = qualPartRaw ? normQual(qualPartRaw) : "";
135
+ const looksLikeName = namePart.length > 3 && /^(M\.|Mme)[\s\u00A0\u202F]+/i.test(namePart);
136
+ const startsWithName = namePart && text.startsWith(namePart);
137
+ const isNewSpeaker = looksLikeName && startsWithName && namePart !== currentOrateur;
138
+ if (isNewSpeaker) {
139
+ flush();
140
+ currentOrateur = namePart;
141
+ currentQualite = qualPart;
142
+ const remainingText = getRemainingTextAfterSpeakerHeader($, $p);
143
+ currentTexte = remainingText;
144
+ continue;
145
+ }
146
+ if (isPureItalic || (!joinedBold && !currentOrateur && text)) {
147
+ flush();
148
+ addPoint({
149
+ code_style: "Info Italiques",
150
+ code_grammaire: "PAROLE_GENERIQUE",
151
+ texte: { _: "<i>" + text + "</i>" },
152
+ });
153
+ continue;
154
+ }
155
+ // concat text because same orateur
156
+ if (currentOrateur) {
157
+ const removeOrateurFromText = getRemainingTextAfterSpeakerHeader($, $p);
158
+ currentTexte += (currentTexte ? "<br/><br/>" : "") + removeOrateurFromText;
159
+ continue;
160
+ }
161
+ }
162
+ flush();
163
+ return points;
164
+ }
165
+ const TIME_RE = /(?:\b[àa]\s*)?(\d{1,2})\s*(?:h|heures?)\s*(?:([0-5]\d))?/i;
166
+ export function cleanTitle(t) {
167
+ return (t || "").replace(/\s+/g, " ").trim();
168
+ }
169
+ function parseTimeToHHmm(text) {
170
+ const m = normalizeSpaces(text).match(TIME_RE);
171
+ if (!m)
172
+ return undefined;
173
+ const hh = m[1]?.padStart(2, "0");
174
+ const mm = (m[2] ?? "00").padStart(2, "0");
175
+ const h = Number(hh);
176
+ if (h >= 0 && h <= 23)
177
+ return `${hh}:${mm}`;
178
+ return undefined;
179
+ }
180
+ function findNearbyTime($, $h3) {
181
+ let cur = $h3.prev();
182
+ for (let i = 0; i < 3 && cur.length; i++, cur = cur.prev()) {
183
+ const direct = parseTimeToHHmm(cur.text());
184
+ if (direct)
185
+ return direct;
186
+ const italic = parseTimeToHHmm(cur.find("i, em").first().text());
187
+ if (italic)
188
+ return italic;
189
+ }
190
+ return undefined;
191
+ }
192
+ export function extractDayH3Sections($, dateISO) {
193
+ const sections = [];
194
+ const $dayRoot = findDayRoot($, dateISO);
195
+ if ($dayRoot.length === 0)
196
+ return sections;
197
+ const $range = $dayRoot.nextUntil("h2");
198
+ const $h3s = $range.filter("h3").add($range.find("h3"));
199
+ $h3s.each((_, el) => {
200
+ const $h3 = $(el);
201
+ const title = cleanTitle($h3.text());
202
+ if (!title)
203
+ return;
204
+ const time = findNearbyTime($, $h3);
205
+ sections.push({ title, $start: $h3, time });
206
+ });
207
+ return sections;
208
+ }
209
+ export function parseCommissionCRSectionFromDom($, htmlFilePath, opts) {
210
+ try {
211
+ const { dateISO, hourShort, organe, section, matched } = opts;
212
+ const seanceRef = matched?.uid ?? makeReunionUid(dateISO, "COM", matched?.events[0].id ?? hourShort ?? "", organe ?? undefined);
213
+ const uid = seanceRef.replace(/^RU/, "CRC");
214
+ const dateSeance = toCRDate(dateISO, matched?.startTime ?? hourShortToStartTime(hourShort));
215
+ const $dayRoot = findDayRoot($, dateISO);
216
+ if ($dayRoot.length === 0) {
217
+ console.warn(`[COM-CR][parse] day root not found for ${dateISO} in ${path.basename(htmlFilePath)}`);
218
+ return null;
219
+ }
220
+ const paras = [];
221
+ let $cursor = section.$start;
222
+ // Jump title if we do not want to add it to paragraphes
223
+ $cursor = $cursor.next();
224
+ while ($cursor.length && !$cursor.is("h2") && !$cursor.is("h3")) {
225
+ if ($cursor.is(PARA_h3_SEL)) {
226
+ paras.push($cursor);
227
+ }
228
+ else {
229
+ const $ps = $cursor.find(PARA_h3_SEL);
230
+ if ($ps.length)
231
+ $ps.each((_, p) => {
232
+ paras.push($(p));
233
+ });
234
+ }
235
+ $cursor = $cursor.next();
236
+ }
237
+ const points = buildPointsFromParagraphs($, paras);
238
+ if (points.length < 4 || !points.some((pt) => pt.code_grammaire === "PAROLE_GENERIQUE" && pt.orateurs)) {
239
+ console.warn(`[COM-CR][parse] Insufficient points or no interventions found for a section in ${path.basename(htmlFilePath)}`);
240
+ return null;
241
+ }
242
+ const session = dateISO.slice(5, 7) >= "10" ? `${dateISO.slice(0, 4)}` : `${Number(dateISO.slice(0, 4)) - 1}`;
243
+ const contenu = {
244
+ quantiemes: { journee: dateISO, session },
245
+ point: points,
246
+ };
247
+ const metadonnees = {
248
+ dateSeance,
249
+ dateSeanceJour: dateISO,
250
+ numSeanceJour: "",
251
+ numSeance: "",
252
+ typeAssemblee: "SN",
253
+ legislature: "",
254
+ session,
255
+ nomFichierJo: path.basename(htmlFilePath),
256
+ validite: "non-certifie",
257
+ etat: "definitif",
258
+ diffusion: "publique",
259
+ version: "1",
260
+ environnement: "prod",
261
+ heureGeneration: new Date(),
262
+ };
263
+ return { uid, seanceRef, sessionRef: session, metadonnees, contenu };
264
+ }
265
+ catch (e) {
266
+ console.error(`[COM-CR][parse] error section file=${path.basename(htmlFilePath)}:`, e);
267
+ return null;
268
+ }
269
+ }
@@ -0,0 +1,67 @@
1
+ import { InferResult } from "kysely";
2
+ export type DebatResult = InferResult<typeof findAllQuery>[0];
3
+ declare const findAllQuery: import("kysely").SelectQueryBuilder<any, "debats.debats", {
4
+ [x: string]: any;
5
+ id: string;
6
+ date_seance: string;
7
+ sections: {
8
+ [x: string]: any;
9
+ interventions: {
10
+ [x: string]: any;
11
+ auteur: {
12
+ code: any;
13
+ nom: any;
14
+ prenom: any;
15
+ matricule: any;
16
+ };
17
+ }[];
18
+ }[];
19
+ sections_divers: {
20
+ [x: string]: any;
21
+ interventions: {
22
+ [x: string]: any;
23
+ auteur: {
24
+ code: any;
25
+ nom: any;
26
+ prenom: any;
27
+ matricule: any;
28
+ };
29
+ }[];
30
+ }[];
31
+ lectures: {
32
+ id: any;
33
+ }[];
34
+ }>;
35
+ export declare function findAll(fromSession?: number): AsyncIterableIterator<{
36
+ [x: string]: any;
37
+ id: string;
38
+ date_seance: string;
39
+ sections: {
40
+ [x: string]: any;
41
+ interventions: {
42
+ [x: string]: any;
43
+ auteur: {
44
+ code: any;
45
+ nom: any;
46
+ prenom: any;
47
+ matricule: any;
48
+ };
49
+ }[];
50
+ }[];
51
+ sections_divers: {
52
+ [x: string]: any;
53
+ interventions: {
54
+ [x: string]: any;
55
+ auteur: {
56
+ code: any;
57
+ nom: any;
58
+ prenom: any;
59
+ matricule: any;
60
+ };
61
+ }[];
62
+ }[];
63
+ lectures: {
64
+ id: any;
65
+ }[];
66
+ }>;
67
+ export {};
@@ -0,0 +1,95 @@
1
+ import { jsonArrayFrom, jsonBuildObject } from "kysely/helpers/postgres";
2
+ import { dbSenat } from "../databases";
3
+ import { ID_DATE_FORMAT } from "../scripts/datautil";
4
+ import { toDateString } from "./util";
5
+ function sectionsLegislatives(dateSeance) {
6
+ return jsonArrayFrom(dbSenat
7
+ .selectFrom("debats.secdis")
8
+ .leftJoin("debats.typsec", "debats.secdis.typseccod", "debats.typsec.typseccod")
9
+ .where("debats.secdis.datsea", "=", dateSeance)
10
+ .select(({ ref }) => [
11
+ "debats.secdis.secdisordid as id",
12
+ "debats.secdis.secdisnum as numero",
13
+ "debats.secdis.secdisobj as objet",
14
+ "debats.secdis.secdisurl as url",
15
+ "debats.typsec.typseclib as type",
16
+ "debats.typsec.typseccat as categorie",
17
+ interventionsLegislatives(ref("debats.secdis.secdiscle")).as("interventions"),
18
+ "debats.secdis.lecassidt as lecture_id",
19
+ ])
20
+ .orderBy("debats.secdis.secdisordid", "asc"));
21
+ }
22
+ function interventionsLegislatives(sectionId) {
23
+ return jsonArrayFrom(dbSenat
24
+ .selectFrom("debats.intpjl")
25
+ .leftJoin("dosleg.auteur", "debats.intpjl.autcod", "dosleg.auteur.autcod")
26
+ .where("debats.intpjl.secdiscle", "=", sectionId)
27
+ .select(({ ref, val, fn }) => [
28
+ "debats.intpjl.intordid as id",
29
+ "debats.intpjl.autcod as auteur_code",
30
+ "debats.intpjl.intfon as fonction_intervenant",
31
+ "debats.intpjl.inturl as url",
32
+ "debats.intpjl.intana as analyse",
33
+ jsonBuildObject({
34
+ code: ref("dosleg.auteur.autcod"),
35
+ nom: ref("dosleg.auteur.nomuse"),
36
+ prenom: ref("dosleg.auteur.prenom"),
37
+ matricule: ref("dosleg.auteur.autmat"),
38
+ }).as("auteur"),
39
+ ])
40
+ .orderBy("debats.intpjl.intordid", "asc"));
41
+ }
42
+ function sectionsNonLegislatives(dateSeance) {
43
+ return jsonArrayFrom(dbSenat
44
+ .selectFrom("debats.secdivers")
45
+ .leftJoin("debats.typsec", "debats.secdivers.typseccod", "debats.typsec.typseccod")
46
+ .where("debats.secdivers.datsea", "=", dateSeance)
47
+ .select(({ ref }) => [
48
+ "debats.secdivers.secdiverslibelle as libelle",
49
+ "debats.secdivers.secdiversobj as objet",
50
+ "debats.typsec.typseclib as type",
51
+ "debats.typsec.typseccat as categorie",
52
+ interventionsNonLegislatives(ref("debats.secdivers.secdiverscle")).as("interventions"),
53
+ ]));
54
+ }
55
+ function interventionsNonLegislatives(sectionId) {
56
+ return jsonArrayFrom(dbSenat
57
+ .selectFrom("debats.intdivers")
58
+ .leftJoin("dosleg.auteur", "debats.intdivers.autcod", "dosleg.auteur.autcod")
59
+ .where("debats.intdivers.intdiverscle", "=", sectionId)
60
+ .select(({ ref, val }) => [
61
+ "debats.intdivers.intdiversordid as id",
62
+ "debats.intdivers.autcod as auteur_code",
63
+ "debats.intdivers.intfon as fonction_intervenant",
64
+ "debats.intdivers.inturl as url",
65
+ "debats.intdivers.intana as analyse",
66
+ jsonBuildObject({
67
+ code: ref("dosleg.auteur.autcod"),
68
+ nom: ref("dosleg.auteur.nomuse"),
69
+ prenom: ref("dosleg.auteur.prenom"),
70
+ matricule: ref("dosleg.auteur.autmat"),
71
+ }).as("auteur"),
72
+ ])
73
+ .orderBy("debats.intdivers.intdiversordid", "asc"));
74
+ }
75
+ function lecturesAssemblee(dateSeance) {
76
+ return jsonArrayFrom(dbSenat
77
+ .selectFrom("debats.lecassdeb")
78
+ .where("debats.lecassdeb.datsea", "=", dateSeance)
79
+ .select("debats.lecassdeb.lecassidt as id"));
80
+ }
81
+ const findAllQuery = dbSenat
82
+ .selectFrom("debats.debats")
83
+ .select(({ ref, val }) => [
84
+ toDateString(ref("debats.debats.datsea"), val(ID_DATE_FORMAT)).as("id"),
85
+ toDateString(ref("debats.debats.datsea")).as("date_seance"),
86
+ "debats.debats.numero as numero",
87
+ "debats.debats.deburl as url",
88
+ "debats.debats.debsyn as etat_synchronisation",
89
+ sectionsLegislatives(ref("debats.debats.datsea")).as("sections"),
90
+ sectionsNonLegislatives(ref("debats.debats.datsea")).as("sections_divers"),
91
+ lecturesAssemblee(ref("debats.debats.datsea")).as("lectures"),
92
+ ]);
93
+ export function findAll(fromSession) {
94
+ return findAllQuery.stream();
95
+ }
@@ -0,0 +1,12 @@
1
+ import { Expression, InferResult, SelectQueryBuilder } from "kysely";
2
+ export declare function rapports(lectureAssembleeId: Expression<string>): import("kysely").RawBuilder<{
3
+ [x: string]: any;
4
+ }[]>;
5
+ declare const queryTextes: SelectQueryBuilder<any, any, any>;
6
+ export declare function textes(lectureAssembleeId: Expression<string>): import("kysely").RawBuilder<{
7
+ [x: string]: any;
8
+ }[]>;
9
+ export declare function findAllTextes(): AsyncIterableIterator<DocumentResult>;
10
+ export declare function findAllRapports(): AsyncIterableIterator<DocumentResult>;
11
+ export type DocumentResult = InferResult<typeof queryTextes>[0];
12
+ export {};
@@ -0,0 +1,138 @@
1
+ import { sql } from "kysely";
2
+ import { dbSenat } from "../databases";
3
+ import { concat, rtrim, toDateString } from "./util";
4
+ import { jsonArrayFrom } from "kysely/helpers/postgres";
5
+ function orderOrdreOrigineTexte(expr) {
6
+ return sql `array_position(array['0','2','1'], ${expr})`;
7
+ }
8
+ function auteursRapport(rapportId) {
9
+ return jsonArrayFrom(dbSenat
10
+ .withSchema("dosleg")
11
+ .selectFrom("dosleg.auteur")
12
+ .leftJoin("dosleg.ecr", "dosleg.ecr.autcod", "dosleg.auteur.autcod")
13
+ .leftJoin("dosleg.rolsig", "dosleg.rolsig.signataire", "dosleg.ecr.signataire")
14
+ .where("dosleg.ecr.rapcod", "=", rapportId)
15
+ .select([
16
+ "dosleg.auteur.prenom as prenom",
17
+ "dosleg.auteur.nomuse as nom_usuel",
18
+ "dosleg.auteur.autmat as matricule",
19
+ "dosleg.ecr.ecrnumtri as ordre",
20
+ "dosleg.rolsig.rolsiglib as role",
21
+ "dosleg.ecr.ecrqua as qualite",
22
+ ])
23
+ .orderBy("dosleg.ecr.ecrnumtri", "asc"));
24
+ }
25
+ function documentsAttaches(rapportId) {
26
+ return jsonArrayFrom(dbSenat
27
+ .withSchema("dosleg")
28
+ .selectFrom("docatt")
29
+ .leftJoin("typatt", "docatt.typattcod", "typatt.typattcod")
30
+ .where("docatt.rapcod", "=", rapportId)
31
+ .select(["docatt.docatturl as url", "typatt.typattlib as type_document"]));
32
+ }
33
+ function selectRapportAttributes({ eb, ref, val }) {
34
+ return [
35
+ "rap.rapnum as numero",
36
+ "raporg.orgcod as code_organisme",
37
+ eb
38
+ .case()
39
+ .when("rap.rapurl", "is not", null)
40
+ .then(sql `regexp_replace(trim(${ref("rap.rapurl")}), '^(.*/)?(.*?)(\\.html)?$', '\\2')`)
41
+ .else(null)
42
+ .end()
43
+ .as("id"),
44
+ eb
45
+ .case()
46
+ .when("rap.typurl", "=", "I")
47
+ .then(concat(val("https://www.senat.fr/rap/"), rtrim(ref("rap.rapurl"))))
48
+ .else(rtrim(ref("rap.rapurl")))
49
+ .end()
50
+ .as("url"),
51
+ rtrim(ref("denrap.libdenrap")).as("type"),
52
+ rtrim(rtrim(ref("rap.raptil"))).as("titre"),
53
+ rtrim(rtrim(ref("rap.rapsoustit"))).as("sous_titre"),
54
+ toDateString(ref("rap.date_depot")).as("date"),
55
+ "rap.sesann as session",
56
+ auteursRapport(ref("rap.rapcod")).as("auteurs"),
57
+ documentsAttaches(ref("rap.rapcod")).as("documents_annexes"),
58
+ ];
59
+ }
60
+ const baseQueryRapports = dbSenat
61
+ .withSchema("dosleg")
62
+ .selectFrom("rap")
63
+ .leftJoin("raporg", "raporg.rapcod", "rap.rapcod")
64
+ .leftJoin("denrap", "denrap.coddenrap", "rap.coddenrap")
65
+ .leftJoin("lecassrap", "lecassrap.rapcod", "rap.rapcod");
66
+ const queryRapports = baseQueryRapports
67
+ .leftJoin("lecass", "lecass.lecassidt", "lecassrap.lecassidt")
68
+ .leftJoin("lecture", "lecture.lecidt", "lecass.lecidt")
69
+ .leftJoin("loi", "loi.loicod", "lecture.loicod")
70
+ .select((args) => ["loi.signet as signet_dossier", ...selectRapportAttributes(args)]);
71
+ export function rapports(lectureAssembleeId) {
72
+ return jsonArrayFrom(baseQueryRapports.select(selectRapportAttributes).where("lecassrap.lecassidt", "=", lectureAssembleeId));
73
+ }
74
+ function auteursTexte(texteId) {
75
+ return jsonArrayFrom(dbSenat
76
+ .withSchema("dosleg")
77
+ .selectFrom("auteur")
78
+ .leftJoin("ecr", "ecr.autcod", "auteur.autcod")
79
+ .leftJoin("rolsig", "rolsig.signataire", "ecr.signataire")
80
+ .where("ecr.texcod", "=", texteId)
81
+ .select([
82
+ "auteur.prenom as prenom",
83
+ "auteur.nomuse as nom_usuel",
84
+ "auteur.autmat as matricule",
85
+ "ecr.ecrnumtri as ordre",
86
+ "rolsig.rolsiglib as role",
87
+ "ecr.ecrqua as qualite",
88
+ ])
89
+ .orderBy("ecr.ecrnumtri", "asc"));
90
+ }
91
+ function selectTexteAttributes({ eb, ref, val }) {
92
+ return [
93
+ "texte.texnum as numero",
94
+ "texte.orgcod as code_organisme",
95
+ eb
96
+ .case()
97
+ .when("texte.texurl", "is not", null)
98
+ .then(sql `regexp_replace(trim(${ref("texte.texurl")}), '^(.*/)?(.*?)(\\.html)?$', '\\2')`)
99
+ .else(null)
100
+ .end()
101
+ .as("id"),
102
+ eb
103
+ .case()
104
+ .when("texte.typurl", "=", "I")
105
+ .then(concat(val("https://www.senat.fr/leg/"), rtrim(ref("texte.texurl"))))
106
+ .else(rtrim(ref("texte.texurl")))
107
+ .end()
108
+ .as("url"),
109
+ rtrim(ref("oritxt.oritxtlib")).as("origine"),
110
+ "oritxt.oriordre as ordre_origine",
111
+ "oritxt.oritxtado as code_adoption",
112
+ "oritxt.oritxtmod as modification",
113
+ rtrim(ref("typtxt.typtxtlib")).as("type"),
114
+ toDateString(ref("texte.txtoritxtdat")).as("date"),
115
+ "texte.sesann as session",
116
+ auteursTexte(ref("texte.texcod")).as("auteurs"),
117
+ ];
118
+ }
119
+ const baseQueryTextes = dbSenat
120
+ .withSchema("dosleg")
121
+ .selectFrom("texte")
122
+ .leftJoin("oritxt", "oritxt.oritxtcod", "texte.oritxtcod")
123
+ .leftJoin("typtxt", "typtxt.typtxtcod", "texte.typtxtcod")
124
+ .orderBy(({ ref }) => orderOrdreOrigineTexte(ref("oritxt.oriordre")));
125
+ const queryTextes = baseQueryTextes
126
+ .leftJoin("lecass", "lecass.lecassidt", "texte.lecassidt")
127
+ .leftJoin("lecture", "lecture.lecidt", "lecass.lecidt")
128
+ .leftJoin("loi", "loi.loicod", "lecture.loicod")
129
+ .select((args) => ["loi.signet as signet_dossier", ...selectTexteAttributes(args)]);
130
+ export function textes(lectureAssembleeId) {
131
+ return jsonArrayFrom(baseQueryTextes.select(selectTexteAttributes).where("texte.lecassidt", "=", lectureAssembleeId));
132
+ }
133
+ export function findAllTextes() {
134
+ return queryTextes.stream();
135
+ }
136
+ export function findAllRapports() {
137
+ return queryRapports.stream();
138
+ }
@@ -0,0 +1,7 @@
1
+ import { InferResult, SelectQueryBuilder } from "kysely";
2
+ declare const findAllDossiersQuery: SelectQueryBuilder<any, any, any>;
3
+ export declare function findAllDossiers(): AsyncIterableIterator<DossierLegislatifResult>;
4
+ export declare function getCodeActeLecture(codeNatureDossier: string, typeLecture: string, assemblee: string): string | null;
5
+ export type DossierLegislatifResult = InferResult<typeof findAllDossiersQuery>[0];
6
+ export declare function buildActesLegislatifs(dossier: any): any[];
7
+ export {};