De la commande reçue à l’expédition déclaréeTous les articles

De la commande reçue à l’expédition déclarée

Les livraisons partielles sont la règle dans le commerce de pièces. Ce cas montre pourquoi décision et expédition sont par ligne et non par commande.

Publié: 2026-09-12Temps de lecture: 5 minAPI tapinomahub & processus
API & processusAftermarket automobileCommerce de piècesLogistique & stockAPIPrix & évaluationCommerce automobile

Une commande de trois lignes arrive. Deux pièces sont en rayon, la troisième est introuvable au recomptage. Un système qui ne peut qu’accepter ou refuser toute la commande impose alors un mauvais choix : tout annuler ou promettre ce qui n’existe pas.

De la commande reçue à l’expédition déclaréeEntrée : une commande née sur un canal et devant arriver dans votre système 1. Récupérer les commandes (GET /commerce/v1/orders): Par pages avec nextCursor ; la pagination par curseur est stable 2. Lire la commande (GET /commerce/v1/orders/{salesOrderId}): lines, totals, taxes, fees ainsi que shipTo et billTo présentés séparément 3. Décider (POST /commerce/v1/orders/{salesOrderId}/decision): Accepter ou refuser par ligne avec reasonCode au lieu d’un abandon tacite 4. Déclarer l’expédition (POST /commerce/v1/shipments): carrierCode, trackingReference et shippedAt par expédition, avec les lignes et quantités Sortie : une décision par ligne et une expédition déclarée avec quantités et trackingReference Les quantités partielles sont la règle. Une expédition indique les lignes expédiées avec leurs quantités et garde la livraison partielle traçable.De la commande reçue à l’expédition déclaréeEntrée : une commande née sur un canal et devant arriver dans votre système01Récupérer les commandesGET /commerce/v1/ordersPar pages avec nextCursor ; la pagination par curseur est stable02Lire la commandeGET /commerce/v1/orders/{salesOrderId}lines, totals, taxes, fees ainsi que shipTo et billTo présentés séparément03DéciderPOST /commerce/v1/orders/{salesOrderId}/decisionAccepter ou refuser par ligne avec reasonCode au lieu d’un abandon tacite04Déclarer l’expéditionPOST /commerce/v1/shipmentscarrierCode, trackingReference et shippedAt par expédition, avec les lignes et quantitésSortie : une décision par ligne et une expédition déclarée avec quantités et trackingReferenceLes quantités partielles sont la règle. Une expédition indique les lignes expédiées avec leurs quantités etgarde la livraison partielle traçable.
Quatre appels de la récupération à l’expédition. On décide et expédie par ligne, non par commande.

C’est pourquoi décision et expédition sont par ligne dans ce contrat. La quantité partielle n’est pas un cas particulier à contourner mais la voie prévue — et la récupération utilise une pagination par curseur que le contrat décrit comme stable.

SurfaceRôles
CommerceCommerce de pièces, Commerce automobile, Éditeur de logiciels

Ce que ce cas suppose

  • Un curseur stocké. Avec le dernier nextCursor reçu, vous poursuivez l’extraction par pages ; le rapprochement, lui, travaille avec ses propres points de contrôle.
  • Une correspondance des lignes avec votre entrepôt. Décider par ligne suppose de savoir par ligne ce qui est disponible.
  • Des motifs que vous pouvez assumer. Un refus porte un reasonCode.
  • La volonté d’expédier des quantités partielles. Ne livrer qu’en totalité, c’est renoncer aux deux lignes présentes.

Le déroulement

Le tableau indique pour chaque étape l’appel compétent et ce qui existe ensuite. La justification de l’étape figure en dessous.

La chaîne d’appels de ce cas d’usage
ÉtapeAppelCe qui existe ensuite
Récupérer les commandesGET /commerce/v1/ordersPar pages avec nextCursor ; la pagination par curseur est stable
Lire la commandeGET /commerce/v1/orders/{salesOrderId}lines, totals, taxes, fees ainsi que shipTo et billTo présentés séparément
DéciderPOST /commerce/v1/orders/{salesOrderId}/decisionAccepter ou refuser par ligne avec reasonCode au lieu d’un abandon tacite
Déclarer l’expéditionPOST /commerce/v1/shipmentscarrierCode, trackingReference et shippedAt par expédition, avec les lignes et quantités

Pourquoi chaque étape est nécessaire

  1. Récupérer les commandes. GET /commerce/v1/orders renvoie des pages avec nextCursor. Le contrat décrit cette pagination par curseur comme stable.
  2. Lire la commande. GET /commerce/v1/orders/{salesOrderId} renvoie lines, totals, taxes et fees ainsi que shipTo et billTo séparément. La séparation compte pour la comptabilité : un frais n’est pas une remise, et un port n’est pas un prix article.
  3. Décider. POST /commerce/v1/orders/{salesOrderId}/decision prend acceptation ou refus par ligne avec reasonCode et quantité. Au lieu d’une commande qui expire en silence, il y a ici une décision nommée ; acknowledgementStatus indique si elle est confirmée.
  4. Déclarer l’expédition. POST /commerce/v1/shipments prend salesOrderId, les lignes avec quantités, carrierCode, trackingReference et shippedAt. Par ligne, car deux pièces peuvent partir aujourd’hui et une la semaine prochaine sans que la commande perde son état.
Déclarer une expédition partielle par ligne
curl -X POST \
  -H 'X-Api-Key: <API_KEY>' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: sendung-4711-position-1' \
  -d '{"salesOrderId":"<salesOrderId>","lines":[{"lineId":"<lineId>","quantity":1}],"carrierCode":"DHL","trackingReference":"00340434","shippedAt":"2026-09-12T09:30:00Z"}' \
  'https://commerce-preview.invalid/commerce/v1/shipments'

Ce que l’on obtient

Il reste une commande avec une décision par ligne et des expéditions déclarées ; les écarts d’état de commande et d’expédition entre canal et système sont constatés par un rapprochement, pas encore activé dans le contrat. S’y ajoute un client qui reçoit une livraison partielle avec suivi au lieu d’une annulation. La ligne refusée porte un motif consultable.

Où cela figure dans la documentation

Les listes de champs contractuelles, les codes d’erreur et les réponses d’exemple se trouvent dans le contrat OpenAPI de cette surface, à l’adresse docs.tapinomahub.com (tapinoma-commerce). Tous les cas d’usage classés par surface et par rôle : aperçu des cas d’usage.

Sources et références juridiques

Questions fréquentes

Dois-je stocker le curseur ?

Pour poursuivre l’extraction, oui : le nextCursor stocké donne la page suivante. Les écarts entre source et cible sont constatés par le rapprochement via ses propres points de contrôle, non par le curseur des commandes.

Puis-je refuser une seule ligne ?

C’est précisément pourquoi la décision est par ligne. Elle indique quantité et motif par ligne ; le contrat ne précise pas ce qu’il advient des autres lignes.

Pourquoi les frais ont-ils un champ propre ?

Parce qu’ils diffèrent du prix article : la commande et la ligne portent chacune un champ fees, distinct sur la ligne de unitPrice et itemSubtotal. Les compenser empêche ensuite de retracer séparément chaque montant de frais.