Skip to content

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

  1. L'import accepte les nombres en notation scientifique, par exemple 5.7e-14 ou -2e-15.
  2. L'import accepte toujours les nombres avec décimales, par exemple 123.45 ou 123,45.
  3. Les valeurs non numériques restent refusées.
  4. Les colonnes typées Nombre sont stockées en NUMERIC (PostgreSQL).
  5. 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

PackageVersionRôle
decimal.js^10.6.0Parsing 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 dans file-parser.service.ts et sources.service.ts. Retourne true si 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 via Decimal.toString() avant insertion dans PostgreSQL. Appelé dans sources.service.ts lors du mapping des lignes pour les colonnes de type number.

Backend

  • file-parser.service.ts : les méthodes isNumericValue (détection de type) et isDateValue (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é est number, la valeur passe par normalizeNumericValue avant d'être insérée.
  • Le type SQL de colonne reste NUMERIC (inchangé depuis schema-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-15 ou 1.5E+10 est importé sans erreur.
  • Les décimales avec virgule (123,45) et avec point (123.45) sont acceptées.
  • Une valeur comme 12px, abc ou 1.2.3 est 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.ts

    • isNumericValue : 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).
  • back/src/api/sources/sources.service.spec.ts

    • Normalisation des valeurs numériques avant insertion (appel à normalizeNumericValue).

Tests E2E back (Supertest)

  • back/test/e2e/sources-controller.e2e-spec.ts
    • POST /sources/:uuid/reload : 401 sans token.
    • POST /sources/:uuid/reload : 403 pour rôle external-client.
    • POST /sources/:uuid/reload : 400 UUID de source invalide.
    • POST /sources/:uuid/reload : 400 stratégie invalide.