Skip to main content

Refunds & Notifications · Article 6.1

Quand les remboursements ont lieu : les branches d'avenant Δ_REFUND

Un remboursement dans Clozo est toujours lié à une branche d'avenant Δ_REFUND — partiel (total révisé inférieur à l'acompte payé) ou complet (total révisé à zéro). L'avenant est le déclencheur légal ; le remboursement est la conséquence financière.

Clozo ne dispose pas d'un bouton « rembourser le client » déconnecté du contrat. Chaque remboursement est le volet financier d'un avenant signé qui a réduit le total en dessous de ce que le client a déjà payé comme acompte. Cette conception est délibérée — les remboursements sans modification de contrat correspondante sont un cauchemar lors d'un contrôle fiscal ; lier chaque remboursement à un avenant signé garantit que les documents juridiques (Stornorechnung, Berichtigung, Gutschrift) et le mouvement financier sont toujours synchronisés.

Quick visual tour

  1. when-refunds-happen step 1: Demande de remboursement reçue. Ne paniquez pas — il existe un chemin clair.

    Step 1: Demande de remboursement reçue. Ne paniquez pas — il existe un chemin clair.

  2. when-refunds-happen step 2: Vérifiez l'éligibilité sur l'arbre de décision. La plupart des cas sont valides.

    Step 2: Vérifiez l'éligibilité sur l'arbre de décision. La plupart des cas sont valides.

  3. when-refunds-happen step 3: Cliquez sur Rembourser. Stripe gère le mouvement réel d'argent.

    Step 3: Cliquez sur Rembourser. Stripe gère le mouvement réel d'argent.

  4. when-refunds-happen step 4: Regardez les fonds revenir de votre coffre vers le client.

    Step 4: Regardez les fonds revenir de votre coffre vers le client.

  5. when-refunds-happen step 5: Émettez une note de crédit. La comptabilité se clôture proprement.

    Step 5: Émettez une note de crédit. La comptabilité se clôture proprement.

Step by step

  1. Décidez du montant du remboursement.

    Ce n'est pas un chiffre que vous tapez — c'est la conséquence de la modification des lignes dans un avenant. Nouveau total inférieur à l'acompte collecté → remboursement. Nouveau total à zéro → acompte entièrement remboursé.

  2. Ouvrez l'assistant d'avenant.

    /proposals/{id}/amend. Réduisez les lignes à l'étape 1 jusqu'à ce que la bannière de contexte d'acompte de l'assistant affiche « Remboursement : €X ».

  3. Définissez la raison à l'étape 2.

    Minimum 30 caractères (le minimum plus long reflète le fait que vous réduisez — soyez explicite). La raison apparaît sur l'avenant, sur le récit de la note de crédit et fait partie de la piste d'audit.

  4. Envoyez et attendez que le client signe.

    L'avenant passe par le flux standard protégé par PIN (article 7.4). À la signature, le pipeline de remboursement s'exécute.

  5. Surveillez la chronologie du remboursement.

    Une bannière « Remboursement en cours » apparaît sur la page du devis une fois signé. Étapes : émis → demandé (Stripe accepté) → réglé (webhook Stripe confirmé) — voir article 8.4.

Après que le client signe l'avenant Δ_REFUND, la bannière du devis bascule vers « Remboursement en cours » avec le numéro de note de crédit et une fenêtre estimée. Le menu déroulant Documents reçoit les nouveaux documents (Storno, Berichtigung, Gutschrift). Le refund_status de la note de crédit pilote l'interface : requested → « Remboursement en cours, prévu dans 3 à 5 jours ouvrés » ; failed → « Remboursement échoué » avec des options de nouvelle tentative / manuel ; succeeded / manual → « Remboursement effectué le [date] ».

Why this works this way

Le flux de remboursement est enraciné dans process_amendment_signed (backend/apps/proposals/amendment_postsign.py). Au moment de la signature, la fonction vérifie amendment.triggers_refund. Si vrai, elle calcule refund_gross = deposit_paid − revised_total (plafonné à zéro) et :

1. Crée une DepositInvoiceCorrection (Berichtigung der Anzahlungsrechnung) avec correction_type=partial_refund ou full_cancellation. 2. Crée une CreditNote (Gutschrift) avec refund_status=pending, les montants brut/net/TVA divisés via _split_refund_vat, et des références à la facture d'acompte originale (numéro + date) conformément à l'art. 219 de la directive TVA européenne. 3. Appelle _trigger_stripe_refund pour tenter le volet financier via l'API Stripe sur le compte connecté du freelancer.

Deux « déclencheurs » différents produisent un remboursement :

DéclencheurBrancheDocuments créésVolet financier
Avenant avec revised_total < deposit_paid, acompte original payé via StripeΔ_REFUND partiel OU completStorno + Berichtigung + Gutschrift (+ FinalInvoice annulée sur complet)Remboursement Stripe (article 8.2)
Avenant avec revised_total < deposit_paid, acompte original payé via SEPA / hors canalΔ_REFUND partiel OU completMêmes documentsSEPA manuel (articles 8.3 + 8.9)

Il n'existe pas de chemin « rembourser le paiement final » car le paiement final n'est pas un acompte — une fois Payé, le contrat est réglé. Pour rembourser partiellement un contrat payé, vous créez un avenant qui réduit la portée (Δ−), le signez ; le devis revient à En attente du paiement final avec un solde réduit, et tout montant perçu en trop est géré via le pipeline post-signature comme un Δ_REFUND. L'avenant est toujours la porte d'entrée.

Note : depuis le 07/05/2026, la suppression directe d'un devis in_work est également interdite — le backend rejette le DELETE avec HTTP 409 in_work_requires_amendment. L'encart rouge « Rembourser tout » de l'assistant d'avenant (étape 1) est le seul chemin d'interface pour rembourser un acompte payé ; en cliquant dessus, toutes les quantités de lignes sont mises à 0, l'assistant affiche la branche Δ_REFUND complet, et à la signature du client, le pipeline de cet article s'exécute (conformément à [D-125]).

Troubleshooting

Keep reading

Quand les remboursements ont lieu : les branches d'avenant Δ_REFUND · Help · Clozo