Skip to main content

Proposals & Invoices · Article 5.3

Créer un avenant (l'assistant en 4 étapes)

L'assistant d'avenant à `/proposals/{id}/amend` vous guide à travers les lignes, le motif, l'aperçu et l'e-mail — dans cet ordre. Cinq minutes pour un changement simple, dix pour un cas complexe. Le client ne voit rien tant que vous n'avez pas cliqué sur Envoyer à l'étape 4.

L'assistant ouvre avec le périmètre effectif courant comme point de départ — soit les lignes d'origine si aucun avenant n'a été signé auparavant, soit les lignes du dernier avenant signé si vous chaînez (article 7.6). Vous éditez, remodelez, ajoutez ou retirez des lignes à l'étape 1 ; expliquez pourquoi à l'étape 2 ; passez en revue l'addendum rendu à l'étape 3 ; et rédigez l'e-mail à l'étape 4. Tout ce qui précède le bouton Envoyer de l'étape 4 reste privé.

Step by step

  1. Étape 1 : lignes.

    Les lignes d'origine apparaissent en haut, verrouillées et grisées. Votre liste révisée éditable apparaît en dessous. Chaque rangée reçoit une étiquette colorée — vert + ajoutée, ambre ~ modifiée, rouge − retirée, gris inchangée — pour que vous (et le client, dans la vue diff) puissiez voir d'un coup d'œil ce qui a changé. La bannière de contexte d'acompte à droite affiche : pourcentage d'acompte du contrat d'origine, montant d'acompte encaissé, et ce que sera le nouveau amount_due (ou remboursement, si Δ_REFUND). L'assistant recalcule à chaque frappe.

  2. Étape 2 : motif.

    Un champ texte court. Minimum 10 caractères pour Δ+ / Δ=0, 30 caractères en cas de réduction de périmètre (Δ− / Δ_REFUND) — le minimum plus long encourage à enregistrer la justification de toute baisse, puisque c'est le cas le plus susceptible d'être contesté plus tard. Le motif apparaît verbatim sur le PDF d'addendum et dans la vue diff du client.

  3. Étape 3 : aperçu.

    L'assistant rend le PDF d'addendum à la volée via un point de terminaison /preview-pdf et l'embarque dans une iframe. Lisez-le. Confirmez que les lignes, totaux, ventilation TVA et motif sont tous corrects. Cochez la case de consentement (« J'ai relu le PDF rendu et confirme qu'il reflète fidèlement le changement ») — Envoyer est désactivé tant que vous ne le faites pas. Toute modification vous renvoie à l'étape 1 et invalide le consentement (vous le recocherez).

  4. Étape 4 : compositeur d'e-mail.

    Objet et corps préremplis dans la langue du devis ; les deux sont éditables. Le destinataire prend par défaut l'e-mail du client en fiche mais peut être surchargé (par ex. pour un signataire alternatif). Cliquez sur Envoyer l'avenant au client pour déclencher l'e-mail et verrouiller l'avenant contre toute modification ultérieure.

L'assistant occupe tout l'écran avec une barre de progression à quatre étapes en haut. La bannière de contexte d'acompte reste collée à l'étape 1. Les erreurs (par ex. « Le motif doit faire ≥ 30 caractères » sur Δ−) apparaissent en ligne en haut de l'étape concernée. Après Envoyer, vous êtes redirigé vers /proposals/{id} où l'avenant apparaît dans un panneau « Avenant en attente » avec compte à rebours, bouton de copie de lien et bouton Annuler.

Why this works this way

L'assistant crée automatiquement (ou reprend automatiquement) une ligne ProposalAmendment en brouillon la première fois que vous dépassez l'étape 1. À partir de là, chaque navigation entre étapes fait un PATCH du brouillon côté serveur avec les lignes courantes et le motif. Cela signifie que fermer le navigateur en plein milieu de l'assistant ne perd jamais le travail — rouvrez /proposals/{id}/amend et vous reprenez là où vous étiez.

Un détail d'implémentation plus subtil : l'assistant crée une ligne FinalInvoice de « prévisualisation » rattachée à l'avenant en brouillon, avec status=cancelled (pas active). Le statut bascule sur active uniquement à l'instant où le client signe, lorsque upsert_pending_invoice_for_amendment devient process_amendment_signed. Deux conséquences : 1. Votre compteur INV-2026-NNNN avance lors de la rédaction (le numéro est réservé). Si vous annulez le brouillon, le numéro reste dans vos livres comme une ligne annulée — c'est normal et conforme à la façon dont les Steuerberater allemands s'attendent à voir des annulations numérotées dans le journal d'audit. 2. L'iframe d'aperçu de l'étape 3 est rendu contre cette facture de prévisualisation — c'est le PDF exact que recevra le client, donc ce que vous voyez est ce qu'il/elle obtient.

Si le devis parent est en statut in_work (acompte payé, projet en cours), l'étape 1 fait apparaître un bouton de mise en avant rouge « Tout rembourser » en plus de l'éditeur de lignes — cliquer dessus fixe la quantité de chaque ligne à 0, ramène revised_total à 0, et à la signature du client la cascade dans process_amendment_signed émet une Stornorechnung + Berichtigung der Anzahlungsrechnung + facture d'avoir et déclenche le remboursement Stripe. C'est la seule voie légitime pour rembourser un acompte in_work ; la suppression directe du devis est rejetée avec HTTP 409 in_work_requires_amendment (au titre de [D-125]).

Troubleshooting

Keep reading