fix(commercial) : retours de review ERP-62
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 2m5s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m14s

- Export : message d'erreur dédié (toast.exportError) distinct du titre.
- formatLastActivity : garde-fou date invalide (Number.isNaN) → cellule vide.
- normalizeIntList/normalizeStringList : normalisation défensive (foreach +
  is_numeric/cast), plus de TypeError strict pour un appelant direct.
- phone.ts : docblock reformulé (helper transverse assumé, usage à venir partout).
This commit is contained in:
2026-06-02 16:10:00 +02:00
parent f59c972919
commit 93aa22594d
4 changed files with 40 additions and 16 deletions
+2 -1
View File
@@ -86,7 +86,8 @@
"updateSuccess": "Client mis à jour avec succès",
"archiveSuccess": "Client archivé avec succès",
"restoreSuccess": "Client restauré avec succès",
"error": "Une erreur est survenue. Réessayez."
"error": "Une erreur est survenue. Réessayez.",
"exportError": "L'export du répertoire clients a échoué. Réessayez."
},
"validation": {
"informationRequiredForCommercial": "Les informations de l'entreprise sont obligatoires pour le rôle Commerciale.",
@@ -228,7 +228,13 @@ function formatLastActivity(item: Record<string, unknown>): string {
return ''
}
return new Date(value).toLocaleDateString('fr-FR')
// Garde-fou date invalide : un updatedAt mal forme donnerait « Invalid Date ».
const date = new Date(value)
if (Number.isNaN(date.getTime())) {
return ''
}
return date.toLocaleDateString('fr-FR')
}
/** Clic sur une ligne → ecran Consultation (route a plat /clients/{id}). */
@@ -383,7 +389,7 @@ async function exportXlsx(): Promise<void> {
catch {
toast.error({
title: t('commercial.clients.toast.error'),
message: t('commercial.clients.toast.error'),
message: t('commercial.clients.toast.exportError'),
})
}
finally {
+5 -5
View File
@@ -2,11 +2,11 @@
* Formatage d'un numero de telephone francais en groupes de 2 chiffres
* (`XX XX XX XX XX`).
*
* Signature cible partagee avec le ticket 1.13 / ERP-66 : si ce dernier livre
* une version plus riche (validation, indicatif international), elle remplacera
* cette implementation minimale. En attendant, on couvre le besoin du Repertoire
* clients (ERP-62) : afficher un telephone lisible a partir de la valeur stockee
* en base (deja normalisee en 10 chiffres par le ClientProcessor, RG-1.20).
* Helper PARTAGE volontaire : les telephones sont presents un peu partout dans
* l'app (fiches clients, contacts, fournisseurs, prestataires...). Introduit ici
* comme util transverse stable plutot que duplique a chaque ecran. La signature
* `formatPhoneFR(value): string` est coordonnee avec ERP-66, qui pourra enrichir
* l'implementation (validation, indicatif international) sans casser les appelants.
*
* - Ne garde que les chiffres puis groupe par 2 (tolere une saisie deja espacee
* ou pointee, ex: `06.12.34.56.78` ou `0612345678`).
@@ -144,30 +144,47 @@ class DoctrineClientRepository extends ServiceEntityRepository implements Client
/**
* Nettoie une liste de chaines : trim, retrait des vides, reindexation.
* Defensive : tolere des elements scalaires non-string (cast) et ignore le
* reste sans lever de TypeError, le contrat etant justement de normaliser une
* entree potentiellement brute (query params).
*
* @param list<string> $values
* @param array<mixed> $values
*
* @return list<string>
*/
private function normalizeStringList(array $values): array
{
$cleaned = array_filter(
array_map(static fn (string $v): string => trim($v), $values),
static fn (string $v): bool => '' !== $v,
);
$out = [];
foreach ($values as $value) {
if (is_string($value) || is_int($value) || is_float($value)) {
$trimmed = trim((string) $value);
if ('' !== $trimmed) {
$out[] = $trimmed;
}
}
}
return array_values($cleaned);
return $out;
}
/**
* Nettoie une liste d'identifiants : cast int, retrait des <= 0, reindexation.
* Defensive (cf. normalizeStringList) : accepte des entiers ou des chaines
* numeriques ('1', '2') sans TypeError, ignore le reste.
*
* @param list<int> $values
* @param array<mixed> $values
*
* @return list<int>
*/
private function normalizeIntList(array $values): array
{
return array_values(array_filter($values, static fn (int $v): bool => $v > 0));
$out = [];
foreach ($values as $value) {
if (is_numeric($value) && (int) $value > 0) {
$out[] = (int) $value;
}
}
return $out;
}
}