Skip to content

feat(25-4-c3-b): solder au centime, l'écart d'arrondi en troisième ligne (closes #476) - #493

Merged
guycorbaz merged 48 commits into
mainfrom
story/25-4-c3-b-arrondi-au-centime
Oct 5, 2026
Merged

guycorbaz merged 48 commits into
mainfrom
story/25-4-c3-b-arrondi-au-centime

Conversation

@guycorbaz

Copy link
Copy Markdown
Owner

Closes #476

Dernière des trois stories de la 25-4-c3 : solder au centime une facture dont le total porte plus de deux décimales.

Le défaut

Une ligne à prix ou quantité fractionnaire donne un reste dû comme 10.0050. La QR-facture, les rappels et le dialogue de règlement réclament 10.01, mais :

  • au rapprochement, ce virement avait un score de montant nul ;
  • saisi à la main, il était refusé comme trop-perçu, alors que le dialogue venait lui-même de proposer ce montant ;
  • un paiement de 10.00 laissait la facture « partiellement réglée » pour un demi-centime.

Ce qui change

  • Une seule définition du reste dû au centime (amount_due_to_centime, construite sur Money::round_to_centimes) pour toutes les comparaisons et tous les affichages ; le reste dû calculé n'est pas arrondi.
  • La classification à double borne (classify_payment) :
    • paiement égal au reste arrondi → la facture est soldée : le règlement est enregistré au reste exact et l'écart passe en troisième ligne d'écriture sur le compte de différences d'arrondi (au crédit ou au débit), si bien que la créance se ferme à zéro ;
    • paiement au-delà du reste exact → trop-perçu refusé, y compris entre le reste exact et son arrondi (10.008) ;
    • sinon → règlement ordinaire.
  • Le compte d'arrondi est revérifié au moment d'écrire (actif, imputable, charge ou produit). Sans compte utilisable : refus sans rien écrire, code ROUNDING_ACCOUNT_NOT_CONFIGURED (400 au règlement manuel, avec un message qui renvoie à Paramètres → Facturation ; refus par proposition au rapprochement).
  • Règlement manuel à plus de deux décimales refusé (VALIDATION_ERROR, après normalisation : « 10.000 » est accepté).
  • Dialogue : compare la saisie au reste arrondi et compte les décimales sur la forme canonique de big.js.
  • Annulation : contre-passe les trois lignes (mécanisme existant). Si le compte d'arrondi a été archivé entre-temps, le refus nomme le compte à réactiver.
  • Manuels admin et utilisateur, PDF, CHANGELOG [0.12.1] Fixed.

Vérifications

  • Validation de la spec close en 4 passes ; revue de code close en 2 passes (prompts versionnés à côté de la fiche).
  • 14 tests Rust et 6 Vitest neufs ; 8 mutations tuées.
  • Gates : backend 2545/2545 ; frontend 845/845 ; E2E 227 passés / 19 ignorés / 9 échecs, tous expliqués (7 KF-029, 2 pollutions d'état entre specs produits, vertes rejouées seules).

Ouvert en route, hors périmètre

🤖 Generated with Claude Code

guycorbaz and others added 30 commits September 29, 2026 08:35
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…refs #420, refs #476)

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

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… l'orchestrateur (refs #420)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… arbitrages en attente (refs #420)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…#476) ; périmètre réduit au rapprochement (refs #420)

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>
… en partie (refs #420)

Le filtre des candidates, le score, le re-score à l'acceptation et le
montant affiché portent sur le reste dû (TTC − avoir − règlements), par
la forme jointe ; le TTC ne suit qu'en mention quand les deux diffèrent.
Manuel et brochure réécrits sur le score réel ; #481 ouverte pour le reste.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ues, Playwright départagé (refs #420)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…le rejeu sur interblocage (refs #480)

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>
…n rejoue un interblocage (refs #480)

Le règlement manuel incrémente invoices.version à chaque règlement, partiel
compris : le verrou optimiste de l'acceptation refuse désormais celle qui
arrive après un règlement concurrent. Un interblocage absorbé dans une
proposition (ROLLBACK TO SAVEPOINT en 1305) remonte en TransactionAborted et
la route rejoue le lot par retry_with. Trois tests de course sans sleep.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…INT, verrou de test détaché (refs #480)

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

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e ; PR #485 ouverte (refs #476)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ge du compte d'arrondi (refs #476)

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>
…s paramètres (refs #476)

Nouvelle colonne company_invoice_settings.default_rounding_account_id (DDL seul,
non breaking), validée charge ou produit, actif, imputable ; absente d'un PUT
elle est préservée, à null effacée. Section Différences d'arrondi dans
Paramètres > Facturation ; export ; import d'une sauvegarde antérieure prouvé.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… s'il change, Playwright nettoyé en finally (refs #476)

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

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ns les plans livrés (refs #476)

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

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

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
guycorbaz and others added 17 commits September 30, 2026 19:02
… livrés, désigné d'office (refs #476)

Marqueur de plan roundingDifference (pas de rôle, pas de numéro dans le code),
validé au chargement ; les deux insert_with_defaults* désignent le compte marqué
du plan de la société (FOR UPDATE), NULL sans erreur s'il manque. Rien chez les
sociétés existantes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n tracée, types liés par l'enum (refs #476)

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

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

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…u règlement manuel, sites triés (refs #476)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…des décimales, reste sous le demi-centime tracé (#490) (refs #476)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…les sur la forme big.js, test d'échelle discriminant, #490 reformulée (refs #476)

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

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

Le reste dû peut porter quatre décimales (10.0050) ; QR, rappels et dialogue
réclament 10.01, que le rapprochement ne proposait pas et que le règlement
manuel refusait en trop-perçu. Toute comparaison se fait au centime
(amount_due_to_centime) ; un paiement égal au reste arrondi solde la facture,
réglée au reste brut, l'écart passant sur le compte de différences d'arrondi
(double borne : entre brut et arrondi, trop-perçu). Sans compte utilisable,
refus dédié ROUNDING_ACCOUNT_NOT_CONFIGURED, rien d'écrit. Règlement manuel à
plus de deux décimales refusé.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…compte d'arrondi produit testé (refs #476)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e production ; story done (refs #476)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…di-au-centime

# Conflicts:
#	docs/manual/fr/admin-manual.pdf
#	docs/manual/fr/user-manual.pdf
#	frontend/src/lib/shared/i18n-keys.test.ts
@guycorbaz
guycorbaz merged commit 8b2d4a5 into main Oct 5, 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.

[BUG] Une QR-facture arrondie au centime supérieur fait refuser son propre paiement en trop-perçu

1 participant