Update an existing vehicle
POST/company/vehicles/:id
Aggiorna le informazioni di un veicolo esistente, inclusi metadati e caricamenti di file.
Obiettivo
Consentire alle aziende di modificare le specifiche del veicolo, aggiornare la documentazione e gestire le impostazioni predefinite del veicolo.
Casi d'Uso
- Aggiornare le specifiche del veicolo (tipo, capacità di carico)
- Sostituire o rimuovere immagini del veicolo e certificati ITV
- Modificare il tipo di spedizione e le impostazioni di temperatura
- Impostare o rimuovere il veicolo come predefinito per l'utente
Flusso di Validazione
flowchart TD
A[Ricevi Richiesta] --> B{L'Utente ha un'Azienda?}
B -->|No| C[401 CIA_NOT_FOUND]
B -->|Sì| D{Il Veicolo Esiste?}
D -->|No| E[404 VEHICLE_NOT_FOUND]
D -->|Sì| F{L'Azienda Possiede il Veicolo?}
F -->|No| G[403 CIA_NOT_OWNER]
F -->|Sì| H{shipping_type Cambiato?}
H -->|Sì a dry| I[Rimuovi automaticamente fresh_cargo_temp]
H -->|Sì a fresh| J{fresh_cargo_temp Valido?}
J -->|No| K[400 Temp Richiesta]
J -->|Sì| L[Aggiorna Veicolo]
H -->|No| L
I --> L
L --> M{default_vehicle = true?}
M -->|Sì| N[Aggiorna Predefinito Utente]
M -->|No| O[Restituisci Veicolo Aggiornato]
N --> O
Eliminazione File
Per eliminare un file esistente (immagine o itv), inviare il campo con un valore stringa vuoto. Il file verrà rimosso dallo storage S3 e il campo verrà impostato come vuoto.
Esempio:
\{
image: ,
<Heading
id={"request"}
as={"h2"}
className={"openapi-tabs__heading"}
children={"Request"}
>
</Heading>
<ParamsDetails
parameters={[{"name":"id","in":"path","required":true,"description":"Identificatore univoco del veicolo da aggiornare","schema":{"type":"string","pattern":"^[0-9a-f]{24}$","example":"68fb5b7df42f3ccb7e37b62b"}}]}
>
</ParamsDetails>
<RequestSchema
title={"Body"}
body={{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"plate":{"type":"string","description":"Targa del veicolo (verrà memorizzata in minuscolo)","minLength":3,"maxLength":20,"example":"8521EEE"},"vehicle_type":{"type":"string","description":"Tipo di veicolo","enum":["r3c","tir","rt","r2c","r2d","van","frc","f2c","adr","ft","pt","cc","hdcc","dump","live","cocar"],"example":"tir"},"cargo_type":{"description":"Tipi di carico supportati. Accetta due formati:\n1. Array JSON: [up, lateral, back]\n2. Stringa separata da virgole: up, lateral, back","oneOf":[{"type":"array","items":{"type":"string","enum":["up","lateral","back"]}},{"type":"string","pattern":"^(up|lateral|back)(,\\s*(up|lateral|back))*$"}],"example":["up","lateral"]},"shipping_type":{"type":"string","description":"Tipo di spedizione/trasporto","enum":["fresh","dry"],"example":"dry"},"fresh_cargo_temp":{"type":"number","description":"Temperatura per carico refrigerato (OBBLIGATORIO se shipping_type='fresh', intervallo -20 a 40). Rimossa automaticamente se shipping_type cambia in 'dry'.","minimum":-20,"maximum":40,"nullable":true,"example":-18},"image":{"oneOf":[{"type":"string","format":"binary","description":"Nuovo file fotografico del veicolo (JPEG, PNG)"},{"type":"string","description":"Invia una stringa vuota per eliminare l'immagine esistente","example":""}]},"itv":{"oneOf":[{"type":"string","format":"binary","description":"Nuovo file del certificato di ispezione ITV (PDF, JPEG, PNG)"},{"type":"string","description":"Invia una stringa vuota per eliminare il certificato ITV esistente","example":""}]},"default_vehicle":{"type":"string","description":"Se impostato su 'vero', questo veicolo diventa il veicolo predefinito dell'utente per le operazioni di firma digitale.","enum":["true"],"example":"true"}}}}}}}
>
</RequestSchema>
<StatusCodes
id={undefined}
label={undefined}
responses={{"200":{"description":"Veicolo aggiornato con successo.","content":{"application/json":{"schema":{"type":"object","description":"Rappresenta un veicolo della flotta di una società di trasporti.\n**Funzionalità**: Gestione completa delle flotte con specifiche tecniche, capacità di carico e documentazione (immagine e revisione).\n**Modello**: `src/features/models/vehicle.model.js`\n**Controller**: `src/features/vehicles/controller.js`","required":["_id","plate","vehicle_type","cargo_type","shipping_type"],"properties":{"_id":{"type":"string","description":"Identificatore univoco MongoDB del veicolo (24 caratteri esadecimali)","pattern":"^[0-9a-f]{24}$","example":"68fb5b7df42f3ccb7e37b62b"},"plate":{"type":"string","description":"Targa del veicolo (memorizzata automaticamente in minuscolo)","minLength":3,"maxLength":20,"example":"8521eee"},"vehicle_type":{"type":"string","description":"Tipo di veicolo secondo catalogo del sistema","enum":["NONE","r3c","tir","rt","r2c","r2d","van","frc","f2c","adr","ft","pt","cc","hdcc","dump","live","cocar"],"example":"tir"},"cargo_type":{"type":"array","items":{"type":"string","enum":["NONE","up","lateral","back"]},"description":"Tipi di carico supportati dal veicolo (superiore, laterale, posteriore)","minItems":1,"example":["up","lateral","back"]},"shipping_type":{"type":"string","description":"Tipo di trasporto (refrigerato o a secco)","enum":["fresh","dry"],"example":"dry"},"fresh_cargo_temp":{"type":"number","nullable":true,"description":"Temperatura per carico refrigerato in °C (RICHIESTO se shipping_type='fresh', intervallo -20 a 40)","minimum":-20,"maximum":40,"example":-18},"image":{"type":"string","description":"URL interna per accedere all'immagine del veicolo (/images?file={key})","example":"/images?file=vehicles/8521eee.jpg"},"itv":{"type":"string","description":"URL interna per accedere al certificato di revisione ITV (/images?file={key})","example":"/images?file=itv/8521eee.pdf"},"cargo":{"type":"object","description":"Intervalli di capacità di carico calcolati automaticamente in base a vehicle_type","properties":{"min":{"type":"number","description":"Volume minimo di carico in m³","example":20},"max":{"type":"number","description":"Volume massimo di carico in m³","example":35},"kg_min":{"type":"number","description":"Capacità minima di peso in kg","example":20000},"kg_max":{"type":"number","description":"Capacità massima di peso in kg","example":30000}}},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp dell'ultimo aggiornamento","example":"2025-07-22T10:15:30.000Z"}},"title":"Vehicle"},"example":{"_id":"68fb5b7df42f3ccb7e37b62b","plate":"8521eee","vehicle_type":"tir","shipping_type":"dry","cargo_type":["up","lateral"],"image":"/images?file=vehicles/8521eee_updated.jpg","itv":"","fresh_cargo_temp":null,"cargo":{"min":20,"max":35,"kg_min":20000,"kg_max":30000},"updatedAt":"2025-07-23T14:30:00.000Z"}}},"headers":{}},"401":{"description":"L'utente non ha un'azienda associata.","content":{"application/json":{"schema":{"type":"object","required":["status","message"],"properties":{"status":{"type":"integer","description":"Codice di stato HTTP","minimum":400,"maximum":599,"example":400},"message":{"type":"string","description":"Codice di errore del sistema.\n\nCodici di errore comuni (vedi listado_errores_http.txt per la lista completa):\n- NO_TOKEN (401): Token JWT non fornito\n- TOKEN_NOT_VALID (401): Token JWT non valido o scaduto\n- NO_ADMIN_ROLE (401): L'utente non dispone dei privilegi di amministratore\n- INVALID_PARAMETERS (400): Parametri della richiesta non validi\n- NOT_FOUND (404): Risorsa richiesta non trovata\n- ALREADY_EXIST (401): Risorsa con lo stesso identificatore già esistente\n- UTC_VALIDATION_FAILED (400): Validazione del timestamp UTC fallita\n- INTERNAL_ERROR (500): Si è verificato un errore imprevisto del server\n\nIl messaggio è risolto da `handlerError.getErrorMessage(error)`.","example":"INVALID_PARAMETERS"}},"description":"Formato standard di risposta per errori utilizzato in tutti gli endpoint API.\n\nTutti gli errori seguono lo schema `{status: number, message: string}`.\nIl codice di stato è ripetuto sia nella risposta HTTP che nel corpo.\n\nI messaggi di errore sono costanti definite nel codice e devono essere\ngestiti lato client con messaggi appropriati rivolti all'utente.","example":{"status":400,"message":"INVALID_PARAMETERS"},"title":"ErrorResponse"},"example":{"error":"CIA_NOT_FOUND","message":"Company not found for user"}}}},"403":{"description":"Il veicolo non appartiene all'azienda dell'utente autenticato.","content":{"application/json":{"schema":{"type":"object","required":["status","message"],"properties":{"status":{"type":"integer","description":"Codice di stato HTTP","minimum":400,"maximum":599,"example":400},"message":{"type":"string","description":"Codice di errore del sistema.\n\nCodici di errore comuni (vedi listado_errores_http.txt per la lista completa):\n- NO_TOKEN (401): Token JWT non fornito\n- TOKEN_NOT_VALID (401): Token JWT non valido o scaduto\n- NO_ADMIN_ROLE (401): L'utente non dispone dei privilegi di amministratore\n- INVALID_PARAMETERS (400): Parametri della richiesta non validi\n- NOT_FOUND (404): Risorsa richiesta non trovata\n- ALREADY_EXIST (401): Risorsa con lo stesso identificatore già esistente\n- UTC_VALIDATION_FAILED (400): Validazione del timestamp UTC fallita\n- INTERNAL_ERROR (500): Si è verificato un errore imprevisto del server\n\nIl messaggio è risolto da `handlerError.getErrorMessage(error)`.","example":"INVALID_PARAMETERS"}},"description":"Formato standard di risposta per errori utilizzato in tutti gli endpoint API.\n\nTutti gli errori seguono lo schema `{status: number, message: string}`.\nIl codice di stato è ripetuto sia nella risposta HTTP che nel corpo.\n\nI messaggi di errore sono costanti definite nel codice e devono essere\ngestiti lato client con messaggi appropriati rivolti all'utente.","example":{"status":400,"message":"INVALID_PARAMETERS"},"title":"ErrorResponse"},"example":{"error":"CIA_NOT_OWNER","message":"Vehicle does not belong to user's company"}}}},"404":{"description":"Veicolo o utente non trovato","content":{"application/json":{"schema":{"type":"object","required":["status","message"],"properties":{"status":{"type":"integer","description":"Codice di stato HTTP","minimum":400,"maximum":599,"example":400},"message":{"type":"string","description":"Codice di errore del sistema.\n\nCodici di errore comuni (vedi listado_errores_http.txt per la lista completa):\n- NO_TOKEN (401): Token JWT non fornito\n- TOKEN_NOT_VALID (401): Token JWT non valido o scaduto\n- NO_ADMIN_ROLE (401): L'utente non dispone dei privilegi di amministratore\n- INVALID_PARAMETERS (400): Parametri della richiesta non validi\n- NOT_FOUND (404): Risorsa richiesta non trovata\n- ALREADY_EXIST (401): Risorsa con lo stesso identificatore già esistente\n- UTC_VALIDATION_FAILED (400): Validazione del timestamp UTC fallita\n- INTERNAL_ERROR (500): Si è verificato un errore imprevisto del server\n\nIl messaggio è risolto da `handlerError.getErrorMessage(error)`.","example":"INVALID_PARAMETERS"}},"description":"Formato standard di risposta per errori utilizzato in tutti gli endpoint API.\n\nTutti gli errori seguono lo schema `{status: number, message: string}`.\nIl codice di stato è ripetuto sia nella risposta HTTP che nel corpo.\n\nI messaggi di errore sono costanti definite nel codice e devono essere\ngestiti lato client con messaggi appropriati rivolti all'utente.","example":{"status":400,"message":"INVALID_PARAMETERS"},"title":"ErrorResponse"},"examples":{"vehicleNotFound":{"value":{"error":"VEHICLE_NOT_FOUND","message":"Vehicle not found"}},"userNotFound":{"value":{"error":"USER_NOT_FOUND","message":"User not found (when using default_vehicle)"}}}}}},"503":{"description":"Errore del server durante l'aggiornamento","content":{"application/json":{"schema":{"type":"object","required":["status","message"],"properties":{"status":{"type":"integer","description":"Codice di stato HTTP","minimum":400,"maximum":599,"example":400},"message":{"type":"string","description":"Codice di errore del sistema.\n\nCodici di errore comuni (vedi listado_errores_http.txt per la lista completa):\n- NO_TOKEN (401): Token JWT non fornito\n- TOKEN_NOT_VALID (401): Token JWT non valido o scaduto\n- NO_ADMIN_ROLE (401): L'utente non dispone dei privilegi di amministratore\n- INVALID_PARAMETERS (400): Parametri della richiesta non validi\n- NOT_FOUND (404): Risorsa richiesta non trovata\n- ALREADY_EXIST (401): Risorsa con lo stesso identificatore già esistente\n- UTC_VALIDATION_FAILED (400): Validazione del timestamp UTC fallita\n- INTERNAL_ERROR (500): Si è verificato un errore imprevisto del server\n\nIl messaggio è risolto da `handlerError.getErrorMessage(error)`.","example":"INVALID_PARAMETERS"}},"description":"Formato standard di risposta per errori utilizzato in tutti gli endpoint API.\n\nTutti gli errori seguono lo schema `{status: number, message: string}`.\nIl codice di stato è ripetuto sia nella risposta HTTP che nel corpo.\n\nI messaggi di errore sono costanti definite nel codice e devono essere\ngestiti lato client con messaggi appropriati rivolti all'utente.","example":{"status":400,"message":"INVALID_PARAMETERS"},"title":"ErrorResponse"},"example":{"error":"SERVICE_UNAVAILABLE","message":"Error updating vehicle"}}}}}}
>
</StatusCodes>