@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.
- package/lib/config.d.ts +21 -0
- package/lib/config.js +27 -0
- package/lib/databases.d.ts +2 -0
- package/lib/databases.js +26 -0
- package/lib/datasets.d.ts +34 -0
- package/lib/datasets.js +233 -0
- package/lib/git.d.ts +26 -0
- package/lib/git.js +167 -0
- package/lib/index.d.ts +13 -0
- package/lib/index.js +1 -0
- package/lib/loaders.d.ts +58 -0
- package/lib/loaders.js +286 -0
- package/lib/model/agenda.d.ts +6 -0
- package/lib/model/agenda.js +148 -0
- package/lib/model/ameli.d.ts +51 -0
- package/lib/model/ameli.js +147 -0
- package/lib/model/commission.d.ts +18 -0
- package/lib/model/commission.js +269 -0
- package/lib/model/debats.d.ts +67 -0
- package/lib/model/debats.js +95 -0
- package/lib/model/documents.d.ts +12 -0
- package/lib/model/documents.js +138 -0
- package/lib/model/dosleg.d.ts +7 -0
- package/lib/model/dosleg.js +326 -0
- package/lib/model/index.d.ts +7 -0
- package/lib/model/index.js +7 -0
- package/lib/model/questions.d.ts +45 -0
- package/lib/model/questions.js +89 -0
- package/lib/model/scrutins.d.ts +13 -0
- package/lib/model/scrutins.js +114 -0
- package/lib/model/seance.d.ts +3 -0
- package/lib/model/seance.js +267 -0
- package/lib/model/sens.d.ts +146 -0
- package/lib/model/sens.js +454 -0
- package/lib/model/texte.d.ts +7 -0
- package/lib/model/texte.js +228 -0
- package/lib/model/util.d.ts +9 -0
- package/lib/model/util.js +38 -0
- package/lib/parsers/texte.d.ts +7 -0
- package/lib/parsers/texte.js +228 -0
- package/lib/raw_types/ameli.d.ts +914 -0
- package/lib/raw_types/ameli.js +5 -0
- package/lib/raw_types/debats.d.ts +207 -0
- package/lib/raw_types/debats.js +5 -0
- package/lib/raw_types/dosleg.d.ts +1619 -0
- package/lib/raw_types/dosleg.js +5 -0
- package/lib/raw_types/questions.d.ts +423 -0
- package/lib/raw_types/questions.js +5 -0
- package/lib/raw_types/senat.d.ts +11372 -0
- package/lib/raw_types/senat.js +5 -0
- package/lib/raw_types/sens.d.ts +8248 -0
- package/lib/raw_types/sens.js +5 -0
- package/lib/raw_types_schemats/ameli.d.ts +539 -0
- package/lib/raw_types_schemats/ameli.js +2 -0
- package/lib/raw_types_schemats/debats.d.ts +127 -0
- package/lib/raw_types_schemats/debats.js +2 -0
- package/lib/raw_types_schemats/dosleg.d.ts +977 -0
- package/lib/raw_types_schemats/dosleg.js +2 -0
- package/lib/raw_types_schemats/questions.d.ts +237 -0
- package/lib/raw_types_schemats/questions.js +2 -0
- package/lib/raw_types_schemats/sens.d.ts +6915 -0
- package/lib/raw_types_schemats/sens.js +2 -0
- package/lib/scripts/convert_data.d.ts +1 -0
- package/lib/scripts/convert_data.js +354 -0
- package/lib/scripts/data-download.d.ts +1 -0
- package/lib/scripts/data-download.js +12 -0
- package/lib/scripts/datautil.d.ts +8 -0
- package/lib/scripts/datautil.js +34 -0
- package/lib/scripts/parse_textes.d.ts +1 -0
- package/lib/scripts/parse_textes.js +44 -0
- package/lib/scripts/retrieve_agenda.d.ts +1 -0
- package/lib/scripts/retrieve_agenda.js +132 -0
- package/lib/scripts/retrieve_cr_commission.d.ts +1 -0
- package/lib/scripts/retrieve_cr_commission.js +364 -0
- package/lib/scripts/retrieve_cr_seance.d.ts +6 -0
- package/lib/scripts/retrieve_cr_seance.js +347 -0
- package/lib/scripts/retrieve_documents.d.ts +3 -0
- package/lib/scripts/retrieve_documents.js +219 -0
- package/lib/scripts/retrieve_open_data.d.ts +1 -0
- package/lib/scripts/retrieve_open_data.js +316 -0
- package/lib/scripts/retrieve_senateurs_photos.d.ts +1 -0
- package/lib/scripts/retrieve_senateurs_photos.js +147 -0
- package/lib/scripts/retrieve_videos.d.ts +1 -0
- package/lib/scripts/retrieve_videos.js +461 -0
- package/lib/scripts/shared/cli_helpers.d.ts +95 -0
- package/lib/scripts/shared/cli_helpers.js +91 -0
- package/lib/scripts/shared/util.d.ts +4 -0
- package/lib/scripts/shared/util.js +35 -0
- package/lib/scripts/test_iter_load.d.ts +1 -0
- package/lib/scripts/test_iter_load.js +12 -0
- package/lib/src/model/sens.d.ts +36 -0
- package/lib/src/model/sens.js +35 -4
- package/lib/src/scripts/retrieve_cr_commission.js +12 -0
- package/lib/src/scripts/retrieve_cr_seance.js +12 -0
- package/lib/src/scripts/retrieve_videos.js +13 -1
- package/lib/src/utils/nvs-timecode.d.ts +17 -0
- package/lib/src/utils/nvs-timecode.js +79 -0
- package/lib/src/utils/weights_scoring_config.d.ts +2 -0
- package/lib/src/utils/weights_scoring_config.js +15 -0
- package/lib/strings.d.ts +1 -0
- package/lib/strings.js +18 -0
- package/lib/types/agenda.d.ts +44 -0
- package/lib/types/agenda.js +1 -0
- package/lib/types/ameli.d.ts +5 -0
- package/lib/types/ameli.js +1 -0
- package/lib/types/compte_rendu.d.ts +83 -0
- package/lib/types/compte_rendu.js +1 -0
- package/lib/types/debats.d.ts +2 -0
- package/lib/types/debats.js +1 -0
- package/lib/types/dosleg.d.ts +70 -0
- package/lib/types/dosleg.js +1 -0
- package/lib/types/questions.d.ts +2 -0
- package/lib/types/questions.js +1 -0
- package/lib/types/sens.d.ts +10 -0
- package/lib/types/sens.js +1 -0
- package/lib/types/sessions.d.ts +5 -0
- package/lib/types/sessions.js +84 -0
- package/lib/types/texte.d.ts +74 -0
- package/lib/types/texte.js +16 -0
- package/lib/utils/cr_spliting.d.ts +28 -0
- package/lib/utils/cr_spliting.js +265 -0
- package/lib/utils/date.d.ts +10 -0
- package/lib/utils/date.js +100 -0
- package/lib/utils/nvs-timecode.d.ts +7 -0
- package/lib/utils/nvs-timecode.js +79 -0
- package/lib/utils/reunion_grouping.d.ts +11 -0
- package/lib/utils/reunion_grouping.js +337 -0
- package/lib/utils/reunion_odj_building.d.ts +5 -0
- package/lib/utils/reunion_odj_building.js +154 -0
- package/lib/utils/reunion_parsing.d.ts +23 -0
- package/lib/utils/reunion_parsing.js +209 -0
- package/lib/utils/scoring.d.ts +14 -0
- package/lib/utils/scoring.js +147 -0
- package/lib/utils/string_cleaning.d.ts +7 -0
- package/lib/utils/string_cleaning.js +57 -0
- package/lib/validators/config.d.ts +9 -0
- package/lib/validators/config.js +10 -0
- 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 {};
|