@tricoteuses/senat 2.22.16 → 2.23.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.
Files changed (328) hide show
  1. package/README.md +168 -0
  2. package/lib/aggregates.d.ts +52 -0
  3. package/lib/aggregates.js +930 -0
  4. package/lib/aggregates.mjs +713 -0
  5. package/lib/aggregates.ts +833 -0
  6. package/lib/config.d.ts +10 -0
  7. package/lib/config.js +16 -0
  8. package/lib/config.mjs +16 -0
  9. package/lib/config.ts +26 -0
  10. package/lib/databases.d.ts +2 -0
  11. package/lib/databases.js +26 -0
  12. package/lib/databases.mjs +57 -0
  13. package/lib/databases.ts +71 -0
  14. package/lib/datasets.d.ts +34 -0
  15. package/lib/datasets.js +233 -0
  16. package/lib/datasets.mjs +78 -0
  17. package/lib/datasets.ts +118 -0
  18. package/lib/fields.d.ts +10 -0
  19. package/lib/fields.js +68 -0
  20. package/lib/fields.mjs +22 -0
  21. package/lib/fields.ts +29 -0
  22. package/lib/git.d.ts +26 -0
  23. package/lib/git.js +167 -0
  24. package/lib/index.d.ts +13 -0
  25. package/lib/index.js +1 -0
  26. package/lib/index.mjs +7 -0
  27. package/lib/index.ts +64 -0
  28. package/lib/inserters.d.ts +98 -0
  29. package/lib/inserters.js +500 -0
  30. package/lib/inserters.mjs +360 -0
  31. package/lib/inserters.ts +521 -0
  32. package/lib/legislatures.json +38 -0
  33. package/lib/loaders.d.ts +58 -0
  34. package/lib/loaders.js +286 -0
  35. package/lib/loaders.mjs +158 -0
  36. package/lib/loaders.ts +271 -0
  37. package/lib/model/agenda.d.ts +6 -0
  38. package/lib/model/agenda.js +148 -0
  39. package/lib/model/ameli.d.ts +51 -0
  40. package/lib/model/ameli.js +149 -0
  41. package/lib/model/ameli.mjs +84 -0
  42. package/lib/model/ameli.ts +100 -0
  43. package/lib/model/commission.d.ts +18 -0
  44. package/lib/model/commission.js +269 -0
  45. package/lib/model/debats.d.ts +67 -0
  46. package/lib/model/debats.js +95 -0
  47. package/lib/model/debats.mjs +43 -0
  48. package/lib/model/debats.ts +68 -0
  49. package/lib/model/documents.d.ts +12 -0
  50. package/lib/model/documents.js +151 -0
  51. package/lib/model/dosleg.d.ts +7 -0
  52. package/lib/model/dosleg.js +326 -0
  53. package/lib/model/dosleg.mjs +196 -0
  54. package/lib/model/dosleg.ts +240 -0
  55. package/lib/model/index.d.ts +7 -0
  56. package/lib/model/index.js +7 -0
  57. package/lib/model/index.mjs +5 -0
  58. package/lib/model/index.ts +15 -0
  59. package/lib/model/questions.d.ts +45 -0
  60. package/lib/model/questions.js +89 -0
  61. package/lib/model/questions.mjs +71 -0
  62. package/lib/model/questions.ts +93 -0
  63. package/lib/model/scrutins.d.ts +13 -0
  64. package/lib/model/scrutins.js +114 -0
  65. package/lib/model/seance.d.ts +3 -0
  66. package/lib/model/seance.js +267 -0
  67. package/lib/model/sens.d.ts +146 -0
  68. package/lib/model/sens.js +454 -0
  69. package/lib/model/sens.mjs +415 -0
  70. package/lib/model/sens.ts +516 -0
  71. package/lib/model/texte.d.ts +7 -0
  72. package/lib/model/texte.js +256 -0
  73. package/lib/model/texte.mjs +208 -0
  74. package/lib/model/texte.ts +229 -0
  75. package/lib/model/util.d.ts +9 -0
  76. package/lib/model/util.js +38 -0
  77. package/lib/model/util.mjs +19 -0
  78. package/lib/model/util.ts +32 -0
  79. package/lib/parsers/texte.d.ts +7 -0
  80. package/lib/parsers/texte.js +228 -0
  81. package/lib/raw_types/ameli.d.ts +914 -0
  82. package/lib/raw_types/ameli.js +5 -0
  83. package/lib/raw_types/ameli.mjs +163 -0
  84. package/lib/raw_types/debats.d.ts +207 -0
  85. package/lib/raw_types/debats.js +5 -0
  86. package/lib/raw_types/debats.mjs +58 -0
  87. package/lib/raw_types/dosleg.d.ts +1619 -0
  88. package/lib/raw_types/dosleg.js +5 -0
  89. package/lib/raw_types/dosleg.mjs +438 -0
  90. package/lib/raw_types/questions.d.ts +419 -0
  91. package/lib/raw_types/questions.js +5 -0
  92. package/lib/raw_types/questions.mjs +11 -0
  93. package/lib/raw_types/senat.d.ts +11368 -0
  94. package/lib/raw_types/senat.js +5 -0
  95. package/lib/raw_types/sens.d.ts +8248 -0
  96. package/lib/raw_types/sens.js +5 -0
  97. package/lib/raw_types/sens.mjs +508 -0
  98. package/lib/raw_types_kysely/ameli.d.ts +915 -0
  99. package/lib/raw_types_kysely/ameli.js +7 -0
  100. package/lib/raw_types_kysely/ameli.mjs +5 -0
  101. package/lib/raw_types_kysely/ameli.ts +951 -0
  102. package/lib/raw_types_kysely/debats.d.ts +207 -0
  103. package/lib/raw_types_kysely/debats.js +7 -0
  104. package/lib/raw_types_kysely/debats.mjs +5 -0
  105. package/lib/raw_types_kysely/debats.ts +222 -0
  106. package/lib/raw_types_kysely/dosleg.d.ts +3532 -0
  107. package/lib/raw_types_kysely/dosleg.js +7 -0
  108. package/lib/raw_types_kysely/dosleg.mjs +5 -0
  109. package/lib/raw_types_kysely/dosleg.ts +3621 -0
  110. package/lib/raw_types_kysely/questions.d.ts +414 -0
  111. package/lib/raw_types_kysely/questions.js +7 -0
  112. package/lib/raw_types_kysely/questions.mjs +5 -0
  113. package/lib/raw_types_kysely/questions.ts +426 -0
  114. package/lib/raw_types_kysely/sens.d.ts +4394 -0
  115. package/lib/raw_types_kysely/sens.js +7 -0
  116. package/lib/raw_types_kysely/sens.mjs +5 -0
  117. package/lib/raw_types_kysely/sens.ts +4499 -0
  118. package/lib/raw_types_schemats/ameli.d.ts +539 -0
  119. package/lib/raw_types_schemats/ameli.js +2 -0
  120. package/lib/raw_types_schemats/ameli.mjs +2 -0
  121. package/lib/raw_types_schemats/ameli.ts +601 -0
  122. package/lib/raw_types_schemats/debats.d.ts +127 -0
  123. package/lib/raw_types_schemats/debats.js +2 -0
  124. package/lib/raw_types_schemats/debats.mjs +2 -0
  125. package/lib/raw_types_schemats/debats.ts +145 -0
  126. package/lib/raw_types_schemats/dosleg.d.ts +977 -0
  127. package/lib/raw_types_schemats/dosleg.js +2 -0
  128. package/lib/raw_types_schemats/dosleg.mjs +2 -0
  129. package/lib/raw_types_schemats/dosleg.ts +2193 -0
  130. package/lib/raw_types_schemats/questions.d.ts +235 -0
  131. package/lib/raw_types_schemats/questions.js +2 -0
  132. package/lib/raw_types_schemats/questions.mjs +2 -0
  133. package/lib/raw_types_schemats/questions.ts +249 -0
  134. package/lib/raw_types_schemats/sens.d.ts +6915 -0
  135. package/lib/raw_types_schemats/sens.js +2 -0
  136. package/lib/raw_types_schemats/sens.mjs +2 -0
  137. package/lib/raw_types_schemats/sens.ts +2907 -0
  138. package/lib/scripts/convert_data.d.ts +1 -0
  139. package/lib/scripts/convert_data.js +354 -0
  140. package/lib/scripts/convert_data.mjs +181 -0
  141. package/lib/scripts/convert_data.ts +243 -0
  142. package/lib/scripts/data-download.d.ts +1 -0
  143. package/lib/scripts/data-download.js +12 -0
  144. package/lib/scripts/datautil.d.ts +8 -0
  145. package/lib/scripts/datautil.js +34 -0
  146. package/lib/scripts/datautil.mjs +16 -0
  147. package/lib/scripts/datautil.ts +19 -0
  148. package/lib/scripts/images/transparent_150x192.jpg +0 -0
  149. package/lib/scripts/images/transparent_155x225.jpg +0 -0
  150. package/lib/scripts/parse_textes.d.ts +1 -0
  151. package/lib/scripts/parse_textes.js +44 -0
  152. package/lib/scripts/parse_textes.mjs +46 -0
  153. package/lib/scripts/parse_textes.ts +65 -0
  154. package/lib/scripts/retrieve_agenda.d.ts +1 -0
  155. package/lib/scripts/retrieve_agenda.js +132 -0
  156. package/lib/scripts/retrieve_cr_commission.d.ts +1 -0
  157. package/lib/scripts/retrieve_cr_commission.js +364 -0
  158. package/lib/scripts/retrieve_cr_seance.d.ts +6 -0
  159. package/lib/scripts/retrieve_cr_seance.js +347 -0
  160. package/lib/scripts/retrieve_documents.d.ts +3 -0
  161. package/lib/scripts/retrieve_documents.js +219 -0
  162. package/lib/scripts/retrieve_documents.mjs +249 -0
  163. package/lib/scripts/retrieve_documents.ts +298 -0
  164. package/lib/scripts/retrieve_open_data.d.ts +1 -0
  165. package/lib/scripts/retrieve_open_data.js +315 -0
  166. package/lib/scripts/retrieve_open_data.mjs +217 -0
  167. package/lib/scripts/retrieve_open_data.ts +268 -0
  168. package/lib/scripts/retrieve_senateurs_photos.d.ts +1 -0
  169. package/lib/scripts/retrieve_senateurs_photos.js +147 -0
  170. package/lib/scripts/retrieve_senateurs_photos.mjs +147 -0
  171. package/lib/scripts/retrieve_senateurs_photos.ts +177 -0
  172. package/lib/scripts/retrieve_videos.d.ts +1 -0
  173. package/lib/scripts/retrieve_videos.js +461 -0
  174. package/lib/scripts/shared/cli_helpers.d.ts +95 -0
  175. package/lib/scripts/shared/cli_helpers.js +91 -0
  176. package/lib/scripts/shared/cli_helpers.ts +36 -0
  177. package/lib/scripts/shared/util.d.ts +4 -0
  178. package/lib/scripts/shared/util.js +35 -0
  179. package/lib/scripts/shared/util.ts +33 -0
  180. package/lib/scripts/test_iter_load.d.ts +1 -0
  181. package/lib/scripts/test_iter_load.js +12 -0
  182. package/lib/src/config.d.ts +22 -0
  183. package/lib/src/config.js +17 -7
  184. package/lib/src/conversion_textes.js +5 -1
  185. package/lib/src/databases.d.ts +2 -1
  186. package/lib/src/databases_postgres.d.ts +4 -0
  187. package/lib/src/databases_postgres.js +23 -0
  188. package/lib/src/datasets.d.ts +4 -0
  189. package/lib/src/datasets.js +16 -2
  190. package/lib/src/git.d.ts +1 -0
  191. package/lib/src/git.js +45 -11
  192. package/lib/src/loaders.js +10 -4
  193. package/lib/src/model/agenda.js +2 -2
  194. package/lib/src/model/ameli.d.ts +64 -52
  195. package/lib/src/model/ameli.js +147 -145
  196. package/lib/src/model/ameli_postgres.d.ts +67 -0
  197. package/lib/src/model/ameli_postgres.js +150 -0
  198. package/lib/src/model/commission.d.ts +3 -2
  199. package/lib/src/model/commission.js +2 -2
  200. package/lib/src/model/debats.d.ts +38 -66
  201. package/lib/src/model/debats.js +110 -93
  202. package/lib/src/model/documents.d.ts +32 -12
  203. package/lib/src/model/documents.js +171 -130
  204. package/lib/src/model/dosleg.d.ts +142 -5
  205. package/lib/src/model/dosleg.js +298 -156
  206. package/lib/src/model/questions.d.ts +54 -45
  207. package/lib/src/model/questions.js +89 -87
  208. package/lib/src/model/scrutins.d.ts +48 -13
  209. package/lib/src/model/scrutins.js +118 -111
  210. package/lib/src/model/seance.js +3 -3
  211. package/lib/src/model/sens.d.ts +109 -179
  212. package/lib/src/model/sens.js +384 -484
  213. package/lib/src/model/util.d.ts +0 -8
  214. package/lib/src/model/util.js +0 -23
  215. package/lib/src/parsers/texte.js +7 -7
  216. package/lib/src/raw_types_schemats/ameli.d.ts +4 -2
  217. package/lib/src/raw_types_schemats/debats.d.ts +2 -2
  218. package/lib/src/raw_types_schemats/dosleg.d.ts +2 -2
  219. package/lib/src/raw_types_schemats/questions.d.ts +2 -2
  220. package/lib/src/raw_types_schemats/sens.d.ts +10 -4216
  221. package/lib/src/scripts/convert_data.js +7 -6
  222. package/lib/src/scripts/convert_xml_to_html.js +2 -2
  223. package/lib/src/scripts/data-download.js +3 -2
  224. package/lib/src/scripts/retrieve_agenda.js +21 -9
  225. package/lib/src/scripts/retrieve_cr_commission.js +17 -17
  226. package/lib/src/scripts/retrieve_cr_seance.d.ts +14 -1
  227. package/lib/src/scripts/retrieve_cr_seance.js +10 -11
  228. package/lib/src/scripts/retrieve_documents.d.ts +11 -2
  229. package/lib/src/scripts/retrieve_documents.js +25 -14
  230. package/lib/src/scripts/retrieve_open_data.js +400 -145
  231. package/lib/src/scripts/retrieve_senateurs_photos.js +25 -11
  232. package/lib/src/scripts/retrieve_videos.js +12 -11
  233. package/lib/src/scripts/shared/cli_helpers.d.ts +1 -6
  234. package/lib/src/scripts/shared/cli_helpers.js +9 -8
  235. package/lib/src/scripts/shared/incremental_import_sql.d.ts +2 -0
  236. package/lib/src/scripts/shared/incremental_import_sql.js +894 -0
  237. package/lib/src/scripts/shared/prefixed_tables.d.ts +7 -0
  238. package/lib/src/scripts/shared/prefixed_tables.js +30 -0
  239. package/lib/src/scripts/shared/schema_version.d.ts +3 -0
  240. package/lib/src/scripts/shared/schema_version.js +97 -0
  241. package/lib/src/scripts/shared/staging_import.d.ts +3 -0
  242. package/lib/src/scripts/shared/staging_import.js +80 -0
  243. package/lib/src/scripts/shared/staging_metadata_sql.d.ts +1 -0
  244. package/lib/src/scripts/shared/staging_metadata_sql.js +221 -0
  245. package/lib/src/scripts/validate_prefixed_tables.d.ts +1 -0
  246. package/lib/src/scripts/validate_prefixed_tables.js +102 -0
  247. package/lib/src/types/texte.d.ts +1 -1
  248. package/lib/src/utils/cr_spliting.d.ts +9 -6
  249. package/lib/src/utils/cr_spliting.js +6 -101
  250. package/lib/src/utils/reunion_odj_building.d.ts +7 -3
  251. package/lib/src/utils/reunion_parsing.d.ts +2 -1
  252. package/lib/src/utils/reunion_parsing.js +2 -2
  253. package/lib/src/videos/match.js +8 -5
  254. package/lib/src/videos/pipeline.d.ts +6 -2
  255. package/lib/src/videos/pipeline.js +21 -8
  256. package/lib/src/videos/search.js +6 -2
  257. package/lib/strings.d.ts +1 -0
  258. package/lib/strings.js +18 -0
  259. package/lib/strings.mjs +18 -0
  260. package/lib/strings.ts +26 -0
  261. package/lib/tests/incrementalImportSql.test.d.ts +1 -0
  262. package/lib/tests/incrementalImportSql.test.js +155 -0
  263. package/lib/tests/prefixedTables.test.d.ts +1 -0
  264. package/lib/tests/prefixedTables.test.js +29 -0
  265. package/lib/tests/schemaVersion.test.d.ts +1 -0
  266. package/lib/tests/schemaVersion.test.js +23 -0
  267. package/lib/tests/validatePrefixedTables.test.d.ts +1 -0
  268. package/lib/tests/validatePrefixedTables.test.js +14 -0
  269. package/lib/types/agenda.d.ts +44 -0
  270. package/lib/types/agenda.js +1 -0
  271. package/lib/types/ameli.d.ts +5 -0
  272. package/lib/types/ameli.js +1 -0
  273. package/lib/types/ameli.mjs +13 -0
  274. package/lib/types/ameli.ts +21 -0
  275. package/lib/types/compte_rendu.d.ts +83 -0
  276. package/lib/types/compte_rendu.js +1 -0
  277. package/lib/types/debats.d.ts +2 -0
  278. package/lib/types/debats.js +1 -0
  279. package/lib/types/debats.mjs +2 -0
  280. package/lib/types/debats.ts +6 -0
  281. package/lib/types/dosleg.d.ts +70 -0
  282. package/lib/types/dosleg.js +1 -0
  283. package/lib/types/dosleg.mjs +151 -0
  284. package/lib/types/dosleg.ts +284 -0
  285. package/lib/types/questions.d.ts +2 -0
  286. package/lib/types/questions.js +1 -0
  287. package/lib/types/questions.mjs +1 -0
  288. package/lib/types/questions.ts +3 -0
  289. package/lib/types/sens.d.ts +10 -0
  290. package/lib/types/sens.js +1 -0
  291. package/lib/types/sens.mjs +1 -0
  292. package/lib/types/sens.ts +12 -0
  293. package/lib/types/sessions.d.ts +5 -0
  294. package/lib/types/sessions.js +84 -0
  295. package/lib/types/sessions.mjs +43 -0
  296. package/lib/types/sessions.ts +42 -0
  297. package/lib/types/texte.d.ts +74 -0
  298. package/lib/types/texte.js +16 -0
  299. package/lib/types/texte.mjs +16 -0
  300. package/lib/types/texte.ts +76 -0
  301. package/lib/typings/windows-1252.d.js +2 -0
  302. package/lib/typings/windows-1252.d.mjs +2 -0
  303. package/lib/typings/windows-1252.d.ts +11 -0
  304. package/lib/utils/cr_spliting.d.ts +28 -0
  305. package/lib/utils/cr_spliting.js +265 -0
  306. package/lib/utils/date.d.ts +10 -0
  307. package/lib/utils/date.js +100 -0
  308. package/lib/utils/nvs-timecode.d.ts +7 -0
  309. package/lib/utils/nvs-timecode.js +79 -0
  310. package/lib/utils/reunion_grouping.d.ts +9 -0
  311. package/lib/utils/reunion_grouping.js +361 -0
  312. package/lib/utils/reunion_odj_building.d.ts +5 -0
  313. package/lib/utils/reunion_odj_building.js +154 -0
  314. package/lib/utils/reunion_parsing.d.ts +23 -0
  315. package/lib/utils/reunion_parsing.js +209 -0
  316. package/lib/utils/scoring.d.ts +14 -0
  317. package/lib/utils/scoring.js +147 -0
  318. package/lib/utils/string_cleaning.d.ts +7 -0
  319. package/lib/utils/string_cleaning.js +57 -0
  320. package/lib/validators/config.d.ts +9 -0
  321. package/lib/validators/config.js +10 -0
  322. package/lib/validators/config.mjs +54 -0
  323. package/lib/validators/config.ts +79 -0
  324. package/lib/validators/senat.d.ts +0 -0
  325. package/lib/validators/senat.js +28 -0
  326. package/lib/validators/senat.mjs +24 -0
  327. package/lib/validators/senat.ts +26 -0
  328. package/package.json +6 -10
