feat(commercial) : amélioration et validation stricte des champs date (ERP-148)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 2m27s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m29s

- MalioDate v1.7.10 : exposition de l'état de validité et de la saisie brute
  invalide (@update:valid / @update:rawValue).
- Validation back-autoritaire du format : foundedAt n'accepte plus que l'ISO
  strict Y-m-d (Context DateTimeNormalizer) + collectDenormalizationErrors sur
  Client et Supplier -> toute saisie non-ISO renvoie un 422 porté sur le champ.
- Front : la saisie invalide est transmise au back, le message technique de
  type-error est surchargé par une clé i18n via le code de violation
  (resolveViolationMessage / VIOLATION_MESSAGE_I18N), affiché inline.
- Réorganisation des utils de formulaire sous utils/forms/.
- Tests back (cas piège 12/25/2026) + tests front (résolveur i18n).
This commit is contained in:
2026-06-12 10:39:23 +02:00
parent 7d8a633eee
commit 59f4e33580
33 changed files with 364 additions and 41 deletions
+10 -7
View File
@@ -17,7 +17,7 @@
* appel par ligne), utiliser directement `mapViolationsToRecord` par ligne.
*/
import { computed, reactive } from 'vue'
import { extractApiErrorMessage, mapViolationsToRecord } from '~/shared/utils/api'
import { extractApiErrorMessage, extractApiViolations, resolveViolationMessage } from '~/shared/utils/api'
/**
* Erreur HTTP capturee par ofetch. On n'expose que les champs lus ici (status
@@ -69,13 +69,16 @@ export function useFormErrors() {
* violation exploitable).
*/
function setServerErrors(data: unknown): boolean {
const mapped = mapViolationsToRecord(data)
const keys = Object.keys(mapped)
if (keys.length === 0) return false
for (const key of keys) {
errors[key] = mapped[key]
const violations = extractApiViolations(data)
let mapped = false
for (const v of violations) {
if (!v.propertyPath) continue
// Message back tel quel, sauf code surcharge par une cle i18n (ex.
// erreur de type sur une date non parsable -> « Date invalide »).
errors[v.propertyPath] = resolveViolationMessage(v, t)
mapped = true
}
return true
return mapped
}
/**