3d4ae391fe
Auto Tag Develop / tag (push) Successful in 7s
Empilée sur ERP-142 (#104). ## Périmètre ERP-143 Onglet **Adresse** de l'écran `/providers/new` — saisie multi-adresses (blocs ajoutables) via la sous-ressource addresses. - **`ProviderAddressBlock.vue`** (miroir `SupplierAddressBlock` **simplifié**) : Sélecteur de sites (≥1, RG-3.05) / Catégories (PRESTATAIRE, RG-3.09) / Contact(s) rattaché(s) (depuis l'onglet Contact) / Pays (défaut France) / Code postal / Ville / Adresse (autocomplete BAN) / Complément. **Pas** de type d'adresse, **pas** de bennes, **pas** de triage (différence M2). - **RG-3.06** : `useAddressAutocomplete()` **réutilisé tel quel** — CP → liste des villes (BAN) ; cas dégradé (API down) → ville/adresse en saisie libre + toast unique. - **`useProviderForm`** étendu : `addresses`, `canAddAddress` (RG-3.05/3.09), `add/removeAddress`, `submitAddresses` (POST `/providers/{id}/addresses` + PATCH `/provider_addresses/{id}`, groupe `provider:write:addresses`), erreurs 422 **par ligne**. - **`useProviderReferentials`** : ajout des pays (`/countries`) pour le select Pays. - Helpers purs `utils/forms/providerAddress.ts` (`isProviderAddressValid`, `buildProviderAddressPayload` — relations en IRI, requis vides omis au POST). - « + Nouvelle adresse » / Supprimer (modal) / « Valider ». i18n `technique.providers.form.address` + `confirmDelete.address`. ## Conformité - `useApi()` only ; `Malio*` only ; aucun texte FR en dur ; `useAddressAutocomplete` non réécrit ; pas d'import inter-module (helpers ré-implémentés côté Technique, règle ABSOLUE n°1). ## Vérifications - Vitest : 436/436 (18 nouveaux : helpers adresse, bloc — BAN dégradé/allow-create/mapping erreurs, workflow adresses POST/PATCH/422 par ligne). - ESLint : OK. - `nuxi typecheck` : 0 erreur sur les fichiers source du ticket. - Golden path navigateur : page compile, onglet Contact OK. NB : l'onglet Adresse est gaté derrière la validation principal+contact (multiselect `Malio` non pilotable en a11y) — couvert par tests unitaires (montage + BAN + mapping) + typecheck. Reviewed-on: #105 Co-authored-by: tristan <tristan@yuno.malio.fr> Co-committed-by: tristan <tristan@yuno.malio.fr>
51 lines
2.0 KiB
TypeScript
51 lines
2.0 KiB
TypeScript
/**
|
|
* Helpers purs de l'onglet Adresse prestataire (M3 Technique, ERP-143) — miroir
|
|
* SIMPLIFIE de `supplierFormRules`/`supplierEdit` (M2), reimplemente cote module
|
|
* Technique (regle ABSOLUE n°1 : pas d'import inter-module). Testables sans Vue.
|
|
*/
|
|
|
|
import type { ProviderAddressFormDraft } from '~/modules/technique/types/providerForm'
|
|
|
|
/**
|
|
* Champs scalaires obligatoires non nullable cote back (NotBlank). A la creation
|
|
* (POST), on OMET du payload ceux qui sont vides pour que la 422 porte la
|
|
* violation NotBlank propre (sur le champ) plutot qu'une erreur de type.
|
|
*/
|
|
const REQUIRED_NON_NULLABLE_KEYS = ['postalCode', 'city', 'street'] as const
|
|
|
|
/**
|
|
* RG-3.05 (+ RG-3.09) : une adresse est « valide » pour autoriser l'ajout d'un
|
|
* nouveau bloc des qu'elle porte au moins un site ET au moins une categorie. Les
|
|
* scalaires (CP/ville/rue) restent valides par le back (422 inline).
|
|
*/
|
|
export function isProviderAddressValid(address: ProviderAddressFormDraft): boolean {
|
|
return address.siteIris.length >= 1 && address.categoryIris.length >= 1
|
|
}
|
|
|
|
/**
|
|
* Payload de la sous-ressource addresses (groupe `provider:write:addresses`).
|
|
* Relations M2M en IRI. Les scalaires requis vides sont omis a la creation (cf.
|
|
* REQUIRED_NON_NULLABLE_KEYS).
|
|
*/
|
|
export function buildProviderAddressPayload(address: ProviderAddressFormDraft): Record<string, unknown> {
|
|
const payload: Record<string, unknown> = {
|
|
country: address.country,
|
|
postalCode: address.postalCode || null,
|
|
city: address.city || null,
|
|
street: address.street || null,
|
|
streetComplement: address.streetComplement || null,
|
|
categories: [...address.categoryIris],
|
|
sites: [...address.siteIris],
|
|
contacts: [...address.contactIris],
|
|
}
|
|
|
|
for (const key of REQUIRED_NON_NULLABLE_KEYS) {
|
|
const value = payload[key]
|
|
if (value === null || value === undefined || value === '') {
|
|
delete payload[key]
|
|
}
|
|
}
|
|
|
|
return payload
|
|
}
|