Ce guide décrit le parcours ordinaire d'une livraison Food confiée à DiddiSend. Il s'adresse aux équipes Food, Send, frontend et QA.
- Après l'acceptation du restaurant, Food envoie
POST /food/v1/restaurants/{restaurant_id}/orders/{order_id}/delivery/requestà son adaptateur DiddiSend. - Le payload contient la commande, le montant XOF immuable,
customer_user_id, une clé d'idempotence etexclusive=trueavec le véhiculemotorcycle. - DiddiSend reste propriétaire de l'affectation, du pickup, du trajet, de la collecte cash et de la remise.
- Food expose
GET /food/v1/orders/{order_id}/delivery/trackingcomme surface stable pour le client. Food vérifie l'accès à la commande, lit DiddiSend ou sa projection locale, puis filtre les données publiques. Le worker HTTP est activé parDELIVERY_STATUS_SYNC_ENABLED. - L'événement
delivery.cash_remittedest consommé par le worker wallet lorsquePAYOUT_CONSUMER_ENABLED=true; avant cette validation, le gain cash reste en attente.
Échec de livraison
DiddiSend peut publier ou retourner delivery.failed avec delivery_id, order_id/order_reference, failure_code, failure_reason, status_at et event_version=1. Food stocke ces champs dans sa projection et les expose au client comme status=failed, failure_code et failure_reason. Food ne choisit ni nouvelle tentative, ni annulation, ni remboursement : cette décision appartient à DiddiSend avec Support/Backoffice.
sequenceDiagram
participant F as DiddiFood
participant S as DiddiSend
participant W as Wallet Food
F->>S: POST delivery/request + idempotency
S-->>F: remote_delivery_id
S-->>F: pickup/delivered et cash_remitted
F->>W: crédit idempotent après remise cash
DiddiFood ne gère jamais les livreurs ni leur machine d'état. customer_user_id sert à attribuer la note client au bon acheteur, tandis que le compte technique Food reste l'expéditeur S2S.