Ce guide décrit les paiements, remboursements et retraits du wallet restaurant. Il s'adresse au frontend client/Pro, à DiddiPay, au Backoffice et à la QA.

  1. Pour online, Food crée une intention avec POST /food/v1/orders/{order_id}/payments/prepare; DiddiPay gère le prestataire et rappelle Food par webhook signé. Pour cash_on_delivery, la collecte vient de DiddiSend.
  2. Le client peut consulter ou rafraîchir le paiement. Un remboursement passe d'abord par une demande, puis par une décision admin; Food appelle DiddiPay seulement après approbation.
  3. Le wallet restaurant sépare pending, available et reserved. Un gain cash devient disponible après delivery.cash_remitted, pas au simple pickup.
  4. Le restaurant demande d'abord un devis avec /wallet/withdrawal-quote. Après confirmation, il envoie son quote_id à /wallet/withdrawals; Food réserve exactement le montant, les frais et le net du devis. DiddiPay reste propriétaire du mouvement d'argent.
sequenceDiagram
    participant C as Client
    participant F as DiddiFood
    participant P as DiddiPay
    participant S as DiddiSend
    C->>F: prepare online ou commande cash
    F->>P: payment intent ou remboursement
    P-->>F: webhook signé
    S-->>F: cash_remitted
    F->>P: payout après demande restaurant

La recharge restaurant reste hors MVP (DIDDIFOOD_RESTAURANT_TOPUP_ENABLED=false). Les frais réels de retrait DiddiPay sont encore À CONFIRMER. Un devis est conservé 15 minutes par défaut (DIDDIFOOD_RESTAURANT_WITHDRAWAL_QUOTE_TTL_SECONDS) et ne peut pas être remplacé silencieusement par une nouvelle tarification.