Skip to content

fix(25-4-b2): le rappel réclame le reste dû — texte, PDF « Rappel » et QR (closes #416) - #479

Merged
guycorbaz merged 53 commits into
mainfrom
story/25-4-b2-residuel-aux-rappels
Sep 29, 2026
Merged

guycorbaz merged 53 commits into
mainfrom
story/25-4-b2-residuel-aux-rappels

Conversation

@guycorbaz

Copy link
Copy Markdown
Owner

Closes #416.

Ce que la PR corrige

Un rappel réclamait le TTC complet d'une facture déjà réglée en partie, et joignait la facture elle-même, dont la QR portait ce TTC : le client qui la scannait payait une seconde fois ce qu'il avait déjà réglé. Seconde moitié de #416 — la balance âgée et l'échéancier ont été corrigés par la 25-4-b1 (#475).

  • Texte : {totalDue} = reste dû (arrondi une fois au centime) + frais cumulés. Nouvelle variable {feeNotice}, vide sans frais ; les 16 gabarits par défaut (4 langues × 4 niveaux) n'écrivent plus aucune phrase de frais en dur — fini « frais de rappel de 0.00 ».
  • PDF joint : un « Rappel », plus la facture réémise — déjà réglé, reste à payer (seulement après un règlement), ligne « Frais de rappel » avec la mention qu'ils ne sont pas dans le bulletin (absente à zéro). Pièce jointe rappel-{n}.pdf. Hauteur du bloc réservée dans la garde de capacité, libellés bornés en largeur.
  • QR : porte le reste dû, avec la même référence et le même message que la facture (le rapprochement les lit). Les frais n'y sont jamais : non comptabilisés ([BUG] Les frais de rappel ne sont jamais comptabilisés — un produit encaissé sans écriture #401).
  • Refus nommés : reste nul → 422 REMINDER_NOTHING_DUE (en lot : échec par facture, plus de DATABASE_ERROR) ; règlement arrivé entre l'aperçu et l'envoi unitaire → 409 REMINDER_AMOUNTS_CHANGED, rien ne part.
  • Montants lus dans une transaction. Facture (téléchargement, envoi, renvoi) et avoir inchangés.
  • Manuels utilisateur et admin (+ PDF, dont les variables de rappel, documentées nulle part jusqu'ici), CHANGELOG [0.12.1].

Hors périmètre, tracé : #476 (arrondi QR / trop-perçu, préexistant), #477 (imprimer le PDF de rappel pour la sommation hors Kesh), #478 (KF-053, symptôme E2E).

Revue

Validation de spec close en 5 passes ; revue de code close en 2 passes — passe 1 1H/1M/1L (Sonnet ×3 ; HIGH tranché par Guy : refus 409), passe 2 0 au-dessus de LOW (Haiku ×3). Détail : _bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md.

Gates locaux (dernier commit de code, base remise à zéro)

🤖 Generated with Claude Code

guycorbaz and others added 30 commits September 26, 2026 23:48
…, refusé sur une facture réglée (refs #455, refs #456, refs #416, refs #420)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nt réglée, reste à payer dit au client (refs #416)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ce (refs #416)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pas la facture réémise (refs #416)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ligné sur « Dévalider », montage de monter (refs #455, refs #456)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…(refs #455, refs #456)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…x rappels (refs #416)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…#416)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e comparé en Decimal, bouton sur facture payée (refs #455, refs #456)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…refs #455, refs #456)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…#384 ramenée en 25-4-d (refs #384, refs #456)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…efs #455, refs #456)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ur une facture réglée (refs #455, refs #456)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… refs #456)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…a balance âgée et à l'échéancier (refs #416)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rand livre, quatre passages du manuel (refs #416)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…approchement par ventilation ou règle (refs #416)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…une règle ; #473 et #474 ouvertes (refs #416)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e-passations dans la règle (refs #416)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
guycorbaz and others added 23 commits September 27, 2026 15:14
#416)

Implémentation T0-T6 de la Story 25-4-b1. Gates backend (2491/2491) et
frontend (834/834) verts avant l'interruption ; gate E2E (T7) en attente.

Commit de sauvegarde après un crash de la station : l'intégrité des
fichiers a été vérifiée (git fsck, fins de fichiers, fmt, clippy, check).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nsé (refs #416)

Le HAVING porte sur les factures à reste dû non nul, plus sur le total
du contact : un trop-perçu hérité compensant une facture ouverte faisait
sortir le contact entier. Commentaire de get_invoice rectifié ; tests
du règlement annulé sur la balance âgée et l'échéancier.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…416)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
L'arbre de main est identique à celui de la tête de #472 (41e14e4),
ancêtre de cette branche : le résultat est l'arbre de la branche.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…, arrondi (refs #416)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…existantes (refs #416)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
L'arbre de main est identique à celui de la tête de la b1, ancêtre de
cette branche : le résultat est l'arbre de la branche.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…te classé, #476 (refs #416)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rate (refs #416)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… boucle close (refs #416)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…et QR (refs #416)

Le texte annonce le reste dû plus les frais cumulés ({feeNotice}, vide
sans frais) ; le PDF joint devient un rappel (déjà réglé, reste à payer,
frais sur une ligne à part) dont la QR porte le reste dû avec la
référence de la facture ; un reste nul est refusé par son nom
(REMINDER_NOTHING_DUE), classé en échec par facture dans le lot.
KF-053 (#478) documentée dans docs/testing.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…perçu ; montants lus dans une transaction (refs #416)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…416)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@guycorbaz
guycorbaz merged commit 9098b2b into main Sep 29, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEATURE] Propager le résiduel aux rapports agrégés — balance âgée et échéancier

1 participant