fix(transport) : affiche le message 409 (homonyme) à la restauration + virgule décimale dans sanitizeDecimal (ERP-170)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 3m7s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m41s

This commit is contained in:
2026-06-17 16:03:35 +02:00
parent c371057c0b
commit b6b5bb06e8
3 changed files with 13 additions and 5 deletions
@@ -255,6 +255,7 @@ import {
showRestoreAction, showRestoreAction,
type CarrierPriceRead, type CarrierPriceRead,
} from '~/modules/transport/utils/forms/carrierMappers' } from '~/modules/transport/utils/forms/carrierMappers'
import { extractApiErrorMessage } from '~/shared/utils/api'
interface SelectOption { interface SelectOption {
value: string value: string
@@ -481,8 +482,14 @@ async function runToggleArchive(): Promise<void> {
: t('transport.carriers.toast.restoreSuccess'), : t('transport.carriers.toast.restoreSuccess'),
}) })
} }
catch { catch (err) {
toast.error({ title: t('transport.carriers.toast.error') }) // Surface le message back (ex. 409 « homonyme actif » à la restauration),
// propagé exprès par useCarrier ; fallback générique sinon.
const data = (err as { response?: { _data?: unknown } })?.response?._data
toast.error({
title: t('transport.carriers.toast.error'),
message: extractApiErrorMessage(data) || undefined,
})
} }
} }
@@ -5,7 +5,7 @@ describe('numberInput — saisie volume / indexation (ERP-170)', () => {
it('sanitizeDecimal : ne garde que chiffres + un seul point', () => { it('sanitizeDecimal : ne garde que chiffres + un seul point', () => {
expect(sanitizeDecimal('30')).toBe('30') expect(sanitizeDecimal('30')).toBe('30')
expect(sanitizeDecimal('30.5')).toBe('30.5') expect(sanitizeDecimal('30.5')).toBe('30.5')
expect(sanitizeDecimal('30,5 kg')).toBe('305') // virgule + espace + lettres retirés expect(sanitizeDecimal('30,5 kg')).toBe('30.5') // virgule FR → point ; espace + lettres retirés
expect(sanitizeDecimal('1.2.3')).toBe('1.23') // un seul point conservé expect(sanitizeDecimal('1.2.3')).toBe('1.23') // un seul point conservé
expect(sanitizeDecimal('abc12.3x')).toBe('12.3') expect(sanitizeDecimal('abc12.3x')).toBe('12.3')
expect(sanitizeDecimal('')).toBe('') expect(sanitizeDecimal('')).toBe('')
@@ -5,10 +5,11 @@
/** /**
* Restreint une saisie à un nombre décimal : chiffres + UN seul point (RG volume m³, * Restreint une saisie à un nombre décimal : chiffres + UN seul point (RG volume m³,
* « nombres avec des points » comme les autres modules). Supprime tout autre caractère. * « nombres avec des points » comme les autres modules). La virgule décimale FR est
* convertie en point (« 30,5 » → « 30.5 ») ; tout autre caractère est supprimé.
*/ */
export function sanitizeDecimal(value: string): string { export function sanitizeDecimal(value: string): string {
let cleaned = (value ?? '').replace(/[^0-9.]/g, '') let cleaned = (value ?? '').replace(/,/g, '.').replace(/[^0-9.]/g, '')
const dot = cleaned.indexOf('.') const dot = cleaned.indexOf('.')
if (dot !== -1) { if (dot !== -1) {
// Conserve le 1er point, retire les suivants. // Conserve le 1er point, retire les suivants.