Skip to content

fix(25-4-a): le reste dû compte l'avoir TTC, et l'avoir est refusé sur une facture réglée (closes #455, closes #456) - #472

Merged
guycorbaz merged 18 commits into
mainfrom
story/25-4-propager-le-residuel
Sep 27, 2026
Merged

guycorbaz merged 18 commits into
mainfrom
story/25-4-propager-le-residuel

Conversation

@guycorbaz

Copy link
Copy Markdown
Owner

Closes #455, closes #456

Ce que livre cette PR

Story 25-4-a — le résiduel juste, première des quatre stories issues du découpage de la 25-4 (propager le reste dû). Elle passe en premier parce que les trois suivantes (agrégats et relances, rapprochement, perte sur débiteur) réemploient la formule qu'elle corrige.

#455 — l'avoir était soustrait hors taxes d'un total TTC

  • Le reste dû (amount_due) retranchait credit_notes.total_amount (HT) d'un TTC : une facture créditée à 8,1 % gardait sa TVA en reste dû.
  • ⚠️ L'écran le masquait, mais GET /api/v1/invoices/{id}, ouverte aux clés API, le rendait toujours dans amountDue.
  • L'avoir est désormais compté TTC, arrondi ligne par ligne (depuis credit_note_lines), comme son écriture.
  • La formule du TTC d'une ligne est factorisée (line_ttc_sql!) : les quatre constantes en dérivent, et les deux constantes TTC des factures restent identiques octet pour octet.
  • Aucune migration.

#456 — un avoir pouvait viser une facture réglée en partie

  • La garde ne lisait que paid_at, posé seulement au solde. L'avoir contre-passait tout le TTC, et la créance devenait créditrice du montant encaissé.
  • L'avoir est maintenant refusé dès qu'il existe une ligne de règlement ou paid_at. La lecture des règlements est verrouillante, après le verrou de la facture, ce que prouve un test d'entrelacement.
  • Nouveau refus dédié : 409 CREDIT_NOTE_INVOICE_SETTLED, message en 4 langues, numéro de facture. Il remplace aussi le générique du cas « payée ».
  • Le bouton Créer un avoir suit désormais le précédent Dévalider : il reste visible, et le serveur refuse avec un motif nommé.
  • L'avoir sur facture encaissée (crédit client, remboursement, imputation) est suivi par [feature] Avoir sur une facture encaissée — crédit du client visible, remboursement ou imputation #471.

Textes

  • Manuel utilisateur : § Avoirs, limites, et « cas hérité » pour l'annulation de règlement. Le PDF est régénéré et contrôlé aplati.
  • CHANGELOG [0.12.1] : Fixed ×2, qui nomme l'API, et Changed pour le bouton.

Preuves

Gates locaux

  • Backend : base remise à zéro, scripts/test-fast.sh 2484 / 2484.
  • Frontend : check 0 erreur, lint-i18n-ownership PASS, test:unit 826 / 826, build OK.
  • E2E : 222 passés / 10 échoués / 19 ignorés.
    • 7 échecs relèvent de KF-029.
    • Les 3 autres sont des pollutions d'état : product-revenue-account:133, sidebar-navigation:75, et accounts.spec.ts:185, qui n'était pas documenté. Rejouées seules, ces specs passent : 18 / 18.

La branche porte aussi la fiche mère de la 25-4 (découpage, arbitrages sur les relances pour la 25-4-b) et les entrées de suivi de la 25-4-b, de la 25-4-c et de la 25-4-d (issue #384 ramenée ici).

🤖 Generated with Claude Code

guycorbaz and others added 18 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>
@guycorbaz
guycorbaz merged commit 31dd19d into main Sep 27, 2026
3 checks passed
guycorbaz added a commit that referenced this pull request Sep 27, 2026
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant