diff --git a/app/[legislature]/dossier/[id]/AdditionalInfoCard.tsx b/app/[legislature]/dossier/[id]/AdditionalInfoCard.tsx index b294343..c563e3a 100644 --- a/app/[legislature]/dossier/[id]/AdditionalInfoCard.tsx +++ b/app/[legislature]/dossier/[id]/AdditionalInfoCard.tsx @@ -21,8 +21,7 @@ async function getDocumentsUnCached(ids: string[]) { where: { uid: { in: ids } }, include: { _count: { - // TODO: Check with HEnry if the naming `amendements` make sens for amendements - select: { amendementsCommission: true, amendements: true }, + select: { amendements: true }, }, coSignataires: { include: { acteurRef: { include: { groupeParlementaire: true } } }, @@ -45,8 +44,7 @@ export const AdditionalInfoCard = async (props: { const data = await getDocuments(props.documentIds); const documentsWithAmendements = data.filter( - (document) => - document._count.amendements + document._count.amendementsCommission > 0 + (document) => document._count.amendements ); return ( @@ -67,22 +65,23 @@ export const AdditionalInfoCard = async (props: { - {documentsWithAmendements.map(({ uid, titrePrincipalCourt, _count }) => ( -
- - {_count.amendementsCommission + _count.amendements}{" "} - amendements - - - {titrePrincipalCourt} - -
- ))} + {documentsWithAmendements.map( + ({ uid, titrePrincipalCourt, _count }) => ( +
+ + {_count.amendements} amendements + + + {titrePrincipalCourt} + +
+ ) + )}
)} diff --git a/app/depute/[slug]/WeeklyActivity/WeeklyActivitySection.tsx b/app/depute/[slug]/WeeklyActivity/WeeklyActivitySection.tsx index ce13067..512fba1 100644 --- a/app/depute/[slug]/WeeklyActivity/WeeklyActivitySection.tsx +++ b/app/depute/[slug]/WeeklyActivity/WeeklyActivitySection.tsx @@ -33,7 +33,7 @@ export default function WeeklyActivitySection(props: { Commissions - ; + ); } diff --git a/app/depute/[slug]/amendements/AmendementsStatistics.tsx b/app/depute/[slug]/amendements/AmendementsStatistics.tsx index a122c2a..6672d3e 100644 --- a/app/depute/[slug]/amendements/AmendementsStatistics.tsx +++ b/app/depute/[slug]/amendements/AmendementsStatistics.tsx @@ -1,5 +1,6 @@ import React from "react"; import { prisma } from "@/prisma"; +import Box from "@mui/material/Box"; async function getDeputeAmendementStatsUnCached(uid: string) { try { @@ -81,23 +82,30 @@ export async function AmendementsStatistics({ {} ); return ( - + - + {[...sorts, ...etats].map((state) => ( - + ))} -
Etat proposés signés
{state} {nbPropose[state] ?? 0}{state} {nbCoSigne[state] ?? 0}
+ ); } diff --git a/app/depute/[slug]/amendements/page.tsx b/app/depute/[slug]/amendements/page.tsx index 5afe888..d1af856 100644 --- a/app/depute/[slug]/amendements/page.tsx +++ b/app/depute/[slug]/amendements/page.tsx @@ -36,7 +36,7 @@ export default async function Amendements({ return ( -

Amendements

+

Amendements

diff --git a/app/depute/[slug]/page.tsx b/app/depute/[slug]/page.tsx index 79a921c..2c0d055 100644 --- a/app/depute/[slug]/page.tsx +++ b/app/depute/[slug]/page.tsx @@ -16,6 +16,7 @@ async function getDeputeStatsUnCached(slug: string) { nombreAmendements: true, nombreInterventions: true, nombreQuestions: true, + nombreDocumentsPublies: true, statistiquesHebdomadaire: true, }, }); @@ -68,17 +69,22 @@ const getStatsOnWeeklyActivity = React.cache(getStatsOnWeeklyActivityUnCached); const baselineTypeToDeputeKey: Record< string, - "nombreAmendements" | "nombreInterventions" | "nombreQuestions" + | "nombreAmendements" + | "nombreInterventions" + | "nombreQuestions" + | "nombreDocumentsPublies" > = { - questions: "nombreQuestions", - interventions: "nombreInterventions", - amendements: "nombreAmendements", + "ACTEUR-QUESTIONS": "nombreQuestions", + "ACTEUR-INTERVENTIONS": "nombreInterventions", + "ACTEUR-AMENDEMENTS": "nombreAmendements", + "ACTEUR-DOCUMENTS": "nombreDocumentsPublies", }; const baselineTypeToTitle: Record = { - questions: "Nombre de questions", - interventions: "Nombre d'interventions", - amendements: "Nombre d'amendements", + nombreQuestions: "Nombre de questions", + nombreInterventions: "Nombre d'interventions", + nombreAmendements: "Nombre d'amendements", + nombreDocumentsPublies: "Nombre de documents publié", }; const quantilesSentences = [ @@ -107,16 +113,18 @@ export default async function Page({ params }: { params: { slug: string } }) { /> {baselineStats.map(({ q20, q40, q60, q80, maximum, type, id }) => { - if (!baselineTypeToDeputeKey[type as string] || !deputeStats) { + if (type !== "ACTEUR" || !id.startsWith("17-AN-ACTEUR-")) { + // Stats pour les commission ou groupe parlementaire + // Ou pour le senat ou une autre legislature return null; } + const deputeKey = baselineTypeToDeputeKey[id.slice("17-AN-".length)]; - if (!id.includes("-AN-")) { - // Enleve les stats liées au senat + if (!deputeKey || !deputeStats) { return null; } - const value = deputeStats[baselineTypeToDeputeKey[type]]; + const value = deputeStats[deputeKey]; const quantiles = [q20, q40, q60, q80, maximum]; @@ -132,7 +140,7 @@ export default async function Page({ params }: { params: { slug: string } }) { {value} - {baselineTypeToTitle[type]} + {baselineTypeToTitle[deputeKey]} { + deputes: Awaited>; +} + +export default function DeputesFilter(props: DeputeFilterProps) { + const { deputes, indexesPerNom, indexesPerGroup, indexesPerCirco, groups } = + props; + + const [numeroDepartement, setNumeroDepartement] = React.useState< + string | null + >(null); + + return ( + + + + + + + + + + + ); +} diff --git a/app/deputes/DeputesView.tsx b/app/deputes/DeputesView.tsx index b042df1..e665d54 100644 --- a/app/deputes/DeputesView.tsx +++ b/app/deputes/DeputesView.tsx @@ -144,9 +144,11 @@ export default function DeputesView({ indexesPerGroup, indexesPerNom, groups, -}: { deputes: Awaited> } & ReturnType< - typeof groupDeputes ->) { + numeroDepartement, +}: { + deputes: Awaited>; + numeroDepartement: string | null; +} & ReturnType) { const [grouping, setGrouping] = React.useState< "groupPolitique" | "alphabetique" >("groupPolitique"); @@ -167,6 +169,7 @@ export default function DeputesView({ !depute.mandatPrincipal || depute.mandatPrincipal.dateFin !== null ).length; + const filterIsActive = !!search || numeroDepartement !== null; return ( @@ -205,12 +208,19 @@ export default function DeputesView({ .map((i) => deputes[i]) .filter(({ nom, prenom, mandatPrincipal }) => { return ( - !search || - `${nom} ${prenom} ${mandatPrincipal?.departement ?? ""}` - .toLowerCase() - .includes(search.toLowerCase()) + (!search || + `${nom} ${prenom} ${mandatPrincipal?.departement ?? ""}` + .toLowerCase() + .includes(search.toLowerCase())) && + (numeroDepartement === null || + mandatPrincipal?.numDepartement === numeroDepartement) ); }); + + if (filteredDeputes.length === 0) { + return null; + } + return ( void; +}; + +export const Filter = (props: FilterProps) => { + const { numeroDepartement, handleNumeroDepartement } = props; + + const value = React.useMemo( + () => + numeroDepartement === null + ? null + : departements.find((v) => v.numeroDepartement === numeroDepartement) ?? + null, + [numeroDepartement] + ); + + return ( +
+ + option.numeroDepartement === value.numeroDepartement + } + value={value} + onChange={(_, newValue) => + handleNumeroDepartement(newValue?.numeroDepartement ?? null) + } + groupBy={(option) => option.region} + getOptionLabel={(option) => + `${option.nomDepartement} (${option.numeroDepartement})` + } + getOptionKey={(option) => option.numeroDepartement} + + renderInput={(params) => } + /> +
+ ); +}; diff --git a/app/deputes/page.tsx b/app/deputes/page.tsx index 7c15e72..8e1ccb4 100644 --- a/app/deputes/page.tsx +++ b/app/deputes/page.tsx @@ -6,6 +6,9 @@ import Stack from "@mui/material/Stack"; import { groupDeputes } from "./groupDeputes"; import DeputesView from "./DeputesView"; import { getDeputes } from "./getDeputes"; +import { FilterContainer } from "@/components/FilterContainer"; +import { Filter } from "./Filter"; +import DeputesFilter from "./DeputesFilter"; export default async function DeputesList() { const deputes = await getDeputes("17"); @@ -25,20 +28,13 @@ export default async function DeputesList() { gap: 5, }} > - {/* - - // - - */} - - - + ); } diff --git a/app/deputes/structureCircos.ts b/app/deputes/structureCircos.ts new file mode 100644 index 0000000..bcf872a --- /dev/null +++ b/app/deputes/structureCircos.ts @@ -0,0 +1,537 @@ +export const departements = [ + { + region: "Auvergne-Rhône-Alpes", + numeroDepartement: "01", + nomDepartement: "Ain", + }, + { + region: "Auvergne-Rhône-Alpes", + numeroDepartement: "03", + nomDepartement: "Allier", + }, + { + region: "Auvergne-Rhône-Alpes", + numeroDepartement: "07", + nomDepartement: "Ardèche", + }, + { + region: "Auvergne-Rhône-Alpes", + numeroDepartement: "15", + nomDepartement: "Cantal", + }, + { + region: "Auvergne-Rhône-Alpes", + numeroDepartement: "26", + nomDepartement: "Drôme", + }, + { + region: "Auvergne-Rhône-Alpes", + numeroDepartement: "38", + nomDepartement: "Isère", + }, + { + region: "Auvergne-Rhône-Alpes", + numeroDepartement: "42", + nomDepartement: "Loire", + }, + { + region: "Auvergne-Rhône-Alpes", + numeroDepartement: "43", + nomDepartement: "Haute-Loire", + }, + { + region: "Auvergne-Rhône-Alpes", + numeroDepartement: "63", + nomDepartement: "Puy-de-Dôme", + }, + { + region: "Auvergne-Rhône-Alpes", + numeroDepartement: "69", + nomDepartement: "Rhône", + }, + { + region: "Auvergne-Rhône-Alpes", + numeroDepartement: "73", + nomDepartement: "Savoie", + }, + { + region: "Auvergne-Rhône-Alpes", + numeroDepartement: "74", + nomDepartement: "Haute-Savoie", + }, + { + region: "Bourgogne-Franche-Comté", + numeroDepartement: "21", + nomDepartement: "Côte-d'Or", + }, + { + region: "Bourgogne-Franche-Comté", + numeroDepartement: "25", + nomDepartement: "Doubs", + }, + { + region: "Bourgogne-Franche-Comté", + numeroDepartement: "39", + nomDepartement: "Jura", + }, + { + region: "Bourgogne-Franche-Comté", + numeroDepartement: "58", + nomDepartement: "Nièvre", + }, + { + region: "Bourgogne-Franche-Comté", + numeroDepartement: "70", + nomDepartement: "Haute-Saône", + }, + { + region: "Bourgogne-Franche-Comté", + numeroDepartement: "71", + nomDepartement: "Saône-et-Loire", + }, + { + region: "Bourgogne-Franche-Comté", + numeroDepartement: "89", + nomDepartement: "Yonne", + }, + { + region: "Bourgogne-Franche-Comté", + numeroDepartement: "90", + nomDepartement: "Territoire de Belfort", + }, + { + region: "Bretagne", + numeroDepartement: "22", + nomDepartement: "Côtes-d'Armor", + }, + { + region: "Bretagne", + numeroDepartement: "29", + nomDepartement: "Finistère", + }, + { + region: "Bretagne", + numeroDepartement: "35", + nomDepartement: "Ille-et-Vilaine", + }, + { + region: "Bretagne", + numeroDepartement: "56", + nomDepartement: "Morbihan", + }, + { + region: "Centre-Val de Loire", + numeroDepartement: "18", + nomDepartement: "Cher", + }, + { + region: "Centre-Val de Loire", + numeroDepartement: "28", + nomDepartement: "Eure-et-Loir", + }, + { + region: "Centre-Val de Loire", + numeroDepartement: "36", + nomDepartement: "Indre", + }, + { + region: "Centre-Val de Loire", + numeroDepartement: "37", + nomDepartement: "Indre-et-Loire", + }, + { + region: "Centre-Val de Loire", + numeroDepartement: "41", + nomDepartement: "Loir-et-Cher", + }, + { + region: "Centre-Val de Loire", + numeroDepartement: "45", + nomDepartement: "Loiret", + }, + { + region: "Corse", + numeroDepartement: "2A", + nomDepartement: "Corse-du-Sud", + }, + { + region: "Corse", + numeroDepartement: "2B", + nomDepartement: "Haute-Corse", + }, + { + region: "Français établis hors de France", + numeroDepartement: "099", + nomDepartement: "Français établis hors de France", + }, + { + region: "Grand Est", + numeroDepartement: "08", + nomDepartement: "Ardennes", + }, + { + region: "Grand Est", + numeroDepartement: "10", + nomDepartement: "Aube", + }, + { + region: "Grand Est", + numeroDepartement: "51", + nomDepartement: "Marne", + }, + { + region: "Grand Est", + numeroDepartement: "52", + nomDepartement: "Haute-Marne", + }, + { + region: "Grand Est", + numeroDepartement: "54", + nomDepartement: "Meurthe-et-Moselle", + }, + { + region: "Grand Est", + numeroDepartement: "55", + nomDepartement: "Meuse", + }, + { + region: "Grand Est", + numeroDepartement: "57", + nomDepartement: "Moselle", + }, + { + region: "Grand Est", + numeroDepartement: "67", + nomDepartement: "Bas-Rhin", + }, + { + region: "Grand Est", + numeroDepartement: "68", + nomDepartement: "Haut-Rhin", + }, + { + region: "Grand Est", + numeroDepartement: "88", + nomDepartement: "Vosges", + }, + { + region: "Hauts-de-France", + numeroDepartement: "02", + nomDepartement: "Aisne", + }, + { + region: "Hauts-de-France", + numeroDepartement: "59", + nomDepartement: "Nord", + }, + { + region: "Hauts-de-France", + numeroDepartement: "60", + nomDepartement: "Oise", + }, + { + region: "Hauts-de-France", + numeroDepartement: "62", + nomDepartement: "Pas-de-Calais", + }, + { + region: "Hauts-de-France", + numeroDepartement: "80", + nomDepartement: "Somme", + }, + { + region: "Ile-de-France", + numeroDepartement: "75", + nomDepartement: "Paris", + }, + { + region: "Ile-de-France", + numeroDepartement: "77", + nomDepartement: "Seine-et-Marne", + }, + { + region: "Ile-de-France", + numeroDepartement: "78", + nomDepartement: "Yvelines", + }, + { + region: "Ile-de-France", + numeroDepartement: "91", + nomDepartement: "Essonne", + }, + { + region: "Ile-de-France", + numeroDepartement: "92", + nomDepartement: "Hauts-de-Seine", + }, + { + region: "Ile-de-France", + numeroDepartement: "93", + nomDepartement: "Seine-Saint-Denis", + }, + { + region: "Ile-de-France", + numeroDepartement: "94", + nomDepartement: "Val-de-Marne", + }, + { + region: "Ile-de-France", + numeroDepartement: "95", + nomDepartement: "Val-d'Oise", + }, + { + region: "Normandie", + numeroDepartement: "14", + nomDepartement: "Calvados", + }, + { + region: "Normandie", + numeroDepartement: "27", + nomDepartement: "Eure", + }, + { + region: "Normandie", + numeroDepartement: "50", + nomDepartement: "Manche", + }, + { + region: "Normandie", + numeroDepartement: "61", + nomDepartement: "Orne", + }, + { + region: "Normandie", + numeroDepartement: "76", + nomDepartement: "Seine-Maritime", + }, + { + region: "Nouvelle-Aquitaine", + numeroDepartement: "16", + nomDepartement: "Charente", + }, + { + region: "Nouvelle-Aquitaine", + numeroDepartement: "17", + nomDepartement: "Charente-Maritime", + }, + { + region: "Nouvelle-Aquitaine", + numeroDepartement: "19", + nomDepartement: "Corrèze", + }, + { + region: "Nouvelle-Aquitaine", + numeroDepartement: "23", + nomDepartement: "Creuse", + }, + { + region: "Nouvelle-Aquitaine", + numeroDepartement: "24", + nomDepartement: "Dordogne", + }, + { + region: "Nouvelle-Aquitaine", + numeroDepartement: "33", + nomDepartement: "Gironde", + }, + { + region: "Nouvelle-Aquitaine", + numeroDepartement: "40", + nomDepartement: "Landes", + }, + { + region: "Nouvelle-Aquitaine", + numeroDepartement: "47", + nomDepartement: "Lot-et-Garonne", + }, + { + region: "Nouvelle-Aquitaine", + numeroDepartement: "64", + nomDepartement: "Pyrénées-Atlantiques", + }, + { + region: "Nouvelle-Aquitaine", + numeroDepartement: "79", + nomDepartement: "Deux-Sèvres", + }, + { + region: "Nouvelle-Aquitaine", + numeroDepartement: "86", + nomDepartement: "Vienne", + }, + { + region: "Nouvelle-Aquitaine", + numeroDepartement: "87", + nomDepartement: "Haute-Vienne", + }, + { + region: "Occitanie", + numeroDepartement: "09", + nomDepartement: "Ariège", + }, + { + region: "Occitanie", + numeroDepartement: "11", + nomDepartement: "Aude", + }, + { + region: "Occitanie", + numeroDepartement: "12", + nomDepartement: "Aveyron", + }, + { + region: "Occitanie", + numeroDepartement: "30", + nomDepartement: "Gard", + }, + { + region: "Occitanie", + numeroDepartement: "31", + nomDepartement: "Haute-Garonne", + }, + { + region: "Occitanie", + numeroDepartement: "32", + nomDepartement: "Gers", + }, + { + region: "Occitanie", + numeroDepartement: "34", + nomDepartement: "Hérault", + }, + { + region: "Occitanie", + numeroDepartement: "46", + nomDepartement: "Lot", + }, + { + region: "Occitanie", + numeroDepartement: "48", + nomDepartement: "Lozère", + }, + { + region: "Occitanie", + numeroDepartement: "65", + nomDepartement: "Hautes-Pyrénées", + }, + { + region: "Occitanie", + numeroDepartement: "66", + nomDepartement: "Pyrénées-Orientales", + }, + { + region: "Occitanie", + numeroDepartement: "81", + nomDepartement: "Tarn", + }, + { + region: "Occitanie", + numeroDepartement: "82", + nomDepartement: "Tarn-et-Garonne", + }, + { + region: "Pays de la Loire", + numeroDepartement: "44", + nomDepartement: "Loire-Atlantique", + }, + { + region: "Pays de la Loire", + numeroDepartement: "49", + nomDepartement: "Maine-et-Loire", + }, + { + region: "Pays de la Loire", + numeroDepartement: "53", + nomDepartement: "Mayenne", + }, + { + region: "Pays de la Loire", + numeroDepartement: "72", + nomDepartement: "Sarthe", + }, + { + region: "Pays de la Loire", + numeroDepartement: "85", + nomDepartement: "Vendée", + }, + { + region: "Provence-Alpes-Côte d'Azur", + numeroDepartement: "04", + nomDepartement: "Alpes-de-Haute-Provence", + }, + { + region: "Provence-Alpes-Côte d'Azur", + numeroDepartement: "05", + nomDepartement: "Hautes-Alpes", + }, + { + region: "Provence-Alpes-Côte d'Azur", + numeroDepartement: "06", + nomDepartement: "Alpes-Maritimes", + }, + { + region: "Provence-Alpes-Côte d'Azur", + numeroDepartement: "13", + nomDepartement: "Bouches-du-Rhône", + }, + { + region: "Provence-Alpes-Côte d'Azur", + numeroDepartement: "83", + nomDepartement: "Var", + }, + { + region: "Provence-Alpes-Côte d'Azur", + numeroDepartement: "84", + nomDepartement: "Vaucluse", + }, + { + region: "Outre-mer", + numeroDepartement: "971", + nomDepartement: "Guadeloupe", + }, + { + region: "Outre-mer", + numeroDepartement: "973", + nomDepartement: "Guyane", + }, + { + region: "Outre-mer", + numeroDepartement: "972", + nomDepartement: "Martinique", + }, + { + region: "Outre-mer", + numeroDepartement: "974", + nomDepartement: "Réunion", + }, + { + region: "Outre-mer", + numeroDepartement: "977", + nomDepartement: "Saint-Barthélemy et Saint-Martin", + }, + { + region: "Outre-mer", + numeroDepartement: "975", + nomDepartement: "Saint-Pierre-et-Miquelon", + }, + { + region: "Outre-mer", + numeroDepartement: "976", + nomDepartement: "Mayotte", + }, + { + region: "Outre-mer", + numeroDepartement: "986", + nomDepartement: "Wallis-et-Futuna", + }, + { + region: "Outre-mer", + numeroDepartement: "987", + nomDepartement: "Polynésie Française", + }, + { + region: "Outre-mer", + numeroDepartement: "988", + nomDepartement: "Nouvelle-Calédonie", + }, +]; diff --git a/package.json b/package.json index 41f2a14..46544c8 100644 --- a/package.json +++ b/package.json @@ -42,5 +42,6 @@ }, "prisma": { "schema": "./prisma/models" - } + }, + "packageManager": "pnpm@9.15.4+sha512.b2dc20e2fc72b3e18848459b37359a32064663e5627a51e4c74b2c29dd8e8e0491483c3abb40789cfd578bf362fb6ba8261b05f0387d76792ed6e23ea3b1b6a0" } diff --git a/prisma/models/acteur.prisma b/prisma/models/acteur.prisma index b054d55..1cc0c01 100644 --- a/prisma/models/acteur.prisma +++ b/prisma/models/acteur.prisma @@ -31,11 +31,11 @@ model Acteur { slug String /// URL de la déclaration d'intérêt de l'acteur sur le site de la Haute Autorité pour la Transparence dans la Vie Publique. uriHatvp String? - /// Deputé en poste actuellement. + /// Acteur en poste actuellement. actif Boolean? @default(false) - /// Groupe parlementaire du député. + /// Groupe parlementaire de l'acteur, si présent. groupeParlementaireUid String? - /// Mandat principal du député, c'est à dire s'il est actif ou non. + /// Mandat principal de l'acteur. mandatPrincipalUid String? @unique /// Organe de circonscription circonscriptionUid String? @@ -45,7 +45,7 @@ model Acteur { commissionPermanenteRefUid String? /// URL de l'image de l'acteur urlImage String? - /// Chambre du parlementaire (assemblée ou sénat) + /// Chambre du parlementaire (Assemblée ou Sénat) chambre String? compteTwitter String? /// Nombre d'amendements pour cet acteur. @@ -71,7 +71,7 @@ model Acteur { adressesPostales AdressePostale[] amendements Amendement[] coSignataireAmendement CoSignataireAmendement[] - auteurs Auteur[] + auteurs AuteurDocument[] auteursMotion AuteurMotion[] coSignataireDocument CoSignataireDocument[] documents Document[] @@ -90,10 +90,9 @@ model Acteur { interventions Paragraphe[] /// Les dossiers de cet acteur. dossiers Dossier[] - vecteurRecherche Unsupported("tsvector")? @default(dbgenerated("to_tsvector('simple'::regconfig, ((immutable_unaccent((COALESCE(prenom, ''::text))::character varying) || ' '::text) || immutable_unaccent((COALESCE(nom, ''::text))::character varying)))")) - /// Statistiques d'activité agrégé par semaine. - statistiquesHebdomadaire StatistiqueHebdomadaire[] + statistiquesHebdomadaire StatistiqueHebdomadaire[] + vecteurRecherche Unsupported("tsvector")? @default(dbgenerated("to_tsvector('simple'::regconfig, ((immutable_unaccent((COALESCE((prenom)::text, ''::text))::character varying) || ' '::text) || immutable_unaccent((COALESCE((nom)::text, ''::text))::character varying)))")) @@unique([prenom, nom, dateNais]) @@index([dataset]) diff --git a/prisma/models/agenda.prisma b/prisma/models/agenda.prisma index f7532f9..9311f4c 100644 --- a/prisma/models/agenda.prisma +++ b/prisma/models/agenda.prisma @@ -87,6 +87,7 @@ model Agenda { @@index([organeReunionRefUid]) @@index([compteRenduRefUid]) @@index([dateSeance]) + @@index([embedding]) } /// Point de l'ordre du jour. diff --git a/prisma/models/amendement.prisma b/prisma/models/amendement.prisma index 7cc2ba2..c6c4b46 100644 --- a/prisma/models/amendement.prisma +++ b/prisma/models/amendement.prisma @@ -111,6 +111,8 @@ model Amendement { dispositifHtml String? /// Nombre de co-signataires nombreCoSignataires Int @default(0) + /// Identifiant de l'organe qui examine l'amendement + organeRefUid String? /// Identifiant du dossier de loi lié à l'amendement dossierRefUid String? /// Identifiant unique du texte législatif (document) visé par l'amendement. @@ -122,13 +124,14 @@ model Amendement { vecteurRecherche Unsupported("tsvector")? @default(dbgenerated("to_tsvector('french'::regconfig, ((((immutable_unaccent((COALESCE(dispositif, ''::text))::character varying) || ' '::text) || immutable_unaccent((COALESCE(\"exposeSommaire\", ''::text))::character varying)) || ' '::text) || immutable_unaccent((COALESCE(\"divisionArticleDesignationCourte\", ''::text))::character varying)))")) embedding Unsupported("vector(1536)")? + organeRef Organe? @relation("Amendement_Organe", fields: [organeRefUid], references: [uid]) texteLegislatifRef Document? @relation(fields: [texteLegislatifRefUid], references: [uid]) dossierRef Dossier? @relation(fields: [dossierRefUid], references: [uid]) acteurRef Acteur? @relation(fields: [acteurRefUid], references: [uid]) scrutinRef Scrutin? @relation(fields: [scrutinRefUid], references: [uid]) amendementParentRef Amendement? @relation("amendementParentRef", fields: [amendementParentRefUid], references: [uid], onDelete: Restrict, onUpdate: Restrict) sousAmendements Amendement[] @relation("amendementParentRef") - auteurRapporteurOrganeRef Organe? @relation("Amendement_Organe", fields: [auteurRapporteurOrganeRefUid], references: [uid]) + auteurRapporteurOrganeRef Organe? @relation("Amendement_Organe_Rapporteur", fields: [auteurRapporteurOrganeRefUid], references: [uid]) gouvernementOrganeRef Organe? @relation("Amendement_Gouvernement", fields: [gouvernementOrganeRefUid], references: [uid]) groupePolitiqueRef Organe? @relation("Amendement_GroupePolitique", fields: [groupePolitiqueRefUid], references: [uid]) seanceRef Agenda? @relation(fields: [seanceRefUid], references: [uid]) @@ -139,6 +142,7 @@ model Amendement { @@index([vecteurRecherche], type: Gin) @@index([acteurRefUid]) @@index([seanceRefUid]) + @@index([organeRefUid]) @@index([scrutinRefUid]) @@index([dossierRefUid]) @@index([texteLegislatifRefUid]) @@ -148,6 +152,7 @@ model Amendement { @@index([groupePolitiqueRefUid]) @@index([dateDepot]) @@index([subdivisionRefHash]) + @@index([embedding]) } model CoSignataireAmendement { diff --git a/prisma/models/debat.prisma b/prisma/models/debat.prisma index b8713f6..7a94038 100644 --- a/prisma/models/debat.prisma +++ b/prisma/models/debat.prisma @@ -11,6 +11,7 @@ model Debat { legislature String reunionRefUid String? sessionRef String + /// Date du débat dateSeance DateTime? dateSeanceJour String numSeance String @@ -54,9 +55,10 @@ model SommaireDebat { @@index([debatRefUid]) } +/// Intervention dans un débat model Paragraphe { - id Int @id @default(autoincrement()) - dateMaj DateTime @default(now()) @updatedAt + id Int @id @default(autoincrement()) + dateMaj DateTime @default(now()) @updatedAt /// Jeu de données de provenance (numéro de législature) dataset Int /// Chambre de provenance (AN, SN ou CG) @@ -80,6 +82,7 @@ model Paragraphe { ordinalPrise Int? ordreAbsoluSeance Int? roleDebat String? + estPresident Boolean sommaire String? ssadt String? structure String? @@ -92,14 +95,15 @@ model Paragraphe { dossierRefUid String? texteRefUid String? pointOdjRefUid String? - vecteurRecherche Unsupported("tsvector")? @default(dbgenerated("to_tsvector('french'::regconfig, immutable_unaccent((COALESCE(texte, ''::text))::character varying))")) - embedding Unsupported("vector(1536)")? - acteurRef Acteur? @relation(fields: [acteurRefUid], references: [uid]) - mandatRef Mandat? @relation(fields: [mandatRefUid], references: [uid]) - debatRef Debat @relation(fields: [debatRefUid], references: [uid]) - dossierRef Dossier? @relation(fields: [dossierRefUid], references: [uid]) - texteRef Document? @relation(fields: [texteRefUid], references: [uid]) - pointOdjRef PointOdj? @relation(fields: [pointOdjRefUid], references: [uid]) + + vecteurRecherche Unsupported("tsvector")? @default(dbgenerated("to_tsvector('french'::regconfig, immutable_unaccent((COALESCE(texte, ''::text))::character varying))")) + embedding Unsupported("vector(1536)")? + acteurRef Acteur? @relation(fields: [acteurRefUid], references: [uid]) + mandatRef Mandat? @relation(fields: [mandatRefUid], references: [uid]) + debatRef Debat @relation(fields: [debatRefUid], references: [uid]) + dossierRef Dossier? @relation(fields: [dossierRefUid], references: [uid]) + texteRef Document? @relation(fields: [texteRefUid], references: [uid]) + pointOdjRef PointOdj? @relation(fields: [pointOdjRefUid], references: [uid]) @@index([dataset]) @@index([vecteurRecherche], type: Gin) @@ -110,4 +114,6 @@ model Paragraphe { @@index([texteRefUid]) @@index([pointOdjRefUid]) @@index([dateSeance]) + @@index([estPresident]) + @@index([embedding]) } diff --git a/prisma/models/document.prisma b/prisma/models/document.prisma index 18372f8..64a0208 100644 --- a/prisma/models/document.prisma +++ b/prisma/models/document.prisma @@ -1,4 +1,6 @@ model Document { + /// Identifiant unique du document. + uid String @id dateMaj DateTime @default(now()) @updatedAt /// Jeu de données de provenance (numéro de législature) dataset Int @@ -10,8 +12,6 @@ model Document { titrePrincipal String /// Version abrégée du titre du document. Dans le cas d'un projet ou d'une proposition de loi il peut être ambigu. titrePrincipalCourt String - /// Identifiant unique du document. - uid String @id /// Code unique pour traitement automatisé. classeCode String /// Signification du code. @@ -35,13 +35,13 @@ model Document { niveauCorrection String? typeCorrection String? /// Date de création du document. - dateCreation DateTime? + dateCreation DateTime? @db.Date /// Toujours identique à la date de création. - dateDepot DateTime? + dateDepot DateTime? @db.Date /// Le contenu de ce champ n'est pas défini. - datePublication DateTime? + datePublication DateTime? @db.Date /// Date de première publication sur http://assemblee-nationale.fr. - datePublicationWeb DateTime? + datePublicationWeb DateTime? @db.Date /// Le contenu de ce champ n'est pas défini. denominationStructurelle String /// Détermine si le texte est susceptible d'être amendé lors d'une séance publique. Vaut true si le texte peut être amendé, false sinon. @@ -84,10 +84,12 @@ model Document { documentParentRef Document? @relation("DocumentParentRef", fields: [documentParentRefUid], references: [uid], onDelete: Restrict, onUpdate: Restrict) sousDocuments Document? @relation("DocumentParentRef") scrutins Scrutin[] + /// Amendements liés au document amendements Amendement[] - amendementsCommission AmendementCommission[] + /// Organes qui peuvent amender le document + organesAmendements OrganeDocumentAmendement[] actesLegislatifs ActeLegislatif[] - auteurs Auteur[] + auteurs AuteurDocument[] coSignataires CoSignataireDocument[] etudesPlf EtudePlf[] interventions Paragraphe[] @@ -101,9 +103,10 @@ model Document { @@index([organeRefUid]) @@index([documentParentRefUid]) @@index([dateCreation]) + @@index([embedding]) } -model Auteur { +model AuteurDocument { /// Identifiant unique. id Int @id @default(autoincrement()) dateMaj DateTime @default(now()) @updatedAt @@ -159,16 +162,17 @@ model CoSignataireDocument { @@index([documentRefUid]) } -model AmendementCommission { +/// Un organe qui peut amender un document +model OrganeDocumentAmendement { /// Identifiant unique. id Int @id @default(autoincrement()) dateMaj DateTime @default(now()) @updatedAt /// Jeu de données de provenance (numéro de législature) dataset Int - /// Identifiant unique (uid) de l'organe correspondant au groupe politique. - organeRefUid String? /// Toujours égal à true. amendable Boolean? + /// Identifiant unique (uid) de l'organe + organeRefUid String? /// Identifiant unique (uid) du document. documentRefUid String? documentRef Document? @relation(fields: [documentRefUid], references: [uid]) @@ -181,12 +185,11 @@ model AmendementCommission { model Subdivision { /// Identifiant unique. - hash String @id + hash String @id /// Jeu de données de provenance (numéro de législature) dataset Int /// Identifiant unique (uid) du document. documentRefUid String? - documentRef Document? @relation(fields: [documentRefUid], references: [uid]) /// Type de division. type String? /// Identifiant de la division. @@ -206,10 +209,10 @@ model Subdivision { /// Ordre de la division dans le document. sequence Int? /// Le nombre d'amendements liés à cette subdivision. - nombreAmendements Int @default(0) - - embedding Unsupported("vector(1536)")? + nombreAmendements Int @default(0) + embedding Unsupported("vector(1536)")? + documentRef Document? @relation(fields: [documentRefUid], references: [uid]) alineas Alinea[] scrutins Scrutin[] /// Amendements liés à cette subdivision. @@ -217,6 +220,22 @@ model Subdivision { @@index([dataset]) @@index([documentRefUid]) + @@index([embedding]) +} + +enum SubdivisionType { + Tome + Partie + Livre + Titre + SousTitre + Chapitre + Section + SousSection + Paragraphe + Article + ExposeMotifs + Annexe } /// Alinéa d'un texte de loi. diff --git a/prisma/models/dossier.prisma b/prisma/models/dossier.prisma index b30fbfc..150893b 100644 --- a/prisma/models/dossier.prisma +++ b/prisma/models/dossier.prisma @@ -51,6 +51,10 @@ model Dossier { commissionSNRefUid String? /// Identifiant unique (uid) de l'acteur. acteurPrincipalRefUid String? + /// L'exposé des motifs du document déposé au format HTML (si présent). + exposeMotifsHtml String? + /// L'exposé des motifs du document déposé au format texte (si présent). + exposeMotifsTexte String? vecteurRecherche Unsupported("tsvector")? @default(dbgenerated("to_tsvector('french'::regconfig, ((immutable_unaccent((COALESCE(titre, ''::text))::character varying) || ' '::text) || immutable_unaccent((COALESCE(numero, ''::text))::character varying)))")) embedding Unsupported("vector(1536)")? @@ -70,14 +74,8 @@ model Dossier { paragraphes Paragraphe[] // themes themes DossierThemes[] - - /// L'exposé des motifs du document au format HTML (si présent). - exposeMotifsHtml String? - /// L'exposé des motifs du document au format texte (si présent). - exposeMotifsTexte String? - - /// Tous les scrutins d'un Dossier. - scrutins Scrutin[] + /// Scrutins liés au dossier. + scrutins Scrutin[] @@index([dataset]) @@index([vecteurRecherche], type: Gin) @@ -88,6 +86,7 @@ model Dossier { @@index([dateDernierActe]) @@index([commissionANRefUid]) @@index([commissionSNRefUid]) + @@index([embedding]) } model ActeLegislatif { @@ -98,6 +97,8 @@ model ActeLegislatif { dataset Int /// Chambre parente du document (AN, SN, ou CG) chambre String? + /// Numéro de la législature. + legislature String? /// Identifiant de l'acte législatif parent. parentUid String? /// Code de l'acte législatif dont la valeur dépend de sa place dans la hiérarchie. diff --git a/prisma/models/mandat.prisma b/prisma/models/mandat.prisma index fb4e593..94b17fc 100644 --- a/prisma/models/mandat.prisma +++ b/prisma/models/mandat.prisma @@ -14,16 +14,23 @@ model Mandat { typeOrgane String /// Vrai si le mandat est en cours actif Boolean? + /// Date de début du mandat dateDebut DateTime + /// Date de publication du mandat datePublication DateTime? + /// Date de fin du mandat dateFin DateTime? + /// Cause de début du mandat + causeMandat String? + /// Cause de fin du mandat + causeFin String? preseance String? - nominPrincipale String + /// Vrai si le mandat est la nomination principale (parce exemple, président d'un groupe) + nominPrincipale Boolean codeQualite String? libQualite String libQualiteSex String? libelle String? - causeMandat String? refCirconscription String? region String? regionType String? @@ -32,7 +39,6 @@ model Mandat { numCirco String? datePriseFonction DateTime? premiereElection String? - causeFin String? placeHemicycle String? xsiType String? mandatRemplaceRefUid String? @unique diff --git a/prisma/models/organe.prisma b/prisma/models/organe.prisma index 65c1fe4..94adc14 100644 --- a/prisma/models/organe.prisma +++ b/prisma/models/organe.prisma @@ -1,8 +1,8 @@ /// Il contribue au fonctionnement de l'Etat (par exemple l'Assemblée nationale ou une Délégation parlementaire) model Organe { /// Identifiant unique. - uid String @id - dateMaj DateTime @default(now()) @updatedAt + uid String @id + dateMaj DateTime @default(now()) @updatedAt /// Jeu de données de provenance (numéro de législature) dataset Int codeType String @@ -19,67 +19,71 @@ model Organe { /// Chambre parente de l'organe (Assemblée ou Sénat) chambre String? /// Vrai si l'organe est en cours d'agrément. - actif Boolean? @default(false) + actif Boolean? @default(false) legislature String? secretaire01 String? secretaire02 String? regimeJuridique String? siteInternet String? nombreReunionsAnnuelles Int? - nombreMembres Int? @default(0) + nombreMembres Int? @default(0) /// Nombre de textes de lois déposées. - nombreTextesLoisDeposes Int @default(0) + nombreTextesLoisDeposes Int @default(0) /// Nombre d'amendements proposés. - nombreAmendementsProposes Int @default(0) + nombreAmendementsProposes Int @default(0) /// Nombre d'interventions en hémicycle. - nombreInterventions Int @default(0) + nombreInterventions Int @default(0) /// Nombre de questions. - nombreQuestions Int @default(0) + nombreQuestions Int @default(0) /// Taux de cohésion du groupe. - cohesion Int @default(0) + cohesion Int @default(0) /// Nombre d'auditions réalisées. - auditionsRealisees Int @default(0) + auditionsRealisees Int @default(0) /// Nombre de rapports publiés. - rapportsPublies Int @default(0) + rapportsPublies Int @default(0) /// Nombre de missions démarrées. - missionsDemarrees Int @default(0) + missionsDemarrees Int @default(0) /// Nombre de dossiers de loi traités. - dossiersLoiTraites Int @default(0) + dossiersLoiTraites Int @default(0) positionPolitique String? preseance String? couleurAssociee String? - dateDebut DateTime? @db.Date - dateAgrement DateTime? @db.Date - dateFin DateTime? @db.Date + dateDebut DateTime? @db.Date + dateAgrement DateTime? @db.Date + dateFin DateTime? @db.Date /// URL de l'image de l'organe urlImage String? xsiType String? - vecteurRecherche Unsupported("tsvector")? @default(dbgenerated("to_tsvector('french'::regconfig, immutable_unaccent((COALESCE(libelle, ''::text))::character varying))")) + vecteurRecherche Unsupported("tsvector")? @default(dbgenerated("to_tsvector('french'::regconfig, immutable_unaccent((COALESCE(libelle, ''::text))::character varying))")) /// Acteurs faisant parti de cette commission permanente, si cet organe est une commission. acteursCommissionPermanente Acteur[] - reunionsDemandees Agenda[] @relation("OrganeDemandeur") - reunions Agenda[] @relation("OrganeReunion") - amendementsOrgane Amendement[] @relation("Amendement_Organe") - amendementsGouvernementOrgane Amendement[] @relation("Amendement_Gouvernement") - amendementsGroupePolitique Amendement[] @relation("Amendement_GroupePolitique") - amendementsCommission AmendementCommission[] + reunionsDemandees Agenda[] @relation("OrganeDemandeur") + reunions Agenda[] @relation("OrganeReunion") + /// Amendements examninés par l'organe + amendements Amendement[] @relation("Amendement_Organe") + amendementsRapporteurOrgane Amendement[] @relation("Amendement_Organe_Rapporteur") + amendementsGouvernementOrgane Amendement[] @relation("Amendement_Gouvernement") + /// Amendements liés à l'organe s'il s'agit d'un groupe politique + amendementsGroupePolitique Amendement[] @relation("Amendement_GroupePolitique") + /// Documents qui peuvent être amendés par l'organe + documentsAmendables OrganeDocumentAmendement[] mandats Mandat[] - auteurs Auteur[] + auteurs AuteurDocument[] coSignataires CoSignataireDocument[] - dossiers Dossier[] @relation("OrganeMission") + dossiers Dossier[] @relation("OrganeMission") documents Document[] etudesPlf EtudePlf[] groupesVotants GroupeVotant[] - organeParentRef Organe? @relation("OrganeParentRef", fields: [organeParentRefUid], references: [uid], onDelete: Restrict, onUpdate: Restrict) - organeEnfants Organe[] @relation("OrganeParentRef") - questionsGroupe Question[] @relation("Question_Groupe") - questionsMinInt Question[] @relation("Question_MinInt") + organeParentRef Organe? @relation("OrganeParentRef", fields: [organeParentRefUid], references: [uid], onDelete: Restrict, onUpdate: Restrict) + organeEnfants Organe[] @relation("OrganeParentRef") + questionsGroupe Question[] @relation("Question_Groupe") + questionsMinInt Question[] @relation("Question_MinInt") scrutins Scrutin[] - membresGroupeParlementaire Acteur[] @relation("Acteur_GroupeParlementaire") - parlementairesCirconscription Acteur[] @relation("Acteur_Circonscription") + membresGroupeParlementaire Acteur[] @relation("Acteur_GroupeParlementaire") + parlementairesCirconscription Acteur[] @relation("Acteur_Circonscription") communes Commune[] - dossiersCommissionsAN Dossier[] @relation("OrganeANCommission") - dossiersCommissionsSN Dossier[] @relation("OrganeSNCommission") + dossiersCommissionsAN Dossier[] @relation("OrganeANCommission") + dossiersCommissionsSN Dossier[] @relation("OrganeSNCommission") @@index([dataset]) @@index([vecteurRecherche], type: Gin) diff --git a/prisma/models/question.prisma b/prisma/models/question.prisma index 1f581c0..5d906dd 100644 --- a/prisma/models/question.prisma +++ b/prisma/models/question.prisma @@ -1,45 +1,51 @@ /// Questions écrites ou question au gouvernement posées par les députés. model Question { /// Identifiant unique. - uid String @id - dateMaj DateTime @default(now()) @updatedAt + uid String @id + dateMaj DateTime @default(now()) @updatedAt /// Jeu de données de provenance (numéro de législature) - dataset Int - legislature String + dataset Int + legislature String /// Chambre de provenance (AN, SN ou CG) - chambre String? - numero String - regime String - rubrique String? - type QuestionType + chambre String? + regime String + /// Numéro de la question + numero String + /// Rubrique de la question + rubrique String? + type QuestionType /// Identifiant unique de l'auteur de la question. - acteurRefUid String + acteurRefUid String /// Identifiant unique du mandat de l'auteur. - mandatRefUid String? + mandatRefUid String? /// Identifiant unique du groupe politique de l'auteur - groupeRefUid String + groupeRefUid String /// Identifiant unique du ministère interrogé. - minIntRefUid String? - codeCloture ClotureCode? - libelleCloture String? + minIntRefUid String? + codeCloture ClotureCode? + libelleCloture String? /// Date de dépôt de la question - dateDepot DateTime? - dateCloture DateTime? - dateDepotSignal DateTime? + dateDepot DateTime? + dateCloture DateTime? + dateDepotSignal DateTime? /// Titre de la question - titre String? + titre String? /// Contenu texte de la question. - texteQuestion String? + texteQuestion String? /// Contenu texte de la réponse à la question - texteReponse String? - erratumQuestion String? - erratumReponse String? - vecteurRecherche Unsupported("tsvector")? @default(dbgenerated("to_tsvector('french'::regconfig, ((((immutable_unaccent((COALESCE(titre, ''::text))::character varying) || ' '::text) || immutable_unaccent((COALESCE(\"texteQuestion\", ''::text))::character varying)) || ' '::text) || immutable_unaccent((COALESCE(\"texteReponse\", ''::text))::character varying)))")) - embedding Unsupported("vector(1536)")? - acteurRef Acteur @relation(fields: [acteurRefUid], references: [uid]) - groupeRef Organe @relation("Question_Groupe", fields: [groupeRefUid], references: [uid]) - mandatRef Mandat? @relation(fields: [mandatRefUid], references: [uid]) - minIntRef Organe? @relation("Question_MinInt", fields: [minIntRefUid], references: [uid]) + texteReponse String? + /// Contenu nettoyé de la question (sans balises HTML). + texteQuestionNettoye String? + /// Contenu nettoyé de la réponse (sans balises HTML). + texteReponseNettoye String? + erratumQuestion String? + erratumReponse String? + vecteurRecherche Unsupported("tsvector")? @default(dbgenerated("to_tsvector('french'::regconfig, ((((immutable_unaccent((COALESCE(titre, ''::text))::character varying) || ' '::text) || immutable_unaccent((COALESCE(\"texteQuestion\", ''::text))::character varying)) || ' '::text) || immutable_unaccent((COALESCE(\"texteReponse\", ''::text))::character varying)))")) + embedding Unsupported("vector(1536)")? + acteurRef Acteur @relation(fields: [acteurRefUid], references: [uid]) + groupeRef Organe @relation("Question_Groupe", fields: [groupeRefUid], references: [uid]) + mandatRef Mandat? @relation(fields: [mandatRefUid], references: [uid]) + minIntRef Organe? @relation("Question_MinInt", fields: [minIntRefUid], references: [uid]) @@index([dataset]) @@index([vecteurRecherche], type: Gin) @@ -48,6 +54,7 @@ model Question { @@index([mandatRefUid]) @@index([minIntRefUid]) @@index([dateDepot]) + @@index([embedding]) } enum QuestionType { diff --git a/prisma/models/stats.prisma b/prisma/models/stats.prisma index 8764125..d42f688 100644 --- a/prisma/models/stats.prisma +++ b/prisma/models/stats.prisma @@ -1,60 +1,45 @@ model Stats { + /// Identifiant unique + id String @id /// Chambre du parlementaire (e.g.: AN = assemblée, SN = sénat) - chambre String - + chambre String + /// Législature de ces statistiques. + legislature String + /// Objet de l'activité mesurée + type StatsType + /// Mesure de l'activité + mesure String? /// L'écart entre l'écart minimum et maximum. - ecartMinMax Int @default(0) - + ecartMinMax Int @default(0) /// L'écart entre la moyenne et la valeur maximum. - ecartMoyenneMax Int @default(0) - + ecartMoyenneMax Int @default(0) /// L'écart entre la moyenne et la valeur minimum. - ecartMoyenneMin Int @default(0) - + ecartMoyenneMin Int @default(0) /// L'écart entre la moyenne minimum et la moyenne maximum. - ecartMoyenneMinMax Int @default(0) - - /// Id de ces statistiques. - id String @id - - /// La législature de ces statistiques. - legislature String - - /// La valeur maximum. - maximum Int @default(0) - - /// La valeur minimum. - minimum Int @default(0) - - /// La moyenne des valeurs de ces statistiques. - moyenne Int @default(0) - + ecartMoyenneMinMax Int @default(0) + /// La valeur maximum + maximum Int @default(0) + /// La valeur minimum + minimum Int @default(0) + /// La moyenne des valeurs de ces statistiques + moyenne Int @default(0) /// Le quantile a 20% - q20 Int @default(0) - + q20 Int @default(0) /// Le quantile a 40% - q40 Int @default(0) - + q40 Int @default(0) /// Le quantile a 60% - q60 Int @default(0) - + q60 Int @default(0) /// Le quantile a 80% - q80 Int @default(0) - + q80 Int @default(0) /// Le quantile a 100% (max) - q100 Int @default(0) - - /// L'activité mesurée - type StatsType + q100 Int @default(0) } enum StatsType { /// Stats pour les acteurs. ACTEUR - /// Stats pour les commissions. COMPER - /// Stats pour les groupes politiques. GPE } diff --git a/prisma/swagger/json-schema.json b/prisma/swagger/json-schema.json index 447fc44..b1cfe89 100644 --- a/prisma/swagger/json-schema.json +++ b/prisma/swagger/json-schema.json @@ -108,7 +108,7 @@ "null" ], "default": false, - "description": "Deputé en poste actuellement." + "description": "Acteur en poste actuellement." }, "placeHemicycle": { "type": [ @@ -129,7 +129,7 @@ "string", "null" ], - "description": "Chambre du parlementaire (assemblée ou sénat)" + "description": "Chambre du parlementaire (Assemblée ou Sénat)" }, "compteTwitter": { "type": [ @@ -248,7 +248,7 @@ "auteurs": { "type": "array", "items": { - "$ref": "#/definitions/Auteur" + "$ref": "#/definitions/AuteurDocument" } }, "auteursMotion": { @@ -1573,6 +1573,16 @@ "default": 0, "description": "Nombre de co-signataires" }, + "organeRef": { + "anyOf": [ + { + "$ref": "#/definitions/Organe" + }, + { + "type": "null" + } + ] + }, "texteLegislatifRef": { "anyOf": [ { @@ -1862,7 +1872,8 @@ "string", "null" ], - "format": "date-time" + "format": "date-time", + "description": "Date du débat" }, "dateSeanceJour": { "type": "string" @@ -2094,6 +2105,9 @@ "null" ] }, + "estPresident": { + "type": "boolean" + }, "sommaire": { "type": [ "string", @@ -2200,6 +2214,10 @@ "Document": { "type": "object", "properties": { + "uid": { + "type": "string", + "description": "Identifiant unique du document." + }, "dateMaj": { "type": "string", "format": "date-time" @@ -2230,10 +2248,6 @@ "type": "string", "description": "Version abrégée du titre du document. Dans le cas d'un projet ou d'une proposition de loi il peut être ambigu." }, - "uid": { - "type": "string", - "description": "Identifiant unique du document." - }, "classeCode": { "type": "string", "description": "Code unique pour traitement automatisé." @@ -2499,13 +2513,15 @@ "type": "array", "items": { "$ref": "#/definitions/Amendement" - } + }, + "description": "Amendements liés au document" }, - "amendementsCommission": { + "organesAmendements": { "type": "array", "items": { - "$ref": "#/definitions/AmendementCommission" - } + "$ref": "#/definitions/OrganeDocumentAmendement" + }, + "description": "Organes qui peuvent amender le document" }, "actesLegislatifs": { "type": "array", @@ -2516,7 +2532,7 @@ "auteurs": { "type": "array", "items": { - "$ref": "#/definitions/Auteur" + "$ref": "#/definitions/AuteurDocument" } }, "coSignataires": { @@ -2551,7 +2567,7 @@ } } }, - "Auteur": { + "AuteurDocument": { "type": "object", "properties": { "id": { @@ -2679,7 +2695,7 @@ } } }, - "AmendementCommission": { + "OrganeDocumentAmendement": { "type": "object", "properties": { "id": { @@ -2734,16 +2750,6 @@ "type": "integer", "description": "Jeu de données de provenance (numéro de législature)" }, - "documentRef": { - "anyOf": [ - { - "$ref": "#/definitions/Document" - }, - { - "type": "null" - } - ] - }, "type": { "type": [ "string", @@ -2812,6 +2818,16 @@ "default": 0, "description": "Le nombre d'amendements liés à cette subdivision." }, + "documentRef": { + "anyOf": [ + { + "$ref": "#/definitions/Document" + }, + { + "type": "null" + } + ] + }, "alineas": { "type": "array", "items": { @@ -3000,6 +3016,20 @@ ], "description": "Le dossier parlementaire est lié à un autre. Si la cause est un 'Examen commun', les deux dossiers continuent d'évoluer indépendament. Par exemple une mission d'information peut être liée au dossier parlementaire qui représente le rapport produit par cette mission. Si la cause est 'Dossier absorbé', il devient obsolete et le dossier absorbant prend la suite. Par exemple, lorsqu'une loi ordinaire devient une loi organique, un nouveau dossier parlementaire est constitué, l'intégralité du dossier absorbé est copié dans le nouveau dossier." }, + "exposeMotifsHtml": { + "type": [ + "string", + "null" + ], + "description": "L'exposé des motifs du document déposé au format HTML (si présent)." + }, + "exposeMotifsTexte": { + "type": [ + "string", + "null" + ], + "description": "L'exposé des motifs du document déposé au format texte (si présent)." + }, "acteurPrincipalRef": { "anyOf": [ { @@ -3108,26 +3138,12 @@ "$ref": "#/definitions/DossierThemes" } }, - "exposeMotifsHtml": { - "type": [ - "string", - "null" - ], - "description": "L'exposé des motifs du document au format HTML (si présent)." - }, - "exposeMotifsTexte": { - "type": [ - "string", - "null" - ], - "description": "L'exposé des motifs du document au format texte (si présent)." - }, "scrutins": { "type": "array", "items": { "$ref": "#/definitions/Scrutin" }, - "description": "Tous les scrutins d'un Dossier." + "description": "Scrutins liés au dossier." } } }, @@ -3153,6 +3169,13 @@ ], "description": "Chambre parente du document (AN, SN, ou CG)" }, + "legislature": { + "type": [ + "string", + "null" + ], + "description": "Numéro de la législature." + }, "parentUid": { "type": [ "string", @@ -3988,21 +4011,38 @@ }, "dateDebut": { "type": "string", - "format": "date-time" + "format": "date-time", + "description": "Date de début du mandat" }, "datePublication": { "type": [ "string", "null" ], - "format": "date-time" + "format": "date-time", + "description": "Date de publication du mandat" }, "dateFin": { "type": [ "string", "null" ], - "format": "date-time" + "format": "date-time", + "description": "Date de fin du mandat" + }, + "causeMandat": { + "type": [ + "string", + "null" + ], + "description": "Cause de début du mandat" + }, + "causeFin": { + "type": [ + "string", + "null" + ], + "description": "Cause de fin du mandat" }, "preseance": { "type": [ @@ -4011,7 +4051,8 @@ ] }, "nominPrincipale": { - "type": "string" + "type": "boolean", + "description": "Vrai si le mandat est la nomination principale (parce exemple, président d'un groupe)" }, "codeQualite": { "type": [ @@ -4034,12 +4075,6 @@ "null" ] }, - "causeMandat": { - "type": [ - "string", - "null" - ] - }, "refCirconscription": { "type": [ "string", @@ -4089,12 +4124,6 @@ "null" ] }, - "causeFin": { - "type": [ - "string", - "null" - ] - }, "placeHemicycle": { "type": [ "string", @@ -4516,7 +4545,14 @@ "$ref": "#/definitions/Agenda" } }, - "amendementsOrgane": { + "amendements": { + "type": "array", + "items": { + "$ref": "#/definitions/Amendement" + }, + "description": "Amendements examninés par l'organe" + }, + "amendementsRapporteurOrgane": { "type": "array", "items": { "$ref": "#/definitions/Amendement" @@ -4532,13 +4568,15 @@ "type": "array", "items": { "$ref": "#/definitions/Amendement" - } + }, + "description": "Amendements liés à l'organe s'il s'agit d'un groupe politique" }, - "amendementsCommission": { + "documentsAmendables": { "type": "array", "items": { - "$ref": "#/definitions/AmendementCommission" - } + "$ref": "#/definitions/OrganeDocumentAmendement" + }, + "description": "Documents qui peuvent être amendés par l'organe" }, "mandats": { "type": "array", @@ -4549,7 +4587,7 @@ "auteurs": { "type": "array", "items": { - "$ref": "#/definitions/Auteur" + "$ref": "#/definitions/AuteurDocument" } }, "coSignataires": { @@ -4673,17 +4711,19 @@ ], "description": "Chambre de provenance (AN, SN ou CG)" }, - "numero": { - "type": "string" - }, "regime": { "type": "string" }, + "numero": { + "type": "string", + "description": "Numéro de la question" + }, "rubrique": { "type": [ "string", "null" - ] + ], + "description": "Rubrique de la question" }, "type": { "type": "string", @@ -4758,6 +4798,20 @@ ], "description": "Contenu texte de la réponse à la question" }, + "texteQuestionNettoye": { + "type": [ + "string", + "null" + ], + "description": "Contenu nettoyé de la question (sans balises HTML)." + }, + "texteReponseNettoye": { + "type": [ + "string", + "null" + ], + "description": "Contenu nettoyé de la réponse (sans balises HTML)." + }, "erratumQuestion": { "type": [ "string", @@ -5395,10 +5449,34 @@ "Stats": { "type": "object", "properties": { + "id": { + "type": "string", + "description": "Identifiant unique" + }, "chambre": { "type": "string", "description": "Chambre du parlementaire (e.g.: AN = assemblée, SN = sénat)" }, + "legislature": { + "type": "string", + "description": "Législature de ces statistiques." + }, + "type": { + "type": "string", + "enum": [ + "ACTEUR", + "COMPER", + "GPE" + ], + "description": "Objet de l'activité mesurée" + }, + "mesure": { + "type": [ + "string", + "null" + ], + "description": "Mesure de l'activité" + }, "ecartMinMax": { "type": "integer", "default": 0, @@ -5419,28 +5497,20 @@ "default": 0, "description": "L'écart entre la moyenne minimum et la moyenne maximum." }, - "id": { - "type": "string", - "description": "Id de ces statistiques." - }, - "legislature": { - "type": "string", - "description": "La législature de ces statistiques." - }, "maximum": { "type": "integer", "default": 0, - "description": "La valeur maximum." + "description": "La valeur maximum" }, "minimum": { "type": "integer", "default": 0, - "description": "La valeur minimum." + "description": "La valeur minimum" }, "moyenne": { "type": "integer", "default": 0, - "description": "La moyenne des valeurs de ces statistiques." + "description": "La moyenne des valeurs de ces statistiques" }, "q20": { "type": "integer", @@ -5466,15 +5536,6 @@ "type": "integer", "default": 0, "description": "Le quantile a 100% (max)" - }, - "type": { - "type": "string", - "enum": [ - "ACTEUR", - "COMPER", - "GPE" - ], - "description": "L'activité mesurée" } } } @@ -5532,14 +5593,14 @@ "document": { "$ref": "#/definitions/Document" }, - "auteur": { - "$ref": "#/definitions/Auteur" + "auteurDocument": { + "$ref": "#/definitions/AuteurDocument" }, "coSignataireDocument": { "$ref": "#/definitions/CoSignataireDocument" }, - "amendementCommission": { - "$ref": "#/definitions/AmendementCommission" + "organeDocumentAmendement": { + "$ref": "#/definitions/OrganeDocumentAmendement" }, "subdivision": { "$ref": "#/definitions/Subdivision"