@@ -1,123 +1,277 @@
1
- import { sql } from "kysely";
2
- import { jsonArrayFrom } from "kysely/helpers/postgres";
3
- import { dbSenat } from "../databases";
4
- import { concat, rtrim, toDateString } from "./util";
5
- import { textes, rapports } from "./documents";
6
- function datesSeances(lectureAssembleeId) {
7
- return jsonArrayFrom(dbSenat
8
- .withSchema("dosleg")
9
- .selectFrom("dosleg.date_seance")
10
- .where("dosleg.date_seance.lecidt", "=", lectureAssembleeId)
11
- .select(({ ref }) => [toDateString(ref("dosleg.date_seance.date_s")).as("date")]));
1
+ import { streamUnsafeQuery } from "../databases_postgres";
2
+ function stripTrailingHashesSql(expr) {
3
+ return `regexp_replace(${expr}, '#+$', '')`;
12
4
  }
13
- function lecturesAssemblee(lectureId) {
14
- return jsonArrayFrom(dbSenat
15
- .withSchema("dosleg")
16
- .selectFrom("lecass")
17
- .where("lecass.lecidt", "=", lectureId)
18
- .leftJoin("ass", "ass.codass", "lecass.codass")
19
- .leftJoin("org", "org.orgcod", "lecass.orgcod")
20
- .leftJoin("orippr", "orippr.oripprcod", "lecass.orippr")
21
- .select(({ ref }) => [
22
- rtrim(ref("ass.libass")).as("assemblee"),
23
- "org.orgnom as libelle_organisme",
24
- "org.senorgcod as code_organisme",
25
- "lecass.ordreass as ordre_lecture_assemblee",
26
- "lecass.sesann as session",
27
- "orippr.oripprlib as origine_proposition",
28
- "lecass.ptlnum as numero_petite_loi",
29
- "lecass.ptlurl as url_petite_loi",
30
- "lecass.loiintmod as loi_intitule_modifie",
31
- "lecass.debatsurl as url_cr_debats",
32
- toDateString(ref("lecass.lecassamecomdat")).as("date_publication_amendements_commission"),
33
- toDateString(ref("lecass.lecassamedat")).as("date_publication_amendements_seance"),
34
- textes(ref("lecass.lecassidt")).as("textes"),
35
- rapports(ref("lecass.lecassidt")).as("rapports"),
36
- datesSeances(ref("lecass.lecassidt")).as("dates_seances"),
37
- ])
38
- .orderBy("lecass.ordreass", "asc"));
5
+ function buildAuteursTexteSql(texteIdSql) {
6
+ return `
7
+ (
8
+ select coalesce(json_agg(author_rows order by author_rows.ordre_num nulls last), '[]'::json)
9
+ from (
10
+ select
11
+ auteur.prenom as prenom,
12
+ auteur.nomuse as nom_usuel,
13
+ auteur.autmat as matricule,
14
+ ecr.ecrnumtri::text as ordre,
15
+ ecr.ecrnumtri as ordre_num,
16
+ rolsig.rolsiglib as role,
17
+ ecr.ecrqua as qualite
18
+ from senat.dosleg_auteur as auteur
19
+ left join senat.dosleg_ecr as ecr on ecr.autcod = auteur.autcod
20
+ left join senat.dosleg_rolsig as rolsig on rolsig.signataire = ecr.signataire
21
+ where ecr.texcod = ${texteIdSql}
22
+ ) as author_rows
23
+ )
24
+ `;
39
25
  }
40
- function lectures(loiId) {
41
- return jsonArrayFrom(dbSenat
42
- .withSchema("dosleg")
43
- .selectFrom("lecture")
44
- .leftJoin("typlec", "typlec.typleccod", "lecture.typleccod")
45
- .where("lecture.loicod", "=", loiId)
46
- .select(({ ref }) => [
47
- rtrim(ref("typlec.typleclib")).as("type_lecture"),
48
- rtrim(ref("lecture.leccom")).as("libelle"),
49
- "typlec.typlecord as ordre_lecture",
50
- lecturesAssemblee(ref("lecture.lecidt")).as("lectures_assemblee"),
51
- ])
52
- .orderBy("typlec.typlecord", "asc"));
26
+ function buildAuteursRapportSql(rapportIdSql) {
27
+ return `
28
+ (
29
+ select coalesce(json_agg(author_rows order by author_rows.ordre_num nulls last), '[]'::json)
30
+ from (
31
+ select
32
+ auteur.prenom as prenom,
33
+ auteur.nomuse as nom_usuel,
34
+ auteur.autmat as matricule,
35
+ ecr.ecrnumtri::text as ordre,
36
+ ecr.ecrnumtri as ordre_num,
37
+ rolsig.rolsiglib as role,
38
+ ecr.ecrqua as qualite
39
+ from senat.dosleg_auteur as auteur
40
+ left join senat.dosleg_ecr as ecr on ecr.autcod = auteur.autcod
41
+ left join senat.dosleg_rolsig as rolsig on rolsig.signataire = ecr.signataire
42
+ where ecr.rapcod = ${rapportIdSql}
43
+ ) as author_rows
44
+ )
45
+ `;
53
46
  }
54
- function themes(loiId) {
55
- return jsonArrayFrom(dbSenat
56
- .withSchema("dosleg")
57
- .selectFrom("the")
58
- .leftJoin("loithe", "loithe.thecle", "the.thecle")
59
- .where("loithe.loicod", "=", loiId)
60
- .select(["the.thelib as libelle"]));
47
+ function buildDocumentsAttachesSql(rapportIdSql) {
48
+ return `
49
+ (
50
+ select coalesce(json_agg(attached_rows), '[]'::json)
51
+ from (
52
+ select
53
+ docatt.docatturl as url,
54
+ typatt.typattlib as type_document
55
+ from senat.dosleg_docatt as docatt
56
+ left join senat.dosleg_typatt as typatt on docatt.typattcod = typatt.typattcod
57
+ where docatt.rapcod = ${rapportIdSql}
58
+ ) as attached_rows
59
+ )
60
+ `;
61
61
  }
62
- const findAllDossiersQuery = dbSenat
63
- .withSchema("dosleg")
64
- .selectFrom("loi")
65
- .leftJoin("typloi", "typloi.typloicod", "loi.typloicod")
66
- .leftJoin("etaloi", "etaloi.etaloicod", "loi.etaloicod")
67
- .leftJoin("deccoc", "deccoc.deccoccod", "loi.deccoccod")
68
- .select(({ eb, ref, val }) => [
69
- rtrim(ref("loi.loicod")).as("code"),
70
- "loi.numero as numero",
71
- "loi.signet as signet",
72
- sql `NULLIF(regexp_replace(loi.url_an, '^.*\\/(DL[^\\/]+)\\.asp$', '\\1'), '')`.as("code_dossier_an"),
73
- "loi.signetalt as signet_alternatif",
74
- rtrim(ref("loi.motclef")).as("mot_cle"),
75
- rtrim(ref("loi.loient")).as("titre_court"),
76
- concat(rtrim(ref("typloi.typloiden")), val(" "), rtrim(ref("loi.loitit"))).as("titre"),
77
- concat(rtrim(ref("typloi.typloiden")), val(" "), rtrim(ref("loi.loiint"))).as("titre_long"),
78
- concat(rtrim(ref("typloi.typloiden")), val(" "), rtrim(ref("loi.loiintori"))).as("titre_long_original"),
79
- concat(val("https://www.senat.fr/dossier-legislatif/"), ref("loi.signet"), val(".html")).as("url"),
80
- "loi.urgence as urgence",
81
- rtrim(ref("typloi.groupe")).as("code_nature_dossier"),
82
- rtrim(ref("typloi.typloilib")).as("libelle_type_dossier"),
83
- rtrim(ref("etaloi.etaloilib")).as("etat_dossier"),
84
- "loi.url_an as url_dossier_assemblee_nationale",
85
- "loi.url_presart as url_presentation_articles",
86
- "loi.url_ordonnance as url_ordonnance",
87
- "loi.orgcod as code_organisme_resolution",
88
- "deccoc.deccoclib as libelle_decision_CoC",
89
- toDateString(ref("loi.date_decision")).as("date_decision_CoC"),
90
- "loi.num_decision as num_decision_CoC",
91
- "loi.deccocurl as url_decision_CoC",
92
- "loi.doscocurl as url_dossier_CoC",
93
- toDateString(ref("loi.saisine_date")).as("date_saisine_CoC"),
94
- "loi.saisine_par as condition_saisine_CoC",
95
- toDateString(ref("loi.proaccdat")).as("date_procedure_acceleree"),
96
- toDateString(ref("loi.proaccoppdat")).as("date_opposition_procedure_acceleree"),
97
- toDateString(ref("loi.retproaccdat")).as("date_retrait_procedure_acceleree"),
98
- toDateString(ref("loi.date_loi")).as("date_promulgation"),
99
- eb
100
- .case()
101
- .when("loi.loititjo", "is not", null)
102
- .then(concat(rtrim(ref("typloi.typloiden")), val(" "), rtrim(ref("loi.loititjo"))))
103
- .else("")
104
- .end()
105
- .as("titre_JO"),
106
- toDateString(ref("loi.loidatjo")).as("date_publication_JO"),
107
- "loi.loinumjo as numero_JO",
108
- "loi.url_jo as url_JO",
109
- toDateString(ref("loi.loidatjo2")).as("date_publication_JO_correctif_1"),
110
- "loi.loinumjo2 as numero_JO_correctif_1",
111
- "loi.url_jo2 as url_JO_correctif_1",
112
- toDateString(ref("loi.loidatjo3")).as("date_publication_JO_correctif_2"),
113
- "loi.loinumjo3 as numero_JO_correctif_2",
114
- "loi.url_jo3 as url_JO_correctif_2",
115
- lectures(ref("loi.loicod")).as("lectures"),
116
- themes(ref("loi.loicod")).as("themes"),
117
- ])
118
- .$narrowType();
119
- export function findAllDossiers() {
120
- return findAllDossiersQuery.stream();
62
+ function buildTextesSql(lectureAssembleeIdSql) {
63
+ return `
64
+ (
65
+ select coalesce(json_agg(text_rows order by text_rows.ordre_tri nulls last), '[]'::json)
66
+ from (
67
+ select
68
+ texte.texnum as numero,
69
+ texte.orgcod as code_organisme,
70
+ case
71
+ when texte.texurl is not null then
72
+ ${stripTrailingHashesSql("regexp_replace(trim(texte.texurl), '^(.*/)?(.*?)(\\.html)?$', '\\2')")}
73
+ else null
74
+ end as id,
75
+ case
76
+ when texte.typurl = 'I' then
77
+ ${stripTrailingHashesSql("'https://www.senat.fr/leg/' || rtrim(texte.texurl)")}
78
+ else ${stripTrailingHashesSql("rtrim(texte.texurl)")}
79
+ end as url,
80
+ rtrim(oritxt.oritxtlib) as origine,
81
+ oritxt.oriordre as ordre_origine,
82
+ oritxt.oritxtado as code_adoption,
83
+ oritxt.oritxtmod as modification,
84
+ rtrim(typtxt.typtxtlib) as type,
85
+ to_char(texte.txtoritxtdat, 'YYYY-MM-DD') as date,
86
+ texte.sesann::int as session,
87
+ ${buildAuteursTexteSql("texte.texcod")} as auteurs,
88
+ array_position(array['0','2','1'], oritxt.oriordre) as ordre_tri
89
+ from senat.dosleg_texte as texte
90
+ left join senat.dosleg_oritxt as oritxt on oritxt.oritxtcod = texte.oritxtcod
91
+ left join senat.dosleg_typtxt as typtxt on typtxt.typtxtcod = texte.typtxtcod
92
+ where texte.lecassidt = ${lectureAssembleeIdSql}
93
+ ) as text_rows
94
+ )
95
+ `;
96
+ }
97
+ function buildRapportsSql(lectureAssembleeIdSql) {
98
+ return `
99
+ (
100
+ select coalesce(json_agg(report_rows), '[]'::json)
101
+ from (
102
+ select
103
+ rap.rapnum as numero,
104
+ raporg.orgcod as code_organisme,
105
+ case
106
+ when rap.rapurl is not null then
107
+ ${stripTrailingHashesSql("regexp_replace(trim(rap.rapurl), '^(.*/)?(.*?)(\\.html)?$', '\\2')")}
108
+ else null
109
+ end as id,
110
+ case
111
+ when rap.typurl = 'I' then
112
+ ${stripTrailingHashesSql("'https://www.senat.fr/rap/' || rtrim(rap.rapurl)")}
113
+ else ${stripTrailingHashesSql("rtrim(rap.rapurl)")}
114
+ end as url,
115
+ rtrim(denrap.libdenrap) as type,
116
+ rtrim(rtrim(rap.raptil)) as titre,
117
+ rtrim(rtrim(rap.rapsoustit)) as sous_titre,
118
+ to_char(rap.date_depot, 'YYYY-MM-DD') as date,
119
+ rap.sesann::int as session,
120
+ ${buildAuteursRapportSql("rap.rapcod")} as auteurs,
121
+ ${buildDocumentsAttachesSql("rap.rapcod")} as documents_annexes
122
+ from senat.dosleg_rap as rap
123
+ left join senat.dosleg_raporg as raporg on raporg.rapcod = rap.rapcod
124
+ left join senat.dosleg_denrap as denrap on denrap.coddenrap = rap.coddenrap
125
+ left join senat.dosleg_lecassrap as lecassrap on lecassrap.rapcod = rap.rapcod
126
+ where lecassrap.lecassidt = ${lectureAssembleeIdSql}
127
+ ) as report_rows
128
+ )
129
+ `;
130
+ }
131
+ function buildDatesSeancesSql(lectureAssembleeIdSql) {
132
+ return `
133
+ (
134
+ select coalesce(json_agg(date_rows), '[]'::json)
135
+ from (
136
+ select to_char(date_seance.date_s, 'YYYY-MM-DD') as date
137
+ from senat.dosleg_date_seance as date_seance
138
+ where date_seance.lecidt = ${lectureAssembleeIdSql}
139
+ ) as date_rows
140
+ )
141
+ `;
142
+ }
143
+ function buildLecturesAssembleeSql(lectureIdSql) {
144
+ return `
145
+ (
146
+ select coalesce(json_agg(assembly_rows order by assembly_rows.ordre_lecture_assemblee_num nulls last), '[]'::json)
147
+ from (
148
+ select
149
+ rtrim(ass.libass) as assemblee,
150
+ org.orgnom as libelle_organisme,
151
+ org.senorgcod as code_organisme,
152
+ lecass.ordreass::text as ordre_lecture_assemblee,
153
+ lecass.ordreass as ordre_lecture_assemblee_num,
154
+ lecass.sesann::int as session,
155
+ orippr.oripprlib as origine_proposition,
156
+ lecass.ptlnum as numero_petite_loi,
157
+ lecass.ptlurl as url_petite_loi,
158
+ lecass.loiintmod as loi_intitule_modifie,
159
+ lecass.debatsurl as url_cr_debats,
160
+ to_char(lecass.lecassamecomdat, 'YYYY-MM-DD') as date_publication_amendements_commission,
161
+ to_char(lecass.lecassamedat, 'YYYY-MM-DD') as date_publication_amendements_seance,
162
+ ${buildTextesSql("lecass.lecassidt")} as textes,
163
+ ${buildRapportsSql("lecass.lecassidt")} as rapports,
164
+ ${buildDatesSeancesSql("lecass.lecassidt")} as dates_seances
165
+ from senat.dosleg_lecass as lecass
166
+ left join senat.dosleg_ass as ass on ass.codass = lecass.codass
167
+ left join senat.dosleg_org as org on org.orgcod = lecass.orgcod
168
+ left join senat.dosleg_orippr as orippr on orippr.oripprcod = lecass.orippr
169
+ where lecass.lecidt = ${lectureIdSql}
170
+ ) as assembly_rows
171
+ )
172
+ `;
173
+ }
174
+ function buildLecturesSql(loiIdSql) {
175
+ return `
176
+ (
177
+ select coalesce(json_agg(lecture_rows order by lecture_rows.ordre_lecture_num nulls last), '[]'::json)
178
+ from (
179
+ select
180
+ rtrim(typlec.typleclib) as type_lecture,
181
+ rtrim(lecture.leccom) as libelle,
182
+ typlec.typlecord::text as ordre_lecture,
183
+ typlec.typlecord as ordre_lecture_num,
184
+ ${buildLecturesAssembleeSql("lecture.lecidt")} as lectures_assemblee
185
+ from senat.dosleg_lecture as lecture
186
+ left join senat.dosleg_typlec as typlec on typlec.typleccod = lecture.typleccod
187
+ where lecture.loicod = ${loiIdSql}
188
+ ) as lecture_rows
189
+ )
190
+ `;
191
+ }
192
+ function buildThemesSql(loiIdSql) {
193
+ return `
194
+ (
195
+ select coalesce(json_agg(theme_rows), '[]'::json)
196
+ from (
197
+ select the.thelib as libelle
198
+ from senat.dosleg_the as the
199
+ left join senat.dosleg_loithe as loithe on loithe.thecle = the.thecle
200
+ where loithe.loicod = ${loiIdSql}
201
+ ) as theme_rows
202
+ )
203
+ `;
204
+ }
205
+ function buildFindAllDossiersQuery() {
206
+ return {
207
+ params: [],
208
+ query: `
209
+ select
210
+ rtrim(loi.loicod) as code,
211
+ loi.numero,
212
+ loi.signet,
213
+ nullif(regexp_replace(loi.url_an, '^.*\\/(DL[^\\/]+)\\.asp$', '\\1'), '') as code_dossier_an,
214
+ loi.signetalt as signet_alternatif,
215
+ rtrim(loi.motclef) as mot_cle,
216
+ rtrim(loi.loient) as titre_court,
217
+ rtrim(typloi.typloiden) || ' ' || rtrim(loi.loitit) as titre,
218
+ rtrim(typloi.typloiden) || ' ' || rtrim(loi.loiint) as titre_long,
219
+ rtrim(typloi.typloiden) || ' ' || rtrim(loi.loiintori) as titre_long_original,
220
+ 'https://www.senat.fr/dossier-legislatif/' || loi.signet || '.html' as url,
221
+ loi.urgence,
222
+ rtrim(typloi.groupe) as code_nature_dossier,
223
+ rtrim(typloi.typloilib) as libelle_type_dossier,
224
+ rtrim(etaloi.etaloilib) as etat_dossier,
225
+ loi.url_an as url_dossier_assemblee_nationale,
226
+ loi.url_presart as url_presentation_articles,
227
+ loi.url_ordonnance as url_ordonnance,
228
+ loi.orgcod as code_organisme_resolution,
229
+ deccoc.deccoclib as libelle_decision_CoC,
230
+ to_char(loi.date_decision, 'YYYY-MM-DD') as date_decision_CoC,
231
+ loi.num_decision as num_decision_CoC,
232
+ loi.deccocurl as url_decision_CoC,
233
+ loi.doscocurl as url_dossier_CoC,
234
+ to_char(loi.saisine_date, 'YYYY-MM-DD') as date_saisine_CoC,
235
+ loi.saisine_par as condition_saisine_CoC,
236
+ to_char(loi.proaccdat, 'YYYY-MM-DD') as date_procedure_acceleree,
237
+ to_char(loi.proaccoppdat, 'YYYY-MM-DD') as date_opposition_procedure_acceleree,
238
+ to_char(loi.retproaccdat, 'YYYY-MM-DD') as date_retrait_procedure_acceleree,
239
+ to_char(loi.date_loi, 'YYYY-MM-DD') as date_promulgation,
240
+ case
241
+ when loi.loititjo is not null then rtrim(typloi.typloiden) || ' ' || rtrim(loi.loititjo)
242
+ else ''
243
+ end as titre_JO,
244
+ to_char(loi.loidatjo, 'YYYY-MM-DD') as date_publication_JO,
245
+ loi.loinumjo as numero_JO,
246
+ loi.url_jo as url_JO,
247
+ to_char(loi.loidatjo2, 'YYYY-MM-DD') as date_publication_JO_correctif_1,
248
+ loi.loinumjo2 as numero_JO_correctif_1,
249
+ loi.url_jo2 as url_JO_correctif_1,
250
+ to_char(loi.loidatjo3, 'YYYY-MM-DD') as date_publication_JO_correctif_2,
251
+ loi.loinumjo3 as numero_JO_correctif_2,
252
+ loi.url_jo3 as url_JO_correctif_2,
253
+ ${buildLecturesSql("loi.loicod")} as lectures,
254
+ ${buildThemesSql("loi.loicod")} as themes
255
+ from senat.dosleg_loi as loi
256
+ left join senat.dosleg_typloi as typloi on typloi.typloicod = loi.typloicod
257
+ left join senat.dosleg_etaloi as etaloi on etaloi.etaloicod = loi.etaloicod
258
+ left join senat.dosleg_deccoc as deccoc on deccoc.deccoccod = loi.deccoccod
259
+ `,
260
+ };
261
+ }
262
+ export async function* findAllDossiers() {
263
+ const { query, params } = buildFindAllDossiersQuery();
264
+ for await (const row of streamUnsafeQuery(query, params)) {
265
+ if (!row.signet) {
266
+ continue;
267
+ }
268
+ yield {
269
+ ...row,
270
+ signet: row.signet,
271
+ lectures: row.lectures ?? [],
272
+ themes: row.themes ?? [],
273
+ };
274
+ }
121
275
  }
122
276
  export function getCodeActeLecture(codeNatureDossier, typeLecture, assemblee) {
123
277
  const codeAssemblee = assemblee === "Sénat" ? "SN" : assemblee === "Assemblée nationale" ? "AN" : null;
@@ -150,7 +304,16 @@ export function getCodeActeLecture(codeNatureDossier, typeLecture, assemblee) {
150
304
  }
151
305
  return null;
152
306
  }
153
- // Helper pour déterminer le code de phase (SN1, SN2, CMP...)
307
+ function getDateSortValue(value) {
308
+ if (!value) {
309
+ return Number.POSITIVE_INFINITY;
310
+ }
311
+ const timestamp = new Date(value).getTime();
312
+ return Number.isNaN(timestamp) ? Number.POSITIVE_INFINITY : timestamp;
313
+ }
314
+ function compareByDate(left, right) {
315
+ return getDateSortValue(left.date) - getDateSortValue(right.date);
316
+ }
154
317
  function getPhasePrefix(lecture, assemblee) {
155
318
  if (assemblee !== "Sénat")
156
319
  return null;
@@ -159,38 +322,33 @@ function getPhasePrefix(lecture, assemblee) {
159
322
  return "CMP";
160
323
  if (typeLibelle.includes("nouvelle lecture"))
161
324
  return "SNNLEC";
162
- if (typeLibelle.includes("d\u00e9finitive"))
325
+ if (typeLibelle.includes("définitive"))
163
326
  return "SNLDEF";
164
327
  if (typeLibelle.includes("unique"))
165
328
  return "SNLUNI";
166
329
  if (lecture.ordre_lecture) {
167
330
  return `SN${lecture.ordre_lecture}`;
168
331
  }
169
- if (typeLibelle.includes("premi\u00e8re"))
332
+ if (typeLibelle.includes("première"))
170
333
  return "SN1";
171
- if (typeLibelle.includes("deuxi\u00e8me") || typeLibelle.includes("seconde"))
334
+ if (typeLibelle.includes("deuxième") || typeLibelle.includes("seconde"))
172
335
  return "SN2";
173
336
  return "SN1";
174
337
  }
175
338
  export function buildActesLegislatifs(dossier) {
176
339
  const actes = [];
177
340
  const loiSignet = dossier.signet;
178
- const lectures = dossier.lectures || [];
341
+ const lectures = dossier.lectures ?? [];
179
342
  for (const lecture of lectures) {
180
- const lecturesAssemblee = lecture.lectures_assemblee || [];
343
+ const lecturesAssemblee = lecture.lectures_assemblee ?? [];
181
344
  for (const lecAss of lecturesAssemblee) {
182
- // On ne traite que la partie SÉNAT
183
345
  if (lecAss.assemblee !== "Sénat")
184
346
  continue;
185
347
  const phasePrefix = getPhasePrefix(lecture, lecAss.assemblee);
186
348
  if (!phasePrefix)
187
349
  continue;
188
- // Préparation des textes (tri chronologique)
189
- const textes = lecAss.textes || [];
190
- const textesTries = [...textes].sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime());
191
- // =================================================================
192
- // A. DÉPÔT
193
- // =================================================================
350
+ const textes = lecAss.textes ?? [];
351
+ const textesTries = [...textes].sort(compareByDate);
194
352
  const depotTexte = textesTries.find((t) => (t.origine || "").toLowerCase().includes("déposé") ||
195
353
  (t.origine || "").toLowerCase().includes("transmis") ||
196
354
  t.ordre_origine === "0");
@@ -209,10 +367,7 @@ export function buildActesLegislatifs(dossier) {
209
367
  code_organisme: null,
210
368
  });
211
369
  }
212
- // =================================================================
213
- // B. COMMISSION (Rapports)
214
- // =================================================================
215
- const rapports = lecAss.rapports || [];
370
+ const rapports = lecAss.rapports ?? [];
216
371
  for (const rap of rapports) {
217
372
  if (rap.date) {
218
373
  actes.push({
@@ -221,8 +376,7 @@ export function buildActesLegislatifs(dossier) {
221
376
  libelle: `Rapport n°${rap.numero} de la commission`,
222
377
  id: rap.id,
223
378
  numero: rap.numero,
224
- code_organisme: rap.code_organisme,
225
- adoption: rap.adoption,
379
+ code_organisme: rap.code_organisme ?? null,
226
380
  uid: `${loiSignet}-${phasePrefix}-COM`,
227
381
  session: lecAss.session,
228
382
  chambre: "SN",
@@ -231,20 +385,16 @@ export function buildActesLegislatifs(dossier) {
231
385
  });
232
386
  }
233
387
  }
234
- // =================================================================
235
- // C. SÉANCE PUBLIQUE
236
- // =================================================================
237
- const datesSeances = lecAss.dates_seances || [];
388
+ const datesSeances = lecAss.dates_seances ?? [];
238
389
  if (datesSeances.length > 0) {
239
- // Tri des objets dates
240
- datesSeances.sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime());
390
+ datesSeances.sort(compareByDate);
241
391
  const premiereSeance = datesSeances[0];
242
392
  if (premiereSeance && premiereSeance.date) {
243
393
  actes.push({
244
- // Champs pour buildParlementActeLegislatif
245
394
  code_acte: `${phasePrefix}-DEBATS-SEANCE`,
246
395
  date: premiereSeance.date,
247
- libelle: `Discussion en séance publique`,
396
+ libelle: "Discussion en séance publique",
397
+ id: null,
248
398
  uid: `${loiSignet}-${phasePrefix}-DEBATS-SEANCE`,
249
399
  session: lecAss.session,
250
400
  chambre: "SN",
@@ -253,9 +403,6 @@ export function buildActesLegislatifs(dossier) {
253
403
  });
254
404
  }
255
405
  }
256
- // =================================================================
257
- // D. DÉCISION / VOTE
258
- // =================================================================
259
406
  const texteFinal = [...textesTries].reverse().find((t) => {
260
407
  const origine = (t.origine || "").toLowerCase();
261
408
  return (origine.includes("adopté") ||
@@ -289,18 +436,16 @@ export function buildActesLegislatifs(dossier) {
289
436
  }
290
437
  }
291
438
  }
292
- // =================================================================
293
- // E. HORS LECTURE (CC & PROMULGATION)
294
- // =================================================================
295
439
  if (dossier.date_decision_CoC) {
296
440
  actes.push({
297
441
  code_acte: "CC",
298
442
  date: dossier.date_decision_CoC,
299
- libelle: `Décision du Conseil constitutionnel`,
443
+ libelle: "Décision du Conseil constitutionnel",
300
444
  id: dossier.url_decision_CoC,
301
445
  uid: `${loiSignet}-CC`,
302
446
  chambre: "AN",
303
447
  signet_dossier: loiSignet,
448
+ code_organisme: null,
304
449
  texte_url: dossier.url_decision_CoC || dossier.url_dossier_CoC,
305
450
  });
306
451
  }
@@ -308,7 +453,7 @@ export function buildActesLegislatifs(dossier) {
308
453
  actes.push({
309
454
  code_acte: "PROM",
310
455
  date: dossier.date_promulgation,
311
- libelle: `Promulgation de la loi`,
456
+ libelle: "Promulgation de la loi",
312
457
  date_publication_JO: dossier.date_publication_JO,
313
458
  numero_JO: dossier.numero_JO,
314
459
  url_legifrance: dossier.url_JO,
@@ -316,11 +461,8 @@ export function buildActesLegislatifs(dossier) {
316
461
  uid: `${loiSignet}-PROM`,
317
462
  chambre: "AN",
318
463
  signet_dossier: loiSignet,
464
+ code_organisme: null,
319
465
  });
320
466
  }
321
- return actes.sort((a, b) => {
322
- const dateA = new Date(a.date).getTime();
323
- const dateB = new Date(b.date).getTime();
324
- return dateA - dateB;
325
- });
467
+ return actes.sort(compareByDate);
326
468
  }