Update an existing vehicle
POST/company/vehicles/:id
Met à jour les informations d'un véhicule existant, y compris les métadonnées et les téléchargements de fichiers.
Objectif
Permettre aux entreprises de modifier les spécifications des véhicules, de mettre à jour la documentation et de gérer les paramètres par défaut des véhicules.
Cas d'utilisation
- Mettre à jour les spécifications du véhicule (type, capacités de chargement)
- Remplacer ou supprimer les images du véhicule et les certificats ITV
- Modifier le type d'expédition et les paramètres de température
- Définir ou annuler le véhicule comme véhicule par défaut de l'utilisateur
Flux de validation
flowchart TD
A[Recevoir la Demande] --> B{L'Utilisateur a une Entreprise?}
B -->|Non| C[401 CIA_NOT_FOUND]
B -->|Oui| D{Le Véhicule Existe?}
D -->|Non| E[404 VEHICLE_NOT_FOUND]
D -->|Oui| F{L'Entreprise Possède le Véhicule?}
F -->|Non| G[403 CIA_NOT_OWNER]
F -->|Oui| H{shipping_type Modifié?}
H -->|Oui vers dry| I[Suppression automatique de fresh_cargo_temp]
H -->|Oui vers fresh| J{fresh_cargo_temp Valide?}
J -->|Non| K[400 Température Requise]
J -->|Oui| L[Mettre à Jour le Véhicule]
H -->|Non| L
I --> L
L --> M{default_vehicle = true?}
M -->|Oui| N[Mettre à Jour le Véhicule par Défaut de l'Utilisateur]
M -->|Non| O[Retourner le Véhicule Mis à Jour]
N --> O
Suppression de Fichier
Pour supprimer un fichier existant (image ou itv), envoyez le champ avec une valeur de chaîne vide. Le fichier sera supprimé du stockage S3 et le champ sera défini comme vide.
Exemple :
<Heading
id={"request"}
as={"h2"}
className={"openapi-tabs__heading"}
children={"Request"}
>
</Heading>
<ParamsDetails
parameters={[{"name":"id","in":"path","required":true,"description":"Identifiant unique du véhicule à mettre à jour","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":"Plaque d'immatriculation du véhicule (sera stockée en minuscules)","minLength":3,"maxLength":20,"example":"8521EEE"},"vehicle_type":{"type":"string","description":"Type de véhicule","enum":["r3c","tir","rt","r2c","r2d","van","frc","f2c","adr","ft","pt","cc","hdcc","dump","live","cocar"],"example":"tir"},"cargo_type":{"description":"Types de carga pris en charge. Accepte deux formats :\n1. Tableau JSON : [up, lateral, back]\n2. Chaîne de caractères séparée par des virgules : 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":"Type de livraison/transport","enum":["fresh","dry"],"example":"dry"},"fresh_cargo_temp":{"type":"number","description":"Température pour cargaison réfrigérée (OBLIGATOIRE si shipping_type='fresh', plage -20 à 40). Supprimée automatiquement si shipping_type change en 'dry'.","minimum":-20,"maximum":40,"nullable":true,"example":-18},"image":{"oneOf":[{"type":"string","format":"binary","description":"Fichier photo du nouveau véhicule (JPEG, PNG)"},{"type":"string","description":"Envoyer une chaîne vide pour supprimer l'image existante","example":""}]},"itv":{"oneOf":[{"type":"string","format":"binary","description":"Fichier du nouveau certificat d'inspection ITV (PDF, JPEG, PNG)"},{"type":"string","description":"Envoyez une chaîne vide pour supprimer le certificat ITV existant","example":""}]},"default_vehicle":{"type":"string","description":"Si défini sur 'vrai', ce véhicule devient le véhicule par défaut de l'utilisateur pour les opérations de signature numérique.","enum":["true"],"example":"true"}}}}}}}
>
</RequestSchema>
<StatusCodes
id={undefined}
label={undefined}
responses={{"200":{"description":"Véhicule mis à jour avec succès.","content":{"application/json":{"schema":{"type":"object","description":"Représente un véhicule de la flotte d'une entreprise de transport.\n**Fonctionnalité** : Gestion complète des flottes avec spécifications techniques, capacités de chargement et documentation (image et contrôle technique).\n**Modèle** : `src/features/models/vehicle.model.js`\n**Contrôleur** : `src/features/vehicles/controller.js`","required":["_id","plate","vehicle_type","cargo_type","shipping_type"],"properties":{"_id":{"type":"string","description":"Identifiant unique MongoDB du véhicule (24 caractères hexadécimaux)","pattern":"^[0-9a-f]{24}$","example":"68fb5b7df42f3ccb7e37b62b"},"plate":{"type":"string","description":"Immatriculation du véhicule (stockée automatiquement en minuscules)","minLength":3,"maxLength":20,"example":"8521eee"},"vehicle_type":{"type":"string","description":"Type de véhicule selon le catalogue du système","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":"Types de chargement supportés par le véhicule (supérieur, latéral, arrière)","minItems":1,"example":["up","lateral","back"]},"shipping_type":{"type":"string","description":"Type de transport (réfrigéré ou sec)","enum":["fresh","dry"],"example":"dry"},"fresh_cargo_temp":{"type":"number","nullable":true,"description":"Température pour chargement réfrigéré en °C (REQUIS si shipping_type='fresh', plage -20 à 40)","minimum":-20,"maximum":40,"example":-18},"image":{"type":"string","description":"URL interne pour accéder à l'image du véhicule (/images?file={key})","example":"/images?file=vehicles/8521eee.jpg"},"itv":{"type":"string","description":"URL interne pour accéder au certificat d'ITV (/images?file={key})","example":"/images?file=itv/8521eee.pdf"},"cargo":{"type":"object","description":"Plages de capacité de charge calculées automatiquement selon le type de véhicule","properties":{"min":{"type":"number","description":"Volume minimum de chargement en m³","example":20},"max":{"type":"number","description":"Volume maximal de chargement en m³","example":35},"kg_min":{"type":"number","description":"Capacité minimale de poids en kg","example":20000},"kg_max":{"type":"number","description":"Capacité maximale de poids en kg","example":30000}}},"updatedAt":{"type":"string","format":"date-time","description":"Horodatage de dernière mise à jour","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'utilisateur n'a pas d'entreprise associée.","content":{"application/json":{"schema":{"type":"object","required":["status","message"],"properties":{"status":{"type":"integer","description":"Code de statut HTTP","minimum":400,"maximum":599,"example":400},"message":{"type":"string","description":"Code d'erreur du système.\n\nCodes d'erreur courants (voir listado_errores_http.txt pour la liste complète) :\n- NO_TOKEN (401) : Jeton JWT non fourni\n- TOKEN_NOT_VALID (401) : Le jeton JWT est invalide ou a expiré\n- NO_ADMIN_ROLE (401) : L'utilisateur ne dispose pas des privilèges d'administrateur\n- INVALID_PARAMETERS (400) : Les paramètres de la requête sont invalides\n- NOT_FOUND (404) : Ressource demandée introuvable\n- ALREADY_EXIST (401) : Une ressource avec le même identifiant existe déjà\n- UTC_VALIDATION_FAILED (400) : Échec de la validation de l'horodatage UTC\n- INTERNAL_ERROR (500) : Une erreur serveur inattendue s'est produite\n\nLe message est résolu par `handlerError.getErrorMessage(error)`.","example":"INVALID_PARAMETERS"}},"description":"Format de réponse d'erreur standard utilisé sur tous les points d'extrémité de l'API.\n\nToutes les erreurs suivent le modèle `{status: number, message: string}`.\nLe code de statut est répété à la fois dans la réponse HTTP et dans le corps.\n\nLes messages d'erreur sont des constantes définies dans la base de code et doivent être\ngérés côté client avec des messages appropriés destinés à l'utilisateur.","example":{"status":400,"message":"INVALID_PARAMETERS"},"title":"ErrorResponse"},"example":{"error":"CIA_NOT_FOUND","message":"Company not found for user"}}}},"403":{"description":"Le véhicule n'appartient pas à la société de l'utilisateur authentifié.","content":{"application/json":{"schema":{"type":"object","required":["status","message"],"properties":{"status":{"type":"integer","description":"Code de statut HTTP","minimum":400,"maximum":599,"example":400},"message":{"type":"string","description":"Code d'erreur du système.\n\nCodes d'erreur courants (voir listado_errores_http.txt pour la liste complète) :\n- NO_TOKEN (401) : Jeton JWT non fourni\n- TOKEN_NOT_VALID (401) : Le jeton JWT est invalide ou a expiré\n- NO_ADMIN_ROLE (401) : L'utilisateur ne dispose pas des privilèges d'administrateur\n- INVALID_PARAMETERS (400) : Les paramètres de la requête sont invalides\n- NOT_FOUND (404) : Ressource demandée introuvable\n- ALREADY_EXIST (401) : Une ressource avec le même identifiant existe déjà\n- UTC_VALIDATION_FAILED (400) : Échec de la validation de l'horodatage UTC\n- INTERNAL_ERROR (500) : Une erreur serveur inattendue s'est produite\n\nLe message est résolu par `handlerError.getErrorMessage(error)`.","example":"INVALID_PARAMETERS"}},"description":"Format de réponse d'erreur standard utilisé sur tous les points d'extrémité de l'API.\n\nToutes les erreurs suivent le modèle `{status: number, message: string}`.\nLe code de statut est répété à la fois dans la réponse HTTP et dans le corps.\n\nLes messages d'erreur sont des constantes définies dans la base de code et doivent être\ngérés côté client avec des messages appropriés destinés à l'utilisateur.","example":{"status":400,"message":"INVALID_PARAMETERS"},"title":"ErrorResponse"},"example":{"error":"CIA_NOT_OWNER","message":"Vehicle does not belong to user's company"}}}},"404":{"description":"Véhicule ou utilisateur non trouvé","content":{"application/json":{"schema":{"type":"object","required":["status","message"],"properties":{"status":{"type":"integer","description":"Code de statut HTTP","minimum":400,"maximum":599,"example":400},"message":{"type":"string","description":"Code d'erreur du système.\n\nCodes d'erreur courants (voir listado_errores_http.txt pour la liste complète) :\n- NO_TOKEN (401) : Jeton JWT non fourni\n- TOKEN_NOT_VALID (401) : Le jeton JWT est invalide ou a expiré\n- NO_ADMIN_ROLE (401) : L'utilisateur ne dispose pas des privilèges d'administrateur\n- INVALID_PARAMETERS (400) : Les paramètres de la requête sont invalides\n- NOT_FOUND (404) : Ressource demandée introuvable\n- ALREADY_EXIST (401) : Une ressource avec le même identifiant existe déjà\n- UTC_VALIDATION_FAILED (400) : Échec de la validation de l'horodatage UTC\n- INTERNAL_ERROR (500) : Une erreur serveur inattendue s'est produite\n\nLe message est résolu par `handlerError.getErrorMessage(error)`.","example":"INVALID_PARAMETERS"}},"description":"Format de réponse d'erreur standard utilisé sur tous les points d'extrémité de l'API.\n\nToutes les erreurs suivent le modèle `{status: number, message: string}`.\nLe code de statut est répété à la fois dans la réponse HTTP et dans le corps.\n\nLes messages d'erreur sont des constantes définies dans la base de code et doivent être\ngérés côté client avec des messages appropriés destinés à l'utilisateur.","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":"Erreur du serveur pendant la mise à jour","content":{"application/json":{"schema":{"type":"object","required":["status","message"],"properties":{"status":{"type":"integer","description":"Code de statut HTTP","minimum":400,"maximum":599,"example":400},"message":{"type":"string","description":"Code d'erreur du système.\n\nCodes d'erreur courants (voir listado_errores_http.txt pour la liste complète) :\n- NO_TOKEN (401) : Jeton JWT non fourni\n- TOKEN_NOT_VALID (401) : Le jeton JWT est invalide ou a expiré\n- NO_ADMIN_ROLE (401) : L'utilisateur ne dispose pas des privilèges d'administrateur\n- INVALID_PARAMETERS (400) : Les paramètres de la requête sont invalides\n- NOT_FOUND (404) : Ressource demandée introuvable\n- ALREADY_EXIST (401) : Une ressource avec le même identifiant existe déjà\n- UTC_VALIDATION_FAILED (400) : Échec de la validation de l'horodatage UTC\n- INTERNAL_ERROR (500) : Une erreur serveur inattendue s'est produite\n\nLe message est résolu par `handlerError.getErrorMessage(error)`.","example":"INVALID_PARAMETERS"}},"description":"Format de réponse d'erreur standard utilisé sur tous les points d'extrémité de l'API.\n\nToutes les erreurs suivent le modèle `{status: number, message: string}`.\nLe code de statut est répété à la fois dans la réponse HTTP et dans le corps.\n\nLes messages d'erreur sont des constantes définies dans la base de code et doivent être\ngérés côté client avec des messages appropriés destinés à l'utilisateur.","example":{"status":400,"message":"INVALID_PARAMETERS"},"title":"ErrorResponse"},"example":{"error":"SERVICE_UNAVAILABLE","message":"Error updating vehicle"}}}}}}
>
</StatusCodes>