feat(transport) : upload décharge (useUpload) + câblage MalioInputUpload + i18n erreur (ERP-171)

This commit is contained in:
2026-06-17 15:14:31 +02:00
parent b6b5bb06e8
commit 1d5110d000
6 changed files with 179 additions and 7 deletions
@@ -1,5 +1,6 @@
import { computed, reactive, ref, type Ref } from 'vue'
import { useFormErrors } from '~/shared/composables/useFormErrors'
import { useUpload } from '~/shared/composables/useUpload'
import { extractApiErrorMessage, mapViolationsToRecord } from '~/shared/utils/api'
import { removeCollectionRow } from '~/shared/utils/collectionRow'
import {
@@ -66,6 +67,9 @@ export function useCarrierForm() {
// Erreurs de validation par champ (ERP-101) du formulaire principal.
const mainErrors = useFormErrors()
// Upload de la décharge (RG-4.02) — infra partagée /api/uploaded_documents.
const { uploading: dischargeUploading, upload: uploadFile } = useUpload()
// ── État du transporteur créé ─────────────────────────────────────────────
const carrierId = ref<number | null>(null)
const mainLocked = ref(false)
@@ -165,6 +169,24 @@ export function useCarrierForm() {
return valid
}
/**
* Upload de la décharge (RG-4.02) déclenché par `@file-selected` du champ
* Décharge : envoie le fichier, pose l'IRI résultant sur le brouillon. Au 422
* (MIME hors whitelist / taille), le message back s'affiche sous le champ
* (pas de toast) ; l'IRI est remis à null pour bloquer la validation.
*/
async function uploadDischarge(file: File): Promise<void> {
mainErrors.clearError('dischargeDocument')
try {
main.dischargeDocumentIri = await uploadFile(file)
} catch (error) {
main.dischargeDocumentIri = null
const message = extractApiErrorMessage((error as { data?: unknown })?.data)
|| t('transport.carriers.form.errors.uploadFailed')
mainErrors.setError('dischargeDocument', message)
}
}
/**
* Payload du POST principal (groupe `carrier:write:main`). `name` et
* `certificationType` sont omis s'ils sont vides afin que la 422 porte la
@@ -732,6 +754,7 @@ export function useCarrierForm() {
mainSubmitting,
tabSubmitting,
mainErrors,
dischargeUploading,
// affichage conditionnel
isLiot,
isQualimat,
@@ -768,6 +791,7 @@ export function useCarrierForm() {
removePrice,
submitPrices,
// actions
uploadDischarge,
validateMainFront,
buildMainPayload,
submitMain,