@tricoteuses/senat 3.1.12 → 3.1.14

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.
@@ -108,11 +108,13 @@ export function buildActesLegislatifs(dossier) {
108
108
  const commissionsSaisies = lecAss.commissions_saisies ?? [];
109
109
  for (const commission of commissionsSaisies) {
110
110
  const isAvis = commission.type_saisine === "avis";
111
- const commissionCodeActe = isAvis
112
- ? commission.deleguee_au_fond === "O"
113
- ? `${phasePrefix}-COM-CAE-DEC`
114
- : `${phasePrefix}-COM-AVIS`
115
- : `${phasePrefix}-COM-FOND`;
111
+ // Une commission "saisie pour avis" garde le code COM-AVIS même si elle a
112
+ // été déléguée au fond sur certains articles (commission.deleguee_au_fond
113
+ // === "O") : il s'agit d'une modalité de la saisine pour avis, pas d'un
114
+ // changement de nature. Le code -COM-CAE-DEC est réservé au "Comité
115
+ // d'examen approfondi" / rejet préalable et ne s'applique qu'aux lectures
116
+ // uniques/définitives (cf. mappingCodeActeToEtape).
117
+ const commissionCodeActe = isAvis ? `${phasePrefix}-COM-AVIS` : `${phasePrefix}-COM-FOND`;
116
118
  const commissionRaps = rapports.filter((r) => r.code_organisme === commission.code_organisme);
117
119
  const firstRapDate = commissionRaps.find((r) => r.date)?.date;
118
120
  const firstReunionDate = commission.reunions?.find((r) => r.date)?.date;
@@ -129,7 +131,7 @@ export function buildActesLegislatifs(dossier) {
129
131
  : rap
130
132
  ? `Rapport n°${rap.numero} de la commission`
131
133
  : "Travaux de la commission saisie au fond",
132
- id: rap?.id ?? null,
134
+ id: depotTexte?.id ?? rap?.id ?? null,
133
135
  numero: rap?.numero ?? null,
134
136
  code_organisme: commission.code_organisme ?? null,
135
137
  uid: `${loiSignet}-${phasePrefix}-COM-${commission.code_organisme ?? ""}`,
@@ -146,18 +148,18 @@ export function buildActesLegislatifs(dossier) {
146
148
  datesSeances.sort(compareByDate);
147
149
  const premiereSeance = datesSeances[0];
148
150
  if (premiereSeance && premiereSeance.date) {
149
- const texteAvantSeance = textesTries.find((t) => (t.origine || "").toLowerCase().includes("de la commission"));
151
+ const texteAvantSeance = textesTries.find((t) => (t.origine || "").toLowerCase() === "de la commission");
150
152
  actes.push({
151
153
  code_acte: `${phasePrefix}-DEBATS-SEANCE`,
152
154
  date: premiereSeance.date,
153
155
  libelle: "Discussion en séance publique",
154
- id: null,
156
+ id: texteAvantSeance?.id ?? depotTexte?.id ?? null,
155
157
  uid: `${loiSignet}-${phasePrefix}-DEBATS-SEANCE`,
156
158
  session: lecAss.session,
157
159
  chambre: "SN",
158
160
  signet_dossier: loiSignet,
159
161
  code_organisme: null,
160
- texte_url: texteAvantSeance?.url ?? null,
162
+ texte_url: texteAvantSeance?.url ?? depotTexte?.url ?? null,
161
163
  });
162
164
  }
163
165
  }
@@ -324,6 +324,19 @@ export async function* findAllDossiers() {
324
324
  };
325
325
  }
326
326
  }
327
+ // Normalise un libellé d'organisme pour comparer des entrées issues de sources
328
+ // ameli vs dosleg qui n'utilisent pas les mêmes codes (ex: "CDD" vs "DEVE")
329
+ // mais portent le même libellé.
330
+ function normalizeLibelleOrganisme(libelle) {
331
+ if (!libelle)
332
+ return null;
333
+ return libelle
334
+ .normalize("NFD")
335
+ .replace(/[\u0300-\u036f]/g, "")
336
+ .toLowerCase()
337
+ .replace(/\s+/g, " ")
338
+ .trim();
339
+ }
327
340
  function mergeCommissionsSaisies(lectures) {
328
341
  return lectures.map((lecture) => {
329
342
  const { lectures_assemblee, ...restLecture } = lecture;
@@ -360,12 +373,30 @@ function mergeCommissionsSaisies(lectures) {
360
373
  });
361
374
  }
362
375
  }
376
+ // Réconciliation entre les codes ameli (com_a.lib, ex: "CDD") et les codes
377
+ // dosleg (aud.orgcod, ex: "DEVE") pour un même organisme. Les rapports et
378
+ // réunions utilisent les codes dosleg ; on aligne donc les saisines ameli sur
379
+ // ces codes-là quand le libellé correspond.
363
380
  const knownOrgs = new Set(commissionsSaisies.map((c) => c.code_organisme));
364
381
  if (reunions_commission) {
365
382
  const audOrgs = [...new Set(reunions_commission.map((r) => r.code_organisme))];
366
383
  for (const audOrg of audOrgs) {
367
- if (audOrg && !knownOrgs.has(audOrg)) {
368
- const audLibelle = reunions_commission.find((r) => r.code_organisme === audOrg)?.libelle_organisme;
384
+ if (!audOrg || knownOrgs.has(audOrg))
385
+ continue;
386
+ const audLibelle = reunions_commission.find((r) => r.code_organisme === audOrg)?.libelle_organisme;
387
+ const audLibelleNorm = normalizeLibelleOrganisme(audLibelle);
388
+ // Si une saisine ameli porte le même libellé, on lui réattribue le
389
+ // code dosleg plutôt que de créer une entrée doublon.
390
+ const existing = audLibelleNorm
391
+ ? commissionsSaisies.find((c) => normalizeLibelleOrganisme(c.libelle_organisme) === audLibelleNorm)
392
+ : undefined;
393
+ if (existing) {
394
+ knownOrgs.delete(existing.code_organisme);
395
+ existing.code_organisme = audOrg;
396
+ existing.libelle_organisme = audLibelle ?? existing.libelle_organisme;
397
+ knownOrgs.add(audOrg);
398
+ }
399
+ else {
369
400
  commissionsSaisies.push({
370
401
  code_organisme: audOrg,
371
402
  libelle_organisme: audLibelle ?? null,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tricoteuses/senat",
3
- "version": "3.1.12",
3
+ "version": "3.1.14",
4
4
  "description": "Handle French Sénat's open data",
5
5
  "keywords": [
6
6
  "France",