API des Rendez-vous
đ Pourquoi utiliser lâAPI des Rendez-vousâ?â
Les rendez-vous sont le cĆur des opĂ©rations dâentrepĂŽt dans DataDocks. Ils reprĂ©sentent des crĂ©neaux horaires planifiĂ©s Ă vos quais ou dans vos cours pour la rĂ©ception ou lâexpĂ©dition dâinventaire. LâAPI des rendez-vous vous donne le contrĂŽle programmatique de tout votre flux de planification dâentrepĂŽt â de la rĂ©servation de crĂ©neaux au suivi des mouvements de camions jusquâĂ la complĂ©tion des expĂ©ditions.
ProblĂšmes rĂ©els rĂ©solus par cette APIâ
- Ăliminer la double saisie : Synchronisez directement les rendez-vous entre votre ERP/WMS et DataDocks
- RĂ©duire la surcharge de communication : Automatisez les notifications entre lâĂ©quipe dâentrepĂŽt et les transporteurs
- Optimiser lâutilisation des quais : Programmez les rendez-vous pour maximiser lâefficacitĂ©
- Suivez les indicateurs en temps rĂ©el : Surveillez la ponctualitĂ©, le temps dâattente et le dĂ©bit
- Améliorer la visibilité : Offrez aux transporteurs et clients un accÚs libre-service au statut des rendez-vous
DĂ©marrage rapide en 5 minutesâ
Vous souhaitez voir lâAPI en action immĂ©diatementâ? Suivez ces Ă©tapes pour crĂ©er votre premier rendez-vous :
- Demandez et obtenez votre jeton API auprĂšs du support
- Trouvez votre sous-domaine dâemplacement (ex. :
votre-entrepot.datadocks.com) - Créez un rendez-vous de base avec cette commande :
Voir lâexemple cURL de dĂ©marrage rapide
curl -X POST \
https://your-warehouse.datadocks.com/api/v1/appointments \
-H 'Authorization: Token YOUR_API_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"appointment": {
"scheduled_at": "2023-12-15T10:00:00-05:00",
"duration": 60,
"dock_name": "Dock 1",
"shipping_number": "SHIP-12345"
}
}'
- Une requĂȘte rĂ©ussie renvoie
200 OKavec votre rendez-vous. Vérifiez votre tableau de bord DataDocks pour le voir. Utilisez une date appropriée, un quai existant, et ajoutez tout champ additionnel requis par votre emplacement.
Vue dâensemble de lâarchitecture de lâAPIâ
âââââââââââââââââââ âââââââââââââââââââ ââââââââââââââââââââââ
â Votre systĂšme ââââââââ¶â API DataDocks ââââââââ¶â Ops dâentrepĂŽt â
â (ERP/WMS/TMS) ââââââââ†(REST/JSON) ââââââââ†(Planification) â
âââââââââââââââââââ âââââââââââââââââââ ââââââââââââââââââââââ
â âČ
â â
⌠â
âââââââââââââââââââ
â Applis transporteur â
â (Pointage) â
âââââââââââââââââââââââ
Authentificationâ
Toutes les requĂȘtes Ă lâAPI doivent inclure votre jeton API dans lâen-tĂȘte Authorization :
Authorization: Token YOUR_API_TOKEN
Les jetons API appartiennent Ă des utilisateurs. Les permissions dâaccĂšs Ă lâemplacement et au rendez-vous suivent celles de lâutilisateur. Les journaux dâaudit identifient lâutilisateur APIâ; le nom affichĂ© dĂ©pend de sa configuration. Utilisez le nom dâhĂŽte complet de lâemplacement, incluant le suffixe dâorganisation si applicable.
Limitations importantesâ
- Rendez-vous rĂ©currents : impossible de les crĂ©er ou modifier par lâAPI
- Suppression de rendez-vous : non prise en charge par lâAPI (utilisez plutĂŽt lâannulation)
- Les paramĂštres DateTime doivent inclure lâinfo de fuseau horaire pour Ă©viter toute ambiguĂŻtĂ©â; sinon, la valeur du fuseau de lâemplacement sera utilisĂ©e.
- Seuls les rendez-vous non récurrents sont retournés pour les points de terminaison listant, incluant les instances générées, mais excluant les modÚles récurrents.
Lister les rendez-vousâ
Objectifâ
Récupérez une liste paginée de rendez-vous avec possibilité de filtrer par période ou numéro de bon de commande. Utilisez ce point de terminaison pour synchroniser les rendez-vous avec vos systÚmes ou générer des rapports.
Cas dâusages mĂ©tierâ
- Synchronisez les rendez-vous avec votre WMS ou TMS pour la semaine Ă venir
- Générez des rapports sur les expéditions à venir par quai ou transporteur
- Affichez les rendez-vous dans un tableau de bord avec supervision du statut
- Suivez des KPI comme la ponctualitĂ©, le temps dâattente, lâutilisation des quais
RequĂȘte HTTPâ
GET https://[location_subdomain].datadocks.com/api/v1/appointments
ParamĂštres de requĂȘteâ
| ParamĂštre | Type | Requis | Description | Exemple |
|---|---|---|---|---|
page | Integer | Non | Numéro de page pour la pagination (défaut 1) | page=2 |
internal_id | String | Non | Filtre par ID interne du rendez-vous (insensible Ă la casse, correspondance exacte) | internal_id=ERP-A12345 |
po_number | String | Non | Filtre par numéro de bon de commande (insensible à la casse, exact) | po_number=PO-12345 |
from | String | Non | Retourne les rendez-vous planifiés ce jour/heure ou aprÚs (fuseau local) | from=2023-10-01 08:00 AM |
to | String | Non | Retourne les rendez-vous planifiés avant ce jour/heure (fuseau local) | to=2023-10-05 06:00 PM |
Les filtres peuvent se combiner. Les rĂ©sultats sont ordonnĂ©s par ID de rendez-vous. Les filtres de date excluent les rendez-vous sans horaire. Le filtrage PO sâapplique au numĂ©ro sur la liste dâemballage et au bon de commande liĂ©.
Format de la rĂ©ponseâ
La rĂ©ponse contient un tableau paginĂ© dâobjets rendez-vous ayant les champs suivants. Les valeurs optionnelles non dĂ©finies sont null. Respectez le dĂ©calage dans les horodatages ISO8601 retournĂ©s sans supposer un fuseau particulier :
| Champ | Type | Description |
|---|---|---|
id | Integer | Identifiant unique du rendez-vous |
location_name | String | Nom de lâentrepĂŽt; inclus dans les rĂ©ponses de liste, dâaffichage, de crĂ©ation et de mise Ă jour |
location | String | Alias compatible pour location_name |
org | String | Nom de l'organisation |
ref_number | String | Numéro de référence formaté du rendez-vous |
created_at, updated_at | String | Horodatages de crĂ©ation et de mise Ă jour de lâenregistrement |
appointment_number | Integer | Numéro lisible du rendez-vous |
state | String | Statut actuel du rendez-vous (ex. : "booked", "arrived", "completed") |
duration | Integer | Durée en minutes |
scheduled_at | String | Horodatage ISO8601 du créneau prévu |
shipping_number | String | NumĂ©ro de rĂ©fĂ©rence dâexpĂ©dition |
trailer_number | String | NumĂ©ro dâidentification de la remorque |
bol_number | String | Numéro de BOL (connaissement) |
carrier_name | String | Nom du transporteur |
carrier_id | Integer | ID de la compagnie de transport |
driver_name | String | Nom du chauffeur |
driver_phone | String | Téléphone du chauffeur |
driver_email | String | Courriel du chauffeur |
created_by | String | Nom de lâutilisateur ayant créé le rendez-vous |
outbound | Boolean | Indique si câest un rendez-vous sortant (true) ou entrant (false) |
drop_trailer | Boolean | Indique s'il sâagit dâun rendez-vous DĂ©poser une remorque/conteneur |
queued | Boolean | Indique si ce rendez-vous est dans une file dâattente |
dock | String | Nom du quai assigné (null si une cour est assignée) |
yard | String | Nom de la cour assignée (null si un quai est assigné) |
internal_id | String | Identifiant interne de ce rendez-vous |
free_until | String | Horodatage "libre jusquâĂ " stockĂ©â; pas une heure de dispo calculĂ©e |
approved_at | String | Horodatage dâapprobation du rendez-vous |
arrived_at | String | Horodatage d'arrivée |
started_at | String | Début du chargement/déchargement |
completed_at | String | Fin du chargement/déchargement |
left_at | String | Départ |
cancelled_at | String | Annulation du rendez-vous (null = activité en cours) |
custom_values | Object | Paires clé/valeur des champs personnalisés |
packing_lists | Array | Listes dâemballage associĂ©es au rendez-vous |
notes | Array | Liste des notes associées (voir format note ci-dessous) |
documents | Array | Documents sécurisés, chacun avec id, filename et presigned_url |
warnings | Array | Messages dâavertissement prĂ©sents seulement si disponibles |
carrier_number et checklist_values sont acceptĂ©s en entrĂ©e, mais ne sont pas retournĂ©s. Les clĂ©s rĂ©ponse dock et yard diffĂšrent des clĂ©s requĂȘte dock_name et yard_name.
Les listes dâemballage retournent : id, po_number, customer_id, customer_name, created_at, updated_at, product, supplier, unit, booked_quantity, booked_weight, actual_quantity, actual_weight, et custom_values. Les valeurs associĂ©es ou numĂ©riques peuvent ĂȘtre null. Le client ne reçoit pas customer_number, product_name ou unit_name.
Exemples de codeâ
cURLâ
Voir lâexemple cURL
# Liste de base
curl -H "Authorization: Token YOUR_API_TOKEN" \
https://YOUR_LOCATION.datadocks.com/api/v1/appointments
# Filtré par plage de dates et numéro de bon de commande
curl -H "Authorization: Token YOUR_API_TOKEN" \
"https://YOUR_LOCATION.datadocks.com/api/v1/appointments?from=2023-10-01%2008:00%20AM&to=2023-10-05%2006:00%20PM&po_number=PO-12345"
JavaScriptâ
Voir lâexemple JavaScript
// Utilisation de fetch API avec les filtres
const getAppointments = async (fromDate, toDate, poNumber) => {
const params = new URLSearchParams();
if (fromDate) params.append("from", fromDate);
if (toDate) params.append("to", toDate);
if (poNumber) params.append("po_number", poNumber);
const response = await fetch(
`https://YOUR_LOCATION.datadocks.com/api/v1/appointments?${params.toString()}`,
{
method: "GET",
headers: {
Authorization: "Token YOUR_API_TOKEN",
"Content-Type": "application/json",
},
}
);
// Gestion des erreurs potentielles
if (!response.ok) {
const errorData = await response.text();
throw new Error(
`Erreur lors de la récupération des rendez-vous : ${JSON.stringify(errorData)}`
);
}
return response.json();
};
// Traitement des résultats paginés
const getAllAppointments = async (fromDate, toDate, poNumber) => {
let currentPage = 1;
let allAppointments = [];
let hasMorePages = true;
while (hasMorePages) {
const params = new URLSearchParams({
page: currentPage.toString(),
});
if (fromDate) params.append("from", fromDate);
if (toDate) params.append("to", toDate);
if (poNumber) params.append("po_number", poNumber);
const response = await fetch(
`https://YOUR_LOCATION.datadocks.com/api/v1/appointments?${params.toString()}`,
{
method: "GET",
headers: {
Authorization: "Token YOUR_API_TOKEN",
"Content-Type": "application/json",
},
}
);
if (!response.ok) {
throw new Error("Ăchec lors de la rĂ©cupĂ©ration des rendez-vous");
}
const appointments = await response.json();
allAppointments = [...allAppointments, ...appointments];
// VĂ©rifiez sâil y a dâautres pages
const totalPages = parseInt(response.headers.get("Total-Pages"), 10);
if (!Number.isInteger(totalPages) || totalPages < 1) {
throw new Error("En-tĂȘte Total-Pages manquant ou invalide");
}
hasMorePages = currentPage < totalPages;
currentPage++;
}
return allAppointments;
};
Exemple de rĂ©ponseâ
Voir lâexemple de rĂ©ponse
[
{
"id": 1,
"location_name": "EntrepĂŽt principal",
"location": "EntrepĂŽt principal",
"org": "Organisation Exemple",
"ref_number": "1",
"created_at": "2020-09-22T13:35:00-04:00",
"updated_at": "2020-09-25T13:35:00-04:00",
"appointment_number": 1,
"state": "left",
"duration": 120,
"shipping_number": "57886",
"trailer_number": "2222222",
"bol_number": "922",
"carrier_name": "FastCo",
"carrier_id": 12,
"driver_name": "Jason Smith",
"driver_phone": "+1 (555) 123-4567",
"driver_email": "jason.smith@fastco.example.com",
"created_by": "Sysadmin",
"outbound": false,
"drop_trailer": false,
"queued": false,
"dock": "Dock 2",
"yard": null,
"internal_id": "ERP-A12345",
"free_until": null,
"scheduled_at": "2020-09-30T06:00:00-04:00",
"approved_at": "2020-09-22T13:35:00-04:00",
"arrived_at": null,
"started_at": "2020-09-24T13:35:00-04:00",
"completed_at": "2020-09-24T13:35:00-04:00",
"left_at": "2020-09-25T13:35:00-04:00",
"cancelled_at": null,
"custom_values": {
"expected_at": "2020-10-01",
"travel_type": "Truck",
"forklift_operator": "Sue",
"inspection_passed": "1"
},
"packing_lists": [
{
"id": 4,
"created_at": "2020-09-22T13:35:00-04:00",
"updated_at": "2020-09-25T13:35:00-04:00",
"supplier": null,
"po_number": "A-2000",
"customer_name": "FishCo",
"customer_id": 34,
"product": "Trout",
"unit": "Skid",
"booked_quantity": 10,
"booked_weight": 152,
"actual_quantity": 12,
"actual_weight": 160,
"custom_values": {
"barcode": "11223344",
"dimensions": "S",
"temperature_celcius": "-5"
}
}
],
"notes": [
{
"id": 3,
"body": "PremiĂšre note.",
"note_type": "user_note"
}
],
"documents": []
}
]
Paginationâ
La rĂ©ponse contient jusquâĂ 20 rendez-vous par page. Les en-tĂȘtes incluent Current-Page, Page-Items, Total-Pages, Total-Count et Link. Une requĂȘte au-delĂ de la derniĂšre page retourne la derniĂšre pageâ; utilisez donc les en-tĂȘtes au lieu dâattendre une page vide. Pour plus de dĂ©tails sur les en-tĂȘtes et navigation de pagination, consultez la documentation Pagination.
PiĂšges courants et dĂ©pannageâ
-
ProblĂšmes dâanalyse date/heureâ: les paramĂštres
fromettosont interprĂ©tĂ©s dans le fuseau du site. Si le rĂ©sultat est inattendu, vĂ©rifiez que lâinfo de fuseau est fournie.â Bon : from=2023-10-01T08:00:00-04:00â Bon : from=2023-10-01 08:00 AM EDTâ Bon : from=2023-10-01 (minuit du fuseau local) -
Filtrage POâ: insensible Ă la casse mais demande une correspondance exacte. La correspondance partielle Ă©chouera.
â Correspond : po_number=PO-12345â Correspond : po_number=po-12345â Ăchoue : po_number=12345 (partiel) -
Gestion des dates mal formĂ©esâ: les dates malformĂ©es nâont pas de validation cohĂ©renteâ: lâanalyse peut donner un rĂ©sultat vide ou une erreur. PrĂ©fĂ©rez ISO8601 et encodez vos paramĂštres dâURL.
-
Rendez-vous non rĂ©currents uniquementâ: ce point de terminaison ne retourne que les rendez-vous non rĂ©currents. Les modĂšles rĂ©currents ne sont pas inclus.
-
Performanceâ: avec de grands intervalles de dates, effectuez les requĂȘtes par tranches plus courtes (ex: semaine plutĂŽt que mois) pour de meilleures performances.
CrĂ©er un rendez-vousâ
Objectifâ
CrĂ©er un nouveau rendez-vous Ă un quai ou une cour prĂ©cise, avec listes dâemballage et mĂ©tadonnĂ©es optionnelles. Câest la principale mĂ©thode pour planifier de nouveaux rendez-vous dans votre entrepĂŽt.
Cas dâusages mĂ©tierâ
- Intégration systÚme : planifier les rendez-vous directement via votre ERP, WMS ou TMS
- Planification automatisée : créer un rendez-vous selon des rÚgles métier
- Libre-service transporteur : permettre aux transporteurs de réserver par votre portail
- Applications mobiles : activer la crĂ©ation via des applis mobiles dâentrepĂŽt
- ExĂ©cution de commandes : crĂ©er automatiquement les sorties quand les commandes sont prĂȘtes
RequĂȘte HTTPâ
POST https://[location_subdomain].datadocks.com/api/v1/appointments
Corps de la requĂȘteâ
| ParamÚtre | Type | Requis | Description | Contraintes | Par défaut | Exemple |
|---|---|---|---|---|---|---|
scheduled_at | String | Non | Horaire ISO8601 du RDV | Dates passées selon permissions; min 2000-01-01 | Aucun | "2023-10-15T09:00:00-04:00" |
duration | Integer | Non | DurĂ©e en minutes | Doit ĂȘtre > 0 | CalculĂ©e selon rĂšgles de rĂ©servation | 120 |
dock_name | String | Non* | Nom du quai assigné | Insensible à la casse | Aucun | "Dock 1" |
yard_name | String | Non* | Nom de la cour assignée | Insensible à la casse | Aucun | "Yard A" |
carrier_name | String | Non** | Nom du transporteur | 2â64 caractĂšres si requis | Aucun | "FastCo Logistics" |
carrier_id | Integer | Non | ID du transporteur accessibleâ; ID modifiĂ© non vide prioritaire | Doit ĂȘtre accessible | Aucun | 123 |
carrier_number | String | Non | ID du transporteur dans votre systĂšme | Aucun | Aucun | "CARRIER-123" |
shipping_number | String | Non** | NumĂ©ro de rĂ©fĂ©rence dâexpĂ©dition | Aucun | Aucun | "SHIP-9876" |
trailer_number | String | Non** | NumĂ©ro dâidentification de la remorque | Aucun | Aucun | "TRAILER-456" |
bol_number | String | Non** | NumĂ©ro de BOL (connaissement) | 2â256 caractĂšres si non nul | Aucun | "BOL-789" |
driver_name | String | Non** | Nom du chauffeur | 2â64 caractĂšres si non nul | Aucun | "John Smith" |
driver_phone | String | Non** | TĂ©lĂ©phone du chauffeur | 10â20 caractĂšres si non nul | Aucun | "+1 (555) 123-4567" |
driver_email | String | Non** | Courriel du chauffeur | 7â128 caractĂšres si non nulâ; pas de validation email | Aucun | "driver@carrier.com" |
outbound | Boolean | Non | Indique si sortie (true) | Aucun | Préférence utilisateur ou lieu | true |
drop_trailer | Boolean | Non | Rendez-vous Déposer une remorque/conteneur | Aucun | false | false |
queued | Boolean | Non | Rendez-vous en file dâattente | Aucun | false | false |
free_until | String | Non | Horodatage «âlibre jusquâĂ â» enregistrĂ© | Pas de comparaison gĂ©nĂ©rale avec scheduled_atâ; peut ĂȘtre obligatoire | Aucun | "2023-10-15T11:00:00-04:00" |
internal_id | String | Non | ID interne du rendez-vous | Aucun | Aucun | "ERP-A12345" |
approved_at | String | Non | Date/heure dâapprobation ISO8601 | Aucun | Aucun | "2023-10-14T09:00:00-04:00" |
arrived_at | String | Non | Arrivée ISO8601 | Aucun | Aucun | "2023-10-15T08:45:00-04:00" |
started_at | String | Non | Début de chargement ISO8601 | Aucun | Aucun | "2023-10-15T09:05:00-04:00" |
completed_at | String | Non | Fin du chargement ISO8601 | Aucun | Aucun | "2023-10-15T10:30:00-04:00" |
left_at | String | Non | Départ ISO8601 | Aucun | Aucun | "2023-10-15T10:45:00-04:00" |
cancelled_at | String | Non | Annulation ISO8601 | Aucun | Aucun | "2023-10-14T10:00:00-04:00" |
packing_lists | Array | Non** | Tableaux de listes dâemballage | Aucun | Aucun | Voir format ci-dessous |
notes | Array | Non | Tableaux de notes | Aucun | Aucun | Voir format ci-dessous |
custom_values | Object | Non** | Champs personnalisés clé/valeur. La clé sera en minuscules avec underscores. | Selon configuration lieu | Aucun | {"reference": "ABC123"} |
checklist_values | Object | Non | Valeurs de liste de contrĂŽle conservĂ©esâ; non retournĂ©es en rĂ©ponse | Selon configuration | Aucun | {"safety_check": "Passed"} |
* Lâassignation dĂ©pend de la configuration et lâauto-assignation. Les noms inconnus ne retournent pas une erreur dĂ©diĂ©e, la validation et auto-association peuvent alors sâappliquer.
** Peut ĂȘtre requis selon les prĂ©fĂ©rences de lâemplacement.
Approbation automatique des rendez-vousâ
Par dĂ©faut, les rendez-vous créés via API peuvent ĂȘtre automatiquement approuvĂ©s selon les paramĂštres de votre emplacement (si scheduled_at est prĂ©sent). Ce comportement est gĂ©rĂ© en interne (contactez le support pour modifier ce rĂ©glage dâapprobation automatique API).
Un rendez-vous peut ĂȘtre créé sans scheduled_at. Lâomission de duration lance les rĂšgles de rĂ©servation par dĂ©faut. Toute modification pertinente dĂ©clenche un nouveau calcul. Lâapprobation explicite et les transitions dâĂ©tat ultĂ©rieures peuvent remplir le champ approved_at mĂȘme si lâapprobation automatique API est dĂ©sactivĂ©e.
Logique dâassignation du transporteurâ
Un carrier_id changĂ© et non vide prĂ©vaut et doit rĂ©fĂ©rer Ă une entreprise accessible. Sinon, carrier_number est utilisĂ© (insensible Ă la casse), lorsque le nom est vide ou inchangĂ©. Si aucun numĂ©ro ne correspond, il devient le nom utilisĂ© pour lâassignation suivante. Un nom changĂ© prĂ©vaut gĂ©nĂ©ralement sur le numĂ©ro. Lâassignation par nom peut correspondre ou crĂ©er un transporteur selon les rĂ©glages et permissions dâemplacement. Renvoyer le mĂȘme ID nâest pas considĂ©rĂ© comme un changement.
Format des listes dâemballageâ
{
"po_number": "PO-12345",
"customer_name": "ACME Corp",
"customer_number": "CUST-001",
"product_name": "Widgets",
"unit_name": "Skid",
"booked_quantity": 10,
"booked_weight": 500,
"actual_quantity": null,
"actual_weight": null,
"custom_values": {
"temperature": "-5",
"fragile": "Yes"
}
}
DĂ©tail des paramĂštres de liste d'emballageâ
| ParamÚtre | Type | Requis | Description | Contraintes | Défaut | Exemple |
|---|---|---|---|---|---|---|
id | Integer | Non* | ID existant de la liste (obligatoire pour MAJ/suppression) | Doit ĂȘtre valide pour une liste existante liĂ©e au rendez-vous | Aucun | 123 |
po_number | String | Non** | Numéro de bon de commande | Longueur max selon lieu | Aucun | "PO-12345" |
customer_name | String | Non** | Nom du client | 2â255 car. si fourni | Aucun | "ACME Corp" |
customer_number | String | Non | Numéro du client (recherche si nom/ID non fourni) | Aucun | Aucun | "CUST-001" |
customer_id | Integer | Non | ID direct du client (prioritaire) | Doit ĂȘtre accessible via lâemplacement | Aucun | 456 |
product_name | String | Non** | Nom du produit | Doit exister ou ĂȘtre crĂ©able selon le lieu | Aucun | "Widgets" |
unit_name | String | Non** | Nom de lâunitĂ© | Idem | Aucun | "Skid" |
booked_quantity | DĂ©cimal | Non** | QuantitĂ© planifiĂ©e | >= 0â; obligatoire ou selon limites | Aucun | 10 ou 10.5 |
booked_weight | DĂ©cimal | Non** | Poids planifiĂ© | >= 0â; obligatoire ou selon limites | Aucun | 500 ou 500.75 |
actual_quantity | DĂ©cimal | Non | QuantitĂ© rĂ©elle reçue/expĂ©diĂ©e (en MĂJ) | >= 0 et dans les limites | null | 9 ou 9.5 |
actual_weight | DĂ©cimal | Non | Poids rĂ©el reçu/expĂ©diĂ© (en MĂJ) | >= 0 et dans les limites | null | 450 ou 450.25 |
custom_values | Objet | Non** | Champs personnalisés clé/valeur. Clef minuscule avec underscores. | Champs obligatoires vérifiés, clés inconnues non filtrées | {} | {"lot_number": "A123"} |
_destroy | Booléen | Non* | Mettre à true pour supprimer la liste (en MAJ seulement) | Seulement lors des PUT sur /appointments/:id | false | true |
* Uniquement pertinent lors des MAJ via PUT /appointments/:id pour modifier/supprimer une liste dâemballage existante.
** Peut ĂȘtre requis selon la configuration des champs du lieu. Consultez les rĂ©glages de votre site.
Logique dâassignation du clientâ
Lors de la crĂ©ation/modif des listes dâemballage, un customer_id modifiĂ©, non vide, prĂ©vaut et doit rĂ©fĂ©rer Ă une entreprise accessible. Renvoyer le mĂȘme ID Ă nouveau nâest pas un changement. Sinon :
-
Si
customer_numberest fourni et que le nom est vide ou inchangĂ©, le systĂšme :- Cherche une sociĂ©tĂ© avec le mĂȘme numĂ©ro client
- Si trouvé, remplit automatiquement
customer_nameetcustomer_id - Sinon, met
customer_name=customer_numberfourni
-
Un nom changĂ© prĂ©vaut gĂ©nĂ©ralement sur la recherche par numĂ©ro. Lâassignation de nom peut correspondre ou crĂ©er un client selon les permissions.
Gestion des Produits et UnitĂ©sâ
Pour produits et unitĂ©s, la correspondance insensible Ă la casse ignore les espaces autour. La crĂ©ation automatique est dĂ©sactivĂ©e par dĂ©faut et peut ĂȘtre activĂ©e via support. Les noms inconnus ne gĂ©nĂšrent pas toujours une erreurâ: les rĂšgles obligatoires et la validation dĂ©terminent si la requĂȘte Ă©choue, ou si lâassociation reste vide. Les restrictions de produit-unitĂ© sâappliquent.
En mise Ă jour, lâomission de product_name ou unit_name conserve lâassociation. Une chaĂźne vide la retire selon la validation.
Format de la noteâ
{
"body": "Le chauffeur a besoin dâun hayon hydraulique"
}
Les nouvelles notes sont liĂ©es automatiquement Ă lâutilisateur API courant. Ajoutez un id pour modifier, ou id + _destroy: true pour supprimer. Utilisez notes intĂ©grĂ© plutĂŽt que lâancien champ scalaire note.
Les réponses incluent un champ en lecture seule note_type :
| Valeur | Signification |
|---|---|
user_note | Une note Ă©crite par une personne. Par dĂ©fautâ; seul type crĂ©able par lâAPI. |
cancellation_note | Saisie par DataDocks lors dâune annulation par le portail de rĂ©servation (raison obligatoire). |
note_type est attribuĂ© par DataDocks et ignorĂ© en entrĂ©e. Les notes dâannulation sont indĂ©lĂ©bilesâ: les demandes de suppression dâune telle note Ă©chouent et font Ă©chouer toute la modification.
RĂ©ponseâ
Une requĂȘte Ă succĂšs retourne un 200 OK avec lâobjet rendez-vous complet, incluant lâid gĂ©n Ă©rĂ© et toutes valeurs systĂšme.
Exemples de codeâ
cURLâ
Voir lâexemple cURL
curl -H "Authorization: Token YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-X POST \
-d '{
"appointment": {
"scheduled_at": "2023-10-15T09:00:00-04:00",
"duration": 120,
"dock_name": "Dock 1",
"carrier_name": "FastCo Logistics",
"carrier_number": "CARRIER-123",
"trailer_number": "TRAILER-456",
"driver_name": "John Smith",
"driver_phone": "+1 (555) 123-4567",
"driver_email": "john.smith@fastco.example.com",
"outbound": false,
"internal_id": "ERP-A12345",
"packing_lists": [
{
"po_number": "PO-12345",
"product_name": "Widgets",
"unit_name": "Skid",
"booked_quantity": 10,
"booked_weight": 500
}
],
"notes": [
{
"body": "Le chauffeur a besoin dâun hayon hydraulique"
}
],
"custom_values": {
"reference": "ABC123",
"priority": "Haut"
},
"checklist_values": {
"safety_check": "Prévu",
"dock_seal": "Requis"
}
}
}' \
https://YOUR_LOCATION.datadocks.com/api/v1/appointments
JavaScriptâ
Voir lâexemple JavaScript
const createAppointment = async (
apiToken,
locationSubdomain,
appointmentData
) => {
try {
const response = await fetch(
`https://${locationSubdomain}.datadocks.com/api/v1/appointments`,
{
method: "POST",
headers: {
Authorization: `Token ${apiToken}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ appointment: appointmentData }),
}
);
if (!response.ok) {
const errorData = await response.text();
const errorMessages = errorData || `HTTP ${response.status}`;
throw new Error(`Ăchec de la crĂ©ation du rendez-vous :\n${errorMessages}`);
}
return await response.json();
} catch (error) {
console.error("Erreur API :", error);
throw error;
}
};
// Exemple dâutilisation avec donnĂ©es complĂštes
const appointmentData = {
scheduled_at: "2023-10-15T09:00:00-04:00",
duration: 120,
dock_name: "Dock 1",
carrier_name: "FastCo Logistics",
carrier_number: "CARRIER-123",
trailer_number: "TRAILER-456",
driver_name: "John Smith",
driver_phone: "+1 (555) 123-4567",
driver_email: "john.smith@fastco.example.com",
outbound: false,
internal_id: "ERP-A12345",
packing_lists: [
{
po_number: "PO-12345",
product_name: "Widgets",
unit_name: "Skid",
booked_quantity: 10,
booked_weight: 500,
},
],
notes: [
{
body: "Le chauffeur a besoin dâun hayon hydraulique",
},
],
custom_values: {
reference: "ABC123",
priority: "Haut",
},
checklist_values: {
safety_check: "Prévu",
dock_seal: "Requis",
},
};
// Création du rendez-vous
createAppointment("YOUR_API_TOKEN", "your-warehouse", appointmentData)
.then((appointment) => {
console.log("Rendez-vous créé :", appointment.id);
// Processus supplémentaire...
})
.catch((error) => {
// Gérer les erreurs
});
Gestion des erreursâ
| Code | Description | Possible cause |
|---|---|---|
| 400 | Mauvaise requĂȘte | RequĂȘte mal formĂ©e, ex. : wrapper appointment manquant |
| 404 | Introuvable | ID dâenregistrement imbriquĂ© non trouvĂ© dans la portĂ©e accessible |
| 422 | EntitĂ© non traitable | Validation mĂ©tier Ă©chouĂ©e (ex. : conflit dâhoraire, quai plein) |
| 401 | Non autorisé | Jeton API invalide ou manquant |
| 403 | Interdit | Permissions insuffisantes |
Les validations Ă©chouĂ©es retournent gĂ©nĂ©ralement 422. Dock, cour, produit ou unitĂ© inconnus ne gĂ©nĂšrent pas forcĂ©ment 404. Les emplacements supprimĂ©s ou impayĂ©s retournent 402 ; les requĂȘtes trop nombreuses : 429. Les erreurs peuvent ĂȘtre JSON, texte brut ou vides. Les erreurs de liste dâemballage peuvent inclure un index de champ imbriquĂ©.
Exemple dâerreurâ
{
"errors": {
"driver_name": ["est trop court (minimum 2 caractĂšres)"]
}
}
PiĂšges courants et dĂ©pannageâ
-
Assignation quai/courâ: fournir
dock_nameouyard_namede prĂ©fĂ©rence. Si les deux sont renseignĂ©s, une cour modifiĂ©e prĂ©vaut, sinon le quai. En mise Ă jour, un nom omis conserve lâassociation, une chaĂźne vide la supprime. -
Formats temporelsâ: prĂ©cisez le fuseau horaire. Sinon, interprĂ©tĂ© en fuseau dâemplacement.
â Bonâ: "2023-10-15T09:00:00-04:00"â AcceptĂ©â: "2023-10-15T09:00:00" (fuseau local) -
CrĂ©ation prod./unitĂ©â: dĂ©sactivĂ©e par dĂ©faut. Les noms inconnus Ă©chouent la validation ou laissent lâassociation vide. Demandez lâactivation auprĂšs du support si nĂ©cessaire.
-
Recherche clientâ: les numĂ©ros clients sont insensibles Ă la casse (ex : "CUST-001" ou "cust-001" matchent).
-
Suppression dâune liste dâemballage en MĂJâ:
{"id": 123,"_destroy": true} -
Rendez-vous rĂ©currentsâ: non pris en chargeâ; utilisable via lâinterface web uniquement.
-
Champs personnalisĂ©sâ: les champs nĂ©cessaires sont validĂ©s, mais les nouveaux ne sont pas filtrĂ©s.
-
Approbation automatiqueâ: vĂ©rifiez ce paramĂštre auprĂšs de lâadministrateur. La dĂ©sactivation de lâapprobation automatique API saute ce chemin seulementâ; lâapprobation explicite et les autres transitions peuvent toujours remplir le champ
approved_at.
Conseils dâoptimisationâ
- Groupez vos requĂȘtesâ: espacez-les pour Ă©viter la limitation du dĂ©bit
- RĂ©duisez les champs personnalisĂ©sâ: incluez seulement ceux vĂ©ritablement requis
- PrĂ©chargez les ressourcesâ: assurez-vous que produits, unitĂ©s et transporteurs existent
- Validez localementâ: vĂ©rifiez les formats cĂŽtĂ© client avant lâenvoi
Obtenir un rendez-vous spĂ©cifiqueâ
Objectifâ
Obtenez de lâinfo dĂ©taillĂ©e sur un rendez-vous par ID. Utilisez ce point si vous avez besoin de toutes les donnĂ©es, calendrier, statuts, listes dâemballage et mĂ©tadonnĂ©es, sur un rendez-vous particulier.
Cas dâusageâ
- Suivi du statutâ: vĂ©rification dâĂ©tat du rendez-vous
- Surveillance arrivĂ©eâ: voir horaires dâarrivĂ©e/dĂ©part
- VĂ©rification des documentsâ: consulter documents et listes dâemballage joints
- Information transporteurâ: chauffeurs, remorques, etc.
- Champs personnalisĂ©sâ: accĂ©der aux champs propres au site (pas de checklist_values)
RequĂȘte HTTPâ
GET https://[location_subdomain].datadocks.com/api/v1/appointments/:id
ParamĂštres dâURLâ
| ParamĂštre | Type | Requis | Description |
|---|---|---|---|
id | Int | Oui | ID unique du rendez-vous |
RĂ©ponseâ
SuccĂšs = 200 OK avec lâobjet rendez-vous complet (comme pour list).
Exemples de codeâ
cURLâ
Voir lâexemple cURL
curl -H "Authorization: Token YOUR_API_TOKEN" \
https://YOUR_LOCATION.datadocks.com/api/v1/appointments/123
JavaScriptâ
Voir lâexemple JavaScript
const getAppointment = async (appointmentId) => {
try {
const response = await fetch(
`https://YOUR_LOCATION.datadocks.com/api/v1/appointments/${appointmentId}`,
{
method: "GET",
headers: {
Authorization: "Token YOUR_API_TOKEN",
"Content-Type": "application/json",
},
}
);
if (!response.ok) {
if (response.status === 404) {
throw new Error(`Rendez-vous #${appointmentId} introuvable`);
}
const errorData = await response.text();
throw new Error(
`Ăchec Ă la rĂ©cupĂ©ration du rendez-vous : ${JSON.stringify(errorData)}`
);
}
return await response.json();
} catch (error) {
console.error("Erreur récupération rendez-vous :", error);
throw error;
}
};
// Usage
getAppointment(123)
.then((appointment) => {
console.log(
`Le rendez-vous #${appointment.id} est actuellement dans lâĂ©tat ${appointment.state}`
);
// Vérifie si complété
if (appointment.completed_at) {
const completionTime = new Date(appointment.completed_at);
console.log(`Terminé à : ${completionTime.toLocaleString()}`);
}
// Calcule la durée totale
if (appointment.left_at && appointment.arrived_at) {
const arrivedTime = new Date(appointment.arrived_at);
const leftTime = new Date(appointment.left_at);
const durationMinutes = Math.round((leftTime - arrivedTime) / 60000);
console.log(`Temps total passé sur site : ${durationMinutes} minutes`);
}
})
.catch((error) => {
// Gestion dâerreur
if (error.message.includes("introuvable")) {
// Cas not found
} else {
// Autres erreurs
}
});
Codes dâerreurâ
| Code | Description | Cause possible |
|---|---|---|
| 404 | Introuvable | ID de rendez-vous inexistant |
| 401 | Non autorisé | Jeton API invalide/manquant |
| 403 | Interdit | Permissions insuffisantes |
Limitationsâ
- Seuls les rendez-vous non rĂ©currents peuvent ĂȘtre consultĂ©s ici
- Pour voir les modĂšles rĂ©currents, utilisez lâinterface web
Mise Ă jour dâun rendez-vousâ
Objectifâ
Mettre à jour les détails, statuts, données associées. Ce point accepte les champs listés plus haut, sous réserve de configuration et de permissions. Impossible de télécharger documents et signatures via cette API.
Cas dâusagesâ
- Changements dâĂ©tatâ: marquer comme arrivĂ©, commencĂ©, terminĂ©, ou quittĂ©
- Modif sĂ©ance/durĂ©eâ: changer horaire ou durĂ©e
- DĂ©tailâ: mettre Ă jour transporteur, remorque, rĂ©fĂ©rence dâexpĂ©dition
- Listes dâemballageâ: modifier produits, quantitĂ©s ou valeurs personnalisĂ©es
- Gestion notesâ: consigner des infos importantes
RequĂȘte HTTPâ
PUT https://[location_subdomain].datadocks.com/api/v1/appointments/:id
ParamĂštres dâURLâ
| ParamĂštre | Type | Requis | Description |
|---|---|---|---|
id | Int | Oui | ID unique du rendez-vous |
Corps de requĂȘteâ
Le corps accepte les mĂȘmes paramĂštres que la crĂ©ation. Seuls les champs Ă changer doivent ĂȘtre inclus.
Flux de transitions dâĂ©tatâ
Lors de la MAJ des champs dâĂ©tat, suivez idĂ©alement cette sĂ©quence :
scheduled_at â approved_at â arrived_at â started_at â completed_at â left_at
Permissions et validations rĂ©gissent chaque changement. LâĂ©tat dĂ©pend des horodatagesâ; le champ state nâest pas modifiable. Toute modification dâĂ©tat peut renseigner les horaires manquants prĂ©cĂ©dents ou effacer ceux ultĂ©rieurs. Par exemple, dĂ©finir left_at remplit approuvĂ©, arrivĂ©, dĂ©but et terminĂ© avec lâheure de sortie si vides. Envoyez des horodatages rĂ©els si disponibles.
ScĂ©narios courants de MAJâ
Marquer comme arrivĂ©â
{
"appointment": {
"arrived_at": "2023-10-15T08:45:00-04:00",
"trailer_number": "TRAILER-789"
}
}
Mise Ă jour des quantitĂ©s de liste dâemballageâ
{
"appointment": {
"packing_lists": [
{
"id": 123,
"actual_quantity": 9,
"actual_weight": 450
}
]
}
}
Ajouter une noteâ
{
"appointment": {
"notes": [
{
"body": "Camion arrivé avec un scellé endommagé. Inspection effectuée."
}
]
}
}
Supprimer une liste dâemballageâ
{
"appointment": {
"packing_lists": [
{
"id": 123,
"_destroy": true
}
]
}
}
Marquer comme terminĂ©â
{
"appointment": {
"completed_at": "2023-10-15T10:30:00-04:00",
"left_at": "2023-10-15T10:45:00-04:00",
"checklist_values": {
"dock_condition": "Propre",
"paperwork_complete": "Oui"
}
}
}
Exemples de codeâ
cURLâ
Voir lâexemple cURL
curl -H "Authorization: Token YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-X PUT \
-d '{
"appointment": {
"trailer_number": "UPDATED-TRAILER-789",
"arrived_at": "2023-10-15T08:45:00-04:00",
"notes": [
{
"body": "Camion arrivé avec un numéro de remorque différent que prévu."
}
]
}
}' \
https://YOUR_LOCATION.datadocks.com/api/v1/appointments/123
JavaScriptâ
Voir lâexemple JavaScript
const updateAppointment = async (appointmentId, updateData) => {
try {
const response = await fetch(
`https://YOUR_LOCATION.datadocks.com/api/v1/appointments/${appointmentId}`,
{
method: "PUT",
headers: {
Authorization: "Token YOUR_API_TOKEN",
"Content-Type": "application/json",
},
body: JSON.stringify({ appointment: updateData }),
}
);
if (!response.ok) {
const errorData = await response.text();
throw new Error(
`Ăchec de la mise Ă jour : ${JSON.stringify(errorData)}`
);
}
return await response.json();
} catch (error) {
console.error("Erreur MAJ rendez-vous :", error);
throw error;
}
};
// Exemple : marquer comme arrivé/débuté
const markAppointmentArrived = async (appointmentId, arrivalTime) => {
const now = arrivalTime || new Date().toISOString();
try {
const updatedAppointment = await updateAppointment(appointmentId, {
arrived_at: now,
notes: [
{
body: `Camion arrivé à ${new Date(now).toLocaleTimeString()}`,
},
],
});
console.log(
`Rendez-vous #${updatedAppointment.id} marqué comme arrivé`
);
return updatedAppointment;
} catch (error) {
console.error(
`Ăchec lors du marquage de lâarrivĂ©e du rendez-vous #${appointmentId} :`,
error
);
throw error;
}
};
// Exemple : mise Ă jour des quantitĂ©s dâune liste dâemballage
const updatePackingListQuantities = async (
appointmentId,
packingListId,
actualQuantity,
actualWeight
) => {
try {
const updatedAppointment = await updateAppointment(appointmentId, {
packing_lists: [
{
id: packingListId,
actual_quantity: actualQuantity,
actual_weight: actualWeight,
},
],
});
console.log(
`QuantitĂ©s de la liste dâemballage #${packingListId} mises Ă jour`
);
return updatedAppointment;
} catch (error) {
console.error(`Erreur de mise à jour des quantités :`, error);
throw error;
}
};
Gestion des erreursâ
| Code | Description | Cause possible |
|---|---|---|
| 400 | Mauvaise requĂȘte | RequĂȘte mal formĂ©eâ; la validation renvoie gĂ©nĂ©ralement 422 |
| 404 | Introuvable | ID de rendez-vous inexistant |
| 422 | Entité non traitable | Validation métier échouée (transition invalide) |
| 401 | Non autorisé | Jeton API invalide ou manquant |
| 403 | Interdit | Permissions insuffisantes |
Limitations importantesâ
- Rendez-vous rĂ©currentsâ: impossible de modifier un modĂšle rĂ©current via lâAPI.
- Mises Ă jour partiellesâ: inclure seulement les champs Ă modifier. Les champs ordinaires non inclus sont conservĂ©s, mais des callbacks peuvent influencer les horodatages, durĂ©e, associations. Les objets JSON (
custom_values,checklist_values) remplacent lâattribut au complet. - Objets imbriquĂ©sâ: pour les listes dâemballage, incluez un
idpour la MAJ, sinon un nouvel objet sera créé. Omettre lâexistant ne supprime pas. - Suppression non supportĂ©eâ: aucun point API ne supprime un rendez-vous. Pour annuler, dĂ©finissez
cancelled_at.
Bonnes pratiques de transition dâĂ©tatâ
Envoyez les horodatages rĂ©els en sĂ©quence logique. Un horodatage de prioritĂ© supĂ©rieure contrĂŽle lâĂ©tat mĂȘme aprĂšs la MĂJ dâun champ antĂ©rieur. SĂ©quence normale :
- Création (
scheduled_at) - Approbation (
approved_at) - Arrivée (
arrived_at) - Début (
started_at) - Fin (
completed_at) - Départ (
left_at)
Chaque MAJ dâĂ©tat doit inclure les mĂ©ta-infos pertinentes (ex. quantitĂ© emballĂ©e Ă la fin).
Cycle de vie & flux du rendez-vousâ
Comprendre le cycle de vie des rendez-vous est essentiel pour une bonne intégration API. Chaque rendez-vous suit un état bien défini régissant son parcours dans vos opérations.
Diagramme cycle de vie rendez-vousâ
ââââââââââââââ ââââââââââââââ ââââââââââââââ ââââââââââââââ ââââââââââââââ
â Booked âââââ¶â Arrived âââââ¶â Started âââââ¶â Completed âââââ¶â Left â
ââââââââââââââ ââââââââââââââ ââââââââââââââ ââââââââââââââ ââââââââââââââ
â
â ââââââââââââââ
âââââââââââââââââââââââââââââââ¶â Cancelled â
ââââââââââââââ
ĂvĂ©nements de transition dâĂ©tatâ
Chaque transition résulte de la MAJ du champ horaire correspondant :
| De | Ă | Champ horodatage | Description |
|---|---|---|---|
| Besoin de réservation | En attente | scheduled_at | Rendez-vous avec horaire planifié |
| En attente | Démarré | approved_at | Approbation du rendez-vous (auto possible) |
| Démarré | Arrivé | arrived_at | Camion arrivé sur site |
| Arrivé | Commencé | started_at | Début chargement/déchargement |
| Commencé | Terminé | completed_at | Fin chargement/déchargement |
| Terminé | Debout | left_at | Départ du camion du site |
| Nâimporte | AnnulĂ© | cancelled_at | Rendez-vous annulĂ© |
Les Ă©tats retournĂ©s sont needs_booking, pending, booked, arrived, started, completed, left, et cancelled. Priorité : cancelled_at, left_at, completed_at, started_at, arrived_at, approved_at, puis scheduled_at. La planification peut produire auto. un booked sans passer par pending. Effacer cancelled_at recalcule lâĂ©tat depuis les horaires restants selon permissions.
Collecte de donnĂ©es lors des transitionsâ
Chaque transition permet la collecte dâinformations opĂ©rationnelles clĂ©s :
ArrivĂ©â
- MAJ informations chauffeur si changé
- Vérifier numéro remorque
- Enregistre l'heure dâarrivĂ©e rĂ©elle pour la ponctualitĂ©
- Documenter divergences ou problĂšmes
CommencĂ©â
- Consigner tout changement de quai
- Enregistre début des opérations
- Début suivi du temps total sur site
TerminĂ©â
- Renseigner quantités réellement reçues/expédiées
- Documenter écarts/qualité
- Signatures ou confirmations via workflow de lâapplication
- TĂ©lĂ©charger documents via lâapp â non supportĂ© ici
DĂ©partâ
- Calculer durée totale sur le site
- Enregistrer lâheure de dĂ©part pour gestion cour
- Compléter la liste de vérification
Bonnes pratiques dâimplantationâ
- Validez les transitionsâ: votre appli doit valider la sĂ©quence logique
- Inclure les mĂ©tadonnĂ©esâ: chaque MAJ dâĂ©tat doit inclure les donnĂ©es mĂ©tier
- Ajouter des notesâ: gĂ©nĂ©rez automatiquement des notes de contexte
- DĂ©clencher des notificationsâ: utilisez les webhooks pour alerter les parties concernĂ©es
- Suivre les tempsâ: consignez la durĂ©e par Ă©tat
Meilleures pratiques de sĂ©curitĂ©â
La protection des donnĂ©es dâentrepĂŽt nĂ©cessite des mesures de sĂ©curitĂ© appropriĂ©es pour lâAPI.
Stockage sĂ©curisĂ©â
- Ne jamais coder les jetons en durâ: placez-les dans les variables dâenvironnement ou un gestionnaire dâidentifiants sĂ©curisĂ©
- Chiffrez au reposâ: assurez lâencryptage de vos jetons
- Gestion des secretsâ: utilisez des outils comme HashiCorp Vault ou AWS Secrets Manager
SĂ©curitĂ© de la connexionâ
- Toujours utiliser HTTPSâ: pas de requĂȘtes API non chiffrĂ©es
- Validez les certificatsâ: vĂ©rifiez SSL/TLS sur tous les appels API
Autres mesures de sĂ©curitĂ©â
- Mettre en place la surveillanceâ: alertes pour activitĂ© API suspecte
- Plan dâinterventionâ: ayez un plan si un jeton est compromis
Endpoints reliĂ©sâ
- Produits API â GĂ©rer les produits rĂ©fĂ©rencĂ©s sur les listes dâemballage
- Bons de commande API â GĂ©rer les POs liĂ©s aux rendez-vous
- API Compagnies â GĂ©rer transporteurs et clients
- Webhooks â Recevoir des notifications temps rĂ©el sur les changements de rendez-vous
Suppression de rendez-vous (non supportĂ©)â
Limite importanteâ
LâAPI des rendez-vous ne permet pas la suppression dâun rendez-vous. Utilisez lâannulation pour prĂ©server lâhistorique.
Alternatives Ă la suppressionâ
PlutÎt que de supprimer, envisagez les solutions suivantes :
- Annulez le rendez-vous via le champ
cancelled_at - MAJ des détails si changements requis
- Champs personnalisĂ©s pour suivre lâĂ©tat dans votre systĂšme
Annulationâ
Annulez via cancelled_at. Toute note envoyĂ©e est une simple user_noteâ; les notes dâannulation officielles ne proviennent que du portail rĂ©servĂ©.
Voir lâexemple cURL
curl -H "Authorization: Token YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-X PUT \
-d '{
"appointment": {
"cancelled_at": "2023-10-14T15:30:00-04:00",
"notes": [
{
"body": "Annulé à cause des conditions météo."
}
]
}
}' \
https://YOUR_LOCATION.datadocks.com/api/v1/appointments/123
Livre de recettes API : scĂ©narios courantsâ
Cette section fournit des recettes prĂȘtes-Ă -lâemploi pour les cas dâintĂ©gration frĂ©quents. Copiez, adaptez, utilisez pour accĂ©lĂ©rer votre dĂ©ploiement.
Recette : synchronisation des expĂ©ditions sortantes depuis lâERPâ
Exemple pour crĂ©er automatiquement des rendez-vous pour les expĂ©ditions sortantes prĂȘtes dans votre ERP.
Voir lâexemple JavaScript
/**
* CrĂ©er un rendez-vous sortant depuis lâERP
* @param {Object} shipment â DonnĂ©es expĂ©dition ERP
* @returns {Object} â Rendez-vous créé
*/
async function createOutboundAppointment(shipment) {
// Calcul durée du rendez-vous selon items
const duration = Math.max(30, shipment.items.length * 15); // 30 min min
// Formater horaire avec fuseau
const scheduledDate = new Date(shipment.plannedShipDate);
const scheduledTime = scheduledDate.toISOString();
// Construire listes dâemballage
const packingLists = shipment.items.map((item) => ({
po_number: item.purchaseOrderNumber,
product_name: item.productName,
unit_name: item.unitType,
booked_quantity: item.quantity,
booked_weight: item.weight,
customer_number: shipment.customerId,
customer_name: shipment.customerName,
}));
// CrĂ©er lâobjet rendez-vous
const appointmentData = {
scheduled_at: scheduledTime,
duration: duration,
outbound: true,
dock_name: shipment.preferredDock || "Shipping Dock",
shipping_number: shipment.shipmentId,
carrier_name: shipment.carrierName,
carrier_number: shipment.carrierId,
internal_id: `SHIP-${shipment.id}`,
custom_values: {
origin: "ERP-SYNC",
priority: shipment.priority,
department: shipment.department,
},
packing_lists: packingLists,
notes: [
{
body: `Rendez-vous sortant automatisé pour expédition ${shipment.shipmentId}.`,
},
],
};
// Appel DataDocks API
const response = await fetch(
`https://YOUR_LOCATION.datadocks.com/api/v1/appointments`,
{
method: "POST",
headers: {
Authorization: "Token YOUR_API_TOKEN",
"Content-Type": "application/json",
},
body: JSON.stringify({ appointment: appointmentData }),
}
);
if (!response.ok) {
const errorData = await response.text();
throw new Error(
`Impossible de créer le rendez-vous : ${JSON.stringify(errorData)}`
);
}
return await response.json();
}
Recette : tableau de bord dâutilisation des quais en temps rĂ©elâ
Calcule lâutilisation prĂ©vue et le temps de sĂ©jour. Fournissez les limites de date avec leur offset de fuseau, et le nombre de minutes dâopĂ©ration au total pour lâintervalle. Les temps dâarrivĂ©e/dĂ©part reprĂ©sentent le sĂ©jour sur site â non lâoccupation du quai.
Voir lâexemple JavaScript
/**
* Calculer lâutilisation des quais
* @param {string} fromDate â DĂ©but (avec offset)
* @param {string} toDate â Fin exclue (avec offset)
* @param {number} operatingMinutes â Total minutes dâutilisation
* @returns {Object} â Utilisation et prĂ©sence par quai
*/
async function calculateDockUtilization(fromDate, toDate, operatingMinutes) {
if (!(operatingMinutes > 0)) throw new Error("Indiquez les minutes dâexploitation");
// RĂ©cupĂšre les rendez-vous dans lâintervalle
const appointments = await getAllAppointments(fromDate, toDate);
// Grouper par quai
const dockMap = {};
appointments.forEach((appt) => {
if (!appt.dock || appt.state === "cancelled") return;
if (!dockMap[appt.dock]) {
dockMap[appt.dock] = {
totalAppointments: 0,
completedAppointments: 0,
scheduledMinutes: 0,
facilityMinutes: 0,
appointmentsList: [],
};
}
// Minutes planifiées
const scheduledMinutes = appt.duration || 0;
// Durée présence (arrivée/départ présents)
let facilityMinutes = 0;
if (appt.arrived_at && appt.left_at) {
const arrivedTime = new Date(appt.arrived_at);
const leftTime = new Date(appt.left_at);
facilityMinutes = Math.round((leftTime - arrivedTime) / 60000);
}
dockMap[appt.dock].totalAppointments++;
dockMap[appt.dock].scheduledMinutes += scheduledMinutes;
dockMap[appt.dock].facilityMinutes += facilityMinutes;
if (appt.completed_at) {
dockMap[appt.dock].completedAppointments++;
}
dockMap[appt.dock].appointmentsList.push({
id: appt.id,
state: appt.state,
scheduled_at: appt.scheduled_at,
duration: appt.duration,
carrier_name: appt.carrier_name,
});
});
// Calcul des taux dâutilisation
const dockUtilization = {};
const businessHours = operatingMinutes;
Object.keys(dockMap).forEach((dockName) => {
const dock = dockMap[dockName];
dockUtilization[dockName] = {
...dock,
scheduledUtilization:
((dock.scheduledMinutes / businessHours) * 100).toFixed(
1
) + "%",
completionRate: dock.totalAppointments
? ((dock.completedAppointments / dock.totalAppointments) * 100).toFixed(
1
) + "%"
: "0%",
};
});
return dockUtilization;
}
Recette : gestion automatisĂ©e arrivĂ©e camionâ
Met Ă jour le statut rendez-vous lors de lâarrivĂ©e du camion et met Ă jour les donnĂ©es du chauffeur.
Voir lâexemple JavaScript
/**
* Traiter lâarrivĂ©e dâun camion
* @param {string} appointmentId â ID rendez-vous
* @param {Object} arrivalData â DonnĂ©es collectĂ©es Ă lâarrivĂ©e
* @returns {Object} â Rendez-vous mis Ă jour
*/
async function processTruckArrival(appointmentId, arrivalData) {
const arrivalTime = new Date().toISOString();
// Préparer MAJ rendez-vous
const appointmentUpdate = {
arrived_at: arrivalTime,
trailer_number: arrivalData.trailerNumber || null,
driver_name: arrivalData.driverName || null,
driver_phone: arrivalData.driverPhone || null,
driver_email: arrivalData.driverEmail || null,
notes: [
{
body: `Camion arrivé à ${new Date(
arrivalTime
).toLocaleString()}. Pointage effectué par la sécurité.`,
},
],
custom_values: {
...(arrivalData.customValues || {}),
actual_arrival_time: arrivalTime,
},
};
if (arrivalData.isDelayed) {
appointmentUpdate.notes.push({
body: `Arrivé ${arrivalData.delayMinutes} min aprÚs prévue. Motif : ${arrivalData.delayReason}`,
});
}
// Appel DataDocks API
const response = await fetch(
`https://YOUR_LOCATION.datadocks.com/api/v1/appointments/${appointmentId}`,
{
method: "PUT",
headers: {
Authorization: "Token YOUR_API_TOKEN",
"Content-Type": "application/json",
},
body: JSON.stringify({ appointment: appointmentUpdate }),
}
);
if (!response.ok) {
const errorData = await response.text();
throw new Error(
`Impossible de mettre Ă jour le rendez-vous : ${JSON.stringify(errorData)}`
);
}
return await response.json();
}
Recette : mise Ă jour en masse du statut des rendez-vousâ
Chaque requĂȘte est envoyĂ©e sĂ©parĂ©ment. Partagez la limitation de dĂ©bit API entre workers utilisant les mĂȘmes identifiants.
Voir lâexemple JavaScript
/**
* Traite un lot de MAJ de statuts sur rendez-vous
* @param {Array} updates â Tableau de MAJ Ă traiter
* @returns {Object} â RĂ©sultats des MAJ
*/
async function processBatchStatusUpdates(updates) {
const results = {
successful: [],
failed: [],
};
// Espacer les appels sous la limite API ; dâautres workers partagent le budget.
for (const update of updates) {
await new Promise((resolve) => setTimeout(resolve, 1000));
try {
const { appointmentId, status, timestamp, notes } = update;
// Identifier le champ dâĂ©tat Ă mettre Ă jour
let statusUpdate = {};
switch (status) {
case "arrived":
statusUpdate = { arrived_at: timestamp || new Date().toISOString() };
break;
case "started":
statusUpdate = { started_at: timestamp || new Date().toISOString() };
break;
case "completed":
statusUpdate = {
completed_at: timestamp || new Date().toISOString(),
};
break;
case "left":
statusUpdate = { left_at: timestamp || new Date().toISOString() };
break;
default:
throw new Error(`Statut invalide : ${status}`);
}
// Ajouter notes si fournies
if (notes) {
statusUpdate.notes = [{ body: notes }];
}
// Appel API MAJ rendez-vous
const response = await fetch(
`https://YOUR_LOCATION.datadocks.com/api/v1/appointments/${appointmentId}`,
{
method: "PUT",
headers: {
Authorization: "Token YOUR_API_TOKEN",
"Content-Type": "application/json",
},
body: JSON.stringify({ appointment: statusUpdate }),
}
);
if (!response.ok) {
const errorData = await response.text();
throw new Error(JSON.stringify(errorData));
}
const updatedAppointment = await response.json();
results.successful.push({
appointmentId,
status,
result: updatedAppointment,
});
} catch (error) {
results.failed.push({
appointmentId: update.appointmentId,
status: update.status,
error: error.message,
});
}
}
return results;
}
Optimisation des performancesâ
Optimisez votre intégration API grùce à ces conseils :
Chargement efficace de donnĂ©esâ
- Limitez les résultats avec des filtres de date : toujours fournir
frometto - Mettez en cache les données stables
- Utilisez la pagination : récupérez seulement ce dont vous avez besoin
Optimisation des requĂȘtesâ
- Regroupez vos MAJ
- ContrĂŽlez la concurrence : limitez les requĂȘtes parallĂšles
- Utilisez les structures documentĂ©esâ: Conditional GET, ETag non supportĂ©s
RĂ©seauâ
- Connections persistantes (keep-alive)
- Corps JSON non compressé : Gzip non documenté comme supporté
- Backoff exponentiel : en cas de limitation, reculez graduellement
DĂ©pannage des problĂšmes courantsâ
ProblĂšmes dâauthentificationâ
SymptĂŽmesâ
- Erreurs 401 Non autorisé
- Messages "AccÚs refusé"
Solutionsâ
- Vérifier le jeton API (valide et à jour)
- Vérifier les permissions du jeton
- VĂ©rifier que lâutilisateur API a accĂšs Ă lâemplacement
- VĂ©rifiez le format de lâen-tĂȘte :
Authorization: Token YOUR_API_TOKEN
Limitation de dĂ©bitâ
SymptĂŽmesâ
- Erreurs 429 Trop de requĂȘtes
- RequĂȘtes subitement Ă©chouĂ©es
Solutionsâ
- Partagez le budget entre clients avec les mĂȘmes jetons : limites API : 120/min, 5000/h par valeur dâen-tĂȘte Authorization. Autres limites gĂ©nĂ©rales sâappliquent.
- Ăchelonnez les requĂȘtes groupĂ©es
- Tenez compte de
X-RateLimit-Reset(ISO8601) et backoff aprĂšs un 429â; rĂ©ponses incluent aussiX-RateLimit-LimitetX-RateLimit-Remaining - Avant de retenter aprĂšs une crĂ©ation ambigĂŒe, rĂ©conciliez via
internal_idou rĂ©fĂ©rence pour Ă©viter les doublons ;internal_idNâEST pas une clĂ© idempotente
ProblĂšmes date/heureâ
SymptĂŽmesâ
- Rendez-vous créés au mauvais horaire
- Résultats de filtre incomplets
Solutionsâ
- Spécifiez toujours le fuseau (ex:
2023-10-15T09:00:00-04:00) - Attention aux changements heure dâĂ©tĂ©
- ISO8601 pour tout format date/heure
- Pour les requĂȘtes dâintervalle,
from<to
Erreurs de validation des donnĂ©esâ
SymptĂŽmesâ
- 422 Entité non traitable
- Détail précis du champ en retour
Solutionsâ
- Consulter la rĂ©ponse dâerreur pour le champ en problĂšme
- Vérifier que les champs requis sont fournis.
scheduled_atpeut ĂȘtre omis, la durĂ©e est calculĂ©e si omise - Sâassurer que dock, produit ou unitĂ© existent
- Validez les formats en client avant lâenvoi
Aide et supportâ
Comment trouver une solution dâerreurâ
Si votre problĂ©matique nâest pas traitĂ©e ici :
- Ătudiez la rĂ©ponse dâerreur
- VĂ©rifiez les limitations de lâAPI (ex : rĂ©currence refusĂ©e)
- Testez par étapes plus simples
- Vérifiez les limites de débit : 120/min et 5000/h par jeton
Pour obtenir de lâaideâ
Pour toute assistance supplémentaire :
- Documentation : consultez la documentation complĂšte de lâAPI
- Support : contactez support@datadocks.com
Veuillez fournir :
- Le sous-domaine de votre emplacement
- Le dĂ©tail de la requĂȘte (mĂ©thode, point de terminaison, paramĂštres)
- La réponse complÚte
- Lâhorodatage de lâerreur