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.
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.
| Surface | Rôles |
|---|---|
| Commerce | Commerce de pièces, Commerce automobile, Éditeur de logiciels |
Ce que ce cas suppose
- Un curseur stocké. Avec le dernier
nextCursorreç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.
| Étape | Appel | Ce qui existe ensuite |
|---|---|---|
| Récupérer les commandes | GET /commerce/v1/orders | Par pages avec nextCursor ; la pagination par curseur est stable |
| Lire la commande | GET /commerce/v1/orders/{salesOrderId} | lines, totals, taxes, fees ainsi que shipTo et billTo présentés séparément |
| Décider | POST /commerce/v1/orders/{salesOrderId}/decision | Accepter ou refuser par ligne avec reasonCode au lieu d’un abandon tacite |
| Déclarer l’expédition | POST /commerce/v1/shipments | carrierCode, trackingReference et shippedAt par expédition, avec les lignes et quantités |
Pourquoi chaque étape est nécessaire
- Récupérer les commandes.
GET /commerce/v1/ordersrenvoie des pages avecnextCursor. Le contrat décrit cette pagination par curseur comme stable. - Lire la commande.
GET /commerce/v1/orders/{salesOrderId}renvoielines,totals,taxesetfeesainsi queshipToetbillTosé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. - Décider.
POST /commerce/v1/orders/{salesOrderId}/decisionprend acceptation ou refus par ligne avecreasonCodeet quantité. Au lieu d’une commande qui expire en silence, il y a ici une décision nommée ;acknowledgementStatusindique si elle est confirmée. - Déclarer l’expédition.
POST /commerce/v1/shipmentsprendsalesOrderId, les lignes avec quantités,carrierCode,trackingReferenceetshippedAt. Par ligne, car deux pièces peuvent partir aujourd’hui et une la semaine prochaine sans que la commande perde son état.
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.
