@tricoteuses/senat 2.13.2 → 2.14.0
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/model/compte_rendu.d.ts +9 -0
- package/lib/model/compte_rendu.js +325 -0
- package/lib/model/dosleg.d.ts +1 -0
- package/lib/model/dosleg.js +78 -13
- package/lib/raw_types/db.d.ts +11389 -0
- package/lib/raw_types/db.js +5 -0
- package/lib/scripts/convert_data.js +5 -22
- package/lib/scripts/retrieve_comptes_rendus.d.ts +6 -0
- package/lib/scripts/retrieve_comptes_rendus.js +274 -0
- package/package.json +1 -1
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CompteRendu, Sommaire } from "../types/compte_rendu";
|
|
2
|
+
import { TimeSlot } from "../types/agenda";
|
|
3
|
+
export declare function parseCompteRenduSlotFromFile(xmlFilePath: string, wantedSlot: TimeSlot, firstSlotOfDay?: TimeSlot): Promise<CompteRendu | null>;
|
|
4
|
+
export declare function sessionStartYearFromDate(d: Date): number;
|
|
5
|
+
export declare function parseYYYYMMDD(yyyymmdd: string): Date | null;
|
|
6
|
+
export declare function deriveTitreObjetFromSommaire(sommaire: Sommaire | undefined, slot: TimeSlot): {
|
|
7
|
+
titre: string;
|
|
8
|
+
objet: string;
|
|
9
|
+
};
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import * as cheerio from "cheerio";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import { computeIntervalsBySlot } from "../utils/cr_spliting";
|
|
5
|
+
import { norm } from "./util";
|
|
6
|
+
const asArray = (x) => x == null ? [] : Array.isArray(x) ? x : [x];
|
|
7
|
+
const toInt = (s) => Number.isFinite(Number(s)) ? Number(s) : Number.POSITIVE_INFINITY;
|
|
8
|
+
export async function parseCompteRenduSlotFromFile(xmlFilePath, wantedSlot, firstSlotOfDay) {
|
|
9
|
+
try {
|
|
10
|
+
const raw = fs.readFileSync(xmlFilePath, "utf8");
|
|
11
|
+
const $ = cheerio.load(raw, { xml: false });
|
|
12
|
+
const metadonnees = extractMetadonnees($, xmlFilePath);
|
|
13
|
+
const order = $("body *").toArray();
|
|
14
|
+
const idx = new Map(order.map((el, i) => [el, i]));
|
|
15
|
+
const intervalsAll = computeIntervalsBySlot($, idx, firstSlotOfDay);
|
|
16
|
+
const intervals = intervalsAll.filter(iv => iv.slot === wantedSlot);
|
|
17
|
+
if (intervals.length === 0) {
|
|
18
|
+
console.warn(`[CRI] no intervals for ${path.basename(xmlFilePath)} [${wantedSlot}]`);
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
metadonnees.sommaire = extractSommaireForIntervals($, idx, intervals);
|
|
22
|
+
const points = [];
|
|
23
|
+
let ordre = 0;
|
|
24
|
+
const addPoint = (p) => points.push({ ...p, ordre_absolu_seance: String(++ordre) });
|
|
25
|
+
// Titles
|
|
26
|
+
$("cri\\:titreS1 p.titre_S1").each((_, el) => {
|
|
27
|
+
if (!elementInAnyInterval(el, idx, intervals))
|
|
28
|
+
return;
|
|
29
|
+
const t = normalizeTitle(norm($(el).text() || ""));
|
|
30
|
+
if (t)
|
|
31
|
+
addPoint({ code_grammaire: "TITRE_TEXTE_DISCUSSION", texte: { _: t }, code_style: "Titre" });
|
|
32
|
+
});
|
|
33
|
+
// Interventions
|
|
34
|
+
$("div.intervenant").each((_, block) => {
|
|
35
|
+
if (!elementInAnyInterval(block, idx, intervals))
|
|
36
|
+
return;
|
|
37
|
+
const $block = $(block);
|
|
38
|
+
$block.find([
|
|
39
|
+
"p[class^='titre_S']",
|
|
40
|
+
"p.mention_titre",
|
|
41
|
+
"p.intitule_titre",
|
|
42
|
+
"p.mention_chapitre",
|
|
43
|
+
"p.intitule_chapitre",
|
|
44
|
+
"p.mention_article",
|
|
45
|
+
"p.intitule_article",
|
|
46
|
+
"p.mention_section",
|
|
47
|
+
"p.intitule_section",
|
|
48
|
+
].join(",")).remove();
|
|
49
|
+
const firstP = $block.find("p").first();
|
|
50
|
+
const speakerLabelRaw = firstP.find(".orateur_nom").text() || firstP.find("a.lien_senfic").text() || "";
|
|
51
|
+
const speakerLabel = dedupeSpeaker(speakerLabelRaw);
|
|
52
|
+
const { mat, nom: nomCRI, qua: quaCRI } = readIntervenantMeta($block);
|
|
53
|
+
const qualFromSpans = extractAndRemoveLeadingQualite($, $block);
|
|
54
|
+
const qualite = norm(decodeHtmlEntities(quaCRI || "")) || qualFromSpans;
|
|
55
|
+
const canonicalName = dedupeSpeaker(nomCRI || speakerLabel);
|
|
56
|
+
const role = roleForSpeaker(speakerLabel) || roleForSpeaker(qualite) || roleForSpeaker(quaCRI || "");
|
|
57
|
+
const speechHtml = sanitizeInterventionHtml($, $block);
|
|
58
|
+
if (!norm(cheerio.load(speechHtml).text() || ""))
|
|
59
|
+
return;
|
|
60
|
+
addPoint({
|
|
61
|
+
code_grammaire: "PAROLE_GENERIQUE",
|
|
62
|
+
roledebat: role,
|
|
63
|
+
orateurs: { orateur: { nom: canonicalName, id: mat || "", qualite } },
|
|
64
|
+
texte: { _: speechHtml },
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
const contenu = {
|
|
68
|
+
quantiemes: { journee: metadonnees.dateSeance, session: metadonnees.session },
|
|
69
|
+
point: points,
|
|
70
|
+
};
|
|
71
|
+
return {
|
|
72
|
+
uid: "CRSSN" + xmlFilePath.replace(/^.*?(\d{8}).*$/i, "$1") + `-${wantedSlot}`,
|
|
73
|
+
seanceRef: "RUSN" + xmlFilePath.replace(/^.*?(\d{8}).*$/i, "$1") + "IDS-" + wantedSlot,
|
|
74
|
+
sessionRef: metadonnees.session,
|
|
75
|
+
metadonnees,
|
|
76
|
+
contenu,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
catch (e) {
|
|
80
|
+
console.error(`[CRI] parseSlot error file=${xmlFilePath} slot=${wantedSlot}:`, e);
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export function sessionStartYearFromDate(d) {
|
|
85
|
+
// Session (1th oct N → 30 sept N+1)
|
|
86
|
+
const m = d.getMonth();
|
|
87
|
+
const y = d.getFullYear();
|
|
88
|
+
return m >= 9 ? y : y - 1;
|
|
89
|
+
}
|
|
90
|
+
export function parseYYYYMMDD(yyyymmdd) {
|
|
91
|
+
if (!/^\d{8}$/.test(yyyymmdd))
|
|
92
|
+
return null;
|
|
93
|
+
const y = Number(yyyymmdd.slice(0, 4));
|
|
94
|
+
const m = Number(yyyymmdd.slice(4, 6)) - 1;
|
|
95
|
+
const d = Number(yyyymmdd.slice(6, 8));
|
|
96
|
+
const dt = new Date(y, m, d);
|
|
97
|
+
return Number.isFinite(dt.getTime()) ? dt : null;
|
|
98
|
+
}
|
|
99
|
+
export function deriveTitreObjetFromSommaire(sommaire, slot) {
|
|
100
|
+
const items = extractLevel1Items(sommaire);
|
|
101
|
+
const meaningful = items.filter(it => !isBoilerplate(it.label));
|
|
102
|
+
if (meaningful.length === 0) {
|
|
103
|
+
return {
|
|
104
|
+
titre: `Séance publique ${slotLabel(slot)}`,
|
|
105
|
+
objet: "",
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
const titre = meaningful[0].label;
|
|
109
|
+
const objet = meaningful.slice(0, 3).map(it => it.label).join(" ; ");
|
|
110
|
+
return { titre, objet };
|
|
111
|
+
}
|
|
112
|
+
function slotLabel(slot) {
|
|
113
|
+
switch (slot) {
|
|
114
|
+
case "MATIN": return "du matin";
|
|
115
|
+
case "APRES-MIDI": return "de l’après-midi";
|
|
116
|
+
case "SOIR": return "du soir";
|
|
117
|
+
default: return "";
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const BOILERPLATE_PATTERNS = [
|
|
121
|
+
/proc(?:è|e)s-?verbal/i,
|
|
122
|
+
/hommages?/i,
|
|
123
|
+
/désignation des vice-?président/i,
|
|
124
|
+
/candidatures? aux?/i,
|
|
125
|
+
/ordre du jour/i,
|
|
126
|
+
/rappels? au règlement/i,
|
|
127
|
+
/communications?/i,
|
|
128
|
+
/dépôts?/i,
|
|
129
|
+
/proclamation/i,
|
|
130
|
+
/présidence de/i,
|
|
131
|
+
/questions? diverses?/i,
|
|
132
|
+
/ouverture de la séance/i,
|
|
133
|
+
/clo(?:t|̂)ure de la séance/i,
|
|
134
|
+
];
|
|
135
|
+
const isBoilerplate = (label) => !label?.trim() || BOILERPLATE_PATTERNS.some(rx => rx.test(label));
|
|
136
|
+
function extractLevel1Items(sommaire) {
|
|
137
|
+
const level1 = asArray(sommaire?.sommaire1);
|
|
138
|
+
return level1
|
|
139
|
+
.map(el => ({
|
|
140
|
+
numero: toInt(el?.valeur_pts_odj),
|
|
141
|
+
label: String(el?.titreStruct?.intitule ?? "").trim(),
|
|
142
|
+
}))
|
|
143
|
+
.filter(it => !!it.label)
|
|
144
|
+
.sort((a, b) => a.numero - b.numero);
|
|
145
|
+
}
|
|
146
|
+
function stripTrailingPunct(s) { return s.replace(/\s*([:,.;])\s*$/u, "").trim(); }
|
|
147
|
+
function dedupeSpeaker(raw) {
|
|
148
|
+
let s = norm(raw);
|
|
149
|
+
s = stripTrailingPunct(s);
|
|
150
|
+
const dupPatterns = [/^(.+?)\s*[.]\s*\1$/u, /^(.+?)\s*,\s*\1,?$/u, /^(.+?)\s+\1$/u];
|
|
151
|
+
for (const re of dupPatterns) {
|
|
152
|
+
const m = s.match(re);
|
|
153
|
+
if (m) {
|
|
154
|
+
s = m[1];
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return s.replace(/\.\s*$/, "");
|
|
159
|
+
}
|
|
160
|
+
function decodeHtmlEntities(s) {
|
|
161
|
+
return s.replace(/&#(\d+);/g, (_, d) => String.fromCharCode(parseInt(d, 10)))
|
|
162
|
+
.replace(/&#x([0-9a-fA-F]+);/g, (_, h) => String.fromCharCode(parseInt(h, 16)));
|
|
163
|
+
}
|
|
164
|
+
function fixApostrophes(s) {
|
|
165
|
+
let out = s;
|
|
166
|
+
out = out.replace(/\s*’\s*/g, "’");
|
|
167
|
+
out = out.replace(/\b([dljctmsn])\s*’/gi, (_, m) => m + "’");
|
|
168
|
+
out = out.replace(/’\s+([A-Za-zÀ-ÖØ-öø-ÿ])/g, "’$1");
|
|
169
|
+
out = out.replace(/\s+([,;:.!?])/g, "$1");
|
|
170
|
+
return out;
|
|
171
|
+
}
|
|
172
|
+
function normalizeTitle(text) { return text.replace(/^PR[ÉE]SIDENCE DE\b/i, "Présidence de "); }
|
|
173
|
+
function roleForSpeaker(labelOrQualite) {
|
|
174
|
+
const s = (labelOrQualite || "").toLowerCase();
|
|
175
|
+
if (/^(m\.|mme)?\s*(le|la)\s+pr[ée]sident(e)?\b/.test(s) || /\bpr[ée]sident[e]?\s+de\s+séance\b/.test(s))
|
|
176
|
+
return "président";
|
|
177
|
+
return "";
|
|
178
|
+
}
|
|
179
|
+
function readIntervenantMeta($block) {
|
|
180
|
+
const int = $block.find('cri\\:intervenant').first();
|
|
181
|
+
if (int.length)
|
|
182
|
+
return { mat: int.attr("mat") || undefined, nom: int.attr("nom") || undefined, qua: int.attr("qua") || undefined };
|
|
183
|
+
const html = $block.html() || "";
|
|
184
|
+
const m = html.match(/<!--\s*cri:intervenant\b([^>]+)-->/i);
|
|
185
|
+
if (!m)
|
|
186
|
+
return {};
|
|
187
|
+
const out = {};
|
|
188
|
+
const re = /(\w+)="([^"]*)"/g;
|
|
189
|
+
let a;
|
|
190
|
+
while ((a = re.exec(m[1])))
|
|
191
|
+
out[a[1]] = decodeHtmlEntities(a[2]);
|
|
192
|
+
return { mat: out["mat"], nom: out["nom"], qua: out["qua"] };
|
|
193
|
+
}
|
|
194
|
+
function extractAndRemoveLeadingQualite($, $block) {
|
|
195
|
+
const firstP = $block.find("p").first();
|
|
196
|
+
if (firstP.length === 0)
|
|
197
|
+
return "";
|
|
198
|
+
const parts = [];
|
|
199
|
+
let stop = false;
|
|
200
|
+
firstP.contents().each((_, node) => {
|
|
201
|
+
if (stop)
|
|
202
|
+
return;
|
|
203
|
+
if (node.type === "tag") {
|
|
204
|
+
const $node = $(node);
|
|
205
|
+
if ($node.hasClass("orateur_nom")) {
|
|
206
|
+
$node.remove();
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
if ($node.hasClass("orateur_qualite")) {
|
|
210
|
+
parts.push($node.text() || "");
|
|
211
|
+
$node.remove();
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
const t = norm($node.text() || "");
|
|
215
|
+
if (t)
|
|
216
|
+
stop = true;
|
|
217
|
+
else
|
|
218
|
+
$node.remove();
|
|
219
|
+
}
|
|
220
|
+
else if (node.type === "text") {
|
|
221
|
+
const t = norm(node.data || "");
|
|
222
|
+
if (!t || /^[:.,;–—-]+$/.test(t)) {
|
|
223
|
+
node.data = "";
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
stop = true;
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
return fixApostrophes(norm(parts.join(" ")));
|
|
230
|
+
}
|
|
231
|
+
function sanitizeInterventionHtml($, $block) {
|
|
232
|
+
const $clone = $block.clone();
|
|
233
|
+
$clone.find('a[name]').remove();
|
|
234
|
+
$clone.find('div[align="right"]').remove();
|
|
235
|
+
$clone.find('a.link').remove();
|
|
236
|
+
$clone.find('img').remove();
|
|
237
|
+
$clone.find('a#ameli_amendement_cri_phrase, a#ameli_amendement_cra_contenu, a#ameli_amendement_cra_objet').remove();
|
|
238
|
+
$clone.find(".orateur_nom, .orateur_qualite").remove();
|
|
239
|
+
let html = $clone.html() || "";
|
|
240
|
+
html = html.replace(/<!--[\s\S]*?-->/g, "");
|
|
241
|
+
return html.trim();
|
|
242
|
+
}
|
|
243
|
+
function extractSommaireForIntervals($, idx, intervals) {
|
|
244
|
+
const inIv = (el) => elementInAnyInterval(el, idx, intervals);
|
|
245
|
+
const root = $("body");
|
|
246
|
+
const sommaire = { presidentSeance: { _: "" }, sommaire1: [] };
|
|
247
|
+
// (1) Présidence (tm2) — première ligne dans l’intervalle
|
|
248
|
+
const pres = root.find("p.tm2").filter((_, el) => inIv(el)).first();
|
|
249
|
+
if (pres.length)
|
|
250
|
+
sommaire.presidentSeance = { _: norm(pres.text()) };
|
|
251
|
+
// (2) Paras tm5 présents dans l’intervalle
|
|
252
|
+
const paras = [];
|
|
253
|
+
root.find("p.tm5").each((_, el) => {
|
|
254
|
+
if (!inIv(el))
|
|
255
|
+
return;
|
|
256
|
+
const t = norm($(el).text());
|
|
257
|
+
if (t)
|
|
258
|
+
paras.push({ _: t });
|
|
259
|
+
});
|
|
260
|
+
if (paras.length)
|
|
261
|
+
sommaire.para = paras.length === 1 ? paras[0] : paras;
|
|
262
|
+
// (3) Items de 1er niveau (tm3) présents dans l’intervalle
|
|
263
|
+
const items = [];
|
|
264
|
+
root.find("p.tm3").each((_, el) => {
|
|
265
|
+
if (!inIv(el))
|
|
266
|
+
return;
|
|
267
|
+
const $p = $(el);
|
|
268
|
+
const full = norm($p.text() || "");
|
|
269
|
+
if (!full)
|
|
270
|
+
return;
|
|
271
|
+
const numMatch = full.match(/^(\d+)\s*[.\-–—]\s*/);
|
|
272
|
+
const valeur = numMatch ? numMatch[1] : undefined;
|
|
273
|
+
// prefere intitule in ancre <a> if present
|
|
274
|
+
const a = $p.find("a").first();
|
|
275
|
+
const intituleRaw = a.length ? a.text() : full.replace(/^(\d+)\s*[.\-–—]\s*/, "");
|
|
276
|
+
const intitule = norm(intituleRaw);
|
|
277
|
+
// id_syceron from href="#Niv1_SOMx"
|
|
278
|
+
const href = (a.attr("href") || "").trim();
|
|
279
|
+
const idSyceron = href.startsWith("#") ? href.slice(1) : href;
|
|
280
|
+
const titreStruct = { id_syceron: idSyceron || "", intitule };
|
|
281
|
+
items.push({ valeur_pts_odj: valeur, titreStruct });
|
|
282
|
+
});
|
|
283
|
+
if (items.length)
|
|
284
|
+
sommaire.sommaire1 = items;
|
|
285
|
+
return sommaire;
|
|
286
|
+
}
|
|
287
|
+
function extractMetadonnees($, filePath) {
|
|
288
|
+
let dateText = norm($("h1, h2, .page-title").first().text() || "");
|
|
289
|
+
if (!dateText)
|
|
290
|
+
dateText = norm($("p").first().text() || "");
|
|
291
|
+
const dateMatch = dateText.match(/\b(\d{1,2}\s+\w+\s+\d{4})\b/i);
|
|
292
|
+
const allText = norm($("body").text() || "");
|
|
293
|
+
const sessionMatch = allText.match(/\bsession\s+(\d{4}-\d{4})\b/i);
|
|
294
|
+
let dateSeance = dateMatch?.[1] || "";
|
|
295
|
+
if (!dateSeance) {
|
|
296
|
+
const m = filePath.match(/d(\d{4})(\d{2})(\d{2})\.xml$/i);
|
|
297
|
+
if (m)
|
|
298
|
+
dateSeance = `${m[1]}-${m[2]}-${m[3]}`;
|
|
299
|
+
}
|
|
300
|
+
return {
|
|
301
|
+
dateSeance,
|
|
302
|
+
dateSeanceJour: dateSeance,
|
|
303
|
+
numSeanceJour: "",
|
|
304
|
+
numSeance: "",
|
|
305
|
+
typeAssemblee: "SN",
|
|
306
|
+
legislature: "",
|
|
307
|
+
session: sessionMatch?.[1] || "",
|
|
308
|
+
nomFichierJo: "",
|
|
309
|
+
validite: "",
|
|
310
|
+
etat: "",
|
|
311
|
+
diffusion: "",
|
|
312
|
+
version: "1.0",
|
|
313
|
+
environnement: "",
|
|
314
|
+
heureGeneration: new Date()
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
function elementInAnyInterval(el, idx, intervals) {
|
|
318
|
+
const p = idx.get(el);
|
|
319
|
+
if (p == null)
|
|
320
|
+
return false;
|
|
321
|
+
for (const iv of intervals)
|
|
322
|
+
if (p >= iv.start && p < iv.end)
|
|
323
|
+
return true;
|
|
324
|
+
return false;
|
|
325
|
+
}
|
package/lib/model/dosleg.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ export declare function findAuteurs(): Promise<{
|
|
|
13
13
|
prenom: any;
|
|
14
14
|
matricule: any;
|
|
15
15
|
}[]>;
|
|
16
|
+
export declare function createActesLegislatifs(dossier: DossierLegislatifResult): any;
|
|
16
17
|
export declare function getCodeActeLecture(codeNatureDossier: string, typeLecture: string, assemblee: string): string | null;
|
|
17
18
|
export declare function getCodeActeTexte(codeParent: string | null, texteOrigine: string): string | null;
|
|
18
19
|
export type DossierLegislatifResult = InferResult<typeof findAllDossiersQuery>[0];
|
package/lib/model/dosleg.js
CHANGED
|
@@ -235,6 +235,75 @@ export async function findAuteurs() {
|
|
|
235
235
|
return findAuteursQuery
|
|
236
236
|
.execute();
|
|
237
237
|
}
|
|
238
|
+
export function createActesLegislatifs(dossier) {
|
|
239
|
+
const actesLegislatifs = (dossier["lectures"] || []).map((lecture) => {
|
|
240
|
+
const lecturesAssemblee = (lecture["lectures_assemblee"] || []).map((lectureAss) => {
|
|
241
|
+
const codeParent = getCodeActeLecture(dossier["code_nature_dossier"], lecture["type_lecture"], lectureAss["assemblee"]);
|
|
242
|
+
const textesWithCodeActe = (lectureAss["textes"] || []).map((texte) => ({
|
|
243
|
+
code_acte: getCodeActeTexte(codeParent, texte["origine"]),
|
|
244
|
+
...texte
|
|
245
|
+
}));
|
|
246
|
+
// Ajout étape -COM-FOND après chaque -DEPOT
|
|
247
|
+
let textesWithComFond = [];
|
|
248
|
+
for (let i = 0; i < textesWithCodeActe.length; i++) {
|
|
249
|
+
const t = textesWithCodeActe[i];
|
|
250
|
+
textesWithComFond.push(t);
|
|
251
|
+
if (t.code_acte && t.code_acte.endsWith('-DEPOT')) {
|
|
252
|
+
textesWithComFond.push({
|
|
253
|
+
...t,
|
|
254
|
+
code_acte: t.code_acte.replace('-DEPOT', '-COM-FOND')
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
const { textes, rapports, ...lectureAssWithoutTextes } = lectureAss;
|
|
259
|
+
return {
|
|
260
|
+
type_lecture: lecture["type_lecture"],
|
|
261
|
+
ordre_lecture: lecture["ordre_lecture"],
|
|
262
|
+
libelle_lecture: lecture["libelle"],
|
|
263
|
+
code_acte: codeParent,
|
|
264
|
+
actes_legislatifs: textesWithComFond,
|
|
265
|
+
...lectureAssWithoutTextes,
|
|
266
|
+
};
|
|
267
|
+
});
|
|
268
|
+
return lecturesAssemblee;
|
|
269
|
+
});
|
|
270
|
+
if (dossier["date_decision_CoC"]) {
|
|
271
|
+
actesLegislatifs.push({
|
|
272
|
+
type_lecture: "Conseil constitutionnel",
|
|
273
|
+
ordre_lecture: null,
|
|
274
|
+
libelle_lecture: "Conseil constitutionnel",
|
|
275
|
+
code_acte: "CC",
|
|
276
|
+
actes_legislatifs: [{
|
|
277
|
+
code_acte: "CC-SAISIE",
|
|
278
|
+
date: dossier["date_saisine_CoC"],
|
|
279
|
+
libelle_decision_CoC: dossier["libelle_decision_CoC"],
|
|
280
|
+
date_decision_CoC: dossier["date_decision_CoC"],
|
|
281
|
+
num_decision_CoC: dossier["num_decision_CoC"],
|
|
282
|
+
url_decision_CoC: dossier["url_decision_CoC"],
|
|
283
|
+
url_dossier_CoC: dossier["url_dossier_CoC"],
|
|
284
|
+
date_saisine_CoC: dossier["date_saisine_CoC"],
|
|
285
|
+
condition_saisine_CoC: dossier["condition_saisine_CoC"],
|
|
286
|
+
}]
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
if (dossier["date_publication_JO"]) {
|
|
290
|
+
actesLegislatifs.push({
|
|
291
|
+
type_lecture: "Promulgation",
|
|
292
|
+
ordre_lecture: null,
|
|
293
|
+
libelle_lecture: "Promulgation",
|
|
294
|
+
code_acte: "PROM",
|
|
295
|
+
actes_legislatifs: [{
|
|
296
|
+
code_acte: "PROM-PUB",
|
|
297
|
+
date: dossier["date_publication_JO"],
|
|
298
|
+
titre_JO: dossier["titre_JO"],
|
|
299
|
+
date_publication_JO: dossier["date_publication_JO"],
|
|
300
|
+
numero_JO: dossier["numero_JO"],
|
|
301
|
+
url_JO: dossier["url_JO"]
|
|
302
|
+
}]
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
return actesLegislatifs;
|
|
306
|
+
}
|
|
238
307
|
export function getCodeActeLecture(codeNatureDossier, typeLecture, assemblee) {
|
|
239
308
|
const codeAssemblee = assemblee === "Sénat" ? "SN" : assemblee === "Assemblée nationale" ? "AN" : null;
|
|
240
309
|
if (typeLecture === "Commission mixte paritaire") {
|
|
@@ -268,30 +337,26 @@ export function getCodeActeLecture(codeNatureDossier, typeLecture, assemblee) {
|
|
|
268
337
|
}
|
|
269
338
|
export function getCodeActeTexte(codeParent, texteOrigine) {
|
|
270
339
|
if (codeParent === "CMP") {
|
|
271
|
-
if (texteOrigine === "
|
|
272
|
-
return "CMP-DEBATS-
|
|
340
|
+
if (texteOrigine === "de la commission") {
|
|
341
|
+
return "CMP-DEBATS-AN";
|
|
273
342
|
}
|
|
274
|
-
else if (texteOrigine === "adopté
|
|
275
|
-
return "
|
|
343
|
+
else if (texteOrigine === "adopté par l'Assemblée Nationale" || texteOrigine === "adopté par l'Assemblée nationale") {
|
|
344
|
+
return "CMP-DEBATS-SN";
|
|
276
345
|
}
|
|
277
346
|
}
|
|
278
|
-
if (texteOrigine === "transmis au Sénat" || texteOrigine === "déposé au Sénat"
|
|
347
|
+
if (texteOrigine === "transmis au Sénat" || texteOrigine === "déposé au Sénat" ||
|
|
348
|
+
texteOrigine === "transmis à l'Assemblée nationale" || texteOrigine === "déposé à l'Assemblée nationale" ||
|
|
349
|
+
texteOrigine === "transmis à l'Assemblée Nationale" || texteOrigine === "déposé à l'Assemblée Nationale") {
|
|
279
350
|
return `${codeParent}-DEPOT`;
|
|
280
351
|
}
|
|
281
|
-
// Rajouter une étape similaire -COM-FOND
|
|
282
352
|
if (texteOrigine === "de la commission" || texteOrigine === "de la commission (AN)" || texteOrigine === "résultat des travaux de la commission") {
|
|
283
353
|
return `${codeParent}-DEBATS-SEANCE`;
|
|
284
354
|
}
|
|
285
|
-
if (texteOrigine === "déposé à l'Assemblée Nationale") {
|
|
286
|
-
return `${codeParent}-DEPOT`;
|
|
287
|
-
}
|
|
288
355
|
if (texteOrigine === "retiré par l'auteur") {
|
|
289
356
|
return `${codeParent}-RTRINI`;
|
|
290
357
|
}
|
|
291
|
-
if (texteOrigine
|
|
292
|
-
return `${codeParent}-DEC`;
|
|
358
|
+
if (texteOrigine.includes("adopté") || texteOrigine.includes("rejeté") || texteOrigine.includes("modifié")) {
|
|
359
|
+
return `${codeParent}-DEBATS-DEC`;
|
|
293
360
|
}
|
|
294
|
-
// Rajouter une étape CC-SAISIE
|
|
295
|
-
// Rajouter une étape PROM-
|
|
296
361
|
return null;
|
|
297
362
|
}
|