Un client se rétracte, une pièce revient endommagée, une autre ne convient pas. Trois cas différents qui, en pratique, disparaissent souvent dans le même avoir. En fin de mois, ni le stock ni la comptabilité ne concordent, et personne ne sait quel remboursement correspondait à quel retour.
Le contrat sépare donc les trois cas et les relie par des identifiants : le remboursement renvoie toujours à la commande et, si returnId est renseigné, au retour. Chaque remboursement enregistré est ainsi imputable à une commande, et au retour lorsqu’il est renseigné — en amont comme en aval.
| Surface | Rôles |
|---|---|
| Commerce | Commerce de pièces, Commerce automobile |
Ce que ce cas suppose
- Une commande avec des lignes. Annulation et reprise se font par ligne et quantité, non en bloc ; le remboursement est un montant rattaché à la commande.
- Une date d’arrivée. Un retour annoncé diffère d’un retour arrivé ;
receivedAtconsigne l’arrivée. Le contrat ne lie pas le remboursement à ce champ. - Des motifs par dossier. Rétractation, dommage de transport et erreur de commande sont trois motifs aux trois conséquences différentes pour le stock.
- Une comptabilité qui traite les avoirs. Les avoirs sont distincts de la facture et renvoient à la facture et à la commande ; ils ne contiennent aucun renvoi au remboursement ni au retour.
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 |
|---|---|---|
| Annuler avant expédition | POST /commerce/v1/cancellations | reasonCode pour l’annulation, quantités par ligne ; on annule la quantité, non la commande en bloc |
| Enregistrer le retour | POST /commerce/v1/returns | receivedAt distingue le retour annoncé du retour arrivé |
| Rembourser | POST /commerce/v1/refunds | amount avec amountMinor et currency, lié à salesOrderId ; returnId facultatif |
| Tirer l’avoir | GET /commerce/v1/credit-notes | Avoirs renvoyant à la facture (invoiceId) et à la commande (salesOrderId) |
Pourquoi chaque étape est nécessaire
- Annuler avant expédition.
POST /commerce/v1/cancellationsprendsalesOrderId,reasonCodeet les lignes avec quantités. Tant que rien n’est parti, c’est la voie la moins coûteuse — aucun retour que personne ne veut payer. - Enregistrer le retour.
POST /commerce/v1/returnsportereceivedAt. Ce champ sépare l’annonce du fait. Le contrat ne lie pas le remboursement à ce champ. - Rembourser.
POST /commerce/v1/refundsprendsalesOrderId,amountavecamountMinoretcurrency, ainsi quereasonCode;returnIdest facultatif. Quand le remboursement se rapporte à un retour, ce lien devrait être posé viareturnId, car le contrat ne l’impose pas : un remboursement sans dossier ne s’explique à personne ensuite. - Tirer l’avoir.
GET /commerce/v1/credit-notesliste les avoirs, distincts de la facture ; chacun renvoie à la facture viainvoiceIdet à la commande viasalesOrderId. Le contrat ne prévoit pas de renvoi au remboursement lui-même dans l’avoir ; il ne partage avec lui que lesalesOrderId.
curl -X POST \
-H 'X-Api-Key: <API_KEY>' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: erstattung-4711-ruecksendung-1' \
-d '{"salesOrderId":"<salesOrderId>","returnId":"<returnId>","amount":{"amountMinor":8900,"currency":"EUR"},"reasonCode":"return"}' \
'https://commerce-preview.invalid/commerce/v1/refunds'Ce que l’on obtient
Au final, chaque remboursement enregistré est rattaché à une commande via salesOrderId, et chaque avoir renvoie à la facture et à la commande via invoiceId et salesOrderId. Un remboursement créé avec returnId se retrace jusqu’à son retour.
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
Pourquoi ne pas simplement annuler ?
Parce qu’une annulation avant expédition diffère d’un retour après. La première ne touche pas le stock, la seconde oui — et seule la seconde exige un contrôle à réception.
Et si le client annonce un retour sans que rien n’arrive ?
Il y a alors un dossier sans arrivée. La date de réception receivedAt reste alors vide ; le contrat ne lie pas le remboursement à ce champ, et la décision de rembourser vous revient.
Puis-je rembourser partiellement ?
Oui. Le remboursement porte un montant et est lié à la commande, facultativement aussi au retour ; le statut de paiement de la commande connaît partially_refunded. Les remboursements ne sont pas encore activés dans le contrat.
