refactor(front) : formatDateFr mutualisé dans shared/utils/date + rendu déterministe (ERP-191)
Trois copies identiques de formatDateFr (logistique weighingTicketFormat, transport carriers/index, CarrierQualimatTab) fusionnées en un seul helper partagé. La nouvelle version lit la date directement dans la chaîne ISO (10 premiers caractères) au lieu de new Date(value).getDate() : un datetime porteur d'un offset (…+02:00, …Z) ne bascule plus d'un jour selon le fuseau du navigateur / runner CI, et reste cohérent avec l'écran d'édition (slice) et l'export serveur (format d/m/Y). weighingTicketFormat ré-exporte le helper (imports inchangés côté écrans). Tests de déterminisme fuseau ajoutés dans shared/utils/date.test.ts.
This commit is contained in:
@@ -30,3 +30,22 @@ export function nowIsoDateTime(now: Date = new Date()): string {
|
||||
const seconds = String(now.getSeconds()).padStart(2, '0')
|
||||
return `${todayIso(now)}T${hours}:${minutes}:${seconds}`
|
||||
}
|
||||
|
||||
/**
|
||||
* Date courte française `JJ-MM-AAAA` à partir d'une valeur ISO (`YYYY-MM-DD` ou
|
||||
* datetime `YYYY-MM-DDTHH:mm:ss±HH:mm`). Chaîne vide si absente ou non ISO.
|
||||
*
|
||||
* On lit les composantes DIRECTEMENT dans la chaîne (10 premiers caractères) au
|
||||
* lieu de `new Date(value).getDate()` : un datetime porteur d'un offset (ex.
|
||||
* `…T00:30:00+02:00`, ou `…Z`) basculerait d'un jour selon le fuseau du
|
||||
* navigateur / du runner CI. Rendu ainsi déterministe et cohérent avec l'écran
|
||||
* d'édition (slice de la chaîne brute) et l'export serveur (`format('d/m/Y')`).
|
||||
*/
|
||||
export function formatDateFr(value: string | null | undefined): string {
|
||||
const match = value ? /^(\d{4})-(\d{2})-(\d{2})/.exec(value) : null
|
||||
if (!match) {
|
||||
return ''
|
||||
}
|
||||
const [, year, month, day] = match
|
||||
return `${day}-${month}-${year}`
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user