fix(commercial) : corrections ajout fournisseur — addressType en select, 422 inline (addressType/catégorie/compta complète/LCR sur paymentType), Information facultative (RG-2.03 retirée, miroir client) (ERP-94)

This commit is contained in:
2026-06-09 23:36:39 +02:00
parent 556b7026da
commit e2ad17820b
16 changed files with 239 additions and 598 deletions
@@ -10,26 +10,19 @@
@click="$emit('remove')"
/>
<!-- Type d'adresse : radio exclusif Prospect / Depart / Rendu (RG-2.09).
Une seule colonne (radios empiles), sans label de groupe ; le caractere
obligatoire est porte par chaque radio (prop `required`). L'erreur 422
(propertyPath `addressType`) s'affiche sous le groupe. -->
<div class="flex flex-col gap-2">
<MalioRadioButton
v-for="opt in addressTypeOptions"
:key="opt.value"
:name="radioName"
:model-value="model.addressType"
:value="opt.value"
:label="opt.label"
:required="true"
:readonly="readonly"
:disabled="readonly"
group-class="mt-0"
@update:model-value="() => update('addressType', opt.value)"
/>
<span v-if="errors?.addressType" class="text-sm text-red-600">{{ errors.addressType }}</span>
</div>
<!-- Type d'adresse : Prospect / Depart / Rendu (RG-2.09). Select en attendant
l'arbitrage metier (radio vs select) ; l'erreur 422 (propertyPath
`addressType`) s'affiche via la prop native :error de MalioSelect. -->
<MalioSelect
:model-value="model.addressType"
:options="addressTypeOptions"
:label="t('commercial.suppliers.form.address.addressType')"
:readonly="readonly"
empty-option-label=""
:required="true"
:error="errors?.addressType"
@update:model-value="(v: string | number | null) => update('addressType', v === null ? null : (v as SupplierAddressType))"
/>
<!-- Sites Starseed : multiselect a tags (>= 1 obligatoire, RG-2.06). -->
<MalioSelectCheckbox
@@ -210,10 +203,6 @@ const autocomplete = useAddressAutocomplete()
const model = computed(() => props.modelValue)
// Nom de groupe radio unique par bloc (sinon les radios de blocs differents se
// partageraient la selection). Derive du titre (« Adresse 1 », « Adresse 2 »...).
const radioName = computed(() => `supplier-address-type-${props.title.replace(/\s+/g, '-')}`)
const addressTypeOptions = computed<{ value: SupplierAddressType, label: string }[]>(() => [
{ value: 'PROSPECT', label: t('commercial.suppliers.form.address.addressTypeProspect') },
{ value: 'DEPART', label: t('commercial.suppliers.form.address.addressTypeDepart') },
@@ -57,7 +57,6 @@ function mountBlock(overrides: Record<string, unknown> = {}, errors?: Record<str
stubs: {
MalioButtonIcon: true,
MalioCheckbox: true,
MalioRadioButton: true,
MalioInputNumber: true,
MalioSelect: true,
MalioSelectCheckbox: true,
@@ -68,10 +67,13 @@ function mountBlock(overrides: Record<string, unknown> = {}, errors?: Record<str
})
}
describe('SupplierAddressBlock — specificites M2 (radio type, bennes, triage)', () => {
it('rend les 3 options de type d\'adresse (Prospect / Départ / Rendu)', () => {
describe('SupplierAddressBlock — specificites M2 (type, bennes, triage)', () => {
it('rend un select de type d\'adresse (en attendant l\'arbitrage metier)', () => {
const wrapper = mountBlock()
expect(wrapper.findAll('malio-radio-button-stub')).toHaveLength(3)
const addressTypeSelect = wrapper.findAll('malio-select-stub').find(
el => el.attributes('label') === 'commercial.suppliers.form.address.addressType',
)
expect(addressTypeSelect).toBeDefined()
})
it('rend le stepper Bennes et la case Prestation de triage (champs specifiques fournisseur)', () => {
@@ -88,9 +90,12 @@ describe('SupplierAddressBlock — specificites M2 (radio type, bennes, triage)'
})
describe('SupplierAddressBlock — mapping erreur par champ (ERP-101)', () => {
it('affiche l\'erreur serveur du type d\'adresse (propertyPath addressType)', () => {
const wrapper = mountBlock({}, { addressType: 'Le type d\'adresse doit être Prospect, Départ ou Rendu.' })
expect(wrapper.text()).toContain('Le type d\'adresse doit être Prospect, Départ ou Rendu.')
it('affiche l\'erreur serveur du type d\'adresse (propertyPath addressType) sur le select', () => {
const wrapper = mountBlock({}, { addressType: 'Le type d\'adresse est obligatoire.' })
const addressTypeSelect = wrapper.findAll('malio-select-stub').find(
el => el.attributes('label') === 'commercial.suppliers.form.address.addressType',
)
expect(addressTypeSelect?.attributes('error')).toBe('Le type d\'adresse est obligatoire.')
})
it('affiche les erreurs serveur sur sites et categories', () => {