Appearance
BDD-110 - Corriger la colonne numérique
1. User Story
En tant qu'administrateur,
Je veux importer correctement les colonnes numériques d'une source Heriade, même lorsque le fichier contient des très petits nombres ou de la notation scientifique,
Afin d'éviter le rejet de fichiers Excel valides.
2. Critères d'acceptance
- L'import accepte les nombres en notation scientifique, par exemple
5.7e-14ou-2e-15. - L'import accepte toujours les nombres avec décimales, par exemple
123.45ou123,45. - Les valeurs non numériques restent refusées.
- Les colonnes typées Nombre sont stockées en
NUMERIC(PostgreSQL). - Un test couvre l'import d'un fichier contenant des valeurs numériques très proches de zéro.
3. Périmètre fonctionnel
Backend
- Utilitaire de détection/normalisation :
back/src/api/sources/services/numeric-value.util.ts - Service de parsing fichier :
back/src/api/sources/services/file-parser.service.ts - Service sources :
back/src/api/sources/sources.service.ts - Tests unitaires utilitaire :
back/src/api/sources/services/numeric-value.util.spec.ts - Tests unitaires parser :
back/src/api/sources/services/file-parser.service.spec.ts - Tests unitaires service :
back/src/api/sources/sources.service.spec.ts - Tests E2E controller :
back/test/e2e/sources-controller.e2e-spec.ts
Dépendances
| Package | Version | Rôle |
|---|---|---|
decimal.js | ^10.6.0 | Parsing précis des nombres à virgule flottante, notation scientifique incluse |
4. Détails d'implémentation
Problème
La regex précédente /^-?\d+([.,]\d+)?$/ rejetait tout nombre en notation scientifique (5.7e-14, -2e-15, 1.5E+10). Ces valeurs apparaissent naturellement dans des fichiers Excel contenant des mesures physiques ou financières très petites, ce qui provoquait le rejet de l'import en erreur de validation.
Solution
Extraction d'un utilitaire numeric-value.util.ts s'appuyant sur decimal.js pour détecter et normaliser les valeurs numériques :
isNumericValue(value: string): boolean— remplace la regex dansfile-parser.service.tsetsources.service.ts. Retournetruesi la valeur est un nombre fini valide (entier, décimal virgule/point, notation scientifique).normalizeNumericValue(value: string): string— convertit la virgule en point et normalise viaDecimal.toString()avant insertion dans PostgreSQL. Appelé danssources.service.tslors du mapping des lignes pour les colonnes de typenumber.
Backend
file-parser.service.ts: les méthodesisNumericValue(détection de type) etisDateValue(garde contre faux positifs) utilisent désormais l'utilitaire à la place de la regex.sources.service.ts: ajout d'un branchement dédié dans la boucle de normalisation des lignes — si le type sélectionné estnumber, la valeur passe parnormalizeNumericValueavant d'être insérée.- Le type SQL de colonne reste
NUMERIC(inchangé depuisschema-table.service.ts).
Aucune migration de schéma n'est requise : la colonne PostgreSQL était déjà NUMERIC. Le fix corrige uniquement la phase de parsing/normalisation côté applicatif.
5. Points de vérification
- Un fichier Excel contenant
5.7e-14,-2e-15ou1.5E+10est importé sans erreur. - Les décimales avec virgule (
123,45) et avec point (123.45) sont acceptées. - Une valeur comme
12px,abcou1.2.3est bien refusée à la validation. - Les valeurs normalisées insérées en base sont lisibles par PostgreSQL en tant que
NUMERIC. - Les sources existantes avec colonnes numériques nécessitent un rechargement manuel pour bénéficier de la correction.
6. Tests associés
Tests unitaires back
back/src/api/sources/services/numeric-value.util.spec.tsisNumericValue: accepte entiers, décimaux (point et virgule), notation scientifique, zéro, zéro négatif.isNumericValue: rejette chaînes vides, espaces,NaN,Infinity, valeurs avec unités, multiples séparateurs.normalizeNumericValue: conserve les entiers, normalise la virgule en point, préserve la notation scientifique.
back/src/api/sources/services/file-parser.service.spec.ts- Détection de type numérique via
isNumericValue(cas notation scientifique couverts).
- Détection de type numérique via
back/src/api/sources/sources.service.spec.ts- Normalisation des valeurs numériques avant insertion (appel à
normalizeNumericValue).
- Normalisation des valeurs numériques avant insertion (appel à
Tests E2E back (Supertest)
back/test/e2e/sources-controller.e2e-spec.tsPOST /sources/:uuid/reload: 401 sans token.POST /sources/:uuid/reload: 403 pour rôleexternal-client.POST /sources/:uuid/reload: 400 UUID de source invalide.POST /sources/:uuid/reload: 400 stratégie invalide.
