diff --git a/package-lock.json b/package-lock.json index 5cdb17fb2a61c1ed770b62da825ce2adba66ee23..f0827a8c4dd7b44c5f3a68e5278730d5cc0dc135 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "lint-staged": "^15.2.2", "semantic-release": "^23.0.8", "semantic-release-mattermost": "^1.2.1", - "typescript": "5.4.5", + "typescript": "^5.6.2", "vue": "3.4.26" }, "engines": { @@ -29792,9 +29792,9 @@ } }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", + "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -31863,7 +31863,7 @@ "eslint-plugin-promise": "^6.1.1", "eslint-plugin-sql": "^2.5.0", "supertest": "^7.0.0", - "typescript": "^5.4.5", + "typescript": "^5.6.2", "vitest": "^2.0.5" } }, @@ -32192,7 +32192,7 @@ "@typescript-eslint/parser": "^7.12.0", "@vitest/coverage-v8": "^2.0.5", "prettier": "^3.2.5", - "typescript": "^5.4.5", + "typescript": "^5.6.2", "vitest": "^2.0.5" } }, @@ -32578,7 +32578,7 @@ "storybook": "^8.2.9", "ts-node": "^10.9.2", "tus-js-client": "^4.1.0", - "typescript": "^5.4.5", + "typescript": "^5.6.2", "typescript-plugin-css-modules": "^5.1.0", "vite": "^5.2.10", "vitest": "^2.0.5", diff --git a/package.json b/package.json index 8636f5f4860c6d7ec5f3e3bf1cdefce9cd702cc1..f644f3ddf886812c98929aa7e192a0734e3a9119 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,11 @@ "npm": ">=10.7.0" }, "description": "Le cadastre minier numérique ouvert", - "workspaces": ["packages/api", "packages/common", "packages/ui"], + "workspaces": [ + "packages/api", + "packages/common", + "packages/ui" + ], "private": true, "repository": { "type": "git", @@ -56,11 +60,13 @@ "lint-staged": "^15.2.2", "semantic-release": "^23.0.8", "semantic-release-mattermost": "^1.2.1", - "vue": "3.4.26", - "typescript": "5.4.5" + "typescript": "^5.6.2", + "vue": "3.4.26" }, "release": { - "branches": ["prod"], + "branches": [ + "prod" + ], "plugins": [ "@semantic-release/commit-analyzer", "@semantic-release/release-notes-generator", diff --git a/packages/api/package.json b/packages/api/package.json index b8d1995b3e3922ae13bdf754225fb917696931bf..25070e3a0c7a3d7d5397f886997db15eeaafea15 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -115,7 +115,7 @@ "eslint-plugin-promise": "^6.1.1", "eslint-plugin-sql": "^2.5.0", "supertest": "^7.0.0", - "typescript": "^5.4.5", + "typescript": "^5.6.2", "vitest": "^2.0.5" }, "prettier": { diff --git a/packages/api/src/api/rest/statistiques/dgtm.ts b/packages/api/src/api/rest/statistiques/dgtm.ts index ec96294bcd61ec117e4c750332e6c9cfb556c711..f3b9feabbbb507c5ffa1381fce6de4112b86501c 100644 --- a/packages/api/src/api/rest/statistiques/dgtm.ts +++ b/packages/api/src/api/rest/statistiques/dgtm.ts @@ -9,7 +9,7 @@ import { ETAPES_TYPES, EtapeTypeId } from 'camino-common/src/static/etapesTypes' import { EtapeStatutId } from 'camino-common/src/static/etapesStatuts' import { getProductionOr } from './dgtm.queries' import type { Pool } from 'pg' -import { isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' const anneeDepartStats = 2015 @@ -70,7 +70,7 @@ export const getDGTMStatsInside = const anneeDepot = result.depotEtInstructions[annee] const anneeSdom = result.sdom[annee] - if (anneeDepot && anneeSdom) { + if (isNotNullNorUndefined(anneeDepot) && isNotNullNorUndefined(anneeSdom)) { anneeDepot.totalTitresOctroyes++ if (!demarche.sdomZoneIds || demarche.sdomZoneIds.length === 0) { anneeSdom['3'].octroye++ @@ -129,7 +129,7 @@ export const getDGTMStatsInside = const anneeDepot = result.depotEtInstructions[annee] const anneeSdom = result.sdom[annee] - if (anneeDepot && anneeSdom) { + if (isNotNullNorUndefined(anneeDepot) && isNotNullNorUndefined(anneeSdom)) { anneeDepot.totalTitresDeposes++ if (!etape.sdomZoneIds || etape.sdomZoneIds.length === 0) { anneeSdom[3].depose++ @@ -206,7 +206,7 @@ export const getDGTMStatsInside = days = Math.abs(days) } const delaiAnnee = result.delais[annee] - if (delaiAnnee && delaiAnnee[instruction.titretypeid]) { + if (isNotNullNorUndefined(delaiAnnee) && delaiAnnee[instruction.titretypeid]) { delaiAnnee[instruction.titretypeid]?.delaiInstructionEnJours.push(days) } } @@ -218,7 +218,7 @@ export const getDGTMStatsInside = days = Math.abs(days) } const delaiAnnee = result.delais[annee] - if (delaiAnnee && delaiAnnee[instruction.titretypeid]) { + if (isNotNullNorUndefined(delaiAnnee) && delaiAnnee[instruction.titretypeid]) { delaiAnnee[instruction.titretypeid]?.delaiCommissionDepartementaleEnJours.push(days) } if (instruction.decisionadministration) { @@ -228,7 +228,7 @@ export const getDGTMStatsInside = days = Math.abs(days) } const delaiAnnee = result.delais[annee] - if (delaiAnnee && delaiAnnee[instruction.titretypeid]) { + if (isNotNullNorUndefined(delaiAnnee) && delaiAnnee[instruction.titretypeid]) { delaiAnnee[instruction.titretypeid]?.delaiDecisionPrefetEnJours.push(days) } } diff --git a/packages/api/src/api/rest/statistiques/metaux-metropole.ts b/packages/api/src/api/rest/statistiques/metaux-metropole.ts index 862fa28f426c4cc74871ff88d082c58493a9a093..15a45b1c3b2cbb98ef7b852bafa6e04f947adef4 100644 --- a/packages/api/src/api/rest/statistiques/metaux-metropole.ts +++ b/packages/api/src/api/rest/statistiques/metaux-metropole.ts @@ -7,7 +7,7 @@ import { isTitreValide, TitresStatutIds } from 'camino-common/src/static/titresS import { SubstancesFiscale, SUBSTANCES_FISCALES_IDS, SubstanceFiscaleId } from 'camino-common/src/static/substancesFiscales' import { Departements, departementsMetropole, toDepartementId } from 'camino-common/src/static/departement' import { REGION_IDS, regions } from 'camino-common/src/static/region' -import { onlyUnique } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined, onlyUnique } from 'camino-common/src/typescript-tools' import { TITRES_TYPES_TYPES_IDS } from 'camino-common/src/static/titresTypesTypes' import { evolutionTitres } from './evolution-titres' import type { Pool } from 'pg' @@ -152,7 +152,7 @@ const buildSubstances = async (pool: Pool): Promise<Pick<StatistiquesMinerauxMet } const substanceData = acc[substance][annee] const valeur = fromUniteFiscaleToUnite(SubstancesFiscale[substance].uniteId, new Decimal(stat.substances[substance] ?? 0)).toNumber() - if (substanceData) { + if (isNotNullNorUndefined(substanceData)) { substanceData[regionId] = valeur + (substanceData[regionId] ?? 0) } } diff --git a/packages/api/src/database/queries/utilisateurs.queries.ts b/packages/api/src/database/queries/utilisateurs.queries.ts index 6efff8d97bf990833989d0f81c3a6e710d828148..042455b8e6bd581ca5a569db5ee3df8bbe54813b 100644 --- a/packages/api/src/database/queries/utilisateurs.queries.ts +++ b/packages/api/src/database/queries/utilisateurs.queries.ts @@ -164,10 +164,12 @@ export const getUtilisateurById = async (pool: Pool, id: UtilisateurId, user: Us } const userDbToUser = ( - user: GetUtilisateur -): Pick<UserNotNull, 'telephone_fixe' | 'telephone_mobile' | 'id' | 'nom' | 'prenom' | 'role' | 'email'> & - Nullable<Pick<AdminUserNotNull, 'administrationId'>> & - Pick<EntrepriseUserNotNull, 'entrepriseIds'> => { + user: DeepReadonly<GetUtilisateur> +): DeepReadonly< + Pick<UserNotNull, 'telephone_fixe' | 'telephone_mobile' | 'id' | 'nom' | 'prenom' | 'role' | 'email'> & + Nullable<Pick<AdminUserNotNull, 'administrationId'>> & + Pick<EntrepriseUserNotNull, 'entrepriseIds'> +> => { return { ...user, prenom: user.prenom ?? '', entrepriseIds: user.entreprise_ids ?? [], administrationId: user.administration_id } } diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json index 1bc200872d1f4de7b623a11070e66e7477de1e1e..6f61185a536170e8b845957baf8ed151360f0091 100644 --- a/packages/api/tsconfig.json +++ b/packages/api/tsconfig.json @@ -9,7 +9,7 @@ "alwaysStrict": true, "esModuleInterop": true, "inlineSources": false, - "lib": ["es2020", "dom", "ESNext.Array"], + "lib": ["es2020", "dom", "es2023.Array"], "module": "ESNext", "moduleResolution": "Node", "noFallthroughCasesInSwitch": true, diff --git a/packages/common/package.json b/packages/common/package.json index cee5ab55c3faf9a02f3bdc7423af36d4047db702..7c614963b5a2109ab6fb7a5e525ef50499dd4bcf 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -15,7 +15,7 @@ "@typescript-eslint/parser": "^7.12.0", "@vitest/coverage-v8": "^2.0.5", "prettier": "^3.2.5", - "typescript": "^5.4.5", + "typescript": "^5.6.2", "vitest": "^2.0.5" }, "prettier": { diff --git a/packages/common/src/static/statistiques.ts b/packages/common/src/static/statistiques.ts index 9faa74d1abb4ad0af29a0ed4fdeffe6b64d55d7a..fe4fa11076bce20e5dfa7a979f12dec47c0cbe59 100644 --- a/packages/common/src/static/statistiques.ts +++ b/packages/common/src/static/statistiques.ts @@ -5,7 +5,7 @@ import { StatistiquesDataGouv } from '../statistiques' // prettier-ignore const IDS = ['Nombre d\'utilisateurs sur la plateforme', 'Nombre d\'utilisateurs affiliés à une entreprise', 'Nombre d\'utilisateurs rattachés à une préfecture','Nombre d\'utilisateurs rattachés à un ministère','Nombre d\'utilisateurs rattachés à une Dréal','Nombre d\'utilisateurs rattachés à une Autorité'] as const -const caminoStatistiquesDataGouvIdValidator = z.enum(IDS) +export const caminoStatistiquesDataGouvIdValidator = z.enum(IDS) export type CaminoStatistiquesDataGouvId = z.infer<typeof caminoStatistiquesDataGouvIdValidator> type TemplateDataGouv = Pick<StatistiquesDataGouv, 'indicateur' | 'unite_mesure' | 'frequence_monitoring' | 'date_debut' | 'dataviz_wish'> diff --git a/packages/common/src/statistiques.ts b/packages/common/src/statistiques.ts index c82938ae8a1b11d82a777648275e359655fad46a..9e987a37e4132651829a3275b6dc2c6ecf4406bb 100644 --- a/packages/common/src/statistiques.ts +++ b/packages/common/src/statistiques.ts @@ -5,7 +5,7 @@ import { regionIdValidator } from './static/region' import { SDOMZoneIds } from './static/sdom' import { SUBSTANCES_FISCALES_IDS, SubstanceFiscaleId } from './static/substancesFiscales' import { TitresTypes } from './static/titresTypes' -import { CaminoStatistiquesDataGouvId } from './static/statistiques' +import { CaminoStatistiquesDataGouvId, caminoStatistiquesDataGouvIdValidator } from './static/statistiques' export const yearMonthValidator = z .string() @@ -196,7 +196,7 @@ export const indicateurByAdministrationId: Record<Exclude<AdministrationTypeId, export const statistiquesDataGouvValidator = z.object({ administration_rattachement: z.literal('DGALN'), nom_service_public_numerique: z.literal('CAMINO'), - indicateur: z.string(), + indicateur: caminoStatistiquesDataGouvIdValidator, valeur: z.number(), unite_mesure: z.string(), est_cible: z.boolean(), diff --git a/packages/ui/package.json b/packages/ui/package.json index 9db180768859066445e75ee048fe8711eb4b1485..befeda6b8afe8e795b230c149c4f1f6071c71a9d 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -82,7 +82,7 @@ "storybook": "^8.2.9", "ts-node": "^10.9.2", "tus-js-client": "^4.1.0", - "typescript": "^5.4.5", + "typescript": "^5.6.2", "typescript-plugin-css-modules": "^5.1.0", "vite": "^5.2.10", "vitest": "^2.0.5", diff --git a/packages/ui/src/api/statistiques.ts b/packages/ui/src/api/statistiques.ts index c620bfb8fa882a627959ecba827d4705f4e4c1da..11c26ff867086a727f72cb1c308a364411858299 100644 --- a/packages/ui/src/api/statistiques.ts +++ b/packages/ui/src/api/statistiques.ts @@ -1,7 +1,22 @@ import gql from 'graphql-tag' import { apiGraphQLFetch } from './_client' +import { QuantiteParMois } from 'camino-common/src/statistiques' -export const statistiquesGlobales = apiGraphQLFetch(gql` +type StatistiquesGlobales = { + statistiquesGlobales: { + titresActivitesBeneficesEntreprise: number + titresActivitesBeneficesAdministration: number + recherches: QuantiteParMois[] + titresModifies: QuantiteParMois[] + actions: number + sessionDuree: number + telechargements: number + demarches: number + signalements: number + reutilisations: number + } +} +export const statistiquesGlobales: () => Promise<StatistiquesGlobales> = apiGraphQLFetch(gql` query StatistiquesGlobales { statistiquesGlobales { titresActivitesBeneficesEntreprise diff --git a/packages/ui/src/components/statistiques/globales.tsx b/packages/ui/src/components/statistiques/globales.tsx index a35eda1813a2a4dd4ce1a89e49d2d9f5772f929b..37754d81b92fd1358a60ba7211f56b8836dc9a3e 100644 --- a/packages/ui/src/components/statistiques/globales.tsx +++ b/packages/ui/src/components/statistiques/globales.tsx @@ -76,11 +76,26 @@ export const Globales = defineComponent(() => { try { const [statsGlobales, statsUtilisateurs] = await Promise.all([statistiquesGlobales(), getWithJson('/rest/statistiques/datagouv', {})]) - const statistiques = statsUtilisateurs.reduce((acc, value) => { - acc[value.indicateur] = value.valeur + const statistiques: CaminoStats = statsUtilisateurs.reduce( + (acc, value) => { + acc[value.indicateur] = value.valeur - return acc - }, statsGlobales) + return acc + }, + { + ...statsGlobales, + titresModifies: [], + "Nombre d'utilisateurs affiliés à une entreprise": 0, + "Nombre d'utilisateurs rattachés à un ministère": 0, + "Nombre d'utilisateurs rattachés à une Autorité": 0, + "Nombre d'utilisateurs rattachés à une Dréal": 0, + "Nombre d'utilisateurs rattachés à une préfecture": 0, + "Nombre d'utilisateurs sur la plateforme": 0, + demarches: 0, + titresActivitesBeneficesAdministration: 0, + titresActivitesBeneficesEntreprise: 0, + } + ) if (statistiques !== null) { data.value = { status: 'LOADED', value: statistiques } diff --git a/packages/ui/src/components/titres/mapUtil.ts b/packages/ui/src/components/titres/mapUtil.ts index 580e30bb3fb5bfd65b2599077e69bd3855305834..4d4c3166e0faccf1dd31d9e2d9425da3a4c64b0e 100644 --- a/packages/ui/src/components/titres/mapUtil.ts +++ b/packages/ui/src/components/titres/mapUtil.ts @@ -7,7 +7,7 @@ import { TitreId } from 'camino-common/src/validators/titres' import { dsfrVariableCouleurParDomaine } from '../_common/domaine' import { capitalize } from 'camino-common/src/strings' import { GeojsonPoint, MultiPolygon } from 'camino-common/src/perimetre' -import { isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' +import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools' import { Entreprise, EntrepriseId } from 'camino-common/src/entreprise' import { REGION_IDS, RegionId } from 'camino-common/src/static/region' import { CaminoRouter } from '@/typings/vue-router' @@ -169,7 +169,7 @@ export const clustersBuild = (): { [key in DomaineId]?: CaminoMarkerClusterGroup showCoverageOnHover: false, }) const cluster = clusters[id] - if (cluster) { + if (isNotNullNorUndefined(cluster)) { cluster.caminoDomaineId = id }