From 9c4df1134e01032b3ca03a4fe83dd4b2a2edc278 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sat, 26 Sep 2026 23:48:05 +0200 Subject: [PATCH 01/51] =?UTF-8?q?docs(25-4):=20d=C3=A9coup=C3=A9e=20en=20a?= =?UTF-8?q?/b/c=20;=2025-4-a=20sp=C3=A9cifi=C3=A9e=20=E2=80=94=20l'avoir?= =?UTF-8?q?=20compt=C3=A9=20TTC,=20refus=C3=A9=20sur=20une=20facture=20r?= =?UTF-8?q?=C3=A9gl=C3=A9e=20(refs=20#455,=20refs=20#456,=20refs=20#416,?= =?UTF-8?q?=20refs=20#420)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-a-residuel-juste.md | 308 ++++++++++++++++++ .../25-4-propager-le-residuel.md | 87 +++++ .../sprint-status.yaml | 6 +- 3 files changed, 400 insertions(+), 1 deletion(-) create mode 100644 _bmad-output/implementation-artifacts/25-4-a-residuel-juste.md create mode 100644 _bmad-output/implementation-artifacts/25-4-propager-le-residuel.md diff --git a/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md b/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md new file mode 100644 index 00000000..88396a44 --- /dev/null +++ b/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md @@ -0,0 +1,308 @@ +# Story 25.4-a : Le résiduel juste — l'avoir compté TTC, et refusé sur une facture réglée + +Status: ready-for-dev + +**Issues : [#455], [#456]**, qu'elle **ferme** : `closes #455, closes #456` dans le **titre ET le +corps** de la PR (squash ; un `refs` partout laisserait les issues ouvertes sans signal). + +**Mère : `25-4-propager-le-residuel.md`** (`split`) — l'inventaire vérifié et la raison du +découpage y sont. **Sœurs à venir** : 25-4-b (#416, agrégats et relances), 25-4-c (#420, +rapprochement), qui **réemploient la formule** que cette story corrige : ⛔ elle passe en premier. + +## Story + +En tant que comptable, +je veux que le montant « reste dû » d'une facture soit calculé dans la même unité que ce que le +grand livre a passé, et qu'un avoir ne puisse pas viser une facture déjà réglée en partie, +afin que le reste dû ne mente jamais — ni en gardant la TVA d'une facture créditée, ni en laissant +une créance devenir créditrice sans que rien ne le signale. + +## Le défaut, vérifié dans le code + +### #455 — l'avoir est soustrait HORS TAXES d'un total TTC + +`amount_due` (`crates/kesh-db/src/repositories/invoice_settlements.rs:131-145`) calcule +`TTC − avoir émis − Σ règlements` : + +- le TTC vient de `INVOICE_TTC_SUBQUERY_SQL` (`invoices.rs:161-162`) : + `Σ (line_total + ROUND(line_total × vat_rate / 100, 2))` sur `invoice_lines` ; +- l'avoir vient de `INVOICE_CREDITED_SUBQUERY_SQL` (`invoice_settlements.rs:51-52`) : + `SUM(cn.total_amount)` — et `credit_notes.total_amount` est **HT** + (`20260627000001_credit_notes.sql:19` : « `total_amount` stocké = HT (Σ line_total) » ; + `credit_notes.rs:514-529`, `.bind(total_ht)`). + +Or l'écriture de l'avoir crédite la créance du **TTC** (`generate_credit_note_journal_lines`, +`credit_notes.rs:217-223` : `credit: total_ht + total_vat`, la TVA arrondie **ligne par ligne** par +`kesh_core::accounting::vat::line_vat_amount`, `:194` et `:209`). Le grand livre et le résiduel ne parlent +donc pas la même unité : une facture de 100.— HT à 8,1 % entièrement créditée garde **8.10** de +reste dû. La forme jointe `INVOICE_CREDITED_DERIVED_JOIN_SQL` (`:56-58`) porte le même défaut. + +⚠️ **Pourquoi aucun test ne l'a vu** : les factures des tests de règlement sont à **0 % de TVA** +(`crates/kesh-db/tests/invoice_settlement.rs:32`), où HT = TTC ; et aucun test n'associe un avoir +et `amount_due`. + +⚠️ **Latent sur les données neuves, pas sur les anciennes.** L'avoir est **total** et fait passer +la facture à `cancelled` (`credit_notes.rs:560-575`) ; le terme « avoir » n'est donc non nul que sur +une facture annulée, où le reste dû ne s'affiche que si `amountSettled > 0` +(`invoices/[id]/+page.svelte:1022-1041`) — c'est-à-dire **exactement l'état que #456 permet de +produire**. Et un `.keshbackup` de la v0.12.0 **peut contenir** cet état : l'import le restaure. + +### #456 — un avoir peut viser une facture partiellement réglée + +`create_credit_note` (`credit_notes.rs:292-308`) refuse une facture `paid_at IS NOT NULL` (garde +AC2bis) — **et rien d'autre**. Depuis la 24-2, `paid_at` n'est posé qu'**au solde** : une facture +réglée en partie a une ligne `invoice_settlements`, un reste dû positif, `paid_at` à `NULL` — elle +passe. + +Conséquence comptable : la créance reçoit **D TTC** (vente), **C réglé** (règlement), **C TTC** +(avoir) — elle finit **créditrice du montant encaissé**, sans flux de remboursement. C'est le solde +contre nature que la garde AC2bis voulait empêcher, atteint par un chemin qu'elle ne voit pas. La +facture passe ensuite à `cancelled`, et la ligne de règlement **survit** sur une facture annulée — +où `settlement_cancel_blocker` la déclare inannulable (`SettlementCancelBlocker::InvoiceCredited`, +`invoice_settlements_write.rs:327-333`). + +⛔ **Le patron de la bonne garde existe déjà** : la dévalidation lit « **l'existence d'une ligne** +`invoice_settlements` **OU** `paid_at IS NOT NULL` — les deux, jamais l'une seule » +(`UnvalidationBlocker::Settled`, `errors.rs:134-160` ; `invoices.rs:1430-1448`). + +⚠️ **Un test encode le défaut comme attendu** : la fixture `monter` +(`crates/kesh-db/tests/invoice_settlement.rs:937-990`) règle 40 sur 100 puis appelle +`create_credit_note` avec `.expect("avoir après règlement partiel — le vrai chemin l'accepte")`. + +⚠️ **Le frontend affiche le bouton sur une facture partiellement réglée** : +`invoices/[id]/+page.svelte:836` n'exige que `!invoice.paidAt`. Le bouton voisin « Dévalider » a +retiré cette condition pour cette raison même (commentaire `:865`) ; « Créer un avoir » n'a pas été +aligné. + +## Acceptance Criteria + +### Volet 1 — l'avoir compté TTC (#455) + +**AC 1** — `INVOICE_CREDITED_SUBQUERY_SQL` rend le **TTC** de l'avoir émis : +`Σ (cl.line_total + ROUND(cl.line_total × cl.vat_rate / 100, 2))` sur `credit_note_lines cl` jointe à +`credit_notes cn` (`cn.id = cl.credit_note_id`), filtrée `cn.invoice_id = i.id AND +cn.status = 'issued'`, `COALESCE(…, 0)`. **Même formule d'arrondi, ligne par ligne**, que +`INVOICE_TTC_SUBQUERY_SQL` et que `line_vat_amount` : c'est ce qui la fait concorder avec +l'écriture. + +**AC 2** — `INVOICE_CREDITED_DERIVED_JOIN_SQL` rend la même grandeur sous forme de table dérivée +(alias `cnt`, colonne `credited`), agrégée par `invoice_id`. + +**AC 3** — Les doc-comments des deux constantes disent **l'unité** (TTC, arrondi ligne par ligne) et +**pourquoi pas `credit_notes.total_amount`** (HT, miroir de `invoices.total_amount`) ; celui +d'`amount_due` dit que ses trois termes sont TTC. + +**AC 4** — ⛔ **Aucune migration, aucune colonne.** Le résiduel se **calcule** (24-2, D3) ; stocker +un TTC d'avoir recréerait un chiffre qui peut diverger. `credit_notes.total_amount` reste HT et +n'est pas renommé. + +**AC 5** — **DRY** : la formule « TTC d'une ligne » (`line_total + ROUND(line_total * vat_rate / 100, +2)`) n'est pas recopiée une troisième et une quatrième fois à la main. Elle est factorisée en **une +seule source** dont dérivent les quatre constantes (TTC facture scalaire et jointe, avoir scalaire +et joint) — par exemple une macro `macro_rules!` rendant un littéral via `concat!`, les constantes +restant des `&'static str`. Si la factorisation s'avère impossible sans perdre le caractère +`const`, le test de parité de l'AC 6 en tient lieu **et le doc-comment le dit**. + +**AC 6** — **Le test de parité promis par `invoice_settlements.rs:27-29`, et qui n'existe pas**, +est écrit : pour un jeu de factures qui couvre **sans règlement / un règlement / deux règlements / +avoir émis / avoir brouillon / deux taux de TVA dont 8,1 %**, la forme scalaire et la forme jointe +rendent **la même valeur, facture par facture**, pour le réglé (`st.settled`) **et** pour l'avoir +(`cnt.credited`). ⚠️ Patron : `crates/kesh-db/tests/invoice_ttc_parity.rs`. + +**AC 7** — ⛔ **Concordance avec le grand livre** : pour une facture multi-taux (dont 8,1 %) +créditée, le montant d'avoir que rend la sous-requête est **égal au crédit porté au compte de +créance par l'écriture de l'avoir** (`credit_notes.journal_entry_id` → ligne de crédit du compte +`default_receivable_account_id`). C'est l'assertion qui aurait attrapé #455 ; une comparaison au +seul HT ou à une valeur recalculée en Rust **ne suffit pas**. + +**AC 8** — Une facture validée à 8,1 %, **non réglée, créditée** : `amount_due` = **0** (et non la +TVA). Une facture validée à 8,1 %, **réglée de 40 puis créditée** (état **monté en SQL**, cf. +AC 13) : `amount_due` = **−40**, le montant encaissé en trop sur une vente annulée — et non +`TVA − 40`. ⚠️ **Pas d'écrêtage à zéro** : le doc-comment d'`amount_due` l'interdit déjà. + +### Volet 2 — l'avoir refusé sur une facture réglée (#456) + +**AC 9** — `create_credit_note` refuse une facture qui porte **au moins une ligne +`invoice_settlements` OU** `paid_at IS NOT NULL` — **les deux, jamais l'une seule**, comme +`UnvalidationBlocker::Settled`. La lecture des règlements se fait **après** le verrou de la facture +(`FOR UPDATE`, première instruction de la transaction, `credit_notes.rs:280-289`) et **dans** la +transaction ; elle est **verrouillante** (`… FOR UPDATE` ou `LOCK IN SHARE MODE`). ⛔ Leçon de la +25-3-b : sous REPEATABLE READ, une lecture non verrouillante fige l'instantané — ne pas l'ajouter +**avant** le verrou. + +**AC 10** — Le refus est une **variante dédiée** de `DbError`, pas `IllegalStateTransition` — même +motif que `InvoiceNotUnvalidatable` (`errors.rs:119-130`) : le générique ne dit ni ce qui bloque ni +quoi faire. Elle porte l'identifiant du premier règlement trouvé (`Option`, `None` si seul +`paid_at` est posé) et le numéro de la facture. Code machine **`CREDIT_NOTE_INVOICE_SETTLED`**, +HTTP **409**, ajouté à `DbError::code()` (`errors.rs:640-670`) et à toute garde qui énumère les +codes. + +**AC 11** — **Le cas « payée » passe par la même variante** : AC2bis cesse de rendre le générique. +Une seule garde, un seul message, qu'elle soit déclenchée par `paid_at` ou par une ligne de +règlement. + +**AC 12** — Message, **quatre locales**, clé **`error-credit-note-blocked-settled`**, mapping dans +`kesh-api/src/errors.rs` sur le patron de `error-invoice-unvalidate-blocked-settled` +(`:2528-2530`) : fr « Cette facture porte un règlement, même partiel : annulez-le d'abord pour +pouvoir émettre un avoir. » Registre du glossaire (`docs/i18n-glossaire.md` § Registre : de = +*Sie*, it = 2ᵉ personne du singulier, en neutre). `details` : `{ "invoiceId", "settlementId" }`. + +**AC 13** — La fixture `monter` (`invoice_settlement.rs:937-990`) **cesse de passer par +`create_credit_note`** pour le motif `InvoiceCredited` : elle monte l'état **en SQL** (avoir +`issued` inséré, facture `cancelled`), avec un commentaire qui dit que l'état n'est **plus +atteignable par l'application** depuis 25-4-a, mais **reste possible** par l'import d'une +sauvegarde antérieure — ce qui justifie de garder `SettlementCancelBlocker::InvoiceCredited`. +⛔ Ne **pas** supprimer ce motif ni ses tests. + +**AC 14** — Frontend : le bouton « Créer un avoir » (`invoices/[id]/+page.svelte:836`) est masqué +quand `invoice.paidAt` est posé **ou** `Number(invoice.amountSettled) > 0` — même condition que le +serveur. Si la course fait arriver le refus malgré tout, le dialogue affiche le message du serveur +(`err.message`, `:98`), déjà traduit : rien à ajouter côté client. + +**AC 15** — Rien n'est **réparé** dans les données existantes : pas de migration, pas de rejeu +(`CLAUDE.md` : aucune donnée de production à protéger ; précédent 24-2 D7). Les états hérités +restent **visibles** — reste dû négatif sur la fiche, motif `InvoiceCredited` à l'annulation du +règlement — et c'est ce que les textes disent (AC 17). + +### Volet 3 — tests, textes + +**AC 16** — Tests, au minimum (noms indicatifs) : + +| Test | Prouve | +|---|---| +| `credited_amount_is_ttc_and_matches_the_ledger` | AC 1, AC 7 — facture multi-taux, avoir émis : sous-requête = crédit créance de l'écriture d'avoir | +| `amount_due_of_a_credited_invoice_is_zero` | AC 8 — 8,1 %, non réglée : `0`, pas `8.10` | +| `amount_due_after_settlement_then_legacy_credit_is_minus_settled` | AC 8 — état hérité monté en SQL : `−40` | +| `settled_and_credited_forms_are_at_parity` | AC 6 | +| `credit_note_refused_on_partially_settled_invoice` | AC 9, AC 10 — **rien écrit** : aucun avoir, facture `validated`, `version` inchangée, solde de créance inchangé, séquence d'avoir non consommée | +| `credit_note_refused_on_paid_invoice` (**existant, réécrit**) | AC 11 — nouvelle variante, plus `IllegalStateTransition` | +| `credit_note_accepted_after_the_settlement_is_cancelled` | la promesse du message : annuler le règlement rouvre l'avoir | +| `credit_note_waits_for_a_concurrent_settlement` | AC 9 — **entrelacement** : une transaction verrouille la facture et insère un règlement ; `create_credit_note` lancé en parallèle attend, puis **refuse** après le commit. Patron : la sonde d'entrelacement de la 25-3-b | +| e2e API `credit_note_on_partially_settled_invoice_is_409` | la frontière HTTP : 409, `CREDIT_NOTE_INVOICE_SETTLED`, message fr | +| Vitest fiche facture | AC 14 — bouton absent si `amountSettled > 0`, présent sinon | + +⛔ **Chaque test porte au moins une facture à TVA non nulle.** À 0 %, HT = TTC et #455 est +invisible — c'est ainsi qu'il est passé. + +⛔ **Mutations à exécuter et à consigner** (résultat **observé**, pas supposé) : (m1) revenir à +`SUM(cn.total_amount)` dans la forme scalaire ; (m2) idem dans la forme jointe seule ; (m3) retirer +la lecture des règlements de la garde (ne garder que `paid_at`) ; (m4) retirer `paid_at` (ne garder +que la ligne) ; (m5) lire les règlements **avant** le verrou, non verrouillant ; (m6) remettre +`!invoice.paidAt` seul sur le bouton. Chacune doit faire rougir au moins un test. + +**AC 17** — Manuels et notes (`docs/manual/fr/user-manual.tex`, PDF régénéré et **contrôlé +aplati**) : +- `:1040` et `:2073` : « un avoir est refusé sur une facture **marquée payée** » devient « … sur une + facture **réglée, même en partie** » — annuler d'abord le règlement ; +- § *Avoirs* (`\label{sec:avoirs}`, `:1007`) : le refus et son motif sont nommés à côté du refus + « compte de produit archivé » ; +- `:963` et `:1455` (« la facture a été créditée par un avoir… ») : précisés comme **cas hérité** + — une facture créditée avant la v0.12.1, ou restaurée d'une sauvegarde antérieure ; +- `CHANGELOG.md` `[0.12.1]` *Fixed* : les deux défauts, en langage d'utilisateur. + +⚠️ **Greper le symptôme, pas la phrase** : `grep -rniE "payée|encaissée|réglée" docs/manual/fr/*.tex` +restreint aux lignes qui parlent d'avoir, plus le PDF aplati. Les manuels DE/IT/EN sont des stubs. + +## Tasks / Subtasks + +- [ ] **T1 — formule de l'avoir TTC** (AC 1-5) : factoriser la formule de ligne, réécrire les deux + constantes d'avoir, doc-comments. +- [ ] **T2 — parité et concordance** (AC 6-8) : nouveau fichier de test sur le patron + `invoice_ttc_parity.rs` ; montage de l'état hérité en SQL. +- [ ] **T3 — garde de l'avoir** (AC 9-11) : lecture verrouillante des règlements après le verrou, + variante `DbError`, `code()`. +- [ ] **T4 — API et i18n** (AC 12) : mapping, clé ×4 ; e2e 409. +- [ ] **T5 — fixture `monter`** (AC 13) : état monté en SQL, commentaire ; les tests d'annulation de + règlement restent verts. +- [ ] **T6 — frontend** (AC 14) : condition du bouton, Vitest. +- [ ] **T7 — tests et mutations** (AC 16) : m1 à m6 exécutées, résultats consignés. +- [ ] **T8 — textes** (AC 17) : manuel, PDF aplati, CHANGELOG. +- [ ] **T9 — gates** : backend complet (base remise à zéro), frontend complet, E2E complet. + +## Dev Notes + +### Ce qu'il ne faut pas faire + +- ⛔ **Ne pas « corriger » `credit_notes.total_amount` en TTC.** Il est HT par construction, miroir + de `invoices.total_amount`, et d'autres lecteurs le consomment comme tel (export, PDF, liste des + avoirs). Le défaut est dans **le lecteur**, pas dans la colonne. +- ⛔ **Ne pas calculer le TTC de l'avoir en Rust** puis le soustraire : `amount_due` doit rester + **une requête**, et la forme jointe est destinée aux agrégats de 25-4-b (pas de N+1). +- ⛔ **Ne pas supprimer `SettlementCancelBlocker::InvoiceCredited`** : l'import d'un `.keshbackup` + v0.12.0 peut ramener l'état qu'il décrit. +- ⚠️ **Ne pas lire `cn.total_amount` × taux** : un avoir multi-taux n'a pas un taux, et l'arrondi + doit être **par ligne** pour concorder avec l'écriture (`line_vat_amount`). + +### Où regarder + +| Fichier | Rôle | +|---|---| +| `crates/kesh-db/src/repositories/invoice_settlements.rs:24-58, 122-145` | les quatre constantes, `amount_due` | +| `crates/kesh-db/src/repositories/invoices.rs:155-190` | `INVOICE_TTC_SUBQUERY_SQL` / `…_DERIVED_JOIN_SQL`, `total_ttc` | +| `crates/kesh-db/src/repositories/credit_notes.rs:187-257, 260-330, 510-575` | écriture de l'avoir, garde AC2bis, `total_amount`, bascule `cancelled` | +| `crates/kesh-db/src/errors.rs:119-175, 300-470, 640-670` | `UnvalidationBlocker`, `DbError`, `code()` | +| `crates/kesh-db/src/repositories/invoices.rs:1430-1448` | la garde de dévalidation, patron de l'AC 9 | +| `crates/kesh-api/src/errors.rs:2515-2560, 2741-2748` | mapping `InvoiceNotUnvalidatable`, générique | +| `crates/kesh-api/src/routes/credit_notes.rs:183-205` | handler de création | +| `crates/kesh-db/tests/invoice_ttc_parity.rs` | patron du test de parité | +| `crates/kesh-db/tests/credit_notes_repository.rs:267-299` | `credit_note_refused_on_paid_invoice` | +| `crates/kesh-db/tests/invoice_settlement.rs:32, 116-125, 937-990` | helper à 0 %, `solde()`, `monter` | +| `frontend/src/routes/(app)/invoices/[id]/+page.svelte:90-104, 836, 865, 1022-1041` | dialogue d'avoir, bouton, précédent « Dévalider », reste dû | + +### Courses + +Les trois chemins qui écrivent un règlement ou un avoir, et ce qui les sérialise : + +| Chemin | Verrou sur la facture | +|---|---| +| `settle_invoice` (`invoice_settlements_write.rs:60-72`) | `FOR UPDATE`, première lecture | +| `create_credit_note` (`credit_notes.rs:280-289`) | `FOR UPDATE`, première lecture | +| `accept_one_invoice` (`kesh-api/src/routes/reconciliation.rs`) | **aucun** — lecture simple, puis `UPDATE invoices … AND version = ? AND status = 'validated'` (`:1490-1500`) | + +Le troisième se sérialise par **verrou optimiste** : si l'avoir passe d'abord, la facture est +`cancelled` et l'`UPDATE` du rapprochement n'affecte aucune ligne. Si le rapprochement passe +d'abord, son `UPDATE` tient le verrou de ligne jusqu'au commit ; `create_credit_note` l'attend sur +son `FOR UPDATE`, puis **doit** voir le règlement — d'où l'exigence d'une lecture verrouillante +(AC 9). ⚠️ Vérifier en dev que l'échec de l'`UPDATE` du rapprochement sur 0 ligne rend bien un +`FailedProposal` et annule tout (test existant ou à ajouter). + +### Gardes-fous du dépôt + +- **Aucune migration** : P1-P8 ne s'arment pas. Si une migration devient nécessaire, arrêter et + demander. +- **Gate complet** : la story touche des repositories — § *Exception `kesh-db`* : gate complet même + en cours de boucle de revue. +- **i18n** : une clé ×4 côté serveur ; `sitesTotal` ne bouge que si le frontend ajoute un + `i18nMsg(` — AC 14 n'en ajoute pas. + +### References + +- 24-2, D3 (le résiduel se calcule) et D4 (`paid_at` projection du solde) — + `24-2-encaissement-client.md:120-160`. +- 25-3-b, leçon REPEATABLE READ — mémoire `etat-epic-25`. +- Glossaire et registre — `docs/i18n-glossaire.md`. + +## Questions pour Guy + +Aucune qui bloque cette story. La question de la QR-facture jointe aux relances (Q1 de la mère) +bloque **25-4-b**, pas celle-ci. + +## Dev Agent Record + +### Agent Model Used + +### Debug Log References + +### Completion Notes List + +### File List + +## Change Log + +- **2026-09-26** — Créée (Opus 5.5) après découpage de la 25-4. Inventaire vérifié par `grep -nF` + sur chaque site cité. Deux faits hors des issues : #455 est **latent** sur les données neuves et + ne se voit que dans l'état que #456 produit — d'où leur réunion ; et la fixture `monter` encode + #456 comme attendu. + +[#455]: https://github.com/guycorbaz/kesh/issues/455 +[#456]: https://github.com/guycorbaz/kesh/issues/456 diff --git a/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md b/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md new file mode 100644 index 00000000..6da60b67 --- /dev/null +++ b/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md @@ -0,0 +1,87 @@ +# Story 25.4 : Propager le résiduel — découpée en 25-4-a / 25-4-b / 25-4-c + +Status: split + +**Issues : [#416], [#420]** (fiche de l'epic) — **et [#455], [#456]**, rattachées ici le 2026-09-26 : +les quatre portent sur **la même grandeur**, le montant restant dû d'une facture client, et les +quatre sont au jalon « Vague 1 », que l'Epic 25 doit mettre à zéro. + +## Pourquoi découper — § *Règle de splitting préventif* + +Inventaire des sites fait le 2026-09-26 (trois lectures du code, chaque site revérifié par +`grep -nF`, cf. § ci-dessous). Les quatre issues réunies touchent **six modules** : `kesh-db` +(résiduel, avoirs, rapprochement, échéancier), `kesh-report` (balance âgée), +`kesh-reconciliation` (score), `kesh-api` (routes factures, rapprochement, relances, erreurs), +`kesh-i18n`, `frontend` (fiche facture, échéancier, dialogue de règlement). Le seuil est **5** : la +règle impose le découpage **avant** `bmad-create-story`. + +Le découpage suit l'ordre des dépendances, non celui des issues : + +| Story | Issues | Ce qu'elle fait | Pourquoi à ce rang | +|---|---|---|---| +| **25-4-a** — le résiduel juste | [#455], [#456] | la formule canonique soustrait l'avoir **TTC** ; un avoir est refusé sur une facture **réglée, même en partie** ; le test de parité promis et jamais écrit | ⛔ **les deux suivantes réemploient la formule** : la propager avant de la corriger propagerait le défaut | +| **25-4-b** — le résiduel aux agrégats | [#416] | balance âgée, totaux de l'échéancier, **colonne « reste dû »** de l'échéancier et de son CSV, dialogue de règlement pré-rempli, **montant réclamé par les relances** | le cœur de #416 ; première utilisatrice des formes jointes | +| **25-4-c** — le résiduel au rapprochement | [#420] | filtre des candidats, score, re-score à l'acceptation, montant affiché dans la proposition | indépendante de 25-4-b, mais du même socle | + +## Ce que l'inventaire a trouvé, et que les issues ne disaient pas + +1. ⛔ **#420 a DEUX sites, et le premier est avant le score.** `find_unpaid_invoices_for_window` + (`crates/kesh-db/src/repositories/reconciliation.rs:115`) filtre les candidats par + `HAVING total_ttc BETWEEN ? - ? AND ? + ?` : le virement du solde d'une facture partiellement + réglée n'est **même pas candidat**. Corriger `amount_score` seul (`matching.rs:68`) ne changerait + rien. Troisième site : le re-score à l'acceptation, `reconciliation.rs:1196` + (`invoices::total_ttc`). +2. ⛔ **Les relances réclament le TTC complet.** `render_reminder` + (`crates/kesh-api/src/routes/invoice_email.rs:334`) : `total_due = ttc + other_fees + level_fee`. + Une facture de 1 000.— réglée à 900.— est relancée pour 1 000.— plus les frais. Aucune issue ne le + nomme ; c'est **le même symptôme** que #416 — la grandeur agrégée n'est pas le résiduel —, sur un + document **envoyé au client**. Rattaché à 25-4-b. +3. ⚠️ **La relance joint le PDF de la facture**, dont la QR-facture porte le TTC + (`invoice_email.rs:1140-1166`, `invoice_pdf_service::render`). Un client qui paie la relance en + scannant la QR paie **à nouveau le montant entier**. Question posée à Guy (Q1 ci-dessous). +4. ⚠️ **#455 est latent sur les données neuves.** Un avoir est **total** et fait passer la facture à + `cancelled` (`credit_notes.rs:560-563`) ; or les agrégats, le rapprochement et le règlement ne + lisent que des factures `validated`. Le terme « avoir » du résiduel n'est donc **non nul que sur + une facture annulée**, et le reste dû ne s'y affiche que si `amountSettled > 0` — c'est-à-dire + **seulement dans l'état que #456 permet de produire**. Les deux issues se corrigent ensemble. +5. ⚠️ **Les formes jointes existent et ne servent nulle part.** `INVOICE_SETTLED_DERIVED_JOIN_SQL` + et `INVOICE_CREDITED_DERIVED_JOIN_SQL` (`invoice_settlements.rs:40`, `:56`) n'ont aucun appelant, + et le « test de parité » annoncé par le commentaire des lignes 27-29 **n'existe pas**. 25-4-b sera + leur premier appelant : la parité doit être prouvée **avant**. +6. **Pourquoi aucun test n'a vu #455** : toutes les factures des tests de règlement sont à **0 % de + TVA** (`crates/kesh-db/tests/invoice_settlement.rs:32`), où HT = TTC. +7. ⚠️ **Un test encode #456 comme attendu** : la fixture `monter` + (`crates/kesh-db/tests/invoice_settlement.rs:937-990`) règle 40 sur 100 puis crée un avoir avec + `.expect("avoir après règlement partiel — le vrai chemin l'accepte")`. Il **décrit le défaut** ; + il se corrige, il ne se contourne pas. + +## Hors périmètre des trois stories + +- **L'imputation de l'écart** d'un règlement partiel (escompte, frais, perte) — [#384], 25-6. +- **Le côté fournisseur** : une facture fournisseur se règle en une fois, il n'y a pas de résiduel + partiel (#416, § Portée). +- **L'avoir partiel et le remboursement** — v0.2, inchangé. + +## Questions pour Guy + +**Q1 — la QR-facture jointe à une relance.** Elle porte le TTC complet. Sur une facture +partiellement réglée, un client qui paie par la QR paie deux fois la part déjà réglée. Trois +issues : (a) la QR de la relance porte le **reste dû** — le PDF joint n'est alors plus tout à fait +la facture envoyée à l'origine, ce qui touche #387 (l'archivage du PDF) ; (b) la relance d'une +facture partiellement réglée joint un PDF **sans montant dans la QR** (la norme le permet : le +client saisit le montant) ; (c) laisser tel quel et le dire dans le texte de la relance. Ma +recommandation : (b), qui ne ment pas et ne modifie pas la facture. **À trancher avant 25-4-b.** + +## Change Log + +- **2026-09-26** — Découpée avant spécification (§ *Règle de splitting préventif*, six modules), + sur inventaire vérifié. #455 et #456 rattachées (même grandeur, même jalon). Deux sites trouvés + hors des issues : le filtre SQL des candidats du rapprochement (#420), et le montant des relances + (rattaché à 25-4-b). 25-4-a spécifiée dans la foulée. + +[#384]: https://github.com/guycorbaz/kesh/issues/384 +[#387]: https://github.com/guycorbaz/kesh/issues/387 +[#416]: https://github.com/guycorbaz/kesh/issues/416 +[#420]: https://github.com/guycorbaz/kesh/issues/420 +[#455]: https://github.com/guycorbaz/kesh/issues/455 +[#456]: https://github.com/guycorbaz/kesh/issues/456 diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index cfbc52ae..8d962656 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -1,3 +1,4 @@ +# last_updated: 2026-09-26 (5) (25-4 DECOUPEE en a/b/c ; 25-4-a creee, #455/#456 rattachees ; #467 #468 #470 mergees.) # last_updated: 2026-09-26 (4) (**25-3-c DONE** — revue close, gates verts, non poussee.) # last_updated: 2026-09-26 (3) (25-3-c IMPLEMENTEE, en review ; revue a posteriori de la 25-5-a close dans le worktree.) # last_updated: 2026-09-26 (2) (25-3-c : Q1 tranchee — reglement detache.) @@ -352,7 +353,10 @@ development_status: 25-3-c-annuler-facture-fournisseur: done # 2026-09-26 **REVUE CLOSE EN 1 PASSE** (0 > LOW, Sonnet x3) ; non poussee ; PR `closes #454` titre ET corps, sur accord. **IMPLEMENTEE** — gates 2472/2472, 783/783, E2E 220/10/19 sans regression ; prochaine etape : code review. # 2026-09-26 **SPEC VALIDEE en 2 passes** (3 MED -> 0 > LOW). **SPECIFIEE** — `25-3-c-annuler-facture-fournisseur.md`. Geste par le socle (autorite `SupplierPurchase`), queue commune sur l'ecriture d'ACHAT, lot en dernier rang ; payee : reglement DETACHE (colonnes remises a NULL, ecriture libre, lien garde par l'audit) — **Q1 tranchee par Guy le 2026-09-26**. Aucune migration. Prochaine etape : validate. # 2026-09-24 NEE d'un arbitrage de Guy — une facture fournisseur s'annule DANS TOUS LES CAS, sauf si l'exercice de son ecriture d'achat est CLOS (l'exercice, pas le verrou de periode) ; payee, son reglement RESTE au grand livre et REDEVIENT A LETTRER (Epic 15 : un paiement doit correspondre a une facture, au besoin creee pour lui — « comme bexio »). Reecrit `cancel`, donc absorbe [#454]. Derriere la 25-3-a. 25-3-b-annuler-rapprochement: done # 2026-09-25 DONE — revue close en passe 2 (Sonnet 1 MED -> Haiku 0) ; gates : backend 2463/2463, frontend 777/777, E2E sans regression. Non poussee. — SPEC VALIDEE (boucle close en passe 4 : 2 HIGH -> 2 MED -> 2 MED -> 3 LOW ; pas de decoupage, arbitrage de Guy). Q1-Q3 tranchees. — [#418] closes — annuler un rapprochement bancaire. ⛔ NE JAMAIS compter sur le `ON DELETE SET NULL` de `matched_entry_id` : supprimer l'ecriture ferait disparaitre le lien EN SILENCE, le mode d'echec meme que la story repare. ⚠️ Le chemin d'ACCEPTATION n'a aucune fonction `kesh-db` a mirer : il est ecrit en SQL brut a **cinq** sites de `routes/reconciliation.rs`, dont **un seul** porte le verrou optimiste. Quand la transaction porte une facture, appelle le geste de la 25-3-a. Derriere elle. 25-3-annuler-reglement-et-rapprochement: split # [#414] [#418] — **l'Epic 24 a livre l'encaissement et le rapprochement ; il n'a PAS livre le moyen de les DEFAIRE.** Une erreur d'imputation est aujourd'hui incorrigible autrement qu'a la main — et le gel de la 24-4b interdit precisement la main. ⚠️ *C'est le prix d'une story qui ferme une porte sans ouvrir la suivante : le gel est juste, et il rend cette story-ci necessaire.* - 25-4-propager-le-residuel: backlog # [#416] [#420] — la 24-2 a introduit le reglement PARTIEL ; le residuel n'est propage ni a la balance agee ni a l'echeancier, et **le score de rapprochement compare au TTC et non au residuel** : le virement du solde d'une facture partiellement reglee **score 0**. + 25-4-a-residuel-juste: ready-for-dev # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (latent, visible seulement dans l'etat que #456 produit) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE, validation a lancer. + 25-4-b-residuel-aux-agregats: backlog # [#416] + montant des RELANCES (TTC complet, trouve a l'inventaire) — Q1 a Guy : QR-facture jointe a la relance porte le TTC. + 25-4-c-residuel-au-rapprochement: backlog # [#420] — DEUX sites : filtre SQL des candidats (HAVING total_ttc) avant le score, puis score et re-score a l'acceptation. + 25-4-propager-le-residuel: split # 2026-09-26 DECOUPEE (six modules > 5) en 25-4-a / 25-4-b / 25-4-c ; #455 et #456 rattachees. # [#416] [#420] — la 24-2 a introduit le reglement PARTIEL ; le residuel n'est propage ni a la balance agee ni a l'echeancier, et **le score de rapprochement compare au TTC et non au residuel** : le virement du solde d'une facture partiellement reglee **score 0**. 25-5-a-export-souverainete: done # 2026-09-26 **MERGEE (PR #452, #386 fermee) SANS REVUE DE CODE** ; revue a posteriori CLOSE en 3 passes sur `story/25-5-a-revue-code` (4 HIGH P1, 1 HIGH orchestrateur P2 — colonnes manquantes, garde de colonnes —, P3 ciblee test seul) ; gates 2466/2466, E2E 221/8/19 sans regression ; reports #465, #466. # 2026-09-23 **SPECIFIEE et VALIDEE en 1 passe** (0 CRITICAL, 4 HIGH, 3 MEDIUM, 3 LOW, tous corriges). [#386] — issue du DECOUPAGE de la 25-5 (arbitrage de Guy) : #385 (Balance vs Bilan) et #386 n'ont en commun que le mot « etat », et touchent des modules disjoints. ⛔ **Trois faits qui corrigent l'issue** : 21 tables absentes et non 10 ; le trou s'est CREUSE depuis son ecriture (`invoice_settlements`, Epic 24) ; et SIX repositories sur huit n'ont aucune lecture exhaustive — le vrai cout, absent de l'issue. Arbitrage de Guy : l'export CSV ne porte que les donnees COMPTABLES (11 dedans), les backups portent tout ; 10 exclusions AVEC motif ecrit, dont 3 tables de SECRETS. Les justificatifs (fichiers) partent en story separee sur la SAUVEGARDE. ⛔ La vraie livraison est la GARDE D'EXHAUSTIVITE (patron D4-ter + P7), non les 11 exports : trois epics ont rouvert le trou en silence. ⚠️ Pieges releves par la validation : le nombre 19 code en dur a SEPT endroits dont deux `debug_assert_eq!` qui PANIQUENT ; `audit_log` n'a AUCUN dump exhaustif (ses fonctions sont bornees, la route rejette au-dela de 10 000 lignes) ; `csv_sanitize` existe et n'est pas employee par cet export ; deux sites de manuel DEJA faux (un dossier `reports/` invente, un « 38 » pour 39). 25-5-b-balance-solde-ouverture: backlog # [#385] — la **Balance des comptes ne concorde pas avec le Bilan**, il manque la colonne « solde d'ouverture » (III.4). Detachee de la 25-5 le 2026-09-23 : voir 25-5-a. 25-5-etats-et-export: split # [#385] [#386] — la **Balance des comptes ne concorde pas avec le Bilan**, il manque la colonne « solde d'ouverture » (III.4) ; et **l'export de souverainete omet les achats, les avoirs, les projets et la piste d'audit** (V.6) — *il promet plus qu'il ne tient*. From 0f4b9ec0caf993a11f4b7d86a9c69462326d06d9 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sat, 26 Sep 2026 23:48:27 +0200 Subject: [PATCH 02/51] docs(25-4-a): prompt de validation P1 (refs #455, refs #456) Co-Authored-By: Claude Opus 5.5 --- .../25-4-a-validate-prompt-p1.md | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 _bmad-output/implementation-artifacts/25-4-a-validate-prompt-p1.md diff --git a/_bmad-output/implementation-artifacts/25-4-a-validate-prompt-p1.md b/_bmad-output/implementation-artifacts/25-4-a-validate-prompt-p1.md new file mode 100644 index 00000000..03a3ca11 --- /dev/null +++ b/_bmad-output/implementation-artifacts/25-4-a-validate-prompt-p1.md @@ -0,0 +1,50 @@ +# Prompt — validation P1, Story 25-4-a (le résiduel juste) + +*Versionné le 2026-09-26. **Une lentille** (Sonnet), contexte frais.* + +Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-4-propager-le-residuel`. Fiche à valider : +`_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md`. Fiche mère (inventaire, +découpage) : `25-4-propager-le-residuel.md`. Issues : `gh issue view 455`, `gh issue view 456`. +Contexte de la grandeur : `24-2-encaissement-client.md` § D3, D4, AC 5-7. Règles du dépôt : +`CLAUDE.md`. Checklist BMAD : `.claude/skills/bmad-create-story/checklist.md`. + +## Axes — tous obligatoires + +1. **Chaque référence `fichier:ligne`** existe et dit ce que la fiche affirme — relis le code. +2. **La formule** : la sous-requête TTC de l'avoir prescrite (AC 1-2) concorde-t-elle réellement, + centime par centime, avec l'écriture de l'avoir (`generate_credit_note_journal_lines`, + `line_vat_amount` — lis `kesh-core`, sens d'arrondi de `ROUND` MariaDB vs Rust) ? Et avec + `INVOICE_TTC_SUBQUERY_SQL` ? Un écart d'un centime possible est un finding. +3. **La garde** (AC 9-11) : inventorie **tous** les chemins qui créent un règlement ou un avoir + (pars du symptôme : `grep -rn "INSERT INTO invoice_settlements\|create_credit_note\|INSERT INTO credit_notes" crates/`), + et leur sérialisation (verrou pessimiste ou optimiste). La fiche en nomme trois : en manque-t-il ? + Le raisonnement REPEATABLE READ de § Courses est-il juste ? +4. **L'état hérité** : l'import d'une sauvegarde ramène-t-il vraiment l'état (règlement + avoir) ? + Les textes prescrits (AC 17) le disent-ils juste ? D'autres lecteurs de `amount_due` ou des + constantes changent-ils de valeur avec l'AC 1 (inventaire : `grep -rn "INVOICE_CREDITED\|amount_due" crates/ frontend/src`) ? +5. **Les tests** (AC 16) : chacun prouve-t-il ce qu'il annonce, ou peut-il passer à vide ? Les + mutations m1-m6 sont-elles tuables par les tests listés ? Une mutation que rien ne tuerait est + un finding. +6. **Le manuel** : les lignes citées (AC 17) existent-elles et disent-elles ce qu'on veut changer ? + Contrôle aussi le **PDF aplati** (`pdftotext docs/manual/fr/user-manual.pdf - | tr '\n' ' ' | tr -s ' '`, + vers `/tmp/claude-1000/-home-gcorbaz-devel-kesh/ca5ce2e2-67a3-4eeb-817f-c2de35620a1c/scratchpad/`). + Une autre phrase du manuel ou de l'admin-manual, de l'api-external, du README, promet-elle + l'ancien comportement ? +7. **Le découpage** (fiche mère) : quelque chose de 25-4-a appartient-il en fait à b ou c, ou + l'inverse ? La latence de #455 est-elle correctement établie ? + +## Ce que tu rends + +- **Findings** : sévérité (CRITICAL / HIGH / MEDIUM / LOW), l'endroit exact de la fiche, **la + preuve** (commande et résultat, code lu), la correction proposée. +- ⛔ **La liste des axes réellement exercés ET de ceux qui ne l'ont pas été.** Un « 0 finding » + sans elle ne compte pas. + +## Interdits + +⛔ N'écris aucun fichier du dépôt ; n'exécute aucune commande qui écrit dans le dépôt ou dans une +base — `scripts/prepare-release.sh`, `scripts/regen-test-schema.sh`, `scripts/install-hooks.sh`, +`scripts/test-fast.sh`, `scripts/mem-guard.sh`, `make`, `latexmk`, tout `git commit`/`push`/`add`/ +`stash`/`reset`/`rebase`/`checkout`/`switch`/`worktree`, `sqlx migrate`, `cargo test`/`nextest`, +`npm run`, `npx playwright`. Autorisés : lecture, `grep`, `git log`/`show`/`diff`, `gh issue view`, +`pdftotext` vers le scratchpad, `cargo check`. From 73172c8f75ff9dbfc991b29f46799b12a0bb435a Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sat, 26 Sep 2026 23:53:51 +0200 Subject: [PATCH 03/51] =?UTF-8?q?docs(25-4):=20Q1=20tranch=C3=A9e=20?= =?UTF-8?q?=E2=80=94=20QR=20sans=20montant=20sur=20une=20relance=20partiel?= =?UTF-8?q?lement=20r=C3=A9gl=C3=A9e,=20reste=20=C3=A0=20payer=20dit=20au?= =?UTF-8?q?=20client=20(refs=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-propager-le-residuel.md | 17 +++++++++++++++++ .../implementation-artifacts/sprint-status.yaml | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md b/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md index 6da60b67..f651c0ef 100644 --- a/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md +++ b/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md @@ -72,8 +72,25 @@ facture partiellement réglée joint un PDF **sans montant dans la QR** (la norm client saisit le montant) ; (c) laisser tel quel et le dire dans le texte de la relance. Ma recommandation : (b), qui ne ment pas et ne modifie pas la facture. **À trancher avant 25-4-b.** +### ✅ Arbitrage du 2026-09-26 (Q1) — (b), et le reste à payer dit au client + +*« b, mais indiquer au client ce qu'il reste à payer. »* (Guy) + +Pour 25-4-b, donc : + +- la relance d'une facture **partiellement réglée** joint un PDF dont la QR-facture **ne porte pas + de montant** — le client le saisit ; une facture sans règlement garde sa QR à montant ; +- la relance **dit ce qu'il reste à payer** : `{totalDue}` devient **reste dû + frais**, et non plus + TTC + frais (`invoice_email.rs:334`) — c'est le montant que le client doit saisir. + +⚠️ **Ne pas contester l'arbitrage en revue** : en contester la mise en œuvre. Reste à établir en +spécification de 25-4-b : si le reste dû figure **aussi sur le PDF** joint (mention à côté de la +QR sans montant), ou dans le seul texte de la relance — le PDF est aujourd'hui celui de la facture, +et #387 (l'archivage du PDF envoyé) le touche. + ## Change Log +- **2026-09-26** — Q1 tranchée par Guy : QR sans montant pour une facture partiellement réglée, et le reste à payer dit au client (rattaché à 25-4-b). - **2026-09-26** — Découpée avant spécification (§ *Règle de splitting préventif*, six modules), sur inventaire vérifié. #455 et #456 rattachées (même grandeur, même jalon). Deux sites trouvés hors des issues : le filtre SQL des candidats du rapprochement (#420), et le montant des relances diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index 8d962656..fdbcda3c 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -354,7 +354,7 @@ development_status: 25-3-b-annuler-rapprochement: done # 2026-09-25 DONE — revue close en passe 2 (Sonnet 1 MED -> Haiku 0) ; gates : backend 2463/2463, frontend 777/777, E2E sans regression. Non poussee. — SPEC VALIDEE (boucle close en passe 4 : 2 HIGH -> 2 MED -> 2 MED -> 3 LOW ; pas de decoupage, arbitrage de Guy). Q1-Q3 tranchees. — [#418] closes — annuler un rapprochement bancaire. ⛔ NE JAMAIS compter sur le `ON DELETE SET NULL` de `matched_entry_id` : supprimer l'ecriture ferait disparaitre le lien EN SILENCE, le mode d'echec meme que la story repare. ⚠️ Le chemin d'ACCEPTATION n'a aucune fonction `kesh-db` a mirer : il est ecrit en SQL brut a **cinq** sites de `routes/reconciliation.rs`, dont **un seul** porte le verrou optimiste. Quand la transaction porte une facture, appelle le geste de la 25-3-a. Derriere elle. 25-3-annuler-reglement-et-rapprochement: split # [#414] [#418] — **l'Epic 24 a livre l'encaissement et le rapprochement ; il n'a PAS livre le moyen de les DEFAIRE.** Une erreur d'imputation est aujourd'hui incorrigible autrement qu'a la main — et le gel de la 24-4b interdit precisement la main. ⚠️ *C'est le prix d'une story qui ferme une porte sans ouvrir la suivante : le gel est juste, et il rend cette story-ci necessaire.* 25-4-a-residuel-juste: ready-for-dev # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (latent, visible seulement dans l'etat que #456 produit) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE, validation a lancer. - 25-4-b-residuel-aux-agregats: backlog # [#416] + montant des RELANCES (TTC complet, trouve a l'inventaire) — Q1 a Guy : QR-facture jointe a la relance porte le TTC. + 25-4-b-residuel-aux-agregats: backlog # [#416] + montant des RELANCES (TTC complet, trouve a l'inventaire) — Q1 TRANCHEE 2026-09-26 : QR sans montant si partiellement reglee, et le reste a payer dit au client. 25-4-c-residuel-au-rapprochement: backlog # [#420] — DEUX sites : filtre SQL des candidats (HAVING total_ttc) avant le score, puis score et re-score a l'acceptation. 25-4-propager-le-residuel: split # 2026-09-26 DECOUPEE (six modules > 5) en 25-4-a / 25-4-b / 25-4-c ; #455 et #456 rattachees. # [#416] [#420] — la 24-2 a introduit le reglement PARTIEL ; le residuel n'est propage ni a la balance agee ni a l'echeancier, et **le score de rapprochement compare au TTC et non au residuel** : le virement du solde d'une facture partiellement reglee **score 0**. 25-5-a-export-souverainete: done # 2026-09-26 **MERGEE (PR #452, #386 fermee) SANS REVUE DE CODE** ; revue a posteriori CLOSE en 3 passes sur `story/25-5-a-revue-code` (4 HIGH P1, 1 HIGH orchestrateur P2 — colonnes manquantes, garde de colonnes —, P3 ciblee test seul) ; gates 2466/2466, E2E 221/8/19 sans regression ; reports #465, #466. # 2026-09-23 **SPECIFIEE et VALIDEE en 1 passe** (0 CRITICAL, 4 HIGH, 3 MEDIUM, 3 LOW, tous corriges). [#386] — issue du DECOUPAGE de la 25-5 (arbitrage de Guy) : #385 (Balance vs Bilan) et #386 n'ont en commun que le mot « etat », et touchent des modules disjoints. ⛔ **Trois faits qui corrigent l'issue** : 21 tables absentes et non 10 ; le trou s'est CREUSE depuis son ecriture (`invoice_settlements`, Epic 24) ; et SIX repositories sur huit n'ont aucune lecture exhaustive — le vrai cout, absent de l'issue. Arbitrage de Guy : l'export CSV ne porte que les donnees COMPTABLES (11 dedans), les backups portent tout ; 10 exclusions AVEC motif ecrit, dont 3 tables de SECRETS. Les justificatifs (fichiers) partent en story separee sur la SAUVEGARDE. ⛔ La vraie livraison est la GARDE D'EXHAUSTIVITE (patron D4-ter + P7), non les 11 exports : trois epics ont rouvert le trou en silence. ⚠️ Pieges releves par la validation : le nombre 19 code en dur a SEPT endroits dont deux `debug_assert_eq!` qui PANIQUENT ; `audit_log` n'a AUCUN dump exhaustif (ses fonctions sont bornees, la route rejette au-dela de 10 000 lignes) ; `csv_sanitize` existe et n'est pas employee par cet export ; deux sites de manuel DEJA faux (un dossier `reports/` invente, un « 38 » pour 39). From 1ed731350eed377d07537833e1ff38a291065dce Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sat, 26 Sep 2026 23:57:36 +0200 Subject: [PATCH 04/51] =?UTF-8?q?docs(25-4):=20le=20reste=20=C3=A0=20payer?= =?UTF-8?q?=20figure=20aussi=20sur=20le=20PDF=20joint=20=C3=A0=20la=20rela?= =?UTF-8?q?nce=20(refs=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-propager-le-residuel.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md b/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md index f651c0ef..14bb15b1 100644 --- a/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md +++ b/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md @@ -83,13 +83,16 @@ Pour 25-4-b, donc : - la relance **dit ce qu'il reste à payer** : `{totalDue}` devient **reste dû + frais**, et non plus TTC + frais (`invoice_email.rs:334`) — c'est le montant que le client doit saisir. -⚠️ **Ne pas contester l'arbitrage en revue** : en contester la mise en œuvre. Reste à établir en -spécification de 25-4-b : si le reste dû figure **aussi sur le PDF** joint (mention à côté de la -QR sans montant), ou dans le seul texte de la relance — le PDF est aujourd'hui celui de la facture, -et #387 (l'archivage du PDF envoyé) le touche. +- ✅ **Le reste à payer figure AUSSI sur le PDF joint**, à côté de la QR sans montant (Guy, + 2026-09-26) : *« sinon le client ne peut pas savoir ce qu'il reste à payer sans recherche et + calculs »*. Le PDF d'une relance de facture partiellement réglée n'est donc plus exactement la + facture d'origine — à articuler en spécification avec #387 (l'archivage du PDF envoyé). + +⚠️ **Ne pas contester l'arbitrage en revue** : en contester la mise en œuvre. ## Change Log +- **2026-09-26** — Complément de Q1 : le reste à payer figure aussi sur le PDF joint. - **2026-09-26** — Q1 tranchée par Guy : QR sans montant pour une facture partiellement réglée, et le reste à payer dit au client (rattaché à 25-4-b). - **2026-09-26** — Découpée avant spécification (§ *Règle de splitting préventif*, six modules), sur inventaire vérifié. #455 et #456 rattachées (même grandeur, même jalon). Deux sites trouvés From f28811766faecd3b6f243fb535683be39c91c152 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 00:00:19 +0200 Subject: [PATCH 05/51] =?UTF-8?q?docs(25-4):=20le=20document=20joint=20est?= =?UTF-8?q?=20un=20rappel=20pour=20un=20montant=20partiel,=20pas=20la=20fa?= =?UTF-8?q?cture=20r=C3=A9=C3=A9mise=20(refs=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../implementation-artifacts/25-4-propager-le-residuel.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md b/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md index 14bb15b1..b94e63cd 100644 --- a/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md +++ b/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md @@ -88,10 +88,18 @@ Pour 25-4-b, donc : calculs »*. Le PDF d'une relance de facture partiellement réglée n'est donc plus exactement la facture d'origine — à articuler en spécification avec #387 (l'archivage du PDF envoyé). +- ✅ **Recadrage (Guy, 2026-09-27)** : *« en fait c'est un rappel pour un montant partiel. »* Le + document joint à une relance de facture partiellement réglée n'est pas la facture réémise : c'est + **un rappel pour le montant restant**. L'objection « le PDF n'est plus la facture d'origine » + tombe donc — ce n'est pas la facture —, et #387 ne s'en trouve pas touché. ⚠️ **Point ouvert + posé à Guy** : dès lors, la QR du rappel doit-elle porter le **reste à payer** plutôt que rester + sans montant ? + ⚠️ **Ne pas contester l'arbitrage en revue** : en contester la mise en œuvre. ## Change Log +- **2026-09-27** — Recadrage de Q1 : le document est un rappel pour un montant partiel, pas la facture réémise. - **2026-09-26** — Complément de Q1 : le reste à payer figure aussi sur le PDF joint. - **2026-09-26** — Q1 tranchée par Guy : QR sans montant pour une facture partiellement réglée, et le reste à payer dit au client (rattaché à 25-4-b). - **2026-09-26** — Découpée avant spécification (§ *Règle de splitting préventif*, six modules), From b62db3c6548a0fe5dea578db5ec1e1b75ecb2812 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 00:03:00 +0200 Subject: [PATCH 06/51] =?UTF-8?q?docs(25-4-a):=20validation=20P1=20?= =?UTF-8?q?=E2=80=94=20#455=20expos=C3=A9=20par=20l'API,=20bouton=20d'avoi?= =?UTF-8?q?r=20align=C3=A9=20sur=20=C2=AB=20D=C3=A9valider=20=C2=BB,=20mon?= =?UTF-8?q?tage=20de=20monter=20(refs=20#455,=20refs=20#456)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-a-residuel-juste.md | 101 +++++++++++++----- .../25-4-propager-le-residuel.md | 4 +- .../sprint-status.yaml | 2 +- 3 files changed, 77 insertions(+), 30 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md b/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md index 88396a44..90c7c586 100644 --- a/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md +++ b/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md @@ -41,11 +41,17 @@ reste dû. La forme jointe `INVOICE_CREDITED_DERIVED_JOIN_SQL` (`:56-58`) porte (`crates/kesh-db/tests/invoice_settlement.rs:32`), où HT = TTC ; et aucun test n'associe un avoir et `amount_due`. -⚠️ **Latent sur les données neuves, pas sur les anciennes.** L'avoir est **total** et fait passer -la facture à `cancelled` (`credit_notes.rs:560-575`) ; le terme « avoir » n'est donc non nul que sur -une facture annulée, où le reste dû ne s'affiche que si `amountSettled > 0` -(`invoices/[id]/+page.svelte:1022-1041`) — c'est-à-dire **exactement l'état que #456 permet de -produire**. Et un `.keshbackup` de la v0.12.0 **peut contenir** cet état : l'import le restaure. +⚠️ **Masqué à l'écran, exposé par l'API.** L'avoir est **total** et fait passer la facture à +`cancelled` (`credit_notes.rs:560-575`) ; le terme « avoir » n'est donc non nul que sur une facture +annulée. **L'écran** n'y affiche le reste dû que si `amountSettled > 0` +(`invoices/[id]/+page.svelte:1022-1041`) — l'état que #456 permet de produire. ⛔ **Mais l'API le +rend toujours** : `get_invoice` (`crates/kesh-api/src/routes/invoices.rs:621-642`) calcule +`amount_due` **sans condition de statut**, et `GET /invoices/{id}` est **ouverte aux clés API en +lecture** (`docs/api-external.md:211`). Un avoir émis sur une facture **jamais réglée** — geste +ordinaire, sans #456 — suffit donc, aujourd'hui, à faire rendre à une intégration tierce +`amountDue` = **la TVA** au lieu de `0`. *(Relevé en validation P1 ; la fiche mère disait « latent » +à tort.)* Et un `.keshbackup` de la v0.12.0 **peut contenir** l'état de #456 : l'import le +restaure. ### #456 — un avoir peut viser une facture partiellement réglée @@ -69,10 +75,10 @@ où `settlement_cancel_blocker` la déclare inannulable (`SettlementCancelBlocke (`crates/kesh-db/tests/invoice_settlement.rs:937-990`) règle 40 sur 100 puis appelle `create_credit_note` avec `.expect("avoir après règlement partiel — le vrai chemin l'accepte")`. -⚠️ **Le frontend affiche le bouton sur une facture partiellement réglée** : -`invoices/[id]/+page.svelte:836` n'exige que `!invoice.paidAt`. Le bouton voisin « Dévalider » a -retiré cette condition pour cette raison même (commentaire `:865`) ; « Créer un avoir » n'a pas été -aligné. +⚠️ **Le frontend masque le bouton sur une facture payée, pas sur une facture partiellement +réglée** : `invoices/[id]/+page.svelte:836` n'exige que `!invoice.paidAt`. Le bouton voisin +« Dévalider » a **retiré** cette condition pour cette raison même (commentaire `:864-871`) et laisse +le serveur refuser avec un motif nommé ; « Créer un avoir » n'a pas été aligné. ## Acceptance Criteria @@ -116,7 +122,8 @@ créance par l'écriture de l'avoir** (`credit_notes.journal_entry_id` → ligne seul HT ou à une valeur recalculée en Rust **ne suffit pas**. **AC 8** — Une facture validée à 8,1 %, **non réglée, créditée** : `amount_due` = **0** (et non la -TVA). Une facture validée à 8,1 %, **réglée de 40 puis créditée** (état **monté en SQL**, cf. +TVA) — **au repository ET à la frontière HTTP** : `GET /api/v1/invoices/{id}` rend `amountDue` = +`"0.00"` (ou sa forme décimale normalisée), `amountSettled` = `0`. Une facture validée à 8,1 %, **réglée de 40 puis créditée** (état **monté en SQL**, cf. AC 13) : `amount_due` = **−40**, le montant encaissé en trop sur une vente annulée — et non `TVA − 40`. ⚠️ **Pas d'écrêtage à zéro** : le doc-comment d'`amount_due` l'interdit déjà. @@ -134,7 +141,7 @@ transaction ; elle est **verrouillante** (`… FOR UPDATE` ou `LOCK IN SHARE MOD motif que `InvoiceNotUnvalidatable` (`errors.rs:119-130`) : le générique ne dit ni ce qui bloque ni quoi faire. Elle porte l'identifiant du premier règlement trouvé (`Option`, `None` si seul `paid_at` est posé) et le numéro de la facture. Code machine **`CREDIT_NOTE_INVOICE_SETTLED`**, -HTTP **409**, ajouté à `DbError::code()` (`errors.rs:640-670`) et à toute garde qui énumère les +HTTP **409**, ajouté à `DbError::error_code()` (`errors.rs:641`) et à toute garde qui énumère les codes. **AC 11** — **Le cas « payée » passe par la même variante** : AC2bis cesse de rendre le générique. @@ -147,17 +154,39 @@ règlement. pouvoir émettre un avoir. » Registre du glossaire (`docs/i18n-glossaire.md` § Registre : de = *Sie*, it = 2ᵉ personne du singulier, en neutre). `details` : `{ "invoiceId", "settlementId" }`. -**AC 13** — La fixture `monter` (`invoice_settlement.rs:937-990`) **cesse de passer par -`create_credit_note`** pour le motif `InvoiceCredited` : elle monte l'état **en SQL** (avoir -`issued` inséré, facture `cancelled`), avec un commentaire qui dit que l'état n'est **plus -atteignable par l'application** depuis 25-4-a, mais **reste possible** par l'import d'une +**AC 13** — La fixture `monter` (`invoice_settlement.rs:937-1019`) cesse d'obtenir l'état +`InvoiceCredited` **par le chemin que 25-4-a ferme**, avec un commentaire qui dit que l'état n'est +**plus atteignable par l'application** depuis 25-4-a, mais **reste possible** par l'import d'une sauvegarde antérieure — ce qui justifie de garder `SettlementCancelBlocker::InvoiceCredited`. ⛔ Ne **pas** supprimer ce motif ni ses tests. -**AC 14** — Frontend : le bouton « Créer un avoir » (`invoices/[id]/+page.svelte:836`) est masqué -quand `invoice.paidAt` est posé **ou** `Number(invoice.amountSettled) > 0` — même condition que le -serveur. Si la course fait arriver le refus malgré tout, le dialogue affiche le message du serveur -(`err.message`, `:98`), déjà traduit : rien à ajouter côté client. +⚠️ **`monter` sert quinze cas, pas un** : `la_precedence_de_l_annulation_lecture_et_ecriture` +(`:1056-1064`) l'appelle avec les cinq motifs seuls **et les dix paires** (`RANGS`, +`assert_eq!(cas.len(), 15)`), dont **quatre combinent `InvoiceCredited`** avec un motif monté +**après** lui dans le même corps (clôture d'exercice, rapprochement bancaire, compte archivé, +aucun exercice ouvert). Le montage doit rester compatible avec ces quatre suites, et **les quinze +cas restent verts**. + +⚠️ **Un avoir `issued` ne s'insère pas en SQL nu** : `chk_credit_notes_issued_has_je` exige +`credit_note_number` **et** `journal_entry_id` non nuls (`20260627000001_credit_notes.sql:53-54`), +donc une écriture de contre-passation valide. **Gabarit recommandé**, qui garde les **deux +écritures produites par les vrais chemins** et ne touche en SQL qu'un rattachement : régler (vrai +chemin) ; **détacher** la ligne de règlement vers une facture auxiliaire validée de la même société +(`UPDATE invoice_settlements SET invoice_id = ?`) ; créer l'avoir (vrai chemin, désormais accepté) ; +**rattacher** la ligne à la facture d'origine. Vérifier les contraintes d'unicité de +`invoice_settlements` avant de retenir ce gabarit ; à défaut, construire l'écriture d'avoir par +`journal_entries::create_in_tx` avec les lignes de `generate_credit_note_journal_lines`, jamais à la +main ligne par ligne. + +**AC 14** — Frontend : le bouton « Créer un avoir » (`invoices/[id]/+page.svelte:836`) **suit le +précédent du bouton « Dévalider »** (`:864-871`) : la condition `!invoice.paidAt` est **retirée**, le +bouton s'affiche pour `canManage`, et **le serveur refuse avec le motif nommé**, que le dialogue +affiche déjà (`creditNoteError = err.message`, `:101`). ⛔ L'écran **ne rejoue pas** la règle métier : +une condition client qui en couvre une moitié laisse l'utilisateur sans rien à lire, et une qui la +couvre entière se désynchronise à la première évolution du serveur. La garde étant désormais +**unique** côté serveur (AC 11), le motif « payée » et le motif « réglée en partie » s'affichent de +la même façon. Le commentaire de `:864-871` est étendu aux deux boutons, ou dupliqué au-dessus du +second. **AC 15** — Rien n'est **réparé** dans les données existantes : pas de migration, pas de rejeu (`CLAUDE.md` : aucune donnée de production à protéger ; précédent 24-2 D7). Les états hérités @@ -172,6 +201,7 @@ règlement — et c'est ce que les textes disent (AC 17). |---|---| | `credited_amount_is_ttc_and_matches_the_ledger` | AC 1, AC 7 — facture multi-taux, avoir émis : sous-requête = crédit créance de l'écriture d'avoir | | `amount_due_of_a_credited_invoice_is_zero` | AC 8 — 8,1 %, non réglée : `0`, pas `8.10` | +| e2e API `get_credited_invoice_reports_zero_amount_due` | AC 8 — la surface exposée aux clés API | | `amount_due_after_settlement_then_legacy_credit_is_minus_settled` | AC 8 — état hérité monté en SQL : `−40` | | `settled_and_credited_forms_are_at_parity` | AC 6 | | `credit_note_refused_on_partially_settled_invoice` | AC 9, AC 10 — **rien écrit** : aucun avoir, facture `validated`, `version` inchangée, solde de créance inchangé, séquence d'avoir non consommée | @@ -179,7 +209,7 @@ règlement — et c'est ce que les textes disent (AC 17). | `credit_note_accepted_after_the_settlement_is_cancelled` | la promesse du message : annuler le règlement rouvre l'avoir | | `credit_note_waits_for_a_concurrent_settlement` | AC 9 — **entrelacement** : une transaction verrouille la facture et insère un règlement ; `create_credit_note` lancé en parallèle attend, puis **refuse** après le commit. Patron : la sonde d'entrelacement de la 25-3-b | | e2e API `credit_note_on_partially_settled_invoice_is_409` | la frontière HTTP : 409, `CREDIT_NOTE_INVOICE_SETTLED`, message fr | -| Vitest fiche facture | AC 14 — bouton absent si `amountSettled > 0`, présent sinon | +| Vitest fiche facture | AC 14 — bouton **présent** sur une facture réglée (en partie **et** en totalité) ; au refus, le dialogue affiche le message du serveur | ⛔ **Chaque test porte au moins une facture à TVA non nulle.** À 0 %, HT = TTC et #455 est invisible — c'est ainsi qu'il est passé. @@ -188,7 +218,7 @@ invisible — c'est ainsi qu'il est passé. `SUM(cn.total_amount)` dans la forme scalaire ; (m2) idem dans la forme jointe seule ; (m3) retirer la lecture des règlements de la garde (ne garder que `paid_at`) ; (m4) retirer `paid_at` (ne garder que la ligne) ; (m5) lire les règlements **avant** le verrou, non verrouillant ; (m6) remettre -`!invoice.paidAt` seul sur le bouton. Chacune doit faire rougir au moins un test. +`!invoice.paidAt` sur le bouton ; (m7) mapper la variante sur le générique `ILLEGAL_STATE_TRANSITION`. Chacune doit faire rougir au moins un test. **AC 17** — Manuels et notes (`docs/manual/fr/user-manual.tex`, PDF régénéré et **contrôlé aplati**) : @@ -198,7 +228,9 @@ aplati**) : « compte de produit archivé » ; - `:963` et `:1455` (« la facture a été créditée par un avoir… ») : précisés comme **cas hérité** — une facture créditée avant la v0.12.1, ou restaurée d'une sauvegarde antérieure ; -- `CHANGELOG.md` `[0.12.1]` *Fixed* : les deux défauts, en langage d'utilisateur. +- `CHANGELOG.md` `[0.12.1]` *Fixed* : les deux défauts, en langage d'utilisateur — et, pour #455, + **nommer l'API** : `GET /invoices/{id}` rendait la TVA en `amountDue` sur une facture créditée ; + une intégration tierce qui le lisait doit le savoir. ⚠️ **Greper le symptôme, pas la phrase** : `grep -rniE "payée|encaissée|réglée" docs/manual/fr/*.tex` restreint aux lignes qui parlent d'avoir, plus le PDF aplati. Les manuels DE/IT/EN sont des stubs. @@ -210,11 +242,11 @@ restreint aux lignes qui parlent d'avoir, plus le PDF aplati. Les manuels DE/IT/ - [ ] **T2 — parité et concordance** (AC 6-8) : nouveau fichier de test sur le patron `invoice_ttc_parity.rs` ; montage de l'état hérité en SQL. - [ ] **T3 — garde de l'avoir** (AC 9-11) : lecture verrouillante des règlements après le verrou, - variante `DbError`, `code()`. + variante `DbError`, `error_code()`. - [ ] **T4 — API et i18n** (AC 12) : mapping, clé ×4 ; e2e 409. -- [ ] **T5 — fixture `monter`** (AC 13) : état monté en SQL, commentaire ; les tests d'annulation de - règlement restent verts. -- [ ] **T6 — frontend** (AC 14) : condition du bouton, Vitest. +- [ ] **T5 — fixture `monter`** (AC 13) : gabarit « détacher, créditer, rattacher », commentaire ; + **les quinze cas** de la précédence restent verts, dont les quatre paires avec `InvoiceCredited`. +- [ ] **T6 — frontend** (AC 14) : condition du bouton retirée, commentaire, Vitest. - [ ] **T7 — tests et mutations** (AC 16) : m1 à m6 exécutées, résultats consignés. - [ ] **T8 — textes** (AC 17) : manuel, PDF aplati, CHANGELOG. - [ ] **T9 — gates** : backend complet (base remise à zéro), frontend complet, E2E complet. @@ -240,14 +272,15 @@ restreint aux lignes qui parlent d'avoir, plus le PDF aplati. Les manuels DE/IT/ | `crates/kesh-db/src/repositories/invoice_settlements.rs:24-58, 122-145` | les quatre constantes, `amount_due` | | `crates/kesh-db/src/repositories/invoices.rs:155-190` | `INVOICE_TTC_SUBQUERY_SQL` / `…_DERIVED_JOIN_SQL`, `total_ttc` | | `crates/kesh-db/src/repositories/credit_notes.rs:187-257, 260-330, 510-575` | écriture de l'avoir, garde AC2bis, `total_amount`, bascule `cancelled` | -| `crates/kesh-db/src/errors.rs:119-175, 300-470, 640-670` | `UnvalidationBlocker`, `DbError`, `code()` | +| `crates/kesh-db/src/errors.rs:119-175, 300-470, 641-670` | `UnvalidationBlocker`, `DbError`, `error_code()` | | `crates/kesh-db/src/repositories/invoices.rs:1430-1448` | la garde de dévalidation, patron de l'AC 9 | | `crates/kesh-api/src/errors.rs:2515-2560, 2741-2748` | mapping `InvoiceNotUnvalidatable`, générique | | `crates/kesh-api/src/routes/credit_notes.rs:183-205` | handler de création | | `crates/kesh-db/tests/invoice_ttc_parity.rs` | patron du test de parité | | `crates/kesh-db/tests/credit_notes_repository.rs:267-299` | `credit_note_refused_on_paid_invoice` | | `crates/kesh-db/tests/invoice_settlement.rs:32, 116-125, 937-990` | helper à 0 %, `solde()`, `monter` | -| `frontend/src/routes/(app)/invoices/[id]/+page.svelte:90-104, 836, 865, 1022-1041` | dialogue d'avoir, bouton, précédent « Dévalider », reste dû | +| `frontend/src/routes/(app)/invoices/[id]/+page.svelte:90-104, 836, 864-871, 1022-1041` | dialogue d'avoir (`err.message` `:101`), bouton, précédent « Dévalider », reste dû | +| `crates/kesh-api/src/routes/invoices.rs:621-642` | `get_invoice` : `amountDue` rendu sans condition de statut | ### Courses @@ -299,6 +332,18 @@ bloque **25-4-b**, pas celle-ci. ## Change Log +- **2026-09-26** — **validation P1** (Sonnet, prompt `25-4-a-validate-prompt-p1.md`) — **1 HIGH, + 3 MEDIUM, 1 LOW**, tous confirmés dans le code avant correction. **HIGH** : le récit « #455 + latent » était faux — `get_invoice` rend `amountDue` sans condition de statut, et + `GET /invoices/{id}` est ouverte aux clés API : une facture créditée à TVA non nulle y rend la + TVA ; récit corrigé ici et dans la fiche mère, AC 8 étendu à la frontière HTTP, e2e ajouté, + CHANGELOG à nommer l'API. **MEDIUM** : `DbError::code()` n'existe pas — c'est `error_code()` ; + AC 14 contredisait le précédent « Dévalider » qu'il citait — il le suit désormais (bouton + visible, le serveur refuse avec le motif nommé, m7 ajoutée) ; AC 13 ignorait que `monter` sert + quinze cas dont quatre paires avec `InvoiceCredited`, et qu'un avoir `issued` exige une écriture + (`chk_credit_notes_issued_has_je`) — gabarit « détacher, créditer, rattacher » prescrit. **LOW** : + `err.message` est à `:101`, non `:98`. Axes tous exercés ; non exercé : la sémantique REPEATABLE + READ n'a pas été mesurée (raisonnée). - **2026-09-26** — Créée (Opus 5.5) après découpage de la 25-4. Inventaire vérifié par `grep -nF` sur chaque site cité. Deux faits hors des issues : #455 est **latent** sur les données neuves et ne se voit que dans l'état que #456 produit — d'où leur réunion ; et la fixture `monter` encode diff --git a/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md b/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md index b94e63cd..6d9372fd 100644 --- a/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md +++ b/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md @@ -39,7 +39,9 @@ Le découpage suit l'ordre des dépendances, non celui des issues : 3. ⚠️ **La relance joint le PDF de la facture**, dont la QR-facture porte le TTC (`invoice_email.rs:1140-1166`, `invoice_pdf_service::render`). Un client qui paie la relance en scannant la QR paie **à nouveau le montant entier**. Question posée à Guy (Q1 ci-dessous). -4. ⚠️ **#455 est latent sur les données neuves.** Un avoir est **total** et fait passer la facture à +4. ⚠️ **#455 est masqué à l'écran — mais pas à l'API.** *(Corrigé en validation P1 de 25-4-a : la + première rédaction disait « latent ». `GET /invoices/{id}`, ouverte aux clés API, rend + `amountDue` sans condition de statut : sur une facture créditée à TVA non nulle, il vaut la TVA.)* Un avoir est **total** et fait passer la facture à `cancelled` (`credit_notes.rs:560-563`) ; or les agrégats, le rapprochement et le règlement ne lisent que des factures `validated`. Le terme « avoir » du résiduel n'est donc **non nul que sur une facture annulée**, et le reste dû ne s'y affiche que si `amountSettled > 0` — c'est-à-dire diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index fdbcda3c..84c42644 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -353,7 +353,7 @@ development_status: 25-3-c-annuler-facture-fournisseur: done # 2026-09-26 **REVUE CLOSE EN 1 PASSE** (0 > LOW, Sonnet x3) ; non poussee ; PR `closes #454` titre ET corps, sur accord. **IMPLEMENTEE** — gates 2472/2472, 783/783, E2E 220/10/19 sans regression ; prochaine etape : code review. # 2026-09-26 **SPEC VALIDEE en 2 passes** (3 MED -> 0 > LOW). **SPECIFIEE** — `25-3-c-annuler-facture-fournisseur.md`. Geste par le socle (autorite `SupplierPurchase`), queue commune sur l'ecriture d'ACHAT, lot en dernier rang ; payee : reglement DETACHE (colonnes remises a NULL, ecriture libre, lien garde par l'audit) — **Q1 tranchee par Guy le 2026-09-26**. Aucune migration. Prochaine etape : validate. # 2026-09-24 NEE d'un arbitrage de Guy — une facture fournisseur s'annule DANS TOUS LES CAS, sauf si l'exercice de son ecriture d'achat est CLOS (l'exercice, pas le verrou de periode) ; payee, son reglement RESTE au grand livre et REDEVIENT A LETTRER (Epic 15 : un paiement doit correspondre a une facture, au besoin creee pour lui — « comme bexio »). Reecrit `cancel`, donc absorbe [#454]. Derriere la 25-3-a. 25-3-b-annuler-rapprochement: done # 2026-09-25 DONE — revue close en passe 2 (Sonnet 1 MED -> Haiku 0) ; gates : backend 2463/2463, frontend 777/777, E2E sans regression. Non poussee. — SPEC VALIDEE (boucle close en passe 4 : 2 HIGH -> 2 MED -> 2 MED -> 3 LOW ; pas de decoupage, arbitrage de Guy). Q1-Q3 tranchees. — [#418] closes — annuler un rapprochement bancaire. ⛔ NE JAMAIS compter sur le `ON DELETE SET NULL` de `matched_entry_id` : supprimer l'ecriture ferait disparaitre le lien EN SILENCE, le mode d'echec meme que la story repare. ⚠️ Le chemin d'ACCEPTATION n'a aucune fonction `kesh-db` a mirer : il est ecrit en SQL brut a **cinq** sites de `routes/reconciliation.rs`, dont **un seul** porte le verrou optimiste. Quand la transaction porte une facture, appelle le geste de la 25-3-a. Derriere elle. 25-3-annuler-reglement-et-rapprochement: split # [#414] [#418] — **l'Epic 24 a livre l'encaissement et le rapprochement ; il n'a PAS livre le moyen de les DEFAIRE.** Une erreur d'imputation est aujourd'hui incorrigible autrement qu'a la main — et le gel de la 24-4b interdit precisement la main. ⚠️ *C'est le prix d'une story qui ferme une porte sans ouvrir la suivante : le gel est juste, et il rend cette story-ci necessaire.* - 25-4-a-residuel-juste: ready-for-dev # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (latent, visible seulement dans l'etat que #456 produit) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE, validation a lancer. + 25-4-a-residuel-juste: ready-for-dev # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (masque a l'ecran, mais rendu par GET /invoices/{id} aux cles API : amountDue = la TVA sur une facture creditee) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE ; validation P1 (Sonnet) 1 HIGH / 3 MED / 1 LOW, corriges. 25-4-b-residuel-aux-agregats: backlog # [#416] + montant des RELANCES (TTC complet, trouve a l'inventaire) — Q1 TRANCHEE 2026-09-26 : QR sans montant si partiellement reglee, et le reste a payer dit au client. 25-4-c-residuel-au-rapprochement: backlog # [#420] — DEUX sites : filtre SQL des candidats (HAVING total_ttc) avant le score, puis score et re-score a l'acceptation. 25-4-propager-le-residuel: split # 2026-09-26 DECOUPEE (six modules > 5) en 25-4-a / 25-4-b / 25-4-c ; #455 et #456 rattachees. # [#416] [#420] — la 24-2 a introduit le reglement PARTIEL ; le residuel n'est propage ni a la balance agee ni a l'echeancier, et **le score de rapprochement compare au TTC et non au residuel** : le virement du solde d'une facture partiellement reglee **score 0**. From ca66c118b7156bb0e7028036a34357361fb3645c Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 00:03:17 +0200 Subject: [PATCH 07/51] =?UTF-8?q?docs(25-4-a):=20prompt=20de=20validation?= =?UTF-8?q?=20P2=20;=20plages=20de=20monter=20harmonis=C3=A9es=20(refs=20#?= =?UTF-8?q?455,=20refs=20#456)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-a-residuel-juste.md | 4 +- .../25-4-a-validate-prompt-p2.md | 66 +++++++++++++++++++ .../25-4-propager-le-residuel.md | 2 +- 3 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 _bmad-output/implementation-artifacts/25-4-a-validate-prompt-p2.md diff --git a/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md b/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md index 90c7c586..3c1658d5 100644 --- a/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md +++ b/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md @@ -72,7 +72,7 @@ où `settlement_cancel_blocker` la déclare inannulable (`SettlementCancelBlocke (`UnvalidationBlocker::Settled`, `errors.rs:134-160` ; `invoices.rs:1430-1448`). ⚠️ **Un test encode le défaut comme attendu** : la fixture `monter` -(`crates/kesh-db/tests/invoice_settlement.rs:937-990`) règle 40 sur 100 puis appelle +(`crates/kesh-db/tests/invoice_settlement.rs:937-1019`) règle 40 sur 100 puis appelle `create_credit_note` avec `.expect("avoir après règlement partiel — le vrai chemin l'accepte")`. ⚠️ **Le frontend masque le bouton sur une facture payée, pas sur une facture partiellement @@ -278,7 +278,7 @@ restreint aux lignes qui parlent d'avoir, plus le PDF aplati. Les manuels DE/IT/ | `crates/kesh-api/src/routes/credit_notes.rs:183-205` | handler de création | | `crates/kesh-db/tests/invoice_ttc_parity.rs` | patron du test de parité | | `crates/kesh-db/tests/credit_notes_repository.rs:267-299` | `credit_note_refused_on_paid_invoice` | -| `crates/kesh-db/tests/invoice_settlement.rs:32, 116-125, 937-990` | helper à 0 %, `solde()`, `monter` | +| `crates/kesh-db/tests/invoice_settlement.rs:32, 116-125, 937-1019` | helper à 0 %, `solde()`, `monter` | | `frontend/src/routes/(app)/invoices/[id]/+page.svelte:90-104, 836, 864-871, 1022-1041` | dialogue d'avoir (`err.message` `:101`), bouton, précédent « Dévalider », reste dû | | `crates/kesh-api/src/routes/invoices.rs:621-642` | `get_invoice` : `amountDue` rendu sans condition de statut | diff --git a/_bmad-output/implementation-artifacts/25-4-a-validate-prompt-p2.md b/_bmad-output/implementation-artifacts/25-4-a-validate-prompt-p2.md new file mode 100644 index 00000000..f6a2662a --- /dev/null +++ b/_bmad-output/implementation-artifacts/25-4-a-validate-prompt-p2.md @@ -0,0 +1,66 @@ +# Prompt — validation P2, Story 25-4-a (le résiduel juste) + +*Versionné le 2026-09-26. **Une lentille** (Haiku), contexte frais.* + +Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-4-propager-le-residuel`. Fiche à valider : +`_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md`. Fiche mère (inventaire, +découpage) : `25-4-propager-le-residuel.md`. Issues : `gh issue view 455`, `gh issue view 456`. +Contexte de la grandeur : `24-2-encaissement-client.md` § D3, D4, AC 5-7. Règles du dépôt : +`CLAUDE.md`. Checklist BMAD : `.claude/skills/bmad-create-story/checklist.md`. + +## Axes — tous obligatoires + +1. **Chaque référence `fichier:ligne`** existe et dit ce que la fiche affirme — relis le code. +2. **La formule** : la sous-requête TTC de l'avoir prescrite (AC 1-2) concorde-t-elle réellement, + centime par centime, avec l'écriture de l'avoir (`generate_credit_note_journal_lines`, + `line_vat_amount` — lis `kesh-core`, sens d'arrondi de `ROUND` MariaDB vs Rust) ? Et avec + `INVOICE_TTC_SUBQUERY_SQL` ? Un écart d'un centime possible est un finding. +3. **La garde** (AC 9-11) : inventorie **tous** les chemins qui créent un règlement ou un avoir + (pars du symptôme : `grep -rn "INSERT INTO invoice_settlements\|create_credit_note\|INSERT INTO credit_notes" crates/`), + et leur sérialisation (verrou pessimiste ou optimiste). La fiche en nomme trois : en manque-t-il ? + Le raisonnement REPEATABLE READ de § Courses est-il juste ? +4. **L'état hérité** : l'import d'une sauvegarde ramène-t-il vraiment l'état (règlement + avoir) ? + Les textes prescrits (AC 17) le disent-ils juste ? D'autres lecteurs de `amount_due` ou des + constantes changent-ils de valeur avec l'AC 1 (inventaire : `grep -rn "INVOICE_CREDITED\|amount_due" crates/ frontend/src`) ? +5. **Les tests** (AC 16) : chacun prouve-t-il ce qu'il annonce, ou peut-il passer à vide ? Les + mutations m1-m6 sont-elles tuables par les tests listés ? Une mutation que rien ne tuerait est + un finding. +6. **Le manuel** : les lignes citées (AC 17) existent-elles et disent-elles ce qu'on veut changer ? + Contrôle aussi le **PDF aplati** (`pdftotext docs/manual/fr/user-manual.pdf - | tr '\n' ' ' | tr -s ' '`, + vers `/tmp/claude-1000/-home-gcorbaz-devel-kesh/ca5ce2e2-67a3-4eeb-817f-c2de35620a1c/scratchpad/`). + Une autre phrase du manuel ou de l'admin-manual, de l'api-external, du README, promet-elle + l'ancien comportement ? +7. **Le découpage** (fiche mère) : quelque chose de 25-4-a appartient-il en fait à b ou c, ou + l'inverse ? La latence de #455 est-elle correctement établie ? + +## Ce que tu rends + +- **Findings** : sévérité (CRITICAL / HIGH / MEDIUM / LOW), l'endroit exact de la fiche, **la + preuve** (commande et résultat, code lu), la correction proposée. +- ⛔ **La liste des axes réellement exercés ET de ceux qui ne l'ont pas été.** Un « 0 finding » + sans elle ne compte pas. + +## Interdits + +⛔ N'écris aucun fichier du dépôt ; n'exécute aucune commande qui écrit dans le dépôt ou dans une +base — `scripts/prepare-release.sh`, `scripts/regen-test-schema.sh`, `scripts/install-hooks.sh`, +`scripts/test-fast.sh`, `scripts/mem-guard.sh`, `make`, `latexmk`, tout `git commit`/`push`/`add`/ +`stash`/`reset`/`rebase`/`checkout`/`switch`/`worktree`, `sqlx migrate`, `cargo test`/`nextest`, +`npm run`, `npx playwright`. Autorisés : lecture, `grep`, `git log`/`show`/`diff`, `gh issue view`, +`pdftotext` vers le scratchpad, `cargo check`. + +## Contexte P1 — à vérifier, pas à re-signaler + +La passe 1 a trouvé 1 HIGH (récit « #455 latent » faux : `get_invoice` rend `amountDue` aux clés +API), 3 MEDIUM (`error_code()` et non `code()` ; AC 14 aligné sur le précédent « Dévalider » ; +AC 13, `monter` sert quinze cas et un avoir `issued` exige une écriture) et 1 LOW. Les corrections +sont dans `git diff 0f4b9ec0 HEAD -- _bmad-output/implementation-artifacts/25-4-*.md` — **diff unique +aplati, à lire en priorité** : une correction introduit souvent le défaut suivant. + +**Tes priorités** : (1) le **gabarit « détacher, créditer, rattacher »** de l'AC 13 — est-il +réalisable (contraintes d'unicité et FK d'`invoice_settlements`, `company_id`, écriture de +règlement qui pointe l'ancienne facture ?) et compatible avec les quatre paires combinées ? +(2) l'AC 14 révisé — le dialogue d'avoir affiche-t-il vraiment le message du serveur, et que +voit l'utilisateur sur une facture **entièrement** payée, où le bouton était masqué jusqu'ici ? +(3) l'e2e `get_credited_invoice_reports_zero_amount_due` — la forme JSON exacte de `amountDue` +(sérialisation de `Decimal`) pour que l'assertion ne soit pas fragile. diff --git a/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md b/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md index 6d9372fd..4070392c 100644 --- a/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md +++ b/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md @@ -53,7 +53,7 @@ Le découpage suit l'ordre des dépendances, non celui des issues : 6. **Pourquoi aucun test n'a vu #455** : toutes les factures des tests de règlement sont à **0 % de TVA** (`crates/kesh-db/tests/invoice_settlement.rs:32`), où HT = TTC. 7. ⚠️ **Un test encode #456 comme attendu** : la fixture `monter` - (`crates/kesh-db/tests/invoice_settlement.rs:937-990`) règle 40 sur 100 puis crée un avoir avec + (`crates/kesh-db/tests/invoice_settlement.rs:937-1019`) règle 40 sur 100 puis crée un avoir avec `.expect("avoir après règlement partiel — le vrai chemin l'accepte")`. Il **décrit le défaut** ; il se corrige, il ne se contourne pas. From 7503be9b81dff44556711bc0d6b19389d6cdb56c Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 00:09:34 +0200 Subject: [PATCH 08/51] =?UTF-8?q?docs(25-4):=20la=20QR=20du=20rappel=20por?= =?UTF-8?q?te=20le=20reste=20d=C3=BB,=20une=20r=C3=A8gle=20pour=20les=20de?= =?UTF-8?q?ux=20rappels=20(refs=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-propager-le-residuel.md | 16 ++++++++++++++++ .../implementation-artifacts/sprint-status.yaml | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md b/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md index 4070392c..3f404e51 100644 --- a/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md +++ b/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md @@ -96,11 +96,27 @@ Pour 25-4-b, donc : tombe donc — ce n'est pas la facture —, et #387 ne s'en trouve pas touché. ⚠️ **Point ouvert posé à Guy** : dès lors, la QR du rappel doit-elle porter le **reste à payer** plutôt que rester sans montant ? +- ✅ **Tranché (Guy, 2026-09-27)** : *« si c'est un rappel pour facture impayée, on met le montant + total de la facture, et si c'est un montant partiel, on met le montant à payer : on traite les + deux types de rappel de la même manière. »* Une seule règle : **la QR du rappel porte le reste + dû** — qui vaut le TTC sur une facture sans règlement. L'option (b) « sans montant » est + **abandonnée**. Guy suggère aussi de rappeler **le numéro de la facture d'origine** : la QR le + porte déjà (référence QRR dérivée de la facture, ou message non structuré = numéro, + `invoice_pdf_service.rs:218-250`) et **doit le garder à l'identique** — c'est ce que lit le + rapprochement ; le PDF du rappel le nomme en toutes lettres, avec montant initial, déjà réglé, + reste à payer. +- ⚠️ **Point ouvert pour la spécification de 25-4-b — les frais de rappel.** Le texte réclame + aujourd'hui `TTC + frais` (`invoice_email.rs:334`), mais les frais ne semblent **pas + comptabilisés** (aucune écriture dans `invoice_reminders.rs`, à vérifier). Si la QR portait + « reste dû + frais », le virement du client **dépasserait le reste dû** et serait refusé comme + trop-perçu, au rapprochement comme au règlement manuel (`RECONCILIATION_OVERPAYMENT`). À établir + avant de fixer le montant de la QR. ⚠️ **Ne pas contester l'arbitrage en revue** : en contester la mise en œuvre. ## Change Log +- **2026-09-27** — Q1 retranchée : la QR du rappel porte le reste dû (le TTC s'il n'y a aucun règlement) ; numéro de facture conservé ; point ouvert sur les frais. - **2026-09-27** — Recadrage de Q1 : le document est un rappel pour un montant partiel, pas la facture réémise. - **2026-09-26** — Complément de Q1 : le reste à payer figure aussi sur le PDF joint. - **2026-09-26** — Q1 tranchée par Guy : QR sans montant pour une facture partiellement réglée, et le reste à payer dit au client (rattaché à 25-4-b). diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index 84c42644..cd62a835 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -354,7 +354,7 @@ development_status: 25-3-b-annuler-rapprochement: done # 2026-09-25 DONE — revue close en passe 2 (Sonnet 1 MED -> Haiku 0) ; gates : backend 2463/2463, frontend 777/777, E2E sans regression. Non poussee. — SPEC VALIDEE (boucle close en passe 4 : 2 HIGH -> 2 MED -> 2 MED -> 3 LOW ; pas de decoupage, arbitrage de Guy). Q1-Q3 tranchees. — [#418] closes — annuler un rapprochement bancaire. ⛔ NE JAMAIS compter sur le `ON DELETE SET NULL` de `matched_entry_id` : supprimer l'ecriture ferait disparaitre le lien EN SILENCE, le mode d'echec meme que la story repare. ⚠️ Le chemin d'ACCEPTATION n'a aucune fonction `kesh-db` a mirer : il est ecrit en SQL brut a **cinq** sites de `routes/reconciliation.rs`, dont **un seul** porte le verrou optimiste. Quand la transaction porte une facture, appelle le geste de la 25-3-a. Derriere elle. 25-3-annuler-reglement-et-rapprochement: split # [#414] [#418] — **l'Epic 24 a livre l'encaissement et le rapprochement ; il n'a PAS livre le moyen de les DEFAIRE.** Une erreur d'imputation est aujourd'hui incorrigible autrement qu'a la main — et le gel de la 24-4b interdit precisement la main. ⚠️ *C'est le prix d'une story qui ferme une porte sans ouvrir la suivante : le gel est juste, et il rend cette story-ci necessaire.* 25-4-a-residuel-juste: ready-for-dev # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (masque a l'ecran, mais rendu par GET /invoices/{id} aux cles API : amountDue = la TVA sur une facture creditee) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE ; validation P1 (Sonnet) 1 HIGH / 3 MED / 1 LOW, corriges. - 25-4-b-residuel-aux-agregats: backlog # [#416] + montant des RELANCES (TTC complet, trouve a l'inventaire) — Q1 TRANCHEE 2026-09-26 : QR sans montant si partiellement reglee, et le reste a payer dit au client. + 25-4-b-residuel-aux-agregats: backlog # [#416] + montant des RELANCES (TTC complet, trouve a l'inventaire) — Q1 TRANCHEE 2026-09-27 : la QR du rappel porte le RESTE DU (= TTC sans reglement), reste a payer sur le PDF et dans le texte ; point ouvert : frais de rappel non comptabilises vs trop-percu. 25-4-c-residuel-au-rapprochement: backlog # [#420] — DEUX sites : filtre SQL des candidats (HAVING total_ttc) avant le score, puis score et re-score a l'acceptation. 25-4-propager-le-residuel: split # 2026-09-26 DECOUPEE (six modules > 5) en 25-4-a / 25-4-b / 25-4-c ; #455 et #456 rattachees. # [#416] [#420] — la 24-2 a introduit le reglement PARTIEL ; le residuel n'est propage ni a la balance agee ni a l'echeancier, et **le score de rapprochement compare au TTC et non au residuel** : le virement du solde d'une facture partiellement reglee **score 0**. 25-5-a-export-souverainete: done # 2026-09-26 **MERGEE (PR #452, #386 fermee) SANS REVUE DE CODE** ; revue a posteriori CLOSE en 3 passes sur `story/25-5-a-revue-code` (4 HIGH P1, 1 HIGH orchestrateur P2 — colonnes manquantes, garde de colonnes —, P3 ciblee test seul) ; gates 2466/2466, E2E 221/8/19 sans regression ; reports #465, #466. # 2026-09-23 **SPECIFIEE et VALIDEE en 1 passe** (0 CRITICAL, 4 HIGH, 3 MEDIUM, 3 LOW, tous corriges). [#386] — issue du DECOUPAGE de la 25-5 (arbitrage de Guy) : #385 (Balance vs Bilan) et #386 n'ont en commun que le mot « etat », et touchent des modules disjoints. ⛔ **Trois faits qui corrigent l'issue** : 21 tables absentes et non 10 ; le trou s'est CREUSE depuis son ecriture (`invoice_settlements`, Epic 24) ; et SIX repositories sur huit n'ont aucune lecture exhaustive — le vrai cout, absent de l'issue. Arbitrage de Guy : l'export CSV ne porte que les donnees COMPTABLES (11 dedans), les backups portent tout ; 10 exclusions AVEC motif ecrit, dont 3 tables de SECRETS. Les justificatifs (fichiers) partent en story separee sur la SAUVEGARDE. ⛔ La vraie livraison est la GARDE D'EXHAUSTIVITE (patron D4-ter + P7), non les 11 exports : trois epics ont rouvert le trou en silence. ⚠️ Pieges releves par la validation : le nombre 19 code en dur a SEPT endroits dont deux `debug_assert_eq!` qui PANIQUENT ; `audit_log` n'a AUCUN dump exhaustif (ses fonctions sont bornees, la route rejette au-dela de 10 000 lignes) ; `csv_sanitize` existe et n'est pas employee par cet export ; deux sites de manuel DEJA faux (un dossier `reports/` invente, un « 38 » pour 39). From 5c337d679a612c94379e93ffe72687f0204dff34 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 00:09:55 +0200 Subject: [PATCH 09/51] =?UTF-8?q?docs(25-4):=20frais=20de=20rappel=20confi?= =?UTF-8?q?gurables,=20rien=20d'affich=C3=A9=20=C3=A0=20z=C3=A9ro=20(refs?= =?UTF-8?q?=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../implementation-artifacts/25-4-propager-le-residuel.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md b/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md index 3f404e51..471fbefd 100644 --- a/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md +++ b/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md @@ -105,6 +105,10 @@ Pour 25-4-b, donc : `invoice_pdf_service.rs:218-250`) et **doit le garder à l'identique** — c'est ce que lit le rapprochement ; le PDF du rappel le nomme en toutes lettres, avec montant initial, déjà réglé, reste à payer. +- ✅ **Les frais restent configurables, et à zéro rien ne s'affiche** (Guy, 2026-09-27) : *« ils + doivent être configurables : si 0, ne rien afficher. »* Les frais sont déjà réglés par niveau de + rappel (`dunning_levels.fee_amount`) ; le PDF et le texte du rappel n'ont **aucune ligne de + frais** quand le montant est nul — ni « frais : 0.00 », ni total qui les mentionne. - ⚠️ **Point ouvert pour la spécification de 25-4-b — les frais de rappel.** Le texte réclame aujourd'hui `TTC + frais` (`invoice_email.rs:334`), mais les frais ne semblent **pas comptabilisés** (aucune écriture dans `invoice_reminders.rs`, à vérifier). Si la QR portait @@ -116,6 +120,7 @@ Pour 25-4-b, donc : ## Change Log +- **2026-09-27** — Frais de rappel : configurables, aucune ligne affichée à zéro. - **2026-09-27** — Q1 retranchée : la QR du rappel porte le reste dû (le TTC s'il n'y a aucun règlement) ; numéro de facture conservé ; point ouvert sur les frais. - **2026-09-27** — Recadrage de Q1 : le document est un rappel pour un montant partiel, pas la facture réémise. - **2026-09-26** — Complément de Q1 : le reste à payer figure aussi sur le PDF joint. From 451e2cc2b88a3a88ed6fd12076e64f8122c74941 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 00:10:33 +0200 Subject: [PATCH 10/51] =?UTF-8?q?docs(25-4-a):=20validation=20P2=20?= =?UTF-8?q?=E2=80=94=20facture=20auxiliaire=20du=20gabarit,=20amountDue=20?= =?UTF-8?q?compar=C3=A9=20en=20Decimal,=20bouton=20sur=20facture=20pay?= =?UTF-8?q?=C3=A9e=20(refs=20#455,=20refs=20#456)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-a-residuel-juste.md | 35 ++++++++++++++++--- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md b/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md index 3c1658d5..bfa466fa 100644 --- a/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md +++ b/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md @@ -122,8 +122,12 @@ créance par l'écriture de l'avoir** (`credit_notes.journal_entry_id` → ligne seul HT ou à une valeur recalculée en Rust **ne suffit pas**. **AC 8** — Une facture validée à 8,1 %, **non réglée, créditée** : `amount_due` = **0** (et non la -TVA) — **au repository ET à la frontière HTTP** : `GET /api/v1/invoices/{id}` rend `amountDue` = -`"0.00"` (ou sa forme décimale normalisée), `amountSettled` = `0`. Une facture validée à 8,1 %, **réglée de 40 puis créditée** (état **monté en SQL**, cf. +TVA) — **au repository ET à la frontière HTTP** : `GET /api/v1/invoices/{id}` rend `amountDue` **non nul +(pas `null` : `null` veut dire « non calculé »,** `routes/invoices.rs:242-248`**)**, sérialisé en +**chaîne** (`rust_decimal` avec `serde-str`, `kesh-api/Cargo.toml:39`), dont la valeur **parsée en +`Decimal`** vaut zéro — ⛔ ni comparaison de chaîne (l'échelle suit le calcul SQL : `"0.0000"` et +`"0.00"` sont également justes), ni `f64` (patron à ne pas suivre : +`invoice_echeancier_e2e.rs:636-641`). Même règle pour `amountSettled`. Une facture validée à 8,1 %, **réglée de 40 puis créditée** (état **monté en SQL**, cf. AC 13) : `amount_due` = **−40**, le montant encaissé en trop sur une vente annulée — et non `TVA − 40`. ⚠️ **Pas d'écrêtage à zéro** : le doc-comment d'`amount_due` l'interdit déjà. @@ -173,8 +177,14 @@ donc une écriture de contre-passation valide. **Gabarit recommandé**, qui gard écritures produites par les vrais chemins** et ne touche en SQL qu'un rattachement : régler (vrai chemin) ; **détacher** la ligne de règlement vers une facture auxiliaire validée de la même société (`UPDATE invoice_settlements SET invoice_id = ?`) ; créer l'avoir (vrai chemin, désormais accepté) ; -**rattacher** la ligne à la facture d'origine. Vérifier les contraintes d'unicité de -`invoice_settlements` avant de retenir ce gabarit ; à défaut, construire l'écriture d'avoir par +**rattacher** la ligne à la facture d'origine. La facture auxiliaire est créée **dans `monter`** +par le helper existant `validated_invoice` (même société, montant quelconque), n'est jamais réglée +ni créditée, et ne sert qu'à porter la ligne le temps de l'avoir ; aucun motif ne la lit. Seule +contrainte d'unicité d'`invoice_settlements` : `uq_invoice_settlements_entry (journal_entry_id)` +(`20260827000001_invoice_settlements.sql:65`) — le détachement ne la touche pas. ⚠️ Pendant le +détachement, l'écriture de règlement reste celle de la facture d'origine : aucun motif de +`settlement_cancel_blocker` ne doit être évalué entre les deux `UPDATE`. Si le gabarit se révèle +impraticable, à défaut, construire l'écriture d'avoir par `journal_entries::create_in_tx` avec les lignes de `generate_credit_note_journal_lines`, jamais à la main ligne par ligne. @@ -188,6 +198,11 @@ couvre entière se désynchronise à la première évolution du serveur. La gard la même façon. Le commentaire de `:864-871` est étendu aux deux boutons, ou dupliqué au-dessus du second. +⚠️ **Changement visible sur une facture entièrement payée** : le bouton, masqué jusqu'ici, apparaît ; +l'utilisateur ouvre le dialogue, confirme, et lit le refus nommé (AC 12) dans le dialogue même +(`creditNoteError`, `:77`, `:101`). C'est le comportement de « Dévalider » depuis le 2026-09-19, et +le CHANGELOG le dit. + **AC 15** — Rien n'est **réparé** dans les données existantes : pas de migration, pas de rejeu (`CLAUDE.md` : aucune donnée de production à protéger ; précédent 24-2 D7). Les états hérités restent **visibles** — reste dû négatif sur la fiche, motif `InvoiceCredited` à l'annulation du @@ -332,6 +347,18 @@ bloque **25-4-b**, pas celle-ci. ## Change Log +- **2026-09-27** — **validation P2** (Haiku, diff aplati, prompt `25-4-a-validate-prompt-p2.md`) — + rapporte 3 MEDIUM et 1 LOW ; **un seul MEDIUM retenu** : l'AC 13 ne disait pas d'où vient la facture + auxiliaire du gabarit — précisé (helper `validated_invoice`, contrainte d'unicité vérifiée, aucun + motif évalué pendant le détachement). **Écartés** : deux « MEDIUM » reprochent au **code** de ne pas + encore faire ce que la fiche prescrit (bouton `:836`, test e2e absent) — ce n'est pas un défaut de + spec ; le LOW (deux formulations du manuel) est déjà couvert par l'AC 17. ⚠️ **Repris par + l'orchestrateur**, la priorité 3 que la passe n'a pas tranchée : `amountDue` est une **chaîne** à + l'échelle du calcul SQL — l'AC 8 impose désormais `null` interdit et une comparaison **en + `Decimal`**, ni chaîne ni `f64` ; et la priorité 2 : ce que voit l'utilisateur sur une facture + entièrement payée (bouton désormais visible, refus nommé dans le dialogue) est écrit à l'AC 14. + La passe affirmait aussi que `accept_one_invoice` ne crée pas de règlement — faux + (`invoice_settlements::create_in_tx`, `reconciliation.rs:1416-1428`) ; sans conséquence sur la fiche. - **2026-09-26** — **validation P1** (Sonnet, prompt `25-4-a-validate-prompt-p1.md`) — **1 HIGH, 3 MEDIUM, 1 LOW**, tous confirmés dans le code avant correction. **HIGH** : le récit « #455 latent » était faux — `get_invoice` rend `amountDue` sans condition de statut, et From 1344b3a2945e183eb1e94123ae507c3c2bddb09b Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 00:10:59 +0200 Subject: [PATCH 11/51] =?UTF-8?q?docs(25-4-a):=20prompt=20de=20validation?= =?UTF-8?q?=20P3=20cibl=C3=A9e=20(refs=20#455,=20refs=20#456)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-a-validate-prompt-p3.md | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 _bmad-output/implementation-artifacts/25-4-a-validate-prompt-p3.md diff --git a/_bmad-output/implementation-artifacts/25-4-a-validate-prompt-p3.md b/_bmad-output/implementation-artifacts/25-4-a-validate-prompt-p3.md new file mode 100644 index 00000000..d26bf42e --- /dev/null +++ b/_bmad-output/implementation-artifacts/25-4-a-validate-prompt-p3.md @@ -0,0 +1,49 @@ +# Prompt — validation P3 CIBLÉE, Story 25-4-a (le résiduel juste) + +*Versionné le 2026-09-27. **Une lentille** (Opus), contexte frais. Passe **ciblée** (CLAUDE.md +§ « La passe ciblée ») : la P2 n'a trouvé qu'un défaut **né de la correction P1** ; ce qu'il reste à +relire est la remédiation, pas la story entière.* + +Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-4-propager-le-residuel`. Fiche : +`_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md`. **Périmètre** : le diff aplati +des remédiations P1 et P2 — +`git diff 0f4b9ec0 451e2cc2 -- _bmad-output/implementation-artifacts/25-4-a-residuel-juste.md _bmad-output/implementation-artifacts/25-4-propager-le-residuel.md` +(ignore les paragraphes de la fiche mère qui consignent les arbitrages de Guy sur 25-4-b : **ne pas +les contester**). + +## La lentille : chasseur de régressions de remédiation + +Pour chaque passage réécrit en P1 ou P2 : + +1. **Est-il vrai contre le code ?** Relis les sites qu'il cite : `get_invoice` + (`crates/kesh-api/src/routes/invoices.rs`), `docs/api-external.md`, le bouton et le dialogue + d'avoir (`frontend/src/routes/(app)/invoices/[id]/+page.svelte`), la fixture `monter` et + `la_precedence_de_l_annulation_lecture_et_ecriture` (`crates/kesh-db/tests/invoice_settlement.rs`), + la migration `20260827000001_invoice_settlements.sql`, `settlement_cancel_blocker` + (`invoice_settlements_write.rs`), `kesh-api/Cargo.toml` (`serde-str`). +2. **Le gabarit « détacher, créditer, rattacher » (AC 13)** : exécute-le **mentalement** pas à pas + contre `create_credit_note` et les quatre paires combinées de `monter`. Une FK, une contrainte, + un audit, un contrôle de `company_id`, une lecture de `invoice_settlements` par + `create_credit_note` ou par les motifs montés **après** peut-il le casser ? L'écriture de + règlement porte-t-elle quelque part l'identifiant de la facture d'origine (description, audit, + `invoice_settlements` seul) ? +3. **AC 14 révisé** : cohérent avec l'AC 11, l'AC 12, les tests de l'AC 16 et la mutation m6/m7 ? + Un test de l'AC 16 porte-t-il encore l'ancienne logique (« bouton absent ») ? +4. **AC 8 révisé** : l'assertion prescrite peut-elle passer à vide (`null`, champ absent) ? +5. **Propagation** : chaque correction a-t-elle été reportée partout où le symptôme était écrit + (tâches T1-T9, tableau « Où regarder », Change Log, fiche mère, `sprint-status.yaml`) ? Greppe la + **valeur** (`code()`, `:98`, `937-990`, `latent`, `masqué`), pas la formulation. + +## Ce que tu rends + +- **Findings** : sévérité, endroit exact, **preuve** (commande et résultat, code lu), correction. +- ⛔ **La liste des axes réellement exercés ET de ceux qui ne l'ont pas été.** + +## Interdits + +⛔ N'écris aucun fichier du dépôt ; aucune commande qui écrit dans le dépôt ou dans une base — +`scripts/prepare-release.sh`, `scripts/regen-test-schema.sh`, `scripts/install-hooks.sh`, +`scripts/test-fast.sh`, `scripts/mem-guard.sh`, `make`, `latexmk`, tout `git commit`/`push`/`add`/ +`stash`/`reset`/`rebase`/`checkout`/`switch`/`worktree`, `sqlx migrate`, `cargo test`/`nextest`, +`npm run`, `npx playwright`. Autorisés : lecture, `grep`, `git log`/`show`/`diff`, `gh issue view`, +`cargo check`. From 9df357e7c22e07f47478a7d950818e19cadd72b5 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 00:15:42 +0200 Subject: [PATCH 12/51] =?UTF-8?q?docs(25-4-a):=20validation=20P3=20cibl?= =?UTF-8?q?=C3=A9e=20=E2=80=94=20propagation=20des=20corrections=20P1=20(r?= =?UTF-8?q?efs=20#455,=20refs=20#456)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-a-residuel-juste.md | 44 ++++++++++++++----- .../25-4-propager-le-residuel.md | 12 ++--- .../sprint-status.yaml | 2 +- 3 files changed, 40 insertions(+), 18 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md b/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md index bfa466fa..8e1d17a4 100644 --- a/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md +++ b/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md @@ -122,9 +122,10 @@ créance par l'écriture de l'avoir** (`credit_notes.journal_entry_id` → ligne seul HT ou à une valeur recalculée en Rust **ne suffit pas**. **AC 8** — Une facture validée à 8,1 %, **non réglée, créditée** : `amount_due` = **0** (et non la -TVA) — **au repository ET à la frontière HTTP** : `GET /api/v1/invoices/{id}` rend `amountDue` **non nul -(pas `null` : `null` veut dire « non calculé »,** `routes/invoices.rs:242-248`**)**, sérialisé en -**chaîne** (`rust_decimal` avec `serde-str`, `kesh-api/Cargo.toml:39`), dont la valeur **parsée en +TVA) — **au repository ET à la frontière HTTP** : `GET /api/v1/invoices/{id}` rend `amountDue` **présent et non `null`** +(`null` veut dire « non calculé », `routes/invoices.rs:242-248` ; ⛔ aucun `unwrap_or`, aucune +valeur par défaut dans l'assertion), sérialisé en +**chaîne** (sérialisation par défaut de `rust_decimal`, `kesh-api/Cargo.toml:39`), dont la valeur **parsée en `Decimal`** vaut zéro — ⛔ ni comparaison de chaîne (l'échelle suit le calcul SQL : `"0.0000"` et `"0.00"` sont également justes), ni `f64` (patron à ne pas suivre : `invoice_echeancier_e2e.rs:636-641`). Même règle pour `amountSettled`. Une facture validée à 8,1 %, **réglée de 40 puis créditée** (état **monté en SQL**, cf. @@ -142,7 +143,7 @@ transaction ; elle est **verrouillante** (`… FOR UPDATE` ou `LOCK IN SHARE MOD **avant** le verrou. **AC 10** — Le refus est une **variante dédiée** de `DbError`, pas `IllegalStateTransition` — même -motif que `InvoiceNotUnvalidatable` (`errors.rs:119-130`) : le générique ne dit ni ce qui bloque ni +motif que `InvoiceNotUnvalidatable` (`errors.rs:453`, raison écrite `:119-130`) : le générique ne dit ni ce qui bloque ni quoi faire. Elle porte l'identifiant du premier règlement trouvé (`Option`, `None` si seul `paid_at` est posé) et le numéro de la facture. Code machine **`CREDIT_NOTE_INVOICE_SETTLED`**, HTTP **409**, ajouté à `DbError::error_code()` (`errors.rs:641`) et à toute garde qui énumère les @@ -162,7 +163,10 @@ pouvoir émettre un avoir. » Registre du glossaire (`docs/i18n-glossaire.md` § `InvoiceCredited` **par le chemin que 25-4-a ferme**, avec un commentaire qui dit que l'état n'est **plus atteignable par l'application** depuis 25-4-a, mais **reste possible** par l'import d'une sauvegarde antérieure — ce qui justifie de garder `SettlementCancelBlocker::InvoiceCredited`. -⛔ Ne **pas** supprimer ce motif ni ses tests. +⛔ Ne **pas** supprimer ce motif ni ses tests. Ses doc-comments, qui le présentent comme un chemin +normal (« créditée par un avoir après ce règlement … pas une anomalie », `errors.rs:214-217` ; +« Hors `validated`, c'est donc un avoir », `invoice_settlements_write.rs:326-329`), disent +désormais que l'état n'est plus atteignable **que par l'import d'une sauvegarde antérieure**. ⚠️ **`monter` sert quinze cas, pas un** : `la_precedence_de_l_annulation_lecture_et_ecriture` (`:1056-1064`) l'appelle avec les cinq motifs seuls **et les dix paires** (`RANGS`, @@ -184,9 +188,11 @@ contrainte d'unicité d'`invoice_settlements` : `uq_invoice_settlements_entry (j (`20260827000001_invoice_settlements.sql:65`) — le détachement ne la touche pas. ⚠️ Pendant le détachement, l'écriture de règlement reste celle de la facture d'origine : aucun motif de `settlement_cancel_blocker` ne doit être évalué entre les deux `UPDATE`. Si le gabarit se révèle -impraticable, à défaut, construire l'écriture d'avoir par -`journal_entries::create_in_tx` avec les lignes de `generate_credit_note_journal_lines`, jamais à la -main ligne par ligne. +impraticable, **arrêter et demander** : le repli naturel — construire l'écriture d'avoir avec les +lignes de `generate_credit_note_journal_lines` — est **impossible depuis un test**, la fonction +étant privée (`credit_notes.rs:187`), et la rendre publique pour un test n'est pas un choix du +développeur. La facture auxiliaire est datée **dans l'exercice seedé** (`d − 20` suffit) : c'est ce +qui garde valide le cas « aucun exercice ouvert ». **AC 14** — Frontend : le bouton « Créer un avoir » (`invoices/[id]/+page.svelte:836`) **suit le précédent du bouton « Dévalider »** (`:864-871`) : la condition `!invoice.paidAt` est **retirée**, le @@ -196,7 +202,9 @@ une condition client qui en couvre une moitié laisse l'utilisateur sans rien à couvre entière se désynchronise à la première évolution du serveur. La garde étant désormais **unique** côté serveur (AC 11), le motif « payée » et le motif « réglée en partie » s'affichent de la même façon. Le commentaire de `:864-871` est étendu aux deux boutons, ou dupliqué au-dessus du -second. +second. ⚠️ Le commentaire du bloc Suspendre/Reprendre (`:842-844`) affirme que ces boutons sont +« masqués, comme les boutons voisins « Créer un avoir » / « Supprimer » » : il devient faux et se +corrige dans le même patch. ⚠️ **Changement visible sur une facture entièrement payée** : le bouton, masqué jusqu'ici, apparaît ; l'utilisateur ouvre le dialogue, confirme, et lit le refus nommé (AC 12) dans le dialogue même @@ -255,14 +263,17 @@ restreint aux lignes qui parlent d'avoir, plus le PDF aplati. Les manuels DE/IT/ - [ ] **T1 — formule de l'avoir TTC** (AC 1-5) : factoriser la formule de ligne, réécrire les deux constantes d'avoir, doc-comments. - [ ] **T2 — parité et concordance** (AC 6-8) : nouveau fichier de test sur le patron - `invoice_ttc_parity.rs` ; montage de l'état hérité en SQL. + `invoice_ttc_parity.rs`. ⚠️ Le helper `validated_invoice` (`invoice_settlement.rs:32`) est + **à 0 % en dur** et passe une écriture de vente **au HT** : les factures à 8,1 % se montent + par le **vrai chemin de validation**, sur le patron de `create_and_validate` + (`credit_notes_repository.rs`) ; l'état hérité, par le gabarit de l'AC 13. - [ ] **T3 — garde de l'avoir** (AC 9-11) : lecture verrouillante des règlements après le verrou, variante `DbError`, `error_code()`. - [ ] **T4 — API et i18n** (AC 12) : mapping, clé ×4 ; e2e 409. - [ ] **T5 — fixture `monter`** (AC 13) : gabarit « détacher, créditer, rattacher », commentaire ; **les quinze cas** de la précédence restent verts, dont les quatre paires avec `InvoiceCredited`. - [ ] **T6 — frontend** (AC 14) : condition du bouton retirée, commentaire, Vitest. -- [ ] **T7 — tests et mutations** (AC 16) : m1 à m6 exécutées, résultats consignés. +- [ ] **T7 — tests et mutations** (AC 16) : m1 à **m7** exécutées, résultats consignés. - [ ] **T8 — textes** (AC 17) : manuel, PDF aplati, CHANGELOG. - [ ] **T9 — gates** : backend complet (base remise à zéro), frontend complet, E2E complet. @@ -347,6 +358,17 @@ bloque **25-4-b**, pas celle-ci. ## Change Log +- **2026-09-27** — **validation P3 ciblée** (Opus, diff aplati des remédiations P1-P2, prompt + `25-4-a-validate-prompt-p3.md`) — **2 MEDIUM, 5 LOW**, tous de **propagation** des corrections P1, + tous confirmés par grep. MEDIUM : T7 disait encore « m1 à m6 » (m7 ajoutée) ; l'AC 14 rendait faux + le commentaire Suspendre/Reprendre (`:842-844`) et l'AC 13 laissait deux doc-comments décrire + l'avoir après règlement comme un chemin normal. LOW : « non nul » pour « non `null` » (et + `unwrap_or` interdit) ; repli de l'AC 13 impossible (fonction privée) — remplacé par « arrêter et + demander », date de la facture auxiliaire précisée ; cause de la sérialisation en chaîne ; + fiche mère et `sprint-status` en retard d'une passe ; T2 ne disait pas comment monter une facture + à 8,1 %. Le gabarit « détacher, créditer, rattacher » a été **exécuté mentalement** contre + `create_credit_note`, le rang 1 et les quatre paires : il tient. Référence de l'AC 10 corrigée + (`errors.rs:453`). Aucun code de production touché par ces corrections. - **2026-09-27** — **validation P2** (Haiku, diff aplati, prompt `25-4-a-validate-prompt-p2.md`) — rapporte 3 MEDIUM et 1 LOW ; **un seul MEDIUM retenu** : l'AC 13 ne disait pas d'où vient la facture auxiliaire du gabarit — précisé (helper `validated_invoice`, contrainte d'unicité vérifiée, aucun diff --git a/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md b/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md index 471fbefd..b836637b 100644 --- a/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md +++ b/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md @@ -40,12 +40,12 @@ Le découpage suit l'ordre des dépendances, non celui des issues : (`invoice_email.rs:1140-1166`, `invoice_pdf_service::render`). Un client qui paie la relance en scannant la QR paie **à nouveau le montant entier**. Question posée à Guy (Q1 ci-dessous). 4. ⚠️ **#455 est masqué à l'écran — mais pas à l'API.** *(Corrigé en validation P1 de 25-4-a : la - première rédaction disait « latent ». `GET /invoices/{id}`, ouverte aux clés API, rend - `amountDue` sans condition de statut : sur une facture créditée à TVA non nulle, il vaut la TVA.)* Un avoir est **total** et fait passer la facture à - `cancelled` (`credit_notes.rs:560-563`) ; or les agrégats, le rapprochement et le règlement ne - lisent que des factures `validated`. Le terme « avoir » du résiduel n'est donc **non nul que sur - une facture annulée**, et le reste dû ne s'y affiche que si `amountSettled > 0` — c'est-à-dire - **seulement dans l'état que #456 permet de produire**. Les deux issues se corrigent ensemble. + première rédaction disait « latent ».)* L'avoir est **total** et fait passer la facture à + `cancelled` (`credit_notes.rs:560-575`) ; le terme « avoir » n'est donc non nul que sur une + facture annulée. L'**écran** n'y affiche le reste dû que si `amountSettled > 0` — l'état que #456 + permet de produire. Mais `GET /invoices/{id}`, ouverte aux clés API, rend `amountDue` **sans + condition de statut** : sur toute facture créditée à TVA non nulle, il vaut la TVA. Les deux + issues se corrigent ensemble parce qu'elles portent sur la même grandeur et le même état. 5. ⚠️ **Les formes jointes existent et ne servent nulle part.** `INVOICE_SETTLED_DERIVED_JOIN_SQL` et `INVOICE_CREDITED_DERIVED_JOIN_SQL` (`invoice_settlements.rs:40`, `:56`) n'ont aucun appelant, et le « test de parité » annoncé par le commentaire des lignes 27-29 **n'existe pas**. 25-4-b sera diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index cd62a835..04f53ab6 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -353,7 +353,7 @@ development_status: 25-3-c-annuler-facture-fournisseur: done # 2026-09-26 **REVUE CLOSE EN 1 PASSE** (0 > LOW, Sonnet x3) ; non poussee ; PR `closes #454` titre ET corps, sur accord. **IMPLEMENTEE** — gates 2472/2472, 783/783, E2E 220/10/19 sans regression ; prochaine etape : code review. # 2026-09-26 **SPEC VALIDEE en 2 passes** (3 MED -> 0 > LOW). **SPECIFIEE** — `25-3-c-annuler-facture-fournisseur.md`. Geste par le socle (autorite `SupplierPurchase`), queue commune sur l'ecriture d'ACHAT, lot en dernier rang ; payee : reglement DETACHE (colonnes remises a NULL, ecriture libre, lien garde par l'audit) — **Q1 tranchee par Guy le 2026-09-26**. Aucune migration. Prochaine etape : validate. # 2026-09-24 NEE d'un arbitrage de Guy — une facture fournisseur s'annule DANS TOUS LES CAS, sauf si l'exercice de son ecriture d'achat est CLOS (l'exercice, pas le verrou de periode) ; payee, son reglement RESTE au grand livre et REDEVIENT A LETTRER (Epic 15 : un paiement doit correspondre a une facture, au besoin creee pour lui — « comme bexio »). Reecrit `cancel`, donc absorbe [#454]. Derriere la 25-3-a. 25-3-b-annuler-rapprochement: done # 2026-09-25 DONE — revue close en passe 2 (Sonnet 1 MED -> Haiku 0) ; gates : backend 2463/2463, frontend 777/777, E2E sans regression. Non poussee. — SPEC VALIDEE (boucle close en passe 4 : 2 HIGH -> 2 MED -> 2 MED -> 3 LOW ; pas de decoupage, arbitrage de Guy). Q1-Q3 tranchees. — [#418] closes — annuler un rapprochement bancaire. ⛔ NE JAMAIS compter sur le `ON DELETE SET NULL` de `matched_entry_id` : supprimer l'ecriture ferait disparaitre le lien EN SILENCE, le mode d'echec meme que la story repare. ⚠️ Le chemin d'ACCEPTATION n'a aucune fonction `kesh-db` a mirer : il est ecrit en SQL brut a **cinq** sites de `routes/reconciliation.rs`, dont **un seul** porte le verrou optimiste. Quand la transaction porte une facture, appelle le geste de la 25-3-a. Derriere elle. 25-3-annuler-reglement-et-rapprochement: split # [#414] [#418] — **l'Epic 24 a livre l'encaissement et le rapprochement ; il n'a PAS livre le moyen de les DEFAIRE.** Une erreur d'imputation est aujourd'hui incorrigible autrement qu'a la main — et le gel de la 24-4b interdit precisement la main. ⚠️ *C'est le prix d'une story qui ferme une porte sans ouvrir la suivante : le gel est juste, et il rend cette story-ci necessaire.* - 25-4-a-residuel-juste: ready-for-dev # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (masque a l'ecran, mais rendu par GET /invoices/{id} aux cles API : amountDue = la TVA sur une facture creditee) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE ; validation P1 (Sonnet) 1 HIGH / 3 MED / 1 LOW, corriges. + 25-4-a-residuel-juste: ready-for-dev # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (masque a l'ecran, mais rendu par GET /invoices/{id} aux cles API : amountDue = la TVA sur une facture creditee) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE ; validation : P1 Sonnet 1H/3M/1L -> P2 Haiku 1M retenu -> P3 ciblee Opus 2M/5L (propagation), tous corriges. EN ATTENTE de l'arbitrage de Guy sur l'avoir (volet 2). 25-4-b-residuel-aux-agregats: backlog # [#416] + montant des RELANCES (TTC complet, trouve a l'inventaire) — Q1 TRANCHEE 2026-09-27 : la QR du rappel porte le RESTE DU (= TTC sans reglement), reste a payer sur le PDF et dans le texte ; point ouvert : frais de rappel non comptabilises vs trop-percu. 25-4-c-residuel-au-rapprochement: backlog # [#420] — DEUX sites : filtre SQL des candidats (HAVING total_ttc) avant le score, puis score et re-score a l'acceptation. 25-4-propager-le-residuel: split # 2026-09-26 DECOUPEE (six modules > 5) en 25-4-a / 25-4-b / 25-4-c ; #455 et #456 rattachees. # [#416] [#420] — la 24-2 a introduit le reglement PARTIEL ; le residuel n'est propage ni a la balance agee ni a l'echeancier, et **le score de rapprochement compare au TTC et non au residuel** : le virement du solde d'une facture partiellement reglee **score 0**. From b18f7cd2ad1d5958e97005dd6a2893b963dadf4f Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 00:18:50 +0200 Subject: [PATCH 13/51] =?UTF-8?q?docs(25-4):=20avoir=20sur=20facture=20r?= =?UTF-8?q?=C3=A9gl=C3=A9e=20refus=C3=A9=20en=2025-4-a=20(lev=C3=A9e=20:?= =?UTF-8?q?=20#471)=20;=20#384=20ramen=C3=A9e=20en=2025-4-d=20(refs=20#384?= =?UTF-8?q?,=20refs=20#456)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-a-residuel-juste.md | 13 ++++++++++++ .../25-4-propager-le-residuel.md | 21 +++++++++++++++---- .../sprint-status.yaml | 6 ++++-- .../epic-25-vague1-suite.md | 8 +++++-- 4 files changed, 40 insertions(+), 8 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md b/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md index 8e1d17a4..ff0af122 100644 --- a/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md +++ b/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md @@ -80,6 +80,17 @@ réglée** : `invoices/[id]/+page.svelte:836` n'exige que `!invoice.paidAt`. Le « Dévalider » a **retiré** cette condition pour cette raison même (commentaire `:864-871`) et laisse le serveur refuser avec un motif nommé ; « Créer un avoir » n'a pas été aligné. +## ✅ Arbitrage du 2026-09-27 — le refus reste, sa levée a son issue + +Guy : *« si on peut créer un avoir pour une facture payée, il faudrait aussi pouvoir le faire pour +une facture partiellement payée »* — les deux cas sont traités **de la même façon**, et, pour +l'instant, **dans le sens du refus** : un avoir sur facture encaissée laisse au client un crédit que +Kesh ne sait ni montrer, ni rembourser, ni imputer. La levée du refus est tracée par **[#471]**. Le +message de refus (AC 12) n'a donc pas à promettre une fonction à venir ; le manuel (AC 17) renvoie à +la limite existante « avoir sur facture déjà encaissée ». + +⚠️ **Ne pas contester l'arbitrage en revue** : en contester la mise en œuvre. + ## Acceptance Criteria ### Volet 1 — l'avoir compté TTC (#455) @@ -358,6 +369,7 @@ bloque **25-4-b**, pas celle-ci. ## Change Log +- **2026-09-27** — Arbitrage de Guy : le refus de l'avoir sur facture réglée (en tout ou en partie) reste ; sa levée est tracée par #471. - **2026-09-27** — **validation P3 ciblée** (Opus, diff aplati des remédiations P1-P2, prompt `25-4-a-validate-prompt-p3.md`) — **2 MEDIUM, 5 LOW**, tous de **propagation** des corrections P1, tous confirmés par grep. MEDIUM : T7 disait encore « m1 à m6 » (m7 ajoutée) ; l'AC 14 rendait faux @@ -398,5 +410,6 @@ bloque **25-4-b**, pas celle-ci. ne se voit que dans l'état que #456 produit — d'où leur réunion ; et la fixture `monter` encode #456 comme attendu. +[#471]: https://github.com/guycorbaz/kesh/issues/471 [#455]: https://github.com/guycorbaz/kesh/issues/455 [#456]: https://github.com/guycorbaz/kesh/issues/456 diff --git a/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md b/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md index b836637b..65f7e7dc 100644 --- a/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md +++ b/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md @@ -1,4 +1,4 @@ -# Story 25.4 : Propager le résiduel — découpée en 25-4-a / 25-4-b / 25-4-c +# Story 25.4 : Propager le résiduel — découpée en 25-4-a / 25-4-b / 25-4-c / 25-4-d Status: split @@ -15,13 +15,14 @@ Inventaire des sites fait le 2026-09-26 (trois lectures du code, chaque site rev `kesh-i18n`, `frontend` (fiche facture, échéancier, dialogue de règlement). Le seuil est **5** : la règle impose le découpage **avant** `bmad-create-story`. -Le découpage suit l'ordre des dépendances, non celui des issues : +Le découpage (quatre stories depuis le 2026-09-27) suit l'ordre des dépendances, non celui des issues : | Story | Issues | Ce qu'elle fait | Pourquoi à ce rang | |---|---|---|---| | **25-4-a** — le résiduel juste | [#455], [#456] | la formule canonique soustrait l'avoir **TTC** ; un avoir est refusé sur une facture **réglée, même en partie** ; le test de parité promis et jamais écrit | ⛔ **les deux suivantes réemploient la formule** : la propager avant de la corriger propagerait le défaut | | **25-4-b** — le résiduel aux agrégats | [#416] | balance âgée, totaux de l'échéancier, **colonne « reste dû »** de l'échéancier et de son CSV, dialogue de règlement pré-rempli, **montant réclamé par les relances** | le cœur de #416 ; première utilisatrice des formes jointes | | **25-4-c** — le résiduel au rapprochement | [#420] | filtre des candidats, score, re-score à l'acceptation, montant affiché dans la proposition | indépendante de 25-4-b, mais du même socle | +| **25-4-d** — solder le reste | [#384] | imputer l'écart d'un règlement partiel — **perte sur débiteur**, escompte, frais bancaires — pour clore une facture partiellement réglée ; la part de **TVA** réduit la TVA due, seule la part HT va au compte de perte | ramenée de la 25-6 le 2026-09-27 (Guy) : elle repose entièrement sur le résiduel juste de 25-4-a | ## Ce que l'inventaire a trouvé, et que les issues ne disaient pas @@ -57,9 +58,19 @@ Le découpage suit l'ordre des dépendances, non celui des issues : `.expect("avoir après règlement partiel — le vrai chemin l'accepte")`. Il **décrit le défaut** ; il se corrige, il ne se contourne pas. -## Hors périmètre des trois stories +## ✅ Arbitrages du 2026-09-27 — l'avoir sur facture encaissée, et la perte + +- **L'avoir reste refusé sur une facture réglée, en tout ou en partie** (25-4-a). Un avoir sur + facture encaissée est un geste normal, mais il laisse au client un **crédit** que Kesh ne sait ni + montrer, ni rembourser, ni imputer : l'autoriser seul reproduirait la dette muette de #456. Sa + levée est tracée par **[#471]** (crédit visible, remboursement ou imputation). +- **#384 est ramenée dans la 25-4, en 25-4-d**, pour clore une facture partiellement réglée dont le + solde ne sera pas payé (perte sur débiteur), ou réglée sous déduction d'un escompte ou de frais. + ⚠️ La part de TVA du montant passé en perte **réduit la TVA due** (correction de l'impôt sur + créance irrécouvrable) ; seule la part HT va au compte de perte. + +## Hors périmètre des quatre stories -- **L'imputation de l'écart** d'un règlement partiel (escompte, frais, perte) — [#384], 25-6. - **Le côté fournisseur** : une facture fournisseur se règle en une fois, il n'y a pas de résiduel partiel (#416, § Portée). - **L'avoir partiel et le remboursement** — v0.2, inchangé. @@ -120,6 +131,7 @@ Pour 25-4-b, donc : ## Change Log +- **2026-09-27** — Arbitrages : avoir sur facture réglée refusé en 25-4-a, levée tracée par #471 ; #384 ramenée en 25-4-d. - **2026-09-27** — Frais de rappel : configurables, aucune ligne affichée à zéro. - **2026-09-27** — Q1 retranchée : la QR du rappel porte le reste dû (le TTC s'il n'y a aucun règlement) ; numéro de facture conservé ; point ouvert sur les frais. - **2026-09-27** — Recadrage de Q1 : le document est un rappel pour un montant partiel, pas la facture réémise. @@ -131,6 +143,7 @@ Pour 25-4-b, donc : (rattaché à 25-4-b). 25-4-a spécifiée dans la foulée. [#384]: https://github.com/guycorbaz/kesh/issues/384 +[#471]: https://github.com/guycorbaz/kesh/issues/471 [#387]: https://github.com/guycorbaz/kesh/issues/387 [#416]: https://github.com/guycorbaz/kesh/issues/416 [#420]: https://github.com/guycorbaz/kesh/issues/420 diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index 04f53ab6..dbcd648d 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -1,3 +1,4 @@ +# last_updated: 2026-09-27 (1) (25-4-d creee depuis #384 ; #471 ouverte ; 25-4-a validee P3.) # last_updated: 2026-09-26 (5) (25-4 DECOUPEE en a/b/c ; 25-4-a creee, #455/#456 rattachees ; #467 #468 #470 mergees.) # last_updated: 2026-09-26 (4) (**25-3-c DONE** — revue close, gates verts, non poussee.) # last_updated: 2026-09-26 (3) (25-3-c IMPLEMENTEE, en review ; revue a posteriori de la 25-5-a close dans le worktree.) @@ -353,14 +354,15 @@ development_status: 25-3-c-annuler-facture-fournisseur: done # 2026-09-26 **REVUE CLOSE EN 1 PASSE** (0 > LOW, Sonnet x3) ; non poussee ; PR `closes #454` titre ET corps, sur accord. **IMPLEMENTEE** — gates 2472/2472, 783/783, E2E 220/10/19 sans regression ; prochaine etape : code review. # 2026-09-26 **SPEC VALIDEE en 2 passes** (3 MED -> 0 > LOW). **SPECIFIEE** — `25-3-c-annuler-facture-fournisseur.md`. Geste par le socle (autorite `SupplierPurchase`), queue commune sur l'ecriture d'ACHAT, lot en dernier rang ; payee : reglement DETACHE (colonnes remises a NULL, ecriture libre, lien garde par l'audit) — **Q1 tranchee par Guy le 2026-09-26**. Aucune migration. Prochaine etape : validate. # 2026-09-24 NEE d'un arbitrage de Guy — une facture fournisseur s'annule DANS TOUS LES CAS, sauf si l'exercice de son ecriture d'achat est CLOS (l'exercice, pas le verrou de periode) ; payee, son reglement RESTE au grand livre et REDEVIENT A LETTRER (Epic 15 : un paiement doit correspondre a une facture, au besoin creee pour lui — « comme bexio »). Reecrit `cancel`, donc absorbe [#454]. Derriere la 25-3-a. 25-3-b-annuler-rapprochement: done # 2026-09-25 DONE — revue close en passe 2 (Sonnet 1 MED -> Haiku 0) ; gates : backend 2463/2463, frontend 777/777, E2E sans regression. Non poussee. — SPEC VALIDEE (boucle close en passe 4 : 2 HIGH -> 2 MED -> 2 MED -> 3 LOW ; pas de decoupage, arbitrage de Guy). Q1-Q3 tranchees. — [#418] closes — annuler un rapprochement bancaire. ⛔ NE JAMAIS compter sur le `ON DELETE SET NULL` de `matched_entry_id` : supprimer l'ecriture ferait disparaitre le lien EN SILENCE, le mode d'echec meme que la story repare. ⚠️ Le chemin d'ACCEPTATION n'a aucune fonction `kesh-db` a mirer : il est ecrit en SQL brut a **cinq** sites de `routes/reconciliation.rs`, dont **un seul** porte le verrou optimiste. Quand la transaction porte une facture, appelle le geste de la 25-3-a. Derriere elle. 25-3-annuler-reglement-et-rapprochement: split # [#414] [#418] — **l'Epic 24 a livre l'encaissement et le rapprochement ; il n'a PAS livre le moyen de les DEFAIRE.** Une erreur d'imputation est aujourd'hui incorrigible autrement qu'a la main — et le gel de la 24-4b interdit precisement la main. ⚠️ *C'est le prix d'une story qui ferme une porte sans ouvrir la suivante : le gel est juste, et il rend cette story-ci necessaire.* - 25-4-a-residuel-juste: ready-for-dev # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (masque a l'ecran, mais rendu par GET /invoices/{id} aux cles API : amountDue = la TVA sur une facture creditee) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE ; validation : P1 Sonnet 1H/3M/1L -> P2 Haiku 1M retenu -> P3 ciblee Opus 2M/5L (propagation), tous corriges. EN ATTENTE de l'arbitrage de Guy sur l'avoir (volet 2). + 25-4-a-residuel-juste: ready-for-dev # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (masque a l'ecran, mais rendu par GET /invoices/{id} aux cles API : amountDue = la TVA sur une facture creditee) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE ; validation : P1 Sonnet 1H/3M/1L -> P2 Haiku 1M retenu -> P3 ciblee Opus 2M/5L (propagation), tous corriges. Arbitrage 2026-09-27 : refus maintenu, levee tracee par #471. 25-4-b-residuel-aux-agregats: backlog # [#416] + montant des RELANCES (TTC complet, trouve a l'inventaire) — Q1 TRANCHEE 2026-09-27 : la QR du rappel porte le RESTE DU (= TTC sans reglement), reste a payer sur le PDF et dans le texte ; point ouvert : frais de rappel non comptabilises vs trop-percu. 25-4-c-residuel-au-rapprochement: backlog # [#420] — DEUX sites : filtre SQL des candidats (HAVING total_ttc) avant le score, puis score et re-score a l'acceptation. + 25-4-d-solder-le-reste: backlog # [#384] ramenee de la 25-6 le 2026-09-27 (Guy) — perte sur debiteur, escompte, frais : clore une facture partiellement reglee ; la part TVA reduit la TVA due. 25-4-propager-le-residuel: split # 2026-09-26 DECOUPEE (six modules > 5) en 25-4-a / 25-4-b / 25-4-c ; #455 et #456 rattachees. # [#416] [#420] — la 24-2 a introduit le reglement PARTIEL ; le residuel n'est propage ni a la balance agee ni a l'echeancier, et **le score de rapprochement compare au TTC et non au residuel** : le virement du solde d'une facture partiellement reglee **score 0**. 25-5-a-export-souverainete: done # 2026-09-26 **MERGEE (PR #452, #386 fermee) SANS REVUE DE CODE** ; revue a posteriori CLOSE en 3 passes sur `story/25-5-a-revue-code` (4 HIGH P1, 1 HIGH orchestrateur P2 — colonnes manquantes, garde de colonnes —, P3 ciblee test seul) ; gates 2466/2466, E2E 221/8/19 sans regression ; reports #465, #466. # 2026-09-23 **SPECIFIEE et VALIDEE en 1 passe** (0 CRITICAL, 4 HIGH, 3 MEDIUM, 3 LOW, tous corriges). [#386] — issue du DECOUPAGE de la 25-5 (arbitrage de Guy) : #385 (Balance vs Bilan) et #386 n'ont en commun que le mot « etat », et touchent des modules disjoints. ⛔ **Trois faits qui corrigent l'issue** : 21 tables absentes et non 10 ; le trou s'est CREUSE depuis son ecriture (`invoice_settlements`, Epic 24) ; et SIX repositories sur huit n'ont aucune lecture exhaustive — le vrai cout, absent de l'issue. Arbitrage de Guy : l'export CSV ne porte que les donnees COMPTABLES (11 dedans), les backups portent tout ; 10 exclusions AVEC motif ecrit, dont 3 tables de SECRETS. Les justificatifs (fichiers) partent en story separee sur la SAUVEGARDE. ⛔ La vraie livraison est la GARDE D'EXHAUSTIVITE (patron D4-ter + P7), non les 11 exports : trois epics ont rouvert le trou en silence. ⚠️ Pieges releves par la validation : le nombre 19 code en dur a SEPT endroits dont deux `debug_assert_eq!` qui PANIQUENT ; `audit_log` n'a AUCUN dump exhaustif (ses fonctions sont bornees, la route rejette au-dela de 10 000 lignes) ; `csv_sanitize` existe et n'est pas employee par cet export ; deux sites de manuel DEJA faux (un dossier `reports/` invente, un « 38 » pour 39). 25-5-b-balance-solde-ouverture: backlog # [#385] — la **Balance des comptes ne concorde pas avec le Bilan**, il manque la colonne « solde d'ouverture » (III.4). Detachee de la 25-5 le 2026-09-23 : voir 25-5-a. 25-5-etats-et-export: split # [#385] [#386] — la **Balance des comptes ne concorde pas avec le Bilan**, il manque la colonne « solde d'ouverture » (III.4) ; et **l'export de souverainete omet les achats, les avoirs, les projets et la piste d'audit** (V.6) — *il promet plus qu'il ne tient*. - 25-6-tableau-de-bord-et-dettes: backlog # [#388] [#389] [#384] [#387] — la tuile « Dernieres ecritures » **n'appelle rien** et affiche toujours « Aucune ecriture » (*une tuile qui est un decor*) ; le « solde bancaire » est le solde COMPTABLE, donc faux ; imputer l'ECART d'un reglement partiel (escompte, frais bancaires, perte sur debiteur) ; et **le PDF d'une facture n'est jamais archive**, il est regenere a la volee (IV.9) — *un document reemis n'est pas le document envoye*. + 25-6-tableau-de-bord-et-dettes: backlog # [#388] [#389] [#387] (#384 ramenee en 25-4-d le 2026-09-27) — la tuile « Dernieres ecritures » **n'appelle rien** et affiche toujours « Aucune ecriture » (*une tuile qui est un decor*) ; le « solde bancaire » est le solde COMPTABLE, donc faux ; imputer l'ECART d'un reglement partiel (escompte, frais bancaires, perte sur debiteur) ; et **le PDF d'une facture n'est jamais archive**, il est regenere a la volee (IV.9) — *un document reemis n'est pas le document envoye*. epic-16: done # 2026-08-11 (nuit) MERGÉ — dernière story 16-3b via PR #296 (squash `593bb845`). #152, #144 et #151 fermées. v0.9.0 prête à taguer. # 2026-07-26 KICKOFF (rétro Epic 14, décision D-D ; GO Guy après publication de v0.8.0). Branche `story/16-1-compte-produit-par-ligne` créée sur main `ef6cdf52`. Séquence : 16-1 (#152 socle par ligne) → 16-2 (#144 défaut catalogue) → 16-3 (#151 reliquat PDF). # ÉLU PROCHAIN EPIC — kickoff dès le merge de la PR groupée Epic 14. Reste #144 (compte produit au catalogue) + #152 (compte produit par ligne) ; #151 (récap TVA facture) déjà mergé hors-bande via PR #267 (bb3c8d64, partiel : coord. émetteur / n° client restants). Capte aussi les CR utilisateurs #265/#266/#268. # Facturation avancée (#144/#152/#151) — Epic dédié acté 2026-06-04 # 2026-07-26 ORDRE INVERSÉ au kickoff (#152 avant #144). Motif ground-truth : `invoice_lines` ne # porte AUCUNE colonne de compte ET ne référence même pas `products` (pas de `product_id` — cf. diff --git a/_bmad-output/planning-artifacts/epic-25-vague1-suite.md b/_bmad-output/planning-artifacts/epic-25-vague1-suite.md index 95bded48..1802055b 100644 --- a/_bmad-output/planning-artifacts/epic-25-vague1-suite.md +++ b/_bmad-output/planning-artifacts/epic-25-vague1-suite.md @@ -211,6 +211,11 @@ propagé aux rapports agrégés — balance âgée et échéancier ([#416]) — rapprochement compare au TTC et non au résiduel**, si bien que le virement du solde d'une facture partiellement réglée **score 0** ([#420]). +⚠️ **Découpée le 2026-09-26 en 25-4-a / b / c, puis d** : [#455] et [#456] (même grandeur, même +jalon) y sont rattachées, et **[#384] y est ramenée de la 25-6 le 2026-09-27** (arbitrage de Guy) +en 25-4-d — solder le reste d'une facture partiellement réglée repose sur le résiduel juste. Détail : +`25-4-propager-le-residuel.md`. + ### 25-5 — Les états et l'export **Issues : [#385], [#386].** La **Balance des comptes ne concorde pas avec le Bilan** — il @@ -225,8 +230,7 @@ tient*. - La tuile **« Dernières écritures » n'appelle rien** et affiche toujours « Aucune écriture » ([#388]) — *une tuile qui est un décor*. - Le **« solde bancaire » est le solde comptable**, donc faux ([#389]). -- **Imputer l'écart d'un règlement partiel** — escompte, frais bancaires, perte sur débiteur - ([#384]). +- ~~**Imputer l'écart d'un règlement partiel**~~ — [#384] **ramenée en 25-4-d** le 2026-09-27. - **Le PDF d'une facture n'est jamais archivé**, il est régénéré à la volée ([#387], IV.9) — un document réémis n'est pas le document envoyé. From 5ed4a704b7bdf349c70ecb1a882428862c18c64c Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 00:19:05 +0200 Subject: [PATCH 14/51] =?UTF-8?q?docs(25-4-a):=20prompt=20de=20validation?= =?UTF-8?q?=20P4=20cibl=C3=A9e=20(refs=20#455,=20refs=20#456)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-a-validate-prompt-p4.md | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 _bmad-output/implementation-artifacts/25-4-a-validate-prompt-p4.md diff --git a/_bmad-output/implementation-artifacts/25-4-a-validate-prompt-p4.md b/_bmad-output/implementation-artifacts/25-4-a-validate-prompt-p4.md new file mode 100644 index 00000000..047bdafb --- /dev/null +++ b/_bmad-output/implementation-artifacts/25-4-a-validate-prompt-p4.md @@ -0,0 +1,58 @@ +# Prompt — validation P4 CIBLÉE, Story 25-4-a (le résiduel juste) + +*Versionné le 2026-09-27. **Une lentille** (Sonnet), contexte frais. Passe **ciblée** (CLAUDE.md +§ « La passe ciblée ») : la P3 n'a trouvé que des défauts **de propagation des corrections P1** ; ce qu'il reste à +relire est la remédiation, pas la story entière.* + +Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-4-propager-le-residuel`. Fiche : +`_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md`. **Périmètre** : le diff aplati +des remédiations P3 et de l'arbitrage du 2026-09-27 — +`git diff 1344b3a2 b18f7cd2 -- _bmad-output/implementation-artifacts/25-4-a-residuel-juste.md _bmad-output/implementation-artifacts/25-4-propager-le-residuel.md` +(ignore les paragraphes de la fiche mère qui consignent les arbitrages de Guy sur 25-4-b : **ne pas +les contester**). + +## La lentille : chasseur de régressions de remédiation + +Pour chaque passage réécrit en P1 ou P2 : + +1. **Est-il vrai contre le code ?** Relis les sites qu'il cite : `get_invoice` + (`crates/kesh-api/src/routes/invoices.rs`), `docs/api-external.md`, le bouton et le dialogue + d'avoir (`frontend/src/routes/(app)/invoices/[id]/+page.svelte`), la fixture `monter` et + `la_precedence_de_l_annulation_lecture_et_ecriture` (`crates/kesh-db/tests/invoice_settlement.rs`), + la migration `20260827000001_invoice_settlements.sql`, `settlement_cancel_blocker` + (`invoice_settlements_write.rs`), `kesh-api/Cargo.toml` (`serde-str`). +2. **Le gabarit « détacher, créditer, rattacher » (AC 13)** : exécute-le **mentalement** pas à pas + contre `create_credit_note` et les quatre paires combinées de `monter`. Une FK, une contrainte, + un audit, un contrôle de `company_id`, une lecture de `invoice_settlements` par + `create_credit_note` ou par les motifs montés **après** peut-il le casser ? L'écriture de + règlement porte-t-elle quelque part l'identifiant de la facture d'origine (description, audit, + `invoice_settlements` seul) ? +3. **AC 14 révisé** : cohérent avec l'AC 11, l'AC 12, les tests de l'AC 16 et la mutation m6/m7 ? + Un test de l'AC 16 porte-t-il encore l'ancienne logique (« bouton absent ») ? +4. **AC 8 révisé** : l'assertion prescrite peut-elle passer à vide (`null`, champ absent) ? +5. **Propagation** : chaque correction a-t-elle été reportée partout où le symptôme était écrit + (tâches T1-T9, tableau « Où regarder », Change Log, fiche mère, `sprint-status.yaml`) ? Greppe la + **valeur** (`code()`, `:98`, `937-990`, `latent`, `masqué`), pas la formulation. + +## Ce que tu rends + +- **Findings** : sévérité, endroit exact, **preuve** (commande et résultat, code lu), correction. +- ⛔ **La liste des axes réellement exercés ET de ceux qui ne l'ont pas été.** + +## Interdits + +⛔ N'écris aucun fichier du dépôt ; aucune commande qui écrit dans le dépôt ou dans une base — +`scripts/prepare-release.sh`, `scripts/regen-test-schema.sh`, `scripts/install-hooks.sh`, +`scripts/test-fast.sh`, `scripts/mem-guard.sh`, `make`, `latexmk`, tout `git commit`/`push`/`add`/ +`stash`/`reset`/`rebase`/`checkout`/`switch`/`worktree`, `sqlx migrate`, `cargo test`/`nextest`, +`npm run`, `npx playwright`. Autorisés : lecture, `grep`, `git log`/`show`/`diff`, `gh issue view`, +`cargo check`. + +## Complément P4 + +Le diff contient aussi l'**arbitrage du 2026-09-27** (refus de l'avoir maintenu, levée tracée par +#471 ; #384 ramenée en 25-4-d) : **ne pas le contester**, mais vérifier que la fiche 25-4-a reste +cohérente avec lui (AC 12, AC 17, hors périmètre de la fiche mère), et que la fiche de l'epic et +`sprint-status.yaml` disent la même chose. Vérifie aussi que les corrections P3 (T7 « m1 à m7 », +commentaire `:842-844`, doc-comments `errors.rs:214-217` et `invoice_settlements_write.rs:326-329`, +repli « arrêter et demander », T2 et le montage à 8,1 %) sont justes et ne contredisent rien. From ab9b9448ae0320602aec32a7f3cceeb930e29106 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 00:31:45 +0200 Subject: [PATCH 15/51] =?UTF-8?q?docs(25-4-a):=20validation=20P4=20?= =?UTF-8?q?=E2=80=94=20close=20en=204=20passes,=20pr=C3=AAte=20pour=20le?= =?UTF-8?q?=20dev=20(refs=20#455,=20refs=20#456)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-a-residuel-juste.md | 16 ++++++++++++++-- .../implementation-artifacts/sprint-status.yaml | 4 ++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md b/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md index ff0af122..5cacd437 100644 --- a/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md +++ b/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md @@ -176,7 +176,7 @@ pouvoir émettre un avoir. » Registre du glossaire (`docs/i18n-glossaire.md` § sauvegarde antérieure — ce qui justifie de garder `SettlementCancelBlocker::InvoiceCredited`. ⛔ Ne **pas** supprimer ce motif ni ses tests. Ses doc-comments, qui le présentent comme un chemin normal (« créditée par un avoir après ce règlement … pas une anomalie », `errors.rs:214-217` ; -« Hors `validated`, c'est donc un avoir », `invoice_settlements_write.rs:326-329`), disent +« Hors `validated`, c'est donc un avoir », `invoice_settlements_write.rs:327-330`), disent désormais que l'état n'est plus atteignable **que par l'import d'une sauvegarde antérieure**. ⚠️ **`monter` sert quinze cas, pas un** : `la_precedence_de_l_annulation_lecture_et_ecriture` @@ -309,7 +309,8 @@ restreint aux lignes qui parlent d'avoir, plus le PDF aplati. Les manuels DE/IT/ | `crates/kesh-db/src/repositories/invoice_settlements.rs:24-58, 122-145` | les quatre constantes, `amount_due` | | `crates/kesh-db/src/repositories/invoices.rs:155-190` | `INVOICE_TTC_SUBQUERY_SQL` / `…_DERIVED_JOIN_SQL`, `total_ttc` | | `crates/kesh-db/src/repositories/credit_notes.rs:187-257, 260-330, 510-575` | écriture de l'avoir, garde AC2bis, `total_amount`, bascule `cancelled` | -| `crates/kesh-db/src/errors.rs:119-175, 300-470, 641-670` | `UnvalidationBlocker`, `DbError`, `error_code()` | +| `crates/kesh-db/src/errors.rs:119-175, 205-260, 300-470, 641-670` | `UnvalidationBlocker`, `SettlementCancelBlocker` (doc d'`InvoiceCredited` `:214-217`), `DbError`, `error_code()` | +| `crates/kesh-db/src/repositories/invoice_settlements_write.rs:60-72, 320-333` | verrou de `settle_invoice` ; rang 1 de `settlement_cancel_blocker` (commentaire `:327-330`, AC 13) | | `crates/kesh-db/src/repositories/invoices.rs:1430-1448` | la garde de dévalidation, patron de l'AC 9 | | `crates/kesh-api/src/errors.rs:2515-2560, 2741-2748` | mapping `InvoiceNotUnvalidatable`, générique | | `crates/kesh-api/src/routes/credit_notes.rs:183-205` | handler de création | @@ -369,6 +370,17 @@ bloque **25-4-b**, pas celle-ci. ## Change Log +- **2026-09-27** — **validation P4 ciblée** (Sonnet, diff `1344b3a2..b18f7cd2`, prompt + `25-4-a-validate-prompt-p4.md`) — rapporte **1 MEDIUM, 3 LOW**, tous confirmés et corrigés. + **MEDIUM reclassé LOW** par l'orchestrateur : `invoice_settlements_write.rs` manquait au tableau + « Où regarder », mais l'AC 13 qui prescrit son édition le **nomme avec sa ligne** — une omission de + navigation, sans risque qu'une prescription soit perdue. LOW : citation `:326-329` → `:327-330` ; + plage d'`errors.rs` étendue à `SettlementCancelBlocker` ; commentaire de la ligne mère de + `sprint-status` resté à trois stories. Le gabarit de l'AC 13, l'AC 8 et l'AC 14 revérifiés sans + défaut ; la sérialisation en chaîne confirmée dans la source de `rust_decimal` 1.42.1. + ⛔ **Boucle de validation CLOSE en 4 passes** : `1H/3M/1L → 1M → 2M/5L → 0 > LOW` (après + reclassement), rotation Sonnet → Haiku → Opus → Sonnet, deux passes ciblées ; toutes les + corrections ont porté sur la spec, aucune sur du code. **Prête pour le dev.** - **2026-09-27** — Arbitrage de Guy : le refus de l'avoir sur facture réglée (en tout ou en partie) reste ; sa levée est tracée par #471. - **2026-09-27** — **validation P3 ciblée** (Opus, diff aplati des remédiations P1-P2, prompt `25-4-a-validate-prompt-p3.md`) — **2 MEDIUM, 5 LOW**, tous de **propagation** des corrections P1, diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index dbcd648d..daf27cdd 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -354,11 +354,11 @@ development_status: 25-3-c-annuler-facture-fournisseur: done # 2026-09-26 **REVUE CLOSE EN 1 PASSE** (0 > LOW, Sonnet x3) ; non poussee ; PR `closes #454` titre ET corps, sur accord. **IMPLEMENTEE** — gates 2472/2472, 783/783, E2E 220/10/19 sans regression ; prochaine etape : code review. # 2026-09-26 **SPEC VALIDEE en 2 passes** (3 MED -> 0 > LOW). **SPECIFIEE** — `25-3-c-annuler-facture-fournisseur.md`. Geste par le socle (autorite `SupplierPurchase`), queue commune sur l'ecriture d'ACHAT, lot en dernier rang ; payee : reglement DETACHE (colonnes remises a NULL, ecriture libre, lien garde par l'audit) — **Q1 tranchee par Guy le 2026-09-26**. Aucune migration. Prochaine etape : validate. # 2026-09-24 NEE d'un arbitrage de Guy — une facture fournisseur s'annule DANS TOUS LES CAS, sauf si l'exercice de son ecriture d'achat est CLOS (l'exercice, pas le verrou de periode) ; payee, son reglement RESTE au grand livre et REDEVIENT A LETTRER (Epic 15 : un paiement doit correspondre a une facture, au besoin creee pour lui — « comme bexio »). Reecrit `cancel`, donc absorbe [#454]. Derriere la 25-3-a. 25-3-b-annuler-rapprochement: done # 2026-09-25 DONE — revue close en passe 2 (Sonnet 1 MED -> Haiku 0) ; gates : backend 2463/2463, frontend 777/777, E2E sans regression. Non poussee. — SPEC VALIDEE (boucle close en passe 4 : 2 HIGH -> 2 MED -> 2 MED -> 3 LOW ; pas de decoupage, arbitrage de Guy). Q1-Q3 tranchees. — [#418] closes — annuler un rapprochement bancaire. ⛔ NE JAMAIS compter sur le `ON DELETE SET NULL` de `matched_entry_id` : supprimer l'ecriture ferait disparaitre le lien EN SILENCE, le mode d'echec meme que la story repare. ⚠️ Le chemin d'ACCEPTATION n'a aucune fonction `kesh-db` a mirer : il est ecrit en SQL brut a **cinq** sites de `routes/reconciliation.rs`, dont **un seul** porte le verrou optimiste. Quand la transaction porte une facture, appelle le geste de la 25-3-a. Derriere elle. 25-3-annuler-reglement-et-rapprochement: split # [#414] [#418] — **l'Epic 24 a livre l'encaissement et le rapprochement ; il n'a PAS livre le moyen de les DEFAIRE.** Une erreur d'imputation est aujourd'hui incorrigible autrement qu'a la main — et le gel de la 24-4b interdit precisement la main. ⚠️ *C'est le prix d'une story qui ferme une porte sans ouvrir la suivante : le gel est juste, et il rend cette story-ci necessaire.* - 25-4-a-residuel-juste: ready-for-dev # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (masque a l'ecran, mais rendu par GET /invoices/{id} aux cles API : amountDue = la TVA sur une facture creditee) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE ; validation : P1 Sonnet 1H/3M/1L -> P2 Haiku 1M retenu -> P3 ciblee Opus 2M/5L (propagation), tous corriges. Arbitrage 2026-09-27 : refus maintenu, levee tracee par #471. + 25-4-a-residuel-juste: ready-for-dev # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (masque a l'ecran, mais rendu par GET /invoices/{id} aux cles API : amountDue = la TVA sur une facture creditee) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE ; validation : P1 Sonnet 1H/3M/1L -> P2 Haiku 1M retenu -> P3 ciblee Opus 2M/5L -> P4 ciblee Sonnet 0 > LOW (1M reclasse LOW) : VALIDEE en 4 passes. Arbitrage 2026-09-27 : refus maintenu, levee tracee par #471. 25-4-b-residuel-aux-agregats: backlog # [#416] + montant des RELANCES (TTC complet, trouve a l'inventaire) — Q1 TRANCHEE 2026-09-27 : la QR du rappel porte le RESTE DU (= TTC sans reglement), reste a payer sur le PDF et dans le texte ; point ouvert : frais de rappel non comptabilises vs trop-percu. 25-4-c-residuel-au-rapprochement: backlog # [#420] — DEUX sites : filtre SQL des candidats (HAVING total_ttc) avant le score, puis score et re-score a l'acceptation. 25-4-d-solder-le-reste: backlog # [#384] ramenee de la 25-6 le 2026-09-27 (Guy) — perte sur debiteur, escompte, frais : clore une facture partiellement reglee ; la part TVA reduit la TVA due. - 25-4-propager-le-residuel: split # 2026-09-26 DECOUPEE (six modules > 5) en 25-4-a / 25-4-b / 25-4-c ; #455 et #456 rattachees. # [#416] [#420] — la 24-2 a introduit le reglement PARTIEL ; le residuel n'est propage ni a la balance agee ni a l'echeancier, et **le score de rapprochement compare au TTC et non au residuel** : le virement du solde d'une facture partiellement reglee **score 0**. + 25-4-propager-le-residuel: split # 2026-09-26 DECOUPEE (six modules > 5) en 25-4-a / 25-4-b / 25-4-c, puis 25-4-d (#384, 2026-09-27) ; #455 et #456 rattachees. # [#416] [#420] — la 24-2 a introduit le reglement PARTIEL ; le residuel n'est propage ni a la balance agee ni a l'echeancier, et **le score de rapprochement compare au TTC et non au residuel** : le virement du solde d'une facture partiellement reglee **score 0**. 25-5-a-export-souverainete: done # 2026-09-26 **MERGEE (PR #452, #386 fermee) SANS REVUE DE CODE** ; revue a posteriori CLOSE en 3 passes sur `story/25-5-a-revue-code` (4 HIGH P1, 1 HIGH orchestrateur P2 — colonnes manquantes, garde de colonnes —, P3 ciblee test seul) ; gates 2466/2466, E2E 221/8/19 sans regression ; reports #465, #466. # 2026-09-23 **SPECIFIEE et VALIDEE en 1 passe** (0 CRITICAL, 4 HIGH, 3 MEDIUM, 3 LOW, tous corriges). [#386] — issue du DECOUPAGE de la 25-5 (arbitrage de Guy) : #385 (Balance vs Bilan) et #386 n'ont en commun que le mot « etat », et touchent des modules disjoints. ⛔ **Trois faits qui corrigent l'issue** : 21 tables absentes et non 10 ; le trou s'est CREUSE depuis son ecriture (`invoice_settlements`, Epic 24) ; et SIX repositories sur huit n'ont aucune lecture exhaustive — le vrai cout, absent de l'issue. Arbitrage de Guy : l'export CSV ne porte que les donnees COMPTABLES (11 dedans), les backups portent tout ; 10 exclusions AVEC motif ecrit, dont 3 tables de SECRETS. Les justificatifs (fichiers) partent en story separee sur la SAUVEGARDE. ⛔ La vraie livraison est la GARDE D'EXHAUSTIVITE (patron D4-ter + P7), non les 11 exports : trois epics ont rouvert le trou en silence. ⚠️ Pieges releves par la validation : le nombre 19 code en dur a SEPT endroits dont deux `debug_assert_eq!` qui PANIQUENT ; `audit_log` n'a AUCUN dump exhaustif (ses fonctions sont bornees, la route rejette au-dela de 10 000 lignes) ; `csv_sanitize` existe et n'est pas employee par cet export ; deux sites de manuel DEJA faux (un dossier `reports/` invente, un « 38 » pour 39). 25-5-b-balance-solde-ouverture: backlog # [#385] — la **Balance des comptes ne concorde pas avec le Bilan**, il manque la colonne « solde d'ouverture » (III.4). Detachee de la 25-5 le 2026-09-23 : voir 25-5-a. 25-5-etats-et-export: split # [#385] [#386] — la **Balance des comptes ne concorde pas avec le Bilan**, il manque la colonne « solde d'ouverture » (III.4) ; et **l'export de souverainete omet les achats, les avoirs, les projets et la piste d'audit** (V.6) — *il promet plus qu'il ne tient*. From 9bf2bb2b5c992e107e70d39849daa76408358ef9 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 01:02:05 +0200 Subject: [PATCH 16/51] =?UTF-8?q?feat(25-4-a):=20le=20reste=20d=C3=BB=20co?= =?UTF-8?q?mpte=20l'avoir=20TTC,=20et=20l'avoir=20est=20refus=C3=A9=20sur?= =?UTF-8?q?=20une=20facture=20r=C3=A9gl=C3=A9e=20(refs=20#455,=20refs=20#4?= =?UTF-8?q?56)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 6 + .../25-4-a-residuel-juste.md | 111 ++++++- .../sprint-status.yaml | 2 +- crates/kesh-api/src/errors.rs | 30 ++ .../kesh-api/tests/invoice_echeancier_e2e.rs | 113 +++++++ crates/kesh-db/src/errors.rs | 34 +- .../kesh-db/src/repositories/credit_notes.rs | 37 ++- .../src/repositories/invoice_settlements.rs | 47 ++- .../repositories/invoice_settlements_write.rs | 3 + crates/kesh-db/src/repositories/invoices.rs | 43 ++- .../kesh-db/tests/credit_notes_repository.rs | 239 +++++++++++++- .../tests/invoice_amount_due_parity.rs | 311 ++++++++++++++++++ crates/kesh-db/tests/invoice_settlement.rs | 27 +- crates/kesh-i18n/locales/de-CH/messages.ftl | 1 + crates/kesh-i18n/locales/en-CH/messages.ftl | 1 + crates/kesh-i18n/locales/fr-CH/messages.ftl | 1 + crates/kesh-i18n/locales/it-CH/messages.ftl | 1 + docs/manual/fr/user-manual.pdf | Bin 290281 -> 292120 bytes docs/manual/fr/user-manual.tex | 21 +- .../routes/(app)/invoices/[id]/+page.svelte | 30 +- .../[id]/invoice-settlements-page.test.ts | 38 ++- 21 files changed, 1042 insertions(+), 54 deletions(-) create mode 100644 crates/kesh-db/tests/invoice_amount_due_parity.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index ca07fcb0..1d6e160a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,8 +28,14 @@ Le contenu est rédigé en français à destination des **fiduciaires, PME, ind - **Sur la fiche d'une facture fournisseur, le bouton *Annuler la facture* s'affichait aussi pour un utilisateur en consultation**, qui ne pouvait que se heurter à un refus ; et un refus effaçait toute la fiche au profit d'un message d'erreur. Le bouton est désormais réservé aux comptables et administrateurs, et un refus s'affiche sous le bouton, la fiche restant visible. +- **Une facture créditée gardait sa TVA en « reste dû » ([#455](https://github.com/guycorbaz/kesh/issues/455)).** Le reste dû retranchait l'avoir **hors taxes** d'un total **TTC** : une facture de 100.— HT à 8,1 %, entièrement créditée, restait due de 8.10, alors que le grand livre, lui, avait soldé la créance. L'écran ne l'affichait que dans un cas rare, mais ⚠️ **l'API le rendait toujours** : `GET /api/v1/invoices/{id}`, ouverte aux clés API en lecture, renvoyait la TVA dans `amountDue` pour toute facture créditée. **Si une intégration lisait ce champ, ses chiffres étaient faux.** Le reste dû compte désormais l'avoir TTC, arrondi ligne par ligne comme son écriture. + +- **Un avoir pouvait viser une facture déjà réglée en partie ([#456](https://github.com/guycorbaz/kesh/issues/456)), et le compte du client devenait créditeur sans que rien ne le signale.** L'avoir était refusé sur une facture **payée**, mais pas sur une facture réglée **en partie** — qui, depuis le règlement partiel, n'est « payée » qu'une fois soldée. Comme l'avoir annule tout le montant de la facture, le client se retrouvait avec un crédit du montant déjà encaissé, que Kesh ne sait ni montrer, ni rembourser. L'avoir est désormais refusé dès qu'un règlement existe, avec un message qui dit quoi faire : annuler d'abord le règlement. *(Autoriser l'avoir sur une facture encaissée, avec le remboursement ou l'imputation qu'il appelle, est suivi par [#471](https://github.com/guycorbaz/kesh/issues/471).)* + ### Changed +- **Le bouton *Créer un avoir* s'affiche aussi sur une facture payée**, et c'est voulu. Il était masqué sur une facture payée mais pas sur une facture réglée en partie : l'écran ne couvrait que la moitié de la règle. Il reste désormais visible, et Kesh explique le refus dans le dialogue — comme le bouton *Dévalider*. + - **Supprimer une facture validée n'est plus possible — il faut la « dévalider » d'abord.** Jusqu'ici, le bouton *Supprimer* d'une facture validée effaçait la facture **et son écriture comptable** d'un seul geste. La destruction d'une écriture était donc un **effet de bord du mot « supprimer »** : rien, dans le vocabulaire de l'écran, ne disait qu'on touchait aux livres. Le geste existe toujours, mais il porte désormais son nom. Le bouton **« Dévalider »** repasse la facture en **brouillon**, supprime son écriture, et **conserve son numéro** — en la revalidant, elle reprend *le même*, sans consommer le compteur. Deux sorties s'ouvrent alors : corriger puis revalider, ou supprimer le brouillon. diff --git a/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md b/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md index 5cacd437..82b5e340 100644 --- a/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md +++ b/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md @@ -1,6 +1,6 @@ # Story 25.4-a : Le résiduel juste — l'avoir compté TTC, et refusé sur une facture réglée -Status: ready-for-dev +Status: review **Issues : [#455], [#456]**, qu'elle **ferme** : `closes #455, closes #456` dans le **titre ET le corps** de la PR (squash ; un `refs` partout laisserait les issues ouvertes sans signal). @@ -271,22 +271,22 @@ restreint aux lignes qui parlent d'avoir, plus le PDF aplati. Les manuels DE/IT/ ## Tasks / Subtasks -- [ ] **T1 — formule de l'avoir TTC** (AC 1-5) : factoriser la formule de ligne, réécrire les deux +- [x] **T1 — formule de l'avoir TTC** (AC 1-5) : factoriser la formule de ligne, réécrire les deux constantes d'avoir, doc-comments. -- [ ] **T2 — parité et concordance** (AC 6-8) : nouveau fichier de test sur le patron +- [x] **T2 — parité et concordance** (AC 6-8) : nouveau fichier de test sur le patron `invoice_ttc_parity.rs`. ⚠️ Le helper `validated_invoice` (`invoice_settlement.rs:32`) est **à 0 % en dur** et passe une écriture de vente **au HT** : les factures à 8,1 % se montent par le **vrai chemin de validation**, sur le patron de `create_and_validate` (`credit_notes_repository.rs`) ; l'état hérité, par le gabarit de l'AC 13. -- [ ] **T3 — garde de l'avoir** (AC 9-11) : lecture verrouillante des règlements après le verrou, +- [x] **T3 — garde de l'avoir** (AC 9-11) : lecture verrouillante des règlements après le verrou, variante `DbError`, `error_code()`. -- [ ] **T4 — API et i18n** (AC 12) : mapping, clé ×4 ; e2e 409. -- [ ] **T5 — fixture `monter`** (AC 13) : gabarit « détacher, créditer, rattacher », commentaire ; +- [x] **T4 — API et i18n** (AC 12) : mapping, clé ×4 ; e2e 409. +- [x] **T5 — fixture `monter`** (AC 13) : gabarit « détacher, créditer, rattacher », commentaire ; **les quinze cas** de la précédence restent verts, dont les quatre paires avec `InvoiceCredited`. -- [ ] **T6 — frontend** (AC 14) : condition du bouton retirée, commentaire, Vitest. -- [ ] **T7 — tests et mutations** (AC 16) : m1 à **m7** exécutées, résultats consignés. -- [ ] **T8 — textes** (AC 17) : manuel, PDF aplati, CHANGELOG. -- [ ] **T9 — gates** : backend complet (base remise à zéro), frontend complet, E2E complet. +- [x] **T6 — frontend** (AC 14) : condition du bouton retirée, commentaire, Vitest. +- [x] **T7 — tests et mutations** (AC 16) : m1 à **m7** exécutées, résultats consignés. +- [x] **T8 — textes** (AC 17) : manuel, PDF aplati, CHANGELOG. +- [x] **T9 — gates** : backend complet (base remise à zéro), frontend complet, E2E complet. ## Dev Notes @@ -362,14 +362,105 @@ bloque **25-4-b**, pas celle-ci. ### Agent Model Used +Claude Opus 5.5. + ### Debug Log References +- `settled_and_credited_forms_are_at_parity` attendait **huit** factures ; il y en a **sept** (six du jeu + + la facture auxiliaire du gabarit). Erreur de décompte dans le test, pas dans le code — corrigée, + et l'assertion anti-vacuité garde des valeurs **non nulles** des deux côtés. +- `SUM(next_number)` rend un `DECIMAL` sous MariaDB : `CAST(… AS SIGNED)` dans l'empreinte du test de + refus. +- Un doc-comment égaré (« Paramètres de recherche, tri et pagination. ») précédait + `INVOICE_TTC_SUBQUERY_SQL` : remis au-dessus d'`InvoiceListQuery`, qu'il décrit. +- ⚠️ **Relevé hors périmètre, non corrigé** : la clé voisine `error-invoice-unvalidate-blocked-settled` + (it-CH) dit « annullatelo » — forme *voi*, contraire au registre du glossaire (2ᵉ personne du + singulier). La nouvelle clé suit le glossaire (« annullalo »). + ### Completion Notes List +- **Formule du TTC d'une ligne, source unique** (AC 5) : macro `line_ttc_sql!` (`invoices.rs`), + rendant un littéral via `concat!` ; les **quatre** constantes en dérivent (TTC facture scalaire et + jointe, avoir scalaire et joint), qui restent des `&'static str`. +- **Avoir compté TTC** (AC 1-4) : les deux constantes d'avoir somment `credit_note_lines` (jointes à + `credit_notes`, `status = 'issued'`), arrondi ligne par ligne ; doc-comments sur l'unité et sur + `total_amount` HT. Aucune migration. +- **Parité et concordance** (AC 6-8) : `tests/invoice_amount_due_parity.rs`, 4 tests, **tous à TVA + non nulle** ; factures par le vrai chemin de validation ; l'état hérité par le gabarit « détacher, + créditer, rattacher ». Le crédit de l'avoir égale le crédit de la créance **dans l'écriture** + (1207.71 sur trois lignes à 8,1 % / 2,6 % / sous-centime), et le test s'assure que `total_amount` + (HT) en diffère — sans quoi il ne distinguerait rien. +- **Garde de l'avoir** (AC 9-11) : lecture **verrouillante** des règlements, **après** le verrou de la + facture ; une ligne **ou** `paid_at` ; variante `DbError::CreditNoteBlockedBySettlement` + (`CREDIT_NOTE_INVOICE_SETTLED`), qui remplace aussi le générique du cas « payée ». +- **API et i18n** (AC 12) : 409, message suffixé du numéro de facture, `details { invoiceId, + settlementId }` ; clé `error-credit-note-blocked-settled` ×4. +- **Fixture `monter`** (AC 13) : gabarit « détacher, créditer, rattacher » ; les **quinze cas** de la + précédence restent verts. Doc-comments de `InvoiceCredited` et du rang 1 : état hérité. +- **Frontend** (AC 14) : condition `!invoice.paidAt` retirée du bouton, commentaires Suspendre/Reprendre + corrigé ; `data-testid` sur le bouton, la confirmation et l'erreur du dialogue. +- **Textes** (AC 17) : manuel (refus nommé en § Avoirs, deux limites reformulées « réglée, même en + partie », deux motifs d'annulation de règlement précisés comme **cas hérité**), PDF régénéré et + contrôlé aplati (0 `??`, six phrases de contrôle présentes, « marquée payée » absente) ; CHANGELOG + *Fixed* ×2 (dont **l'API** pour #455) et *Changed* (le bouton). Grep large du symptôme « avoir sur + facture payée » : aucun autre site. + +**Tests ajoutés** (recomptés depuis la source, `main` → arbre de travail) : `invoice_amount_due_parity` +0 → 4, `credit_notes_repository` 6 → 9 (dont `credit_note_refused_on_paid_invoice` réécrit), +`invoice_echeancier_e2e` 11 → 13, Vitest `invoice-settlements-page.test.ts` 2 → 5. + +**Mutations** (résultat **observé**, chaque fichier restauré après) : + +| Mutation | Tests rouges | +|---|---| +| m1 — avoir scalaire en `SUM(cn.total_amount)` | 4 / 4 de `invoice_amount_due_parity` | +| m2 — avoir joint seul en `SUM(total_amount)` | `settled_and_credited_forms_are_at_parity` | +| m3 — garde sur `paid_at` seul | `…refused_on_partially_settled_invoice`, `…accepted_after_the_settlement_is_cancelled`, `…waits_for_a_concurrent_settlement` | +| m4 — garde sur la ligne seule | `credit_note_refused_on_paid_invoice` | +| m5 — lecture avant le verrou, non verrouillante | `credit_note_waits_for_a_concurrent_settlement` | +| m6 — `!invoice.paidAt` remis sur le bouton | 2 Vitest (bouton sur facture payée ; refus dans le dialogue) | +| m7 — code mappé sur `ILLEGAL_STATE_TRANSITION` | `credit_note_on_partially_settled_invoice_is_409` | + +### Gates + +- Backend : base remise à zéro (tmpfs + migrations + seed), `scripts/test-fast.sh` (fmt + clippy + + nextest) **2484 / 2484** (2475 + 9). +- Frontend : `check` 0 erreur (27 avertissements), `lint-i18n-ownership` PASS, `test:unit` + **826 / 826** (823 + 3), build OK. +- E2E : `kesh_e2e` reconstruite, montage complet (`smtpConfigured:true`, répertoires inbox et documents), + frontend buildé après le dernier patch, run à **22:52 UTC** : **222 passés / 10 échoués / 19 + ignorés**. Les 7 de KF-029 ; les 3 autres — `product-revenue-account:133`, `sidebar-navigation:75` + (pollution documentée) et ⚠️ `accounts.spec.ts:185` (**non documenté**) — passent **rejoués seuls, + 18 / 18**, et ne touchent aucun écran de la story. Trois pollutions dans un même run, là où la + baseline en compte une : à surveiller, sans régression de la story. + ### File List +| Fichier | Nature | +|---|---| +| `crates/kesh-db/src/repositories/invoices.rs` | macro `line_ttc_sql!`, constantes TTC recomposées, doc-comment replacé | +| `crates/kesh-db/src/repositories/invoice_settlements.rs` | avoir TTC (scalaire, joint), doc d'`amount_due` | +| `crates/kesh-db/src/repositories/credit_notes.rs` | garde : lecture verrouillante des règlements | +| `crates/kesh-db/src/errors.rs` | `CreditNoteBlockedBySettlement`, `error_code()`, doc d'`InvoiceCredited` | +| `crates/kesh-db/src/repositories/invoice_settlements_write.rs` | commentaire du rang 1 | +| `crates/kesh-api/src/errors.rs` | mapping 409 | +| `crates/kesh-i18n/locales/{fr,de,it,en}-CH/messages.ftl` | `error-credit-note-blocked-settled` | +| `crates/kesh-db/tests/invoice_amount_due_parity.rs` | **nouveau** — parité, concordance, zéro, hérité | +| `crates/kesh-db/tests/credit_notes_repository.rs` | refus payée réécrit ; partiel, réouverture, entrelacement | +| `crates/kesh-db/tests/invoice_settlement.rs` | `monter` : gabarit « détacher, créditer, rattacher » | +| `crates/kesh-api/tests/invoice_echeancier_e2e.rs` | e2e : `amountDue` nul, 409 | +| `frontend/src/routes/(app)/invoices/[id]/+page.svelte` | bouton, commentaires, `data-testid` | +| `frontend/src/routes/(app)/invoices/[id]/invoice-settlements-page.test.ts` | 3 Vitest | +| `docs/manual/fr/user-manual.tex` / `.pdf` | avoirs, limites, cas hérité | +| `CHANGELOG.md` | *Fixed* ×2, *Changed* | + ## Change Log +- **2026-09-27** — **dev** (Opus 5.5) : formule du TTC de ligne factorisée (`line_ttc_sql!`), avoir + compté TTC, garde verrouillante de l'avoir sur facture réglée, variante `CREDIT_NOTE_INVOICE_SETTLED` + ×4 locales, fixture `monter` par le gabarit, bouton aligné sur « Dévalider », manuel et CHANGELOG. + +9 tests Rust, +3 Vitest ; **7 / 7 mutations tuées**. Gates : backend 2484/2484, frontend 826/826, + E2E 222/10/19 sans régression (7 KF-029 + 3 pollutions, rejouées seules vertes). - **2026-09-27** — **validation P4 ciblée** (Sonnet, diff `1344b3a2..b18f7cd2`, prompt `25-4-a-validate-prompt-p4.md`) — rapporte **1 MEDIUM, 3 LOW**, tous confirmés et corrigés. **MEDIUM reclassé LOW** par l'orchestrateur : `invoice_settlements_write.rs` manquait au tableau diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index daf27cdd..7502347b 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -354,7 +354,7 @@ development_status: 25-3-c-annuler-facture-fournisseur: done # 2026-09-26 **REVUE CLOSE EN 1 PASSE** (0 > LOW, Sonnet x3) ; non poussee ; PR `closes #454` titre ET corps, sur accord. **IMPLEMENTEE** — gates 2472/2472, 783/783, E2E 220/10/19 sans regression ; prochaine etape : code review. # 2026-09-26 **SPEC VALIDEE en 2 passes** (3 MED -> 0 > LOW). **SPECIFIEE** — `25-3-c-annuler-facture-fournisseur.md`. Geste par le socle (autorite `SupplierPurchase`), queue commune sur l'ecriture d'ACHAT, lot en dernier rang ; payee : reglement DETACHE (colonnes remises a NULL, ecriture libre, lien garde par l'audit) — **Q1 tranchee par Guy le 2026-09-26**. Aucune migration. Prochaine etape : validate. # 2026-09-24 NEE d'un arbitrage de Guy — une facture fournisseur s'annule DANS TOUS LES CAS, sauf si l'exercice de son ecriture d'achat est CLOS (l'exercice, pas le verrou de periode) ; payee, son reglement RESTE au grand livre et REDEVIENT A LETTRER (Epic 15 : un paiement doit correspondre a une facture, au besoin creee pour lui — « comme bexio »). Reecrit `cancel`, donc absorbe [#454]. Derriere la 25-3-a. 25-3-b-annuler-rapprochement: done # 2026-09-25 DONE — revue close en passe 2 (Sonnet 1 MED -> Haiku 0) ; gates : backend 2463/2463, frontend 777/777, E2E sans regression. Non poussee. — SPEC VALIDEE (boucle close en passe 4 : 2 HIGH -> 2 MED -> 2 MED -> 3 LOW ; pas de decoupage, arbitrage de Guy). Q1-Q3 tranchees. — [#418] closes — annuler un rapprochement bancaire. ⛔ NE JAMAIS compter sur le `ON DELETE SET NULL` de `matched_entry_id` : supprimer l'ecriture ferait disparaitre le lien EN SILENCE, le mode d'echec meme que la story repare. ⚠️ Le chemin d'ACCEPTATION n'a aucune fonction `kesh-db` a mirer : il est ecrit en SQL brut a **cinq** sites de `routes/reconciliation.rs`, dont **un seul** porte le verrou optimiste. Quand la transaction porte une facture, appelle le geste de la 25-3-a. Derriere elle. 25-3-annuler-reglement-et-rapprochement: split # [#414] [#418] — **l'Epic 24 a livre l'encaissement et le rapprochement ; il n'a PAS livre le moyen de les DEFAIRE.** Une erreur d'imputation est aujourd'hui incorrigible autrement qu'a la main — et le gel de la 24-4b interdit precisement la main. ⚠️ *C'est le prix d'une story qui ferme une porte sans ouvrir la suivante : le gel est juste, et il rend cette story-ci necessaire.* - 25-4-a-residuel-juste: ready-for-dev # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (masque a l'ecran, mais rendu par GET /invoices/{id} aux cles API : amountDue = la TVA sur une facture creditee) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE ; validation : P1 Sonnet 1H/3M/1L -> P2 Haiku 1M retenu -> P3 ciblee Opus 2M/5L -> P4 ciblee Sonnet 0 > LOW (1M reclasse LOW) : VALIDEE en 4 passes. Arbitrage 2026-09-27 : refus maintenu, levee tracee par #471. + 25-4-a-residuel-juste: review # 2026-09-27 IMPLEMENTEE — 7/7 mutations tuees ; gates 2484/2484, 826/826, E2E 222/10/19 sans regression ; prochaine etape : code review. # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (masque a l'ecran, mais rendu par GET /invoices/{id} aux cles API : amountDue = la TVA sur une facture creditee) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE ; validation : P1 Sonnet 1H/3M/1L -> P2 Haiku 1M retenu -> P3 ciblee Opus 2M/5L -> P4 ciblee Sonnet 0 > LOW (1M reclasse LOW) : VALIDEE en 4 passes. Arbitrage 2026-09-27 : refus maintenu, levee tracee par #471. 25-4-b-residuel-aux-agregats: backlog # [#416] + montant des RELANCES (TTC complet, trouve a l'inventaire) — Q1 TRANCHEE 2026-09-27 : la QR du rappel porte le RESTE DU (= TTC sans reglement), reste a payer sur le PDF et dans le texte ; point ouvert : frais de rappel non comptabilises vs trop-percu. 25-4-c-residuel-au-rapprochement: backlog # [#420] — DEUX sites : filtre SQL des candidats (HAVING total_ttc) avant le score, puis score et re-score a l'acceptation. 25-4-d-solder-le-reste: backlog # [#384] ramenee de la 25-6 le 2026-09-27 (Guy) — perte sur debiteur, escompte, frais : clore une facture partiellement reglee ; la part TVA reduit la TVA due. diff --git a/crates/kesh-api/src/errors.rs b/crates/kesh-api/src/errors.rs index 61ecab28..a93bc1f6 100644 --- a/crates/kesh-api/src/errors.rs +++ b/crates/kesh-api/src/errors.rs @@ -2563,6 +2563,36 @@ impl IntoResponse for AppError { }); (StatusCode::CONFLICT, Json(body)).into_response() } + // Story 25-4-a (#456) — l'avoir refusé sur une facture réglée, + // même en partie. ⛔ Un code et un message propres : l'ancienne + // garde rendait `ILLEGAL_STATE_TRANSITION`, dont le texte n'était + // que journalisé. Le numéro de la facture est suffixé, comme + // pour la dévalidation. + DbError::CreditNoteBlockedBySettlement { + invoice_id, + settlement_id, + invoice_number, + } => { + let base = t( + "error-credit-note-blocked-settled", + "Cette facture porte un règlement, même partiel : annulez-le d'abord pour pouvoir émettre un avoir.", + ); + let message = match invoice_number.as_deref() { + Some(numero) => format!("{base} ({numero})"), + None => base, + }; + let body = serde_json::json!({ + "error": { + "code": "CREDIT_NOTE_INVOICE_SETTLED", + "message": message, + "details": { + "invoiceId": invoice_id, + "settlementId": settlement_id, + }, + } + }); + (StatusCode::CONFLICT, Json(body)).into_response() + } // Story 25-3-a-1 (#414) — l'annulation d'un règlement refusée. // // ⚠️ Seuls les rangs que le GESTE refuse lui-même arrivent ici diff --git a/crates/kesh-api/tests/invoice_echeancier_e2e.rs b/crates/kesh-api/tests/invoice_echeancier_e2e.rs index ab43533a..99cffc3f 100644 --- a/crates/kesh-api/tests/invoice_echeancier_e2e.rs +++ b/crates/kesh-api/tests/invoice_echeancier_e2e.rs @@ -728,3 +728,116 @@ async fn a_closed_fiscal_year_is_announced_and_refused(pool: MySqlPool) { let body: serde_json::Value = resp.json().await.unwrap(); assert_eq!(body["error"]["code"], "FISCAL_YEAR_CLOSED", "got {body:?}"); } + +// --- Story 25-4-a (#455, #456) — le résiduel juste, à la frontière HTTP -------- + +async fn post_credit_note(app: &TestApp, token: &str, invoice_id: i64) -> reqwest::Response { + app.client + .post(app.url("/api/v1/credit-notes")) + .header("Authorization", format!("Bearer {token}")) + .json(&json!({ "invoiceId": invoice_id, "date": "2026-05-10" })) + .send() + .await + .unwrap() +} + +/// Lit un montant rendu par l'API : **présent, non `null`, chaîne**, parsé en +/// `Decimal` — ni comparaison de chaîne (l'échelle suit le calcul SQL), ni +/// `f64`. `null` voudrait dire « non calculé » : ce serait un échec. +fn montant(v: &serde_json::Value, champ: &str) -> rust_decimal::Decimal { + let s = v[champ] + .as_str() + .unwrap_or_else(|| panic!("`{champ}` doit être une chaîne présente, reçu {v:?}")); + s.parse::() + .unwrap_or_else(|e| panic!("`{champ}` = {s:?} n'est pas un décimal : {e}")) +} + +/// #455 — une facture à 8,1 % créditée, jamais réglée : `GET /invoices/{id}` +/// — ouverte aux clés API en lecture — rend un reste dû **nul**, et non la TVA. +#[sqlx::test(migrations = "../kesh-db/test-schema")] +async fn get_credited_invoice_reports_zero_amount_due(pool: MySqlPool) { + let (company_id, admin_id) = seed_base(&pool).await; + let contact_id = seed_contact(&pool, company_id, admin_id).await; + let (id, _v) = create_validated_invoice( + &pool, + company_id, + contact_id, + admin_id, + NaiveDate::from_ymd_opt(2026, 4, 1).unwrap(), + NaiveDate::from_ymd_opt(2026, 4, 30).unwrap(), + dec!(100.00), + ) + .await; + + let app = spawn_app(pool.clone()).await; + let token = login(&app).await; + assert_eq!(post_credit_note(&app, &token, id).await.status(), 201); + + let resp = app + .client + .get(app.url(&format!("/api/v1/invoices/{id}"))) + .header("Authorization", format!("Bearer {token}")) + .send() + .await + .unwrap(); + assert_eq!(resp.status(), 200); + let v: serde_json::Value = resp.json().await.unwrap(); + assert_eq!(v["status"], "cancelled", "anti-vacuité : l'avoir est passé"); + assert_eq!( + montant(&v, "amountDue"), + rust_decimal::Decimal::ZERO, + "et non 8.10 — got {v:?}" + ); + assert_eq!(montant(&v, "amountSettled"), rust_decimal::Decimal::ZERO); +} + +/// #456 — un avoir sur une facture réglée en partie est refusé en **409**, avec +/// son code et un message qui dit quoi faire. +#[sqlx::test(migrations = "../kesh-db/test-schema")] +async fn credit_note_on_partially_settled_invoice_is_409(pool: MySqlPool) { + let (company_id, admin_id) = seed_base(&pool).await; + let contact_id = seed_contact(&pool, company_id, admin_id).await; + let (id, _v) = create_validated_invoice( + &pool, + company_id, + contact_id, + admin_id, + NaiveDate::from_ymd_opt(2026, 4, 1).unwrap(), + NaiveDate::from_ymd_opt(2026, 4, 30).unwrap(), + dec!(100.00), + ) + .await; + let caisse = caisse_id(&pool, company_id).await; + + let app = spawn_app(pool.clone()).await; + let token = login(&app).await; + let settle = app + .client + .post(app.url(&format!("/api/v1/invoices/{id}/settlements"))) + .header("Authorization", format!("Bearer {token}")) + .json(&json!({ + "settlementType": "internal_account", + "accountId": caisse, + "amount": "40.00", + "settledOn": "2026-04-15" + })) + .send() + .await + .unwrap(); + assert_eq!(settle.status(), 200); + + let resp = post_credit_note(&app, &token, id).await; + assert_eq!(resp.status(), 409); + let v: serde_json::Value = resp.json().await.unwrap(); + assert_eq!( + v["error"]["code"], "CREDIT_NOTE_INVOICE_SETTLED", + "got {v:?}" + ); + let message = v["error"]["message"].as_str().unwrap(); + assert!( + message.starts_with("Cette facture porte un règlement, même partiel"), + "message fr attendu, reçu {message:?}" + ); + assert_eq!(v["error"]["details"]["invoiceId"], id); + assert!(v["error"]["details"]["settlementId"].as_i64().is_some()); +} diff --git a/crates/kesh-db/src/errors.rs b/crates/kesh-db/src/errors.rs index 48326cf1..402d0b39 100644 --- a/crates/kesh-db/src/errors.rs +++ b/crates/kesh-db/src/errors.rs @@ -212,9 +212,13 @@ pub enum SettlementCancelBlocker { /// rapprochement à annuler. Coupe court : aucun rang suivant ne s'évalue. BankTransactionNotReconciled, /// La facture a été **créditée** par un avoir après ce règlement. Le - /// règlement est alors un paiement **à lettrer** (Epic 15), pas une - /// anomalie — il ne s'annule pas. ⚠️ Le statut `cancelled` d'une facture - /// ne naît en production que de l'avoir (`credit_notes.rs`). + /// règlement est alors un paiement **à lettrer** (Epic 15) — il ne + /// s'annule pas. ⚠️ Le statut `cancelled` d'une facture ne naît en + /// production que de l'avoir (`credit_notes.rs`). + /// + /// ⚠️ **État hérité depuis la Story 25-4-a (#456)** : un avoir est refusé + /// sur une facture réglée, même en partie. L'état n'est plus atteignable + /// que par l'**import d'une sauvegarde antérieure** — d'où ce motif, gardé. InvoiceCredited, /// Tête **fournisseur** (Story 25-3-a-2) : la facture n'est pas `paid` — il /// n'y a pas de règlement à annuler. ⚠️ Coupe court par construction : une @@ -460,6 +464,29 @@ pub enum DbError { document_label: Option, }, + /// Un avoir ne peut pas viser cette facture : elle porte un **règlement**, + /// même partiel (Story 25-4-a, #456). + /// + /// ⛔ **Les deux conditions, jamais l'une seule** : une ligne + /// `invoice_settlements` **ou** `paid_at` posé — comme + /// [`UnvalidationBlocker::Settled`]. Depuis la 24-2, `paid_at` n'est posé + /// qu'au solde : la garde qui ne lisait que lui laissait passer une facture + /// réglée en partie, et l'avoir, qui contre-passe tout le TTC, rendait la + /// créance **créditrice** du montant encaissé. + /// + /// Conflit d'état → HTTP **409** `CREDIT_NOTE_INVOICE_SETTLED`. Remplace le + /// générique `IllegalStateTransition` de l'ancienne garde AC2bis, qui ne + /// disait ni ce qui bloquait ni quoi faire. + #[error("Avoir refusé : la facture porte un règlement")] + CreditNoteBlockedBySettlement { + invoice_id: i64, + /// Le premier règlement trouvé ; `None` quand seul `paid_at` est posé + /// (facture soldée avant la 24-2, sans ligne de règlement). + settlement_id: Option, + /// Le **numéro** de la facture, que l'utilisateur connaît. + invoice_number: Option, + }, + /// Le règlement ne peut pas être annulé (Story 25-3-a-1, #414). /// /// Conflit d'état → HTTP **409**, avec le code canonique du @@ -655,6 +682,7 @@ impl DbError { Self::AccountRoleInvalidForType { .. } => "ACCOUNT_ROLE_INVALID_FOR_TYPE", Self::InvalidRevenueAccounts(_) => "INVOICE_LINE_REVENUE_ACCOUNT_INVALID", Self::CreditNoteRevenueAccountsArchived(_) => "CREDIT_NOTE_REVENUE_ACCOUNT_ARCHIVED", + Self::CreditNoteBlockedBySettlement { .. } => "CREDIT_NOTE_INVOICE_SETTLED", // ⚠️ Le code EXPOSÉ est celui du `ReversalBlocker` (huit valeurs) ; // celui-ci n'est que le repli générique du mapping structuré. Self::EntryNotReversable { .. } => "ENTRY_NOT_REVERSABLE", diff --git a/crates/kesh-db/src/repositories/credit_notes.rs b/crates/kesh-db/src/repositories/credit_notes.rs index a0b164a7..cf79168e 100644 --- a/crates/kesh-db/src/repositories/credit_notes.rs +++ b/crates/kesh-db/src/repositories/credit_notes.rs @@ -297,16 +297,39 @@ pub async fn create_credit_note( inv.status ))); } - // AC2bis : pas d'avoir sur une facture déjà encaissée (v0.2, pas de - // flux de remboursement — éviterait un solde débiteur négatif). - Some(inv) if inv.paid_at.is_some() => { - return Err(DbError::IllegalStateTransition( - "impossible de créer un avoir sur une facture déjà payée".into(), - )); - } Some(inv) => inv, }; + // AC2bis, refondue par la Story 25-4-a (#456) : pas d'avoir sur une + // facture ENCAISSÉE, même en partie. L'avoir contre-passe tout le TTC ; + // sur une facture réglée, la créance deviendrait créditrice du montant + // encaissé, et Kesh n'a ni remboursement ni imputation pour le dénouer + // (#471 porte la levée de ce refus). + // + // ⛔ **Une ligne de règlement OU `paid_at`** — jamais `paid_at` seul : + // depuis la 24-2, il n'est posé qu'au solde. + // + // ⛔ **Lecture VERROUILLANTE, et après le verrou de la facture** (leçon + // de la 25-3-b) : sous REPEATABLE READ, une lecture simple fige + // l'instantané. Un règlement commité pendant que nous attendions le + // verrou de la facture doit être vu ici. + let settlement: Option = sqlx::query_scalar( + "SELECT id FROM invoice_settlements \ + WHERE invoice_id = ? AND company_id = ? ORDER BY id LIMIT 1 FOR UPDATE", + ) + .bind(invoice_id) + .bind(company_id) + .fetch_optional(&mut *tx) + .await + .map_err(map_db_error)?; + if settlement.is_some() || invoice.paid_at.is_some() { + return Err(DbError::CreditNoteBlockedBySettlement { + invoice_id, + settlement_id: settlement, + invoice_number: invoice.invoice_number.clone(), + }); + } + // AC3 : une seule note de crédit par facture (UNIQUE(invoice_id) en DB ; // check explicite pour une erreur métier claire plutôt qu'une FK 1062). let existing: Option = diff --git a/crates/kesh-db/src/repositories/invoice_settlements.rs b/crates/kesh-db/src/repositories/invoice_settlements.rs index d2c85887..0261a9b0 100644 --- a/crates/kesh-db/src/repositories/invoice_settlements.rs +++ b/crates/kesh-db/src/repositories/invoice_settlements.rs @@ -20,13 +20,14 @@ const COLUMNS: &str = "id, company_id, invoice_id, journal_entry_id, amount, set use crate::entities::{InvoiceSettlement, NewInvoiceSettlement}; use crate::errors::{DbError, map_db_error}; +use crate::repositories::invoices::line_ttc_sql; /// Forme **scalaire par facture** du total réglé — sous-requête corrélée. /// **Prérequis : alias `i` sur `invoices`.** /// /// Miroir exact de [`INVOICE_SETTLED_DERIVED_JOIN_SQL`], qui en est la forme /// agrégée. Les deux doivent rester d'accord : c'est ce que vérifie le test de -/// parité. +/// parité (`tests/invoice_amount_due_parity.rs`). /// /// ⚠️ Même discipline que `INVOICE_TTC_SUBQUERY_SQL` (`invoices.rs`) : la forme /// corrélée sert **une** facture, jamais une liste — elle y serait ré-évaluée @@ -40,22 +41,44 @@ pub const INVOICE_SETTLED_SUBQUERY_SQL: &str = pub const INVOICE_SETTLED_DERIVED_JOIN_SQL: &str = "LEFT JOIN (SELECT invoice_id, SUM(amount) AS settled \ FROM invoice_settlements GROUP BY invoice_id) st ON st.invoice_id = i.id"; -/// Forme **scalaire par facture** de l'avoir émis — `0` s'il n'y en a pas. -/// **Prérequis : alias `i` sur `invoices`.** +/// Forme **scalaire par facture** de l'avoir émis, **TTC** — `0` s'il n'y en +/// a pas. **Prérequis : alias `i` sur `invoices`.** +/// +/// ⛔ **TTC, arrondi ligne par ligne** — la grandeur que l'écriture de l'avoir +/// porte au crédit de la créance (`credit_notes::generate_credit_note_journal_lines` : +/// `total_ht + total_vat`, TVA par [`kesh_core::accounting::vat::line_vat_amount`]). +/// Le résiduel soustrait ce terme d'un TTC : il doit être dans la même unité. +/// **Jamais `credit_notes.total_amount`**, qui est **HT** (miroir de +/// `invoices.total_amount`) : le lire ici laissait la TVA d'une facture +/// créditée en reste dû (#455, Story 25-4-a). /// /// ⚠️ **Seul un avoir `issued` compte.** Les statuts sont /// `draft / issued / cancelled` (`chk_credit_notes_status`) : un brouillon n'a /// pas d'écriture et n'éteint donc rien. `credit_notes.invoice_id` est /// `NOT NULL UNIQUE` — au plus un avoir par facture, la somme est donc une /// commodité de forme, pas un cumul réel. -pub const INVOICE_CREDITED_SUBQUERY_SQL: &str = "(SELECT COALESCE(SUM(cn.total_amount), 0) FROM credit_notes cn \ - WHERE cn.invoice_id = i.id AND cn.status = 'issued')"; +pub const INVOICE_CREDITED_SUBQUERY_SQL: &str = concat!( + "(SELECT COALESCE(SUM(", + line_ttc_sql!("cl."), + "), 0) FROM credit_note_lines cl \ + INNER JOIN credit_notes cn ON cn.id = cl.credit_note_id \ + WHERE cn.invoice_id = i.id AND cn.status = 'issued')" +); -/// Forme **agrégat multi-factures** de l'avoir émis — alias `cnt`. -/// **Prérequis : alias `i` sur `invoices`.** -pub const INVOICE_CREDITED_DERIVED_JOIN_SQL: &str = "LEFT JOIN (SELECT invoice_id, SUM(total_amount) AS credited \ - FROM credit_notes WHERE status = 'issued' GROUP BY invoice_id) cnt \ - ON cnt.invoice_id = i.id"; +/// Forme **agrégat multi-factures** de l'avoir émis, **TTC** — table dérivée +/// à joindre (alias `cnt`), puis `COALESCE(cnt.credited, 0)` côté requête +/// externe. **Prérequis : alias `i` sur `invoices`.** +/// +/// Miroir exact de [`INVOICE_CREDITED_SUBQUERY_SQL`] — même unité, même +/// arrondi ; les deux sont tenues d'accord par le test de parité +/// (`tests/invoice_amount_due_parity.rs`). +pub const INVOICE_CREDITED_DERIVED_JOIN_SQL: &str = concat!( + "LEFT JOIN (SELECT cn.invoice_id, SUM(", + line_ttc_sql!("cl."), + ") AS credited FROM credit_note_lines cl \ + INNER JOIN credit_notes cn ON cn.id = cl.credit_note_id \ + WHERE cn.status = 'issued' GROUP BY cn.invoice_id) cnt ON cnt.invoice_id = i.id" +); /// Enregistre un règlement dans la transaction courante. /// @@ -121,6 +144,10 @@ where /// Ce qui reste dû sur une facture : `TTC − avoir émis − Σ règlements`. /// +/// ⛔ **Trois termes TTC.** Le TTC de la facture et celui de l'avoir sont +/// arrondis ligne par ligne par la même formule (`line_ttc_sql!`) ; les +/// règlements sont des montants encaissés, donc TTC par nature. +/// /// ⚠️ **Calculé, jamais stocké.** C'est la seule source de vérité du « combien /// reste-t-il ? », et elle est adossée aux mêmes données que le grand livre. /// diff --git a/crates/kesh-db/src/repositories/invoice_settlements_write.rs b/crates/kesh-db/src/repositories/invoice_settlements_write.rs index 6b7d692f..415b747c 100644 --- a/crates/kesh-db/src/repositories/invoice_settlements_write.rs +++ b/crates/kesh-db/src/repositories/invoice_settlements_write.rs @@ -328,6 +328,9 @@ pub async fn settlement_cancel_blocker_unlinking( // `validated` ou `cancelled` : l'encaissement exige `validated`, la // dévalidation refuse une facture réglée, et `cancelled` ne naît en // production que de l'avoir. Hors `validated`, c'est donc un avoir. + // ⚠️ Depuis la Story 25-4-a (#456), l'avoir est refusé sur une facture + // réglée : ce rang ne se déclenche plus que sur un état HÉRITÉ, ramené par + // l'import d'une sauvegarde antérieure. if status != "validated" { return Ok(Some((SettlementCancelBlocker::InvoiceCredited, None, None))); } diff --git a/crates/kesh-db/src/repositories/invoices.rs b/crates/kesh-db/src/repositories/invoices.rs index b62c4e68..526bbc5a 100644 --- a/crates/kesh-db/src/repositories/invoices.rs +++ b/crates/kesh-db/src/repositories/invoices.rs @@ -147,7 +147,32 @@ pub enum PausedFilter { NotPaused, } -/// Paramètres de recherche, tri et pagination. +/// **Source unique** de la formule SQL du TTC d'UNE ligne (facture ou avoir) — +/// Story 25-4-a (#455). Rend un **littéral** (`concat!`), pour que les +/// constantes qui la composent restent des `&'static str`. +/// +/// `$p` est le préfixe de colonne : `"l."`, `"cl."`, ou `""` dans une table +/// dérivée sans alias. Arrondi **par ligne**, half-away-from-zero : miroir de +/// `kesh_core::accounting::vat::line_vat_amount`, que l'écriture de vente +/// comme celle de l'avoir emploient. +/// +/// ⛔ Ne pas recopier la formule à la main : la TVA de l'avoir a été soustraite +/// au HT pendant des mois (#455) parce que la grandeur « avoir » n'empruntait +/// pas cette formule-ci. +macro_rules! line_ttc_sql { + ($p:literal) => { + concat!( + $p, + "line_total + ROUND(", + $p, + "line_total * ", + $p, + "vat_rate / 100, 2)" + ) + }; +} +pub(crate) use line_ttc_sql; + /// Forme **scalaire par facture** du TTC canonique (#246, Story 21-2a) — /// sous-requête corrélée. **Prérequis : alias `i` sur `invoices`.** /// @@ -158,8 +183,11 @@ pub enum PausedFilter { /// /// `pub` (PAS `pub(crate)`) : consommée par `repositories::reconciliation` /// (21-2b) et par `kesh-report` (balance âgée 21-7) — source de vérité unique. -pub const INVOICE_TTC_SUBQUERY_SQL: &str = "(SELECT COALESCE(SUM(l.line_total + ROUND(l.line_total * l.vat_rate / 100, 2)), 0) \ - FROM invoice_lines l WHERE l.invoice_id = i.id)"; +pub const INVOICE_TTC_SUBQUERY_SQL: &str = concat!( + "(SELECT COALESCE(SUM(", + line_ttc_sql!("l."), + "), 0) FROM invoice_lines l WHERE l.invoice_id = i.id)" +); /// Forme **agrégat multi-factures** du TTC canonique (#246) — table dérivée à /// joindre (alias `lt`), puis `SUM(COALESCE(lt.ttc, 0))` côté requête externe. @@ -168,9 +196,11 @@ pub const INVOICE_TTC_SUBQUERY_SQL: &str = "(SELECT COALESCE(SUM(l.line_total + /// Choix de la table dérivée plutôt que la corrélée dans le `SUM()` externe : /// raison de **performance** (la corrélée serait ré-évaluée par ligne et par /// `CASE`), pas un interdit SQL (MariaDB accepte les deux — vérifié). -pub const INVOICE_TTC_DERIVED_JOIN_SQL: &str = "LEFT JOIN (SELECT invoice_id, \ - SUM(line_total + ROUND(line_total * vat_rate / 100, 2)) AS ttc \ - FROM invoice_lines GROUP BY invoice_id) lt ON lt.invoice_id = i.id"; +pub const INVOICE_TTC_DERIVED_JOIN_SQL: &str = concat!( + "LEFT JOIN (SELECT invoice_id, SUM(", + line_ttc_sql!(""), + ") AS ttc FROM invoice_lines GROUP BY invoice_id) lt ON lt.invoice_id = i.id" +); /// TTC canonique d'UNE facture (#246) via la forme scalaire — pour les /// call-sites qui n'ont pas les lignes chargées (ex. re-score de la @@ -189,6 +219,7 @@ where .map_err(map_db_error) } +/// Paramètres de recherche, tri et pagination. #[derive(Debug, Clone, Default)] pub struct InvoiceListQuery { pub search: Option, diff --git a/crates/kesh-db/tests/credit_notes_repository.rs b/crates/kesh-db/tests/credit_notes_repository.rs index f5f97df7..0c16ade8 100644 --- a/crates/kesh-db/tests/credit_notes_repository.rs +++ b/crates/kesh-db/tests/credit_notes_repository.rs @@ -10,9 +10,9 @@ use chrono::NaiveDate; use kesh_db::entities::contact::{ContactType, NewContact}; -use kesh_db::entities::{NewCreditNote, NewInvoice, NewInvoiceLine}; +use kesh_db::entities::{NewCreditNote, NewInvoice, NewInvoiceLine, SettlementChoice}; use kesh_db::errors::DbError; -use kesh_db::repositories::{contacts, credit_notes, invoices}; +use kesh_db::repositories::{contacts, credit_notes, invoice_settlements_write, invoices}; use kesh_db::test_fixtures::{SeededCompany, seed_accounting_company}; use rust_decimal::Decimal; use rust_decimal_macros::dec; @@ -290,9 +290,18 @@ async fn credit_note_refused_on_paid_invoice(pool: MySqlPool) { ) .await .unwrap_err(); + // Story 25-4-a (#456) : la garde AC2bis rend sa variante dédiée, plus le + // générique — le motif « payée » et le motif « réglée en partie » sont un + // seul et même refus. `settlement_id` est `None` : seul `paid_at` est posé. assert!( - matches!(err, DbError::IllegalStateTransition(_)), - "refus facture payée" + matches!( + err, + DbError::CreditNoteBlockedBySettlement { + settlement_id: None, + .. + } + ), + "refus facture payée — reçu {err:?}" ); } @@ -423,3 +432,225 @@ async fn credit_note_inherits_project_and_nets_to_zero(pool: MySqlPool) { .unwrap(); assert_eq!(debit, credit, "net par projet doit être 0 après l'avoir"); } + +// ─── Story 25-4-a (#456) — pas d'avoir sur une facture réglée, même en partie ─── + +async fn settle(pool: &MySqlPool, seeded: &SeededCompany, invoice_id: i64, amount: Decimal) -> i64 { + let out = invoice_settlements_write::settle_invoice( + pool, + seeded.admin_user_id, + seeded.company_id, + invoice_id, + SettlementChoice::InternalAccount { + account_id: seeded.accounts["1000"], + }, + amount, + d(2026, 6, 20), + ) + .await + .expect("règlement"); + sqlx::query_scalar("SELECT id FROM invoice_settlements WHERE journal_entry_id = ?") + .bind(out.journal_entry_id) + .fetch_one(pool) + .await + .expect("ligne de règlement") +} + +async fn try_credit( + pool: &MySqlPool, + seeded: &SeededCompany, + invoice_id: i64, +) -> Result { + credit_notes::create_credit_note( + pool, + NewCreditNote { + company_id: seeded.company_id, + invoice_id, + date: d(2026, 7, 1), + }, + seeded.admin_user_id, + ) + .await +} + +/// Ce qu'un refus ne doit pas avoir touché : avoirs, statut et version de la +/// facture, solde de la créance, séquence de numéros d'avoir. +async fn empreinte( + pool: &MySqlPool, + seeded: &SeededCompany, + invoice_id: i64, +) -> (i64, String, i32, Decimal, i64) { + let avoirs: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM credit_notes WHERE company_id = ?") + .bind(seeded.company_id) + .fetch_one(pool) + .await + .unwrap(); + let (status, version): (String, i32) = + sqlx::query_as("SELECT status, version FROM invoices WHERE id = ?") + .bind(invoice_id) + .fetch_one(pool) + .await + .unwrap(); + let creance: Decimal = sqlx::query_scalar( + "SELECT COALESCE(SUM(debit) - SUM(credit), 0) FROM journal_entry_lines WHERE account_id = ?", + ) + .bind(seeded.accounts["1100"]) + .fetch_one(pool) + .await + .unwrap(); + let sequence: i64 = sqlx::query_scalar( + "SELECT CAST(COALESCE(SUM(next_number), 0) AS SIGNED) FROM credit_note_number_sequences WHERE company_id = ?", + ) + .bind(seeded.company_id) + .fetch_one(pool) + .await + .unwrap(); + (avoirs, status, version, creance, sequence) +} + +/// AC 9, AC 10 — une facture réglée en partie (`paid_at` NULL) est refusée, et +/// **rien n'est écrit**. C'est le chemin que l'ancienne garde laissait passer. +#[sqlx::test(migrations = "./test-schema")] +async fn credit_note_refused_on_partially_settled_invoice(pool: MySqlPool) { + let seeded = seed_accounting_company(&pool).await.unwrap(); + let contact = make_contact(&pool, seeded.company_id, seeded.admin_user_id).await; + let invoice_id = + create_and_validate(&pool, &seeded, contact, &[(dec!(8.10), dec!(100.00))]).await; + let sid = settle(&pool, &seeded, invoice_id, dec!(40.00)).await; + + let paid_at: Option = + sqlx::query_scalar("SELECT paid_at FROM invoices WHERE id = ?") + .bind(invoice_id) + .fetch_one(&pool) + .await + .unwrap(); + assert!( + paid_at.is_none(), + "anti-vacuité : la facture n'est PAS soldée" + ); + + let avant = empreinte(&pool, &seeded, invoice_id).await; + let err = try_credit(&pool, &seeded, invoice_id).await.unwrap_err(); + match &err { + DbError::CreditNoteBlockedBySettlement { + invoice_id: iid, + settlement_id, + invoice_number, + } => { + assert_eq!(*iid, invoice_id); + assert_eq!(*settlement_id, Some(sid)); + assert!(invoice_number.is_some(), "le numéro est rendu"); + } + other => panic!("attendu CreditNoteBlockedBySettlement, reçu {other:?}"), + } + assert_eq!(err.error_code(), "CREDIT_NOTE_INVOICE_SETTLED"); + assert_eq!( + empreinte(&pool, &seeded, invoice_id).await, + avant, + "rien n'est écrit" + ); +} + +/// La promesse du message : annuler le règlement rouvre l'avoir. +#[sqlx::test(migrations = "./test-schema")] +async fn credit_note_accepted_after_the_settlement_is_cancelled(pool: MySqlPool) { + let seeded = seed_accounting_company(&pool).await.unwrap(); + let contact = make_contact(&pool, seeded.company_id, seeded.admin_user_id).await; + let invoice_id = + create_and_validate(&pool, &seeded, contact, &[(dec!(8.10), dec!(100.00))]).await; + let sid = settle(&pool, &seeded, invoice_id, dec!(40.00)).await; + assert!(try_credit(&pool, &seeded, invoice_id).await.is_err()); + + invoice_settlements_write::cancel_settlement( + &pool, + seeded.admin_user_id, + seeded.company_id, + invoice_id, + sid, + ) + .await + .expect("annulation du règlement"); + + try_credit(&pool, &seeded, invoice_id) + .await + .expect("l'avoir passe une fois le règlement annulé"); +} + +/// AC 9 — ⛔ **entrelacement** : un règlement commité PENDANT que l'avoir +/// attend le verrou de la facture doit être vu. +/// +/// 1. une transaction verrouille la facture et y rattache un règlement, sans +/// valider ; +/// 2. l'avoir démarre et attend au `FOR UPDATE` de la facture ; +/// 3. la transaction est validée. +/// +/// La garde lit les règlements **après** le verrou, par une lecture +/// verrouillante : elle voit la ligne et refuse. Lue **avant** le verrou, en +/// lecture simple, elle aurait vu « aucun règlement » et laissé passer. +/// +/// Le règlement vient du vrai chemin, sur une facture auxiliaire : seul son +/// rattachement se fait dans la transaction concurrente. +#[sqlx::test(migrations = "./test-schema")] +async fn credit_note_waits_for_a_concurrent_settlement(pool: MySqlPool) { + let seeded = seed_accounting_company(&pool).await.unwrap(); + let contact = make_contact(&pool, seeded.company_id, seeded.admin_user_id).await; + let invoice_id = + create_and_validate(&pool, &seeded, contact, &[(dec!(8.10), dec!(100.00))]).await; + let parking = create_and_validate(&pool, &seeded, contact, &[(dec!(8.10), dec!(100.00))]).await; + let sid = settle(&pool, &seeded, parking, dec!(40.00)).await; + + // (1) Le règlement concurrent, non validé, qui tient la facture. + let mut concurrent = pool.begin().await.unwrap(); + sqlx::query("SELECT id FROM invoices WHERE id = ? FOR UPDATE") + .bind(invoice_id) + .execute(&mut *concurrent) + .await + .unwrap(); + sqlx::query("UPDATE invoice_settlements SET invoice_id = ? WHERE id = ?") + .bind(invoice_id) + .bind(sid) + .execute(&mut *concurrent) + .await + .unwrap(); + + // (2) L'avoir démarre et attend. + let p = pool.clone(); + let (company_id, user_id) = (seeded.company_id, seeded.admin_user_id); + let avoir = tokio::spawn(async move { + credit_notes::create_credit_note( + &p, + NewCreditNote { + company_id, + invoice_id, + date: d(2026, 7, 1), + }, + user_id, + ) + .await + }); + let vue = kesh_db::test_fixtures::attendre_une_requete_en_cours( + &pool, + &["FROM invoices", "FOR UPDATE"], + || avoir.is_finished(), + ) + .await; + if !vue { + panic!("l'avoir a fini sans attendre le verrou : {:?}", avoir.await); + } + + // (3) Le règlement concurrent est validé. + concurrent.commit().await.unwrap(); + + let result = avoir.await.expect("tâche d'avoir"); + assert!( + matches!( + result, + Err(DbError::CreditNoteBlockedBySettlement { + settlement_id: Some(s), + .. + }) if s == sid + ), + "l'avoir devait attendre le règlement puis refuser — reçu {:?}", + result.map(|c| c.credit_note.id) + ); +} diff --git a/crates/kesh-db/tests/invoice_amount_due_parity.rs b/crates/kesh-db/tests/invoice_amount_due_parity.rs new file mode 100644 index 00000000..79523b62 --- /dev/null +++ b/crates/kesh-db/tests/invoice_amount_due_parity.rs @@ -0,0 +1,311 @@ +//! Le résiduel juste — Story 25-4-a (#455, #456). +//! +//! `amount_due` = `TTC − avoir émis − Σ règlements`. Trois garanties : +//! +//! 1. **L'avoir est compté TTC** (#455) : le terme « avoir » vaut le crédit que +//! l'écriture de l'avoir porte à la créance — pas `credit_notes.total_amount`, +//! qui est HT. C'est l'assertion de **concordance avec le grand livre** qui le +//! prouve, pas une valeur recalculée à côté. +//! 2. **Les formes scalaire et jointe sont d'accord**, facture par facture, pour le +//! réglé comme pour l'avoir — le test de parité que le doc-comment +//! d'`INVOICE_SETTLED_SUBQUERY_SQL` annonçait sans qu'il existe. Les formes +//! jointes n'avaient aucun appelant ; 25-4-b en sera le premier. +//! 3. **Chaque facture porte une TVA non nulle.** À 0 %, HT = TTC et #455 est +//! invisible — c'est ainsi qu'il a passé tous les tests de la 24-2. +//! +//! Pré-requis : MariaDB démarré (`sqlx::test` crée une DB éphémère par test). + +use chrono::NaiveDate; +use kesh_db::entities::contact::{ContactType, NewContact}; +use kesh_db::entities::{NewCreditNote, NewInvoice, NewInvoiceLine, SettlementChoice}; +use kesh_db::repositories::invoice_settlements::{ + INVOICE_CREDITED_DERIVED_JOIN_SQL, INVOICE_CREDITED_SUBQUERY_SQL, + INVOICE_SETTLED_DERIVED_JOIN_SQL, INVOICE_SETTLED_SUBQUERY_SQL, amount_due, +}; +use kesh_db::repositories::{contacts, credit_notes, invoice_settlements_write, invoices}; +use kesh_db::test_fixtures::{SeededCompany, seed_accounting_company}; +use rust_decimal::Decimal; +use rust_decimal_macros::dec; +use sqlx::MySqlPool; + +fn d(y: i32, m: u32, day: u32) -> NaiveDate { + NaiveDate::from_ymd_opt(y, m, day).unwrap() +} + +async fn make_contact(pool: &MySqlPool, seeded: &SeededCompany) -> i64 { + contacts::create( + pool, + seeded.admin_user_id, + NewContact { + company_id: seeded.company_id, + contact_type: ContactType::Entreprise, + name: "Client Résiduel".into(), + first_name: None, + last_name: None, + is_client: true, + is_supplier: false, + address: Some("Rue 1\n1000 Lausanne".into()), + address_street: None, + address_building: None, + address_postal_code: None, + address_city: None, + address_country: None, + email: None, + phone: None, + ide_number: None, + client_number: None, + default_payment_terms: Some("30".into()), + default_payment_terms_days: None, + language: None, + salutation: kesh_db::entities::contact::Salutation::Neutre, + }, + ) + .await + .expect("contact") + .id +} + +/// Une facture validée par le **vrai chemin** (écriture de vente TVA comprise) — +/// jamais par le helper à 0 % de `invoice_settlement.rs`. +async fn validated( + pool: &MySqlPool, + seeded: &SeededCompany, + contact_id: i64, + lines: &[(Decimal, Decimal)], +) -> i64 { + let new = NewInvoice { + company_id: seeded.company_id, + contact_id, + date: d(2026, 6, 15), + due_date: None, + payment_terms: None, + lines: lines + .iter() + .map(|(rate, price)| NewInvoiceLine { + revenue_account_id: None, + description: "Ligne".into(), + quantity: dec!(1), + unit_price: *price, + vat_rate: *rate, + }) + .collect(), + project_id: None, + }; + let (inv, _) = invoices::create(pool, seeded.admin_user_id, new) + .await + .expect("create invoice"); + invoices::validate_invoice(pool, seeded.company_id, inv.id, seeded.admin_user_id) + .await + .expect("validate invoice"); + inv.id +} + +async fn settle(pool: &MySqlPool, seeded: &SeededCompany, invoice_id: i64, amount: Decimal) -> i64 { + invoice_settlements_write::settle_invoice( + pool, + seeded.admin_user_id, + seeded.company_id, + invoice_id, + SettlementChoice::InternalAccount { + account_id: seeded.accounts["1000"], + }, + amount, + d(2026, 6, 20), + ) + .await + .expect("règlement") + .journal_entry_id +} + +async fn credit( + pool: &MySqlPool, + seeded: &SeededCompany, + invoice_id: i64, +) -> credit_notes::IssuedCreditNote { + credit_notes::create_credit_note( + pool, + NewCreditNote { + company_id: seeded.company_id, + invoice_id, + date: d(2026, 7, 1), + }, + seeded.admin_user_id, + ) + .await + .expect("avoir") +} + +/// L'état hérité **règlement puis avoir**, que 25-4-a rend inatteignable par +/// l'application mais qu'un `.keshbackup` v0.12.0 peut ramener. +/// +/// Gabarit « détacher, créditer, rattacher » (AC 13) : les deux écritures +/// viennent des **vrais chemins** ; seul le rattachement de la ligne de +/// règlement passe en SQL, le temps de l'avoir. +async fn settle_then_legacy_credit( + pool: &MySqlPool, + seeded: &SeededCompany, + contact_id: i64, + invoice_id: i64, + amount: Decimal, +) { + settle(pool, seeded, invoice_id, amount).await; + let parking = validated(pool, seeded, contact_id, &[(dec!(8.10), dec!(10.00))]).await; + sqlx::query("UPDATE invoice_settlements SET invoice_id = ? WHERE invoice_id = ?") + .bind(parking) + .bind(invoice_id) + .execute(pool) + .await + .expect("détacher"); + credit(pool, seeded, invoice_id).await; + sqlx::query("UPDATE invoice_settlements SET invoice_id = ? WHERE invoice_id = ?") + .bind(invoice_id) + .bind(parking) + .execute(pool) + .await + .expect("rattacher"); +} + +async fn credited_scalar(pool: &MySqlPool, invoice_id: i64) -> Decimal { + sqlx::query_scalar(&format!( + "SELECT {INVOICE_CREDITED_SUBQUERY_SQL} FROM invoices i WHERE i.id = ?" + )) + .bind(invoice_id) + .fetch_one(pool) + .await + .expect("avoir scalaire") +} + +/// AC 1, AC 7 — ⛔ le terme « avoir » du résiduel égale le crédit que +/// l'écriture de l'avoir porte à la créance. Multi-taux, arrondis limites. +#[sqlx::test(migrations = "./test-schema")] +async fn credited_amount_is_ttc_and_matches_the_ledger(pool: MySqlPool) { + let seeded = seed_accounting_company(&pool).await.unwrap(); + let contact = make_contact(&pool, &seeded).await; + let invoice_id = validated( + &pool, + &seeded, + contact, + &[ + (dec!(8.10), dec!(1000.00)), + (dec!(2.60), dec!(123.45)), + (dec!(8.10), dec!(0.05)), + ], + ) + .await; + + let issued = credit(&pool, &seeded, invoice_id).await; + let receivable = seeded.accounts["1100"]; + let ledger_credit: Decimal = issued + .journal_entry + .lines + .iter() + .filter(|l| l.account_id == receivable) + .map(|l| l.credit) + .sum(); + + // 1000 + 81.00 ; 123.45 + 3.21 ; 0.05 + 0.00 (sous-centime) = 1207.71 + assert_eq!(ledger_credit, dec!(1207.71), "crédit créance de l'avoir"); + assert_eq!(credited_scalar(&pool, invoice_id).await, ledger_credit); + assert_ne!( + issued.credit_note.total_amount, ledger_credit, + "le montant stocké est HT : s'il égalait le crédit, le test ne distinguerait rien" + ); +} + +/// AC 8 — facture créditée, jamais réglée : il ne reste rien à payer. +#[sqlx::test(migrations = "./test-schema")] +async fn amount_due_of_a_credited_invoice_is_zero(pool: MySqlPool) { + let seeded = seed_accounting_company(&pool).await.unwrap(); + let contact = make_contact(&pool, &seeded).await; + let invoice_id = validated(&pool, &seeded, contact, &[(dec!(8.10), dec!(100.00))]).await; + credit(&pool, &seeded, invoice_id).await; + + assert_eq!( + amount_due(&pool, invoice_id).await.unwrap(), + Decimal::ZERO, + "et non 8.10, la TVA (#455)" + ); +} + +/// AC 8 — l'état hérité : 40 encaissés sur une vente annulée. Le reste dû vaut +/// −40, un trop-perçu visible — pas `TVA − 40`, et pas écrêté à zéro. +#[sqlx::test(migrations = "./test-schema")] +async fn amount_due_after_settlement_then_legacy_credit_is_minus_settled(pool: MySqlPool) { + let seeded = seed_accounting_company(&pool).await.unwrap(); + let contact = make_contact(&pool, &seeded).await; + let invoice_id = validated(&pool, &seeded, contact, &[(dec!(8.10), dec!(100.00))]).await; + settle_then_legacy_credit(&pool, &seeded, contact, invoice_id, dec!(40.00)).await; + + assert_eq!(amount_due(&pool, invoice_id).await.unwrap(), dec!(-40.00)); +} + +/// AC 6 — la forme scalaire et la forme jointe rendent la même valeur, facture +/// par facture, pour le réglé et pour l'avoir. Jeu : sans règlement, un +/// règlement, deux règlements, avoir émis, avoir brouillon, état hérité. +#[sqlx::test(migrations = "./test-schema")] +async fn settled_and_credited_forms_are_at_parity(pool: MySqlPool) { + let seeded = seed_accounting_company(&pool).await.unwrap(); + let contact = make_contact(&pool, &seeded).await; + let lines = [(dec!(8.10), dec!(100.00)), (dec!(2.60), dec!(33.33))]; + + let _plain = validated(&pool, &seeded, contact, &lines).await; + let one = validated(&pool, &seeded, contact, &lines).await; + settle(&pool, &seeded, one, dec!(40.00)).await; + let two = validated(&pool, &seeded, contact, &lines).await; + settle(&pool, &seeded, two, dec!(40.00)).await; + settle(&pool, &seeded, two, dec!(12.34)).await; + let credited = validated(&pool, &seeded, contact, &lines).await; + credit(&pool, &seeded, credited).await; + let legacy = validated(&pool, &seeded, contact, &lines).await; + settle_then_legacy_credit(&pool, &seeded, contact, legacy, dec!(25.00)).await; + + // Avoir BROUILLON : sans écriture, il n'éteint rien — monté en SQL, aucun + // chemin applicatif ne produisant de brouillon (single-step, DC5). + let draft_target = validated(&pool, &seeded, contact, &lines).await; + let cn = sqlx::query( + "INSERT INTO credit_notes (company_id, invoice_id, contact_id, date, status, total_amount) \ + VALUES (?, ?, ?, ?, 'draft', 133.33)", + ) + .bind(seeded.company_id) + .bind(draft_target) + .bind(contact) + .bind(d(2026, 7, 1)) + .execute(&pool) + .await + .expect("avoir brouillon"); + sqlx::query( + "INSERT INTO credit_note_lines (credit_note_id, position, description, quantity, unit_price, vat_rate, line_total) \ + VALUES (?, 1, 'Ligne', 1, 100.00, 8.10, 100.00)", + ) + .bind(cn.last_insert_id()) + .execute(&pool) + .await + .expect("ligne d'avoir brouillon"); + + let rows: Vec<(i64, Decimal, Decimal, Decimal, Decimal)> = sqlx::query_as(&format!( + "SELECT i.id, {INVOICE_SETTLED_SUBQUERY_SQL}, COALESCE(st.settled, 0), \ + {INVOICE_CREDITED_SUBQUERY_SQL}, COALESCE(cnt.credited, 0) \ + FROM invoices i {INVOICE_SETTLED_DERIVED_JOIN_SQL} {INVOICE_CREDITED_DERIVED_JOIN_SQL} \ + WHERE i.company_id = ? ORDER BY i.id" + )) + .bind(seeded.company_id) + .fetch_all(&pool) + .await + .expect("parité"); + + // Six factures du jeu, plus la facture auxiliaire du gabarit. + assert_eq!(rows.len(), 7, "le jeu entier est lu : {rows:?}"); + for (id, settled_s, settled_j, credited_s, credited_j) in &rows { + assert_eq!(settled_s, settled_j, "réglé, facture {id}"); + assert_eq!(credited_s, credited_j, "avoir, facture {id}"); + } + // Anti-vacuité : la parité porte sur des valeurs NON nulles des deux côtés. + let by_id = |x: i64| rows.iter().find(|r| r.0 == x).unwrap(); + assert_eq!(by_id(two).1, dec!(52.34)); + assert_eq!(by_id(credited).3, dec!(142.30)); // 100 + 8.10 ; 33.33 + 0.87 + assert_eq!( + by_id(draft_target).3, + Decimal::ZERO, + "un brouillon n'éteint rien" + ); +} diff --git a/crates/kesh-db/tests/invoice_settlement.rs b/crates/kesh-db/tests/invoice_settlement.rs index 0f01479f..f14d1f21 100644 --- a/crates/kesh-db/tests/invoice_settlement.rs +++ b/crates/kesh-db/tests/invoice_settlement.rs @@ -974,6 +974,25 @@ async fn monter(pool: &MySqlPool, motifs: &[SettlementCancelBlocker]) -> (Seeded .await; if motifs.contains(&SettlementCancelBlocker::InvoiceCredited) { + // ⚠️ **État HÉRITÉ, plus atteignable par l'application** depuis la + // Story 25-4-a (#456) : un avoir est désormais refusé sur une facture + // réglée, même en partie. Il reste possible par l'**import d'une + // sauvegarde antérieure** — c'est ce qui justifie de garder le motif + // `InvoiceCredited` et ce montage. + // + // Gabarit « détacher, créditer, rattacher » : les deux écritures + // (règlement, avoir) viennent des VRAIS chemins ; seul le rattachement + // de la ligne de règlement passe en SQL, le temps de l'avoir. La + // facture auxiliaire est datée dans l'exercice seedé, que le cas + // « aucun exercice ouvert » garde valide. + let parking = + validated_invoice(pool, &seeded, dec!(10.00), d - chrono::Duration::days(20)).await; + sqlx::query("UPDATE invoice_settlements SET invoice_id = ? WHERE id = ?") + .bind(parking) + .bind(sid) + .execute(pool) + .await + .expect("détacher le règlement"); credit_notes::create_credit_note( pool, kesh_db::entities::NewCreditNote { @@ -984,7 +1003,13 @@ async fn monter(pool: &MySqlPool, motifs: &[SettlementCancelBlocker]) -> (Seeded seeded.admin_user_id, ) .await - .expect("avoir après règlement partiel — le vrai chemin l'accepte"); + .expect("avoir sur la facture détachée de son règlement"); + sqlx::query("UPDATE invoice_settlements SET invoice_id = ? WHERE id = ?") + .bind(inv_id) + .bind(sid) + .execute(pool) + .await + .expect("rattacher le règlement"); } if motifs.contains(&SettlementCancelBlocker::MatchedBankTransaction) { match_to_bank( diff --git a/crates/kesh-i18n/locales/de-CH/messages.ftl b/crates/kesh-i18n/locales/de-CH/messages.ftl index 3a86241f..6c151ed9 100644 --- a/crates/kesh-i18n/locales/de-CH/messages.ftl +++ b/crates/kesh-i18n/locales/de-CH/messages.ftl @@ -24,6 +24,7 @@ error-journal-entry-linked-to-invoice = Diese Buchung stammt aus einer freigegeb error-check-constraint = Ungültiger Wert error-illegal-state = Unzulässiger Statusübergang error-invoice-unvalidate-blocked-settled = Diese Rechnung weist eine — auch nur teilweise — Zahlung auf: stornieren Sie diese zuerst. +error-credit-note-blocked-settled = Diese Rechnung weist eine — auch nur teilweise — Zahlung auf: Stornieren Sie diese zuerst, um eine Gutschrift ausstellen zu können. error-invoice-unvalidate-blocked-credited = Diese Rechnung wurde durch eine Gutschrift korrigiert, die bereits die Korrektur darstellt. error-invoice-unvalidate-blocked-reminders = Diese Rechnung hat eine Mahnhistorie: deren Löschung würde den Nachweis des Inkassos vernichten. error-invoice-unvalidate-blocked-emailed = Diese Rechnung wurde dem Kunden zugestellt: korrigieren Sie sie mit einer Gutschrift. diff --git a/crates/kesh-i18n/locales/en-CH/messages.ftl b/crates/kesh-i18n/locales/en-CH/messages.ftl index fe0684f0..92ffd928 100644 --- a/crates/kesh-i18n/locales/en-CH/messages.ftl +++ b/crates/kesh-i18n/locales/en-CH/messages.ftl @@ -24,6 +24,7 @@ error-journal-entry-linked-to-invoice = This journal entry was generated by a va error-check-constraint = Invalid value error-illegal-state = Illegal state transition error-invoice-unvalidate-blocked-settled = This invoice carries a payment, even a partial one: cancel it first. +error-credit-note-blocked-settled = This invoice carries a payment, even a partial one: cancel it first to be able to issue a credit note. error-invoice-unvalidate-blocked-credited = This invoice is credited by a credit note, which is already the correction. error-invoice-unvalidate-blocked-reminders = This invoice has a reminder history: removing it would erase the proof of collection. error-invoice-unvalidate-blocked-emailed = This invoice was sent to the client: correct it with a credit note. diff --git a/crates/kesh-i18n/locales/fr-CH/messages.ftl b/crates/kesh-i18n/locales/fr-CH/messages.ftl index 8aaa3a6a..9e47a49e 100644 --- a/crates/kesh-i18n/locales/fr-CH/messages.ftl +++ b/crates/kesh-i18n/locales/fr-CH/messages.ftl @@ -24,6 +24,7 @@ error-journal-entry-linked-to-invoice = Cette écriture comptable a été géné error-check-constraint = Valeur invalide error-illegal-state = Transition d'état interdite error-invoice-unvalidate-blocked-settled = Cette facture porte un règlement, même partiel : annulez-le d'abord. +error-credit-note-blocked-settled = Cette facture porte un règlement, même partiel : annulez-le d'abord pour pouvoir émettre un avoir. error-invoice-unvalidate-blocked-credited = Cette facture est créditée par un avoir, qui en est déjà la correction. error-invoice-unvalidate-blocked-reminders = Cette facture a un historique de rappels : le dévalider effacerait la preuve du recouvrement. error-invoice-unvalidate-blocked-emailed = Cette facture a été envoyée au client : corrigez-la par un avoir. diff --git a/crates/kesh-i18n/locales/it-CH/messages.ftl b/crates/kesh-i18n/locales/it-CH/messages.ftl index 5cb50f27..06f35274 100644 --- a/crates/kesh-i18n/locales/it-CH/messages.ftl +++ b/crates/kesh-i18n/locales/it-CH/messages.ftl @@ -24,6 +24,7 @@ error-journal-entry-linked-to-invoice = Questa registrazione contabile è stata error-check-constraint = Valore non valido error-illegal-state = Transizione di stato non consentita error-invoice-unvalidate-blocked-settled = Questa fattura presenta un pagamento, anche parziale: annullatelo prima. +error-credit-note-blocked-settled = Questa fattura presenta un pagamento, anche parziale: annullalo prima per poter emettere una nota di credito. error-invoice-unvalidate-blocked-credited = Questa fattura è stornata da una nota di credito, che ne è già la correzione. error-invoice-unvalidate-blocked-reminders = Questa fattura ha uno storico di solleciti: eliminarlo cancellerebbe la prova del recupero. error-invoice-unvalidate-blocked-emailed = Questa fattura è stata inviata al cliente: correggetela con una nota di credito. diff --git a/docs/manual/fr/user-manual.pdf b/docs/manual/fr/user-manual.pdf index f402efacd064c0d629e774329a4ebf85ccc8cddd..139a7469d9ca487daeca37fabb66e16230e00dcb 100644 GIT binary patch delta 127804 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�p3(Wz+XhCs_N)t+s?9(TafgyS+_{N(pV)qmNlt%*e7{ybm| zHWv%o+yONUKb?DM53s`SPu{flG4*C3%1Ux%aTG0wk}2unc6A|NhD=lX$G8-KtXt=& z;CFbk#4TVHEOrcpO6r~ZuFa>`}Jpnd)g7MwYpV5&5(8U24ZwPLz8D z_5M3JkSo6~*DN$u^Nq`t(@>e!P#bIVKDcwoDH~qmJ>}29H9%|i==UXi3_8arrbSW{ z@eYO0>y!(_3r>69v)dJWois>>_W}WD_Wp7!^+Lox-6@kd?mZpmvW?MGM~(KdNu3JV zdQm^*#xORgOBgcTE!a{*4zi{wtRKO}Q=pxpxW@}h$sWz$Mbc*58-y~yr zc`cCE&NYy52>>BYz&l37S8Eh|9ZhxwkvR zO2bgW))EZ+K*Q2flSnL)Za|&Rl)s-ubC?_5zo`RU{#2)0GA*%ZpmJ!&l~k zMm`!bG@fIu(lEVuh9Z_XkI+MrX-ga&3T2E!KyGC(m!_a<7`mIWxRz#rd0iO=?6bbx;d1jhxF<8h{MUQYN+uyL60P zpng2t3((nys(+Z}(KTHagR7X%GCE!6<=ZYy0hIqn4;Q=JCXX)~;4TSJi)rUS8&>yGduUgP{1UU;NR>{T>`XAowLo80iM7fVH zwSHZ!SL44l@agg~zLqZqXu?Pes@xFEcTbDn43@nol@wK*0u1V|^LrylO37MY00q^9 z0Ph}c)9FAQCq~ZRjRgB6TV1a?@+P+{DFe@WKKH(E zT@)OfdT(D4VyP4Bk4JM*xPx>E{2@m8sUn(MNOvuW*h2+(bZAlr_RHpa;z9`$7;Hb( z=O68d+G=Tw-WagRqx6Sb2jAtvBi<7xz$WRef$4nbNlLvFdL;T3M&fil!u-vHeKf&- z6N1~3Rt{opTI@-el5-GXMQWrua%68HECs4)<>UOjwy(L4qI zim!UCBa*{Lq;#c8NP@#9V3{Ayh-x4R5ELZJ+WWi~ltUV!40c%@HCCfLBnhD)fD;Hx zOxSYb8t@x&&kfXC>dSR0a^0GqkVtSIBazatsoc9tH%@5#Ty?y9DEr!kzFzh|st$H= z^4Jj@!5C!uB#YWONRu`0{tT&g5v6xFOu}_oQ9bg%bNmd!yxOp{Q7nG&nOKuo$ku!5 zWVYEpuP_kA%7`fYM@4Lu5)G}}00#a&wWbx*Enk_7j68?%f20@jix1>_uMC&{o48%H z7wZ1l)Z~@0a4cht9&OU<(J>!D${vfAD4L*BE?o8`*U%~m&34Jq$erL9LNnyW<^fCi}+nQZ-} z)w)=W!FOyGqQ|pK_tiea5jJdg@HXa1$`~gq~&Z%me!0JcQ+Q=(*DGiuv+8$0nxUrySG@wU?!2 z&X|6b=W*hxrXpL6LtgqfQ$Mww=JYVp{M|dNbG&f8I-tW2%}6gV{+;|CM6b!3R6T7Cx5F#`A8F*TY5Miv7yk?M=g=+n zN$tqMd{ZC3;HStNZQF8haBm^n9fW>py*IgU_i;vI)x^xur^F-8n`RA%mlFmiaK}Fa zA?gT;XZR+Q9g~C725M#egZ_Zg-VY_R_|OGAbP&Zkb}g@>O`1@4+v3X-@1wEBtK_9C z-Nbr!&)9}7*`p^ybr1EPAQ*KV%UUVo5l=bLlL5M7BCzk3>mn$%-3!dLC>xf z<1BIK@tp>Vcw`cLn@9724xRfNfehN{e0WOFcUy*dIbpL{_eevfn~r@ygLbWrB!Dyd zZ-CaHhxV_3gcV9T+4=NmgU;Eq{(ZmCtHEVJ$b(VV!WXaGTGa<@!#nTtSbE*6tkJn2#OrjU_<`uY}cvKcEOj z2021t@|jF>`iW@r2pVOl{I#%VINMWyd+!ez{{DG=I~jK{X!K|gZSh&VBN!TO)hl}g zWO+qf`Sq9XeNV>fk6-Z%)?eJVix0MCox~RfCA(Q~eLr4-G*A=z`91EPJrk%EEPWuQFb zFd|eOL;qPQhp;z;SSmz+#mUo`r=W7o zYo+!$wliBQAxxT94@G*4yPg9LW#n;KLd!lm)@zI!BNFU2pv@ZcM4cH4w7M4p2*??2 zm{x}ND$@ip>Mm09D#ZFU3&&xP6sA7bPveba5V-Alx?60G}m zBXCPSHZMSlkl8QdG9Nn9HEqClYxZD}7jK}nCoyJWRFOI@=u!F>!B)7*)Y#D`8cTQra7lH?3p*_#yiEP>M^mWK~x^k(8F! z<-`pMbU#Ml|2p~KY6Pm;aZh+mgKf#8B`Y+x7WMXKh)m~Sv8fxSr4|dI7>D_W<$OtD zFz;6E|LJMs1gB6n>)$bNGs}sh7QG5n1VR{UN!Lflv)g zq?bp{>`BD%JU(?~wMvmPw8L-SsFm209oduqv*l7D)3~~ckl>r3ail&%Z6!e$xquU? zSOa$-sRDN~_n;|fk}TQ|n8*(H@Si=O}f5{`L~ncyF3%=%#>cF$Xbti0$2Ny&MWmFc=*!(i-ewY1bG%nZk0nTs8&9V z3z}3;0xGd%nwWLN^CKm8O?+;@f;Z2vqPzy2&?_%QB&dc+tO~~uP{EKR{)>ds@~RVnn@;Ipa_1p1@fOtAK4H+r5FTw9{Z)+Hf*Ov zjD0$4yeTC`r`VSgfLs*6n@eC$7^y<6R?QwpOIZNdcphGDWcC%!Yko13#4odAT-9-- z5RaM3*FIC4u98Dq-D?iC_Gjqu5Dcm($}6&wM*QfWmRz&kWOUo_8UfR!4Ss}0x04El zd>sw5FZ7=y!zBzAH*&Csuxg)&a(Xy8`;)_Rq0|LqDs9s^08B;y3$qgESX8PnBAzX4 zO8^t_(7|h}P=^8Kxz+6FPU3w{zHvL)LA88vs-t8ZpRHziQmW%BO-|XCmZpJ~)IAG` zzIsTYY>MvcVEUNWXmZ(>HXO}*6s647U`D$>IjD06kjh;$b_T@G7nZH)Igu`WdpA{x zc7V}@x@qtQplGVTiot@~n+6z&zw+I~hMxSh+7$GeFkGl*3* z#vh_NYOQ~-9SOB}yM4snhzfu9VB-!EZYfYD@@8o4=Efe_YO!}SxflnFT5LyJiHp!s zg3ikHEhu!JH9k7sPHr^1nj>hIzh$$|Yz!acJA@w!;6_z#b};5-(#FGkN7H)T+NXBMTAIYpgVmoN0A=i!mU#8drSlUHd5| z-MoD68OR4jg_4&84E|6j;iC%g&hO{#yr<10>+=#J96$W!pEx%WvI2AI;UT9D>QbRKdL$o|8#LrlPUd z@?nOWHza557d?WMN3K#iKF$dvU?rFUtY9PbKT$`tKzZ|*r+Es;mPAAdtam0LtP8=a z>6&}|8*PWI*6i%7Dn)+V)i>|4YZ5<6NlSNz`r%O{Dx%ECmJU zD_V<7MVrh_MDME}PrVg5c-)QdKu|H&TT8#je}yQ?VF){ob>7`>$0RS$`?9wO_-J}} zscldZ-5=3dt2^VIj9x^W;^EZ`a)6#di>%$!73=(3k6jY#2lG>{Hx#t`4jIPyO{MH6 zCRIj#8S6nFX5X1zUaq92Fz@X~AFw>e1etL1-~txC8`*OO)e8ncUFYQ8fQD!JsT7lnn<>Tsut7EcP49}& zPJY0pVOv>u-EH=$$Yg*t88nZdS!HQz4d>hvPyP2FU#TOUJ%_KE_DUAm;AdrZi}+(- zgBz9dCg@gIL=<2EaS$;Rh(+8=YbOHq2FGQM#f&Q81-@+k_F-ZwfO^QP!1RM{xCU9J zOI$au;X0+dcSDtE^=HK%K!-e)Ql`{-UJ|cOMglS&$cDJxm3tS!7uwfvK4O=(_S0Bn zX-A_uwnfhJ8H8bE+!d;YLERh|3cHCg1iqseh`L^(25CB7aPkA4r2)>CgL2#R&+&V1 z=oT7JjpW+wQVNxZoq}nV1{bC8O|G1NnJWB!{Y5o5BIwm|w@}9haIha<90_{0I2|H? zS!UU};&qZWwyi_WxzJ{cH0H**6|u!wydFwa=lCtw1Y_#~^MZ-yh7FHy`Fr1WYajHk z5E&iH+wYb^LivZ-xe!@Hqe7wzmzhx?xgsY_ujXA@2b?O$Ib66pL(!-Fs|L94@G(h_ zbXY5S)0Q@2BJIlukh=&6=ADXDYO>dZhY-qrh^gIr8ml8!h5Lps(-f_Q_JuZ#1t6}~ zlW0fmh$i#(RUP+x^jp2OH(wx9yq?4E*2$&MpZ53OT2;(SFW<&XjQs%h@+)__*zbv2 zHo0i8=S#ay^9tepL#R*|98WW_ic_KIv(yI@eNAbItaNt|2(RwFe6(8AX`T13UjJxH zWeeAEl}e!O^7WdVrVaUWv?$Y$|9aouWN(X?y01eP#^YcjIV|0ORnN*XTSVk$3eAzwe`AYP=dpi_k~b^nh=xBWtGQPYpz+ zu;b!Vm`bDo5XP8r@3)FHqp_J&S(^Wt^b{C(nOGP3!aY*tic3zcZl!zgd%T=Z+EquH zTb@&ZwtNnAhUt+Y&zyB1bX|pAFD_j&2S;kX#pEI_)Vb*@o7^boA zSesq*W1iQJZD)b_v+edLv|B-j_%{R1CNK9fTS%&`rc+qxK@_Q0&w^L7T_osC|7t#b1X zTZ7j>ojiZ+4W7TfuvMW^*is2=H|$JaCD`@53907+0?vUo#OqO0baV7IwF_4Z*EJyLvl*iw{3af*_H`MZzwiQtBlfOs%uHIQ zx^d*LSgecTdNvVJYY3yGjS^L>tw0kU0{Qsx@akBex|Ajb0zzX}K66IjR>8jeZi@=# zF1j-rovC~wLGx$1inB?}HL&PEu@idN+ z3_)GowrNpKh^E}cQ-1+i9xBG?@jLrCR0_yRu`b7GjmkEY8O(A*?iojfx*QVe?XS@J$9>)@S4da^W+4d+|iA>YFd~SD`3~Jh|WJB9I zPVlAgd7j#h7ee7h?#(rf{Zwb{U9vK32Rn&koiKe}0r5{$de{MmMoA;DUQ^2kz_8?3 zyq2XQxl~rGa!BaO(<*5gLjw6tcJfYkb3}Pz3Z1b?9beNK5*+7Ewkj!A`s6MMGGpC_ zDTql6(a5T{v1lIJKP1B$>P`2f5U8uM+Btq1AU!Ox<_&iV=quVTci9jQ@g2967-;#j zfR?Ju{1&!jek%p^L1E>JmnbG!G?;8h#ILVD?Zi2drkOB<(|-nST_mbiM7K|r)2`Fn zJA128cV4ItH4Gsc8AGACo>YU=_oz^3OGG(S(B$(@CcQs*jReH`E2pgoC?>*EVu$zA zEUA&z9EUdwYcbJ1lL1zz+6P^7<%&?NnSM=ojI(6JOtJzX#&E*M>7o?CNu-fh5tBnK z$-J`J4;h`|iHnRGqw)-h4>ChpeTnf?r9#R}in7hPXiJ?Wuna0ieFhcifSdM_l5ywV zRvBSm(t+Pfq_Q-d*(bn;t)ca#cVPID(2wNWIJ9E0dSVkI#8@KCamg`5CK`;H@IPVb z_axLMJP80&11K;S$rBobM~}JUi`NQ0kzo&7T04$!fZk9cvq@r`f3au?`L2*b-(W zL5;cC3*iUV@Yto$aGAl~0z{HFcN<8w#cqoX;&svC7_eWV&08LLJ~!i|P#0*!0g@=L z#xF63(NvbU^yGH9Dq1{aknDyxp0)=Zu!-%S7I4cCZXv3Ob-SWb?nKd4|ovv{5fQxaxUYM49xzCRGBJ62&dy^|2 zUgsEF;*smR2HTgV271G4ZAxSPQg2;?sWH8|C4vWpkyUN*lXFJ-BMO-%9+wM!(ydr} ztU%EPV13Q7G1HS-{$JG(+(9@_g_ZiO*N_0VE}Q8-F3GY~@Don(D5HBuo)cr04HVWE z{+r^qaw8>v`q^3pz>SJ-u`hOLQ!h(Rdr`oux-7do>*Ew!5=`@goYjKSJHrt;hnbZv z2dArIVhK8gp%q_`-X~n0<$FYRq9dP7YTGm`V=V$oEDFV7hxxf7<<$Tuv4)nV6fnRP ztG;(#3vW#mF*A9VeZzp3AiHH)TzM&^usbA|CYAkO%037e-#llwZ{`^6 zyLvt&DB`d%tQ~E+UlYx-aSL}5q?d~+)<|LQ?b9IwEIau_)Z?Li zh7xYFUonqVa$gHnV)A%t?v}kq9CheR#T=C3()ptzb}?*dwH@Zt0!lCpKbSnjC2s&a_j)W3!Ak% z97`Ct*^IU^Z0lH38C^TQw0mMk#=O1pq8xB0PnKLP-#nq~SGq+{85~7BxSai17Pnms z1=Mx6pPM{j7GoKCYWHd;NNhUmKZ!zLX!T&4ZFD{GT&t{dENavFdU{k$GSuB-!KT#C@I2d6w=AX$cU5=Zy8OTQZv>eRM=SpaoHoczSMb16JS$Z<5hvMgkbI4@%vh^ zR!qB%rgXA{nmAmTE`_U=vW}Rv)>%OscGj#~&@fwg3%`n4^7r7_ihx#$$|FgRL4ReT z-n4!(C4yNmkzF0Z5DMkwXR3a?|NSq;OZ4As$F3;QFSHk&Gsys_OZ1x-1u|&SY@75U z9@I)o@#DA}7}S(V|0$VBE5#I-K1bKXRdZoi8VJT@|89`jcImO+3@I(_b}8VTyH&jy zt2(IVcYHMG*=QwnvCoAI;-W_7b#3sin}YZ?GyB=$Uy1r}3JiiovwA6$Y{Zh)s@=(f zohI#pF&yqQQxX7I7!nE7SDz&5J_MdE3AUtQWZs`pzWU<@le}nl4iqJ3fhw12_!OkF+IxHyxv?(h2x>71M+g2 zv;3|vyd4wki@isH(J%2hn(rtr}<6F zj{0kbGEpu@5_~huYL2lfQRylfZHAZP1iIjU{ZUgRym*SV?~~OdR0+VFE8wo6$!=p0?*Xmj*390f>96boWaR*w10E@tid=ggc?er z{I~3^Wn0!!7C+>^zZ4)#&EwHX$M(~Io^RkbD=72ITADy{WBtxJZY`eOQLCn1?Q4uD;BNF~*`20lkYxDU|uf+zTu>9#r6 zfm*_oB6qej@KrR3-+0?-c{@UXZwd%I;6P2*f|7S8HlnB?9fF`+Ba@w!fkdy3!k#{; zd;v#NUjBJ?<_yx8+8-Y|x#_}i5d!cZUPO4saL>d}XMiFVmB3=#Ma_(yM(EwCrqJ6@ z@#!jYY%ge;zUg-&koGR@*rgAzET0DwjHsTzc_4=Y$`S9tp5Ml+AmHejjt_i+4d^{z zm{iW5D4e6|7x#aL-{K0Id5tOlo{MALxjShOD(udFADhwPH14>pF-U@sF9Jr^f>eKT zdJJed8$tCW1ft$Cj%&bQf*^#5=;Q9S1O%K>r%o^g5)T!zjfC*O%+Yi!PwnJb6cv7N}Dn?fkrK zpEG(~(lRKEQH0nBzFS3);isP0TGB)F&l*Rac9JqWrlpOHq?hI*sO*w=B)u)vtfYHQMWKn_KCr<~qy{MZv~QkN5Lx>n zuLdPrdYnY~ehhkhDQ!Xcz3Dpr-A$i`M-W^iIVYt@wp?oj;d4|rmQ;1j8~T)Mu-a|D z*dVko{yl)~-=o#7eJ*NkrK5{||45;q7}ly=FvPcNSZfFiy~d{DZ#s2?O{o-?dnF;{jJ8^1b!rBVsrqjP}WJctWyHNp0j6AsIS z?ldVbb`uf1vynR0!GKKjn3+*qo$8Vb5!kUJRK{Gr!B~`}Wl(+&|Qej4J^8mtA<&52uEL$b_R4lvwrC)x-`xA^!I6U z8TLmFx4vcm4R*^~1pi&XJHayhooALc%(fdRuADR8>P=U28A>dN!gn5u$iL>>X^Po5 zN6h#qqUW3RBp1L;hFqul!xA@bWW?NwcS7!NMB7eMjA!;oYn!o4eso$)hvUNolIKo3 z!r508TImmXKTZIvIOUtjvpqkV!GeOC?Ak{-vC)|s;~i1p8AgqxstiBwwIukqeWhag zq&VL`Ct%GKgW$zTxLgJV)whXodA^vCB7@i^a$te&H;;2DT$d`^GqH z#)dy)hyHN{byONiR^Q!Ep;a~8LbK+56z>{X5vw%yYT64E8|=^{X_&sTYvi=Da=HuT z*PoBntWHat`xKL}leYM;8ti$a+QiG_*yut39H%K6Znp8>nbz7V3cHW^7XqHJv@HEV z5)>7f>AxX^ESy~bA7t8~*LD zDc%%SrT*4(v!O>CxI-FQ1-Vx;p)EjfzIZ=RH_1SakviSv4>q9l?uVsu5*6An0QQdS ztNG{C9rFES_;L8_WHx_CSv8V_0dSX(QJlmPEyu*gct;56Ti(=puN@B#|3cb_oL|I4 zlm{i+B}C*v?`YPyd4dvEaO_{|wGq9tIg9J>`D^vD{Ixc)lnUk91wHR+OV!y${oPYn zK^{=zGtf0q->3B;u#v12?+h`Sqqi3 ziGl9cn87&J4aIvPf=CO$d3&zP(TPZc93ll$Rsbez)C6p4(j&^3fQ+u3xz7?;?Ogd- ziKPK!C|?{Pac5}TqQ>wQ7t8;^fS%bEmhKXpW79lE{GfV72xOxXqCU%}wM5fTTp9OR zYK5F!Y=t1R75iWZd9R{yobvQs-%R?d@obZ zEPWW}AR0p0)1+`u!Ol0Bmo&9Y4~Z%)+Et{66L?T};jTBC?9_>_0S_&Hm?PYW^}hC6 z=c0uCPXC0IpM_%MAB1f#P6O{qsD7YVJkSrEgv=Aplk$vTTqrdS1h~9w(+!BkutS63 zu;+Z?ma4&eszRUO7RG%jS`?Xrj5-Sir#Jv~shLOO(n*Gi2ACtv%CWB=gn2iSh!7Jp zVkhq6B<6u>-6(hju2M^Oc!)-V3ubrkv{zcHwRnw}-BvTClXz0m! zT;OI&y~B;JaVc`Dztw?}5R{2%o7B+_8JK?)+O2CU>8&GP$kO zi)&AnS_ypF0LbHt+SynV8cdP*YHESEADfllAfDA#kK=r-b+ri|Try2iH3{Wx9#ioC z^(T91GD%>pEab|O<6off$I^jnvuH63`D9xNu<9`g<`2T7C{%Hy_JvzM zJ4Grks`6-YJi zG>xv#pdzw&knuVh7q|w1A7-P!7L@7pnm@s$b z>?6-tX>~O+E@(|YMC!>27)xqqqu@&O>@2ivgSE-1{lyFpgPN2F;HUu$0QMErsX$|WLt`_R7dmYPF;*z`9 zC*PQ<60#lm5r#|W@oNV(RZvgSju?R5>;x!%tF|FklAotSo1^5&GAUAEPqdcddzzWg zL)d?KlS#8+f4{W73hc!JS7Q>lil{B&CadBLJd}^@w0O_(jbUQqkwaTsbXF`V&7_+!uNX(m1q0j(5UmG7wnWIK<&ynXv zIrIL}#0wXO4l@%b!(16hJDSPoA0&2aNGbzG+&NVs&y$cmV~CI;Db3{n6Z3D$p;1=C zj}+UhFp>eq2cY3o!{#9|GYIxQJ_P%keU@JH4G5a4m$+Yh)hM^6+-L@{=>s~mlp6t| zy7QWFyWZk&iiGoQQlYBS{|^4!mdIAzQ3y}HmYxO=1ru%9S80&kZhQ)4$Y-q;bK-*+ z2J>(U!{K?pJNfNVlo^mW?61cExG;HF4QZZ+WtIcdjcjX@V5%1mb{yTFpiG%7GLvfU z_^&wcF&+p9oVh_ccW*~<2k<9Qunh!(VEh7vSZhLXQaFr>-^6Xmb5HQspfvcPa4tT1 zN*&85unk4s_qRT~Fe=cntWkUZ7Ef6hm5!}Y1!g?nGS&p%zqprS)0XqYN`U{X1hpdA z^lp|>zm3oSJN3>Xf$O7mv_BvS{Nq=GCS>pUOftq^`|tJ`Pem{^xjfX0%5ZBO7S+GP@xaM zO0)fn;^^Uz!k94848ZiZ-OMrdlKeFS4GqmzqUfLc_99W1d0xkQ%3KV2GABJ*U4o6; z{iCfFA5>|7lySG4PC1z`yXkk6xU)`+y;BA(DgM3_7cM(rvFEAr5xi#ivr?5GxM>K4 z!V}xCba>~4m^xepZrQ|t31O{@>OY>rnDPztYP<=4rXW^qi-2obQp;bjkh{i?5dP)C zdFlOX=iBt5>7R|kvSZo$Av1=&g7s`h83&_}%JLuCb25X195E{|8|ZKa_T+jvTN@ct za8kUJi-b**ahzUSnEkhS5CUFV*GPyG@CyoXWLm4DybSEWLlB&@QP}^Snh@;hS;p=^ zT%}{{VQ{x5r2@Q1W>GVIH!PVXc7@OUz6;sVb=F6UJq8}JCGkb=dg*i@vkX0BrRDK- z0Dt=u)9K&t6{1<>!6uZLy|0l6R93`=KtG#x;1{{kQ~*^sAF~Gh7sulO=y*T-b4G5# zF}Hvb?aZ0VbeT;)@9Wjn10H0>*<#m&ZsDAIY?IoDnd;SMLt=q-n9KdA8JXoyPhj8-c9TFWb;LXJ1R8%i} zH$JJ2!fIz(i(9_L1L0JRM!}faSi=^`srKC=ew*uSHFys(!#JgoQ78?&t3%-`^H)0E zcrOkWve($-%E8~bN}cLddb6?lKMu?f4yV8&B&ksa@YW`55Kt~t(sN}wM- z79j|}Vd%_hM*ixT!3iQ0r^KiG5fichoTmK|<_c?ziB5WoB5nbYX;* zg9rj3{qe0zN@XJXLa&71ST~Y(5@PxlFnSVeWXw8_#tt!cRyJUUQhv6NFwB9E#b$2K(k+JVQ2W6*)p2idlQ?SJXiW%mB)EkwQ^vP{ zne}jHo)OF}q1}S?cGT`D{XzoV2(Vvs5N2PTSF(!mq>Q5D58LZr?>>pNWXD&p;7M*M zriLfB$5T-skQlAl61zz7oJNNzJ;6-Xr|- zbeZ`TdN8CAhhzvdWEy5#q6f0?QkpaXg&WYKGoqOj8jMY7=e(!SzFHE+JTlaxTNW#F z>dNcq=}?)Wfl!M+v>Km2qWQ-G9Nr&9W^Bi)-q4sopgWC!n5oGi2Y_G9oP^S7I{9#e z2GSPGWzD&^#2Yb9okLFPz;U7*viQv(RzNM_Y}p_->T8OQn)pANTD?fcX!u0{#iUJ6 zF}AN|{Kp&tW^LWP9{<<}vco^D-}5zGuxS;Be^QHzN0vOOxxKxVJKojyt#$UP3t-x_ z?i;dN>gvfE(BW%}XZcaa8dQ7!_-?p{1TANzjE%D8u=lu~%k^c4JS6aBmxi!9gZDca z!J)URMAFj4J4(GNe(h5_^`}DtsJT=i&??sGf)WSPo?A7ykk3*gPuP&{l0B`#269kj zqth$B8FkfcL{bq`+3E7_z-Bpgwk|4!;e4);JXlFaH>UO$D<6JWfD&WnSb| zZ`kVUe{?CP&cTK%(ML1QOO?dsljOM^aLi)Qm))s?xx#kE{Ycbk?e?at16}ae*1}jH z?~6IFYNCdE4})R#XMo20K4EIRU0PVJLknCJf2VfCGt$?7M%g!_U3i$QAd&wz@bc1D z1?2Lj35!%qaR}#(LNjy%R*K?zID6|qnPrk5Xn)_f6;Ye2_}NmzhzC}R`}!w9{-J$d zCppI#OnNu`us@e#cr?=5n_GY+ye3&Cx|t$J<^R*}F8Iuw(fgp90h4)+k%8m9SL{AC zSd~jD*K(V6=Krwd#uaHbo#$ij=bW)MfeR#Bw-rr*ztnfz`Z|gZXw{r_*-$=8`b%2I zE(8oj7O^SPhhN0p7WN?K(K$oJ3n8&Wn<`r+6O%@l!B)m0WSxlJNrppdnRBXIExk@J zWyX-oEqG%A1Msa$4kFaIPr!GwrfeCY_~YDZ?f#5`J-@2i;}H#MnCf!k#z$=XH{uKS zW<}eRSYb=^k9@KR0L4#@d&j8q<+gqhr}XO;{jLk^2JAMid{v2K2VQ22r_k z-+CRq=_UZSV4WcBY!}#)V_3n&q_&2uU@u1e*2kA@f<4B@%TgzkIHL91IVu`cGFAA=i0auzM`M-13bFl(nhT z9@6;stvQqhh3sx(zS^~9et&m4KVE-4y_vl~ ziOB_m(Of@0a6_E{Ix>05 zw0whqbL!P}qvBIHzdjz;p2nvoBrAi!xPB9s{}D?>We$x$q09>Au}4sbc->3p((C>b z&Ld7o#0TgovL{QEc8+B`wAaM&ASN%!TG3P&aX5xUqrX+UDF0O&>!PP^+cw$$j zz}*blVr|i=XAz!R4gG^x`D?M5vn3qSIT@jqzbWAyU%jLTRe=0%`gJJL_>NY@Y?@B1dqQb~@EDbv^cxaO@waV9lln4c& z^hWH|JWdG#P+AUp>e%lnqd^i29`j^ysfZ8T&l!5EVJ=hGYS)wP7|~= zibt;jrsUyXvpK?z1(!uBXeL>m*0W-z(GG5T%aey_8NYiZ@U_s-O`={fcLo+CwNHxB zJz-(%F~Jyy6}Mtu972#BJ_Y_QXZ;o6Z<*UaWrjgs)dL)T`e$U95|PqS;OX zbXuoWoCa;nE7n7zVx4nlQ#BAqHr4D3|1#y4YO5E>%9ZsZcA87v=TsC5)D$V_yWOFJ z;7tA+P6`~(1;43CIdYW7k9VXP2Q121IF9sc3@k0pWK`NlNKsuV6{ERYSZ5|xBmK4d zESNM{<}20?=GKy7ec)i$9;nQn!>-O`E(Kf}23TF87$tQC{u*Tx=daZ~sI}0Vg&^lE6|}i&(N+*cR*kxo zN-ACHq0v-!6`Q=rNB^2i3`og>vZ9{>z4}aK3CzpC8IaC>p5VT|SF+$iBGFd`%%{5C z7u01?)UW~9ZbOn&mzB96F%{&~1ZP3?$XSo}D8H~XZ)|~6hnM`Ch%B{>#4HldvHT@OcCaegTe->DX4+gX z5~B#(!ENX74xX3C0%t1xvJ_`s^kgy#T+*qEHUu8i^Y-XARl5g_d zdp@5h@O}U4Ki?vg2yU`EY66Zk82_yV@{qGt>8@J$Zwa6FD5=T`)(pEMic4-( z#}NmQgY|Woy|+2fhCu5Q;3Pn#Fd7_ocFU+JeAFZY>%Lm6xB&m)7SY6(*d=;(8B|AT0J;Y3s z$5Ov=@Lsf|Ia)A`^&@mPrEnRO=gg=$WlYr!nj&2eEspmWXcGhmcx%7`v#!?oIWOLB zc498-TDO8>DWxTN6E)I(x$NN7Zik~E9UJ|kD#o*A$o05ph0x)xzec(wUJk+u$%$E{hXW3;Ee|{wJ{)U)T^#x%KG)3a#TnHgb z@S2bN8oS)XxxBdsWhP2tarx1{`wgM*5xSIokBgG7UI#1!U}j|c|5xX(^>*WN+u{6g z4VdE3MOyxa4=E#IPQ-JwDHaIj0E5Nw=3I+7$NHV-t;ucn_wAN5vw4y2EaJ zTX2M?eN0d+ViCXc&KYZQ#nFc|I|e&*2NS9?r-EBm~TeUSil*r z=rT4xX^dY~WwpwXOiX^E50i%f$qRa+DpC|WU%8r|36uW)hxRMO3Y;98|Crj;Cp}DXJ&FW+|DGBE8UPf#BAL4^Y<$9CDV5atTUd?37d>C}!>=IF==9&E z99<}bP+g-sL5_8XXM~GMbs-Xp=OzU#svN-%j?*!kmK+{H4&}xM@JCMc1HOONQA*D7 zswYC;(i}sXtn%QQR<7Kx6wPsCPojhx<5D^#uVlwsSwp0o_4tRJ@jt3 z+ENJ@HLk==_)%((uuJl?J?Ty~!G{YgT`LY|4>McI6Nb(nr_laAj4D5xEH*Zwu3DVs zXfOz?H<^*0 z0QXw_EZ8J0DGsp8lAZ$Iqo-?eFk$@*nZ@ zFv?q-Zz%5Ra5=pjJsvIoC?AIiXW;MldA)cFKiuD0PIizN(A(wL+P(4fJDs~-7|{6f zcK3dL{ro)e?D#p@Pt5=Jb^rde|L@M@<>?5-n=u9i-vHMRkJl$5Z2{ky@f!mE{@06x zyA6nW1p>Tz`ZrTEEbsfb` zb+iVce~h6pZ5JTk4A%;C6Ol$P3@pp?mD8~DM)E`A$bm7y%y@f776|TH%0h|IWzQ6Dzs&~b*>D#|!`X<{ z@|WGN7CR@pLuiW`&$&U_BB3p?#V0~nrYSTm6(B~_b!!D~M__3KB@KWn+b+Dgz=|s4 z$xip(>Z!1ljGd#X;Y3%ZEiEjALT8JA7BiZz(p+N>hACO_h%f@bHnJZ)gm=B$GX;I! zj=>R`<&n{GkiogJu!JS93270pAJqPnSp#QkG}5(;WpqFtY>ALZ4!JodGzV-p?}`Q@ z0=UlE@6^l^^2R-^AR^`r+QPxMDhF4$wXpiIvyvH28suCdERyR+;FM$i^MGeb1>wAVInbD;1)2&5J3mF+8Hd{vt17cd?0wz$W39%T& z3P6v2|tDgva!V5=x!?31hnoG%@**{YCvw^!!HAOZ=~W?yEjuE>Va?G zjdFWt@~MJWKux>PshH|RY-$PHmey&=XEAE36#XRMpG zP{lrWy20Fp#24I4)zQ8F;Qb5vTVM#jFyKw=+ZZ48M59HLo&m?t7s{0xWVFc>0{Ac* zfW`U6;`s#PfNrJ@M$Z@UWiV9G&!DACXUIZa*X))4J6=XTaF%AVp_nj9g&fSLDfs!I zH&<9E);`JcQjaGHVAOm8zb2h$_Z&ohge%%4(q7#np^n70m{nbr2n0#%1+%FvH&z30 zf%^S#h^x&pBm;b?0*dZH7m&IUK4Qmg10$W~OX>`zeDPh%4)5Zof~#+?;1* zSS+Whp}ZZSYG_QN;;N|xV4h~k$&BRc;5~PM<;rD0{{?a!_f4}u%=Ja!gl7&C^|Y?D zFKh;c!jguGNH7TA!vajQZL|Vv=||5W`WnHG3S%XAK4eAO5+dmde{JMM7G*B$3nL6> z9$N4&bt>uSxDG~da=Eb$4ia4`5o5|+ei}SJ=T=%?hV;ln5{p?07-hHVN{u}iH|)^QZfw`Y#L(it4XI<{wUVQeVYYgeSScMr)KV968EHa)#WWMAhrMn`vL9-| zP#+}Hoav1Nn_0)zA!z?qE-izz4BbzebF*}!NRXD5(vW9uu=(Lkk>SrTabwl+2&u1W zMlokfdf9hoxv2vI;MMbRsyHA#8_6^+6{!GA?w2Pta8v&=YmSOYCG8CUpp9=!I!WB6CK_s| zjikT^qX@gQtX3HjAPy9Th=>&(i)q7L1j-lj9RWs)#W+_Ry3@m*8MxZm@pQqC)@EGT ztdmAXYO*8&?D3lTZB$tYX3F_NgoLf!GtKx+yRgzbh&V@is2>l#GI48Is8`RL7=a`g zZ%tVuNju~gcGz@1po8Ef=vEOK9COEj@f%KDj`)^tmYqahrTi%M~X4=D%1>UItQjxG23hd++Z@55i$#npA z9BZ0v@dlGQ&S}XWy=Y@L^WXH>E@*CMh-CP|@@H@)m8u61v|)zf1hAYXn>?sYu&XX3 z;+*2aP!MUaZ89KKczym*_87-vaa0T5jm^Ti`jm~RbSZg{7Ik$!>uN%pdRc^ApxyU` z#yJT9&{s8s8f$V>rIdFo`iQUO6+_n2^QsocM4y*z)=cy>G{$|$Bu5u zG#!SP`|<0Q%Z<}jIG@AX604yeXITA-#aIg9lMU05)Y}IfP1r3A zNUwnNd&oYgvs1$!`m&x8JUN8_05I~^(GE6L-#{KRq@79P>O+T0u3PTvKzWt*px6zt z{)1=wfE>+I*5={ic$>7rnv$z!B;WNk8#LQHY$#;`=~H|+(=j}}d;vmn$*5V`W1#a{eGV~0wD6;u5;7X1kbZAS3mcNrqVr6FT^mUB5iFEFtlrh9gf ztKCW=;?X3cPnpch0F1a%(#klT%W4JyR@B5R&;>k@aekc59#WP%?BuFFZ=K~}D zP6v>{i&l?a#z>nAB-6a>B^JUaG%g+;(4X#R#B*!V^LePYykA%1p{MhJg@<&O%XYqT z0NUJ6Y~$;jy5;IOk~k8do2sT9JzrlJ^~GA!?guYV5@2@Q_cry0M|hc?Ai`yym17)( zywr2uRKTZ+addh3 z{B3{Zc=Qk>K5kyX*WdeXzFDGt9sxmNuAhhJ=j1oWd_2WzyaGKz{?|tciRbJ1aX7+! z9xv1`em=ifsl>L*5R1t^7!y^|c4@}yS5|!z@kd9_t*GH!m>3hl4g-rtX*)H)(=K(K z3i?3Hp<0;rgD&)S`(i~wlff^WJ6`$_N?wdv!7f7=yV5#vT!TmEG3%+AobBOh8=d#O zTL7M8%2Y>ZdK@~Kw5-ancD24nM)J1E$H^t|l&Wq!-N?`Cx8}zN+F0)>i}jhkdf^eS zPm_8~IAdF%4Z#|~##VP(_h2Ri8)3AbmqO7yu&@5_Th|MyXYj;0oK-U-(eF{Mk|~iG zA~Q97((5x%pZ32wuU0aZ`B<~X5~*&<+ur1i9&TNg8hLX6$`3>QnS0y&T(&#~k8H2P zQxUfhCsmXfkG@tGSCGsCNnO3ya6Gb0Tc@Hw2sB%Xz5s|A15N3>r!D?}7>CT$cTFIg zJ>L*opRfQXl2!A{LM}-X@=95m<*~x5oJ=IfA$gSUVctbR!_7`#PT`KFaE*H z&fa-$>Q|eZ(Eio+bBBEOfZe=u0YIkzYjxfMZmu(6IlWwJPJcqm3lq1DAzt7%)bW6D zRA2IyVnqtFI)w4`bHmbe^pl>z=!yw2X9CZ23}UEA4v=YHvcNn(A{tuLCh&iISbj=p zxE&0LgV$W(gBinXk)#BQ`7{M-B)qqCJ3X7Rv(* zif#aox&`p{YS?X@FNs zbTmQ33x@t+S(wst;;c2{n{}<+;vAO`*~WMW|Kb6q92_IrV1X7(_8X@iLoghD#aieK zOobPkm;O^%K0H^Hb~RWKi;J*ybIbf|^NAAx1eWZY6ACO|*#o{fG{;g_3=s>?C>q%z z+KfIVOivcC{9$W~=1pqZRHYI|jyt=)1-!wJiuQ;_sZa!`@f_uLnENXV(RRXrX=%uWGh zK+gM4`IWJF*?BQegeFQQ8gEK*;K;#;RZM0BO(IN8RNmYiKxbWt_HZAFes;)vCr%J2 z?wg#*OcFPlSK4*dsh*le^(o>?Nt!`NmD1(68syKlAT^z#yT?v!-bE+P;o{Szv#w7E zSJ7*Dd>f}R7g$Kj4}zuRjY57t`wjypj!=$BzhEC&X38b)PWC1#?waKY94IV1W1#lD zuR7vTavL|Q*mk!zQ%Fz3<;T)G-yj)C!P7Rz2#G(H?{C!*L$>M^1v zZ)-B4j)WytHA_Nmf~tCs4x?;ki~6{-KR;JR#8?#l%|?JmOX7^doUe)e3Lf3PntP_AkTO6dzjNJtW`kWV=~8 zHeJ$SJYPP-j^7OCN_o@e^T*kG;#xb%W%Iw~`kVHuA4i^+pB@?Ro*@A$0)v-cV5Q35 zapplRV*^5}H=UV*VOBoxK}GY&21eK2N9%J+)$!(DgKr)rzetGk?vmRPeI`6k`lARr zkD0m_m5lg>#0nW_{=L$tkIV7p#h^yKKQu66b4=7W<@IliToFD&aLY1Y@GP9xMtek} zWW2yd>B?)7XpULrCRYI5py(_INfu?8s&}iGCdwQ{lZ{? zSjSmG?KF6+Gg(RJ7gN*h|~Z~F=}@;>e85d z=o`3DjzYzxGDtCv5A7BCry@?pQ9DX1jYs~v)ER&RRpY3OQp%aCRrO{oGyeRRT1l<` ze6n;sy7e#9>4Oxp6}-k_+`ODi8S84YWdvUKG>DV%R6W#=r@hYlRq&!f#s=mVJ;b9BQ}-800!mQuy2CpC9P-15O=UOr$fj zcOC%swfC_uH+gJ;9>u{ra^Xeu!$|U3d8V<+#jUbvTt$QzwY(~uE=?H+aEyo+*^!OOp`fl5!$qM=3yyHXv+>fu! z`av^f12{B=;Sgi)o1Pt)G^=#^G;sVeMG*gPGtx$Qq8_Ix8P2Yaiw^32I;q{}9JKQx zrke2f-WDWHvqX23D$KkwWYo(NL*ZkzFp zA_1O=N`lFEMlPjIpEFX7z4xYY+xFv|r+`$dU701PgLMCI>-$vpJ4F?YvIL>|hDXaZeh8`=5-AEzkuh+6YA|$gHy&38-b%`gz-{!JVCD>jY zi5Hh9JEd=g{aM%d z)EzKWe5*6FwtPOWMc$zxDiZ;064{%yslRai(CB8rKfE~@U zK`bda-nQ-~ATCc) zbJl2DW%-?6Yr^GXT8jkMdNrc!a z6Ytu7$xdIcQcXiwSkgLWtV+*-$ z&UB1D-hwjM?@>Er2n+U~fkpu$llQop8s=?kXck)W!izt|qn12PaTn9+SdlLuZ^g=v ziBV1^3IvN?yGs9p-*sEA)&}!43m67HPNUQa9&d)`&n+mk{lM~no(Lvp4gSOJq=WYZ zQvewM+iC38o{rPufc^7AbAzC{7@So1YdE^dZsA6GrtWO$nNtf)?BORmDy1UbES@0Q zkkLeEwUqMVE+NJIt*t_AjG)!C*Ars|JMD0d^N#7;zp{P^6z?af^}Zgg`}50*`Sol1 z;d1(6AE6l(DaUc^lX1!8S*b|+A*zF;0xjT`+-OSBydVkuk!Hx+Cc}EA>vIEfeoTN4teH68f z>g+fY0a}|A2zozP*^57*Z2s=uj%fx+x;QNz0 zefL|3KXtr$Nji!!n7B4H(S5_R6}nh%b#uh8Cx}&IDLOVX3!Adc&rEMVRJcVHbb|0V zFxHNJa(aziy(v12H{$q)suQAKDu#TY4{#pdy!S*EV73cF@$3wV)WB|m&ks{*~K=WMMOn?3$Ju|CZ3@y`?9S`rJJ2|Q_H?O##`-)XHPQvCBP>56 ze9`OE)qck5({#oJc9*PhQEU9@iYU-&D2H0GG+{$g#HuUh0`3;(FjBrBh~BowP-TPI zsf75Lz@S+j{#f60muZ1$qfiq-F-eas#@-NYaT@i%#-O^9$@hwx=a1*fp*uJyPWIUvi~I937-;e(Fz|1?Vv|rxDGQ( zhgM5wBYSA1M);CQR@n`4>|*bRm8Gchj%F1zhg1gwn_l5l%gdQ#@~zpM4~G;d>hx+@ zPby1pQkwnK;8GBNnu@H4C(YINXU(Eu1$qE*fZjemc%+~qr5?SWF28`{Cqi$=GgC#w z*}AIhQZQ^)Bk-pb|8}-V-!q`eI?XEtM>04;#&M7HCv6^Dtku;rPtn{X+rNm5dFXL8sbUf{i^>fJ4 zdu&uExh2Oh)6HKZ%qyWM7^)yOF=(amRE8^!oXn@iZJh4Ebjw}7q8S~7C(;a5?uSmW^9-$w zeqH;VgYQj^Oq!a3%GT@35DuQsI)+wzjx^pZTQd*wI-soR#`dNFFht@_kz?O#bUDljFe!TWYzyd zkkkFU1qpwwebmInG8Datkh06(;wjr3_Ulnvu8EZ!Eq7&PVsJrM!>M}`z&5$SbQ+|p zLUX9Tre5jRK$X9nH~F^)WAScbC5~MXcPaVd?GySi(abOwE*Wpl>EU0S+a=u5teJ~w zkfJhznG0ZW)uKC`=i_fCPd6p-WNnzM)pYiwE&VO5N!3xc_eBbeFc(=auEoyfnM-jH z(yzL~~CLjcK_!)V`*V=sI48{ z))wEwQotGM=>|>eM(6b7t7D^Cg@xld#Qmboq6dCXjdKfg?6xzzFv@PhXkJ95M!TZX@`52`-tcCL2Izd7vmmK)rG zukFCk=Ls(>ZEn0(C!6=Vvu-~nGBc)fY?8~@2yHjkrBdZ4`sN{qN%dUadGOu=RbKso z!$oaqtf7j0A(bwV7GOz|9{y&Lt{lnwIU@8Wi`SeTm4$2>p`Y{gA0WL-q{RR5x=iW+ z;dPlf*#CdXs8v%Yev2LPAFq3dkTJavD}}`9`oF|(sDl_n+iJFoBI(ah!oCTmbep@K z2L?>NX=KjY%WSZ^04n7$pdd(XP=ZgC&F>V#;Puh2&pIaUC)wq5H&F!u=zO?4<@kGE zkjGyf#qE9hdtWRN9vqMY*W;-eehPRV^JEFyz}XWpp)ko|3!6L6OAu((-OpUZpZ3#Y zxv|C63@Uw4cR%*gKQ@Z_#CH08xl4aPyu*h#e7XXr*CP}tn#|I)V%{KK1{Q#_Z7_k* z^=3)^aO`QYaQiAmRODf-Av#3LjT1dfC3s>i*c2k=`$g)S_YL^8U%CCMtT(2`#FGo* z+U9`?7LWd|ZTgWvxtDT{l{6SlXej1psS5Ok~i#`x=8NtmYC zN;<-_YRyGhRdtEA_-x)y>Ae+@y3?9{typ} zp7nuF2Q^ttZWEBOks^zlIw|{%G$S05ur4AoC>(>EF?Cx~{pOQ0JAUGXoVQk}nV>c# z`Qb$(G-f4HLdAIkwj5R@7$oCz3Td|2E?EJT;l9aD559@eM>_sqND85QnBAV`QmOrq z9^OKm~9v*aRjVzMUT0-1z20kKdDH$0=jk! zWY}2GG79w0jI7o0B`RZzw+s~Ol_QaF2kETTrYuT-&$;z%mc?B;`BLRM#A6+nBY{7dSWsjqUY4o7V_>J-3IEtM-hvjf#b%J80HAj%{AGaq}} z1%=lFz5zy$)~8usY)58luZZhQK_d4{KST?U0wX@QXAu;Z)1fM zO(4kiqU)H{V~a&t?q5>?j30GvaDsvJc^9lORqyr9g}A+t7s=R9uMIJ0D9gV}3t!#uJI^aiPuB_b1$1TH z*j2YsA8^??hd0-Ddkq92qtip5)ZAcSq4ep`o_`w4r51ZRN>bI<*0B8TJ!u{y=wiyvzUb9+>{) zJuox>m-jHLJsEez3Ew-f@d}|_s)vqvXTQzN$LFGIJo}qO}&0d6z-?in{tC2CXE=GrZ&N?fY>`TACJ{Ojf<4_)A^7th@=cqXUv3q45{q zWcLn#oR)!mrXi^9HO=DK2lMzh@_sARG{E48JO4feA`yT4hJbtXH z@9SDSgt$3awGN>urDWfh)`AuN@tIRVhuR&TsUr|pQlZjC&6Pp-HHnrs znlHz~Vp7_>^v9ODk>1RpaQtJi3 zpFga62Z{YZRGmYRX3@58)2y^@+qP}nw)rP2ZQHhO+s;bcw(8Y+=Qi$b?B0&pD`I!% zT=Sb_(CW_juV?yrwIsfc6zXodU5503x-mq1xIo&o%%wOtI+;8t#8CVH zvBt@}+BBK6j~pO7NDaBE?K#-KbmFq$#k$BVqGaF+woRuL9mXL)cyr4AoX!vy zLU_Ia7W=|)NXOA^m{_0nB{Rfi{|vHOPDE6j#YmIi(g&Nn)A$1XFqoSMxpD-1w*Z_t zHDMX}Pt5}X#T_3)6OO90(l8@xS`jSQ&uh&fG3BiM@E2w3AH01_h5$vZXv4aaf}LAx z5oPsI2kw#Xz4jpK93UTvYNG?a`!<#=QgZH9xFA=1 z-W*#CGhf90|8b{fCu` z5sUCcq)1`JAS4%cA{7tl?Oql#9!2WCjEblF24WBtTUg+%t+}NKMcpwr5gOIKf?=dp z=n899&{%69%hu}xCUOR+$^^9Irc&|xiX!uQyyeO3I^0mb5ftz5uJ#G7EV zF?O(T%#I&x<{7K-%mULV)ei7)$-BQJ7nEtf7o) z4}tqmUuRtpK1_%8Lbl5D=I9&A?by4~kC6EZ5ZL;-zS+U)bhW{8X$G0o71>NOqzO25 z?Iw^$dodJPix0X*iDS`72;lNN(b`QH!Wn>9UAt)kJD(XUY`|sofOm0U@ZD#(t+!!i zwNB8ym1_trKIADr^{>vK1o=>Nt&!46g3Q+>Y_%pWNF@a57o2osEOgL>WE$jYl|Mfz zZ%)|Jt$_tSix053cDlp11PNoy;pf_PY{1^iacvmORL>ydiA2ep0A{dMRZ|=_Pq8N` zloxhgc%kALc-KF~#_lN@8o#57aeSo5cUiDW#$|CB4{E{_%TOU5zm8b&q>6hP^t03p z-7B}Alw8=Y4=~Wc$m9KC+fEV=dwI9pbbA+&MbvLe%Fbi4A00Z5T}Wq?QA!JQ|3O!GFJ&hF(rPKPZ(b!l8i2_F%$%(Mr!(u(nQ=a9hwDA1dIB+jQ)sBHLa2~#rEZfu zNu3->^*L?yS?{>IWPnB_l$5$|N30ghl~H-6}v32 zBTwEvQM*Lk983K?`7m|CyVK>b)h%w(-GC$by#7FCaC=*66LN#NoGPkrak*Rk+xO-3 zewubW&@t6;cO$;z*UjxmWPPly!LHJg1S3#zhjfty*H?CmCveT7C=<0H-F4QPpBo8d zYdH)s^uqC{9-uDoy!z<*T6$3@Eey;-lkiy!*=OZzp{Z9&(||J1fkRxTnJiF(&B#z2 ztv)V;8{t;fC4sT)eZRis5g!biF-~kG_iWhPTgE22R}6U#8gwDpvrrhRqb_4iU=qv! z3C;6Fc`=d9a(oph*SwuW$AQZqhLGIO2q&Gw6V!VMBArjlAGD|u--Ro8Wz&1%m$by4!J9}^P&Nf z^r;3)UTa@yB}jpdpz2Xb?CuEBHE%jt*VJ95=R83tE{90w$csU20*|0{L4$IVqVhrZ z4iH&UBNmM&Z47m4I8c;z6o7<;-=!uU3rF?Lm_x)ELb?W|Wo*Jph*#vRi`|j$xPC)A z$JyumRIN%vvCd*}esuVDh9_gDClr9K)3G-df8_}Xb`~l|CC!}*kekVIHmpFVj+Js_ zv0yg1RjFQ_0p-fU$tG2~CJ35O?LMX2>II-6u_A4+s?H&#nOUtF4p)Wqm=rToU4zKD zP(ni(Xd!-C(Fe;7(lhq-Av#^PLotJ*E;npv0L=2toTVP<(k1vtAQ_f39z1|GBSPX! z9D>=UiQNVGg{krc7KOWB;Sd790!aF7nDnIr!YWf7&TG+8l$W z^fw3tk{}71emog-LL`}a>Oq-v65Ly1Iu%Dr2i&-z`Jhol$Xrr*Ybf!|I?1MYx?b-3 zQ9%B-xd;!6iY%Gj*uZ1lvI;=m(zP&!IiqV;MFi@OU;B5m#gs6dfBJeN&>*UGOu`;z z(a8nY$s$Ia2hA9vOS?2j1<5~QLDhW>qzec0Yc}|Ajx3WgiJ8H4Xxf9&FC3ck3iK5U;@}Ee zuO4SY+>^z%Y{Qdvx!O){O~e8-$NkOxcN=eXvwZc4f1mO2S9S%!IrTaAN4F))vSt|j zAsyd|3I?Qyr8tmLIWyQ_qGR*K9fcEDB#>r;-?e*%_kG594by6N`8FJ6G734RbmgS| z8YOwQAS_IyA{@JtK$jz`8plh<+;D#a*SLz}v=N41;pZt^A}`@0qtPK8HN%~&0s}M1 zy%&;nl_fZRU^*O7dr<`XiZRPyd(s;khJjsM-i~B7r~<&`sfYS<@+XLy+=}^%-$h`l z55)TWBfX6EYHyMS8)EFt)t%eQeXtv66F!q3SuF0d57@mUqx&K2ge zRZg^VIq*U{MbqZgpU#K78N8Z@ddRzBHQ@|a5y2GzxI2ORXM!$|yF;_zZ^utL8jZS6 zB3LHnq;UhdWXH@@T3ow9V~KuuVo6^?v&i}#>(dnzsL*ldr5Jph2+iYy4>&=v8(-c$ zQIDTHqQ=#6^)p1u)TFX%sdfK1kNG5SX)MK9H?au@v94=|_h#%;wzP$qHaqQ=#fX8U zrz?`2-?XePKW3B})myz`jlD}e6s0P8n8q(qLn>d#KG1v%YE<`ns6JUdpe0~zZ< z5X%7=K}@2CSW!kP$A@kwfV71_%x4$2e(ALM#OZjYZ1;Rc=&2rvB?}lgk*HWW?d=!8 zG*Ff6dc=fnTI@d5;R=J1eYs`@yv0YFuAaEt;3sbNxBW)g!e_7PKZQe#1Rj0_%kY+q zKA~GSs+DT9&xUO&Qu;gm{E=*Z)xaQfQg#N2Bq_=8WKHtl0+yOhJqWtV>l2QEw$7p? zKMf_uA*jFC`xC!Mvpfy4p4XOz0^?r26yPiH!zDI5NaT04>B_A^zo=s2;}sn1eq!0n z61t#R-54s;G+xk~u_EtqAEl~q8Bqhof8*>^X^Pj=7EG+vb6u57+j7=~$?&rq>i!6& zCdop-?6ah@ObfQd4s&THxYWRV!H(w#*o6h^18MVPIX8PrhHj!<*%~jMSnlfI^T^x; zxNT~21yKpn;60j}Rit@s)oy7m8@NW#d8e$JhMM?_b7hTi@xOlUKl&Jd?8yN9TCxN# zk`9YLZtfSDw(hjbl1Pe6o+4LH2JU) z!aD`!D1z@ym@?V3NIk?V8M521PA1)aIOw#*k-C}sD^v%(rvfPpBwU;` zhJ}~z`1LR4%~51n4`;S#m;FEOD3!0DBXDIWey{fH32l03@oOb}r6mBRoON`DRS!{MyQ zFL>YUW7y<-pJS!v{=T`IUdw5^d5$`(+3$1&Y@FDsD&DB)g=%$BGIMW=enJ#JBcHJ~ z4dg53QQpXNdD;@*rbs*u7W=g;O=`bL42A@O(w5}VAYGK_kOOh&R3_=v5|{Zu{Y6Vo z$0&+!EGec-2up8AqGS_p(Ik-3;Lz1U^9r%IrqH^tN-rU4w_`-erQQ6^ICxKWpX zpx@^0laW7#2L0!msK0L@?6|HD0iy3;>3rwz^=#3Gs#X{?_2)H8Nh)iEJUu(D?be^) z3h#LX?2Yxd89wlbHahDun2vKFfb@f_Tl`DoWzqg~>YXUp@nd6&wAheui&~pU1LOPQ zrR-S2!63**gZS>oe8-QM$M0Z!Pn#qQS{(TfB_J-qgZ|pbd+WaG{i~bvP?Ztey*!dq z2<=u+*I1pa>v#aQu92xcRRi!|oF?#N;52anZ96YNDAFd_Jrm zC%$g-40Sm*N6+~((?pQB&L;5-GD_(x1SYOJ*IPcez|Wn)Bb%;u-rcaaGJ*7ue+buGzn1T z_q#fBtRm?KpwqmwMPM6fc1`{VpyAddKIF-f3$QJlfM!fz10HeusRKWtuNXv%(K`v; z*vg}$MofrG!7iZdhA3PUb?Oy<*)0F$;ORf>;9dmPduWRLEuLC)YwG)EpEzs0XzJf~ zT002mso89a3`AUUfIOhgiaye*^SQ3l(F@t~A5t)JK%bSBw{w5JV>CJt~yW14f6Mx6 zer&}WAl-^L0{Zwa#KWnj&Jp1+&-HU!DGw$Fe5>T!f^~DSwGsmfWwC8laxgmV@3qvK zS|oSWtlf4ZTTiX9fhi>E)<1j>s^G+|3->IZvYSKU_*_CO0Pa$F1;1|w5lt~&sVrH&)#`~2r-RnH z7F+SAM9qBG5|+JbX5L8$ljivXI+WsLY^zP|=l8WWBW-LxV>7M)r z@dT93zy&oP+;!28aG6-^Yd8zKV(Tpow#5e~S*+fxvztrf&Y_Y$icEG#Wig?%&}k3c7Fa>q;>A3YlyT`buxXw-eCoF1?GUmz|JH$mv`eR+*!Wugi@$)3N5zJvEfcr1P z?e5wa3}{Z?u=vcnOo{rM#HamI5?K_FGcITbG-vEs^Y&s(+HnfHm%$=AAEUqdVQRwG zn9>fX3oggVWp)rI@#UM$WR=RLc8`A;J*)q*6%Vb@$I73Y(V)|e^_+V2ZT9oWntf}L z`g1q(tNPahC)NmL{nB90Za@aI03adG42aBH2CRkr$zIo}8iP-FOI7h=tsl)%G-f#J zh4>Jrt#L38kg$~Cz8%=q)Ssf^dY&lFa-41+oZ*R5RcGSK(aA@W!6qPGh>9M0^&FcH z5n<2JyBfF{iZUrK!NwVd{-cH>L>-cn_)(4-VB3$pbZxTjD&yny zi(S*AWI6Rk_C~nUppG5IS6RLPk-f{tc9NPf5weYEkJiq@rS+Ep^!2#JfeEJgW9+CK z>gWcg6Ug?>E^vn(>~CFEd1+ARQxROwrDc!=tL){;W$JRWSZFN9A%`XNz;0bV`SV&2 zxxT90>u*14j`K%As@YWnix%$sI{^+T!cjsF`ky^527S)NFOCWP?CS zmJpn9)B8XgpVoVYZ&mN3#I3>%Z1NUR#2Z1TIra^08sg6iz{c#EmWp@)t|2*WkicLe z(5_rZq}cK;XLw%`iBo->CXKKrf&>Qt6Ot)@i@5i_c^=J<^h=?GR?{h+Lju+y{;Y5X{rjXnTrhGhd)DlG2We2g?)7 zsWKjEJC-6l08izMB!>m&jA?{2hf1k*!DZT=QMpHLRw*^&q>5Sgb_>RtM zda?_3d&puxl^$KcIgs4eB4`Ob^)Nm4^Xsd;{jU84n6GxHa>u!e@q7!R&knY01v$(I zgKFumvjAP2?UQCkKC(C0bJ9G5WAmFyjdmLJc1c;6p zUnkf0S;c%)`na>nWLuZC|6^+#KH3%pfIhv>e=c`W{1bay!)fIDeQr*a(N-H$s>hS^ zm{8mT#P((BS~wvC=q*ZJbU8}YdQ1B^PPRR_5%x$kt`Eg(LEGVXFJ5NlMzgMc;?E%& z3U#p(@5`l@{O1H`{N>$~D{iGWGMPtkb+B9Tz8+}&1rmu+qV!4iC%n-*A#0|o?l?Z9 zJPwb69^(B*@16UQ2FA!clj#6AZ*2s-^x$$*~_3fGCITt6rg6p_*88HAA)A`jU?o zlM~DlktFit50pqaU_Yzb_%BIY`h>}r1qO`xbw}9Zw>e#UKV`dM&t#hN;QnK^G@1Up zuV!qGy14%Pxl8P@kAF|mw_(35$o9VN5g*`ldKvCV68kpP^{-eknxclpY4y0}C@N&n zidp9Z*xly(x36)ZK_1>O@mgK`eKxGyPkl7*@W^ z;C@j$us$fFv-~G+Q6EyQ9CSTvT9(Mv-0T4Oc}Uv%d5gQYBiI>c);7z5n>dbvk-VJE zEbbRZ`K7o_QMRwEX;B~#N5h$`7vs{g(WLu68m-(zo&_x2DX6?Z-a?73;uL=T|@RT zadP4IG=cnp9OXSaBwmOPy$D-dCq9Q8RzW|LE-E*gIaSNKtP}r+IXvyOlb>hGLtYH1 z*Z?wbwq}VpP6gZdRunP4PB8x;xHuC4zfakbCP(4ArE2TC(y&r}bX1b4!s2vNH;lO91%;Rk3gef)ekq2;f^$!13&odc zj))W^%|s#(dF-gPnK+Gjl!o}E8PM*ynqPRwHZ)bz(=m>&PyI&+!BJhzm+1)L&(|JP zUwqB)Y7XOp_)({zvr%Q%gwB!k^^zBpdD*7k$=BAm)5_tIV){v$yaR*b?KYTo`1JDq zG8FfA|68PQC=UTPaTVm_a3)wzODjAamv3^(kDEO!kAKbF4 ze`E%;E+|Z66^MrD9r=L@LpU5j+6|r!%Xj&5l1H%f_vgz}k$~Vw@7Y*&7JX%_96GI*p}^~wg`qPbUrLL^)Xa_#>7zylRr~H*+r2{OtNsJKtkA;#P3PV zROhf5@w&!tHm)&23nvNjG8n~Mn3^{gKg!b$m2Wlgep=6IdAIfYd)^KpFNN}cMZ)

@lfr;_q5P-uG6MwJ0xI7Uu~vT0>mc46S0rA!T3 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 U3j{X`l4$a zQmq&;wsu+@P-oMY+?Hb?7;w4~Y$xMm6QlslEyHDHr4oi`A1^ZJjd;%ZSu|8`-}X2n zHO6=M!ZSmB{hjg8fq(b|9JC|VnSi9U#remKElY5gcll^me^$c=iNuHDpysPLftzT~ z%)eN$rM`n+YHX6-D}S`{SDToG zR}lfuv>&^(()O6`u>4gs=)0|ZCNVl7)J0cX6SKJ0zgRZ$NM@{B{n?eBSX*<|^95bU zRQn1`Sg=mY-Ks9vY!(*F?^Z=aximJJ10;u8tV@EEBC3wh*0wLAGB_Z-bAtBz&onuH z_edn<&6cHmSuzITZ|xYxwTd)^f_;pp@~>;l4BL1g4KNi zlO#}VrC}iw^e~Legf(s|M^KsLj8iejLybJ&CCD&Y z7o$#?Dz16vGBTNh5H|}iI!6~kOnHr}VhZ#|M`KX|@_-Zu%y0p-BA!5%4?^Y0O|>lL zam9D$G-YQ-nd+_D)G+pEmEE73MK1Eo)*=IrDuSh1kxt2f7?&g6-!kUlJ~1f|25GiV zjS~}Y$1@E7=B(*I8dcPD$88?RSv)~n{LIB3E1uih_a{--?@sUM7H^(_AP+!5UK~pL z=sH^mc(y1CJN@etJa+NpS{!8$&EJ%nZ>HB@xaKoi4j=We0`Sn)Iz`Y?3RNvHEmVpT zdwAukZ0+SB-Y(dxd><}T9)G{y_UAr>A)I}`FcQRq5gfV={0k)FYA{#Vk5#-@fkq*~ z+Q^Cy4rVTD;&l8P;IF0t2iXQ~bfin-0{fPlOX%0D;yF>5=t)s_z)ZuOrs2Gkmwt)C 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 L$;rhPC1C$QKSLtR delta 125782 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 sft2Y^>%h_0H{wtO$^@xTQnD5 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 b13*Z6%b6D*h!hxn`~tk_w6xNyGU)#Un-Om9 diff --git a/docs/manual/fr/user-manual.tex b/docs/manual/fr/user-manual.tex index f4586c39..25dde525 100644 --- a/docs/manual/fr/user-manual.tex +++ b/docs/manual/fr/user-manual.tex @@ -961,7 +961,9 @@ \subsection{Enregistrer et annuler un règlement}\label{sec:reglement-client} \begin{itemize} \item \textbf{la facture a été créditée} par un avoir~: le règlement est alors un paiement - \emph{à lettrer} à une autre facture --- il ne s'annule pas~; + \emph{à lettrer} à une autre facture --- il ne s'annule pas. Ce cas ne se présente plus + que sur une facture créditée \emph{avant} la version 0.12.1, ou restaurée d'une sauvegarde + antérieure~: un avoir est désormais refusé sur une facture réglée (\S\ref{sec:avoirs})~; \item \textbf{l'exercice du règlement est clôturé}~: un administrateur doit d'abord \textbf{rouvrir} l'exercice~; \item \textbf{le règlement est rapproché} d'une transaction bancaire~: il faut d'abord @@ -1016,6 +1018,16 @@ \subsection{Avoirs et notes de crédit} L'avoir est consultable dans \emph{Avoirs} (menu \emph{Quotidien}), avec un \textbf{PDF « Avoir »} téléchargeable (mention « Avoir », référence à la facture d'origine, sans section QR de paiement). Le \emph{Décompte TVA} de la période tient compte de l'annulation (la TVA de la facture annulée est exclue). +\begin{keshwarning} +\textbf{Avoir refusé : « la facture porte un règlement ».} Un avoir annule \emph{toute} la facture. Si +le client en a déjà réglé une partie, l'avoir lui laisserait un crédit du montant encaissé, que +Kesh ne sait encore ni afficher, ni rembourser, ni imputer sur une autre facture. L'avoir est donc +refusé dès qu'un règlement existe --- même partiel ---, et Kesh le dit dans le dialogue. +\textbf{Annulez d'abord le règlement} depuis la fiche de la facture (\S\ref{sec:reglement-client}), +puis émettez l'avoir. Si le client ne paiera simplement pas le solde, ce n'est pas un avoir qu'il +faut, mais passer le reste en perte --- fonction prévue. +\end{keshwarning} + \begin{keshwarning} \textbf{Avoir refusé : « compte de produit archivé ».} Si une ligne de la facture impute un compte de produit qui a été \textbf{archivé depuis la validation}, Kesh refuse d'émettre l'avoir et nomme la ligne et le compte concernés. @@ -1037,7 +1049,7 @@ \subsection{Avoirs et notes de crédit} \end{keshwarning} \begin{keshnote} -En version actuelle, l'avoir est \textbf{total} (il annule la facture entière). L'avoir \emph{partiel} et le remboursement d'une facture \emph{déjà encaissée} (un avoir est refusé sur une facture marquée payée) sont prévus pour une version ultérieure. Les paiements sortants par fichier \texttt{pain.001.001.09} sont, eux, \textbf{disponibles} (cf. \S\ref{sec:paiements-fournisseurs}). +En version actuelle, l'avoir est \textbf{total} (il annule la facture entière). L'avoir \emph{partiel} et le remboursement d'une facture \emph{déjà encaissée} (un avoir est refusé sur une facture \textbf{réglée, même en partie}) sont prévus pour une version ultérieure. Les paiements sortants par fichier \texttt{pain.001.001.09} sont, eux, \textbf{disponibles} (cf. \S\ref{sec:paiements-fournisseurs}). \end{keshnote} \subsection{Supprimer ou dévalider une facture} @@ -1453,7 +1465,8 @@ \subsection{Annuler un rapprochement}\label{sec:annuler-rapprochement} \begin{itemize} \item \textbf{la facture a été créditée} par un avoir~: son règlement est un paiement - \emph{à lettrer}, il ne s'annule pas~; + \emph{à lettrer}, il ne s'annule pas --- cas hérité d'une version antérieure à la 0.12.1 + ou d'une sauvegarde restaurée~; \item \textbf{l'exercice de l'écriture du rapprochement est clôturé}~: un administrateur doit d'abord le rouvrir. ⚠️ C'est l'exercice du \textbf{paiement} qui compte, jamais celui de la facture~: une facture de décembre dont l'exercice est clôturé, payée en @@ -2070,7 +2083,7 @@ \subsection{Nouveautés et limites (v0.3.0)} \begin{itemize} \item Mono-devise CHF (multi-devises prévu pour une version ultérieure). \item Décompte TVA au format officiel AFC / e-décompte ESTV (les montants du décompte Kesh sont à reporter manuellement sur le formulaire AFC). - \item Avoir \emph{partiel} et avoir sur facture \emph{déjà encaissée} (l'avoir total sur facture non payée est, lui, disponible — cf. \S\ref{sec:avoirs}). + \item Avoir \emph{partiel} et avoir sur facture \emph{déjà encaissée}, même en partie (l'avoir total sur une facture sans aucun règlement est, lui, disponible — cf. \S\ref{sec:avoirs}). \item Sélecteur de langue dans l'interface (la langue est fixée à l'onboarding ; le changement en cours de session est prévu pour une version ultérieure). \item Pas de signature électronique qualifiée (QES) sur les exports (verdict (b) de la recherche réglementaire, prévu Epic 14). \item Format PDF standard, non PDF/A (migration prévue selon ISO 19005). diff --git a/frontend/src/routes/(app)/invoices/[id]/+page.svelte b/frontend/src/routes/(app)/invoices/[id]/+page.svelte index fb992f87..c4c2ce6a 100644 --- a/frontend/src/routes/(app)/invoices/[id]/+page.svelte +++ b/frontend/src/routes/(app)/invoices/[id]/+page.svelte @@ -833,15 +833,26 @@ Voir l'écriture comptable {/if} - {#if canManage && !invoice.paidAt} - {/if} {#if canManage && !invoice.paidAt} + à un rappel) : les boutons Suspendre/Reprendre sont masqués (review + P1 BH1). ⚠️ « Créer un avoir » ne l'est plus depuis la Story 25-4-a : + il s'affiche, et le serveur refuse avec le motif nommé. --> {#if invoice.dunningPausedAt === null} - diff --git a/frontend/src/routes/(app)/invoices/[id]/invoice-settlements-page.test.ts b/frontend/src/routes/(app)/invoices/[id]/invoice-settlements-page.test.ts index 52f6cf4e..d707f4d2 100644 --- a/frontend/src/routes/(app)/invoices/[id]/invoice-settlements-page.test.ts +++ b/frontend/src/routes/(app)/invoices/[id]/invoice-settlements-page.test.ts @@ -1,5 +1,6 @@ /** - * La fiche facture, côté annulation d'un règlement — Story 25-3-a-1 (#414). + * La fiche facture, côté annulation d'un règlement — Story 25-3-a-1 (#414) — + * et côté avoir sur une facture réglée — Story 25-4-a (#456). * * Ce que le composant de liste ne peut pas prouver seul : que la fiche * **confirme** avant d'envoyer, **relit** facture et règlements après succès, et @@ -70,8 +71,9 @@ vi.mock("$lib/features/reminders/reminders.api", () => ({ vi.mock("$lib/features/projects/projects.api", () => ({ listProjects: vi.fn(async () => []), })); +const createCreditNoteMock = vi.fn(); vi.mock("$lib/features/credit-notes/credit-notes.api", () => ({ - createCreditNote: vi.fn(), + createCreditNote: (req: unknown) => createCreditNoteMock(req), })); import Page from "./+page.svelte"; @@ -176,3 +178,35 @@ describe("fiche facture — annuler un règlement", () => { expect(await findByText("F-2026-005", { exact: false })).toBeTruthy(); }); }); + +describe("fiche facture — créer un avoir sur une facture réglée (Story 25-4-a)", () => { + it("le bouton s'affiche sur une facture ENTIÈREMENT payée (mutation m6 : `!invoice.paidAt` remis)", async () => { + const { findByTestId } = render(Page); + expect(await findByTestId("invoice-credit-note-button")).toBeTruthy(); + }); + + it("le bouton s'affiche sur une facture réglée EN PARTIE, sans `paidAt`", async () => { + getInvoiceMock.mockResolvedValue( + invoice({ paidAt: null, amountSettled: "40.00", amountDue: "60.00" }), + ); + const { findByTestId } = render(Page); + expect(await findByTestId("invoice-credit-note-button")).toBeTruthy(); + }); + + it("le refus du serveur s'affiche DANS le dialogue, avec son motif (le serveur tranche, l'écran le dit)", async () => { + createCreditNoteMock.mockRejectedValue({ + code: "CREDIT_NOTE_INVOICE_SETTLED", + message: + "Cette facture porte un règlement, même partiel : annulez-le d'abord pour pouvoir émettre un avoir. (F-2026-005)", + status: 409, + }); + const { findByTestId, getByTestId } = render(Page); + + await fireEvent.click(await findByTestId("invoice-credit-note-button")); + await fireEvent.click(getByTestId("invoice-credit-note-confirm")); + + await waitFor(() => expect(createCreditNoteMock).toHaveBeenCalledTimes(1)); + const erreur = await findByTestId("invoice-credit-note-error"); + expect(erreur.textContent).toContain("annulez-le d'abord"); + }); +}); From 21ee2648d2bc1ed8b0003cf0690fd83a503e19d2 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 01:02:32 +0200 Subject: [PATCH 17/51] docs(25-4-a): prompt de la revue de code P1 (refs #455, refs #456) Co-Authored-By: Claude Opus 5.5 --- .../25-4-a-review-prompt-p1.md | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 _bmad-output/implementation-artifacts/25-4-a-review-prompt-p1.md diff --git a/_bmad-output/implementation-artifacts/25-4-a-review-prompt-p1.md b/_bmad-output/implementation-artifacts/25-4-a-review-prompt-p1.md new file mode 100644 index 00000000..f19f3516 --- /dev/null +++ b/_bmad-output/implementation-artifacts/25-4-a-review-prompt-p1.md @@ -0,0 +1,51 @@ +# Prompt — revue de code P1, Story 25-4-a (le résiduel juste) + +*Versionné le 2026-09-27. **Une lentille** (Sonnet), contexte frais.* + +Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-4-propager-le-residuel`. Diff à relire : +`git diff ab9b9448 9bf2bb2b` (commit de dev, après la validation close). Fiche : +`_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md` (AC, Dev Notes, Dev Agent Record). +Issues : `gh issue view 455`, `gh issue view 456`. Règles : `CLAUDE.md`. **Arbitrages de Guy** (fiche +§ Arbitrage, fiche mère `25-4-propager-le-residuel.md`) : ne pas les contester. + +## Axes — tous obligatoires + +1. **SQL** : les quatre constantes produites par `line_ttc_sql!` (`invoices.rs`, + `invoice_settlements.rs`) — développe-les à la main et vérifie le texte exact (espaces, alias, + `\` de continuation dans un `concat!`), l'égalité **octet pour octet** des deux constantes TTC + facture avec leur forme d'avant (`git show ab9b9448:crates/kesh-db/src/repositories/invoices.rs`), + et l'agrégation de la forme jointe de l'avoir (GROUP BY, jointure, filtre `issued`). +2. **La garde** (`credit_notes.rs`) : ordre verrou → lecture verrouillante, scoping `company_id`, + chemins d'erreur, rien écrit en cas de refus. Les tests prouvent-ils ce qu'ils annoncent, ou + peuvent-ils passer à vide (surtout l'entrelacement : que se passe-t-il si + `attendre_une_requete_en_cours` voit une AUTRE requête que celle de l'avoir) ? +3. **Tous les lecteurs** des grandeurs changées : `grep -rn "INVOICE_CREDITED\|amount_due\|INVOICE_TTC" crates/` + — un appelant change-t-il de valeur sans test ? Et tout appelant de `create_credit_note`, ou qui + matchait `IllegalStateTransition` pour le cas « payée » (API, frontend, tests) ? +4. **La fixture `monter`** : le gabarit tient-il pour les quinze cas ? Un motif lit-il la facture + auxiliaire ? +5. **Le manuel dit-il vrai ?** `docs/manual/fr/user-manual.tex` — les passages modifiés (§ Avoirs, les + deux limites, les deux « cas hérité ») contre le code ; **le PDF aplati** + (`pdftotext docs/manual/fr/user-manual.pdf - | tr '\n' ' ' | tr -s ' '`, vers + `/tmp/claude-1000/-home-gcorbaz-devel-kesh/ca5ce2e2-67a3-4eeb-817f-c2de35620a1c/scratchpad/`), + `??` compris. Le renvoi `\S\ref{sec:reglement-client}` pointe-t-il où il faut ? Le CHANGELOG + décrit-il juste (l'API, le bouton) ? +6. **i18n** : la clé ×4 — sens, registre du glossaire (`docs/i18n-glossaire.md` § Registre), terme + « avoir » du glossaire. +7. **Frontend** : le bouton, les commentaires, les `data-testid` ; les Vitest tuent-ils vraiment m6 ? +8. **Dev Agent Record** : chaque décompte (tests, mutations, gates) **recompté** depuis la source. + +## Ce que tu rends + +- **Findings** : sévérité (CRITICAL / HIGH / MEDIUM / LOW), fichier:ligne, **preuve** (commande et + résultat, code lu), correction proposée. +- ⛔ **La liste des axes réellement exercés ET de ceux qui ne l'ont pas été.** + +## Interdits + +⛔ N'écris aucun fichier du dépôt ; aucune commande qui écrit dans le dépôt ou dans une base — +`scripts/prepare-release.sh`, `scripts/regen-test-schema.sh`, `scripts/install-hooks.sh`, +`scripts/test-fast.sh`, `scripts/mem-guard.sh`, `make`, `latexmk`, tout `git commit`/`push`/`add`/ +`stash`/`reset`/`rebase`/`checkout`/`switch`/`worktree`, `sqlx migrate`, `cargo test`/`nextest`, +`npm run`, `npx playwright`. Autorisés : lecture, `grep`, `git log`/`show`/`diff`, `gh issue view`, +`pdftotext` vers le scratchpad, `cargo check`, `cargo expand` s'il est installé. From 41e14e4c2a90d1e63d004904d6c73f5a5cba04eb Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 01:11:17 +0200 Subject: [PATCH 18/51] =?UTF-8?q?docs(25-4-a):=20revue=20P1=20=C3=A0=20z?= =?UTF-8?q?=C3=A9ro=20au-dessus=20de=20LOW=20=E2=80=94=20story=20done=20(r?= =?UTF-8?q?efs=20#455,=20refs=20#456)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-a-residuel-juste.md | 15 ++++++++++++--- .../implementation-artifacts/sprint-status.yaml | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md b/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md index 82b5e340..0f17fadb 100644 --- a/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md +++ b/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md @@ -1,6 +1,6 @@ # Story 25.4-a : Le résiduel juste — l'avoir compté TTC, et refusé sur une facture réglée -Status: review +Status: done **Issues : [#455], [#456]**, qu'elle **ferme** : `closes #455, closes #456` dans le **titre ET le corps** de la PR (squash ; un `refs` partout laisserait les issues ouvertes sans signal). @@ -399,8 +399,8 @@ Claude Opus 5.5. précédence restent verts. Doc-comments de `InvoiceCredited` et du rang 1 : état hérité. - **Frontend** (AC 14) : condition `!invoice.paidAt` retirée du bouton, commentaires Suspendre/Reprendre corrigé ; `data-testid` sur le bouton, la confirmation et l'erreur du dialogue. -- **Textes** (AC 17) : manuel (refus nommé en § Avoirs, deux limites reformulées « réglée, même en - partie », deux motifs d'annulation de règlement précisés comme **cas hérité**), PDF régénéré et +- **Textes** (AC 17) : manuel (refus nommé en § Avoirs, deux limites corrigées pour couvrir le règlement + partiel — l'une « réglée, même en partie », l'autre « déjà encaissée, même en partie », deux motifs d'annulation de règlement précisés comme **cas hérité**), PDF régénéré et contrôlé aplati (0 `??`, six phrases de contrôle présentes, « marquée payée » absente) ; CHANGELOG *Fixed* ×2 (dont **l'API** pour #455) et *Changed* (le bouton). Grep large du symptôme « avoir sur facture payée » : aucun autre site. @@ -456,6 +456,15 @@ Claude Opus 5.5. ## Change Log +- **2026-09-27** — **revue de code P1** (Sonnet, diff `ab9b9448..9bf2bb2b`, prompt + `25-4-a-review-prompt-p1.md`) — **0 au-dessus de LOW, 1 LOW** : le compte rendu attribuait la + formule « réglée, même en partie » aux deux limites du manuel, la seconde dit « déjà encaissée, + même en partie » — compte rendu corrigé, le manuel était juste. Les huit axes exercés avec preuve : + les constantes TTC facture **octet pour octet identiques** à leur forme d'avant, l'entrelacement ne + peut pas passer à vide (le motif ne correspond qu'à la requête verrouillante de l'avoir), tous les + lecteurs d'`amount_due` inchangés et resserrés, PDF aplati, i18n, Vitest, décomptes recomptés. + Non exercé : la ré-exécution des gates et des mutations (interdite à la lentille). **Revue close en + une passe ; story `done`.** - **2026-09-27** — **dev** (Opus 5.5) : formule du TTC de ligne factorisée (`line_ttc_sql!`), avoir compté TTC, garde verrouillante de l'avoir sur facture réglée, variante `CREDIT_NOTE_INVOICE_SETTLED` ×4 locales, fixture `monter` par le gabarit, bouton aligné sur « Dévalider », manuel et CHANGELOG. diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index 7502347b..ea88fb5a 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -354,7 +354,7 @@ development_status: 25-3-c-annuler-facture-fournisseur: done # 2026-09-26 **REVUE CLOSE EN 1 PASSE** (0 > LOW, Sonnet x3) ; non poussee ; PR `closes #454` titre ET corps, sur accord. **IMPLEMENTEE** — gates 2472/2472, 783/783, E2E 220/10/19 sans regression ; prochaine etape : code review. # 2026-09-26 **SPEC VALIDEE en 2 passes** (3 MED -> 0 > LOW). **SPECIFIEE** — `25-3-c-annuler-facture-fournisseur.md`. Geste par le socle (autorite `SupplierPurchase`), queue commune sur l'ecriture d'ACHAT, lot en dernier rang ; payee : reglement DETACHE (colonnes remises a NULL, ecriture libre, lien garde par l'audit) — **Q1 tranchee par Guy le 2026-09-26**. Aucune migration. Prochaine etape : validate. # 2026-09-24 NEE d'un arbitrage de Guy — une facture fournisseur s'annule DANS TOUS LES CAS, sauf si l'exercice de son ecriture d'achat est CLOS (l'exercice, pas le verrou de periode) ; payee, son reglement RESTE au grand livre et REDEVIENT A LETTRER (Epic 15 : un paiement doit correspondre a une facture, au besoin creee pour lui — « comme bexio »). Reecrit `cancel`, donc absorbe [#454]. Derriere la 25-3-a. 25-3-b-annuler-rapprochement: done # 2026-09-25 DONE — revue close en passe 2 (Sonnet 1 MED -> Haiku 0) ; gates : backend 2463/2463, frontend 777/777, E2E sans regression. Non poussee. — SPEC VALIDEE (boucle close en passe 4 : 2 HIGH -> 2 MED -> 2 MED -> 3 LOW ; pas de decoupage, arbitrage de Guy). Q1-Q3 tranchees. — [#418] closes — annuler un rapprochement bancaire. ⛔ NE JAMAIS compter sur le `ON DELETE SET NULL` de `matched_entry_id` : supprimer l'ecriture ferait disparaitre le lien EN SILENCE, le mode d'echec meme que la story repare. ⚠️ Le chemin d'ACCEPTATION n'a aucune fonction `kesh-db` a mirer : il est ecrit en SQL brut a **cinq** sites de `routes/reconciliation.rs`, dont **un seul** porte le verrou optimiste. Quand la transaction porte une facture, appelle le geste de la 25-3-a. Derriere elle. 25-3-annuler-reglement-et-rapprochement: split # [#414] [#418] — **l'Epic 24 a livre l'encaissement et le rapprochement ; il n'a PAS livre le moyen de les DEFAIRE.** Une erreur d'imputation est aujourd'hui incorrigible autrement qu'a la main — et le gel de la 24-4b interdit precisement la main. ⚠️ *C'est le prix d'une story qui ferme une porte sans ouvrir la suivante : le gel est juste, et il rend cette story-ci necessaire.* - 25-4-a-residuel-juste: review # 2026-09-27 IMPLEMENTEE — 7/7 mutations tuees ; gates 2484/2484, 826/826, E2E 222/10/19 sans regression ; prochaine etape : code review. # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (masque a l'ecran, mais rendu par GET /invoices/{id} aux cles API : amountDue = la TVA sur une facture creditee) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE ; validation : P1 Sonnet 1H/3M/1L -> P2 Haiku 1M retenu -> P3 ciblee Opus 2M/5L -> P4 ciblee Sonnet 0 > LOW (1M reclasse LOW) : VALIDEE en 4 passes. Arbitrage 2026-09-27 : refus maintenu, levee tracee par #471. + 25-4-a-residuel-juste: done # 2026-09-27 REVUE CLOSE EN 1 PASSE (0 > LOW, 1 LOW corrige) ; rien de pousse — PR closes #455 #456 sur accord. # IMPLEMENTEE — 7/7 mutations tuees ; gates 2484/2484, 826/826, E2E 222/10/19 sans regression ; prochaine etape : code review. # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (masque a l'ecran, mais rendu par GET /invoices/{id} aux cles API : amountDue = la TVA sur une facture creditee) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE ; validation : P1 Sonnet 1H/3M/1L -> P2 Haiku 1M retenu -> P3 ciblee Opus 2M/5L -> P4 ciblee Sonnet 0 > LOW (1M reclasse LOW) : VALIDEE en 4 passes. Arbitrage 2026-09-27 : refus maintenu, levee tracee par #471. 25-4-b-residuel-aux-agregats: backlog # [#416] + montant des RELANCES (TTC complet, trouve a l'inventaire) — Q1 TRANCHEE 2026-09-27 : la QR du rappel porte le RESTE DU (= TTC sans reglement), reste a payer sur le PDF et dans le texte ; point ouvert : frais de rappel non comptabilises vs trop-percu. 25-4-c-residuel-au-rapprochement: backlog # [#420] — DEUX sites : filtre SQL des candidats (HAVING total_ttc) avant le score, puis score et re-score a l'acceptation. 25-4-d-solder-le-reste: backlog # [#384] ramenee de la 25-6 le 2026-09-27 (Guy) — perte sur debiteur, escompte, frais : clore une facture partiellement reglee ; la part TVA reduit la TVA due. From 8e8508b12639368fce47e43a99a0b6f0dabe51ea Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 01:15:43 +0200 Subject: [PATCH 19/51] =?UTF-8?q?docs(25-4-b):=20d=C3=A9coup=C3=A9e=20en?= =?UTF-8?q?=20b1/b2=20;=2025-4-b1=20sp=C3=A9cifi=C3=A9e=20=E2=80=94=20le?= =?UTF-8?q?=20reste=20d=C3=BB=20=C3=A0=20la=20balance=20=C3=A2g=C3=A9e=20e?= =?UTF-8?q?t=20=C3=A0=20l'=C3=A9ch=C3=A9ancier=20(refs=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-b1-residuel-aux-agregats.md | 194 ++++++++++++++++++ .../25-4-propager-le-residuel.md | 5 +- .../sprint-status.yaml | 7 +- 3 files changed, 203 insertions(+), 3 deletions(-) create mode 100644 _bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md diff --git a/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md b/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md new file mode 100644 index 00000000..8548faeb --- /dev/null +++ b/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md @@ -0,0 +1,194 @@ +# Story 25.4-b1 : Le résiduel aux agrégats — balance âgée et échéancier + +Status: ready-for-dev + +**Issue : [#416]** — cette story en livre la partie **agrégats** ; la partie **rappels** est la +25-4-b2. ⛔ **La PR de b1 porte `refs #416`, pas `closes`** : l'issue ne se ferme qu'avec b2. + +**Mère : `25-4-propager-le-residuel.md`** (`split`). **Sœur livrée : 25-4-a** (PR #472, #455 et #456) — +elle a rendu la formule juste (avoir compté TTC) et posé le test de parité des formes jointes ; +cette story en est le **premier appelant**. ⚠️ Branche **empilée** sur celle de 25-4-a : à rebaser +sur `main` après le merge de #472. + +## Story + +En tant que comptable, +je veux que la balance âgée et l'échéancier montrent ce que chaque client **doit encore**, et non +ce que la facture valait à l'émission, +afin de relancer les bons clients pour les bons montants, et que la balance âgée concorde avec le +compte débiteurs du grand livre. + +## Le défaut, vérifié dans le code + +Depuis la 24-2, une facture se règle en plusieurs fois ; le reste dû se **calcule** (24-2, D3). Les +écrans **unitaires** le savent (fiche facture : badge « partiellement payée », « Reste dû »). Les +écrans **agrégés**, non — ils totalisent le **TTC** : + +| Site | Ce qu'il somme | +|---|---| +| Balance âgée — `crates/kesh-report/src/aged_receivables.rs:111-131` (`generate`) | `COALESCE(lt.ttc, 0)` dans les cinq tranches et le total | +| Totaux de l'échéancier — `crates/kesh-db/src/repositories/invoices.rs:882-900` (`due_dates_summary`) | `unpaid_total`, `overdue_total` en `lt.ttc` ; le commentaire `:890-892` les dit « montants dus » — faux depuis la 24-2 | +| Lignes de l'échéancier — `list_by_company_paginated` (`:815-821`) | `total_ttc` seul ; **aucun** reste dû par ligne | +| Export CSV de l'échéancier — `list_for_export` (`:2456-2461`), `routes/invoices.rs:1463-1465` | colonne « Total » = TTC, commentée « montant dû » ; statut sans « partiel » (`:1443-1449`) | +| Page échéancier — `frontend/src/routes/(app)/invoices/due-dates/+page.svelte` | colonne Total = `totalTtc` (`:453`), `statusOf` sans `partial` (`:306-314`), dialogue `amountDue={null}` (`:493-507`) | + +Une facture de 1 000.— réglée à 900.— pèse **1 000.—** partout, au lieu de 100.—. ⚠️ La balance âgée +est un **instrument de décision** (qui relancer, pour combien) et doit **concorder avec le compte +débiteurs** du grand livre, juste depuis la 24-2 : les deux divergent aujourd'hui exactement du +montant des règlements partiels, et **aucun test ne compare** les deux (vérifié : aucun test de +`kesh-report` ne lit un solde de compte). + +⚠️ **Les formes jointes du résiduel n'ont aucun appelant** (`INVOICE_SETTLED_DERIVED_JOIN_SQL`, +`INVOICE_CREDITED_DERIVED_JOIN_SQL`) ; 25-4-a en a prouvé la parité avec les formes scalaires. La +24-2 (D3) a prescrit la **jointure dérivée** pour les listes et agrégats : la forme corrélée y +serait réévaluée par ligne — un N+1 déguisé. + +## Acceptance Criteria + +### Volet 1 — la grandeur, une seule fois + +**AC 1** — Une constante (ou une paire) canonique porte le **reste dû sous forme jointe** : les trois +tables dérivées (`lt` TTC, `cnt` avoir, `st` réglé) et l'expression +`COALESCE(lt.ttc, 0) − COALESCE(cnt.credited, 0) − COALESCE(st.settled, 0)`. Elle vit à côté +d'`amount_due` (`invoice_settlements.rs`), avec un doc-comment qui la dit **miroir** de la forme +scalaire. ⛔ Aucun site de cette story ne réécrit l'expression à la main. + +**AC 2** — Le **test de parité** de 25-4-a (`tests/invoice_amount_due_parity.rs`) est étendu : pour +chaque facture du jeu, l'expression jointe de l'AC 1 = `amount_due` scalaire. + +### Volet 2 — la balance âgée + +**AC 3** — Les cinq tranches et le total de `aged_receivables::generate` somment le **reste dû** +(AC 1), non le TTC. Les tranches restent assises sur `i.due_date` : ⛔ **un règlement partiel ne +rajeunit pas la créance restante**. + +**AC 4** — Le périmètre des factures ne change pas : `status = 'validated' AND paid_at IS NULL` +(une facture soldée a `paid_at`, 24-2 D4). Le `HAVING total <> 0` reste, et porte désormais sur le +reste dû. ⚠️ Un reste dû **négatif** (trop-perçu hérité) n'est **pas écrêté** : il apparaît, en +négatif — le doc-comment d'`amount_due` l'exige. + +**AC 5** — ⛔ **Invariant de concordance** (test) : sur une société dont le compte débiteurs n'est mû +que par des factures, des règlements et des avoirs — factures sans règlement, partiellement réglée, +soldée, créditée —, le **total de la balance âgée = solde du compte 1100 au grand livre** +(`general_ledger` ou somme `debit − credit`). C'est l'assertion que #416 réclame et qui n'existe +pour aucun écran. + +**AC 6** — Doc-comment de `generate` (`:95-99` : « Montants = TTC dérivé ») et libellés : la balance +âgée montre le **reste dû** ; l'écran (`AgedReceivablesView.svelte`) et son CSV gardent leur +structure — seules les valeurs changent. Si un libellé visible dit « TTC » ou « total facturé », +il devient « reste dû » (4 locales). + +### Volet 3 — l'échéancier + +**AC 7** — `due_dates_summary` : `unpaid_total` et `overdue_total` somment le **reste dû** ; le +commentaire `:890-892` dit vrai. + +**AC 8** — `InvoiceListItem` porte `amount_settled` et `amount_due` (`Decimal`), projetés par **les +deux SELECT** qui le désérialisent — `list_by_company_paginated` **et** `list_for_export` (⚠️ le +doc-comment `:263-269` le rappelle : un oubli échoue au **runtime**). Calculés par la **forme +jointe** (AC 1) ; `total_ttc` reste. ⛔ Pas de N+1 : le nombre de requêtes d'une page ne dépend pas +du nombre de lignes (invariant 7 de la 24-2). + +**AC 9** — `InvoiceListItemResponse` (`routes/invoices.rs:333-364`) expose `amountSettled` et +`amountDue` (camelCase, chaîne décimale). ⚠️ Même discipline que la fiche +(`routes/invoices.rs:242-248`) : **toujours calculés** dans une liste, jamais `None` par défaut. Le +type frontend (`invoices.types.ts`) suit. + +**AC 10** — Page échéancier : +- une colonne **« Reste dû »** (`amountDue`) à côté du Total TTC, qui reste ; +- le statut de ligne rend **`partial`** quand `paidAt` est nul et `amountSettled > 0` — même règle + que la fiche (`invoices/[id]/+page.svelte:424-438`), idéalement **la même fonction** partagée ; +- le résumé montre les totaux de l'AC 7 (les libellés disent « reste dû » s'ils disaient autre + chose) ; +- le dialogue de règlement reçoit **`amountDue={inv.amountDue}`** : pré-rempli, et sa garde client + de trop-perçu (`SettleInvoiceDialog.svelte:108-112`) redevient active depuis l'échéancier. Le + commentaire `:493-499` qui explique pourquoi il ne l'était pas est retiré. + +**AC 11** — Export CSV de l'échéancier : une colonne **« Reste dû »** après « Total » (clé d'en-tête +×4, `CSV_HEADER_KEYS` / `CSV_HEADER_FALLBACKS`) ; le statut rend « partiellement payée » +(`payment-status-partial`, clé existante) ; le commentaire `:1463-1464` « TTC (montant dû) » est +corrigé. + +### Volet 4 — tests, textes + +**AC 12** — Tests, au minimum : + +| Test | Prouve | +|---|---| +| parité étendue (AC 2) | forme jointe du reste dû = `amount_due` | +| `aged_uses_amount_due_not_ttc` | facture 8,1 % de 1 081.— réglée 900.— : pèse 181.— dans sa tranche | +| `aged_partial_payment_keeps_original_bucket` | la tranche suit `due_date`, pas la date du règlement | +| `aged_total_matches_receivable_ledger` | AC 5 | +| `due_dates_summary_totals_are_amount_due` | AC 7 | +| `list_items_carry_amount_due` (repo **et** e2e HTTP) | AC 8-9, les deux SELECT ; la valeur traverse la frontière | +| export CSV : colonne reste dû, statut partiel | AC 11 | +| Vitest échéancier | colonne, statut `partial`, dialogue pré-rempli | +| **E2E** `invoices_echeancier.spec.ts` | le cas de la 24-3 (`:147-158`) cesse de **saisir** le montant : il vérifie qu'il est **pré-rempli** au reste dû, sur une facture partiellement réglée | + +⛔ **Chaque facture de test porte une TVA non nulle** (leçon de 25-4-a). ⛔ Mutations à exécuter et +consigner : TTC remis dans une tranche de la balance âgée ; `amount_due` retiré de `list_for_export` +seul ; `partial` retiré de `statusOf` ; `amountDue={null}` remis. + +**AC 13** — Textes (`docs/manual/fr/user-manual.tex`, PDF **contrôlé aplati**) : § Balance âgée +(`\label{sec:balance-agee}`, « encours débiteur (le total dû, TVA comprise) ») dit **reste dû après +règlements partiels et avoirs** ; § Échéancier (`:927`) décrit la colonne et le pré-remplissage. +CHANGELOG `[0.12.1]` *Fixed*. README : rien, sauf si la ligne v0.12.1 cite la balance âgée. + +## Tasks / Subtasks + +- [ ] **T1 — la grandeur jointe** (AC 1-2). +- [ ] **T2 — balance âgée** (AC 3-6), dont l'invariant de concordance. +- [ ] **T3 — échéancier, backend** (AC 7-9, AC 11). +- [ ] **T4 — échéancier, frontend** (AC 10), i18n. +- [ ] **T5 — tests et mutations** (AC 12). +- [ ] **T6 — textes** (AC 13). +- [ ] **T7 — gates** : backend complet (base remise à zéro), frontend complet, **E2E complet**. + +## Dev Notes + +### Ce qu'il ne faut pas faire + +- ⛔ **Ne pas stocker le reste dû** (24-2, D3). +- ⛔ **Ne pas utiliser `amount_due` scalaire dans une boucle** sur les lignes d'une liste : N+1. +- ⛔ **Ne pas retirer `total_ttc`** de la liste : l'échéancier affiche les deux, et d'autres écrans le + lisent. +- ⚠️ **Le tri** « TotalAmount » de l'échéancier trie sur `i.total_amount` (HT) alors que la colonne + affiche le TTC — défaut **préexistant**, hors périmètre ; ne pas l'aggraver, le signaler. + +### Où regarder + +| Fichier | Rôle | +|---|---| +| `crates/kesh-db/src/repositories/invoice_settlements.rs` | constantes jointes, `amount_due` | +| `crates/kesh-report/src/aged_receivables.rs:95-175` | requête, doc | +| `crates/kesh-report/tests/aged_receivables.rs` | tests existants (leur facture « payée » est montée par `UPDATE paid_at`) | +| `crates/kesh-db/src/repositories/invoices.rs:246-275, 800-830, 882-930, 2436-2470` | `InvoiceListItem`, liste, résumé, export | +| `crates/kesh-api/src/routes/invoices.rs:333-364, 1364-1470` | DTO de liste, export CSV | +| `frontend/src/routes/(app)/invoices/due-dates/+page.svelte` | page | +| `frontend/src/routes/(app)/invoices/[id]/+page.svelte:424-438` | `paymentStatus()` de la fiche, à partager | +| `frontend/src/lib/features/invoices/SettleInvoiceDialog.svelte:35-112` | pré-remplissage, garde client | +| `frontend/tests/e2e/invoices_echeancier.spec.ts:100-160, 200-201` | cas de la 24-3 ; « la colonne Total affiche le TTC (montant dû) » | +| `crates/kesh-report/src/general_ledger.rs` | solde d'un compte, pour l'AC 5 | + +### Gardes-fous du dépôt + +- Aucune migration. +- Repositories touchés : **gate complet même en cours de boucle** (§ Exception `kesh-db`). +- i18n : les nouvelles clés et tout `i18nMsg(` ajouté bougent `sitesTotal` — recompter. + +## Dev Agent Record + +### Agent Model Used + +### Debug Log References + +### Completion Notes List + +### File List + +## Change Log + +- **2026-09-27** — Créée (Opus 5.5) après découpage de la 25-4-b (arbitrages Q1 ⇒ six modules). + Sites revérifiés dans le code ; 25-4-a en est le socle. + +[#416]: https://github.com/guycorbaz/kesh/issues/416 diff --git a/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md b/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md index 65f7e7dc..44de9114 100644 --- a/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md +++ b/_bmad-output/implementation-artifacts/25-4-propager-le-residuel.md @@ -20,7 +20,9 @@ Le découpage (quatre stories depuis le 2026-09-27) suit l'ordre des dépendance | Story | Issues | Ce qu'elle fait | Pourquoi à ce rang | |---|---|---|---| | **25-4-a** — le résiduel juste | [#455], [#456] | la formule canonique soustrait l'avoir **TTC** ; un avoir est refusé sur une facture **réglée, même en partie** ; le test de parité promis et jamais écrit | ⛔ **les deux suivantes réemploient la formule** : la propager avant de la corriger propagerait le défaut | -| **25-4-b** — le résiduel aux agrégats | [#416] | balance âgée, totaux de l'échéancier, **colonne « reste dû »** de l'échéancier et de son CSV, dialogue de règlement pré-rempli, **montant réclamé par les relances** | le cœur de #416 ; première utilisatrice des formes jointes | +| **25-4-b** — ⚠️ **découpée le 2026-09-27** en **b1** et **b2** : les arbitrages de Q1 ont ajouté les rappels (texte, QR, PDF, frais), et le tout touchait six modules | [#416] | — | — | +| **25-4-b1** — le résiduel aux agrégats | [#416] | balance âgée, totaux et **colonne « reste dû »** de l'échéancier et de son CSV, statut « partiellement payée » dans l'échéancier, dialogue de règlement **pré-rempli** ; formes jointes du résiduel, invariant balance âgée ↔ grand livre | le cœur de #416 ; première utilisatrice des formes jointes | +| **25-4-b2** — le résiduel aux rappels | [#416] | le rappel réclame le **reste dû** (texte, QR, PDF avec montant initial / déjà réglé / reste), frais configurables et masqués à zéro ; question des frais non comptabilisés | les arbitrages Q1 ; repose sur la grandeur de b1 | | **25-4-c** — le résiduel au rapprochement | [#420] | filtre des candidats, score, re-score à l'acceptation, montant affiché dans la proposition | indépendante de 25-4-b, mais du même socle | | **25-4-d** — solder le reste | [#384] | imputer l'écart d'un règlement partiel — **perte sur débiteur**, escompte, frais bancaires — pour clore une facture partiellement réglée ; la part de **TVA** réduit la TVA due, seule la part HT va au compte de perte | ramenée de la 25-6 le 2026-09-27 (Guy) : elle repose entièrement sur le résiduel juste de 25-4-a | @@ -131,6 +133,7 @@ Pour 25-4-b, donc : ## Change Log +- **2026-09-27** — 25-4-b découpée en b1 (agrégats) / b2 (rappels) : six modules une fois les arbitrages Q1 ajoutés. - **2026-09-27** — Arbitrages : avoir sur facture réglée refusé en 25-4-a, levée tracée par #471 ; #384 ramenée en 25-4-d. - **2026-09-27** — Frais de rappel : configurables, aucune ligne affichée à zéro. - **2026-09-27** — Q1 retranchée : la QR du rappel porte le reste dû (le TTC s'il n'y a aucun règlement) ; numéro de facture conservé ; point ouvert sur les frais. diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index ea88fb5a..b0f9565a 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -1,3 +1,4 @@ +# last_updated: 2026-09-27 (2) (PR #472 ouverte pour 25-4-a ; 25-4-b decoupee b1/b2 ; 25-4-b1 creee.) # last_updated: 2026-09-27 (1) (25-4-d creee depuis #384 ; #471 ouverte ; 25-4-a validee P3.) # last_updated: 2026-09-26 (5) (25-4 DECOUPEE en a/b/c ; 25-4-a creee, #455/#456 rattachees ; #467 #468 #470 mergees.) # last_updated: 2026-09-26 (4) (**25-3-c DONE** — revue close, gates verts, non poussee.) @@ -354,8 +355,10 @@ development_status: 25-3-c-annuler-facture-fournisseur: done # 2026-09-26 **REVUE CLOSE EN 1 PASSE** (0 > LOW, Sonnet x3) ; non poussee ; PR `closes #454` titre ET corps, sur accord. **IMPLEMENTEE** — gates 2472/2472, 783/783, E2E 220/10/19 sans regression ; prochaine etape : code review. # 2026-09-26 **SPEC VALIDEE en 2 passes** (3 MED -> 0 > LOW). **SPECIFIEE** — `25-3-c-annuler-facture-fournisseur.md`. Geste par le socle (autorite `SupplierPurchase`), queue commune sur l'ecriture d'ACHAT, lot en dernier rang ; payee : reglement DETACHE (colonnes remises a NULL, ecriture libre, lien garde par l'audit) — **Q1 tranchee par Guy le 2026-09-26**. Aucune migration. Prochaine etape : validate. # 2026-09-24 NEE d'un arbitrage de Guy — une facture fournisseur s'annule DANS TOUS LES CAS, sauf si l'exercice de son ecriture d'achat est CLOS (l'exercice, pas le verrou de periode) ; payee, son reglement RESTE au grand livre et REDEVIENT A LETTRER (Epic 15 : un paiement doit correspondre a une facture, au besoin creee pour lui — « comme bexio »). Reecrit `cancel`, donc absorbe [#454]. Derriere la 25-3-a. 25-3-b-annuler-rapprochement: done # 2026-09-25 DONE — revue close en passe 2 (Sonnet 1 MED -> Haiku 0) ; gates : backend 2463/2463, frontend 777/777, E2E sans regression. Non poussee. — SPEC VALIDEE (boucle close en passe 4 : 2 HIGH -> 2 MED -> 2 MED -> 3 LOW ; pas de decoupage, arbitrage de Guy). Q1-Q3 tranchees. — [#418] closes — annuler un rapprochement bancaire. ⛔ NE JAMAIS compter sur le `ON DELETE SET NULL` de `matched_entry_id` : supprimer l'ecriture ferait disparaitre le lien EN SILENCE, le mode d'echec meme que la story repare. ⚠️ Le chemin d'ACCEPTATION n'a aucune fonction `kesh-db` a mirer : il est ecrit en SQL brut a **cinq** sites de `routes/reconciliation.rs`, dont **un seul** porte le verrou optimiste. Quand la transaction porte une facture, appelle le geste de la 25-3-a. Derriere elle. 25-3-annuler-reglement-et-rapprochement: split # [#414] [#418] — **l'Epic 24 a livre l'encaissement et le rapprochement ; il n'a PAS livre le moyen de les DEFAIRE.** Une erreur d'imputation est aujourd'hui incorrigible autrement qu'a la main — et le gel de la 24-4b interdit precisement la main. ⚠️ *C'est le prix d'une story qui ferme une porte sans ouvrir la suivante : le gel est juste, et il rend cette story-ci necessaire.* - 25-4-a-residuel-juste: done # 2026-09-27 REVUE CLOSE EN 1 PASSE (0 > LOW, 1 LOW corrige) ; rien de pousse — PR closes #455 #456 sur accord. # IMPLEMENTEE — 7/7 mutations tuees ; gates 2484/2484, 826/826, E2E 222/10/19 sans regression ; prochaine etape : code review. # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (masque a l'ecran, mais rendu par GET /invoices/{id} aux cles API : amountDue = la TVA sur une facture creditee) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE ; validation : P1 Sonnet 1H/3M/1L -> P2 Haiku 1M retenu -> P3 ciblee Opus 2M/5L -> P4 ciblee Sonnet 0 > LOW (1M reclasse LOW) : VALIDEE en 4 passes. Arbitrage 2026-09-27 : refus maintenu, levee tracee par #471. - 25-4-b-residuel-aux-agregats: backlog # [#416] + montant des RELANCES (TTC complet, trouve a l'inventaire) — Q1 TRANCHEE 2026-09-27 : la QR du rappel porte le RESTE DU (= TTC sans reglement), reste a payer sur le PDF et dans le texte ; point ouvert : frais de rappel non comptabilises vs trop-percu. + 25-4-a-residuel-juste: done # 2026-09-27 REVUE CLOSE EN 1 PASSE ; PR #472 OUVERTE (closes #455 #456), attend « merge ». # IMPLEMENTEE — 7/7 mutations tuees ; gates 2484/2484, 826/826, E2E 222/10/19 sans regression ; prochaine etape : code review. # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (masque a l'ecran, mais rendu par GET /invoices/{id} aux cles API : amountDue = la TVA sur une facture creditee) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE ; validation : P1 Sonnet 1H/3M/1L -> P2 Haiku 1M retenu -> P3 ciblee Opus 2M/5L -> P4 ciblee Sonnet 0 > LOW (1M reclasse LOW) : VALIDEE en 4 passes. Arbitrage 2026-09-27 : refus maintenu, levee tracee par #471. + 25-4-b1-residuel-aux-agregats: ready-for-dev # 2026-09-27 [#416, refs] balance agee + echeancier (totaux, colonne reste du, CSV, statut partiel, dialogue pre-rempli) + invariant balance agee = grand livre. CREEE, validation a lancer. Branche EMPILEE sur 25-4-a. + 25-4-b2-residuel-aux-rappels: backlog # [#416, closes] le rappel reclame le reste du (texte, QR, PDF montant initial / deja regle / reste), frais configurables masques a zero ; point ouvert : frais non comptabilises. + 25-4-b-residuel-aux-agregats: split # 2026-09-27 DECOUPEE en b1 (agregats) / b2 (rappels) — six modules apres les arbitrages Q1. # [#416] + montant des RELANCES (TTC complet, trouve a l'inventaire) — Q1 TRANCHEE 2026-09-27 : la QR du rappel porte le RESTE DU (= TTC sans reglement), reste a payer sur le PDF et dans le texte ; point ouvert : frais de rappel non comptabilises vs trop-percu. 25-4-c-residuel-au-rapprochement: backlog # [#420] — DEUX sites : filtre SQL des candidats (HAVING total_ttc) avant le score, puis score et re-score a l'acceptation. 25-4-d-solder-le-reste: backlog # [#384] ramenee de la 25-6 le 2026-09-27 (Guy) — perte sur debiteur, escompte, frais : clore une facture partiellement reglee ; la part TVA reduit la TVA due. 25-4-propager-le-residuel: split # 2026-09-26 DECOUPEE (six modules > 5) en 25-4-a / 25-4-b / 25-4-c, puis 25-4-d (#384, 2026-09-27) ; #455 et #456 rattachees. # [#416] [#420] — la 24-2 a introduit le reglement PARTIEL ; le residuel n'est propage ni a la balance agee ni a l'echeancier, et **le score de rapprochement compare au TTC et non au residuel** : le virement du solde d'une facture partiellement reglee **score 0**. From cfd2a7796e14f5ad6c659bc6553abd8ed3dfe27b Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 01:16:04 +0200 Subject: [PATCH 20/51] docs(25-4-b1): prompt de validation P1 (refs #416) Co-Authored-By: Claude Opus 5.5 --- .../25-4-b1-validate-prompt-p1.md | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 _bmad-output/implementation-artifacts/25-4-b1-validate-prompt-p1.md diff --git a/_bmad-output/implementation-artifacts/25-4-b1-validate-prompt-p1.md b/_bmad-output/implementation-artifacts/25-4-b1-validate-prompt-p1.md new file mode 100644 index 00000000..63c3960e --- /dev/null +++ b/_bmad-output/implementation-artifacts/25-4-b1-validate-prompt-p1.md @@ -0,0 +1,52 @@ +# Prompt — validation P1, Story 25-4-b1 (le résiduel aux agrégats) + +*Versionné le 2026-09-27. **Une lentille** (Sonnet), contexte frais.* + +Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-4-b-residuel-aux-agregats` (empilée sur la 25-4-a, +PR #472). Fiche à valider : `_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md`. +Mère : `25-4-propager-le-residuel.md` (arbitrages de Guy : **ne pas les contester**). Sœur livrée : +`25-4-a-residuel-juste.md`. Issue : `gh issue view 416`. Contexte : `24-2-encaissement-client.md` +§ D3, D4, invariants. Règles : `CLAUDE.md`. Checklist : `.claude/skills/bmad-create-story/checklist.md`. + +## Axes — tous obligatoires + +1. **Chaque référence `fichier:ligne`** existe et dit ce que la fiche affirme. +2. **Inventaire des sites qui somment le TTC là où le reste dû est la grandeur** — pars du symptôme, + pas de la liste de la fiche : `grep -rn "lt.ttc\|total_ttc\|totalTtc\|INVOICE_TTC" crates/ frontend/src`. + Pour chaque site, dis s'il est dans la b1, dans la b2 (rappels), ou légitimement au TTC. Un site + oublié est au moins MEDIUM. +3. **L'invariant de concordance (AC 5)** : est-il vrai en théorie ? Liste ce qui meut le compte + 1100 hors factures (écritures manuelles, soldes d'ouverture, contre-passations, annulation de + règlement, avoir, facture annulée avec règlement hérité) et vérifie que le montage prescrit les + exclut ou les inclut à bon escient. Le « périmètre `validated AND paid_at IS NULL` » rend-il la + concordance possible (factures `cancelled` à reste dû négatif hérité ?). +4. **Le N+1 (AC 8)** : la liste utilise aujourd'hui la forme **corrélée** du TTC + (`INVOICE_TTC_SUBQUERY_SQL`) ; la fiche prescrit la forme jointe pour le reste dû — cohérence, + coût, et risque de divergence entre `total_ttc` (corrélé) et `amount_due` (joint) sur une même + ligne. +5. **Le frontend** : `statusOf` / `paymentStatus` partageables ? Le dialogue pré-rempli : que se + passe-t-il pour une facture à reste dû négatif ou nul ? Le filtre « payées » de l'échéancier + montre-t-il des factures dont `amountDue` = 0 ? +6. **Les tests** (AC 12) : chacun prouve-t-il ce qu'il annonce ? L'E2E modifié de la 24-3 : le + montage (facture partiellement réglée) est-il faisable depuis Playwright ? Les mutations sont- + elles tuables ? +7. **Le manuel** : lignes citées, et **PDF aplati** + (`pdftotext docs/manual/fr/user-manual.pdf - | tr '\n' ' ' | tr -s ' '`, vers + `/tmp/claude-1000/-home-gcorbaz-devel-kesh/ca5ce2e2-67a3-4eeb-817f-c2de35620a1c/scratchpad/`). + D'autres textes (admin-manual, api-external, README, website) promettent-ils le TTC ? +8. **Le découpage b1/b2** : quelque chose de b1 appartient-il à b2, ou l'inverse ? La PR de b1 en + `refs #416` est-elle juste ? + +## Ce que tu rends + +- **Findings** : sévérité, endroit exact, **preuve** (commande et résultat, code lu), correction. +- ⛔ **La liste des axes réellement exercés ET de ceux qui ne l'ont pas été.** + +## Interdits + +⛔ N'écris aucun fichier du dépôt ; aucune commande qui écrit dans le dépôt ou dans une base — +`scripts/prepare-release.sh`, `scripts/regen-test-schema.sh`, `scripts/install-hooks.sh`, +`scripts/test-fast.sh`, `scripts/mem-guard.sh`, `make`, `latexmk`, tout `git commit`/`push`/`add`/ +`stash`/`reset`/`rebase`/`checkout`/`switch`/`worktree`, `sqlx migrate`, `cargo test`/`nextest`, +`npm run`, `npx playwright`. Autorisés : lecture, `grep`, `git log`/`show`/`diff`, `gh issue view`, +`pdftotext` vers le scratchpad, `cargo check`. From 73f72e8dd07e1f2f107857cd51f758fcfa89905e Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 01:26:26 +0200 Subject: [PATCH 21/51] =?UTF-8?q?docs(25-4-b1):=20validation=20P1=20?= =?UTF-8?q?=E2=80=94=20port=C3=A9e=20de=20l'invariant=20balance=20=C3=A2g?= =?UTF-8?q?=C3=A9e=20=3D=20grand=20livre,=20quatre=20passages=20du=20manue?= =?UTF-8?q?l=20(refs=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-b1-residuel-aux-agregats.md | 50 +++++++++++++++++-- .../sprint-status.yaml | 2 +- 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md b/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md index 8548faeb..fe02f127 100644 --- a/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md +++ b/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md @@ -73,6 +73,18 @@ soldée, créditée —, le **total de la balance âgée = solde du compte 1100 (`general_ledger` ou somme `debit − credit`). C'est l'assertion que #416 réclame et qui n'existe pour aucun écran. +⚠️ **Portée de l'invariant, écrite et non supposée.** Il ne tient que si le compte débiteurs n'est +mû **que** par des factures, règlements et avoirs de Kesh. Trois choses le rompent, légitimement, +et la balance âgée ne les montre pas : +- un **solde d'ouverture** ou une **écriture manuelle** sur le compte débiteurs ; +- l'**état hérité** de 25-4-a — une facture **`cancelled`** créditée **après** un règlement + partiel (plus atteignable par l'application, mais possible par l'import d'un `.keshbackup` + antérieur) : le compte 1100 porte **−(montant réglé)**, la facture `cancelled` est hors du + périmètre `validated`. *(Relevé en validation P1.)* + +Le test de l'AC 5 porte sur les quatre états **vivants** ; ⛔ il n'y ajoute **pas** l'état hérité. +Cette portée est dite dans le doc-comment de `generate` et dans le manuel (AC 13). + **AC 6** — Doc-comment de `generate` (`:95-99` : « Montants = TTC dérivé ») et libellés : la balance âgée montre le **reste dû** ; l'écran (`AgedReceivablesView.svelte`) et son CSV gardent leur structure — seules les valeurs changent. Si un libellé visible dit « TTC » ou « total facturé », @@ -129,9 +141,20 @@ corrigé. consigner : TTC remis dans une tranche de la balance âgée ; `amount_due` retiré de `list_for_export` seul ; `partial` retiré de `statusOf` ; `amountDue={null}` remis. -**AC 13** — Textes (`docs/manual/fr/user-manual.tex`, PDF **contrôlé aplati**) : § Balance âgée -(`\label{sec:balance-agee}`, « encours débiteur (le total dû, TVA comprise) ») dit **reste dû après -règlements partiels et avoirs** ; § Échéancier (`:927`) décrit la colonne et le pré-remplissage. +**AC 13** — Textes (`docs/manual/fr/user-manual.tex`, PDF **contrôlé aplati**), § Balance âgée +(`\label{sec:balance-agee}`) — **quatre** passages, tous au TTC aujourd'hui : +- `:1576` « encours débiteur (le total dû, TVA comprise) » → le **reste dû**, après règlements + partiels et avoirs ; +- `:1578`, légende de la capture : « encours débiteur **TTC** » → « reste dû » ; +- `:1580-1581` : « La colonne « Non échu » **garantit** que le total général réconcilie avec le + solde du compte clients » — vrai **seulement** dans la portée de l'AC 5 : la phrase porte la + réserve (soldes d'ouverture, écritures manuelles sur le compte débiteurs, sauvegardes + antérieures à la 0.12.1) ; +- `:1587-1588`, note : « le **total dû TTC** de chaque facture, jamais le montant hors taxe » → « le + **reste dû** de chaque facture, jamais le montant hors taxe ni le total facturé ». + +⚠️ Greper le symptôme (`TTC`, `total dû`) dans **toute** la section et dans le PDF aplati, pas +seulement ces lignes. Puis : § Échéancier (`:927`) décrit la colonne et le pré-remplissage. CHANGELOG `[0.12.1]` *Fixed*. README : rien, sauf si la ligne v0.12.1 cite la balance âgée. ## Tasks / Subtasks @@ -152,6 +175,17 @@ CHANGELOG `[0.12.1]` *Fixed*. README : rien, sauf si la ligne v0.12.1 cite la ba - ⛔ **Ne pas utiliser `amount_due` scalaire dans une boucle** sur les lignes d'une liste : N+1. - ⛔ **Ne pas retirer `total_ttc`** de la liste : l'échéancier affiche les deux, et d'autres écrans le lisent. +- ⚠️ **Double calcul du TTC dans les listes** : `total_ttc` y vient de la forme **corrélée** + (`invoices.rs:819`, `:2459`), et la forme jointe de l'AC 1 recalcule `lt.ttc`. Il est **permis** — + et préférable — de dériver `total_ttc` de `lt.ttc` dans ces deux SELECT : `invoice_ttc_parity.rs` + prouve déjà l'égalité des deux formes. +- ⚠️ **Pré-remplissage à reste dû ≤ 0** : `SettleInvoiceDialog` affiche alors une erreur client dès + l'ouverture (`:104-112`). Comportement **déjà présent** sur la fiche + (`invoices/[id]/+page.svelte:1241`) ; un reste dû ≤ 0 sur une facture `validated` sans `paid_at` + n'existe que par un état hérité. Ne pas le corriger ici ; ne pas l'aggraver. +- **Montage E2E** du cas « partiellement réglée » : régler une partie par l'API + (`authedApiContext(page)`, patron `invoices-settlement-cancel.spec.ts:46`), puis ouvrir le dialogue + depuis l'échéancier. - ⚠️ **Le tri** « TotalAmount » de l'échéancier trie sur `i.total_amount` (HT) alors que la colonne affiche le TTC — défaut **préexistant**, hors périmètre ; ne pas l'aggraver, le signaler. @@ -188,6 +222,16 @@ CHANGELOG `[0.12.1]` *Fixed*. README : rien, sauf si la ligne v0.12.1 cite la ba ## Change Log +- **2026-09-27** — **validation P1** (Sonnet, prompt `25-4-b1-validate-prompt-p1.md`) — **2 MEDIUM, + 3 LOW**, confirmés dans le code et le manuel. MEDIUM : l'invariant balance âgée = grand livre + (AC 5) était énoncé sans portée — l'état hérité de 25-4-a (facture `cancelled` créditée après + règlement) et les soldes d'ouverture le rompent ; portée écrite, test borné aux états vivants, et + le manuel, qui **garantit** la concordance sans réserve, recevra la réserve. MEDIUM : l'AC 13 ne + citait qu'un des quatre passages « TTC » de la section Balance âgée — les trois autres ajoutés. + LOW (Dev Notes) : double calcul du TTC dans les listes (dériver `total_ttc` de `lt.ttc` permis) ; + pré-remplissage à reste dû ≤ 0 (préexistant, hors périmètre) ; montage E2E du cas partiel. + L'inventaire des sites au TTC, refait depuis le symptôme, n'a trouvé **aucun site orphelin** + (b1, b2, 25-4-c ou légitimement TTC). - **2026-09-27** — Créée (Opus 5.5) après découpage de la 25-4-b (arbitrages Q1 ⇒ six modules). Sites revérifiés dans le code ; 25-4-a en est le socle. diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index b0f9565a..8ebac8d1 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -356,7 +356,7 @@ development_status: 25-3-b-annuler-rapprochement: done # 2026-09-25 DONE — revue close en passe 2 (Sonnet 1 MED -> Haiku 0) ; gates : backend 2463/2463, frontend 777/777, E2E sans regression. Non poussee. — SPEC VALIDEE (boucle close en passe 4 : 2 HIGH -> 2 MED -> 2 MED -> 3 LOW ; pas de decoupage, arbitrage de Guy). Q1-Q3 tranchees. — [#418] closes — annuler un rapprochement bancaire. ⛔ NE JAMAIS compter sur le `ON DELETE SET NULL` de `matched_entry_id` : supprimer l'ecriture ferait disparaitre le lien EN SILENCE, le mode d'echec meme que la story repare. ⚠️ Le chemin d'ACCEPTATION n'a aucune fonction `kesh-db` a mirer : il est ecrit en SQL brut a **cinq** sites de `routes/reconciliation.rs`, dont **un seul** porte le verrou optimiste. Quand la transaction porte une facture, appelle le geste de la 25-3-a. Derriere elle. 25-3-annuler-reglement-et-rapprochement: split # [#414] [#418] — **l'Epic 24 a livre l'encaissement et le rapprochement ; il n'a PAS livre le moyen de les DEFAIRE.** Une erreur d'imputation est aujourd'hui incorrigible autrement qu'a la main — et le gel de la 24-4b interdit precisement la main. ⚠️ *C'est le prix d'une story qui ferme une porte sans ouvrir la suivante : le gel est juste, et il rend cette story-ci necessaire.* 25-4-a-residuel-juste: done # 2026-09-27 REVUE CLOSE EN 1 PASSE ; PR #472 OUVERTE (closes #455 #456), attend « merge ». # IMPLEMENTEE — 7/7 mutations tuees ; gates 2484/2484, 826/826, E2E 222/10/19 sans regression ; prochaine etape : code review. # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (masque a l'ecran, mais rendu par GET /invoices/{id} aux cles API : amountDue = la TVA sur une facture creditee) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE ; validation : P1 Sonnet 1H/3M/1L -> P2 Haiku 1M retenu -> P3 ciblee Opus 2M/5L -> P4 ciblee Sonnet 0 > LOW (1M reclasse LOW) : VALIDEE en 4 passes. Arbitrage 2026-09-27 : refus maintenu, levee tracee par #471. - 25-4-b1-residuel-aux-agregats: ready-for-dev # 2026-09-27 [#416, refs] balance agee + echeancier (totaux, colonne reste du, CSV, statut partiel, dialogue pre-rempli) + invariant balance agee = grand livre. CREEE, validation a lancer. Branche EMPILEE sur 25-4-a. + 25-4-b1-residuel-aux-agregats: ready-for-dev # 2026-09-27 [#416, refs] balance agee + echeancier (totaux, colonne reste du, CSV, statut partiel, dialogue pre-rempli) + invariant balance agee = grand livre. CREEE ; validation P1 Sonnet 2M/3L corriges. Branche EMPILEE sur 25-4-a. 25-4-b2-residuel-aux-rappels: backlog # [#416, closes] le rappel reclame le reste du (texte, QR, PDF montant initial / deja regle / reste), frais configurables masques a zero ; point ouvert : frais non comptabilises. 25-4-b-residuel-aux-agregats: split # 2026-09-27 DECOUPEE en b1 (agregats) / b2 (rappels) — six modules apres les arbitrages Q1. # [#416] + montant des RELANCES (TTC complet, trouve a l'inventaire) — Q1 TRANCHEE 2026-09-27 : la QR du rappel porte le RESTE DU (= TTC sans reglement), reste a payer sur le PDF et dans le texte ; point ouvert : frais de rappel non comptabilises vs trop-percu. 25-4-c-residuel-au-rapprochement: backlog # [#420] — DEUX sites : filtre SQL des candidats (HAVING total_ttc) avant le score, puis score et re-score a l'acceptation. From 9cbf960059eba805ce6532171eb34962fe1402ce Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 01:26:43 +0200 Subject: [PATCH 22/51] docs(25-4-b1): prompt de validation P2 (refs #416) Co-Authored-By: Claude Opus 5.5 --- .../25-4-b1-validate-prompt-p2.md | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 _bmad-output/implementation-artifacts/25-4-b1-validate-prompt-p2.md diff --git a/_bmad-output/implementation-artifacts/25-4-b1-validate-prompt-p2.md b/_bmad-output/implementation-artifacts/25-4-b1-validate-prompt-p2.md new file mode 100644 index 00000000..e9e71f2c --- /dev/null +++ b/_bmad-output/implementation-artifacts/25-4-b1-validate-prompt-p2.md @@ -0,0 +1,65 @@ +# Prompt — validation P2, Story 25-4-b1 (le résiduel aux agrégats) + +*Versionné le 2026-09-27. **Une lentille** (Haiku), contexte frais.* + +Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-4-b-residuel-aux-agregats` (empilée sur la 25-4-a, +PR #472). Fiche à valider : `_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md`. +Mère : `25-4-propager-le-residuel.md` (arbitrages de Guy : **ne pas les contester**). Sœur livrée : +`25-4-a-residuel-juste.md`. Issue : `gh issue view 416`. Contexte : `24-2-encaissement-client.md` +§ D3, D4, invariants. Règles : `CLAUDE.md`. Checklist : `.claude/skills/bmad-create-story/checklist.md`. + +## Axes — tous obligatoires + +1. **Chaque référence `fichier:ligne`** existe et dit ce que la fiche affirme. +2. **Inventaire des sites qui somment le TTC là où le reste dû est la grandeur** — pars du symptôme, + pas de la liste de la fiche : `grep -rn "lt.ttc\|total_ttc\|totalTtc\|INVOICE_TTC" crates/ frontend/src`. + Pour chaque site, dis s'il est dans la b1, dans la b2 (rappels), ou légitimement au TTC. Un site + oublié est au moins MEDIUM. +3. **L'invariant de concordance (AC 5)** : est-il vrai en théorie ? Liste ce qui meut le compte + 1100 hors factures (écritures manuelles, soldes d'ouverture, contre-passations, annulation de + règlement, avoir, facture annulée avec règlement hérité) et vérifie que le montage prescrit les + exclut ou les inclut à bon escient. Le « périmètre `validated AND paid_at IS NULL` » rend-il la + concordance possible (factures `cancelled` à reste dû négatif hérité ?). +4. **Le N+1 (AC 8)** : la liste utilise aujourd'hui la forme **corrélée** du TTC + (`INVOICE_TTC_SUBQUERY_SQL`) ; la fiche prescrit la forme jointe pour le reste dû — cohérence, + coût, et risque de divergence entre `total_ttc` (corrélé) et `amount_due` (joint) sur une même + ligne. +5. **Le frontend** : `statusOf` / `paymentStatus` partageables ? Le dialogue pré-rempli : que se + passe-t-il pour une facture à reste dû négatif ou nul ? Le filtre « payées » de l'échéancier + montre-t-il des factures dont `amountDue` = 0 ? +6. **Les tests** (AC 12) : chacun prouve-t-il ce qu'il annonce ? L'E2E modifié de la 24-3 : le + montage (facture partiellement réglée) est-il faisable depuis Playwright ? Les mutations sont- + elles tuables ? +7. **Le manuel** : lignes citées, et **PDF aplati** + (`pdftotext docs/manual/fr/user-manual.pdf - | tr '\n' ' ' | tr -s ' '`, vers + `/tmp/claude-1000/-home-gcorbaz-devel-kesh/ca5ce2e2-67a3-4eeb-817f-c2de35620a1c/scratchpad/`). + D'autres textes (admin-manual, api-external, README, website) promettent-ils le TTC ? +8. **Le découpage b1/b2** : quelque chose de b1 appartient-il à b2, ou l'inverse ? La PR de b1 en + `refs #416` est-elle juste ? + +## Ce que tu rends + +- **Findings** : sévérité, endroit exact, **preuve** (commande et résultat, code lu), correction. +- ⛔ **La liste des axes réellement exercés ET de ceux qui ne l'ont pas été.** + +## Interdits + +⛔ N'écris aucun fichier du dépôt ; aucune commande qui écrit dans le dépôt ou dans une base — +`scripts/prepare-release.sh`, `scripts/regen-test-schema.sh`, `scripts/install-hooks.sh`, +`scripts/test-fast.sh`, `scripts/mem-guard.sh`, `make`, `latexmk`, tout `git commit`/`push`/`add`/ +`stash`/`reset`/`rebase`/`checkout`/`switch`/`worktree`, `sqlx migrate`, `cargo test`/`nextest`, +`npm run`, `npx playwright`. Autorisés : lecture, `grep`, `git log`/`show`/`diff`, `gh issue view`, +`pdftotext` vers le scratchpad, `cargo check`. + +## Contexte P1 — à vérifier, pas à re-signaler + +La P1 a trouvé : l'invariant AC 5 sans portée (état hérité `cancelled`, soldes d'ouverture) et +trois passages « TTC » du manuel absents de l'AC 13 ; corrigés dans `git diff cfd2a779 73f72e8d` +(**diff unique, à lire en priorité**). Vérifie que ces corrections sont justes et complètes : +la portée de l'AC 5 énumère-t-elle **tout** ce qui meut le compte 1100 hors factures de Kesh +(lis `crates/kesh-db/src/repositories/opening_balances*.rs`, les contre-passations, l'import +fournisseurs n'y touche pas ?) ; les quatre passages du manuel sont-ils les seuls de la section et +du document (greppe `TTC`, `total dû`, `encours` dans le `.tex` ET le PDF aplati) ? + +⛔ Pour chaque finding, cite la ligne exacte lue dans le fichier ACTUEL, et vérifie ton affirmation +par `grep -nF` avant de l'écrire. From 58a874ab61532d2675baa9770fe7caa4470d4416 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 01:32:25 +0200 Subject: [PATCH 23/51] =?UTF-8?q?docs(25-4-b1):=20validation=20P2=20?= =?UTF-8?q?=E2=80=94=20la=20port=C3=A9e=20de=20l'invariant=20oubliait=20le?= =?UTF-8?q?=20rapprochement=20par=20ventilation=20ou=20r=C3=A8gle=20(refs?= =?UTF-8?q?=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-b1-residuel-aux-agregats.md | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md b/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md index fe02f127..9596c8cc 100644 --- a/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md +++ b/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md @@ -74,9 +74,13 @@ soldée, créditée —, le **total de la balance âgée = solde du compte 1100 pour aucun écran. ⚠️ **Portée de l'invariant, écrite et non supposée.** Il ne tient que si le compte débiteurs n'est -mû **que** par des factures, règlements et avoirs de Kesh. Trois choses le rompent, légitimement, +mû **que** par des factures, règlements et avoirs de Kesh. Quatre choses le rompent, légitimement, et la balance âgée ne les montre pas : - un **solde d'ouverture** ou une **écriture manuelle** sur le compte débiteurs ; +- une **ventilation** ou une **règle** de rapprochement bancaire imputée au compte débiteurs + (`accept_one_split`, `accept_one_rule`, `kesh-api/src/routes/reconciliation.rs:1619`, `:1997`) — + la contrepartie y est un compte choisi par l'utilisateur, sans facture ; *(ajouté par + l'orchestrateur en vérifiant la P2)* ; - l'**état hérité** de 25-4-a — une facture **`cancelled`** créditée **après** un règlement partiel (plus atteignable par l'application, mais possible par l'import d'un `.keshbackup` antérieur) : le compte 1100 porte **−(montant réglé)**, la facture `cancelled` est hors du @@ -148,8 +152,8 @@ seul ; `partial` retiré de `statusOf` ; `amountDue={null}` remis. - `:1578`, légende de la capture : « encours débiteur **TTC** » → « reste dû » ; - `:1580-1581` : « La colonne « Non échu » **garantit** que le total général réconcilie avec le solde du compte clients » — vrai **seulement** dans la portée de l'AC 5 : la phrase porte la - réserve (soldes d'ouverture, écritures manuelles sur le compte débiteurs, sauvegardes - antérieures à la 0.12.1) ; + réserve (soldes d'ouverture, écritures manuelles ou rapprochements bancaires imputés directement + au compte débiteurs, sauvegardes antérieures à la 0.12.1) ; - `:1587-1588`, note : « le **total dû TTC** de chaque facture, jamais le montant hors taxe » → « le **reste dû** de chaque facture, jamais le montant hors taxe ni le total facturé ». @@ -222,6 +226,15 @@ CHANGELOG `[0.12.1]` *Fixed*. README : rien, sauf si la ligne v0.12.1 cite la ba ## Change Log +- **2026-09-27** — **validation P2** (Haiku, prompt `25-4-b1-validate-prompt-p2.md`) — rapporte **0 + finding**. ⚠️ **Non pris pour argent comptant** : la passe affirmait le CHANGELOG « à créer » (il + existe) et n'a cité aucun des fichiers qu'on lui demandait de lire pour éprouver la portée de + l'AC 5. **Repris par l'orchestrateur** : la portée oubliait un chemin — la **ventilation** et la + **règle** de rapprochement bancaire (`accept_one_split`, `accept_one_rule`), dont la contrepartie + est un compte libre, donc possiblement le compte débiteurs, sans facture. **1 MEDIUM** ajouté, + corrigé (portée à quatre cas, réserve du manuel étendue). Vérifié aussi : le filtre « payées » + de l'échéancier existe (`due-dates/+page.svelte:45`) — ses lignes montreront un reste dû nul, + cohérent. - **2026-09-27** — **validation P1** (Sonnet, prompt `25-4-b1-validate-prompt-p1.md`) — **2 MEDIUM, 3 LOW**, confirmés dans le code et le manuel. MEDIUM : l'invariant balance âgée = grand livre (AC 5) était énoncé sans portée — l'état hérité de 25-4-a (facture `cancelled` créditée après From 72255481b49a508e4eac283abf1994fef081cdbb Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 01:32:51 +0200 Subject: [PATCH 24/51] =?UTF-8?q?docs(25-4-b1):=20prompt=20de=20validation?= =?UTF-8?q?=20P3=20cibl=C3=A9e=20(refs=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-b1-validate-prompt-p3.md | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 _bmad-output/implementation-artifacts/25-4-b1-validate-prompt-p3.md diff --git a/_bmad-output/implementation-artifacts/25-4-b1-validate-prompt-p3.md b/_bmad-output/implementation-artifacts/25-4-b1-validate-prompt-p3.md new file mode 100644 index 00000000..e1b97c6e --- /dev/null +++ b/_bmad-output/implementation-artifacts/25-4-b1-validate-prompt-p3.md @@ -0,0 +1,43 @@ +# Prompt — validation P3 CIBLÉE, Story 25-4-b1 (le résiduel aux agrégats) + +*Versionné le 2026-09-27. **Une lentille** (Opus), contexte frais. Passe **ciblée** : la P2 (Haiku) +a rendu « 0 finding » sans exercer l'axe qu'on lui confiait ; l'orchestrateur l'a repris et a +trouvé un chemin oublié. Ce qu'il reste à relire : la **portée de l'AC 5**, et elle seule, contre le +code.* + +Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-4-b-residuel-aux-agregats`. Fiche : +`_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md`, AC 5 (bloc « Portée de +l'invariant ») et AC 13 (réserve du manuel). Diff des remédiations : `git diff cfd2a779 58a874ab`. + +## La lentille : inventaire des sites NON RÉSOLUS + +L'AC 5 affirme : *total de la balance âgée = solde du compte débiteurs au grand livre*, sauf quatre +cas énumérés. ⛔ **Ne vérifie pas que les quatre cas sont vrais — cherche le cinquième.** + +1. **Inventorie l'ensemble clos de ce qui écrit une ligne d'écriture** (`journal_entry_lines`) : + pars du symptôme — `grep -rn "create_in_tx\|journal_entries::create\|INSERT INTO journal_entry_lines" crates/ --include=*.rs` + hors tests. Pour **chaque** chemin, dis s'il peut imputer le compte débiteurs (le compte + `default_receivable_account_id` ou le compte de la ligne de débit d'une vente), et, s'il le + peut, s'il est (a) une facture, un règlement ou un avoir **visibles** de la balance âgée, + (b) un des quatre cas de la portée, ou (c) **un cas oublié**. +2. Pense aux chemins **de clôture et de réouverture d'exercice**, à la **dévalidation** d'une + facture, à l'**annulation d'un règlement**, à la **contre-passation** manuelle d'une écriture de + vente ou de règlement depuis sa fiche, à l'**import** de pièces, au **rapprochement** annulé. +3. Pour chaque cas oublié : sévérité, preuve (code lu), et formulation à ajouter à la portée. +4. La réserve prescrite pour le manuel (AC 13, `:1580-1581`) couvre-t-elle alors tous les cas, en + mots d'utilisateur ? + +## Ce que tu rends + +- **Findings** : sévérité, endroit, **preuve**, correction. +- ⛔ **La liste des chemins inventoriés** (fichier:fonction → classement a/b/c) — c'est elle qui + prouve l'axe — **et des axes non exercés.** + +## Interdits + +⛔ N'écris aucun fichier du dépôt ; aucune commande qui écrit dans le dépôt ou dans une base — +`scripts/prepare-release.sh`, `scripts/regen-test-schema.sh`, `scripts/install-hooks.sh`, +`scripts/test-fast.sh`, `scripts/mem-guard.sh`, `make`, `latexmk`, tout `git commit`/`push`/`add`/ +`stash`/`reset`/`rebase`/`checkout`/`switch`/`worktree`, `sqlx migrate`, `cargo test`/`nextest`, +`npm run`, `npx playwright`. Autorisés : lecture, `grep`, `git log`/`show`/`diff`, `gh issue view`, +`cargo check`. From 861823e56756292728ec3470ef593287bddac2a5 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 01:39:42 +0200 Subject: [PATCH 25/51] =?UTF-8?q?docs(25-4-b1):=20validation=20P3=20?= =?UTF-8?q?=E2=80=94=20la=20port=C3=A9e=20de=20l'invariant=20s'=C3=A9nonce?= =?UTF-8?q?=20par=20une=20r=C3=A8gle=20;=20#473=20et=20#474=20ouvertes=20(?= =?UTF-8?q?refs=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-b1-residuel-aux-agregats.md | 67 ++++++++++++++----- .../sprint-status.yaml | 2 +- 2 files changed, 50 insertions(+), 19 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md b/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md index 9596c8cc..7c5fd788 100644 --- a/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md +++ b/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md @@ -73,21 +73,28 @@ soldée, créditée —, le **total de la balance âgée = solde du compte 1100 (`general_ledger` ou somme `debit − credit`). C'est l'assertion que #416 réclame et qui n'existe pour aucun écran. -⚠️ **Portée de l'invariant, écrite et non supposée.** Il ne tient que si le compte débiteurs n'est -mû **que** par des factures, règlements et avoirs de Kesh. Quatre choses le rompent, légitimement, -et la balance âgée ne les montre pas : -- un **solde d'ouverture** ou une **écriture manuelle** sur le compte débiteurs ; -- une **ventilation** ou une **règle** de rapprochement bancaire imputée au compte débiteurs - (`accept_one_split`, `accept_one_rule`, `kesh-api/src/routes/reconciliation.rs:1619`, `:1997`) — - la contrepartie y est un compte choisi par l'utilisateur, sans facture ; *(ajouté par - l'orchestrateur en vérifiant la P2)* ; -- l'**état hérité** de 25-4-a — une facture **`cancelled`** créditée **après** un règlement - partiel (plus atteignable par l'application, mais possible par l'import d'un `.keshbackup` - antérieur) : le compte 1100 porte **−(montant réglé)**, la facture `cancelled` est hors du - périmètre `validated`. *(Relevé en validation P1.)* - -Le test de l'AC 5 porte sur les quatre états **vivants** ; ⛔ il n'y ajoute **pas** l'état hérité. -Cette portée est dite dans le doc-comment de `generate` et dans le manuel (AC 13). +⚠️ **Portée de l'invariant — énoncée par une RÈGLE, pas par une liste.** *(Réécrite en validation +P3 : trois passes ont chacune trouvé des chemins que la liste précédente omettait — quatre en P3. +Une énumération de formes est ouverte par nature ; `CLAUDE.md` § « Inventorier les sites NON +RÉSOLUS ».)* + +**La règle** : l'égalité vaut **si et seulement si** le compte débiteurs n'est mouvementé **que** par +les écritures de **vente**, de **règlement client** et d'**avoir** que Kesh passe pour des factures +**validées**, toutes **datées au plus tard à la date d'arrêté** (`as_of`), et **n'a jamais changé** +dans les réglages de facturation. Tout autre mouvement l'en écarte. *Exemples*, non exhaustifs, tous +vérifiés atteignables : solde d'ouverture ; écriture saisie au journal ; rapprochement bancaire hors +facture — manuel, ventilé, par règle (`post_manual`, `post_split`, `accept_one_split`, +`accept_one_rule`) ; règlement d'une facture **fournisseur** par compte interne imputé au compte +débiteurs (compensation) ; changement du compte débiteurs par défaut (et l'avoir qui, depuis, crédite +le nouveau compte — **défaut produit, #473**) ; règlement client imputé au compte débiteurs lui-même +(**#474**) ; **données antérieures à la 0.12.1** — factures marquées payées sans écriture par +l'ancien `mark_as_paid` (avant 0.12.0), facture annulée par un avoir après règlement partiel +(**0.12.0 publiée**, `git show v0.12.0:…/credit_notes.rs:302`) — qu'elles viennent d'une +**restauration** ou d'une **mise à jour sur place**. + +Le test de l'AC 5 se place **dans** la règle : les quatre états **vivants**, et un `as_of` +postérieur ou égal à toutes les dates de pièces. ⛔ Il n'y ajoute aucun cas hors règle. Le +doc-comment de `generate` énonce la règle, pas la liste des exemples. **AC 6** — Doc-comment de `generate` (`:95-99` : « Montants = TTC dérivé ») et libellés : la balance âgée montre le **reste dû** ; l'écran (`AgedReceivablesView.svelte`) et son CSV gardent leur @@ -151,9 +158,13 @@ seul ; `partial` retiré de `statusOf` ; `amountDue={null}` remis. partiels et avoirs ; - `:1578`, légende de la capture : « encours débiteur **TTC** » → « reste dû » ; - `:1580-1581` : « La colonne « Non échu » **garantit** que le total général réconcilie avec le - solde du compte clients » — vrai **seulement** dans la portée de l'AC 5 : la phrase porte la - réserve (soldes d'ouverture, écritures manuelles ou rapprochements bancaires imputés directement - au compte débiteurs, sauvegardes antérieures à la 0.12.1) ; + solde du compte clients » — vrai **seulement** dans la règle de l'AC 5. La phrase devient, par la + règle et non par une liste : *« Le total général réconcilie avec le solde du compte clients tant + que ce compte n'est mouvementé que par les factures, leurs règlements et leurs avoirs. Toute autre + écriture qui le touche — solde de départ, écriture saisie au journal, rapprochement bancaire ou + règlement (y compris d'une facture fournisseur) imputé directement à ce compte — l'en écarte, de + même qu'un changement du compte clients dans les réglages de facturation, ou des données + antérieures à la version 0.12.1, restaurées ou mises à jour. »* ; - `:1587-1588`, note : « le **total dû TTC** de chaque facture, jamais le montant hors taxe » → « le **reste dû** de chaque facture, jamais le montant hors taxe ni le total facturé ». @@ -163,6 +174,13 @@ CHANGELOG `[0.12.1]` *Fixed*. README : rien, sauf si la ligne v0.12.1 cite la ba ## Tasks / Subtasks +- [ ] **T0 — rectifier la portée de l'état hérité posée par 25-4-a** : quatre commentaires disent + l'état « avoir après règlement partiel » atteignable **seulement par l'import d'une + sauvegarde** — `errors.rs:221`, `invoice_settlements_write.rs:333`, + `tests/invoice_amount_due_parity.rs:139`, `tests/invoice_settlement.rs:980`. Faux : la **0.12.0 + publiée** accepte cet avoir, une installation **mise à jour sur place** le porte. Écrire « des + données antérieures à la 0.12.1, restaurées ou mises à jour ». *(Le manuel de 25-4-a dit + déjà « avant la version 0.12.1, ou restaurée » : juste.)* - [ ] **T1 — la grandeur jointe** (AC 1-2). - [ ] **T2 — balance âgée** (AC 3-6), dont l'invariant de concordance. - [ ] **T3 — échéancier, backend** (AC 7-9, AC 11). @@ -226,6 +244,19 @@ CHANGELOG `[0.12.1]` *Fixed*. README : rien, sauf si la ligne v0.12.1 cite la ba ## Change Log +- **2026-09-27** — **validation P3 ciblée** (Opus, prompt `25-4-b1-validate-prompt-p3.md`, inventaire + de **tous** les chemins qui écrivent une ligne d'écriture) — **3 MEDIUM, 3 LOW** : **quatre chemins + oubliés** par la portée de l'AC 5 — règlement fournisseur par compte interne imputé au compte + débiteurs ; changement du compte débiteurs par défaut, que l'avoir suit alors que la vente ne le + suit pas ; données héritées plus larges (`mark_as_paid` sans écriture) et **pas seulement par + import** (la 0.12.0 publiée accepte l'avoir après règlement partiel) ; règlement client imputé au + compte débiteurs lui-même. LOW : deux handlers de rapprochement non cités ; `as_of` non borné. + ⛔ **Troisième passe consécutive à trouver des cas hors d'une liste** : la portée est **réécrite + par une règle**, avec des exemples non exhaustifs ; le test se place dans la règle, `as_of` + postérieur à toutes les pièces ; la réserve du manuel suit la même forme. **Deux défauts produit + sortis en issues** : #473 (l'avoir crédite le compte débiteurs des réglages, pas celui de la + vente), #474 (règlement client sur le compte débiteurs lui-même). **T0 ajoutée** : quatre + commentaires de 25-4-a bornaient à tort l'état hérité à l'import. - **2026-09-27** — **validation P2** (Haiku, prompt `25-4-b1-validate-prompt-p2.md`) — rapporte **0 finding**. ⚠️ **Non pris pour argent comptant** : la passe affirmait le CHANGELOG « à créer » (il existe) et n'a cité aucun des fichiers qu'on lui demandait de lire pour éprouver la portée de diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index 8ebac8d1..316bb2f2 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -356,7 +356,7 @@ development_status: 25-3-b-annuler-rapprochement: done # 2026-09-25 DONE — revue close en passe 2 (Sonnet 1 MED -> Haiku 0) ; gates : backend 2463/2463, frontend 777/777, E2E sans regression. Non poussee. — SPEC VALIDEE (boucle close en passe 4 : 2 HIGH -> 2 MED -> 2 MED -> 3 LOW ; pas de decoupage, arbitrage de Guy). Q1-Q3 tranchees. — [#418] closes — annuler un rapprochement bancaire. ⛔ NE JAMAIS compter sur le `ON DELETE SET NULL` de `matched_entry_id` : supprimer l'ecriture ferait disparaitre le lien EN SILENCE, le mode d'echec meme que la story repare. ⚠️ Le chemin d'ACCEPTATION n'a aucune fonction `kesh-db` a mirer : il est ecrit en SQL brut a **cinq** sites de `routes/reconciliation.rs`, dont **un seul** porte le verrou optimiste. Quand la transaction porte une facture, appelle le geste de la 25-3-a. Derriere elle. 25-3-annuler-reglement-et-rapprochement: split # [#414] [#418] — **l'Epic 24 a livre l'encaissement et le rapprochement ; il n'a PAS livre le moyen de les DEFAIRE.** Une erreur d'imputation est aujourd'hui incorrigible autrement qu'a la main — et le gel de la 24-4b interdit precisement la main. ⚠️ *C'est le prix d'une story qui ferme une porte sans ouvrir la suivante : le gel est juste, et il rend cette story-ci necessaire.* 25-4-a-residuel-juste: done # 2026-09-27 REVUE CLOSE EN 1 PASSE ; PR #472 OUVERTE (closes #455 #456), attend « merge ». # IMPLEMENTEE — 7/7 mutations tuees ; gates 2484/2484, 826/826, E2E 222/10/19 sans regression ; prochaine etape : code review. # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (masque a l'ecran, mais rendu par GET /invoices/{id} aux cles API : amountDue = la TVA sur une facture creditee) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE ; validation : P1 Sonnet 1H/3M/1L -> P2 Haiku 1M retenu -> P3 ciblee Opus 2M/5L -> P4 ciblee Sonnet 0 > LOW (1M reclasse LOW) : VALIDEE en 4 passes. Arbitrage 2026-09-27 : refus maintenu, levee tracee par #471. - 25-4-b1-residuel-aux-agregats: ready-for-dev # 2026-09-27 [#416, refs] balance agee + echeancier (totaux, colonne reste du, CSV, statut partiel, dialogue pre-rempli) + invariant balance agee = grand livre. CREEE ; validation P1 Sonnet 2M/3L corriges. Branche EMPILEE sur 25-4-a. + 25-4-b1-residuel-aux-agregats: ready-for-dev # 2026-09-27 [#416, refs] balance agee + echeancier (totaux, colonne reste du, CSV, statut partiel, dialogue pre-rempli) + invariant balance agee = grand livre. CREEE ; validation P1 Sonnet 2M/3L -> P2 Haiku 0 (repris : 1M) -> P3 ciblee Opus 3M/3L : portee de l'invariant REECRITE PAR UNE REGLE ; issues #473 #474 ouvertes. Branche EMPILEE sur 25-4-a. 25-4-b2-residuel-aux-rappels: backlog # [#416, closes] le rappel reclame le reste du (texte, QR, PDF montant initial / deja regle / reste), frais configurables masques a zero ; point ouvert : frais non comptabilises. 25-4-b-residuel-aux-agregats: split # 2026-09-27 DECOUPEE en b1 (agregats) / b2 (rappels) — six modules apres les arbitrages Q1. # [#416] + montant des RELANCES (TTC complet, trouve a l'inventaire) — Q1 TRANCHEE 2026-09-27 : la QR du rappel porte le RESTE DU (= TTC sans reglement), reste a payer sur le PDF et dans le texte ; point ouvert : frais de rappel non comptabilises vs trop-percu. 25-4-c-residuel-au-rapprochement: backlog # [#420] — DEUX sites : filtre SQL des candidats (HAVING total_ttc) avant le score, puis score et re-score a l'acceptation. From 5480b4f8e6a97a720ae2f3e2d345166d3c96650d Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 01:39:42 +0200 Subject: [PATCH 26/51] =?UTF-8?q?docs(25-4-b1):=20prompt=20de=20validation?= =?UTF-8?q?=20P4=20cibl=C3=A9e=20(refs=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-b1-validate-prompt-p4.md | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 _bmad-output/implementation-artifacts/25-4-b1-validate-prompt-p4.md diff --git a/_bmad-output/implementation-artifacts/25-4-b1-validate-prompt-p4.md b/_bmad-output/implementation-artifacts/25-4-b1-validate-prompt-p4.md new file mode 100644 index 00000000..bd2491b1 --- /dev/null +++ b/_bmad-output/implementation-artifacts/25-4-b1-validate-prompt-p4.md @@ -0,0 +1,43 @@ +# Prompt — validation P4 CIBLÉE, Story 25-4-b1 (le résiduel aux agrégats) + +*Versionné le 2026-09-27. **Une lentille** (Sonnet), contexte frais. Passe **ciblée** sur la +remédiation de la P3 : la portée de l'AC 5 a été **réécrite par une règle** après trois passes qui +trouvaient chacune des cas hors de la liste précédente.* + +Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-4-b-residuel-aux-agregats`. Fiche : +`_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md`. Diff à relire : +`git diff 72255481 HEAD -- _bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md`. +Issues sorties : `gh issue view 473`, `gh issue view 474`. + +## La lentille + +1. **La règle est-elle juste ?** Trop large (elle exclut un cas où l'égalité tient) ou trop étroite + (un mouvement qu'elle autorise rompt l'égalité) ? Éprouve-la contre : la **dévalidation** d'une + facture (l'écriture de vente disparaît), l'**annulation d'un règlement** (contre-passation + + suppression de la ligne), l'**annulation d'un rapprochement** de facture, une facture **soldée** + (`paid_at`) — hors du périmètre de la balance âgée mais ses mouvements restent au grand livre et + s'annulent-ils exactement ? —, un **reste dû négatif** sur une facture validée. +2. **« n'a jamais changé dans les réglages »** : formulation testable ? Le test peut-il la tenir ? +3. **Le test prescrit** (quatre états vivants, `as_of` ≥ toutes les pièces) : prouve-t-il la règle ou + passe-t-il par construction ? Quelle mutation de la requête de la balance âgée le ferait rougir ? +4. **T0** : les quatre sites cités existent-ils aux lignes dites, et la correction prescrite est-elle + juste (`git show v0.12.0:crates/kesh-db/src/repositories/credit_notes.rs`) ? En existe-t-il un + cinquième (greppe la **valeur** : `keshbackup`, `sauvegarde antérieure`, `import d'une sauvegarde` + dans `crates/`, `docs/`, les fiches 25-4-*) ? +5. **La réserve du manuel** : exacte, lisible par un utilisateur, cohérente avec la règle ? +6. **Propagation** : le mot « quatre » (cas), les références aux handlers, #473/#474 — cohérents + partout (fiche, fiche mère, `sprint-status.yaml`) ? + +## Ce que tu rends + +- **Findings** : sévérité, endroit, **preuve** (commande et résultat, code lu), correction. +- ⛔ **La liste des axes réellement exercés ET de ceux qui ne l'ont pas été.** + +## Interdits + +⛔ N'écris aucun fichier du dépôt ; aucune commande qui écrit dans le dépôt ou dans une base — +`scripts/prepare-release.sh`, `scripts/regen-test-schema.sh`, `scripts/install-hooks.sh`, +`scripts/test-fast.sh`, `scripts/mem-guard.sh`, `make`, `latexmk`, tout `git commit`/`push`/`add`/ +`stash`/`reset`/`rebase`/`checkout`/`switch`/`worktree`, `sqlx migrate`, `cargo test`/`nextest`, +`npm run`, `npx playwright`. Autorisés : lecture, `grep`, `git log`/`show`/`diff`, `gh issue view`, +`cargo check`. From 5824c0485fd74e17e81dc0c099de5706e81be8be Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 01:48:33 +0200 Subject: [PATCH 27/51] =?UTF-8?q?docs(25-4-b1):=20validation=20P4=20?= =?UTF-8?q?=E2=80=94=20cinqui=C3=A8me=20site=20de=20l'=C3=A9tat=20h=C3=A9r?= =?UTF-8?q?it=C3=A9,=20contre-passations=20dans=20la=20r=C3=A8gle=20(refs?= =?UTF-8?q?=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-a-residuel-juste.md | 7 ++++ .../25-4-b1-residuel-aux-agregats.md | 33 ++++++++++++++----- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md b/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md index 0f17fadb..a258d620 100644 --- a/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md +++ b/_bmad-output/implementation-artifacts/25-4-a-residuel-juste.md @@ -456,6 +456,13 @@ Claude Opus 5.5. ## Change Log +- **2026-09-27** — ⚠️ **Rectification après livraison** (relevée en validation de 25-4-b1, P3-P4) : + l'AC 13 dit l'état « avoir après règlement partiel » atteignable **« que par l'import d'une + sauvegarde antérieure »**. C'est **faux par omission** : la **0.12.0 publiée** accepte cet avoir + (`git show v0.12.0:crates/kesh-db/src/repositories/credit_notes.rs:302`), si bien qu'une + installation **mise à jour sur place** peut le porter. Lire : « des données antérieures à la + 0.12.1, restaurées ou mises à jour ». Les quatre commentaires de code qui reprenaient la + formulation sont rectifiés par 25-4-b1 (T0) ; le manuel disait déjà juste. - **2026-09-27** — **revue de code P1** (Sonnet, diff `ab9b9448..9bf2bb2b`, prompt `25-4-a-review-prompt-p1.md`) — **0 au-dessus de LOW, 1 LOW** : le compte rendu attribuait la formule « réglée, même en partie » aux deux limites du manuel, la seconde dit « déjà encaissée, diff --git a/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md b/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md index 7c5fd788..9d5316a5 100644 --- a/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md +++ b/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md @@ -81,7 +81,10 @@ RÉSOLUS ».)* **La règle** : l'égalité vaut **si et seulement si** le compte débiteurs n'est mouvementé **que** par les écritures de **vente**, de **règlement client** et d'**avoir** que Kesh passe pour des factures **validées**, toutes **datées au plus tard à la date d'arrêté** (`as_of`), et **n'a jamais changé** -dans les réglages de facturation. Tout autre mouvement l'en écarte. *Exemples*, non exhaustifs, tous +dans les réglages de facturation. Les **contre-passations** de ces mouvements (annulation d'un +règlement, d'un rapprochement de facture) restent **dans** la règle : elles inversent exactement +les mêmes comptes et montants, pendant que le reste dû remonte d'autant. Tout autre mouvement l'en +écarte. *Exemples*, non exhaustifs, tous vérifiés atteignables : solde d'ouverture ; écriture saisie au journal ; rapprochement bancaire hors facture — manuel, ventilé, par règle (`post_manual`, `post_split`, `accept_one_split`, `accept_one_rule`) ; règlement d'une facture **fournisseur** par compte interne imputé au compte @@ -149,7 +152,8 @@ corrigé. | **E2E** `invoices_echeancier.spec.ts` | le cas de la 24-3 (`:147-158`) cesse de **saisir** le montant : il vérifie qu'il est **pré-rempli** au reste dû, sur une facture partiellement réglée | ⛔ **Chaque facture de test porte une TVA non nulle** (leçon de 25-4-a). ⛔ Mutations à exécuter et -consigner : TTC remis dans une tranche de la balance âgée ; `amount_due` retiré de `list_for_export` +consigner : TTC remis dans une tranche de la balance âgée — **et TTC remis dans le seul total** (doit +faire rougir `aged_total_matches_receivable_ledger`) ; `amount_due` retiré de `list_for_export` seul ; `partial` retiré de `statusOf` ; `amountDue={null}` remis. **AC 13** — Textes (`docs/manual/fr/user-manual.tex`, PDF **contrôlé aplati**), § Balance âgée @@ -160,10 +164,11 @@ seul ; `partial` retiré de `statusOf` ; `amountDue={null}` remis. - `:1580-1581` : « La colonne « Non échu » **garantit** que le total général réconcilie avec le solde du compte clients » — vrai **seulement** dans la règle de l'AC 5. La phrase devient, par la règle et non par une liste : *« Le total général réconcilie avec le solde du compte clients tant - que ce compte n'est mouvementé que par les factures, leurs règlements et leurs avoirs. Toute autre - écriture qui le touche — solde de départ, écriture saisie au journal, rapprochement bancaire ou - règlement (y compris d'une facture fournisseur) imputé directement à ce compte — l'en écarte, de - même qu'un changement du compte clients dans les réglages de facturation, ou des données + que ce compte n'est mouvementé que par les factures, leurs règlements et leurs avoirs (y compris + leurs annulations). Toute autre écriture qui le touche l'en écarte : solde de départ, écriture + saisie au journal, virement bancaire affecté à ce compte sans passer par une facture, paiement + d'une facture fournisseur compensé sur ce compte, ou règlement dont la contrepartie est ce compte + lui-même. De même un changement du compte clients dans les réglages de facturation, ou des données antérieures à la version 0.12.1, restaurées ou mises à jour. »* ; - `:1587-1588`, note : « le **total dû TTC** de chaque facture, jamais le montant hors taxe » → « le **reste dû** de chaque facture, jamais le montant hors taxe ni le total facturé ». @@ -174,10 +179,12 @@ CHANGELOG `[0.12.1]` *Fixed*. README : rien, sauf si la ligne v0.12.1 cite la ba ## Tasks / Subtasks -- [ ] **T0 — rectifier la portée de l'état hérité posée par 25-4-a** : quatre commentaires disent +- [ ] **T0 — rectifier la portée de l'état hérité posée par 25-4-a** : **cinq** sites disent l'état « avoir après règlement partiel » atteignable **seulement par l'import d'une - sauvegarde** — `errors.rs:221`, `invoice_settlements_write.rs:333`, - `tests/invoice_amount_due_parity.rs:139`, `tests/invoice_settlement.rs:980`. Faux : la **0.12.0 + sauvegarde** — quatre commentaires, `errors.rs:221`, `invoice_settlements_write.rs:333`, + `tests/invoice_amount_due_parity.rs:139`, `tests/invoice_settlement.rs:980`, et **leur source**, + la fiche `25-4-a-residuel-juste.md` (AC 13, `:180`), rectifiée par une note datée plutôt que + réécrite (story livrée). Faux : la **0.12.0 publiée** accepte cet avoir, une installation **mise à jour sur place** le porte. Écrire « des données antérieures à la 0.12.1, restaurées ou mises à jour ». *(Le manuel de 25-4-a dit déjà « avant la version 0.12.1, ou restaurée » : juste.)* @@ -244,6 +251,14 @@ CHANGELOG `[0.12.1]` *Fixed*. README : rien, sauf si la ligne v0.12.1 cite la ba ## Change Log +- **2026-09-27** — **validation P4 ciblée** (Sonnet, prompt `25-4-b1-validate-prompt-p4.md`) — **1 + MEDIUM, 3 LOW**. MEDIUM : un **cinquième** site de la formulation fausse — la fiche de 25-4-a + elle-même (AC 13, `:180`), source des quatre commentaires ; ajouté à T0, rectifiée par une note + datée. LOW : la règle ne disait pas que les contre-passations (annulation de règlement ou de + rapprochement) restent dans sa portée — ajouté ; mutation dédiée au test de l'AC 5 ; réserve du + manuel reformulée pour ne plus pouvoir se lire comme visant les règlements ordinaires. Éprouvée + contre la dévalidation, l'annulation de règlement et de rapprochement, la facture soldée et le + reste dû négatif : **la règle tient**. - **2026-09-27** — **validation P3 ciblée** (Opus, prompt `25-4-b1-validate-prompt-p3.md`, inventaire de **tous** les chemins qui écrivent une ligne d'écriture) — **3 MEDIUM, 3 LOW** : **quatre chemins oubliés** par la portée de l'AC 5 — règlement fournisseur par compte interne imputé au compte From 3287d33f6f83587299d4b8367e228e411cbc4104 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 01:48:51 +0200 Subject: [PATCH 28/51] =?UTF-8?q?docs(25-4-b1):=20prompt=20de=20validation?= =?UTF-8?q?=20P5=20cibl=C3=A9e=20(refs=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-b1-validate-prompt-p5.md | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 _bmad-output/implementation-artifacts/25-4-b1-validate-prompt-p5.md diff --git a/_bmad-output/implementation-artifacts/25-4-b1-validate-prompt-p5.md b/_bmad-output/implementation-artifacts/25-4-b1-validate-prompt-p5.md new file mode 100644 index 00000000..9394a364 --- /dev/null +++ b/_bmad-output/implementation-artifacts/25-4-b1-validate-prompt-p5.md @@ -0,0 +1,34 @@ +# Prompt — validation P5 CIBLÉE, Story 25-4-b1 + +*Versionné le 2026-09-27. **Une lentille** (Haiku), contexte frais. Passe ciblée sur la seule +remédiation de la P4.* + +Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-4-b-residuel-aux-agregats`. Diff **unique** à +relire : `git diff 5480b4f8 5824c048` (deux fiches : `25-4-b1-residuel-aux-agregats.md`, +`25-4-a-residuel-juste.md`). + +## Ce que tu vérifies + +1. **T0** liste cinq sites : chacun existe-t-il à la ligne dite, avec la formulation dite ? Commande + obligatoire, à recopier dans ton rapport : `grep -rnF "sauvegarde antérieure" crates/ _bmad-output/implementation-artifacts/25-4-a-residuel-juste.md` + et `grep -rnF "keshbackup" crates/`. +2. **La phrase ajoutée à la règle** (contre-passations dans la portée) : juste ? Lis + `invoice_settlements_write.rs` (`cancel_settlement_in_tx`) avant de répondre. +3. **La réserve du manuel reformulée** : chacun de ses cas correspond-il à un cas réel de la règle ? + En manque-t-il un par rapport à la règle ? +4. **La note datée dans la fiche 25-4-a** : exacte (`git show v0.12.0:crates/kesh-db/src/repositories/credit_notes.rs | grep -n "paid_at.is_some"`) ? + +⛔ Une fiche `ready-for-dev` décrit du code **à écrire** : ne signale pas que le code ne le fait pas +encore. ⛔ Pour chaque finding, recopie la **sortie** de la commande qui le prouve. + +## Ce que tu rends + +Findings (sévérité, endroit, preuve recopiée, correction) et **la liste des axes exercés et non +exercés**. + +## Interdits + +⛔ Aucune écriture dans le dépôt ; aucune commande mutante — `scripts/*.sh`, `make`, `latexmk`, +`git commit`/`push`/`add`/`stash`/`reset`/`rebase`/`checkout`/`switch`/`worktree`, `sqlx migrate`, +`cargo test`/`nextest`, `npm run`, `npx playwright`. Autorisés : lecture, `grep`, `git show`/`diff`, +`gh issue view`. From 8c5eebf02178f2a01cb37c3172ccc9439471ed71 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 01:52:42 +0200 Subject: [PATCH 29/51] docs(25-4-b1): validation close en 5 passes (refs #416) Co-Authored-By: Claude Opus 5.5 --- .../25-4-b1-residuel-aux-agregats.md | 8 ++++++++ _bmad-output/implementation-artifacts/sprint-status.yaml | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md b/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md index 9d5316a5..3f48e94b 100644 --- a/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md +++ b/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md @@ -251,6 +251,14 @@ CHANGELOG `[0.12.1]` *Fixed*. README : rien, sauf si la ligne v0.12.1 cite la ba ## Change Log +- **2026-09-27** — **validation P5 ciblée** (Haiku, diff `5480b4f8..5824c048`, prompt + `25-4-b1-validate-prompt-p5.md`) — **0 finding**, preuves recopiées (grep des cinq sites de T0, + garde de la 0.12.0) et **concordantes avec les greps de l'orchestrateur**. ⛔ **Boucle close en 5 + passes** : `2M/3L → 0 (+1M orchestrateur) → 3M/3L → 1M/3L → 0`, rotation Sonnet → Haiku → Opus → + Sonnet → Haiku, trois passes ciblées ; toutes les corrections sur la spec, aucune sur du code. + ⚠️ **Signal de découpage à remonter à Guy** : quatre passes consécutives au niveau MEDIUM + (§ *Règle de splitting préventif*, critère de sévérité). Toutes portaient sur **une seule + phrase** — la portée de l'invariant de l'AC 5 —, close par le passage d'une liste à une règle. - **2026-09-27** — **validation P4 ciblée** (Sonnet, prompt `25-4-b1-validate-prompt-p4.md`) — **1 MEDIUM, 3 LOW**. MEDIUM : un **cinquième** site de la formulation fausse — la fiche de 25-4-a elle-même (AC 13, `:180`), source des quatre commentaires ; ajouté à T0, rectifiée par une note diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index 316bb2f2..ef897371 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -356,7 +356,7 @@ development_status: 25-3-b-annuler-rapprochement: done # 2026-09-25 DONE — revue close en passe 2 (Sonnet 1 MED -> Haiku 0) ; gates : backend 2463/2463, frontend 777/777, E2E sans regression. Non poussee. — SPEC VALIDEE (boucle close en passe 4 : 2 HIGH -> 2 MED -> 2 MED -> 3 LOW ; pas de decoupage, arbitrage de Guy). Q1-Q3 tranchees. — [#418] closes — annuler un rapprochement bancaire. ⛔ NE JAMAIS compter sur le `ON DELETE SET NULL` de `matched_entry_id` : supprimer l'ecriture ferait disparaitre le lien EN SILENCE, le mode d'echec meme que la story repare. ⚠️ Le chemin d'ACCEPTATION n'a aucune fonction `kesh-db` a mirer : il est ecrit en SQL brut a **cinq** sites de `routes/reconciliation.rs`, dont **un seul** porte le verrou optimiste. Quand la transaction porte une facture, appelle le geste de la 25-3-a. Derriere elle. 25-3-annuler-reglement-et-rapprochement: split # [#414] [#418] — **l'Epic 24 a livre l'encaissement et le rapprochement ; il n'a PAS livre le moyen de les DEFAIRE.** Une erreur d'imputation est aujourd'hui incorrigible autrement qu'a la main — et le gel de la 24-4b interdit precisement la main. ⚠️ *C'est le prix d'une story qui ferme une porte sans ouvrir la suivante : le gel est juste, et il rend cette story-ci necessaire.* 25-4-a-residuel-juste: done # 2026-09-27 REVUE CLOSE EN 1 PASSE ; PR #472 OUVERTE (closes #455 #456), attend « merge ». # IMPLEMENTEE — 7/7 mutations tuees ; gates 2484/2484, 826/826, E2E 222/10/19 sans regression ; prochaine etape : code review. # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (masque a l'ecran, mais rendu par GET /invoices/{id} aux cles API : amountDue = la TVA sur une facture creditee) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE ; validation : P1 Sonnet 1H/3M/1L -> P2 Haiku 1M retenu -> P3 ciblee Opus 2M/5L -> P4 ciblee Sonnet 0 > LOW (1M reclasse LOW) : VALIDEE en 4 passes. Arbitrage 2026-09-27 : refus maintenu, levee tracee par #471. - 25-4-b1-residuel-aux-agregats: ready-for-dev # 2026-09-27 [#416, refs] balance agee + echeancier (totaux, colonne reste du, CSV, statut partiel, dialogue pre-rempli) + invariant balance agee = grand livre. CREEE ; validation P1 Sonnet 2M/3L -> P2 Haiku 0 (repris : 1M) -> P3 ciblee Opus 3M/3L : portee de l'invariant REECRITE PAR UNE REGLE ; issues #473 #474 ouvertes. Branche EMPILEE sur 25-4-a. + 25-4-b1-residuel-aux-agregats: ready-for-dev # 2026-09-27 [#416, refs] balance agee + echeancier (totaux, colonne reste du, CSV, statut partiel, dialogue pre-rempli) + invariant balance agee = grand livre. CREEE ; validation P1 Sonnet 2M/3L -> P2 Haiku 0 (repris : 1M) -> P3 ciblee Opus 3M/3L : portee de l'invariant REECRITE PAR UNE REGLE ; issues #473 #474 ouvertes -> P4 1M -> P5 0 : VALIDEE en 5 passes. Signal MED->MED a arbitrer par Guy avant dev. Branche EMPILEE sur 25-4-a. 25-4-b2-residuel-aux-rappels: backlog # [#416, closes] le rappel reclame le reste du (texte, QR, PDF montant initial / deja regle / reste), frais configurables masques a zero ; point ouvert : frais non comptabilises. 25-4-b-residuel-aux-agregats: split # 2026-09-27 DECOUPEE en b1 (agregats) / b2 (rappels) — six modules apres les arbitrages Q1. # [#416] + montant des RELANCES (TTC complet, trouve a l'inventaire) — Q1 TRANCHEE 2026-09-27 : la QR du rappel porte le RESTE DU (= TTC sans reglement), reste a payer sur le PDF et dans le texte ; point ouvert : frais de rappel non comptabilises vs trop-percu. 25-4-c-residuel-au-rapprochement: backlog # [#420] — DEUX sites : filtre SQL des candidats (HAVING total_ttc) avant le score, puis score et re-score a l'acceptation. From bd06e7896fe41ada59dcc634b8b9fa434075e626 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 12:07:41 +0200 Subject: [PATCH 30/51] =?UTF-8?q?docs(25-4-b1):=20pas=20de=20d=C3=A9coupag?= =?UTF-8?q?e=20(Guy),=20dev=20lanc=C3=A9=20(refs=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../implementation-artifacts/25-4-b1-residuel-aux-agregats.md | 3 ++- _bmad-output/implementation-artifacts/sprint-status.yaml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md b/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md index 3f48e94b..3c3ca769 100644 --- a/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md +++ b/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md @@ -1,6 +1,6 @@ # Story 25.4-b1 : Le résiduel aux agrégats — balance âgée et échéancier -Status: ready-for-dev +Status: in-progress **Issue : [#416]** — cette story en livre la partie **agrégats** ; la partie **rappels** est la 25-4-b2. ⛔ **La PR de b1 porte `refs #416`, pas `closes`** : l'issue ne se ferme qu'avec b2. @@ -251,6 +251,7 @@ CHANGELOG `[0.12.1]` *Fixed*. README : rien, sauf si la ligne v0.12.1 cite la ba ## Change Log +- **2026-09-27** — Signal MED→MED arbitré par Guy : **pas de découpage** (« continue ainsi »). Dev lancé. - **2026-09-27** — **validation P5 ciblée** (Haiku, diff `5480b4f8..5824c048`, prompt `25-4-b1-validate-prompt-p5.md`) — **0 finding**, preuves recopiées (grep des cinq sites de T0, garde de la 0.12.0) et **concordantes avec les greps de l'orchestrateur**. ⛔ **Boucle close en 5 diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index ef897371..61d48fca 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -356,7 +356,7 @@ development_status: 25-3-b-annuler-rapprochement: done # 2026-09-25 DONE — revue close en passe 2 (Sonnet 1 MED -> Haiku 0) ; gates : backend 2463/2463, frontend 777/777, E2E sans regression. Non poussee. — SPEC VALIDEE (boucle close en passe 4 : 2 HIGH -> 2 MED -> 2 MED -> 3 LOW ; pas de decoupage, arbitrage de Guy). Q1-Q3 tranchees. — [#418] closes — annuler un rapprochement bancaire. ⛔ NE JAMAIS compter sur le `ON DELETE SET NULL` de `matched_entry_id` : supprimer l'ecriture ferait disparaitre le lien EN SILENCE, le mode d'echec meme que la story repare. ⚠️ Le chemin d'ACCEPTATION n'a aucune fonction `kesh-db` a mirer : il est ecrit en SQL brut a **cinq** sites de `routes/reconciliation.rs`, dont **un seul** porte le verrou optimiste. Quand la transaction porte une facture, appelle le geste de la 25-3-a. Derriere elle. 25-3-annuler-reglement-et-rapprochement: split # [#414] [#418] — **l'Epic 24 a livre l'encaissement et le rapprochement ; il n'a PAS livre le moyen de les DEFAIRE.** Une erreur d'imputation est aujourd'hui incorrigible autrement qu'a la main — et le gel de la 24-4b interdit precisement la main. ⚠️ *C'est le prix d'une story qui ferme une porte sans ouvrir la suivante : le gel est juste, et il rend cette story-ci necessaire.* 25-4-a-residuel-juste: done # 2026-09-27 REVUE CLOSE EN 1 PASSE ; PR #472 OUVERTE (closes #455 #456), attend « merge ». # IMPLEMENTEE — 7/7 mutations tuees ; gates 2484/2484, 826/826, E2E 222/10/19 sans regression ; prochaine etape : code review. # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (masque a l'ecran, mais rendu par GET /invoices/{id} aux cles API : amountDue = la TVA sur une facture creditee) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE ; validation : P1 Sonnet 1H/3M/1L -> P2 Haiku 1M retenu -> P3 ciblee Opus 2M/5L -> P4 ciblee Sonnet 0 > LOW (1M reclasse LOW) : VALIDEE en 4 passes. Arbitrage 2026-09-27 : refus maintenu, levee tracee par #471. - 25-4-b1-residuel-aux-agregats: ready-for-dev # 2026-09-27 [#416, refs] balance agee + echeancier (totaux, colonne reste du, CSV, statut partiel, dialogue pre-rempli) + invariant balance agee = grand livre. CREEE ; validation P1 Sonnet 2M/3L -> P2 Haiku 0 (repris : 1M) -> P3 ciblee Opus 3M/3L : portee de l'invariant REECRITE PAR UNE REGLE ; issues #473 #474 ouvertes -> P4 1M -> P5 0 : VALIDEE en 5 passes. Signal MED->MED a arbitrer par Guy avant dev. Branche EMPILEE sur 25-4-a. + 25-4-b1-residuel-aux-agregats: in-progress # 2026-09-27 [#416, refs] balance agee + echeancier (totaux, colonne reste du, CSV, statut partiel, dialogue pre-rempli) + invariant balance agee = grand livre. CREEE ; validation P1 Sonnet 2M/3L -> P2 Haiku 0 (repris : 1M) -> P3 ciblee Opus 3M/3L : portee de l'invariant REECRITE PAR UNE REGLE ; issues #473 #474 ouvertes -> P4 1M -> P5 0 : VALIDEE en 5 passes. Signal MED->MED : pas de decoupage (Guy, 2026-09-27). Branche EMPILEE sur 25-4-a. 25-4-b2-residuel-aux-rappels: backlog # [#416, closes] le rappel reclame le reste du (texte, QR, PDF montant initial / deja regle / reste), frais configurables masques a zero ; point ouvert : frais non comptabilises. 25-4-b-residuel-aux-agregats: split # 2026-09-27 DECOUPEE en b1 (agregats) / b2 (rappels) — six modules apres les arbitrages Q1. # [#416] + montant des RELANCES (TTC complet, trouve a l'inventaire) — Q1 TRANCHEE 2026-09-27 : la QR du rappel porte le RESTE DU (= TTC sans reglement), reste a payer sur le PDF et dans le texte ; point ouvert : frais de rappel non comptabilises vs trop-percu. 25-4-c-residuel-au-rapprochement: backlog # [#420] — DEUX sites : filtre SQL des candidats (HAVING total_ttc) avant le score, puis score et re-score a l'acceptation. From 87cbc8b4b6971b8f9f81026a52d51be8a94cfedf Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 15:14:19 +0200 Subject: [PATCH 31/51] =?UTF-8?q?feat(25-4-b1):=20r=C3=A9siduel=20aux=20ag?= =?UTF-8?q?r=C3=A9gats=20=E2=80=94=20balance=20=C3=A2g=C3=A9e=20et=20?= =?UTF-8?q?=C3=A9ch=C3=A9ancier=20(refs=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- CHANGELOG.md | 2 + .../25-4-b1-residuel-aux-agregats.md | 95 ++++++++- crates/kesh-api/src/routes/invoices.rs | 24 ++- .../kesh-api/tests/invoice_echeancier_e2e.rs | 103 +++++++++- crates/kesh-db/src/errors.rs | 7 +- .../src/repositories/invoice_settlements.rs | 28 +++ .../repositories/invoice_settlements_write.rs | 5 +- crates/kesh-db/src/repositories/invoices.rs | 45 +++-- .../tests/invoice_amount_due_parity.rs | 93 ++++++++- crates/kesh-db/tests/invoice_settlement.rs | 5 +- crates/kesh-i18n/locales/de-CH/messages.ftl | 2 + crates/kesh-i18n/locales/en-CH/messages.ftl | 2 + crates/kesh-i18n/locales/fr-CH/messages.ftl | 2 + crates/kesh-i18n/locales/it-CH/messages.ftl | 2 + crates/kesh-report/src/aged_receivables.rs | 59 ++++-- crates/kesh-report/tests/aged_receivables.rs | 183 +++++++++++++++++- docs/manual/fr/user-manual.pdf | Bin 292120 -> 293148 bytes docs/manual/fr/user-manual.tex | 14 +- .../invoices/SettleInvoiceDialog.svelte | 5 +- .../features/invoices/invoice-helpers.test.ts | 23 ++- .../lib/features/invoices/invoice-helpers.ts | 25 +++ .../lib/features/invoices/invoices.types.ts | 7 + frontend/src/lib/shared/i18n-keys.test.ts | 5 +- .../routes/(app)/invoices/[id]/+page.svelte | 20 +- .../(app)/invoices/due-dates/+page.svelte | 32 +-- .../invoices/due-dates/due-dates-page.test.ts | 144 ++++++++++++++ .../tests/e2e/invoices_echeancier.spec.ts | 87 +++++++-- 27 files changed, 912 insertions(+), 107 deletions(-) create mode 100644 frontend/src/routes/(app)/invoices/due-dates/due-dates-page.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d6e160a..8eff70ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,8 @@ Le contenu est rédigé en français à destination des **fiduciaires, PME, ind - **Un avoir pouvait viser une facture déjà réglée en partie ([#456](https://github.com/guycorbaz/kesh/issues/456)), et le compte du client devenait créditeur sans que rien ne le signale.** L'avoir était refusé sur une facture **payée**, mais pas sur une facture réglée **en partie** — qui, depuis le règlement partiel, n'est « payée » qu'une fois soldée. Comme l'avoir annule tout le montant de la facture, le client se retrouvait avec un crédit du montant déjà encaissé, que Kesh ne sait ni montrer, ni rembourser. L'avoir est désormais refusé dès qu'un règlement existe, avec un message qui dit quoi faire : annuler d'abord le règlement. *(Autoriser l'avoir sur une facture encaissée, avec le remboursement ou l'imputation qu'il appelle, est suivi par [#471](https://github.com/guycorbaz/kesh/issues/471).)* +- **La balance âgée et l'échéancier comptaient le montant facturé, et non ce que le client doit encore ([#416](https://github.com/guycorbaz/kesh/issues/416)).** Depuis le règlement partiel, une facture de 1'000.— réglée à 900.— y pesait toujours 1'000.—. ⚠️ La balance âgée est l'outil qui dit **qui relancer et pour combien** : elle surévaluait chaque créance de tout ce qui avait déjà été encaissé, sans que rien ne le signale, et ne concordait plus avec le compte clients du grand livre. Elle répartit désormais le **reste dû**, dans la tranche de l'échéance de la facture — un acompte ne rajeunit pas la créance. L'échéancier montre une colonne **« Reste dû »** à côté du total, le statut **« Partiellement payée »**, des totaux au reste dû, et son dialogue de règlement se **pré-remplit** au reste dû ; l'export CSV porte la même colonne. Le manuel dit à quelles conditions le total de la balance âgée égale le solde du compte clients. + ### Changed - **Le bouton *Créer un avoir* s'affiche aussi sur une facture payée**, et c'est voulu. Il était masqué sur une facture payée mais pas sur une facture réglée en partie : l'écran ne couvrait que la moitié de la règle. Il reste désormais visible, et Kesh explique le refus dans le dialogue — comme le bouton *Dévalider*. diff --git a/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md b/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md index 3c3ca769..2c4b9234 100644 --- a/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md +++ b/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md @@ -179,7 +179,7 @@ CHANGELOG `[0.12.1]` *Fixed*. README : rien, sauf si la ligne v0.12.1 cite la ba ## Tasks / Subtasks -- [ ] **T0 — rectifier la portée de l'état hérité posée par 25-4-a** : **cinq** sites disent +- [x] **T0 — rectifier la portée de l'état hérité posée par 25-4-a** : **cinq** sites disent l'état « avoir après règlement partiel » atteignable **seulement par l'import d'une sauvegarde** — quatre commentaires, `errors.rs:221`, `invoice_settlements_write.rs:333`, `tests/invoice_amount_due_parity.rs:139`, `tests/invoice_settlement.rs:980`, et **leur source**, @@ -188,12 +188,12 @@ CHANGELOG `[0.12.1]` *Fixed*. README : rien, sauf si la ligne v0.12.1 cite la ba publiée** accepte cet avoir, une installation **mise à jour sur place** le porte. Écrire « des données antérieures à la 0.12.1, restaurées ou mises à jour ». *(Le manuel de 25-4-a dit déjà « avant la version 0.12.1, ou restaurée » : juste.)* -- [ ] **T1 — la grandeur jointe** (AC 1-2). -- [ ] **T2 — balance âgée** (AC 3-6), dont l'invariant de concordance. -- [ ] **T3 — échéancier, backend** (AC 7-9, AC 11). -- [ ] **T4 — échéancier, frontend** (AC 10), i18n. -- [ ] **T5 — tests et mutations** (AC 12). -- [ ] **T6 — textes** (AC 13). +- [x] **T1 — la grandeur jointe** (AC 1-2). +- [x] **T2 — balance âgée** (AC 3-6), dont l'invariant de concordance. +- [x] **T3 — échéancier, backend** (AC 7-9, AC 11). +- [x] **T4 — échéancier, frontend** (AC 10), i18n. +- [x] **T5 — tests et mutations** (AC 12). +- [x] **T6 — textes** (AC 13). - [ ] **T7 — gates** : backend complet (base remise à zéro), frontend complet, **E2E complet**. ## Dev Notes @@ -243,12 +243,93 @@ CHANGELOG `[0.12.1]` *Fixed*. README : rien, sauf si la ligne v0.12.1 cite la ba ### Agent Model Used +Claude Opus 5.5. + ### Debug Log References +- La mutation « reste dû retiré du seul export » a d'abord **échoué à compiler** (argument nommé + `due` devenu inutilisé dans le `format!`) : mutation invalide, refaite en gardant l'argument + (`({due}) * 0 + COALESCE(lt.ttc, 0)`) — elle est alors tuée. +- Le reste dû arrive de l'API à l'échelle du calcul SQL (« 68.1000 ») ; `SettleInvoiceDialog` + le recopiait tel quel dans le champ montant — **aussi sur la fiche**, depuis la 24-2. Le + pré-remplissage passe désormais par `Big(amountDue).toFixed(2)`. +- ⚠️ **Relevé, non corrigé** : dans `invoice_echeancier_e2e.rs`, trois tests préexistants + déstructurent `seed_base` en `(company_id, admin_id)` alors qu'il rend `(admin_id, company_id)` + — ils passent parce que les deux identifiants valent 1 dans une base neuve. Les tests de 25-4-a, + qui avaient copié ce patron, sont rectifiés ici. + ### Completion Notes List +- **T0** : les quatre commentaires de 25-4-a qui bornaient l'état hérité à l'import disent + désormais « données antérieures à la 0.12.1, restaurées ou mises à jour sur place » ; la fiche + de 25-4-a porte sa note datée (validation P4). +- **La grandeur jointe** (AC 1-2) : `amount_due_derived_joins()` (les trois tables dérivées ; une + fonction, `concat!` ne sachant pas assembler des constantes), `INVOICE_AMOUNT_DUE_DERIVED_SQL`, + `INVOICE_AMOUNT_SETTLED_DERIVED_SQL` ; la parité de 25-4-a étendue — reste dû joint = scalaire, + facture par facture, reste dû négatif compris. +- **Balance âgée** (AC 3-6) : les cinq tranches et le total somment le reste dû, tranches sur + `due_date` ; doc-comments (module et `generate`) énoncent la **règle** de concordance et + l'absence de filtre des règlements par `as_of`. +- **Échéancier, serveur** (AC 7-9, 11) : résumé au reste dû ; `InvoiceListItem` porte + `amount_settled` / `amount_due`, projetés par **les deux** SELECT (liste et export) ; `total_ttc` + y vient désormais de `lt.ttc` (permis par les Dev Notes) ; DTO camelCase ; export CSV : colonne + « Reste dû » (clé ×4) et statut « Partiellement payée ». +- **Échéancier, écran** (AC 10) : `paymentStatusOf` partagé par la fiche et l'échéancier ; + colonne « Reste dû » (clé ×4, `sitesTotal` 1750 → 1751 recompté) ; dialogue pré-rempli, garde + client de trop-perçu rendue active ; commentaires qui disaient « TTC (montant dû) » corrigés. +- **Textes** (AC 13) : les **quatre** passages de la § Balance âgée (dont la réserve, par la + règle) et la § Échéancier ; PDF régénéré et **contrôlé aplati** (0 `??`, six phrases de contrôle + présentes, trois formules « TTC » absentes) ; CHANGELOG *Fixed*. Grep du symptôme sur le dépôt : + seule la ligne v0.7.0 publiée du README, légitime. + +**Tests ajoutés** (recomptés, branche de 25-4-a → arbre de travail) : `invoice_amount_due_parity` +4 → 6, `kesh-report/tests/aged_receivables` 4 → 7, `invoice_echeancier_e2e` 13 → 15, Vitest +`invoice-helpers.test.ts` 12 → 16, `due-dates-page.test.ts` 0 → 4 (nouveau). E2E +`invoices_echeancier.spec.ts` : le parcours de la 24-3 **vérifie** le montant pré-rempli au lieu +de le saisir, et un cas « réglée en partie » est ajouté. + +**Mutations** (observées, fichiers restaurés) : + +| Mutation | Tests rouges | +|---|---| +| TTC dans une tranche de la balance âgée | `aged_uses_amount_due_not_ttc` | +| TTC dans le seul total | `aged_total_matches_receivable_ledger`, `aged_uses_amount_due_not_ttc` | +| reste dû retiré du seul export | `list_items_carry_amount_due` | +| TTC dans le résumé de l'échéancier | `due_dates_summary_totals_are_amount_due` | +| `partial` retiré de `paymentStatusOf` | 2 Vitest (helper, page) | +| `amountDue={null}` remis | Vitest « dialogue pré-rempli » | + +### Gates + +- Backend : base remise à zéro, `scripts/test-fast.sh` **2491 / 2491** (2484 + 7). +- Frontend : `check` 0 erreur (27 avertissements), `lint-i18n-ownership` PASS, `test:unit` + **834 / 834** (826 + 8), build OK. +- E2E : EN_ATTENTE + ### File List +| Fichier | Nature | +|---|---| +| `crates/kesh-db/src/repositories/invoice_settlements.rs` | grandeur jointe | +| `crates/kesh-db/src/repositories/invoices.rs` | résumé, `InvoiceListItem`, deux SELECT | +| `crates/kesh-report/src/aged_receivables.rs` | requête, doc | +| `crates/kesh-api/src/routes/invoices.rs` | DTO, export CSV | +| `crates/kesh-i18n/locales/{fr,de,it,en}-CH/messages.ftl` | `echeancier-csv-header-amount-due`, `due-dates-column-amount-due` | +| `crates/kesh-db/src/errors.rs`, `invoice_settlements_write.rs` | T0 | +| `crates/kesh-db/tests/invoice_amount_due_parity.rs` | parité étendue, résumé, listes ; T0 | +| `crates/kesh-db/tests/invoice_settlement.rs` | T0 | +| `crates/kesh-report/tests/aged_receivables.rs` | 3 tests | +| `crates/kesh-api/tests/invoice_echeancier_e2e.rs` | 2 e2e ; ordre de `seed_base` rectifié (tests 25-4-a) | +| `frontend/src/lib/features/invoices/invoice-helpers.ts` / `.test.ts` | `paymentStatusOf` | +| `frontend/src/lib/features/invoices/invoices.types.ts` | `amountSettled`, `amountDue` | +| `frontend/src/lib/features/invoices/SettleInvoiceDialog.svelte` | pré-remplissage au centime | +| `frontend/src/routes/(app)/invoices/[id]/+page.svelte` | statut partagé | +| `frontend/src/routes/(app)/invoices/due-dates/+page.svelte` / `due-dates-page.test.ts` | colonne, statut, dialogue | +| `frontend/src/lib/shared/i18n-keys.test.ts` | `sitesTotal` 1751 | +| `frontend/tests/e2e/invoices_echeancier.spec.ts` | pré-remplissage, cas partiel | +| `docs/manual/fr/user-manual.tex` / `.pdf` | balance âgée, échéancier | +| `CHANGELOG.md` | *Fixed* | + ## Change Log - **2026-09-27** — Signal MED→MED arbitré par Guy : **pas de découpage** (« continue ainsi »). Dev lancé. diff --git a/crates/kesh-api/src/routes/invoices.rs b/crates/kesh-api/src/routes/invoices.rs index 913684d7..603d4c33 100644 --- a/crates/kesh-api/src/routes/invoices.rs +++ b/crates/kesh-api/src/routes/invoices.rs @@ -343,6 +343,11 @@ pub struct InvoiceListItemResponse { pub total_amount: Decimal, /// TTC canonique (#246, Story 21-2a) — colonne SQL calculée de la liste. pub total_ttc: Decimal, + /// Story 25-4-b1 (#416) — total réglé et **reste dû**, **toujours + /// calculés** dans une liste (forme jointe) : jamais `null` ici, à la + /// différence de la fiche où `None` veut dire « non calculé ». + pub amount_settled: Decimal, + pub amount_due: Decimal, pub paid_at: Option, /// Story 21-6a (D10) — suspension des rappels, alimente le badge /// « suspendu » de la liste des factures et le filtre `paused`. @@ -379,6 +384,8 @@ impl From for InvoiceListItemResponse { payment_terms: i.payment_terms, total_amount: i.total_amount, total_ttc: i.total_ttc, + amount_settled: i.amount_settled, + amount_due: i.amount_due, paid_at: i.paid_at, dunning_paused_at: i.dunning_paused_at, dunning_paused_note: i.dunning_paused_note, @@ -1332,12 +1339,13 @@ pub async fn cancel_invoice_settlement_handler( } /// Clés FTL des en-têtes CSV (locale = `companies.accounting_language`). -const CSV_HEADER_KEYS: [&str; 7] = [ +const CSV_HEADER_KEYS: [&str; 8] = [ "echeancier-csv-header-number", "echeancier-csv-header-date", "echeancier-csv-header-due-date", "echeancier-csv-header-contact", "echeancier-csv-header-total", + "echeancier-csv-header-amount-due", "echeancier-csv-header-payment-status", "echeancier-csv-header-paid-at", ]; @@ -1347,12 +1355,13 @@ const CSV_HEADER_KEYS: [&str; 7] = [ // interdit la recopie. Comportement identique ; ses tests unitaires, qui // n'existaient pas, ont été écrits à l'extraction (`util.rs`). -const CSV_HEADER_FALLBACKS: [&str; 7] = [ +const CSV_HEADER_FALLBACKS: [&str; 8] = [ "Numéro", "Date", "Date d'échéance", "Client", "Total", + "Reste dû", "Statut paiement", "Date paiement", ]; @@ -1440,8 +1449,12 @@ pub async fn export_due_dates_csv_handler( for inv in rows { // B3 (review pass 1 G2 B) : utilise le helper centralisé. + // Story 25-4-b1 (#416) : « partiellement payée » — même règle que la + // fiche : pas de `paid_at`, mais un règlement. let payment_status_key = if inv.paid_at.is_some() { "payment-status-paid" + } else if inv.amount_settled > Decimal::ZERO { + "payment-status-partial" } else if is_invoice_overdue(&inv.status, inv.paid_at, inv.due_date, today) { "payment-status-overdue" } else { @@ -1460,9 +1473,12 @@ pub async fn export_due_dates_csv_handler( format_date(&inv.date), inv.due_date.as_ref().map(format_date).unwrap_or_default(), csv_sanitize(inv.contact_name.clone()), - // #246 (Story 21-2a) : colonne Total = TTC (montant dû), - // cohérente avec les KPI du summary — pas le HT comptable. + // #246 (Story 21-2a) : colonne Total = TTC émis — pas le HT + // comptable. ⚠️ Ce n'est PAS le montant dû depuis la 24-2 : la + // colonne suivante le porte (Story 25-4-b1), cohérente avec les + // KPI du résumé. format_money(&inv.total_ttc), + format_money(&inv.amount_due), // B19 (review pass 2 G2 B) : défense en profondeur — la valeur // vient d'un fichier FTL contrôlé, mais une compromission // (clé locale altérée) ne doit pas ouvrir un vecteur d'injection. diff --git a/crates/kesh-api/tests/invoice_echeancier_e2e.rs b/crates/kesh-api/tests/invoice_echeancier_e2e.rs index 99cffc3f..b568b036 100644 --- a/crates/kesh-api/tests/invoice_echeancier_e2e.rs +++ b/crates/kesh-api/tests/invoice_echeancier_e2e.rs @@ -756,7 +756,7 @@ fn montant(v: &serde_json::Value, champ: &str) -> rust_decimal::Decimal { /// — ouverte aux clés API en lecture — rend un reste dû **nul**, et non la TVA. #[sqlx::test(migrations = "../kesh-db/test-schema")] async fn get_credited_invoice_reports_zero_amount_due(pool: MySqlPool) { - let (company_id, admin_id) = seed_base(&pool).await; + let (admin_id, company_id) = seed_base(&pool).await; let contact_id = seed_contact(&pool, company_id, admin_id).await; let (id, _v) = create_validated_invoice( &pool, @@ -795,7 +795,7 @@ async fn get_credited_invoice_reports_zero_amount_due(pool: MySqlPool) { /// son code et un message qui dit quoi faire. #[sqlx::test(migrations = "../kesh-db/test-schema")] async fn credit_note_on_partially_settled_invoice_is_409(pool: MySqlPool) { - let (company_id, admin_id) = seed_base(&pool).await; + let (admin_id, company_id) = seed_base(&pool).await; let contact_id = seed_contact(&pool, company_id, admin_id).await; let (id, _v) = create_validated_invoice( &pool, @@ -841,3 +841,102 @@ async fn credit_note_on_partially_settled_invoice_is_409(pool: MySqlPool) { assert_eq!(v["error"]["details"]["invoiceId"], id); assert!(v["error"]["details"]["settlementId"].as_i64().is_some()); } + +// --- Story 25-4-b1 (#416) — l'échéancier porte le reste dû, à la frontière HTTP -- + +/// Une facture de 108.10 (100.— à 8,1 %) réglée de 40.— en espèces, par HTTP. +async fn partially_settled_invoice( + pool: &MySqlPool, + app: &TestApp, + token: &str, + admin_id: i64, + company_id: i64, +) -> i64 { + let contact_id = seed_contact(pool, company_id, admin_id).await; + let (id, _v) = create_validated_invoice( + pool, + company_id, + contact_id, + admin_id, + NaiveDate::from_ymd_opt(2026, 4, 1).unwrap(), + NaiveDate::from_ymd_opt(2026, 4, 30).unwrap(), + dec!(100.00), + ) + .await; + let caisse = caisse_id(pool, company_id).await; + let settle = app + .client + .post(app.url(&format!("/api/v1/invoices/{id}/settlements"))) + .header("Authorization", format!("Bearer {token}")) + .json(&json!({ + "settlementType": "internal_account", + "accountId": caisse, + "amount": "40.00", + "settledOn": "2026-04-15" + })) + .send() + .await + .unwrap(); + assert_eq!(settle.status(), 200); + id +} + +/// AC 8-9 — la liste de l'échéancier rend `amountSettled` et `amountDue` par +/// ligne, et le résumé somme le reste dû. +#[sqlx::test(migrations = "../kesh-db/test-schema")] +async fn due_dates_list_carries_amount_due(pool: MySqlPool) { + let (admin_id, company_id) = seed_base(&pool).await; + let app = spawn_app(pool.clone()).await; + let token = login(&app).await; + let id = partially_settled_invoice(&pool, &app, &token, admin_id, company_id).await; + + let resp = app + .client + .get(app.url("/api/v1/invoices/due-dates")) + .header("Authorization", format!("Bearer {token}")) + .send() + .await + .unwrap(); + assert_eq!(resp.status(), 200); + let v: serde_json::Value = resp.json().await.unwrap(); + let item = v["items"] + .as_array() + .unwrap() + .iter() + .find(|i| i["id"] == id) + .unwrap_or_else(|| panic!("facture {id} absente : {v:?}")); + assert_eq!(montant(item, "totalTtc"), dec!(108.10)); + assert_eq!(montant(item, "amountSettled"), dec!(40.00)); + assert_eq!(montant(item, "amountDue"), dec!(68.10)); + assert_eq!( + montant(&v["summary"], "unpaidTotal"), + dec!(68.10), + "résumé : {v:?}" + ); +} + +/// AC 11 — l'export CSV porte une colonne « Reste dû » et le statut « partiellement +/// payée ». +#[sqlx::test(migrations = "../kesh-db/test-schema")] +async fn due_dates_csv_has_amount_due_and_partial_status(pool: MySqlPool) { + let (admin_id, company_id) = seed_base(&pool).await; + let app = spawn_app(pool.clone()).await; + let token = login(&app).await; + let _id = partially_settled_invoice(&pool, &app, &token, admin_id, company_id).await; + + let resp = app + .client + .get(app.url("/api/v1/invoices/due-dates/export.csv")) + .header("Authorization", format!("Bearer {token}")) + .send() + .await + .unwrap(); + assert_eq!(resp.status(), 200); + let text = String::from_utf8_lossy(&resp.bytes().await.unwrap()).to_string(); + let mut lines = text.trim_start_matches('\u{feff}').lines(); + let header = lines.next().unwrap(); + assert!(header.contains(";Total;Reste dû;"), "en-tête : {header}"); + let row = lines.next().expect("une ligne"); + assert!(row.contains(";108.10;68.10;"), "ligne : {row}"); + assert!(row.contains("Partiellement payée"), "statut : {row}"); +} diff --git a/crates/kesh-db/src/errors.rs b/crates/kesh-db/src/errors.rs index 402d0b39..c50f64a6 100644 --- a/crates/kesh-db/src/errors.rs +++ b/crates/kesh-db/src/errors.rs @@ -217,8 +217,11 @@ pub enum SettlementCancelBlocker { /// production que de l'avoir (`credit_notes.rs`). /// /// ⚠️ **État hérité depuis la Story 25-4-a (#456)** : un avoir est refusé - /// sur une facture réglée, même en partie. L'état n'est plus atteignable - /// que par l'**import d'une sauvegarde antérieure** — d'où ce motif, gardé. + /// sur une facture réglée, même en partie. L'état n'est plus produit par + /// l'application, mais des **données antérieures à la 0.12.1** peuvent le + /// porter — la 0.12.0 publiée acceptait cet avoir —, qu'elles soient + /// **restaurées** d'une sauvegarde ou **mises à jour sur place**. D'où ce + /// motif, gardé. InvoiceCredited, /// Tête **fournisseur** (Story 25-3-a-2) : la facture n'est pas `paid` — il /// n'y a pas de règlement à annuler. ⚠️ Coupe court par construction : une diff --git a/crates/kesh-db/src/repositories/invoice_settlements.rs b/crates/kesh-db/src/repositories/invoice_settlements.rs index 0261a9b0..8dd1a248 100644 --- a/crates/kesh-db/src/repositories/invoice_settlements.rs +++ b/crates/kesh-db/src/repositories/invoice_settlements.rs @@ -80,6 +80,34 @@ pub const INVOICE_CREDITED_DERIVED_JOIN_SQL: &str = concat!( WHERE cn.status = 'issued' GROUP BY cn.invoice_id) cnt ON cnt.invoice_id = i.id" ); +/// Les trois tables dérivées du **reste dû sous forme jointe** — TTC (`lt`), +/// avoir émis (`cnt`), réglé (`st`) — à placer après `FROM invoices i …` +/// (Story 25-4-b1, #416). **Prérequis : alias `i` sur `invoices`.** +/// +/// ⛔ Forme des **listes et agrégats** : la forme scalaire +/// ([`amount_due`]) y serait réévaluée par ligne — un N+1 déguisé (24-2, D3). +/// Les deux formes sont tenues d'accord par `tests/invoice_amount_due_parity.rs`. +/// +/// Une fonction et non une constante : les trois jointures sont elles-mêmes des +/// constantes, que `concat!` ne sait pas assembler. +pub fn amount_due_derived_joins() -> String { + format!( + "{} {INVOICE_CREDITED_DERIVED_JOIN_SQL} {INVOICE_SETTLED_DERIVED_JOIN_SQL}", + crate::repositories::invoices::INVOICE_TTC_DERIVED_JOIN_SQL + ) +} + +/// Le **reste dû** d'une ligne, sur les tables de +/// [`amount_due_derived_joins`] : `TTC − avoir émis − Σ règlements`, trois +/// termes TTC. Miroir exact de [`amount_due`]. ⛔ Ne pas le réécrire à la main +/// dans une requête : c'est ainsi que les agrégats ont sommé le TTC pendant +/// un mois après la 24-2 (#416). +pub const INVOICE_AMOUNT_DUE_DERIVED_SQL: &str = + "(COALESCE(lt.ttc, 0) - COALESCE(cnt.credited, 0) - COALESCE(st.settled, 0))"; + +/// Le **total réglé** d'une ligne, sur les tables de [`amount_due_derived_joins`]. +pub const INVOICE_AMOUNT_SETTLED_DERIVED_SQL: &str = "COALESCE(st.settled, 0)"; + /// Enregistre un règlement dans la transaction courante. /// /// ⚠️ **Ne pose PAS `paid_at`** : c'est à l'appelant de le faire, et seulement diff --git a/crates/kesh-db/src/repositories/invoice_settlements_write.rs b/crates/kesh-db/src/repositories/invoice_settlements_write.rs index 415b747c..02d4185d 100644 --- a/crates/kesh-db/src/repositories/invoice_settlements_write.rs +++ b/crates/kesh-db/src/repositories/invoice_settlements_write.rs @@ -329,8 +329,9 @@ pub async fn settlement_cancel_blocker_unlinking( // dévalidation refuse une facture réglée, et `cancelled` ne naît en // production que de l'avoir. Hors `validated`, c'est donc un avoir. // ⚠️ Depuis la Story 25-4-a (#456), l'avoir est refusé sur une facture - // réglée : ce rang ne se déclenche plus que sur un état HÉRITÉ, ramené par - // l'import d'une sauvegarde antérieure. + // réglée : ce rang ne se déclenche plus que sur un état HÉRITÉ — des données + // antérieures à la 0.12.1 (la 0.12.0 acceptait cet avoir), restaurées ou + // mises à jour sur place. if status != "validated" { return Ok(Some((SettlementCancelBlocker::InvoiceCredited, None, None))); } diff --git a/crates/kesh-db/src/repositories/invoices.rs b/crates/kesh-db/src/repositories/invoices.rs index 526bbc5a..e131e78b 100644 --- a/crates/kesh-db/src/repositories/invoices.rs +++ b/crates/kesh-db/src/repositories/invoices.rs @@ -32,6 +32,9 @@ use crate::entities::audit_log::NewAuditLogEntry; use crate::entities::invoice::{Invoice, InvoiceLine, InvoiceUpdate, NewInvoice, NewInvoiceLine}; use crate::errors::{DbError, UnvalidationBlocker, map_db_error}; use crate::repositories::audit_log; +use crate::repositories::invoice_settlements::{ + INVOICE_AMOUNT_DUE_DERIVED_SQL, INVOICE_AMOUNT_SETTLED_DERIVED_SQL, amount_due_derived_joins, +}; use crate::repositories::journal_entries; use crate::util::search::{escape_boolean_ft, escape_like}; @@ -254,9 +257,16 @@ pub struct InvoiceListItem { pub due_date: Option, pub payment_terms: Option, pub total_amount: Decimal, - /// TTC canonique (#246) — colonne SQL calculée (`INVOICE_TTC_SUBQUERY_SQL`), - /// la projection ne charge pas les lignes. + /// TTC canonique (#246) — colonne SQL calculée (table dérivée `lt` depuis + /// la Story 25-4-b1 ; `invoice_ttc_parity.rs` la tient égale à la forme + /// corrélée), la projection ne charge pas les lignes. pub total_ttc: Decimal, + /// Story 25-4-b1 (#416) — total déjà réglé, forme jointe. + pub amount_settled: Decimal, + /// Story 25-4-b1 (#416) — **reste dû** : TTC − avoir émis − Σ règlements, + /// forme jointe (`INVOICE_AMOUNT_DUE_DERIVED_SQL`). Peut être négatif + /// (trop-perçu hérité) : jamais écrêté. + pub amount_due: Decimal, pub paid_at: Option, /// Story 21-6a (D10) — suspension des rappels, exposée en liste (badge). /// @@ -816,10 +826,14 @@ pub async fn list_by_company_paginated( let mut items_qb: QueryBuilder = QueryBuilder::new(format!( "SELECT i.id, i.company_id, i.contact_id, c.name AS contact_name, \ i.invoice_number, i.status, i.date, i.due_date, i.payment_terms, \ - i.total_amount, {INVOICE_TTC_SUBQUERY_SQL} AS total_ttc, \ + i.total_amount, COALESCE(lt.ttc, 0) AS total_ttc, \ + {settled} AS amount_settled, {due} AS amount_due, \ i.paid_at, i.dunning_paused_at, i.dunning_paused_note, \ i.version, i.created_at, i.updated_at \ - FROM invoices i INNER JOIN contacts c ON c.id = i.contact_id", + FROM invoices i INNER JOIN contacts c ON c.id = i.contact_id {joins}", + settled = INVOICE_AMOUNT_SETTLED_DERIVED_SQL, + due = INVOICE_AMOUNT_DUE_DERIVED_SQL, + joins = amount_due_derived_joins(), )); push_where_clauses(&mut items_qb, company_id, &query); items_qb.push(" ORDER BY "); @@ -887,16 +901,19 @@ pub async fn due_dates_summary( let mut qb: QueryBuilder = QueryBuilder::new(format!( // CAST AS SIGNED pour forcer BIGINT : MariaDB SUM(CASE…) retourne // DECIMAL par défaut, incompatible avec Rust i64. - // #246 (Story 21-2a) : totaux en TTC via la table dérivée `lt` - // (INVOICE_TTC_DERIVED_JOIN_SQL) — les KPI de l'échéancier sont des - // montants dus, pas des HT comptables. + // Story 25-4-b1 (#416) : les KPI de l'échéancier sont des RESTES DUS — + // TTC − avoir émis − Σ règlements, forme jointe — et non plus le TTC + // émis (#246, 21-2a), qui comptait une facture de 1 000.— réglée à + // 900.— pour 1 000.—. "SELECT \ COUNT(*) AS unpaid_count, \ - COALESCE(SUM(COALESCE(lt.ttc, 0)), CAST(0 AS DECIMAL(19,4))) AS unpaid_total, \ + COALESCE(SUM({due}), CAST(0 AS DECIMAL(19,4))) AS unpaid_total, \ CAST(COALESCE(SUM(CASE WHEN i.due_date < UTC_DATE() THEN 1 ELSE 0 END), 0) AS SIGNED) AS overdue_count, \ - COALESCE(SUM(CASE WHEN i.due_date < UTC_DATE() THEN COALESCE(lt.ttc, 0) ELSE 0 END), CAST(0 AS DECIMAL(19,4))) AS overdue_total \ + COALESCE(SUM(CASE WHEN i.due_date < UTC_DATE() THEN {due} ELSE 0 END), CAST(0 AS DECIMAL(19,4))) AS overdue_total \ FROM invoices i INNER JOIN contacts c ON c.id = i.contact_id \ - {INVOICE_TTC_DERIVED_JOIN_SQL}", + {joins}", + due = INVOICE_AMOUNT_DUE_DERIVED_SQL, + joins = amount_due_derived_joins(), )); qb.push(" WHERE i.company_id = "); qb.push_bind(company_id); @@ -2456,10 +2473,14 @@ pub async fn list_for_export( let mut items_qb: QueryBuilder = QueryBuilder::new(format!( "SELECT i.id, i.company_id, i.contact_id, c.name AS contact_name, \ i.invoice_number, i.status, i.date, i.due_date, i.payment_terms, \ - i.total_amount, {INVOICE_TTC_SUBQUERY_SQL} AS total_ttc, \ + i.total_amount, COALESCE(lt.ttc, 0) AS total_ttc, \ + {settled} AS amount_settled, {due} AS amount_due, \ i.paid_at, i.dunning_paused_at, i.dunning_paused_note, \ i.version, i.created_at, i.updated_at \ - FROM invoices i INNER JOIN contacts c ON c.id = i.contact_id", + FROM invoices i INNER JOIN contacts c ON c.id = i.contact_id {joins}", + settled = INVOICE_AMOUNT_SETTLED_DERIVED_SQL, + due = INVOICE_AMOUNT_DUE_DERIVED_SQL, + joins = amount_due_derived_joins(), )); push_where_clauses(&mut items_qb, company_id, query); // P13 (review pass 3 A) : défense en profondeur — l'export ne doit diff --git a/crates/kesh-db/tests/invoice_amount_due_parity.rs b/crates/kesh-db/tests/invoice_amount_due_parity.rs index 79523b62..bea59d82 100644 --- a/crates/kesh-db/tests/invoice_amount_due_parity.rs +++ b/crates/kesh-db/tests/invoice_amount_due_parity.rs @@ -19,8 +19,9 @@ use chrono::NaiveDate; use kesh_db::entities::contact::{ContactType, NewContact}; use kesh_db::entities::{NewCreditNote, NewInvoice, NewInvoiceLine, SettlementChoice}; use kesh_db::repositories::invoice_settlements::{ - INVOICE_CREDITED_DERIVED_JOIN_SQL, INVOICE_CREDITED_SUBQUERY_SQL, - INVOICE_SETTLED_DERIVED_JOIN_SQL, INVOICE_SETTLED_SUBQUERY_SQL, amount_due, + INVOICE_AMOUNT_DUE_DERIVED_SQL, INVOICE_CREDITED_DERIVED_JOIN_SQL, + INVOICE_CREDITED_SUBQUERY_SQL, INVOICE_SETTLED_DERIVED_JOIN_SQL, INVOICE_SETTLED_SUBQUERY_SQL, + amount_due, amount_due_derived_joins, }; use kesh_db::repositories::{contacts, credit_notes, invoice_settlements_write, invoices}; use kesh_db::test_fixtures::{SeededCompany, seed_accounting_company}; @@ -136,7 +137,8 @@ async fn credit( } /// L'état hérité **règlement puis avoir**, que 25-4-a rend inatteignable par -/// l'application mais qu'un `.keshbackup` v0.12.0 peut ramener. +/// l'application, mais que des données antérieures à la 0.12.1 peuvent porter — +/// la 0.12.0 publiée acceptait cet avoir —, restaurées ou mises à jour sur place. /// /// Gabarit « détacher, créditer, rattacher » (AC 13) : les deux écritures /// viennent des **vrais chemins** ; seul le rattachement de la ligne de @@ -308,4 +310,89 @@ async fn settled_and_credited_forms_are_at_parity(pool: MySqlPool) { Decimal::ZERO, "un brouillon n'éteint rien" ); + + // Story 25-4-b1 (AC 2) — le reste dû sous forme JOINTE, celle des listes et + // agrégats, égale la forme scalaire facture par facture. + let joined: Vec<(i64, Decimal)> = sqlx::query_as(&format!( + "SELECT i.id, {INVOICE_AMOUNT_DUE_DERIVED_SQL} FROM invoices i {} \ + WHERE i.company_id = ? ORDER BY i.id", + amount_due_derived_joins() + )) + .bind(seeded.company_id) + .fetch_all(&pool) + .await + .expect("reste dû joint"); + assert_eq!(joined.len(), rows.len()); + for (id, due) in &joined { + assert_eq!( + *due, + amount_due(&pool, *id).await.unwrap(), + "reste dû joint ≠ scalaire, facture {id}" + ); + } + // Anti-vacuité : le jeu porte des restes dus distincts, dont un négatif. + assert!( + joined.iter().any(|(_, d)| *d < Decimal::ZERO), + "état hérité : reste dû négatif" + ); + assert!(joined.iter().any(|(_, d)| *d > Decimal::ZERO)); +} + +// ─── Story 25-4-b1 (#416) — l'échéancier porte le reste dû ──────────────────── + +fn unpaid_query() -> invoices::InvoiceListQuery { + invoices::InvoiceListQuery { + status: Some("validated".into()), + payment_status: Some(invoices::PaymentStatusFilter::Unpaid), + limit: 100, + ..Default::default() + } +} + +/// AC 7 — les totaux du résumé somment le reste dû : 108.10 réglé 40 pèse 68.10. +#[sqlx::test(migrations = "./test-schema")] +async fn due_dates_summary_totals_are_amount_due(pool: MySqlPool) { + let seeded = seed_accounting_company(&pool).await.unwrap(); + let contact = make_contact(&pool, &seeded).await; + let partial = validated(&pool, &seeded, contact, &[(dec!(8.10), dec!(100.00))]).await; + settle(&pool, &seeded, partial, dec!(40.00)).await; + let _open = validated(&pool, &seeded, contact, &[(dec!(2.60), dec!(50.00))]).await; + + let summary = invoices::due_dates_summary(&pool, seeded.company_id, &unpaid_query()) + .await + .unwrap(); + assert_eq!(summary.unpaid_count, 2); + // 68.10 + 51.30 + assert_eq!( + summary.unpaid_total, + dec!(119.40), + "reste dû, pas 159.40 de TTC" + ); +} + +/// AC 8 — les DEUX SELECT qui désérialisent `InvoiceListItem` portent le réglé +/// et le reste dû : la liste paginée ET l'export. +#[sqlx::test(migrations = "./test-schema")] +async fn list_items_carry_amount_due(pool: MySqlPool) { + let seeded = seed_accounting_company(&pool).await.unwrap(); + let contact = make_contact(&pool, &seeded).await; + let partial = validated(&pool, &seeded, contact, &[(dec!(8.10), dec!(100.00))]).await; + settle(&pool, &seeded, partial, dec!(40.00)).await; + let open = validated(&pool, &seeded, contact, &[(dec!(8.10), dec!(10.00))]).await; + + let page = invoices::list_by_company_paginated(&pool, seeded.company_id, unpaid_query()) + .await + .unwrap(); + let (export, _) = invoices::list_for_export(&pool, seeded.company_id, &unpaid_query(), 100) + .await + .unwrap(); + for (surface, items) in [("liste", &page.items), ("export", &export)] { + let p = items.iter().find(|i| i.id == partial).expect(surface); + assert_eq!(p.total_ttc, dec!(108.10), "{surface} : TTC"); + assert_eq!(p.amount_settled, dec!(40.00), "{surface} : réglé"); + assert_eq!(p.amount_due, dec!(68.10), "{surface} : reste dû"); + let o = items.iter().find(|i| i.id == open).expect(surface); + assert_eq!(o.amount_settled, Decimal::ZERO, "{surface}"); + assert_eq!(o.amount_due, dec!(10.81), "{surface}"); + } } diff --git a/crates/kesh-db/tests/invoice_settlement.rs b/crates/kesh-db/tests/invoice_settlement.rs index f14d1f21..ba67d009 100644 --- a/crates/kesh-db/tests/invoice_settlement.rs +++ b/crates/kesh-db/tests/invoice_settlement.rs @@ -976,8 +976,9 @@ async fn monter(pool: &MySqlPool, motifs: &[SettlementCancelBlocker]) -> (Seeded if motifs.contains(&SettlementCancelBlocker::InvoiceCredited) { // ⚠️ **État HÉRITÉ, plus atteignable par l'application** depuis la // Story 25-4-a (#456) : un avoir est désormais refusé sur une facture - // réglée, même en partie. Il reste possible par l'**import d'une - // sauvegarde antérieure** — c'est ce qui justifie de garder le motif + // réglée, même en partie. Des **données antérieures à la 0.12.1** peuvent + // encore le porter — la 0.12.0 publiée acceptait cet avoir —, restaurées + // ou mises à jour sur place : c'est ce qui justifie de garder le motif // `InvoiceCredited` et ce montage. // // Gabarit « détacher, créditer, rattacher » : les deux écritures diff --git a/crates/kesh-i18n/locales/de-CH/messages.ftl b/crates/kesh-i18n/locales/de-CH/messages.ftl index 6c151ed9..883ca037 100644 --- a/crates/kesh-i18n/locales/de-CH/messages.ftl +++ b/crates/kesh-i18n/locales/de-CH/messages.ftl @@ -649,6 +649,7 @@ due-dates-column-date = Datum due-dates-column-due-date = Fälligkeit due-dates-column-contact = Kunde due-dates-column-total = Total +due-dates-column-amount-due = Offener Betrag due-dates-column-payment-status = Status due-dates-column-paid-at = Bezahlt am due-dates-export-button = CSV exportieren @@ -728,6 +729,7 @@ echeancier-csv-header-date = Datum echeancier-csv-header-due-date = Fälligkeitsdatum echeancier-csv-header-contact = Kunde echeancier-csv-header-total = Total +echeancier-csv-header-amount-due = Offener Betrag echeancier-csv-header-payment-status = Zahlungsstatus echeancier-csv-header-paid-at = Zahlungsdatum echeancier-export-error-too-large = Zu viele Ergebnisse (> { $limit }). Bitte die Filter verfeinern (z. B. Datumsbereich oder Zahlungsstatus), bevor der Export erneut gestartet wird. diff --git a/crates/kesh-i18n/locales/en-CH/messages.ftl b/crates/kesh-i18n/locales/en-CH/messages.ftl index 92ffd928..7842a8f6 100644 --- a/crates/kesh-i18n/locales/en-CH/messages.ftl +++ b/crates/kesh-i18n/locales/en-CH/messages.ftl @@ -649,6 +649,7 @@ due-dates-column-date = Date due-dates-column-due-date = Due date due-dates-column-contact = Customer due-dates-column-total = Total +due-dates-column-amount-due = Amount due due-dates-column-payment-status = Status due-dates-column-paid-at = Paid on due-dates-export-button = Export CSV @@ -728,6 +729,7 @@ echeancier-csv-header-date = Date echeancier-csv-header-due-date = Due date echeancier-csv-header-contact = Customer echeancier-csv-header-total = Total +echeancier-csv-header-amount-due = Amount due echeancier-csv-header-payment-status = Payment status echeancier-csv-header-paid-at = Paid on echeancier-export-error-too-large = Too many results (> { $limit }). Please refine your filters (e.g. date range or payment status) before exporting. diff --git a/crates/kesh-i18n/locales/fr-CH/messages.ftl b/crates/kesh-i18n/locales/fr-CH/messages.ftl index 9e47a49e..efec23fe 100644 --- a/crates/kesh-i18n/locales/fr-CH/messages.ftl +++ b/crates/kesh-i18n/locales/fr-CH/messages.ftl @@ -682,6 +682,7 @@ due-dates-column-date = Date due-dates-column-due-date = Échéance due-dates-column-contact = Client due-dates-column-total = Total +due-dates-column-amount-due = Reste dû due-dates-column-payment-status = Statut due-dates-column-paid-at = Payée le due-dates-export-button = Exporter CSV @@ -764,6 +765,7 @@ echeancier-csv-header-date = Date echeancier-csv-header-due-date = Date d'échéance echeancier-csv-header-contact = Client echeancier-csv-header-total = Total +echeancier-csv-header-amount-due = Reste dû echeancier-csv-header-payment-status = Statut paiement echeancier-csv-header-paid-at = Date paiement echeancier-export-error-too-large = Trop de résultats (> { $limit }). Veuillez affiner vos filtres (par ex. plage de dates ou statut de paiement) avant de relancer l'export. diff --git a/crates/kesh-i18n/locales/it-CH/messages.ftl b/crates/kesh-i18n/locales/it-CH/messages.ftl index 06f35274..627734b4 100644 --- a/crates/kesh-i18n/locales/it-CH/messages.ftl +++ b/crates/kesh-i18n/locales/it-CH/messages.ftl @@ -649,6 +649,7 @@ due-dates-column-date = Data due-dates-column-due-date = Scadenza due-dates-column-contact = Cliente due-dates-column-total = Totale +due-dates-column-amount-due = Saldo dovuto due-dates-column-payment-status = Stato due-dates-column-paid-at = Pagata il due-dates-export-button = Esporta CSV @@ -728,6 +729,7 @@ echeancier-csv-header-date = Data echeancier-csv-header-due-date = Scadenza echeancier-csv-header-contact = Cliente echeancier-csv-header-total = Totale +echeancier-csv-header-amount-due = Saldo dovuto echeancier-csv-header-payment-status = Stato pagamento echeancier-csv-header-paid-at = Data pagamento echeancier-export-error-too-large = Troppi risultati (> { $limit }). Affinare i filtri (intervallo date o stato di pagamento) prima di esportare. diff --git a/crates/kesh-report/src/aged_receivables.rs b/crates/kesh-report/src/aged_receivables.rs index 96f70093..aadf7478 100644 --- a/crates/kesh-report/src/aged_receivables.rs +++ b/crates/kesh-report/src/aged_receivables.rs @@ -1,16 +1,26 @@ //! Balance âgée des créances clients (Story 21-7, #231, §E items 23/25). //! -//! Répartit l'encours débiteur **TTC** (postes ouverts = factures validées non -//! payées) par contact et par tranche d'ancienneté relative à une date de +//! Répartit l'encours débiteur — le **reste dû** de chaque facture validée non +//! soldée, après règlements partiels et avoirs (Story 25-4-b1, #416) — par contact et par tranche d'ancienneté relative à une date de //! référence `as_of` : //! //! `Non échu | 1-30 | 31-60 | 61-90 | 90+` jours de retard (`days = as_of − due_date`). //! //! Invariants : -//! - **TTC dérivé** via `INVOICE_TTC_DERIVED_JOIN_SQL` (#246, 21-2) — jamais -//! `total_amount` (qui est le HT). L'arrondi TVA est fait PAR LIGNE dans la -//! table dérivée (DC7), asservi au helper Rust `invoice_total_ttc` par un test -//! de parité (`tests/aged_receivables.rs`). +//! - **Reste dû dérivé** (`INVOICE_AMOUNT_DUE_DERIVED_SQL` sur +//! `amount_due_derived_joins`, Story 25-4-b1) : TTC − avoir émis − Σ +//! règlements, jamais le TTC seul ni `total_amount` (le HT). Le TTC y est +//! arrondi PAR LIGNE (DC7), asservi au helper Rust `invoice_total_ttc` +//! (`tests/aged_receivables.rs`) ; le reste dû joint, à `amount_due` +//! (`kesh-db/tests/invoice_amount_due_parity.rs`). +//! - ⛔ **Concordance avec le grand livre** — le total égale le solde du compte +//! débiteurs **si et seulement si** ce compte n'est mouvementé que par les +//! écritures de vente, de règlement client et d'avoir de factures validées +//! (contre-passations comprises), datées au plus tard à `as_of`, sans que le +//! compte débiteurs ait changé dans les réglages. Tout autre mouvement — solde +//! d'ouverture, écriture au journal, rapprochement hors facture, compensation +//! fournisseur, données antérieures à la 0.12.1 — l'en écarte, et la balance +//! âgée ne le montre pas (règle, non liste : `tests/aged_receivables.rs`). //! - **Factures suspendues INCLUSES** (D10) : le prédicat postes ouverts //! n'exclut PAS `dunning_paused_at` — une facture suspendue reste dans la //! balance âgée (elle ne sort que de la liste « à rappeler »). @@ -18,7 +28,9 @@ //! - Totaux généraux **sommés en Rust** (patron `balance_sheet`), pas en SQL. use chrono::NaiveDate; -use kesh_db::repositories::invoices::INVOICE_TTC_DERIVED_JOIN_SQL; +use kesh_db::repositories::invoice_settlements::{ + INVOICE_AMOUNT_DUE_DERIVED_SQL, amount_due_derived_joins, +}; use rust_decimal::Decimal; use serde::Serialize; use sqlx::MySqlPool; @@ -95,8 +107,9 @@ struct AgedRowSql { /// /// Une seule requête agrégée groupée par contact. Buckets calculés via /// `DATEDIFF(as_of, due_date)` ; `due_date IS NULL` → « Non échu ». Montants = -/// TTC dérivé (`INVOICE_TTC_DERIVED_JOIN_SQL`, alias `lt`). Scoping multi-tenant -/// obligatoire (`i.company_id = ?`). +/// **reste dû** dérivé (Story 25-4-b1) ; ⚠️ il ne filtre pas les règlements +/// par date : `as_of` borne les tranches, pas les pièces — la route le fixe à +/// aujourd'hui. Scoping multi-tenant obligatoire (`i.company_id = ?`). pub async fn generate( pool: &MySqlPool, company_id: i64, @@ -106,28 +119,36 @@ pub async fn generate( // Non échu : due_date NULL OU DATEDIFF <= 0 (échéance >= as_of) // 1-30 / 31-60 / 61-90 : DATEDIFF dans [lo, hi] // 90+ : DATEDIFF >= 91 (strictement plus de 90 jours — pas de recouvrement) - // Le TTC par facture vient de la table dérivée `lt`. HAVING total <> 0 - // écarte une facture legacy sans lignes (TTC 0) qui polluerait la liste. + // HAVING total <> 0 écarte une facture legacy sans lignes (reste dû 0) + // qui polluerait la liste. ⚠️ Un reste dû NÉGATIF (trop-perçu hérité) + // n'est pas écrêté : il apparaît. + // ⛔ Story 25-4-b1 (#416) : chaque tranche somme le RESTE DÛ, jamais le + // TTC — une facture de 1 000.— réglée à 900.— pèse 100.—. Les tranches + // restent assises sur `due_date` : un règlement partiel ne rajeunit pas la + // créance restante. Forme JOINTE (`amount_due_derived_joins`) : la forme + // scalaire serait réévaluée par ligne et par CASE. + let due = INVOICE_AMOUNT_DUE_DERIVED_SQL; let sql = format!( "SELECT c.id AS contact_id, c.name AS contact_name, \ COALESCE(SUM(CASE WHEN i.due_date IS NULL OR DATEDIFF(?, i.due_date) <= 0 \ - THEN COALESCE(lt.ttc, 0) ELSE 0 END), CAST(0 AS DECIMAL(19,4))) AS not_due, \ + THEN {due} ELSE 0 END), CAST(0 AS DECIMAL(19,4))) AS not_due, \ COALESCE(SUM(CASE WHEN DATEDIFF(?, i.due_date) BETWEEN 1 AND 30 \ - THEN COALESCE(lt.ttc, 0) ELSE 0 END), CAST(0 AS DECIMAL(19,4))) AS d1_30, \ + THEN {due} ELSE 0 END), CAST(0 AS DECIMAL(19,4))) AS d1_30, \ COALESCE(SUM(CASE WHEN DATEDIFF(?, i.due_date) BETWEEN 31 AND 60 \ - THEN COALESCE(lt.ttc, 0) ELSE 0 END), CAST(0 AS DECIMAL(19,4))) AS d31_60, \ + THEN {due} ELSE 0 END), CAST(0 AS DECIMAL(19,4))) AS d31_60, \ COALESCE(SUM(CASE WHEN DATEDIFF(?, i.due_date) BETWEEN 61 AND 90 \ - THEN COALESCE(lt.ttc, 0) ELSE 0 END), CAST(0 AS DECIMAL(19,4))) AS d61_90, \ + THEN {due} ELSE 0 END), CAST(0 AS DECIMAL(19,4))) AS d61_90, \ COALESCE(SUM(CASE WHEN DATEDIFF(?, i.due_date) >= 91 \ - THEN COALESCE(lt.ttc, 0) ELSE 0 END), CAST(0 AS DECIMAL(19,4))) AS d90p, \ - COALESCE(SUM(COALESCE(lt.ttc, 0)), CAST(0 AS DECIMAL(19,4))) AS total \ + THEN {due} ELSE 0 END), CAST(0 AS DECIMAL(19,4))) AS d90p, \ + COALESCE(SUM({due}), CAST(0 AS DECIMAL(19,4))) AS total \ FROM invoices i \ INNER JOIN contacts c ON c.id = i.contact_id \ - {INVOICE_TTC_DERIVED_JOIN_SQL} \ + {joins} \ WHERE i.company_id = ? AND i.status = 'validated' AND i.paid_at IS NULL \ GROUP BY c.id, c.name \ HAVING total <> 0 \ - ORDER BY c.name, c.id" + ORDER BY c.name, c.id", + joins = amount_due_derived_joins() ); let sql_rows = sqlx::query_as::<_, AgedRowSql>(&sql) diff --git a/crates/kesh-report/tests/aged_receivables.rs b/crates/kesh-report/tests/aged_receivables.rs index 23e18016..8c02301e 100644 --- a/crates/kesh-report/tests/aged_receivables.rs +++ b/crates/kesh-report/tests/aged_receivables.rs @@ -11,9 +11,9 @@ use chrono::{Duration, NaiveDate}; use kesh_core::accounting::vat::invoice_total_ttc; use kesh_db::entities::contact::{ContactType, NewContact, Salutation}; -use kesh_db::entities::{NewInvoice, NewInvoiceLine}; +use kesh_db::entities::{NewCreditNote, NewInvoice, NewInvoiceLine, SettlementChoice}; use kesh_db::repositories::invoices::ValidatedInvoice; -use kesh_db::repositories::{contacts, invoices}; +use kesh_db::repositories::{contacts, credit_notes, invoice_settlements_write, invoices}; use kesh_db::test_fixtures::{SeededCompany, seed_accounting_company}; use kesh_report::aged_receivables::generate; use rust_decimal::Decimal; @@ -314,3 +314,182 @@ async fn aged_empty_when_no_open_items(pool: MySqlPool) { assert_eq!(report.totals.not_due, Decimal::ZERO); assert_eq!(report.as_of, as_of()); } + +// ─── Story 25-4-b1 (#416) — la balance âgée somme le RESTE DÛ ───────────────── + +async fn settle( + pool: &MySqlPool, + seeded: &SeededCompany, + invoice_id: i64, + amount: Decimal, + on: NaiveDate, +) { + invoice_settlements_write::settle_invoice( + pool, + seeded.admin_user_id, + seeded.company_id, + invoice_id, + SettlementChoice::InternalAccount { + account_id: seeded.accounts["1000"], + }, + amount, + on, + ) + .await + .expect("règlement"); +} + +/// Solde du compte débiteurs au grand livre, pour la société. +async fn receivable_balance(pool: &MySqlPool, seeded: &SeededCompany) -> Decimal { + sqlx::query_scalar( + "SELECT COALESCE(SUM(l.debit) - SUM(l.credit), 0) FROM journal_entry_lines l \ + INNER JOIN journal_entries e ON e.id = l.entry_id \ + WHERE e.company_id = ? AND l.account_id = ?", + ) + .bind(seeded.company_id) + .bind(seeded.accounts["1100"]) + .fetch_one(pool) + .await + .expect("solde 1100") +} + +/// AC 3 — une facture de 1 081.— (1 000.— à 8,1 %) réglée de 900.— pèse **181.—** +/// dans sa tranche, pas 1 081.—. +#[sqlx::test(migrations = "../kesh-db/test-schema")] +async fn aged_uses_amount_due_not_ttc(pool: MySqlPool) { + let seeded = seed_accounting_company(&pool).await.unwrap(); + let alpha = mk_contact(&pool, &seeded, "Alpha SA").await; + let v = mk_validated( + &pool, + &seeded, + alpha, + Some(days_before(45)), + dec!(8.10), + dec!(1000.00), + ) + .await; + settle(&pool, &seeded, v.invoice.id, dec!(900.00), days_before(40)).await; + + let r = generate(&pool, seeded.company_id, as_of()).await.unwrap(); + assert_eq!(r.rows.len(), 1); + assert_eq!( + r.rows[0].buckets.days_31_to_60, + dec!(181.00), + "reste dû, pas le TTC" + ); + assert_eq!(r.rows[0].buckets.total, dec!(181.00)); + assert_eq!(r.totals.total, dec!(181.00)); +} + +/// AC 3 — ⛔ un règlement partiel ne rajeunit pas la créance : la tranche suit +/// l'échéance de la facture, pas la date du règlement. +#[sqlx::test(migrations = "../kesh-db/test-schema")] +async fn aged_partial_payment_keeps_original_bucket(pool: MySqlPool) { + let seeded = seed_accounting_company(&pool).await.unwrap(); + let alpha = mk_contact(&pool, &seeded, "Alpha SA").await; + let v = mk_validated( + &pool, + &seeded, + alpha, + Some(days_before(100)), + dec!(8.10), + dec!(100.00), + ) + .await; + // Réglé en partie HIER : la créance restante reste à plus de 90 jours. + settle(&pool, &seeded, v.invoice.id, dec!(8.10), days_before(1)).await; + + let r = generate(&pool, seeded.company_id, as_of()).await.unwrap(); + let b = &r.rows[0].buckets; + assert_eq!(b.days_over_90, dec!(100.00)); + assert_eq!( + b.not_due + b.days_1_to_30 + b.days_31_to_60 + b.days_61_to_90, + Decimal::ZERO + ); +} + +/// AC 5 — ⛔ le total de la balance âgée égale le solde du compte débiteurs au +/// grand livre, **dans la règle** : compte mû seulement par les ventes, +/// règlements clients et avoirs de factures validées, datés au plus tard à +/// `as_of`. Quatre états vivants : sans règlement, réglée en partie, soldée, +/// créditée. +#[sqlx::test(migrations = "../kesh-db/test-schema")] +async fn aged_total_matches_receivable_ledger(pool: MySqlPool) { + let seeded = seed_accounting_company(&pool).await.unwrap(); + let alpha = mk_contact(&pool, &seeded, "Alpha SA").await; + let beta = mk_contact(&pool, &seeded, "Beta SA").await; + + let _open = mk_validated( + &pool, + &seeded, + alpha, + Some(days_before(20)), + dec!(8.10), + dec!(500.00), + ) + .await; + let partial = mk_validated( + &pool, + &seeded, + alpha, + Some(days_before(70)), + dec!(2.60), + dec!(333.33), + ) + .await; + settle( + &pool, + &seeded, + partial.invoice.id, + dec!(100.00), + days_before(10), + ) + .await; + let paid = mk_validated( + &pool, + &seeded, + beta, + Some(days_before(30)), + dec!(8.10), + dec!(200.00), + ) + .await; + settle( + &pool, + &seeded, + paid.invoice.id, + dec!(216.20), + days_before(5), + ) + .await; + let credited = mk_validated( + &pool, + &seeded, + beta, + Some(days_before(15)), + dec!(8.10), + dec!(50.00), + ) + .await; + credit_notes::create_credit_note( + &pool, + NewCreditNote { + company_id: seeded.company_id, + invoice_id: credited.invoice.id, + date: days_before(2), + }, + seeded.admin_user_id, + ) + .await + .expect("avoir"); + + let r = generate(&pool, seeded.company_id, as_of()).await.unwrap(); + let ledger = receivable_balance(&pool, &seeded).await; + // 540.50 + (341.996… arrondi par ligne : 333.33 + 8.67 = 342.00) − 100 = 782.50 + assert_eq!( + ledger, + dec!(782.50), + "anti-vacuité : le grand livre porte les quatre états" + ); + assert_eq!(r.totals.total, ledger, "balance âgée = compte débiteurs"); +} diff --git a/docs/manual/fr/user-manual.pdf b/docs/manual/fr/user-manual.pdf index 139a7469d9ca487daeca37fabb66e16230e00dcb..44a073f25e99b04fe9f64b4366920f3fdbf2dd15 100644 GIT binary patch delta 97801 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 Cs$et# delta 96866 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

Cuaqg7RjFq?1)sEh0NWR+Z6K)n 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 z

9q8jT!N&`KHPNH88Z;d^o-u-fbK(qLwP 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 diff --git a/docs/manual/fr/user-manual.tex b/docs/manual/fr/user-manual.tex index 25dde525..a10c56b3 100644 --- a/docs/manual/fr/user-manual.tex +++ b/docs/manual/fr/user-manual.tex @@ -936,6 +936,12 @@ \subsection{Échéancier des factures} \item Factures payées (historique). \end{itemize} +Chaque ligne montre le \textbf{total} de la facture (TTC) et son \textbf{reste dû}, qui tient compte des +règlements partiels ; une facture réglée en partie porte le statut «~Partiellement payée~». Les +totaux du haut de page additionnent les restes dus. Le bouton \emph{Régler} ouvre le dialogue de +règlement \textbf{pré-rempli au reste dû} --- modifiable pour un nouvel acompte. L'export CSV porte +la même colonne «~Reste dû~». + Pour relancer les factures en retard, Kesh dispose d'un \textbf{écran de rappels} dédié — voir \S\ref{sec:relances-user}. Une facture suspendue de rappels reste visible dans l'échéancier (rien ne se cache). \subsection{Enregistrer et annuler un règlement}\label{sec:reglement-client} @@ -1573,18 +1579,18 @@ \subsection{Grand livre}\label{sec:grand-livre} \subsection{Balance âgée des créances}\label{sec:balance-agee} -Depuis la version \textbf{0.7}, l'onglet \emph{Rapports → Balance âgée} répartit l'\textbf{encours débiteur} (le total dû, TVA comprise) par \textbf{client} et par \textbf{tranche d'ancienneté}, arrêté à ce jour. C'est l'outil de pilotage du recouvrement : il montre d'un coup d'œil quelles créances vieillissent et lesquelles prioriser. +Depuis la version \textbf{0.7}, l'onglet \emph{Rapports → Balance âgée} répartit l'\textbf{encours débiteur} --- le \textbf{reste dû} de chaque facture, TVA comprise, après ses règlements partiels et son avoir éventuel --- par \textbf{client} et par \textbf{tranche d'ancienneté}, arrêté à ce jour. C'est l'outil de pilotage du recouvrement : il montre d'un coup d'œil quelles créances vieillissent et lesquelles prioriser. -\keshscreenshot{balance-agee.png}{Balance âgée : encours débiteur TTC par client et par tranche de retard, avec total général.} % TODO capture: onglet Rapports/Balance âgée +\keshscreenshot{balance-agee.png}{Balance âgée : reste dû par client et par tranche de retard, avec total général.} % TODO capture: onglet Rapports/Balance âgée \begin{itemize} - \item \textbf{Colonnes} : \emph{Non échu} \textbar{} \emph{1-30} \textbar{} \emph{31-60} \textbar{} \emph{61-90} \textbar{} \emph{90+} jours de retard. La colonne « Non échu » garantit que le \textbf{total général réconcilie} avec le solde du compte clients (débiteurs) du bilan. + \item \textbf{Colonnes} : \emph{Non échu} \textbar{} \emph{1-30} \textbar{} \emph{31-60} \textbar{} \emph{61-90} \textbar{} \emph{90+} jours de retard. Avec la colonne « Non échu », le \textbf{total général réconcilie} avec le solde du compte clients (débiteurs) du bilan \emph{tant que ce compte n'est mouvementé que par les factures, leurs règlements et leurs avoirs} (y compris leurs annulations). Toute autre écriture qui le touche l'en écarte : solde de départ, écriture saisie au journal, virement bancaire affecté à ce compte sans passer par une facture, paiement d'une facture fournisseur compensé sur ce compte, ou règlement dont la contrepartie est ce compte lui-même. De même un changement du compte clients dans les réglages de facturation, ou des données antérieures à la version 0.12.1, restaurées ou mises à jour. \item \textbf{Détail} : une ligne par client, un total par tranche, et un total général. Chaque client renvoie d'un clic vers \textbf{ses factures}. \item \textbf{Export CSV} : réservé aux rôles \emph{Comptable} et \emph{Administrateur} (le rapport lui-même est consultable par tous les rôles). \end{itemize} \begin{keshnote} -Les factures dont les rappels sont \textbf{suspendus restent comptées} dans la balance âgée (elles ne sortent que de la liste « à rappeler »). Le montant réparti est le \textbf{total dû TTC} de chaque facture, jamais le montant hors taxe. +Les factures dont les rappels sont \textbf{suspendus restent comptées} dans la balance âgée (elles ne sortent que de la liste « à rappeler »). Le montant réparti est le \textbf{reste dû} de chaque facture, jamais le montant hors taxe ni le total facturé : une facture de 1\,081.--- réglée de 900.--- y pèse 181.---, dans la tranche de \emph{son échéance} --- un règlement partiel ne rajeunit pas la créance. \end{keshnote} \subsection{Journal des écritures} diff --git a/frontend/src/lib/features/invoices/SettleInvoiceDialog.svelte b/frontend/src/lib/features/invoices/SettleInvoiceDialog.svelte index bbf3949a..218ed501 100644 --- a/frontend/src/lib/features/invoices/SettleInvoiceDialog.svelte +++ b/frontend/src/lib/features/invoices/SettleInvoiceDialog.svelte @@ -13,6 +13,7 @@ le parent gère l'appel API et ses erreurs. --> @@ -431,6 +427,9 @@ toggleSort('TotalAmount')}> {i18nMsg('due-dates-column-total', 'Total')} + + {i18nMsg('due-dates-column-amount-due', 'Reste dû')} + {i18nMsg('due-dates-column-payment-status', 'Statut')} @@ -449,8 +448,13 @@ {inv.invoiceNumber ?? '—'} {inv.contactName} - + {formatInvoiceTotal(inv.totalTtc)} + + {formatInvoiceTotal(inv.amountDue)} + @@ -490,10 +494,8 @@ {/if} {#if markTarget} - + { @@ -504,7 +506,7 @@ } }} invoiceDate={markTarget.date} - amountDue={null} + amountDue={markTarget.amountDue} accounts={settleAccounts} bankAccounts={settleBankAccounts} submitting={markSubmitting} diff --git a/frontend/src/routes/(app)/invoices/due-dates/due-dates-page.test.ts b/frontend/src/routes/(app)/invoices/due-dates/due-dates-page.test.ts new file mode 100644 index 00000000..5e923260 --- /dev/null +++ b/frontend/src/routes/(app)/invoices/due-dates/due-dates-page.test.ts @@ -0,0 +1,144 @@ +/** + * L'échéancier porte le reste dû — Story 25-4-b1 (#416). + * + * Ce que ni le test Rust ni l'E2E ne prouvent seuls : que la page **affiche** + * le reste dû de la ligne, rend le statut « partiellement payée », et **passe** + * ce reste dû au dialogue de règlement, qui le pré-remplit. + * + * ⚠️ Chaque test nomme la MUTATION qu'il attrape. Patron : + * `invoices/[id]/invoice-settlements-page.test.ts` — mocks hoistés AVANT + * l'import du composant. + */ +import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; +import { render, fireEvent, cleanup, waitFor } from "@testing-library/svelte"; +import type { + DueDateItem, + DueDatesResponse, +} from "$lib/features/invoices/invoices.types"; + +vi.mock("$app/environment", () => ({ browser: true })); +vi.mock("$app/navigation", () => ({ goto: vi.fn() })); +vi.mock("$app/state", () => ({ + page: { + params: {}, + url: new URL("http://localhost/invoices/due-dates"), + }, +})); +vi.mock("$lib/shared/utils/i18n.svelte", () => ({ + i18nMsg: ( + _k: string, + fallback: string, + args?: Record, + ) => + args + ? fallback.replace(/\{\s*\$(\w+)\s*\}/g, (_, n) => String(args[n] ?? "")) + : fallback, +})); +vi.mock("$lib/shared/utils/notify", () => ({ + notifyError: vi.fn(), + notifySuccess: vi.fn(), + notifyWarning: vi.fn(), +})); +vi.mock("$lib/app/stores/auth.svelte", () => ({ + authState: { currentUser: { role: "Comptable", username: "c", userId: "1" } }, +})); + +const listDueDatesMock = vi.fn(); +vi.mock("$lib/features/invoices/invoices.api", () => ({ + listDueDates: (q: unknown) => listDueDatesMock(q), + settleInvoice: vi.fn(), + exportDueDatesCsv: vi.fn(), +})); +vi.mock("$lib/features/accounts/accounts.api", () => ({ + fetchAccounts: vi.fn(async () => []), +})); +vi.mock("$lib/features/bank-accounts/bank-accounts.api", () => ({ + listBankAccounts: vi.fn(async () => []), +})); +vi.mock("$lib/features/contacts/contacts.api", () => ({ + getContact: vi.fn(), + listContacts: vi.fn(async () => ({ items: [], total: 0, offset: 0, limit: 20 })), +})); + +import Page from "./+page.svelte"; + +function item(partial: Partial = {}): DueDateItem { + return { + id: 5, + companyId: 1, + contactId: 1, + contactName: "Client SA", + invoiceNumber: "F-2026-005", + status: "validated", + date: "2026-03-01", + dueDate: "2026-03-31", + paymentTerms: null, + totalAmount: "100.00", + totalTtc: "108.10", + amountSettled: "40.00", + amountDue: "68.10", + paidAt: null, + dunningPausedAt: null, + dunningPausedNote: null, + isOverdue: false, + version: 3, + createdAt: "2026-03-01T00:00:00", + updatedAt: "2026-03-05T00:00:00", + ...partial, + }; +} + +function response(items: DueDateItem[]): DueDatesResponse { + return { + items, + total: items.length, + offset: 0, + limit: 20, + summary: { + unpaidCount: items.length, + unpaidTotal: "68.10", + overdueCount: 0, + overdueTotal: "0.00", + }, + }; +} + +beforeEach(() => { + listDueDatesMock.mockResolvedValue(response([item()])); +}); +afterEach(() => { + cleanup(); + vi.clearAllMocks(); +}); + +describe("échéancier — le reste dû (Story 25-4-b1)", () => { + it("la ligne affiche le reste dû, pas le seul TTC (mutation : colonne retirée)", async () => { + const { findByTestId } = render(Page); + const cell = await findByTestId("due-dates-amount-due"); + expect(cell.textContent).toContain("68.10"); + }); + + it("une facture réglée en partie est « partiellement payée » (mutation : `partial` retiré du statut)", async () => { + const { findByText } = render(Page); + expect(await findByText("Partiellement payée")).toBeTruthy(); + }); + + it("une facture sans règlement reste « impayée »", async () => { + listDueDatesMock.mockResolvedValue( + response([item({ amountSettled: "0.00", amountDue: "108.10" })]), + ); + const { findByText, queryByText } = render(Page); + expect(await findByText("Impayée")).toBeTruthy(); + expect(queryByText("Partiellement payée")).toBeNull(); + }); + + it("le dialogue de règlement est pré-rempli au reste dû (mutation : `amountDue={null}` remis)", async () => { + const { findByText, container } = render(Page); + await fireEvent.click(await findByText("Régler")); + await waitFor(() => { + const input = document.getElementById("settle-amount") as HTMLInputElement | null; + expect(input?.value).toBe("68.10"); + }); + expect(container).toBeTruthy(); + }); +}); diff --git a/frontend/tests/e2e/invoices_echeancier.spec.ts b/frontend/tests/e2e/invoices_echeancier.spec.ts index 2ae0e5d7..3c8f4e54 100644 --- a/frontend/tests/e2e/invoices_echeancier.spec.ts +++ b/frontend/tests/e2e/invoices_echeancier.spec.ts @@ -144,18 +144,12 @@ test.describe('Échéancier factures — Story 5.4', () => { // Le premier compte proposé suffit : ce cas porte sur le PARCOURS, pas sur // le choix du compte — celui-ci est couvert par les tests Rust. await page.getByTestId('settle-account').selectOption({ index: 1 }); - // ⚠️ **Le montant doit être SAISI ici, et c'est délibéré.** L'échéancier - // ne connaît pas encore le résiduel (colonnes reportées à une issue - // séparée), donc le dialogue reçoit `amountDue = null` — « non calculé » - // — et laisse le champ vide plutôt que de pré-remplir. - // - // ⛔ Y pré-remplir le TTC de la ligne serait FAUX : sur une facture - // déjà partiellement réglée, TTC ≠ résiduel, et l'utilisateur serait - // conduit vers un trop-perçu que le serveur refuse. Un champ vide dit la - // vérité ; un champ pré-rempli d'un mauvais chiffre ment. - // - // 100.00 HT à 8.10 % ⇒ 108.10 TTC (cf. `createAndValidateInvoice`). - await page.getByLabel(/Montant|Amount|Importo|Betrag/i).fill('108.10'); + // Story 25-4-b1 (#416) — le montant n'est plus SAISI : l'échéancier porte + // le reste dû, et le dialogue le pré-remplit. Sans règlement, le reste dû + // est le TTC : 100.00 HT à 8.10 % ⇒ 108.10 (cf. `createAndValidateInvoice`). + // Le cas d'une facture PARTIELLEMENT réglée, où reste dû ≠ TTC, est le + // test suivant. + await expect(page.getByLabel(/Montant|Amount|Importo|Betrag/i)).toHaveValue("108.10"); await page.getByTestId('settle-confirm').click(); // Après reload, la facture en retard disparaît du filtre "Impayées". @@ -197,8 +191,67 @@ test.describe('Échéancier factures — Story 5.4', () => { expect(futureId).toBeGreaterThan(0); }); - // Story 21-2a (#246) — la colonne Total de l'échéancier affiche le TTC. - test('la colonne Total affiche le TTC (montant dû), pas le HT', async ({ page }) => { + // Story 25-4-b1 (#416) — une facture réglée en partie montre son reste dû, + // son statut « partiellement payée », et le dialogue se pré-remplit au reste + // dû — pas au TTC, qui conduirait à un trop-perçu refusé. + test('facture réglée en partie : reste dû, statut, dialogue pré-rempli', async ({ page }) => { + await login(page); + const contactName = uniq('EchPartiel'); + const contactId = await createContactViaApi(page, contactName); + const id = await createAndValidateInvoice( + page, + contactId, + daysFromToday(-10), + daysFromToday(20), + '100.00', + ); + + const ctx = await authedApiContext(page); + try { + // Un compte de liquidités (classe 10) actif et imputable — le numéro + // exact dépend du plan comptable : ne pas le figer. + const accounts = await ctx.get('/api/v1/accounts?includeArchived=false'); + expect(accounts.ok(), `comptes: ${accounts.status()}`).toBeTruthy(); + const cash = ( + (await accounts.json()) as { + id: number; + number: string; + accountType: string; + active: boolean; + postable: boolean; + }[] + ).find((a) => a.active && a.postable && a.accountType === 'Asset' && a.number.startsWith('10')); + expect(cash, 'un compte de liquidités imputable').toBeTruthy(); + const settled = await ctx.post(`/api/v1/invoices/${id}/settlements`, { + data: { + settlementType: 'internal_account', + accountId: cash!.id, + amount: '40.00', + settledOn: daysFromToday(0), + }, + }); + expect(settled.ok(), `règlement: ${settled.status()}`).toBeTruthy(); + } finally { + await disposeContextSafe(ctx); + } + + await page.goto('/invoices/due-dates'); + const row = page.locator('tbody tr', { hasText: contactName }); + await expect(row).toBeVisible({ timeout: 5000 }); + // 108.10 − 40.00 = 68.10 + await expect(row.getByTestId('due-dates-amount-due')).toHaveText(/68\.10/); + await expect( + row.getByText(/Partiellement payée|Partially paid|Parzialmente pagata|Teilweise bezahlt/i), + ).toBeVisible(); + + await row.getByRole('button', { name: /Régler|Settle|Pagare|Erfassen/i }).click(); + await expect(page.getByRole('dialog')).toBeVisible(); + await expect(page.getByLabel(/Montant|Amount|Importo|Betrag/i)).toHaveValue("68.10"); + }); + + // Story 21-2a (#246) — la colonne Total de l'échéancier affiche le TTC émis ; + // le reste dû a sa propre colonne depuis la Story 25-4-b1. + test('la colonne Total affiche le TTC, pas le HT', async ({ page }) => { await login(page); const contactName = uniq('EchTtc'); const contactId = await createContactViaApi(page, contactName); @@ -209,7 +262,11 @@ test.describe('Échéancier factures — Story 5.4', () => { const row = page.locator('tbody tr', { hasText: contactName }).first(); await expect(row).toBeVisible({ timeout: 5000 }); // Le TTC formaté suisse est affiché ; le HT nu ne l'est pas. - await expect(row.getByText('108.10')).toBeVisible(); + // ⚠️ Story 25-4-b1 : sans règlement, la colonne « Reste dû » affiche le + // même 108.10 — viser la cellule Total (5ᵉ colonne) et non le texte seul, + // qui désignerait désormais deux cellules. + await expect(row.locator('td').nth(4)).toHaveText(/108\.10/); + await expect(row.getByTestId('due-dates-amount-due')).toHaveText(/108\.10/); await expect(row.getByText(/^100\.00$/)).toHaveCount(0); }); From e1713da128f1690ab4749d41a16972ae2231a405 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 15:49:43 +0200 Subject: [PATCH 32/51] docs(25-4-b1): gate E2E tenu, story en review (refs #416) Co-Authored-By: Claude Opus 5.5 --- .../25-4-b1-residuel-aux-agregats.md | 15 ++++++++++++--- .../implementation-artifacts/sprint-status.yaml | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md b/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md index 2c4b9234..15abe3d4 100644 --- a/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md +++ b/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md @@ -1,6 +1,6 @@ # Story 25.4-b1 : Le résiduel aux agrégats — balance âgée et échéancier -Status: in-progress +Status: review **Issue : [#416]** — cette story en livre la partie **agrégats** ; la partie **rappels** est la 25-4-b2. ⛔ **La PR de b1 porte `refs #416`, pas `closes`** : l'issue ne se ferme qu'avec b2. @@ -194,7 +194,7 @@ CHANGELOG `[0.12.1]` *Fixed*. README : rien, sauf si la ligne v0.12.1 cite la ba - [x] **T4 — échéancier, frontend** (AC 10), i18n. - [x] **T5 — tests et mutations** (AC 12). - [x] **T6 — textes** (AC 13). -- [ ] **T7 — gates** : backend complet (base remise à zéro), frontend complet, **E2E complet**. +- [x] **T7 — gates** : backend complet (base remise à zéro), frontend complet, **E2E complet**. ## Dev Notes @@ -304,7 +304,13 @@ de le saisir, et un cas « réglée en partie » est ajouté. - Backend : base remise à zéro, `scripts/test-fast.sh` **2491 / 2491** (2484 + 7). - Frontend : `check` 0 erreur (27 avertissements), `lint-i18n-ownership` PASS, `test:unit` **834 / 834** (826 + 8), build OK. -- E2E : EN_ATTENTE +- E2E : sur `kesh_e2e` reconstruite, **225 passed / 8 failed / 19 skipped** — les 7 KF-029 (#97) + et `product-revenue-account.spec.ts:133`, victime de pollution déjà répertoriée + (`docs/testing.md` § « Les échecs attendus ») et **verte rejouée seule** (deux fois, 4/4). + ⚠️ Un **premier run** avait rendu 214/19 : les 7 KF-029 et **12 échecs hors liste**, tous sur le + même symptôme — `/login` rendant la page SvelteKit « Erreur 500 — Internal Error » avant le + formulaire, sans aucune erreur côté backend. **Rejoués seuls, 12/12 verts** ; non reproduit au + run suivant. Symptôme non documenté, non tracé à ce jour. ### File List @@ -332,6 +338,9 @@ de le saisir, et un cas « réglée en partie » est ajouté. ## Change Log +- **2026-09-27** — **T7 tenu, story en `review`.** Commit de sauvegarde `87cbc8b4` après un crash de + la station (intégrité vérifiée : `git fsck`, fins de fichiers, fmt, clippy, `check`). Gate E2E : + cf. § *Gates* — premier run pollué (12 hors liste, verts seuls), second conforme à la baseline. - **2026-09-27** — Signal MED→MED arbitré par Guy : **pas de découpage** (« continue ainsi »). Dev lancé. - **2026-09-27** — **validation P5 ciblée** (Haiku, diff `5480b4f8..5824c048`, prompt `25-4-b1-validate-prompt-p5.md`) — **0 finding**, preuves recopiées (grep des cinq sites de T0, diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index 61d48fca..4f22f332 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -356,7 +356,7 @@ development_status: 25-3-b-annuler-rapprochement: done # 2026-09-25 DONE — revue close en passe 2 (Sonnet 1 MED -> Haiku 0) ; gates : backend 2463/2463, frontend 777/777, E2E sans regression. Non poussee. — SPEC VALIDEE (boucle close en passe 4 : 2 HIGH -> 2 MED -> 2 MED -> 3 LOW ; pas de decoupage, arbitrage de Guy). Q1-Q3 tranchees. — [#418] closes — annuler un rapprochement bancaire. ⛔ NE JAMAIS compter sur le `ON DELETE SET NULL` de `matched_entry_id` : supprimer l'ecriture ferait disparaitre le lien EN SILENCE, le mode d'echec meme que la story repare. ⚠️ Le chemin d'ACCEPTATION n'a aucune fonction `kesh-db` a mirer : il est ecrit en SQL brut a **cinq** sites de `routes/reconciliation.rs`, dont **un seul** porte le verrou optimiste. Quand la transaction porte une facture, appelle le geste de la 25-3-a. Derriere elle. 25-3-annuler-reglement-et-rapprochement: split # [#414] [#418] — **l'Epic 24 a livre l'encaissement et le rapprochement ; il n'a PAS livre le moyen de les DEFAIRE.** Une erreur d'imputation est aujourd'hui incorrigible autrement qu'a la main — et le gel de la 24-4b interdit precisement la main. ⚠️ *C'est le prix d'une story qui ferme une porte sans ouvrir la suivante : le gel est juste, et il rend cette story-ci necessaire.* 25-4-a-residuel-juste: done # 2026-09-27 REVUE CLOSE EN 1 PASSE ; PR #472 OUVERTE (closes #455 #456), attend « merge ». # IMPLEMENTEE — 7/7 mutations tuees ; gates 2484/2484, 826/826, E2E 222/10/19 sans regression ; prochaine etape : code review. # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (masque a l'ecran, mais rendu par GET /invoices/{id} aux cles API : amountDue = la TVA sur une facture creditee) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE ; validation : P1 Sonnet 1H/3M/1L -> P2 Haiku 1M retenu -> P3 ciblee Opus 2M/5L -> P4 ciblee Sonnet 0 > LOW (1M reclasse LOW) : VALIDEE en 4 passes. Arbitrage 2026-09-27 : refus maintenu, levee tracee par #471. - 25-4-b1-residuel-aux-agregats: in-progress # 2026-09-27 [#416, refs] balance agee + echeancier (totaux, colonne reste du, CSV, statut partiel, dialogue pre-rempli) + invariant balance agee = grand livre. CREEE ; validation P1 Sonnet 2M/3L -> P2 Haiku 0 (repris : 1M) -> P3 ciblee Opus 3M/3L : portee de l'invariant REECRITE PAR UNE REGLE ; issues #473 #474 ouvertes -> P4 1M -> P5 0 : VALIDEE en 5 passes. Signal MED->MED : pas de decoupage (Guy, 2026-09-27). Branche EMPILEE sur 25-4-a. + 25-4-b1-residuel-aux-agregats: review # 2026-09-27 DEV FAIT, gates verts (E2E 225/8 conforme) ; revue de code a lancer. # [#416, refs] balance agee + echeancier (totaux, colonne reste du, CSV, statut partiel, dialogue pre-rempli) + invariant balance agee = grand livre. CREEE ; validation P1 Sonnet 2M/3L -> P2 Haiku 0 (repris : 1M) -> P3 ciblee Opus 3M/3L : portee de l'invariant REECRITE PAR UNE REGLE ; issues #473 #474 ouvertes -> P4 1M -> P5 0 : VALIDEE en 5 passes. Signal MED->MED : pas de decoupage (Guy, 2026-09-27). Branche EMPILEE sur 25-4-a. 25-4-b2-residuel-aux-rappels: backlog # [#416, closes] le rappel reclame le reste du (texte, QR, PDF montant initial / deja regle / reste), frais configurables masques a zero ; point ouvert : frais non comptabilises. 25-4-b-residuel-aux-agregats: split # 2026-09-27 DECOUPEE en b1 (agregats) / b2 (rappels) — six modules apres les arbitrages Q1. # [#416] + montant des RELANCES (TTC complet, trouve a l'inventaire) — Q1 TRANCHEE 2026-09-27 : la QR du rappel porte le RESTE DU (= TTC sans reglement), reste a payer sur le PDF et dans le texte ; point ouvert : frais de rappel non comptabilises vs trop-percu. 25-4-c-residuel-au-rapprochement: backlog # [#420] — DEUX sites : filtre SQL des candidats (HAVING total_ttc) avant le score, puis score et re-score a l'acceptation. From 03951962876338d90a660050fd38c1c647c163fa Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 16:26:33 +0200 Subject: [PATCH 33/51] =?UTF-8?q?fix(25-4-b1):=20revue=20P1=20=E2=80=94=20?= =?UTF-8?q?la=20balance=20=C3=A2g=C3=A9e=20ne=20perd=20plus=20un=20client?= =?UTF-8?q?=20compens=C3=A9=20(refs=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .../25-4-b1-residuel-aux-agregats.md | 44 ++++++- .../implementation-artifacts/deferred-work.md | 5 + crates/kesh-api/src/routes/invoices.rs | 7 +- .../tests/invoice_amount_due_parity.rs | 47 +++++++ crates/kesh-report/src/aged_receivables.rs | 12 +- crates/kesh-report/tests/aged_receivables.rs | 120 ++++++++++++++++++ 6 files changed, 227 insertions(+), 8 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md b/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md index 15abe3d4..18ba5ab1 100644 --- a/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md +++ b/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md @@ -63,9 +63,13 @@ chaque facture du jeu, l'expression jointe de l'AC 1 = `amount_due` scalaire. rajeunit pas la créance restante**. **AC 4** — Le périmètre des factures ne change pas : `status = 'validated' AND paid_at IS NULL` -(une facture soldée a `paid_at`, 24-2 D4). Le `HAVING total <> 0` reste, et porte désormais sur le -reste dû. ⚠️ Un reste dû **négatif** (trop-perçu hérité) n'est **pas écrêté** : il apparaît, en +(une facture soldée a `paid_at`, 24-2 D4). ~~Le `HAVING total <> 0` reste, et porte désormais sur le +reste dû.~~ Le `HAVING` garde un contact dès qu'**une** de ses factures a un reste dû non nul. +⚠️ Un reste dû **négatif** (trop-perçu hérité) n'est **pas écrêté** : il apparaît, en négatif — le doc-comment d'`amount_due` l'exige. +*(Rectifié le 2026-09-27, passe 1 de revue de code : la phrase barrée contredisait la suivante. Sur +le total du contact, un trop-perçu hérité compensant une facture ouverte faisait sortir le contact +entier — et le négatif n'apparaissait pas.)* **AC 5** — ⛔ **Invariant de concordance** (test) : sur une société dont le compte débiteurs n'est mû que par des factures, des règlements et des avoirs — factures sans règlement, partiellement réglée, @@ -196,6 +200,23 @@ CHANGELOG `[0.12.1]` *Fixed*. README : rien, sauf si la ligne v0.12.1 cite la ba - [x] **T6 — textes** (AC 13). - [x] **T7 — gates** : backend complet (base remise à zéro), frontend complet, **E2E complet**. +### Review Findings + +*Passe 1 de `bmad-code-review` (2026-09-27) — Blind Hunter, Edge Case Hunter, Acceptance Auditor, tous +Sonnet, sur `bd06e789..87cbc8b4`. Brut : 4 + 4 + 2 findings ; après dédoublonnage et tri : 3 patch, +2 defer, 3 écartés.* + +- [x] [Review][Patch] **MEDIUM — `HAVING total <> 0` fait disparaître un client dont les restes dus se compensent** [crates/kesh-report/src/aged_receivables.rs:149] — la grandeur sommée admet désormais le négatif ; une facture ouverte de 100.— et un trop-perçu hérité de −100.— chez le même contact donnent `total = 0` et la ligne entière sort du résultat, contrairement à ce que promet la spec (« il apparaît, en négatif »). Atteignable seulement par données héritées (les trois chemins d'écriture refusent le trop-perçu ou annulent la facture — tracé par l'Edge Case Hunter). Convergé Blind + Edge. +- [x] [Review][Patch] **MEDIUM — commentaire devenu faux : « la fiche est la seule surface où le résiduel est calculé »** [crates/kesh-api/src/routes/invoices.rs:638] — la story ajoute l'échéancier (liste, export, résumé) et la balance âgée. Symptôme grepé (`seule surface`) : aucun autre site. +- [x] [Review][Patch] **LOW — aucun test des agrégats après annulation d'un règlement** [crates/kesh-db/tests/invoice_amount_due_parity.rs] — `cancel_settlement` n'est exercé que sur la fiche ; ni l'échéancier ni la balance âgée ne sont vérifiés après retrait d'un règlement. +- [x] [Review][Defer] **`as_of` borne les tranches, pas les règlements** [crates/kesh-report/src/aged_receivables.rs:109] — deferred : limite écrite dans le doc-comment de `generate`, la route fixe `as_of` à aujourd'hui ; ne mord que si un appelant passait une date passée. +- [x] [Review][Defer] **trois tests préexistants déstructurent `seed_base` dans le mauvais ordre** [crates/kesh-api/tests/invoice_echeancier_e2e.rs] — deferred, pre-existing : déjà relevé au Debug Log, verts parce que les deux identifiants valent 1. + +Écartés : pré-remplissage négatif du dialogue de règlement (Blind + Edge — tranché hors périmètre par +la spec, et la garde `n <= 0` bloque la soumission) ; deux remarques LOW de l'Acceptance Auditor +(piège de décompte `i18nMsg(` dans un commentaire, parité d'export couverte par un autre fichier que +celui nommé) — constats sans défaut. + ## Dev Notes ### Ce qu'il ne faut pas faire @@ -338,6 +359,25 @@ de le saisir, et un cas « réglée en partie » est ajouté. ## Change Log +- **2026-09-27** — **Revue de code, passe 1** (Blind Hunter, Edge Case Hunter, Acceptance Auditor — + Sonnet ×3, `bd06e789..87cbc8b4`) — **2 MEDIUM, 1 LOW à corriger**, 2 différés, 3 écartés (§ *Review + Findings*). Corrigés : + - le `HAVING` de la balance âgée porte sur le **nombre de factures à reste dû non nul**, plus sur le + total du contact (`aged_receivables.rs`) ; l'AC 4 est rectifié, sa phrase contradictoire barrée. + Test `aged_compensating_legacy_overpayment_keeps_the_contact` — ⛔ **mutation vérifiée** : avec + l'ancien `HAVING total <> 0`, il rougit seul (« Alpha ne doit pas disparaître »), les 8 autres + restent verts ; + - le commentaire de `get_invoice` (`routes/invoices.rs`) ne prétend plus que la fiche est la seule + surface calculant le résiduel ; symptôme `seule surface` grepé sur `crates/`, `frontend/src` et le + manuel : aucun autre site ; + - règlement annulé : `aged_cancelled_settlement_no_longer_counts` et + `cancelled_settlement_leaves_the_aggregates` (liste, export, résumé), chacun avec un témoin avant + annulation. + Tests, recomptés (`#[sqlx::test]`) de `87cbc8b4` à ce commit : `aged_receivables.rs` 7 → 9, + `invoice_amount_due_parity.rs` 6 → 7, soit **+3** ; de `bd06e789` : +10 backend. Manuel : rien ne + décrivait la sélection des contacts, pas de régénération. **Gate ciblé** : fmt et clippy workspace + verts, `binary(aged_receivables) | binary(invoice_amount_due_parity)` **16/16** ; gate complet au + dernier commit de la boucle. - **2026-09-27** — **T7 tenu, story en `review`.** Commit de sauvegarde `87cbc8b4` après un crash de la station (intégrité vérifiée : `git fsck`, fins de fichiers, fmt, clippy, `check`). Gate E2E : cf. § *Gates* — premier run pollué (12 hors liste, verts seuls), second conforme à la baseline. diff --git a/_bmad-output/implementation-artifacts/deferred-work.md b/_bmad-output/implementation-artifacts/deferred-work.md index edfa4982..4876d9b9 100644 --- a/_bmad-output/implementation-artifacts/deferred-work.md +++ b/_bmad-output/implementation-artifacts/deferred-work.md @@ -139,3 +139,8 @@ Pass 1 Opus 4.8 × 3 reviewers (Blind Hunter + Edge Case Hunter + Acceptance Aud ## Deferred from: code review of 25-5-a-export-souverainete (2026-09-26) - L'export de souveraineté lit ses trente tables sans instantané commun (défaut antérieur, aggravé par la 25-5-a) — tracé par **#465**, source de vérité. + +## Deferred from: code review of 25-4-b1-residuel-aux-agregats (2026-09-27) + +- **La balance âgée déduit tous les règlements, quelle que soit `as_of`** (`crates/kesh-report/src/aged_receivables.rs`, `generate`). Depuis la 25-4-b1 le montant sommé est le reste dû, qui soustrait les règlements et avoirs **existants** sans comparer leur date à `as_of` : une balance « au jour J » passé serait sous-évaluée. **Différé** : la limite est écrite dans le doc-comment de `generate`, et la seule route appelante fixe `as_of` à aujourd'hui. À reprendre si une balance âgée historique (audit, clôture) est demandée. +- **Trois tests préexistants de `invoice_echeancier_e2e.rs` déstructurent `seed_base` en `(company_id, admin_id)`** alors qu'elle rend `(admin_id, company_id)`. Ils passent parce que les deux valent 1 sur une base neuve. **Différé** : préexistant, relevé au Debug Log de la 25-4-b1 ; les deux tests hérités de la 25-4-a ont été rectifiés. diff --git a/crates/kesh-api/src/routes/invoices.rs b/crates/kesh-api/src/routes/invoices.rs index 603d4c33..c23166bb 100644 --- a/crates/kesh-api/src/routes/invoices.rs +++ b/crates/kesh-api/src/routes/invoices.rs @@ -635,8 +635,11 @@ pub async fn get_invoice( invoices::find_by_id_with_lines(&state.pool, current_user.company_id, id) .await? .ok_or(AppError::Database(DbError::NotFound))?; - // Story 24-2 (#371) — la fiche est la seule surface où le résiduel est - // calculé. ⚠️ Une requête de plus, sur UNE facture : pas de N+1 possible ici. + // Story 24-2 (#371) — la fiche calcule le résiduel par la forme SCALAIRE. + // ⚠️ Une requête de plus, sur UNE facture : pas de N+1 possible ici. Les + // agrégats (échéancier : liste, export, résumé ; balance âgée) le calculent + // par la forme JOINTE `amount_due_derived_joins` depuis la Story 25-4-b1 — + // les deux sont tenues à parité par `invoice_amount_due_parity.rs`. let settled = kesh_db::repositories::invoice_settlements::amount_settled(&state.pool, id) .await .map_err(AppError::Database)?; diff --git a/crates/kesh-db/tests/invoice_amount_due_parity.rs b/crates/kesh-db/tests/invoice_amount_due_parity.rs index bea59d82..885fa1f1 100644 --- a/crates/kesh-db/tests/invoice_amount_due_parity.rs +++ b/crates/kesh-db/tests/invoice_amount_due_parity.rs @@ -396,3 +396,50 @@ async fn list_items_carry_amount_due(pool: MySqlPool) { assert_eq!(o.amount_due, dec!(10.81), "{surface}"); } } + +/// Revue de code 25-4-b1, passe 1 — un règlement ANNULÉ ne compte plus sur +/// aucune surface agrégée : liste, export et résumé repèsent le TTC entier. +#[sqlx::test(migrations = "./test-schema")] +async fn cancelled_settlement_leaves_the_aggregates(pool: MySqlPool) { + let seeded = seed_accounting_company(&pool).await.unwrap(); + let contact = make_contact(&pool, &seeded).await; + let inv = validated(&pool, &seeded, contact, &[(dec!(8.10), dec!(100.00))]).await; + let entry = settle(&pool, &seeded, inv, dec!(40.00)).await; + // Témoin : avant l'annulation, le résumé porte le reste dû. + let avant = invoices::due_dates_summary(&pool, seeded.company_id, &unpaid_query()) + .await + .unwrap(); + assert_eq!(avant.unpaid_total, dec!(68.10)); + + let settlement_id: i64 = + sqlx::query_scalar("SELECT id FROM invoice_settlements WHERE journal_entry_id = ?") + .bind(entry) + .fetch_one(&pool) + .await + .unwrap(); + invoice_settlements_write::cancel_settlement( + &pool, + seeded.admin_user_id, + seeded.company_id, + inv, + settlement_id, + ) + .await + .expect("annulation du règlement"); + + let summary = invoices::due_dates_summary(&pool, seeded.company_id, &unpaid_query()) + .await + .unwrap(); + assert_eq!(summary.unpaid_total, dec!(108.10), "résumé"); + let page = invoices::list_by_company_paginated(&pool, seeded.company_id, unpaid_query()) + .await + .unwrap(); + let (export, _) = invoices::list_for_export(&pool, seeded.company_id, &unpaid_query(), 100) + .await + .unwrap(); + for (surface, items) in [("liste", &page.items), ("export", &export)] { + let i = items.iter().find(|i| i.id == inv).expect(surface); + assert_eq!(i.amount_settled, Decimal::ZERO, "{surface} : réglé"); + assert_eq!(i.amount_due, dec!(108.10), "{surface} : reste dû"); + } +} diff --git a/crates/kesh-report/src/aged_receivables.rs b/crates/kesh-report/src/aged_receivables.rs index aadf7478..6498d722 100644 --- a/crates/kesh-report/src/aged_receivables.rs +++ b/crates/kesh-report/src/aged_receivables.rs @@ -119,9 +119,13 @@ pub async fn generate( // Non échu : due_date NULL OU DATEDIFF <= 0 (échéance >= as_of) // 1-30 / 31-60 / 61-90 : DATEDIFF dans [lo, hi] // 90+ : DATEDIFF >= 91 (strictement plus de 90 jours — pas de recouvrement) - // HAVING total <> 0 écarte une facture legacy sans lignes (reste dû 0) - // qui polluerait la liste. ⚠️ Un reste dû NÉGATIF (trop-perçu hérité) - // n'est pas écrêté : il apparaît. + // Le HAVING garde un contact dès qu'UNE de ses factures a un reste dû non + // nul ; il écarte ainsi une facture legacy sans lignes (reste dû 0) qui + // polluerait la liste. ⚠️ Un reste dû NÉGATIF (trop-perçu hérité) n'est + // pas écrêté : il apparaît. ⛔ Ne PAS revenir à `HAVING total <> 0` : la + // grandeur admet le négatif, et un trop-perçu hérité compensant une facture + // ouverte du même contact ferait disparaître la ligne entière — la relance + // due avec (revue de code 25-4-b1, passe 1). // ⛔ Story 25-4-b1 (#416) : chaque tranche somme le RESTE DÛ, jamais le // TTC — une facture de 1 000.— réglée à 900.— pèse 100.—. Les tranches // restent assises sur `due_date` : un règlement partiel ne rajeunit pas la @@ -146,7 +150,7 @@ pub async fn generate( {joins} \ WHERE i.company_id = ? AND i.status = 'validated' AND i.paid_at IS NULL \ GROUP BY c.id, c.name \ - HAVING total <> 0 \ + HAVING SUM(CASE WHEN {due} <> 0 THEN 1 ELSE 0 END) > 0 \ ORDER BY c.name, c.id", joins = amount_due_derived_joins() ); diff --git a/crates/kesh-report/tests/aged_receivables.rs b/crates/kesh-report/tests/aged_receivables.rs index 8c02301e..013ff4fe 100644 --- a/crates/kesh-report/tests/aged_receivables.rs +++ b/crates/kesh-report/tests/aged_receivables.rs @@ -493,3 +493,123 @@ async fn aged_total_matches_receivable_ledger(pool: MySqlPool) { ); assert_eq!(r.totals.total, ledger, "balance âgée = compte débiteurs"); } + +/// AC 4 — ⛔ un trop-perçu hérité qui COMPENSE une facture ouverte du même +/// contact ne fait pas disparaître le contact : la relance de la facture +/// ouverte reste visible, le négatif apparaît dans sa tranche. +/// +/// L'état est inatteignable par l'application (le trop-perçu est refusé à +/// l'écriture) ; il est fabriqué comme le porteraient des données héritées : +/// un règlement réel, passé sur une facture « parking » d'un autre contact +/// qui peut l'absorber, puis rattaché en SQL à la facture cible. +/// +/// Revue de code 25-4-b1, passe 1 : avec `HAVING total <> 0`, Alpha +/// (108.10 − 108.10 = 0) sortait du résultat. +#[sqlx::test(migrations = "../kesh-db/test-schema")] +async fn aged_compensating_legacy_overpayment_keeps_the_contact(pool: MySqlPool) { + let seeded = seed_accounting_company(&pool).await.unwrap(); + let alpha = mk_contact(&pool, &seeded, "Alpha SA").await; + let beta = mk_contact(&pool, &seeded, "Beta SA").await; + + // Alpha : 108.10 ouverte, en retard de 20 jours… + let _open = mk_validated( + &pool, + &seeded, + alpha, + Some(days_before(20)), + dec!(8.10), + dec!(100.00), + ) + .await; + // … et 54.05 qui portera un règlement hérité de 162.15 → reste −108.10. + let target = mk_validated( + &pool, + &seeded, + alpha, + Some(days_before(70)), + dec!(8.10), + dec!(50.00), + ) + .await; + // Parking : 216.20 chez Beta, réglée en partie (162.15) — paid_at reste NULL. + let parking = mk_validated( + &pool, + &seeded, + beta, + Some(days_before(10)), + dec!(8.10), + dec!(200.00), + ) + .await; + settle( + &pool, + &seeded, + parking.invoice.id, + dec!(162.15), + days_before(5), + ) + .await; + sqlx::query("UPDATE invoice_settlements SET invoice_id = ? WHERE invoice_id = ?") + .bind(target.invoice.id) + .bind(parking.invoice.id) + .execute(&pool) + .await + .expect("rattacher le règlement hérité"); + + let r = generate(&pool, seeded.company_id, as_of()).await.unwrap(); + let a = r + .rows + .iter() + .find(|row| row.contact_id == alpha) + .expect("Alpha ne doit pas disparaître : sa facture ouverte est due"); + assert_eq!(a.buckets.days_1_to_30, dec!(108.10), "relance due visible"); + assert_eq!(a.buckets.days_61_to_90, dec!(-108.10), "négatif non écrêté"); + assert_eq!(a.buckets.total, Decimal::ZERO); + let b = r + .rows + .iter() + .find(|row| row.contact_id == beta) + .expect("Beta"); + assert_eq!(b.buckets.total, dec!(216.20), "parking : tout redevient dû"); +} + +/// Revue de code 25-4-b1, passe 1 — un règlement ANNULÉ ne compte plus : la +/// facture repèse son TTC entier dans sa tranche. +#[sqlx::test(migrations = "../kesh-db/test-schema")] +async fn aged_cancelled_settlement_no_longer_counts(pool: MySqlPool) { + let seeded = seed_accounting_company(&pool).await.unwrap(); + let alpha = mk_contact(&pool, &seeded, "Alpha SA").await; + let v = mk_validated( + &pool, + &seeded, + alpha, + Some(days_before(45)), + dec!(8.10), + dec!(1000.00), + ) + .await; + settle(&pool, &seeded, v.invoice.id, dec!(900.00), days_before(40)).await; + // Témoin : avant l'annulation, la tranche porte le reste dû. + let avant = generate(&pool, seeded.company_id, as_of()).await.unwrap(); + assert_eq!(avant.rows[0].buckets.days_31_to_60, dec!(181.00)); + + let settlement_id: i64 = + sqlx::query_scalar("SELECT id FROM invoice_settlements WHERE invoice_id = ?") + .bind(v.invoice.id) + .fetch_one(&pool) + .await + .unwrap(); + invoice_settlements_write::cancel_settlement( + &pool, + seeded.admin_user_id, + seeded.company_id, + v.invoice.id, + settlement_id, + ) + .await + .expect("annulation du règlement"); + + let r = generate(&pool, seeded.company_id, as_of()).await.unwrap(); + assert_eq!(r.rows[0].buckets.days_31_to_60, dec!(1081.00)); + assert_eq!(r.totals.total, dec!(1081.00)); +} From 87676355321300c96aefb6a2c44963dca69d670d Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 16:47:55 +0200 Subject: [PATCH 34/51] docs(25-4-b1): revue close en 2 passes, gates verts, story done (refs #416) Co-Authored-By: Claude Opus 5.5 --- .../25-4-b1-residuel-aux-agregats.md | 37 +++++++++++++++++-- .../sprint-status.yaml | 2 +- .../tests/invoice_amount_due_parity.rs | 5 ++- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md b/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md index 18ba5ab1..b75a5ff8 100644 --- a/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md +++ b/_bmad-output/implementation-artifacts/25-4-b1-residuel-aux-agregats.md @@ -1,6 +1,6 @@ # Story 25.4-b1 : Le résiduel aux agrégats — balance âgée et échéancier -Status: review +Status: done **Issue : [#416]** — cette story en livre la partie **agrégats** ; la partie **rappels** est la 25-4-b2. ⛔ **La PR de b1 porte `refs #416`, pas `closes`** : l'issue ne se ferme qu'avec b2. @@ -212,7 +212,25 @@ Sonnet, sur `bd06e789..87cbc8b4`. Brut : 4 + 4 + 2 findings ; après dédoublonn - [x] [Review][Defer] **`as_of` borne les tranches, pas les règlements** [crates/kesh-report/src/aged_receivables.rs:109] — deferred : limite écrite dans le doc-comment de `generate`, la route fixe `as_of` à aujourd'hui ; ne mord que si un appelant passait une date passée. - [x] [Review][Defer] **trois tests préexistants déstructurent `seed_base` dans le mauvais ordre** [crates/kesh-api/tests/invoice_echeancier_e2e.rs] — deferred, pre-existing : déjà relevé au Debug Log, verts parce que les deux identifiants valent 1. -Écartés : pré-remplissage négatif du dialogue de règlement (Blind + Edge — tranché hors périmètre par +*Passe 2 (2026-09-27) — les trois lentilles, Haiku ×3, sur le diff aplati `bd06e789..03951962`, +protocole complet (la passe 1 avait changé une règle métier). Brut : 8 + 0 + 0 ; après vérification +`grep -nF` : **0 au-dessus de LOW**.* + +- [x] [Review][Patch] **LOW — assertion d'anti-vacuité sans message** [crates/kesh-db/tests/invoice_amount_due_parity.rs:338] + +Écartés en passe 2 — **quatre faux positifs Haiku réfutés par `grep -nF`** : « CRITICAL » compteur +i18n +1 pour deux clés (la clé d'en-tête CSV n'est lue que côté backend — aucun `i18nMsg` du frontend +ne l'appelle, `grep -rnF echeancier-csv-header-amount-due frontend/src` vide) ; `id="settle-amount"` +prétendu absent (`SettleInvoiceDialog.svelte:213`) ; ordre de `seed_base` prétendu douteux (elle rend +`(seeded.admin_user_id, seeded.company_id)`, `invoice_echeancier_e2e.rs:113`) ; arrondi prétendu perdu +par `toFixed(2)` (tous les termes sont à deux décimales en amont, « 68.1000 » n'est que l'échelle +SQL). Plus : affirmation de T0 sur la 0.12.0 (fait établi par la spec) et trois remarques sans +défaut. ⚠️ L'Edge Case Hunter rendait 0 finding en **8 appels d'outils**, sans déclarer le manuel, les +locales ni le frontend : axes repris par l'orchestrateur — `{due}` jamais NULL (trois `COALESCE`, +`invoice_settlements.rs:106`), deux clés présentes dans les 4 locales, PDF aplati conforme au `.tex` +sur les dix passages « reste dû ». Rien trouvé. + +Écartés en passe 1 : pré-remplissage négatif du dialogue de règlement (Blind + Edge — tranché hors périmètre par la spec, et la garde `n <= 0` bloque la soumission) ; deux remarques LOW de l'Acceptance Auditor (piège de décompte `i18nMsg(` dans un commentaire, parité d'export couverte par un autre fichier que celui nommé) — constats sans défaut. @@ -325,7 +343,11 @@ de le saisir, et un cas « réglée en partie » est ajouté. - Backend : base remise à zéro, `scripts/test-fast.sh` **2491 / 2491** (2484 + 7). - Frontend : `check` 0 erreur (27 avertissements), `lint-i18n-ownership` PASS, `test:unit` **834 / 834** (826 + 8), build OK. -- E2E : sur `kesh_e2e` reconstruite, **225 passed / 8 failed / 19 skipped** — les 7 KF-029 (#97) +- **Après la boucle de revue** (dernier commit) : base remise à zéro, `scripts/test-fast.sh` + **2494 / 2494** (2484 + 10) ; frontend `check` 0 erreur, `lint-i18n-ownership` PASS, `test:unit` + **834 / 834**, build OK ; E2E sur binaire recompilé et `kesh_e2e` reconstruite **225 / 8 / 19**, + les mêmes huit que ci-dessous. +- E2E (avant revue) : sur `kesh_e2e` reconstruite, **225 passed / 8 failed / 19 skipped** — les 7 KF-029 (#97) et `product-revenue-account.spec.ts:133`, victime de pollution déjà répertoriée (`docs/testing.md` § « Les échecs attendus ») et **verte rejouée seule** (deux fois, 4/4). ⚠️ Un **premier run** avait rendu 214/19 : les 7 KF-029 et **12 échecs hors liste**, tous sur le @@ -359,6 +381,15 @@ de le saisir, et un cas « réglée en partie » est ajouté. ## Change Log +- **2026-09-27** — **Revue de code CLOSE en 2 passes, story `done`.** Tendance : passe 1 `2M/1L` + (Sonnet ×3) → passe 2 **0 au-dessus de LOW** (Haiku ×3, protocole complet, diff aplati ; 1 LOW + corrigé dans un test, 4 faux positifs réfutés par `grep -nF`). La dernière remédiation ne touche + aucune ligne de production. Gates complets verts au dernier commit (§ *Gates*). + ⚠️ **Un gate complet perdu, et pourquoi** : il a rougi sur `aged_compensating_…` avec le message de + la mutation, `git diff HEAD` vide. La mutation avait été défaite par `mv` d'une copie `cp` datée + d'AVANT son build : source juste mais plus ancienne que le binaire, cargo n'a pas recompilé. + `touch` puis gate rejoué : vert. Le gate ciblé et clippy de la passe 1 avaient été lancés AVANT la + mutation, ils restent valables. - **2026-09-27** — **Revue de code, passe 1** (Blind Hunter, Edge Case Hunter, Acceptance Auditor — Sonnet ×3, `bd06e789..87cbc8b4`) — **2 MEDIUM, 1 LOW à corriger**, 2 différés, 3 écartés (§ *Review Findings*). Corrigés : diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index 4f22f332..439e699d 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -356,7 +356,7 @@ development_status: 25-3-b-annuler-rapprochement: done # 2026-09-25 DONE — revue close en passe 2 (Sonnet 1 MED -> Haiku 0) ; gates : backend 2463/2463, frontend 777/777, E2E sans regression. Non poussee. — SPEC VALIDEE (boucle close en passe 4 : 2 HIGH -> 2 MED -> 2 MED -> 3 LOW ; pas de decoupage, arbitrage de Guy). Q1-Q3 tranchees. — [#418] closes — annuler un rapprochement bancaire. ⛔ NE JAMAIS compter sur le `ON DELETE SET NULL` de `matched_entry_id` : supprimer l'ecriture ferait disparaitre le lien EN SILENCE, le mode d'echec meme que la story repare. ⚠️ Le chemin d'ACCEPTATION n'a aucune fonction `kesh-db` a mirer : il est ecrit en SQL brut a **cinq** sites de `routes/reconciliation.rs`, dont **un seul** porte le verrou optimiste. Quand la transaction porte une facture, appelle le geste de la 25-3-a. Derriere elle. 25-3-annuler-reglement-et-rapprochement: split # [#414] [#418] — **l'Epic 24 a livre l'encaissement et le rapprochement ; il n'a PAS livre le moyen de les DEFAIRE.** Une erreur d'imputation est aujourd'hui incorrigible autrement qu'a la main — et le gel de la 24-4b interdit precisement la main. ⚠️ *C'est le prix d'une story qui ferme une porte sans ouvrir la suivante : le gel est juste, et il rend cette story-ci necessaire.* 25-4-a-residuel-juste: done # 2026-09-27 REVUE CLOSE EN 1 PASSE ; PR #472 OUVERTE (closes #455 #456), attend « merge ». # IMPLEMENTEE — 7/7 mutations tuees ; gates 2484/2484, 826/826, E2E 222/10/19 sans regression ; prochaine etape : code review. # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (masque a l'ecran, mais rendu par GET /invoices/{id} aux cles API : amountDue = la TVA sur une facture creditee) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE ; validation : P1 Sonnet 1H/3M/1L -> P2 Haiku 1M retenu -> P3 ciblee Opus 2M/5L -> P4 ciblee Sonnet 0 > LOW (1M reclasse LOW) : VALIDEE en 4 passes. Arbitrage 2026-09-27 : refus maintenu, levee tracee par #471. - 25-4-b1-residuel-aux-agregats: review # 2026-09-27 DEV FAIT, gates verts (E2E 225/8 conforme) ; revue de code a lancer. # [#416, refs] balance agee + echeancier (totaux, colonne reste du, CSV, statut partiel, dialogue pre-rempli) + invariant balance agee = grand livre. CREEE ; validation P1 Sonnet 2M/3L -> P2 Haiku 0 (repris : 1M) -> P3 ciblee Opus 3M/3L : portee de l'invariant REECRITE PAR UNE REGLE ; issues #473 #474 ouvertes -> P4 1M -> P5 0 : VALIDEE en 5 passes. Signal MED->MED : pas de decoupage (Guy, 2026-09-27). Branche EMPILEE sur 25-4-a. + 25-4-b1-residuel-aux-agregats: done # 2026-09-27 revue CLOSE en 2 passes (2M/1L -> 0 >LOW), gates complets verts (2494, 834, E2E 225/8). # [#416, refs] balance agee + echeancier (totaux, colonne reste du, CSV, statut partiel, dialogue pre-rempli) + invariant balance agee = grand livre. CREEE ; validation P1 Sonnet 2M/3L -> P2 Haiku 0 (repris : 1M) -> P3 ciblee Opus 3M/3L : portee de l'invariant REECRITE PAR UNE REGLE ; issues #473 #474 ouvertes -> P4 1M -> P5 0 : VALIDEE en 5 passes. Signal MED->MED : pas de decoupage (Guy, 2026-09-27). Branche EMPILEE sur 25-4-a. 25-4-b2-residuel-aux-rappels: backlog # [#416, closes] le rappel reclame le reste du (texte, QR, PDF montant initial / deja regle / reste), frais configurables masques a zero ; point ouvert : frais non comptabilises. 25-4-b-residuel-aux-agregats: split # 2026-09-27 DECOUPEE en b1 (agregats) / b2 (rappels) — six modules apres les arbitrages Q1. # [#416] + montant des RELANCES (TTC complet, trouve a l'inventaire) — Q1 TRANCHEE 2026-09-27 : la QR du rappel porte le RESTE DU (= TTC sans reglement), reste a payer sur le PDF et dans le texte ; point ouvert : frais de rappel non comptabilises vs trop-percu. 25-4-c-residuel-au-rapprochement: backlog # [#420] — DEUX sites : filtre SQL des candidats (HAVING total_ttc) avant le score, puis score et re-score a l'acceptation. diff --git a/crates/kesh-db/tests/invoice_amount_due_parity.rs b/crates/kesh-db/tests/invoice_amount_due_parity.rs index 885fa1f1..835fb88c 100644 --- a/crates/kesh-db/tests/invoice_amount_due_parity.rs +++ b/crates/kesh-db/tests/invoice_amount_due_parity.rs @@ -335,7 +335,10 @@ async fn settled_and_credited_forms_are_at_parity(pool: MySqlPool) { joined.iter().any(|(_, d)| *d < Decimal::ZERO), "état hérité : reste dû négatif" ); - assert!(joined.iter().any(|(_, d)| *d > Decimal::ZERO)); + assert!( + joined.iter().any(|(_, d)| *d > Decimal::ZERO), + "anti-vacuité : au moins un reste dû positif" + ); } // ─── Story 25-4-b1 (#416) — l'échéancier porte le reste dû ──────────────────── From 2ae884494e681f56307fc946f6bb8406215b3038 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 17:01:36 +0200 Subject: [PATCH 35/51] =?UTF-8?q?docs(25-4-b2):=20story=20cr=C3=A9=C3=A9e?= =?UTF-8?q?=20=E2=80=94=20le=20rappel=20r=C3=A9clame=20le=20reste=20d?= =?UTF-8?q?=C3=BB=20(refs=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-b2-residuel-aux-rappels.md | 214 ++++++++++++++++++ .../sprint-status.yaml | 2 +- 2 files changed, 215 insertions(+), 1 deletion(-) create mode 100644 _bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md diff --git a/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md b/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md new file mode 100644 index 00000000..89f1d8c0 --- /dev/null +++ b/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md @@ -0,0 +1,214 @@ +# Story 25.4-b2 : Le résiduel aux rappels — le rappel réclame le reste dû + +Status: ready-for-dev + +**Issue : [#416]** — cette story en livre la partie **rappels** ; la partie agrégats est la 25-4-b1 +(PR #475). ⛔ **La PR de b2 porte `closes #416`**, titre ET corps (§ *Issue Tracking Rule*). + +**Mère : `25-4-propager-le-residuel.md`** (`split`) — **source des faits et des arbitrages**, en +particulier § *Arbitrages du 2026-09-26/27 (Q1)*. **Sœurs** : 25-4-a (mergée, #472), 25-4-b1 (`done`, +PR #475). ⚠️ Branche `story/25-4-b2-residuel-aux-rappels` **empilée** sur celle de b1 : intégrer +`main` par merge après celui de #475. + +⚠️ **Ne pas contester les arbitrages en validation** : en contester la mise en œuvre. + +## Story + +En tant que gérant d'une PME, +je veux qu'un rappel réclame ce que le client **doit encore** — dans le texte, dans la QR-facture et +sur le PDF joint —, +afin qu'un client qui a déjà payé une partie ne soit ni relancé pour le montant entier, ni amené à +le payer une seconde fois en scannant la QR. + +## Le défaut, vérifié dans le code + +Depuis la 24-2, une facture se règle en plusieurs fois. Les rappels l'ignorent : + +| Site | Ce qu'il réclame | +|---|---| +| Texte — `render_reminder`, `crates/kesh-api/src/routes/invoice_email.rs:313-360` | `total_due = ttc + other_fees + *level_fee` (`:334`) — **TTC**, ni règlements ni avoir ; doc-comment `:312` idem | +| QR du PDF joint — `invoice_pdf_service::render`, `crates/kesh-api/src/routes/invoice_pdf_service.rs:90` | `amount: Some(total_ttc)` (`:243`) : un client qui scanne la QR paie **à nouveau le montant entier** | +| PDF joint — rappel unitaire `invoice_email.rs:499-500`, lot `:1140-1143` | la **facture telle quelle** : titre « Facture », aucun bloc réglé / reste (`kesh-qrbill/src/pdf.rs:682-698` n'imprime que « Total TTC ») | +| Gabarits par défaut — `crates/kesh-db/src/entities/email_template_defaults.rs:71-215` | phrases de frais **inconditionnelles** : niveau 2 « Des frais de rappel de {reminderFee} ont été ajoutés » (`:87`), niveau 3 « (frais de rappel de {reminderFee} inclus) » (`:96-97`) — à frais nuls, « frais de 0.00 » | + +Une facture de 1 081.— réglée de 900.— est relancée pour **1 081.— + frais**, avec une QR à +1 081.—. Aucun test ne combine règlement partiel et rappel (vérifié : aucun E2E ni test Rust). + +### Ce que l'inventaire a établi, et qui fixe les choix + +1. **Les frais de rappel ne sont PAS comptabilisés** — aucune écriture dans `invoice_email.rs`, + `dunning_reminders.rs`, `dunning_levels.rs`, `invoice_reminders.rs`. C'est **documenté** : + `admin-manual.tex:1200` (« affichés mais non comptabilisés … ne figurent pas sur la QR-facture ») + et `dunning-cgv-hint` (`fr-CH/messages.ftl:1528`). Un virement « reste + frais » serait d'ailleurs + **refusé** comme trop-perçu (`invoice_settlements_write.rs:165-171`, + `routes/reconciliation.rs:1326-1345`). ⇒ **La QR porte le reste dû, sans les frais.** Le point + ouvert de la mère (§ *Point ouvert … les frais de rappel*) est ainsi **clos par la règle + existante** ; comptabiliser les frais n'est pas dans cette story. +2. **Le PDF d'un rappel est la facture elle-même** : trois appelants de `render`, tous + `(pool, i18n, locale, company, invoice_id)`, aucun montant ni variante. Précédent de variante : + l'**avoir**, qui surcharge `invoice-pdf-title` et `invoice-pdf-number` dans `i18n.entries` + (`routes/credit_notes.rs:334-347`). +3. **Le message non structuré de la QR vaut `Facture {n}`** (`invoice_pdf_service.rs:246-250`), pas + le numéro seul comme l'écrit la mère (`:115-117`). Il est émis même avec une QRR. **Il reste + identique**, comme la référence (`build_qrr(company.id, invoice.id)`, `:218-229`) : c'est ce que + lit le rapprochement. +4. **La QR refuse un montant ≤ 0** (`kesh-qrbill/src/validation.rs:22-29`, `:435-445`) → + `InvoiceNotPdfReady` (400), `INVOICE_NOT_PDF_READY` en lot (`invoice_email.rs:944-946`). Un reste dû + ≤ 0 sur une facture `validated` sans `paid_at` n'existe que par données héritées (25-4-b1, revue + P1) — mais il ferait échouer le rappel sur un message trompeur. +5. **L'envoi unitaire ne recalcule pas le texte** : il envoie le sujet et le corps que le client a + pu modifier depuis l'aperçu (`invoice_email.rs:486-487`). Corriger `render_reminder` corrige + l'**aperçu** et le **lot** ; l'unitaire suit par l'aperçu. +6. **Aucun archivage** du PDF envoyé ([#387], ouverte). Le rappel pour le montant restant n'est pas + la facture réémise (recadrage de Guy, mère `:105-109`) : #387 n'est pas touchée. +7. **Le moteur de gabarits ne connaît aucune condition** (`kesh-core/src/email_template_engine.rs`, + substitution `{var}` en une passe). « À zéro, rien ne s'affiche » ne peut donc passer que par une + **variable rendue vide** par le serveur. + +## Acceptance Criteria + +### Volet 1 — le texte du rappel + +**AC 1** — `render_reminder` calcule `total_due = reste dû + frais des autres niveaux + frais du +niveau`, le reste dû venant d'`invoice_settlements::amount_due` (forme **scalaire** : une facture à +la fois). ⛔ Aucune réécriture de la formule. Le doc-comment `:312` suit. + +**AC 2** — Une variable **`{feeNotice}`** rejoint la liste blanche du type `InvoiceReminder` +(`entities/email_template.rs:63-74`) : phrase localisée (4 locales) disant le montant des frais +**cumulés** inclus dans `{totalDue}`, rendue **vide** quand ce cumul est nul. Les gabarits par défaut +des 4 langues et de tous les niveaux n'écrivent plus aucune phrase de frais en dur : ils emploient +`{feeNotice}`. `{reminderFee}` reste disponible pour les gabarits personnalisés. + +**AC 3** — À frais cumulés nuls, le texte rendu par un gabarit **par défaut** ne contient ni le mot +« frais » (et ses équivalents de/it/en), ni un montant de frais. ⚠️ Un gabarit **personnalisé** qui +écrit `{reminderFee}` en toutes lettres reste de la responsabilité de l'administrateur : le manuel +admin le dit. + +**AC 4** — `{amount}` reste le **TTC** de la facture (« montant de la facture ») : il n'est pas +réinterprété. + +### Volet 2 — le PDF joint au rappel + +**AC 5** — Le PDF joint à un rappel (unitaire et lot) est un **rappel**, pas la facture : titre +localisé « Rappel » (4 locales), sur le patron de surcharge de l'avoir. Le téléchargement de la +facture (`GET …/pdf`) et l'envoi de facture (`POST …/send-email`) sont **inchangés**. + +**AC 6** — Le PDF du rappel nomme **en toutes lettres le numéro de la facture d'origine** et, sous le +total TTC, porte : **déjà réglé** (et **avoir** s'il y en a un), puis **reste à payer** en gras. Les +lignes nulles ne s'affichent pas (même règle que les frais) ; une facture sans règlement ni avoir ne +montre que le total, qui **est** le reste à payer. + +**AC 7** — La QR du PDF de rappel porte le **reste dû** — le TTC s'il n'y a aucun règlement. +⛔ La **référence** (QRR ou aucune) et le **message non structuré** (`Facture {n}`) sont **identiques** +à ceux du PDF de facture, octet pour octet. Les frais **ne** sont **pas** dans la QR. + +**AC 8** — Les frais figurent sur le PDF du rappel **seulement s'ils sont non nuls**, avec la mention +qu'ils ne sont pas compris dans le bulletin de versement *(présentation proposée, cf. Question 1)*. + +**AC 9** — Reste dû ≤ 0 : le rappel est **refusé** avec un code dédié `REMINDER_NOTHING_DUE` +(unitaire : erreur HTTP ; lot : échec **par facture** dans la réponse, jamais d'erreur globale — +§ *Pattern batch*), au lieu d'un `INVOICE_NOT_PDF_READY` trompeur. L'aperçu le signale aussi. Le +frontend traduit le code (`frontend/src/lib/features/reminders/reminder-error-label.ts`). + +### Volet 3 — tests, textes + +**AC 10** — Tests qui auraient échoué avant le patch, chacun avec un cas **partiellement réglé** et +une TVA **non nulle** : +- `render_reminder` : `totalDue` = reste + frais (et non TTC + frais) — la formule elle-même, pas + une valeur passée à la main comme `reminder_vars_ajoute_les_4_variables_rappel` + (`invoice_email.rs:1497-1520`) ; +- `{feeNotice}` vide à frais nuls, non vide sinon ; gabarits par défaut sans « frais » à zéro ; +- construction des entrées QR du rappel, **sans base** (patron `invoice_pdf_service.rs:553-655`) : + `qr.amount` = reste dû ; `qr.reference` et `unstructured_message` **égaux** à ceux de la facture ; +- PDF de rappel : génération `Ok`, et le bloc réglé / reste mesuré selon la doctrine du dépôt + (§ *Comment tester un PDF*, `16-3a-coordonnees-emetteur-pdf.md:416-429`) ; +- `REMINDER_NOTHING_DUE` en unitaire et en lot ; +- un E2E Playwright : facture réglée en partie → aperçu du rappel montre le reste + frais, pas le TTC. + +**AC 11** — Manuels : `user-manual.tex` § rappels (`:990-997`) dit ce que réclame un rappel et ce +que porte le PDF joint ; `admin-manual.tex:1200` n'écrit plus que la QR porte « le total TTC de la +facture d'origine », mais le **reste dû**, frais toujours exclus ; `{feeNotice}` documentée avec les +variables de gabarit. PDF régénérés et contrôlés **aplatis**. CHANGELOG `[0.12.1]` *Fixed*. + +## Tasks / Subtasks + +- [ ] **T1 — texte** (AC 1-4) : `render_reminder`, `{feeNotice}` (liste blanche, clés Fluent ×4, + rendu serveur), gabarits par défaut ×4 langues × niveaux. +- [ ] **T2 — PDF de rappel** (AC 5-8) : variante de `render` (paramètre explicite, pas de booléen + muet), champs optionnels dans `InvoicePdfData` sur le patron d'`origin_reference`, bloc sous le + total dans `pdf.rs`, clés `I18N_KEYS`/`DEFAULT_EN` ajoutées **en fin** des deux tableaux, les deux + appelants de rappel branchés. +- [ ] **T3 — refus du reste nul** (AC 9) : code, unitaire, lot, aperçu, libellé frontend ×4. +- [ ] **T4 — tests et mutations** (AC 10). +- [ ] **T5 — textes** (AC 11). +- [ ] **T6 — gates** : backend complet (base remise à zéro), frontend complet, **E2E complet**. + +## Dev Notes + +### Ce qu'il ne faut pas faire + +- ⛔ **Mettre les frais dans la QR** : ils ne sont pas comptabilisés ; le virement serait refusé comme + trop-perçu (§ inventaire, point 1). +- ⛔ **Toucher la référence ou le message de la QR** : le rapprochement les lit. +- ⛔ **Modifier le PDF de la facture** (téléchargement, envoi, renvoi) : seule la pièce jointe d'un + **rappel** change. +- ⛔ **Réécrire le reste dû à la main** : `amount_due` existe ; il ne prend pas de `company_id` — le + scoping est déjà fait par le chargement de la facture (`find_by_id_with_lines(pool, company.id, …)`). +- ⛔ **Un booléen `is_reminder` passé à `render`** : un paramètre qui dit ce qu'il porte (enum ou + struct d'options), sans quoi l'appel `render(…, true)` ne se relit pas. +- ⚠️ **Géométrie du PDF** : le bloc ajoute de la hauteur ; il doit entrer dans la réserve + `recap_reserve` et respecter les gardes `HeaderOverflow` / `TooManyLines` (`pdf.rs:527-529`, + `:582-595`). +- ⚠️ **`I18N_KEYS.len() == DEFAULT_EN.len()`** (`types.rs:276-279`) ne garantit pas l'appariement : + ajouter en fin des deux tableaux, et le test positionnel `pdf.rs:1835-1852` doit suivre. + +### Où regarder + +| Fichier | Pourquoi | +|---|---| +| `crates/kesh-api/src/routes/invoice_email.rs:161-230, 313-404, 412-562, 1029-1190` | variables, `render_reminder`, aperçu, unitaire, lot | +| `crates/kesh-api/src/routes/invoice_pdf_service.rs:90-345, 553-655` | `render`, entrées QR, tests sans base | +| `crates/kesh-api/src/routes/credit_notes.rs:334-347` | patron de surcharge du titre | +| `crates/kesh-qrbill/src/types.rs:120-159, 216-315` ; `pdf.rs:388-712` | données PDF, clés, rendu | +| `crates/kesh-db/src/entities/email_template.rs:63-74` ; `email_template_defaults.rs:71-215` | liste blanche, gabarits par défaut | +| `crates/kesh-db/src/repositories/invoice_settlements.rs:173-218` | `amount_due`, `amount_settled` | +| `crates/kesh-db/src/repositories/invoice_reminders.rs:65-89` | frais cumulés | +| `docs/manual/fr/user-manual.tex:990-997` ; `admin-manual.tex:1183-1200` | textes | + +### Gardes-fous du dépôt + +- Aucune migration prévue. Si une devenait nécessaire : § *Migration breaking policy* (P5 à P8). +- `crates/kesh-db/` touché (entités) : gate complet en fin de boucle de revue. +- Modules touchés : `kesh-qrbill`, `kesh-api`, `kesh-db`, `kesh-i18n`, `frontend` — **cinq**, à la + limite de la règle de découpage (> 5) : ne pas en ajouter sans le signaler. + +## Questions pour Guy + +**Q1 — les frais sur le PDF du rappel.** La QR porte le reste dû sans frais (règle existante). Si le +PDF montre aussi les frais (AC 8), le client voit « reste à payer 181.— » et « frais de rappel +20.— », pour une QR à 181.—. Proposition : une ligne *« Frais de rappel : 20.— (non compris dans le +bulletin de versement) »*, absente à zéro. Alternative : pas de frais sur le PDF, seulement dans le +texte de l'e-mail (comme aujourd'hui). + +**Q2 — « déjà réglé » à zéro.** Proposé (AC 6) : une facture sans règlement n'affiche que le total, +qui est le reste — même règle que les frais. Alternative : toujours les trois lignes (montant +initial / déjà réglé 0.— / reste). + +## Dev Agent Record + +### Agent Model Used + +### Debug Log References + +### Completion Notes List + +### File List + +## Change Log + +- **2026-09-27** — Créée. Inventaire vérifié par deux explorations et contrôle direct des citations ; + le point ouvert de la mère sur les frais est clos par la règle existante (non comptabilisés, hors + QR) ; message de la QR rectifié (`Facture {n}`, pas le numéro seul) ; deux questions à Guy. + +[#387]: https://github.com/guycorbaz/kesh/issues/387 +[#416]: https://github.com/guycorbaz/kesh/issues/416 diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index 439e699d..99712b65 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -357,7 +357,7 @@ development_status: 25-3-annuler-reglement-et-rapprochement: split # [#414] [#418] — **l'Epic 24 a livre l'encaissement et le rapprochement ; il n'a PAS livre le moyen de les DEFAIRE.** Une erreur d'imputation est aujourd'hui incorrigible autrement qu'a la main — et le gel de la 24-4b interdit precisement la main. ⚠️ *C'est le prix d'une story qui ferme une porte sans ouvrir la suivante : le gel est juste, et il rend cette story-ci necessaire.* 25-4-a-residuel-juste: done # 2026-09-27 REVUE CLOSE EN 1 PASSE ; PR #472 OUVERTE (closes #455 #456), attend « merge ». # IMPLEMENTEE — 7/7 mutations tuees ; gates 2484/2484, 826/826, E2E 222/10/19 sans regression ; prochaine etape : code review. # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (masque a l'ecran, mais rendu par GET /invoices/{id} aux cles API : amountDue = la TVA sur une facture creditee) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE ; validation : P1 Sonnet 1H/3M/1L -> P2 Haiku 1M retenu -> P3 ciblee Opus 2M/5L -> P4 ciblee Sonnet 0 > LOW (1M reclasse LOW) : VALIDEE en 4 passes. Arbitrage 2026-09-27 : refus maintenu, levee tracee par #471. 25-4-b1-residuel-aux-agregats: done # 2026-09-27 revue CLOSE en 2 passes (2M/1L -> 0 >LOW), gates complets verts (2494, 834, E2E 225/8). # [#416, refs] balance agee + echeancier (totaux, colonne reste du, CSV, statut partiel, dialogue pre-rempli) + invariant balance agee = grand livre. CREEE ; validation P1 Sonnet 2M/3L -> P2 Haiku 0 (repris : 1M) -> P3 ciblee Opus 3M/3L : portee de l'invariant REECRITE PAR UNE REGLE ; issues #473 #474 ouvertes -> P4 1M -> P5 0 : VALIDEE en 5 passes. Signal MED->MED : pas de decoupage (Guy, 2026-09-27). Branche EMPILEE sur 25-4-a. - 25-4-b2-residuel-aux-rappels: backlog # [#416, closes] le rappel reclame le reste du (texte, QR, PDF montant initial / deja regle / reste), frais configurables masques a zero ; point ouvert : frais non comptabilises. + 25-4-b2-residuel-aux-rappels: ready-for-dev # 2026-09-27 CREEE : frais non comptabilises => QR = reste du SANS frais (regle existante, admin-manual:1200) ; PDF de rappel = variante titree ; Q1 (frais sur le PDF) et Q2 (deja regle a zero) posees a Guy. # [#416, closes] le rappel reclame le reste du (texte, QR, PDF montant initial / deja regle / reste), frais configurables masques a zero ; point ouvert : frais non comptabilises. 25-4-b-residuel-aux-agregats: split # 2026-09-27 DECOUPEE en b1 (agregats) / b2 (rappels) — six modules apres les arbitrages Q1. # [#416] + montant des RELANCES (TTC complet, trouve a l'inventaire) — Q1 TRANCHEE 2026-09-27 : la QR du rappel porte le RESTE DU (= TTC sans reglement), reste a payer sur le PDF et dans le texte ; point ouvert : frais de rappel non comptabilises vs trop-percu. 25-4-c-residuel-au-rapprochement: backlog # [#420] — DEUX sites : filtre SQL des candidats (HAVING total_ttc) avant le score, puis score et re-score a l'acceptation. 25-4-d-solder-le-reste: backlog # [#384] ramenee de la 25-6 le 2026-09-27 (Guy) — perte sur debiteur, escompte, frais : clore une facture partiellement reglee ; la part TVA reduit la TVA due. From 8166d4f4297caf744c854558437b40e1115dff3a Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 17:34:24 +0200 Subject: [PATCH 36/51] docs(25-4-b2): arbitrages Q1 et Q2 de Guy (refs #416) Co-Authored-By: Claude Opus 5.5 --- .../25-4-b2-residuel-aux-rappels.md | 25 +++++++++---------- .../sprint-status.yaml | 2 +- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md b/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md index 89f1d8c0..2a45a2e0 100644 --- a/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md +++ b/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md @@ -96,14 +96,15 @@ facture (`GET …/pdf`) et l'envoi de facture (`POST …/send-email`) sont **inc **AC 6** — Le PDF du rappel nomme **en toutes lettres le numéro de la facture d'origine** et, sous le total TTC, porte : **déjà réglé** (et **avoir** s'il y en a un), puis **reste à payer** en gras. Les lignes nulles ne s'affichent pas (même règle que les frais) ; une facture sans règlement ni avoir ne -montre que le total, qui **est** le reste à payer. +montre que le total, qui **est** le reste à payer *(arbitrage Q2, Guy, 2026-09-27)*. **AC 7** — La QR du PDF de rappel porte le **reste dû** — le TTC s'il n'y a aucun règlement. ⛔ La **référence** (QRR ou aucune) et le **message non structuré** (`Facture {n}`) sont **identiques** à ceux du PDF de facture, octet pour octet. Les frais **ne** sont **pas** dans la QR. -**AC 8** — Les frais figurent sur le PDF du rappel **seulement s'ils sont non nuls**, avec la mention -qu'ils ne sont pas compris dans le bulletin de versement *(présentation proposée, cf. Question 1)*. +**AC 8** — Les frais cumulés figurent sur le PDF du rappel par une ligne **« Frais de rappel »** +(4 locales) portant la mention qu'ils **ne sont pas compris dans le bulletin de versement** ; +**absente** quand les frais sont nuls *(arbitrage Q1, Guy, 2026-09-27)*. **AC 9** — Reste dû ≤ 0 : le rappel est **refusé** avec un code dédié `REMINDER_NOTHING_DUE` (unitaire : erreur HTTP ; lot : échec **par facture** dans la réponse, jamais d'erreur globale — @@ -182,17 +183,13 @@ variables de gabarit. PDF régénérés et contrôlés **aplatis**. CHANGELOG `[ - Modules touchés : `kesh-qrbill`, `kesh-api`, `kesh-db`, `kesh-i18n`, `frontend` — **cinq**, à la limite de la règle de découpage (> 5) : ne pas en ajouter sans le signaler. -## Questions pour Guy +## ✅ Arbitrages de Guy (2026-09-27) -**Q1 — les frais sur le PDF du rappel.** La QR porte le reste dû sans frais (règle existante). Si le -PDF montre aussi les frais (AC 8), le client voit « reste à payer 181.— » et « frais de rappel -20.— », pour une QR à 181.—. Proposition : une ligne *« Frais de rappel : 20.— (non compris dans le -bulletin de versement) »*, absente à zéro. Alternative : pas de frais sur le PDF, seulement dans le -texte de l'e-mail (comme aujourd'hui). - -**Q2 — « déjà réglé » à zéro.** Proposé (AC 6) : une facture sans règlement n'affiche que le total, -qui est le reste — même règle que les frais. Alternative : toujours les trois lignes (montant -initial / déjà réglé 0.— / reste). +- **Q1 — les frais sur le PDF du rappel** : *« oui, rajouter une ligne "Frais de rappel" »*. Une + ligne « Frais de rappel : 20.— (non compris dans le bulletin de versement) », absente à zéro — la + QR reste au reste dû (AC 7, AC 8). +- **Q2 — « déjà réglé » à zéro** : *« ok »*. Sans règlement ni avoir, le PDF ne montre que le total, + qui est le reste à payer (AC 6). ## Dev Agent Record @@ -209,6 +206,8 @@ initial / déjà réglé 0.— / reste). - **2026-09-27** — Créée. Inventaire vérifié par deux explorations et contrôle direct des citations ; le point ouvert de la mère sur les frais est clos par la règle existante (non comptabilisés, hors QR) ; message de la QR rectifié (`Facture {n}`, pas le numéro seul) ; deux questions à Guy. + Tranchées le jour même : ligne « Frais de rappel » sur le PDF (Q1), « déjà réglé » masqué à zéro + (Q2). [#387]: https://github.com/guycorbaz/kesh/issues/387 [#416]: https://github.com/guycorbaz/kesh/issues/416 diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index 99712b65..67563d2a 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -357,7 +357,7 @@ development_status: 25-3-annuler-reglement-et-rapprochement: split # [#414] [#418] — **l'Epic 24 a livre l'encaissement et le rapprochement ; il n'a PAS livre le moyen de les DEFAIRE.** Une erreur d'imputation est aujourd'hui incorrigible autrement qu'a la main — et le gel de la 24-4b interdit precisement la main. ⚠️ *C'est le prix d'une story qui ferme une porte sans ouvrir la suivante : le gel est juste, et il rend cette story-ci necessaire.* 25-4-a-residuel-juste: done # 2026-09-27 REVUE CLOSE EN 1 PASSE ; PR #472 OUVERTE (closes #455 #456), attend « merge ». # IMPLEMENTEE — 7/7 mutations tuees ; gates 2484/2484, 826/826, E2E 222/10/19 sans regression ; prochaine etape : code review. # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (masque a l'ecran, mais rendu par GET /invoices/{id} aux cles API : amountDue = la TVA sur une facture creditee) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE ; validation : P1 Sonnet 1H/3M/1L -> P2 Haiku 1M retenu -> P3 ciblee Opus 2M/5L -> P4 ciblee Sonnet 0 > LOW (1M reclasse LOW) : VALIDEE en 4 passes. Arbitrage 2026-09-27 : refus maintenu, levee tracee par #471. 25-4-b1-residuel-aux-agregats: done # 2026-09-27 revue CLOSE en 2 passes (2M/1L -> 0 >LOW), gates complets verts (2494, 834, E2E 225/8). # [#416, refs] balance agee + echeancier (totaux, colonne reste du, CSV, statut partiel, dialogue pre-rempli) + invariant balance agee = grand livre. CREEE ; validation P1 Sonnet 2M/3L -> P2 Haiku 0 (repris : 1M) -> P3 ciblee Opus 3M/3L : portee de l'invariant REECRITE PAR UNE REGLE ; issues #473 #474 ouvertes -> P4 1M -> P5 0 : VALIDEE en 5 passes. Signal MED->MED : pas de decoupage (Guy, 2026-09-27). Branche EMPILEE sur 25-4-a. - 25-4-b2-residuel-aux-rappels: ready-for-dev # 2026-09-27 CREEE : frais non comptabilises => QR = reste du SANS frais (regle existante, admin-manual:1200) ; PDF de rappel = variante titree ; Q1 (frais sur le PDF) et Q2 (deja regle a zero) posees a Guy. # [#416, closes] le rappel reclame le reste du (texte, QR, PDF montant initial / deja regle / reste), frais configurables masques a zero ; point ouvert : frais non comptabilises. + 25-4-b2-residuel-aux-rappels: ready-for-dev # 2026-09-27 CREEE : frais non comptabilises => QR = reste du SANS frais (regle existante, admin-manual:1200) ; PDF de rappel = variante titree ; Q1 ligne "Frais de rappel" et Q2 deja regle masque a zero, tranchees par Guy. # [#416, closes] le rappel reclame le reste du (texte, QR, PDF montant initial / deja regle / reste), frais configurables masques a zero ; point ouvert : frais non comptabilises. 25-4-b-residuel-aux-agregats: split # 2026-09-27 DECOUPEE en b1 (agregats) / b2 (rappels) — six modules apres les arbitrages Q1. # [#416] + montant des RELANCES (TTC complet, trouve a l'inventaire) — Q1 TRANCHEE 2026-09-27 : la QR du rappel porte le RESTE DU (= TTC sans reglement), reste a payer sur le PDF et dans le texte ; point ouvert : frais de rappel non comptabilises vs trop-percu. 25-4-c-residuel-au-rapprochement: backlog # [#420] — DEUX sites : filtre SQL des candidats (HAVING total_ttc) avant le score, puis score et re-score a l'acceptation. 25-4-d-solder-le-reste: backlog # [#384] ramenee de la 25-6 le 2026-09-27 (Guy) — perte sur debiteur, escompte, frais : clore une facture partiellement reglee ; la part TVA reduit la TVA due. From f2a8fb5aab4d6284cf26573ef34422d90007fd44 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 17:34:53 +0200 Subject: [PATCH 37/51] docs(25-4-b2): prompt de validation P1 (refs #416) Co-Authored-By: Claude Opus 5.5 --- .../25-4-b2-validate-prompt-p1.md | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 _bmad-output/implementation-artifacts/25-4-b2-validate-prompt-p1.md diff --git a/_bmad-output/implementation-artifacts/25-4-b2-validate-prompt-p1.md b/_bmad-output/implementation-artifacts/25-4-b2-validate-prompt-p1.md new file mode 100644 index 00000000..6b120833 --- /dev/null +++ b/_bmad-output/implementation-artifacts/25-4-b2-validate-prompt-p1.md @@ -0,0 +1,59 @@ +# Prompt — validation P1, Story 25-4-b2 (le résiduel aux rappels) + +*Versionné le 2026-09-27. **Une lentille** (Sonnet), contexte frais.* + +Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-4-b2-residuel-aux-rappels` (empilée sur la 25-4-b1, +PR #475). Fiche à valider : `_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md`. +Mère : `25-4-propager-le-residuel.md` (arbitrages de Guy, et ceux de la fiche Q1/Q2 : **ne pas les +contester**, en contester la mise en œuvre). Sœur : `25-4-b1-residuel-aux-agregats.md`. Issue : +`gh issue view 416`. Contexte : `24-2-encaissement-client.md`, les stories de l'Epic 21 sur les +rappels (`ls _bmad-output/implementation-artifacts/21-*`). Règles : `CLAUDE.md`. Checklist : +`.claude/skills/bmad-create-story/checklist.md`. + +## Axes — tous obligatoires + +1. **Chaque référence `fichier:ligne`** existe et dit ce que la fiche affirme. +2. **Inventaire des sites qui disent un montant au client à l'occasion d'un rappel** — pars du + symptôme, pas de la liste de la fiche : `grep -rn "total_due\|totalDue\|invoice_total_ttc\|total_ttc\|reminderFee\|fee_amount" crates/ frontend/src`. + Pour chaque site : couvert par la fiche, légitimement au TTC, ou oublié (au moins MEDIUM). + Existe-t-il d'autres chemins d'envoi ou d'impression d'un rappel (manuel, renvoi, lot, aperçu, + export, page d'accueil) ? +3. **La QR (AC 7)** : la référence et le message sont-ils vraiment indépendants du montant ? Le + montant de la QR d'un rappel peut-il différer du total imprimé sans que le PDF se contredise ? + Arrondi : `amount_due` est en DECIMAL(19,4), la QR exige 2 décimales — où arrondir, et que + devient un reste de 0.004 ? +4. **Les frais (AC 2, 3, 8)** : « frais cumulés » = autres niveaux + niveau courant — cohérent avec + `sum_fees_deduped_excluding` et avec ce que dit `{totalDue}` ? `{feeNotice}` : la liste blanche, + la validation des gabarits personnalisés existants (un gabarit enregistré avec `{reminderFee}` + reste-t-il valide ?), l'éditeur de gabarits du frontend liste-t-il les variables (où ?). +5. **Le refus du reste nul (AC 9)** : le pattern batch du `CLAUDE.md` est-il respecté par la forme + actuelle de la réponse du lot (lis-la) ? L'éligibilité (`dunning_eligibility.rs`) devrait-elle + exclure ces factures en amont plutôt ? +6. **Le PDF (AC 5, 6, 8)** : géométrie (réserve, gardes), clés i18n et test positionnel, patron de + surcharge de l'avoir — la locale utilisée (contact vs configuration) est-elle la bonne ? + L'archivage #387 est-il vraiment hors d'atteinte ? +7. **Les tests (AC 10)** : chacun est-il faisable et prouve-t-il ce qu'il annonce ? L'E2E : peut-on + monter un règlement partiel puis un aperçu de rappel depuis Playwright ? Mutations tuables ? +8. **Le manuel** : lignes citées, et **PDF aplati** + (`pdftotext docs/manual/fr/user-manual.pdf - | tr '\n' ' ' | tr -s ' '`, idem `admin-manual.pdf`, + vers `/tmp/claude-1000/-home-gcorbaz-devel-kesh/4fb1e50e-3db4-4da6-9933-bcee4a186408/scratchpad/`). + D'autres textes (manuels de/en/it, api-external, README, website) disent-ils que le rappel ou sa + QR réclament le TTC ? +9. **Le périmètre** : cinq modules annoncés — recompte-les depuis les tâches. Quelque chose de la + b1 ou de la 25-4-c/d appartient-il ici, ou l'inverse ? + +## Ce que tu rends + +- **Findings** : sévérité (CRITICAL/HIGH/MEDIUM/LOW), endroit exact, **preuve** (commande et + résultat, code lu), correction proposée. +- ⛔ **La liste des axes réellement exercés ET de ceux qui ne l'ont pas été.** Un rapport sans elle + ne compte pas. + +## Interdits + +⛔ N'écris aucun fichier du dépôt ; aucune commande qui écrit dans le dépôt ou dans une base — +`scripts/prepare-release.sh`, `scripts/regen-test-schema.sh`, `scripts/install-hooks.sh`, +`scripts/test-fast.sh`, `scripts/mem-guard.sh`, `make`, `latexmk`, tout `git commit`/`push`/`add`/ +`stash`/`reset`/`rebase`/`checkout`/`switch`/`worktree`, `sqlx migrate`, `cargo test`/`nextest`, +`npm run`, `npx playwright`. Autorisés : lecture, `grep`, `git log`/`show`/`diff`, `gh issue view`, +`pdftotext` vers le scratchpad, `cargo check`. From ac38508fef7dfc82f87d5f194440ced067b8f5e1 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 17:44:55 +0200 Subject: [PATCH 38/51] =?UTF-8?q?docs(25-4-b2):=20validation=20P1=20?= =?UTF-8?q?=E2=80=94=20refus=20class=C3=A9=20en=20lot,=20locale,=20g=C3=A9?= =?UTF-8?q?om=C3=A9trie,=20arrondi=20(refs=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-b2-residuel-aux-rappels.md | 46 +++++++++++++++---- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md b/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md index 2a45a2e0..2c67a8d2 100644 --- a/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md +++ b/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md @@ -47,7 +47,8 @@ Une facture de 1 081.— réglée de 900.— est relancée pour **1 081.— + fr 2. **Le PDF d'un rappel est la facture elle-même** : trois appelants de `render`, tous `(pool, i18n, locale, company, invoice_id)`, aucun montant ni variante. Précédent de variante : l'**avoir**, qui surcharge `invoice-pdf-title` et `invoice-pdf-number` dans `i18n.entries` - (`routes/credit_notes.rs:334-347`). + (`routes/credit_notes.rs:334-347`) — ⚠️ dans la langue de l'**installation**, qui ne convient pas + à un rappel (AC 5). 3. **Le message non structuré de la QR vaut `Facture {n}`** (`invoice_pdf_service.rs:246-250`), pas le numéro seul comme l'écrit la mère (`:115-117`). Il est émis même avec une QRR. **Il reste identique**, comme la référence (`build_qrr(company.id, invoice.id)`, `:218-229`) : c'est ce que @@ -90,7 +91,10 @@ réinterprété. ### Volet 2 — le PDF joint au rappel **AC 5** — Le PDF joint à un rappel (unitaire et lot) est un **rappel**, pas la facture : titre -localisé « Rappel » (4 locales), sur le patron de surcharge de l'avoir. Le téléchargement de la +localisé « Rappel » (4 locales), sur le patron de surcharge de l'avoir. ⛔ **Dans la locale déjà +résolue** que `render` reçoit (langue du contact, `resolve_language`) — **pas** `state.config.locale` +comme l'avoir (`credit_notes.rs:335-346`), qui produirait un titre dans la langue de l'installation +sur un PDF dans celle du contact. Le téléchargement de la facture (`GET …/pdf`) et l'envoi de facture (`POST …/send-email`) sont **inchangés**. **AC 6** — Le PDF du rappel nomme **en toutes lettres le numéro de la facture d'origine** et, sous le @@ -99,6 +103,10 @@ lignes nulles ne s'affichent pas (même règle que les frais) ; une facture sans montre que le total, qui **est** le reste à payer *(arbitrage Q2, Guy, 2026-09-27)*. **AC 7** — La QR du PDF de rappel porte le **reste dû** — le TTC s'il n'y a aucun règlement. +⛔ **Un seul arrondi** : `amount_due` (DECIMAL(19,4)) est arrondi **une fois**, à 2 décimales, +`MidpointAwayFromZero` (la stratégie de `pdf.rs:682-684` et `generator.rs:38-39`), et **cette même +valeur** nourrit le « reste à payer » imprimé, la QR et `{totalDue}`. Le refus de l'AC 9 porte sur la +valeur **arrondie** (≤ 0.00) : un reste brut de 0.004 est refusé, pas envoyé à une QR invalide. ⛔ La **référence** (QRR ou aucune) et le **message non structuré** (`Facture {n}`) sont **identiques** à ceux du PDF de facture, octet pour octet. Les frais **ne** sont **pas** dans la QR. @@ -110,6 +118,15 @@ montre que le total, qui **est** le reste à payer *(arbitrage Q2, Guy, 2026-09- (unitaire : erreur HTTP ; lot : échec **par facture** dans la réponse, jamais d'erreur globale — § *Pattern batch*), au lieu d'un `INVOICE_NOT_PDF_READY` trompeur. L'aperçu le signale aussi. Le frontend traduit le code (`frontend/src/lib/features/reminders/reminder-error-label.ts`). +⛔ **En lot, le refus doit être CLASSÉ** : aujourd'hui `send_one_batch_reminder` range **toute** +erreur de `render_reminder` en panne (`.map_err(|e| BatchItemError::infra("render reminder", …))`, +`invoice_email.rs:1118`), qui rend `DATABASE_ERROR` et journalise en `error!`. Le refus y sortirait +donc en fausse alerte d'infrastructure. Il sort en `BatchItemError::failed("REMINDER_NOTHING_DUE")` +(`:885`), sur le patron de `classify_render_error` (`:937`) et de son test +`classify_render_error_ne_deguise_pas_un_refus_en_panne` (`:1557`) — un test symétrique l'établit. +L'éligibilité (`dunning_eligibility.rs:85-89`) **n'est pas** modifiée : l'état est hérité et rare +(25-4-b1, revue P1), et un refus nommé à l'envoi le rend visible, là où une exclusion en amont le +ferait disparaître de la liste sans dire pourquoi. ### Volet 3 — tests, textes @@ -123,7 +140,9 @@ une TVA **non nulle** : `qr.amount` = reste dû ; `qr.reference` et `unstructured_message` **égaux** à ceux de la facture ; - PDF de rappel : génération `Ok`, et le bloc réglé / reste mesuré selon la doctrine du dépôt (§ *Comment tester un PDF*, `16-3a-coordonnees-emetteur-pdf.md:416-429`) ; -- `REMINDER_NOTHING_DUE` en unitaire et en lot ; +- `REMINDER_NOTHING_DUE` en unitaire et en lot — en lot, **classé** en échec par facture et non en + `DATABASE_ERROR` ; un reste brut de 0.004 est refusé ; +- le rendu du PDF de rappel au **nombre maximal de lignes** avec le bloc complet (quatre lignes) ; - un E2E Playwright : facture réglée en partie → aperçu du rappel montre le reste + frais, pas le TTC. **AC 11** — Manuels : `user-manual.tex` § rappels (`:990-997`) dit ce que réclame un rappel et ce @@ -157,9 +176,12 @@ variables de gabarit. PDF régénérés et contrôlés **aplatis**. CHANGELOG `[ scoping est déjà fait par le chargement de la facture (`find_by_id_with_lines(pool, company.id, …)`). - ⛔ **Un booléen `is_reminder` passé à `render`** : un paramètre qui dit ce qu'il porte (enum ou struct d'options), sans quoi l'appel `render(…, true)` ne se relit pas. -- ⚠️ **Géométrie du PDF** : le bloc ajoute de la hauteur ; il doit entrer dans la réserve - `recap_reserve` et respecter les gardes `HeaderOverflow` / `TooManyLines` (`pdf.rs:527-529`, - `:582-595`). +- ⚠️ **Géométrie du PDF** : le bloc (jusqu'à quatre lignes : déjà réglé, avoir, reste, frais) + ajoute de la hauteur ; il **entre dans `recap_reserve`** (calculée avant la boucle des lignes, + `pdf.rs:579-586`) et respecte les gardes `HeaderOverflow` / `TooManyLines` (`:527-529`, + `:582-595`). ⛔ **Ne pas copier le bloc `payment_terms`** (`:700-708`), le plus proche en apparence : + il n'est pas réservé et se contente de **clamper** à `content_floor + 5.0`, d'où un tassement + silencieux au lieu d'un refus. Un test à nombre de lignes maximal **avec** le bloc complet le prouve. - ⚠️ **`I18N_KEYS.len() == DEFAULT_EN.len()`** (`types.rs:276-279`) ne garantit pas l'appariement : ajouter en fin des deux tableaux, et le test positionnel `pdf.rs:1835-1852` doit suivre. @@ -169,10 +191,10 @@ variables de gabarit. PDF régénérés et contrôlés **aplatis**. CHANGELOG `[ |---|---| | `crates/kesh-api/src/routes/invoice_email.rs:161-230, 313-404, 412-562, 1029-1190` | variables, `render_reminder`, aperçu, unitaire, lot | | `crates/kesh-api/src/routes/invoice_pdf_service.rs:90-345, 553-655` | `render`, entrées QR, tests sans base | -| `crates/kesh-api/src/routes/credit_notes.rs:334-347` | patron de surcharge du titre | +| `crates/kesh-api/src/routes/credit_notes.rs:334-347` | patron de surcharge du titre — ⚠️ **sauf sa locale** (`state.config.locale`), cf. AC 5 | | `crates/kesh-qrbill/src/types.rs:120-159, 216-315` ; `pdf.rs:388-712` | données PDF, clés, rendu | | `crates/kesh-db/src/entities/email_template.rs:63-74` ; `email_template_defaults.rs:71-215` | liste blanche, gabarits par défaut | -| `crates/kesh-db/src/repositories/invoice_settlements.rs:173-218` | `amount_due`, `amount_settled` | +| `crates/kesh-db/src/repositories/invoice_settlements.rs:60, 187-220` | `amount_due`, `amount_settled` ; ⚠️ l'**avoir** n'a pas de fonction scalaire, seulement le fragment `INVOICE_CREDITED_SUBQUERY_SQL` (`:60`) — en ajouter une (`amount_credited`) sur le patron des deux autres, plutôt que de réécrire la sous-requête | | `crates/kesh-db/src/repositories/invoice_reminders.rs:65-89` | frais cumulés | | `docs/manual/fr/user-manual.tex:990-997` ; `admin-manual.tex:1183-1200` | textes | @@ -203,6 +225,14 @@ variables de gabarit. PDF régénérés et contrôlés **aplatis**. CHANGELOG `[ ## Change Log +- **2026-09-27** — **Validation P1** (Sonnet, prompt `25-4-b2-validate-prompt-p1.md`) — **1 HIGH, + 3 MEDIUM, 2 LOW**, tous des défauts de la fiche. HIGH : en lot, le refus du reste nul serait sorti + en `DATABASE_ERROR` — `render_reminder` y est classé en panne (`invoice_email.rs:1118`) ; AC 9 + exige désormais la classification. MEDIUM : la locale du titre (le précédent de l'avoir prend celle + de l'installation) ; la géométrie (le bloc le plus proche, `payment_terms`, clampe au lieu de + réserver) ; l'arrondi (un seul, partagé par le texte, le PDF et la QR). LOW : l'éligibilité reste + inchangée, motif écrit ; l'avoir n'a pas de fonction scalaire. Neuf axes exercés, références toutes + exactes ; périmètre recompté à cinq modules. - **2026-09-27** — Créée. Inventaire vérifié par deux explorations et contrôle direct des citations ; le point ouvert de la mère sur les frais est clos par la règle existante (non comptabilisés, hors QR) ; message de la QR rectifié (`Facture {n}`, pas le numéro seul) ; deux questions à Guy. From f9e72d6f3f80b9095f71a0b62540e9023058732d Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 17:45:09 +0200 Subject: [PATCH 39/51] docs(25-4-b2): prompt de validation P2 (refs #416) Co-Authored-By: Claude Opus 5.5 --- .../25-4-b2-validate-prompt-p2.md | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 _bmad-output/implementation-artifacts/25-4-b2-validate-prompt-p2.md diff --git a/_bmad-output/implementation-artifacts/25-4-b2-validate-prompt-p2.md b/_bmad-output/implementation-artifacts/25-4-b2-validate-prompt-p2.md new file mode 100644 index 00000000..ea1362ea --- /dev/null +++ b/_bmad-output/implementation-artifacts/25-4-b2-validate-prompt-p2.md @@ -0,0 +1,69 @@ +# Prompt — validation P2, Story 25-4-b2 (le résiduel aux rappels) + +*Versionné le 2026-09-27. **Une lentille** (Haiku), contexte frais.* + +Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-4-b2-residuel-aux-rappels` (empilée sur la 25-4-b1, +PR #475). Fiche à valider : `_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md`. +Mère : `25-4-propager-le-residuel.md` (arbitrages de Guy, et ceux de la fiche Q1/Q2 : **ne pas les +contester**, en contester la mise en œuvre). Sœur : `25-4-b1-residuel-aux-agregats.md`. Issue : +`gh issue view 416`. Contexte : `24-2-encaissement-client.md`, les stories de l'Epic 21 sur les +rappels (`ls _bmad-output/implementation-artifacts/21-*`). Règles : `CLAUDE.md`. Checklist : +`.claude/skills/bmad-create-story/checklist.md`. + +## Axes — tous obligatoires + +1. **Chaque référence `fichier:ligne`** existe et dit ce que la fiche affirme. +2. **Inventaire des sites qui disent un montant au client à l'occasion d'un rappel** — pars du + symptôme, pas de la liste de la fiche : `grep -rn "total_due\|totalDue\|invoice_total_ttc\|total_ttc\|reminderFee\|fee_amount" crates/ frontend/src`. + Pour chaque site : couvert par la fiche, légitimement au TTC, ou oublié (au moins MEDIUM). + Existe-t-il d'autres chemins d'envoi ou d'impression d'un rappel (manuel, renvoi, lot, aperçu, + export, page d'accueil) ? +3. **La QR (AC 7)** : la référence et le message sont-ils vraiment indépendants du montant ? Le + montant de la QR d'un rappel peut-il différer du total imprimé sans que le PDF se contredise ? + Arrondi : `amount_due` est en DECIMAL(19,4), la QR exige 2 décimales — où arrondir, et que + devient un reste de 0.004 ? +4. **Les frais (AC 2, 3, 8)** : « frais cumulés » = autres niveaux + niveau courant — cohérent avec + `sum_fees_deduped_excluding` et avec ce que dit `{totalDue}` ? `{feeNotice}` : la liste blanche, + la validation des gabarits personnalisés existants (un gabarit enregistré avec `{reminderFee}` + reste-t-il valide ?), l'éditeur de gabarits du frontend liste-t-il les variables (où ?). +5. **Le refus du reste nul (AC 9)** : le pattern batch du `CLAUDE.md` est-il respecté par la forme + actuelle de la réponse du lot (lis-la) ? L'éligibilité (`dunning_eligibility.rs`) devrait-elle + exclure ces factures en amont plutôt ? +6. **Le PDF (AC 5, 6, 8)** : géométrie (réserve, gardes), clés i18n et test positionnel, patron de + surcharge de l'avoir — la locale utilisée (contact vs configuration) est-elle la bonne ? + L'archivage #387 est-il vraiment hors d'atteinte ? +7. **Les tests (AC 10)** : chacun est-il faisable et prouve-t-il ce qu'il annonce ? L'E2E : peut-on + monter un règlement partiel puis un aperçu de rappel depuis Playwright ? Mutations tuables ? +8. **Le manuel** : lignes citées, et **PDF aplati** + (`pdftotext docs/manual/fr/user-manual.pdf - | tr '\n' ' ' | tr -s ' '`, idem `admin-manual.pdf`, + vers `/tmp/claude-1000/-home-gcorbaz-devel-kesh/4fb1e50e-3db4-4da6-9933-bcee4a186408/scratchpad/`). + D'autres textes (manuels de/en/it, api-external, README, website) disent-ils que le rappel ou sa + QR réclament le TTC ? +9. **Le périmètre** : cinq modules annoncés — recompte-les depuis les tâches. Quelque chose de la + b1 ou de la 25-4-c/d appartient-il ici, ou l'inverse ? + +10. **Les corrections de la passe 1** (Change Log, entrée « Validation P1 », commit `ac38508f` : + `git show ac38508f`) : chacune est-elle juste, et a-t-elle introduit une contradiction ailleurs + dans la fiche ? En particulier : le refus classé en lot (AC 9) — `BatchItemError::failed` rend-il + bien la forme attendue par la réponse du lot ? La règle « un seul arrondi » (AC 7) est-elle + compatible avec `{totalDue}` qui ajoute des frais en DECIMAL(7,2) ? La fonction `amount_credited` + à créer : même contrat que ses deux voisines (scoping, signe) ? + +⚠️ Pour toute affirmation qu'un code manque ou qu'une ligne dit autre chose, cite la sortie de +`grep -nF` ou de `sed -n` qui l'établit — sinon le finding ne sera pas retenu. + +## Ce que tu rends + +- **Findings** : sévérité (CRITICAL/HIGH/MEDIUM/LOW), endroit exact, **preuve** (commande et + résultat, code lu), correction proposée. +- ⛔ **La liste des axes réellement exercés ET de ceux qui ne l'ont pas été.** Un rapport sans elle + ne compte pas. + +## Interdits + +⛔ N'écris aucun fichier du dépôt ; aucune commande qui écrit dans le dépôt ou dans une base — +`scripts/prepare-release.sh`, `scripts/regen-test-schema.sh`, `scripts/install-hooks.sh`, +`scripts/test-fast.sh`, `scripts/mem-guard.sh`, `make`, `latexmk`, tout `git commit`/`push`/`add`/ +`stash`/`reset`/`rebase`/`checkout`/`switch`/`worktree`, `sqlx migrate`, `cargo test`/`nextest`, +`npm run`, `npx playwright`. Autorisés : lecture, `grep`, `git log`/`show`/`diff`, `gh issue view`, +`pdftotext` vers le scratchpad, `cargo check`. From 9c5c8a60dd5468f9944d8adb0abdf48a75e2271e Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 17:52:07 +0200 Subject: [PATCH 40/51] =?UTF-8?q?docs(25-4-b2):=20validation=20P2=20?= =?UTF-8?q?=E2=80=94=20variables=20de=20rappel=20=C3=A0=20documenter,=20no?= =?UTF-8?q?n=20existantes=20(refs=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-b2-residuel-aux-rappels.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md b/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md index 2c67a8d2..a50582da 100644 --- a/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md +++ b/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md @@ -147,8 +147,12 @@ une TVA **non nulle** : **AC 11** — Manuels : `user-manual.tex` § rappels (`:990-997`) dit ce que réclame un rappel et ce que porte le PDF joint ; `admin-manual.tex:1200` n'écrit plus que la QR porte « le total TTC de la -facture d'origine », mais le **reste dû**, frais toujours exclus ; `{feeNotice}` documentée avec les -variables de gabarit. PDF régénérés et contrôlés **aplatis**. CHANGELOG `[0.12.1]` *Fixed*. +facture d'origine », mais le **reste dû**, frais toujours exclus. ⚠️ **Les variables de rappel ne +sont documentées NULLE PART** : les deux manuels ne listent que les six variables de la facture +(`admin-manual.tex:1163-1167`, `user-manual.tex:906-909`). Les deux sites gagnent la liste des +variables propres au rappel — `{reminderLevel}`, `{reminderFee}` (frais du niveau), `{totalDue}` +(**reste dû + frais cumulés**), `{daysOverdue}`, `{feeNotice}` (vide sans frais) — et disent que +`{amount}` reste le TTC de la facture. PDF régénérés et contrôlés **aplatis**. CHANGELOG `[0.12.1]` *Fixed*. ## Tasks / Subtasks @@ -225,6 +229,13 @@ variables de gabarit. PDF régénérés et contrôlés **aplatis**. CHANGELOG `[ ## Change Log +- **2026-09-27** — **Validation P2** (Haiku, prompt `25-4-b2-validate-prompt-p2.md`) — **0 finding** + rendu, sans aucune commande citée ; l'axe 10 lisait de travers `amount_credited` (« LOW accepté », + alors que la fiche prescrit de la créer). ⛔ **Repris par l'orchestrateur** (§ *un 0 finding se + vérifie comme un finding*) : forme de `BatchItemError::failed` conforme (`invoice_email.rs:885`) ; + aucun autre site ne dit `totalDue` hors des six fichiers connus ; mais **1 MEDIUM** sur l'axe 8 + qu'elle déclarait exercé — l'AC 11 renvoyait à une documentation des variables de rappel qui + **n'existe pas** (les manuels ne listent que celles de la facture). AC 11 rectifié. - **2026-09-27** — **Validation P1** (Sonnet, prompt `25-4-b2-validate-prompt-p1.md`) — **1 HIGH, 3 MEDIUM, 2 LOW**, tous des défauts de la fiche. HIGH : en lot, le refus du reste nul serait sorti en `DATABASE_ERROR` — `render_reminder` y est classé en panne (`invoice_email.rs:1118`) ; AC 9 From 9a6fbd1701b067c98c5c399a2956f2c7de338d7b Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 17:52:49 +0200 Subject: [PATCH 41/51] docs(25-4-b2): prompt de validation P3 (refs #416) Co-Authored-By: Claude Opus 5.5 --- .../25-4-b2-validate-prompt-p3.md | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 _bmad-output/implementation-artifacts/25-4-b2-validate-prompt-p3.md diff --git a/_bmad-output/implementation-artifacts/25-4-b2-validate-prompt-p3.md b/_bmad-output/implementation-artifacts/25-4-b2-validate-prompt-p3.md new file mode 100644 index 00000000..37aca441 --- /dev/null +++ b/_bmad-output/implementation-artifacts/25-4-b2-validate-prompt-p3.md @@ -0,0 +1,75 @@ +# Prompt — validation P3, Story 25-4-b2 (le résiduel aux rappels) + +*Versionné le 2026-09-27. **Une lentille** (Opus), contexte frais.* + +Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-4-b2-residuel-aux-rappels` (empilée sur la 25-4-b1, +PR #475). Fiche à valider : `_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md`. +Mère : `25-4-propager-le-residuel.md` (arbitrages de Guy, et ceux de la fiche Q1/Q2 : **ne pas les +contester**, en contester la mise en œuvre). Sœur : `25-4-b1-residuel-aux-agregats.md`. Issue : +`gh issue view 416`. Contexte : `24-2-encaissement-client.md`, les stories de l'Epic 21 sur les +rappels (`ls _bmad-output/implementation-artifacts/21-*`). Règles : `CLAUDE.md`. Checklist : +`.claude/skills/bmad-create-story/checklist.md`. + +## Axes — tous obligatoires + +1. **Chaque référence `fichier:ligne`** existe et dit ce que la fiche affirme. +2. **Inventaire des sites qui disent un montant au client à l'occasion d'un rappel** — pars du + symptôme, pas de la liste de la fiche : `grep -rn "total_due\|totalDue\|invoice_total_ttc\|total_ttc\|reminderFee\|fee_amount" crates/ frontend/src`. + Pour chaque site : couvert par la fiche, légitimement au TTC, ou oublié (au moins MEDIUM). + Existe-t-il d'autres chemins d'envoi ou d'impression d'un rappel (manuel, renvoi, lot, aperçu, + export, page d'accueil) ? +3. **La QR (AC 7)** : la référence et le message sont-ils vraiment indépendants du montant ? Le + montant de la QR d'un rappel peut-il différer du total imprimé sans que le PDF se contredise ? + Arrondi : `amount_due` est en DECIMAL(19,4), la QR exige 2 décimales — où arrondir, et que + devient un reste de 0.004 ? +4. **Les frais (AC 2, 3, 8)** : « frais cumulés » = autres niveaux + niveau courant — cohérent avec + `sum_fees_deduped_excluding` et avec ce que dit `{totalDue}` ? `{feeNotice}` : la liste blanche, + la validation des gabarits personnalisés existants (un gabarit enregistré avec `{reminderFee}` + reste-t-il valide ?), l'éditeur de gabarits du frontend liste-t-il les variables (où ?). +5. **Le refus du reste nul (AC 9)** : le pattern batch du `CLAUDE.md` est-il respecté par la forme + actuelle de la réponse du lot (lis-la) ? L'éligibilité (`dunning_eligibility.rs`) devrait-elle + exclure ces factures en amont plutôt ? +6. **Le PDF (AC 5, 6, 8)** : géométrie (réserve, gardes), clés i18n et test positionnel, patron de + surcharge de l'avoir — la locale utilisée (contact vs configuration) est-elle la bonne ? + L'archivage #387 est-il vraiment hors d'atteinte ? +7. **Les tests (AC 10)** : chacun est-il faisable et prouve-t-il ce qu'il annonce ? L'E2E : peut-on + monter un règlement partiel puis un aperçu de rappel depuis Playwright ? Mutations tuables ? +8. **Le manuel** : lignes citées, et **PDF aplati** + (`pdftotext docs/manual/fr/user-manual.pdf - | tr '\n' ' ' | tr -s ' '`, idem `admin-manual.pdf`, + vers `/tmp/claude-1000/-home-gcorbaz-devel-kesh/4fb1e50e-3db4-4da6-9933-bcee4a186408/scratchpad/`). + D'autres textes (manuels de/en/it, api-external, README, website) disent-ils que le rappel ou sa + QR réclament le TTC ? +9. **Le périmètre** : cinq modules annoncés — recompte-les depuis les tâches. Quelque chose de la + b1 ou de la 25-4-c/d appartient-il ici, ou l'inverse ? + +10. **Les corrections des passes 1 et 2** (Change Log ; `git show ac38508f` et `git show 9c5c8a60`) : chacune est-elle juste, et a-t-elle introduit une contradiction ailleurs + dans la fiche ? En particulier : le refus classé en lot (AC 9) — `BatchItemError::failed` rend-il + bien la forme attendue par la réponse du lot ? La règle « un seul arrondi » (AC 7) est-elle + compatible avec `{totalDue}` qui ajoute des frais en DECIMAL(7,2) ? La fonction `amount_credited` + à créer : même contrat que ses deux voisines (scoping, signe) ? + +11. ⚠️ **La passe 2 a rendu 0 finding sans preuve** et a manqué un MEDIUM sur l'axe 8 : ne te fie + à aucune de ses conclusions. En particulier, refais les axes 2, 4, 6 et 7 comme s'ils n'avaient + jamais été exercés. Cherche aussi ce que la fiche **n'énumère pas** : les tests existants que le + changement de `{totalDue}`, des gabarits par défaut et du PDF joint va casser (grep des + assertions sur ces textes dans `crates/*/tests`, `crates/*/src` et `frontend/tests/e2e`) — + la fiche doit les nommer. + +⚠️ Pour toute affirmation qu'un code manque ou qu'une ligne dit autre chose, cite la sortie de +`grep -nF` ou de `sed -n` qui l'établit — sinon le finding ne sera pas retenu. + +## Ce que tu rends + +- **Findings** : sévérité (CRITICAL/HIGH/MEDIUM/LOW), endroit exact, **preuve** (commande et + résultat, code lu), correction proposée. +- ⛔ **La liste des axes réellement exercés ET de ceux qui ne l'ont pas été.** Un rapport sans elle + ne compte pas. + +## Interdits + +⛔ N'écris aucun fichier du dépôt ; aucune commande qui écrit dans le dépôt ou dans une base — +`scripts/prepare-release.sh`, `scripts/regen-test-schema.sh`, `scripts/install-hooks.sh`, +`scripts/test-fast.sh`, `scripts/mem-guard.sh`, `make`, `latexmk`, tout `git commit`/`push`/`add`/ +`stash`/`reset`/`rebase`/`checkout`/`switch`/`worktree`, `sqlx migrate`, `cargo test`/`nextest`, +`npm run`, `npx playwright`. Autorisés : lecture, `grep`, `git log`/`show`/`diff`, `gh issue view`, +`pdftotext` vers le scratchpad, `cargo check`. From 6197bffd862d73fd90f6759309e3fcf798cf3867 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 18:02:35 +0200 Subject: [PATCH 42/51] =?UTF-8?q?docs(25-4-b2):=20validation=20P3=20?= =?UTF-8?q?=E2=80=94=20pas=20de=20ligne=20avoir,=20largeur,=20second=20sit?= =?UTF-8?q?e=20class=C3=A9,=20#476=20(refs=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-b2-residuel-aux-rappels.md | 83 +++++++++++++++---- 1 file changed, 68 insertions(+), 15 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md b/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md index a50582da..80b7be8c 100644 --- a/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md +++ b/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md @@ -44,7 +44,7 @@ Une facture de 1 081.— réglée de 900.— est relancée pour **1 081.— + fr `routes/reconciliation.rs:1326-1345`). ⇒ **La QR porte le reste dû, sans les frais.** Le point ouvert de la mère (§ *Point ouvert … les frais de rappel*) est ainsi **clos par la règle existante** ; comptabiliser les frais n'est pas dans cette story. -2. **Le PDF d'un rappel est la facture elle-même** : trois appelants de `render`, tous +2. **Le PDF d'un rappel est la facture elle-même** : quatre appelants de `render` (`invoice_email.rs:500`, `:722`, `:1141`, `invoice_pdf.rs:37`), tous `(pool, i18n, locale, company, invoice_id)`, aucun montant ni variante. Précédent de variante : l'**avoir**, qui surcharge `invoice-pdf-title` et `invoice-pdf-number` dans `i18n.entries` (`routes/credit_notes.rs:334-347`) — ⚠️ dans la langue de l'**installation**, qui ne convient pas @@ -75,10 +75,15 @@ niveau`, le reste dû venant d'`invoice_settlements::amount_due` (forme **scalai la fois). ⛔ Aucune réécriture de la formule. Le doc-comment `:312` suit. **AC 2** — Une variable **`{feeNotice}`** rejoint la liste blanche du type `InvoiceReminder` -(`entities/email_template.rs:63-74`) : phrase localisée (4 locales) disant le montant des frais +(`entities/email_template.rs:63-74`) : phrase localisée (4 langues, **en Rust indexé par +`Language`**, sur le patron de `salutation_line`, `invoice_email.rs:109-150` — `build_reminder_vars` +est pur et n'a pas le bundle Fluent) disant le montant des frais **cumulés** inclus dans `{totalDue}`, rendue **vide** quand ce cumul est nul. Les gabarits par défaut des 4 langues et de tous les niveaux n'écrivent plus aucune phrase de frais en dur : ils emploient -`{feeNotice}`. `{reminderFee}` reste disponible pour les gabarits personnalisés. +`{feeNotice}`. `{reminderFee}` reste disponible pour les gabarits personnalisés. ⚠️ **Test qui rougira** : +`reminder_vars_ajoute_les_4_variables_rappel` (`invoice_email.rs:1494`) exige que les clés rendues +égalent la liste blanche (`:1507-1514`) — `build_reminder_vars` doit donc insérer `feeNotice`, et le +test est mis à jour, pas contourné. **AC 3** — À frais cumulés nuls, le texte rendu par un gabarit **par défaut** ne contient ni le mot « frais » (et ses équivalents de/it/en), ni un montant de frais. ⚠️ Un gabarit **personnalisé** qui @@ -90,7 +95,9 @@ réinterprété. ### Volet 2 — le PDF joint au rappel -**AC 5** — Le PDF joint à un rappel (unitaire et lot) est un **rappel**, pas la facture : titre +**AC 5** — Le PDF joint à un rappel (unitaire et lot) est un **rappel**, pas la facture ; la pièce +jointe se nomme `rappel-{n}.pdf` et non plus `facture-{n}.pdf` (`invoice_email.rs:510`, `:1161`) — +⚠️ l'E2E `dunning-roundtrip.spec.ts:81-82` (`^facture-.*\.pdf$`) suit. Titre localisé « Rappel » (4 locales), sur le patron de surcharge de l'avoir. ⛔ **Dans la locale déjà résolue** que `render` reçoit (langue du contact, `resolve_language`) — **pas** `state.config.locale` comme l'avoir (`credit_notes.rs:335-346`), qui produirait un titre dans la langue de l'installation @@ -98,8 +105,12 @@ sur un PDF dans celle du contact. Le téléchargement de la facture (`GET …/pdf`) et l'envoi de facture (`POST …/send-email`) sont **inchangés**. **AC 6** — Le PDF du rappel nomme **en toutes lettres le numéro de la facture d'origine** et, sous le -total TTC, porte : **déjà réglé** (et **avoir** s'il y en a un), puis **reste à payer** en gras. Les -lignes nulles ne s'affichent pas (même règle que les frais) ; une facture sans règlement ni avoir ne +total TTC, porte : **déjà réglé**, puis **reste à payer** en gras. ⛔ **Pas de ligne « avoir »** : une facture +qui porte un avoir est `cancelled` (`credit_notes.rs:586`), un avoir est refusé sur une facture +réglée même en partie (`:325`), et le rendu comme l'éligibilité exigent `validated` +(`invoice_pdf_service.rs:102`, `dunning_eligibility.rs:86`) — une facture créditée ne reçoit jamais +de rappel ; la ligne serait du code mort. Si #471 lève un jour le refus, elle y reviendra. Les +lignes nulles ne s'affichent pas (même règle que les frais) ; une facture sans règlement ne montre que le total, qui **est** le reste à payer *(arbitrage Q2, Guy, 2026-09-27)*. **AC 7** — La QR du PDF de rappel porte le **reste dû** — le TTC s'il n'y a aucun règlement. @@ -107,12 +118,22 @@ montre que le total, qui **est** le reste à payer *(arbitrage Q2, Guy, 2026-09- `MidpointAwayFromZero` (la stratégie de `pdf.rs:682-684` et `generator.rs:38-39`), et **cette même valeur** nourrit le « reste à payer » imprimé, la QR et `{totalDue}`. Le refus de l'AC 9 porte sur la valeur **arrondie** (≤ 0.00) : un reste brut de 0.004 est refusé, pas envoyé à une QR invalide. +⚠️ **Limite connue, préexistante, non corrigée ici** : les montants ont jusqu'à 4 décimales +(`routes/limits.rs:28`), et un reste brut de 10.0050 donne une QR à 10.01 ; le trop-perçu se juge sur +la valeur **brute** (`invoice_settlements_write.rs:167`, `routes/reconciliation.rs:1336`) : le paiement +exact de la QR serait refusé. La QR de **facture** a le même défaut (`generator.rs:38-39`). Tracé par +**[#476]**, à rattacher à la 25-4-c (#420, comparaison du rapprochement). ⛔ La **référence** (QRR ou aucune) et le **message non structuré** (`Facture {n}`) sont **identiques** à ceux du PDF de facture, octet pour octet. Les frais **ne** sont **pas** dans la QR. **AC 8** — Les frais cumulés figurent sur le PDF du rappel par une ligne **« Frais de rappel »** (4 locales) portant la mention qu'ils **ne sont pas compris dans le bulletin de versement** ; -**absente** quand les frais sont nuls *(arbitrage Q1, Guy, 2026-09-27)*. +**absente** quand les frais sont nuls *(arbitrage Q1, Guy, 2026-09-27)*. ⚠️ **Largeur** : la colonne +des libellés du récapitulatif n'a que 50 mm (`col_unit` → `col_tot`, `pdf.rs:532-534`), soit ~23 +caractères à 9 pt (calibrage `IDENTITY_MAX_CHARS`, `:202`) ; la mention en compte ~58 en français, +plus en allemand. Le libellé court (« Frais de rappel ») reste dans la colonne ; la **mention** part +sur une ligne à elle depuis `col_desc`, comptée dans la réserve. Un test borne sa longueur dans les +4 locales, sur le patron de `IDENTITY_MAX_CHARS` — les gardes ne surveillent que l'ordonnée. **AC 9** — Reste dû ≤ 0 : le rappel est **refusé** avec un code dédié `REMINDER_NOTHING_DUE` (unitaire : erreur HTTP ; lot : échec **par facture** dans la réponse, jamais d'erreur globale — @@ -124,6 +145,17 @@ erreur de `render_reminder` en panne (`.map_err(|e| BatchItemError::infra("rende donc en fausse alerte d'infrastructure. Il sort en `BatchItemError::failed("REMINDER_NOTHING_DUE")` (`:885`), sur le patron de `classify_render_error` (`:937`) et de son test `classify_render_error_ne_deguise_pas_un_refus_en_panne` (`:1557`) — un test symétrique l'établit. +⛔ **Et sur le second site** : le lot recalcule le reste dans le rendu PDF (`:1140-1143`, +`classify_render_error`) ; un règlement enregistré entre les deux appels y ferait tomber le refus +dans le bras final `other => BatchItemError::infra("render pdf", …)` (`:947`). Le variant du refus +rejoint le `match` de `classify_render_error` **et** le tableau `metier` de son test (`:1557`) — +le doc-comment `:924-936` l'impose. +**Où vit le refus** : dans `render_reminder` (aperçu, lot) **et** dans la variante PDF — l'envoi +unitaire n'appelle pas `render_reminder` (le texte vient de l'aperçu, `:486-487`), seul son rendu PDF +(`:499-500`) recalcule le reste. Un variant `AppError::ReminderNothingDue` et sa clé +`error-reminder-nothing-due` (4 locales), sur le patron de `DunningPaused` (`errors.rs:1312`) : +l'aperçu et l'unitaire affichent `err.message` ; `reminder-error-label.ts` ne sert qu'au compte-rendu +du lot (`ReminderBatchReport.svelte:30`). L'éligibilité (`dunning_eligibility.rs:85-89`) **n'est pas** modifiée : l'état est hérité et rare (25-4-b1, revue P1), et un refus nommé à l'envoi le rend visible, là où une exclusion en amont le ferait disparaître de la liste sans dire pourquoi. @@ -134,7 +166,7 @@ ferait disparaître de la liste sans dire pourquoi. une TVA **non nulle** : - `render_reminder` : `totalDue` = reste + frais (et non TTC + frais) — la formule elle-même, pas une valeur passée à la main comme `reminder_vars_ajoute_les_4_variables_rappel` - (`invoice_email.rs:1497-1520`) ; + (`invoice_email.rs:1494-1520`) ; - `{feeNotice}` vide à frais nuls, non vide sinon ; gabarits par défaut sans « frais » à zéro ; - construction des entrées QR du rappel, **sans base** (patron `invoice_pdf_service.rs:553-655`) : `qr.amount` = reste dû ; `qr.reference` et `unstructured_message` **égaux** à ceux de la facture ; @@ -142,7 +174,8 @@ une TVA **non nulle** : (§ *Comment tester un PDF*, `16-3a-coordonnees-emetteur-pdf.md:416-429`) ; - `REMINDER_NOTHING_DUE` en unitaire et en lot — en lot, **classé** en échec par facture et non en `DATABASE_ERROR` ; un reste brut de 0.004 est refusé ; -- le rendu du PDF de rappel au **nombre maximal de lignes** avec le bloc complet (quatre lignes) ; +- le rendu du PDF de rappel au **nombre maximal de lignes** avec le bloc complet (trois lignes, dont + la mention des frais — AC 8) ; - un E2E Playwright : facture réglée en partie → aperçu du rappel montre le reste + frais, pas le TTC. **AC 11** — Manuels : `user-manual.tex` § rappels (`:990-997`) dit ce que réclame un rappel et ce @@ -152,17 +185,23 @@ sont documentées NULLE PART** : les deux manuels ne listent que les six variabl (`admin-manual.tex:1163-1167`, `user-manual.tex:906-909`). Les deux sites gagnent la liste des variables propres au rappel — `{reminderLevel}`, `{reminderFee}` (frais du niveau), `{totalDue}` (**reste dû + frais cumulés**), `{daysOverdue}`, `{feeNotice}` (vide sans frais) — et disent que -`{amount}` reste le TTC de la facture. PDF régénérés et contrôlés **aplatis**. CHANGELOG `[0.12.1]` *Fixed*. +`{amount}` reste le TTC de la facture. Le rappel des CGV `dunning-cgv-hint` (`fr-CH/messages.ftl:1528`, +3 autres locales, repli `settings/dunning/+page.svelte:263`) ne dit plus « le QR de la facture +jointe » mais celui du **rappel joint**. ⚠️ Le manuel dit aussi, sans le corriger, qu'un client qui +paie `{totalDue}` (reste + frais) sera refusé en trop-perçu : conséquence des frais non comptabilisés, +tracée par **#401**. PDF régénérés et contrôlés **aplatis**. CHANGELOG `[0.12.1]` *Fixed*. ## Tasks / Subtasks -- [ ] **T1 — texte** (AC 1-4) : `render_reminder`, `{feeNotice}` (liste blanche, clés Fluent ×4, +- [ ] **T1 — texte** (AC 1-4) : `render_reminder`, `{feeNotice}` (liste blanche, phrase Rust par `Language` ×4, rendu serveur), gabarits par défaut ×4 langues × niveaux. - [ ] **T2 — PDF de rappel** (AC 5-8) : variante de `render` (paramètre explicite, pas de booléen - muet), champs optionnels dans `InvoicePdfData` sur le patron d'`origin_reference`, bloc sous le + muet, qui **porte les montants déjà calculés** — la construction des entrées QR reste testable sans + base), champs optionnels dans `InvoicePdfData` sur le patron d'`origin_reference`, bloc sous le total dans `pdf.rs`, clés `I18N_KEYS`/`DEFAULT_EN` ajoutées **en fin** des deux tableaux, les deux appelants de rappel branchés. -- [ ] **T3 — refus du reste nul** (AC 9) : code, unitaire, lot, aperçu, libellé frontend ×4. +- [ ] **T3 — refus du reste nul** (AC 9) : variant `AppError`, clé `error-*` ×4, `render_reminder` + et variante PDF, **deux** sites classés en lot, libellé du compte-rendu ×4. - [ ] **T4 — tests et mutations** (AC 10). - [ ] **T5 — textes** (AC 11). - [ ] **T6 — gates** : backend complet (base remise à zéro), frontend complet, **E2E complet**. @@ -180,7 +219,7 @@ variables propres au rappel — `{reminderLevel}`, `{reminderFee}` (frais du niv scoping est déjà fait par le chargement de la facture (`find_by_id_with_lines(pool, company.id, …)`). - ⛔ **Un booléen `is_reminder` passé à `render`** : un paramètre qui dit ce qu'il porte (enum ou struct d'options), sans quoi l'appel `render(…, true)` ne se relit pas. -- ⚠️ **Géométrie du PDF** : le bloc (jusqu'à quatre lignes : déjà réglé, avoir, reste, frais) +- ⚠️ **Géométrie du PDF** : le bloc (jusqu'à trois lignes : déjà réglé, reste, frais) ajoute de la hauteur ; il **entre dans `recap_reserve`** (calculée avant la boucle des lignes, `pdf.rs:579-586`) et respecte les gardes `HeaderOverflow` / `TooManyLines` (`:527-529`, `:582-595`). ⛔ **Ne pas copier le bloc `payment_terms`** (`:700-708`), le plus proche en apparence : @@ -198,7 +237,7 @@ variables propres au rappel — `{reminderLevel}`, `{reminderFee}` (frais du niv | `crates/kesh-api/src/routes/credit_notes.rs:334-347` | patron de surcharge du titre — ⚠️ **sauf sa locale** (`state.config.locale`), cf. AC 5 | | `crates/kesh-qrbill/src/types.rs:120-159, 216-315` ; `pdf.rs:388-712` | données PDF, clés, rendu | | `crates/kesh-db/src/entities/email_template.rs:63-74` ; `email_template_defaults.rs:71-215` | liste blanche, gabarits par défaut | -| `crates/kesh-db/src/repositories/invoice_settlements.rs:60, 187-220` | `amount_due`, `amount_settled` ; ⚠️ l'**avoir** n'a pas de fonction scalaire, seulement le fragment `INVOICE_CREDITED_SUBQUERY_SQL` (`:60`) — en ajouter une (`amount_credited`) sur le patron des deux autres, plutôt que de réécrire la sous-requête | +| `crates/kesh-db/src/repositories/invoice_settlements.rs:187-220` | `amount_due`, `amount_settled` — suffisants : aucune ligne « avoir » (AC 6) | | `crates/kesh-db/src/repositories/invoice_reminders.rs:65-89` | frais cumulés | | `docs/manual/fr/user-manual.tex:990-997` ; `admin-manual.tex:1183-1200` | textes | @@ -229,6 +268,18 @@ variables propres au rappel — `{reminderLevel}`, `{reminderFee}` (frais du niv ## Change Log +- **2026-09-27** — **Validation P3** (Opus, protocole complet, prompt `25-4-b2-validate-prompt-p3.md`) + — **5 MEDIUM, 5 LOW**, tous sur la fiche ; les citations clés vérifiées par `grep -nF`. Corrigés : + M1 la ligne « avoir » et `amount_credited` retirées — une facture créditée est `cancelled` et ne + reçoit jamais de rappel ; M2 la largeur de la mention des frais (50 mm de colonne, ~58 caractères) ; + M3 le refus classé aussi dans `classify_render_error` (second site du lot) ; M4 l'arrondi loin de + zéro fait refuser le paiement exact de la QR — limite préexistante écrite dans l'AC 7, tracée par + **#476** (ouverte) ; L1 où vit le refus, variant et clé ; L2 `{feeNotice}` en Rust par `Language`, + test qui rougira nommé ; L3 quatre appelants de `render`, pas trois ; L4 nom de la pièce jointe et + `dunning-cgv-hint` ; L5 la conséquence de `{totalDue}` = reste + frais, citée avec **#401**. + ⚠️ **Deux points remontés à Guy** : M5 (le rappel papier n'a aucun PDF juste) et le **signal de + découpage** — P2 (1M, orchestrateur) → P3 (5M) : sévérité égale (§ *Règle de splitting + préventif*). - **2026-09-27** — **Validation P2** (Haiku, prompt `25-4-b2-validate-prompt-p2.md`) — **0 finding** rendu, sans aucune commande citée ; l'axe 10 lisait de travers `amount_credited` (« LOW accepté », alors que la fiche prescrit de la créer). ⛔ **Repris par l'orchestrateur** (§ *un 0 finding se @@ -252,3 +303,5 @@ variables propres au rappel — `{reminderLevel}`, `{reminderFee}` (frais du niv [#387]: https://github.com/guycorbaz/kesh/issues/387 [#416]: https://github.com/guycorbaz/kesh/issues/416 +[#476]: https://github.com/guycorbaz/kesh/issues/476 +[#401]: https://github.com/guycorbaz/kesh/issues/401 From 995af7a91344b74f62013b233a6ed02a39f5b0fa Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 18:12:23 +0200 Subject: [PATCH 43/51] =?UTF-8?q?docs(25-4-b2):=20pas=20de=20d=C3=A9coupag?= =?UTF-8?q?e=20(Guy)=20;=20M5=20pr=C3=A9cis=C3=A9=20(refs=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../implementation-artifacts/25-4-b2-residuel-aux-rappels.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md b/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md index 80b7be8c..e8985abf 100644 --- a/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md +++ b/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md @@ -255,6 +255,10 @@ tracée par **#401**. PDF régénérés et contrôlés **aplatis**. CHANGELOG `[ QR reste au reste dû (AC 7, AC 8). - **Q2 — « déjà réglé » à zéro** : *« ok »*. Sans règlement ni avoir, le PDF ne montre que le total, qui est le reste à payer (AC 6). +- **Signal de découpage P2 → P3 (MED → MED)** : *« ne découpe pas »* (Guy, 2026-09-27). +- **M5 — le rappel papier** : *« les 1er et 2ème rappels n'ont pas besoin d'être en recommandé »* + (Guy, 2026-09-27) — seul le **3ᵉ** (mise en demeure, `user-manual.tex:1003`) part en recommandé ; + suite de l'arbitrage en attente (§ Change Log). ## Dev Agent Record From b859b39e694f83afc5dfbdad27487b4eb4b8043b Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 18:12:42 +0200 Subject: [PATCH 44/51] =?UTF-8?q?docs(25-4-b2):=20prompt=20de=20validation?= =?UTF-8?q?=20P4=20cibl=C3=A9e=20(refs=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-b2-validate-prompt-p4.md | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 _bmad-output/implementation-artifacts/25-4-b2-validate-prompt-p4.md diff --git a/_bmad-output/implementation-artifacts/25-4-b2-validate-prompt-p4.md b/_bmad-output/implementation-artifacts/25-4-b2-validate-prompt-p4.md new file mode 100644 index 00000000..9c6a910a --- /dev/null +++ b/_bmad-output/implementation-artifacts/25-4-b2-validate-prompt-p4.md @@ -0,0 +1,43 @@ +# Prompt — validation P4 CIBLÉE, Story 25-4-b2 (le résiduel aux rappels) + +*Versionné le 2026-09-27. **Une lentille** (Sonnet), contexte frais, **passe ciblée** (§ *La passe +ciblée* du `CLAUDE.md`) : elle ne relit pas la story, elle relit **la dernière remédiation**.* + +Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-4-b2-residuel-aux-rappels`. Fiche : +`_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md`. **Périmètre : le seul commit +`6197bffd`** (`git show 6197bffd`) — la remédiation de la validation P3, dont le rapport est résumé au +Change Log (entrée « Validation P3 »). Arbitrages de Guy : **ne pas les contester**. + +## Axes — tous obligatoires + +1. **Chaque phrase ajoutée ou modifiée par `6197bffd`** : chaque `fichier:ligne` cité existe et dit ce + que la fiche affirme (`sed -n`, `grep -nF`). Cite la sortie. +2. **Contradictions introduites** : une correction de P3 contredit-elle un autre passage de la fiche + (AC, tâches, Dev Notes, « Où regarder », tests de l'AC 10) ? En particulier : le retrait de la + ligne « avoir » a-t-il laissé des résidus (« quatre lignes », `amount_credited`, « avoir » dans un + AC ou un test) ? Le choix Rust-par-`Language` pour `{feeNotice}` contredit-il une mention de clés + Fluent ailleurs ? Le nom `rappel-{n}.pdf` est-il cohérent avec tous les tests cités ? +3. **Justesse des corrections** : la mention des frais sur une ligne à elle (AC 8) tient-elle dans la + réserve et dans la largeur (`pdf.rs`, `col_desc`, largeur utile de la page) ? Le variant ajouté à + `classify_render_error` : la forme proposée est-elle compatible avec le `match` actuel + (`invoice_email.rs:937-950`) et avec le test `:1557` ? Le variant `AppError::ReminderNothingDue` + et sa clé : le patron `DunningPaused` (`errors.rs`) est-il bien celui décrit ? +4. **Ce que la remédiation n'a pas traité** : les dix findings de P3 (M1-M5, L1-L5) sont-ils tous + traités ou explicitement renvoyés (M5 est en attente d'arbitrage, c'est voulu) ? +5. **#476** (`gh issue view 476`) dit-il ce que l'AC 7 lui fait dire ? + +## Ce que tu rends + +- **Findings** : sévérité (CRITICAL/HIGH/MEDIUM/LOW), endroit exact, **preuve** (commande et + résultat), correction proposée. +- ⛔ **La liste des axes réellement exercés ET de ceux qui ne l'ont pas été.** Un « 0 finding » sans + cette liste et sans commandes citées ne compte pas. + +## Interdits + +⛔ N'écris aucun fichier du dépôt ; aucune commande qui écrit dans le dépôt ou dans une base — +`scripts/prepare-release.sh`, `scripts/regen-test-schema.sh`, `scripts/install-hooks.sh`, +`scripts/test-fast.sh`, `scripts/mem-guard.sh`, `make`, `latexmk`, tout `git commit`/`push`/`add`/ +`stash`/`reset`/`rebase`/`checkout`/`switch`/`worktree`, `sqlx migrate`, `cargo test`/`nextest`, +`npm run`, `npx playwright`, `gh issue create/edit/comment`. Autorisés : lecture, `grep`, `sed -n`, +`git log`/`show`/`diff`, `gh issue view`, `cargo check`. From d06b5c6c11dc0bda04c1c3bac8f8c6d8a37c5678 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 18:20:51 +0200 Subject: [PATCH 45/51] =?UTF-8?q?docs(25-4-b2):=20validation=20P4=20cibl?= =?UTF-8?q?=C3=A9e=20=E2=80=94=20citations=20qualifi=C3=A9es=20par=20leur?= =?UTF-8?q?=20crate=20(refs=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-b2-residuel-aux-rappels.md | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md b/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md index e8985abf..16db47f9 100644 --- a/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md +++ b/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md @@ -96,18 +96,18 @@ réinterprété. ### Volet 2 — le PDF joint au rappel **AC 5** — Le PDF joint à un rappel (unitaire et lot) est un **rappel**, pas la facture ; la pièce -jointe se nomme `rappel-{n}.pdf` et non plus `facture-{n}.pdf` (`invoice_email.rs:510`, `:1161`) — +jointe se nomme `rappel-{n}.pdf` et non plus `facture-{n}.pdf` (`invoice_email.rs:509`, `:1164` ; `:733`, l'envoi de facture, reste `facture-`) — ⚠️ l'E2E `dunning-roundtrip.spec.ts:81-82` (`^facture-.*\.pdf$`) suit. Titre localisé « Rappel » (4 locales), sur le patron de surcharge de l'avoir. ⛔ **Dans la locale déjà résolue** que `render` reçoit (langue du contact, `resolve_language`) — **pas** `state.config.locale` -comme l'avoir (`credit_notes.rs:335-346`), qui produirait un titre dans la langue de l'installation +comme l'avoir (`crates/kesh-api/src/routes/credit_notes.rs:335-346`), qui produirait un titre dans la langue de l'installation sur un PDF dans celle du contact. Le téléchargement de la facture (`GET …/pdf`) et l'envoi de facture (`POST …/send-email`) sont **inchangés**. **AC 6** — Le PDF du rappel nomme **en toutes lettres le numéro de la facture d'origine** et, sous le total TTC, porte : **déjà réglé**, puis **reste à payer** en gras. ⛔ **Pas de ligne « avoir »** : une facture -qui porte un avoir est `cancelled` (`credit_notes.rs:586`), un avoir est refusé sur une facture -réglée même en partie (`:325`), et le rendu comme l'éligibilité exigent `validated` +qui porte un avoir est `cancelled` (`crates/kesh-db/src/repositories/credit_notes.rs:586`), un avoir est refusé sur une +facture réglée même en partie (même fichier, `:325`), et le rendu comme l'éligibilité exigent `validated` (`invoice_pdf_service.rs:102`, `dunning_eligibility.rs:86`) — une facture créditée ne reçoit jamais de rappel ; la ligne serait du code mort. Si #471 lève un jour le refus, elle y reviendra. Les lignes nulles ne s'affichent pas (même règle que les frais) ; une facture sans règlement ne @@ -149,11 +149,11 @@ donc en fausse alerte d'infrastructure. Il sort en `BatchItemError::failed("REMI `classify_render_error`) ; un règlement enregistré entre les deux appels y ferait tomber le refus dans le bras final `other => BatchItemError::infra("render pdf", …)` (`:947`). Le variant du refus rejoint le `match` de `classify_render_error` **et** le tableau `metier` de son test (`:1557`) — -le doc-comment `:924-936` l'impose. +le doc-comment `:922-936` l'impose. **Où vit le refus** : dans `render_reminder` (aperçu, lot) **et** dans la variante PDF — l'envoi unitaire n'appelle pas `render_reminder` (le texte vient de l'aperçu, `:486-487`), seul son rendu PDF (`:499-500`) recalcule le reste. Un variant `AppError::ReminderNothingDue` et sa clé -`error-reminder-nothing-due` (4 locales), sur le patron de `DunningPaused` (`errors.rs:1312`) : +`error-reminder-nothing-due` (4 locales), sur le patron de `DunningPaused` (`crates/kesh-api/src/errors.rs:1312`) : l'aperçu et l'unitaire affichent `err.message` ; `reminder-error-label.ts` ne sert qu'au compte-rendu du lot (`ReminderBatchReport.svelte:30`). L'éligibilité (`dunning_eligibility.rs:85-89`) **n'est pas** modifiée : l'état est hérité et rare @@ -189,7 +189,7 @@ variables propres au rappel — `{reminderLevel}`, `{reminderFee}` (frais du niv 3 autres locales, repli `settings/dunning/+page.svelte:263`) ne dit plus « le QR de la facture jointe » mais celui du **rappel joint**. ⚠️ Le manuel dit aussi, sans le corriger, qu'un client qui paie `{totalDue}` (reste + frais) sera refusé en trop-perçu : conséquence des frais non comptabilisés, -tracée par **#401**. PDF régénérés et contrôlés **aplatis**. CHANGELOG `[0.12.1]` *Fixed*. +tracée par **[#401]**. PDF régénérés et contrôlés **aplatis**. CHANGELOG `[0.12.1]` *Fixed*. ## Tasks / Subtasks @@ -272,6 +272,13 @@ tracée par **#401**. PDF régénérés et contrôlés **aplatis**. CHANGELOG `[ ## Change Log +- **2026-09-27** — **Validation P4 ciblée** (Sonnet, `6197bffd`, prompt `25-4-b2-validate-prompt-p4.md`) + — **1 MEDIUM, 2 LOW**, tous de référence : `credit_notes.rs:586`/`:325` sans chemin, alors que deux + fichiers portent ce nom (le contenu est dans `kesh-db/src/repositories/`) ; `invoice_email.rs:510`/ + `:1161` décalés (`:509`/`:1164`) ; `[#401]` défini mais jamais invoqué. Symptôme grepé (nom de + fichier nu) : **deux sites de plus** que la passe, `credit_notes.rs:335-346` et `errors.rs:1312`, + eux aussi présents dans deux crates — qualifiés. Cinq axes exercés, commandes citées ; les + corrections de P3 jugées justes et sans contradiction. - **2026-09-27** — **Validation P3** (Opus, protocole complet, prompt `25-4-b2-validate-prompt-p3.md`) — **5 MEDIUM, 5 LOW**, tous sur la fiche ; les citations clés vérifiées par `grep -nF`. Corrigés : M1 la ligne « avoir » et `amount_credited` retirées — une facture créditée est `cancelled` et ne From e33f9d2687d14f0fc3aabb699fe25236d933b884 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 18:21:05 +0200 Subject: [PATCH 46/51] =?UTF-8?q?docs(25-4-b2):=20prompt=20de=20validation?= =?UTF-8?q?=20P5=20cibl=C3=A9e=20(refs=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-b2-validate-prompt-p5.md | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 _bmad-output/implementation-artifacts/25-4-b2-validate-prompt-p5.md diff --git a/_bmad-output/implementation-artifacts/25-4-b2-validate-prompt-p5.md b/_bmad-output/implementation-artifacts/25-4-b2-validate-prompt-p5.md new file mode 100644 index 00000000..a87d4774 --- /dev/null +++ b/_bmad-output/implementation-artifacts/25-4-b2-validate-prompt-p5.md @@ -0,0 +1,37 @@ +# Prompt — validation P5 CIBLÉE, Story 25-4-b2 (le résiduel aux rappels) + +*Versionné le 2026-09-27. **Une lentille** (Haiku), contexte frais, **passe ciblée** (§ *La passe +ciblée* du `CLAUDE.md`) : elle ne relit pas la story, elle relit **la dernière remédiation**.* + +Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-4-b2-residuel-aux-rappels`. Fiche : +`_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md`. **Périmètre : le seul commit +`d06b5c6c`** (`git show d06b5c6c`) — la remédiation de la validation P4, dont le rapport est résumé au +Change Log (entrée « Validation P4 ciblée »). Arbitrages de Guy : **ne pas les contester**. + +## Axes — tous obligatoires + +1. **Chaque chemin et chaque `fichier:ligne` ajouté ou modifié par `d06b5c6c`** existe et dit ce que + la fiche affirme — vérifie avec `sed -n 'p' ` et cite la sortie. +2. **Toutes les citations de fichier NU restantes de la fiche** (un nom de fichier sans chemin) : + liste-les (`grep -noE '\(`[a-z_]+\.(rs|ts|svelte)[:0-9, -]*`' `), et pour chacune + `find crates frontend -name ` — un nom présent dans plusieurs dossiers est ambigu. Dis + lesquels restent ambigus (MEDIUM si la ligne citée n'existe que dans l'un des fichiers). +3. **Contradictions introduites** par `d06b5c6c` avec le reste de la fiche. +4. Les liens Markdown `[#NNN]` de la fiche ont-ils tous une définition, et chaque définition est-elle + invoquée ? + +## Ce que tu rends + +- **Findings** : sévérité (CRITICAL/HIGH/MEDIUM/LOW), endroit exact, **preuve** (commande et + résultat), correction proposée. +- ⛔ **La liste des axes réellement exercés ET de ceux qui ne l'ont pas été.** Un « 0 finding » sans + cette liste et sans commandes citées ne compte pas. + +## Interdits + +⛔ N'écris aucun fichier du dépôt ; aucune commande qui écrit dans le dépôt ou dans une base — +`scripts/prepare-release.sh`, `scripts/regen-test-schema.sh`, `scripts/install-hooks.sh`, +`scripts/test-fast.sh`, `scripts/mem-guard.sh`, `make`, `latexmk`, tout `git commit`/`push`/`add`/ +`stash`/`reset`/`rebase`/`checkout`/`switch`/`worktree`, `sqlx migrate`, `cargo test`/`nextest`, +`npm run`, `npx playwright`, `gh issue create/edit/comment`. Autorisés : lecture, `grep`, `sed -n`, +`git log`/`show`/`diff`, `gh issue view`, `cargo check`. From e65dcf4966736553cf3df6701f55f3a9f70412cd Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 18:26:56 +0200 Subject: [PATCH 47/51] =?UTF-8?q?docs(25-4-b2):=20validation=20P5=20cibl?= =?UTF-8?q?=C3=A9e=20=E2=80=94=20noms=20nus=20trait=C3=A9s=20comme=20class?= =?UTF-8?q?e=20;=20boucle=20close=20(refs=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-b2-residuel-aux-rappels.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md b/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md index 16db47f9..1f191276 100644 --- a/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md +++ b/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md @@ -12,6 +12,12 @@ PR #475). ⚠️ Branche `story/25-4-b2-residuel-aux-rappels` **empilée** sur c ⚠️ **Ne pas contester les arbitrages en validation** : en contester la mise en œuvre. +**Noms de fichier nus** — plusieurs existent dans deux crates ; dans cette fiche, sauf chemin +explicite : `pdf.rs` et `types.rs` = `crates/kesh-qrbill/src/` (pas `kesh-report`, pas +`kesh-import`) ; `dunning_eligibility.rs` = `crates/kesh-db/src/repositories/` (pas le fichier de +tests homonyme) ; `dunning_levels.rs` = **les deux** fichiers de ce nom, route et dépôt. *(Inventaire +fait en validation P5 : `find crates -name ` sur chaque nom nu de la fiche.)* + ## Story En tant que gérant d'une PME, @@ -272,6 +278,17 @@ tracée par **[#401]**. PDF régénérés et contrôlés **aplatis**. CHANGELOG ## Change Log +- **2026-09-27** — **Validation P5 ciblée** (Haiku, `d06b5c6c`, prompt `25-4-b2-validate-prompt-p5.md`) + — 2 findings rendus MEDIUM, **reclassés LOW** par l'orchestrateur : `pdf.rs` et `dunning_levels.rs` + nus et homonymes, mais sans numéro de ligne, et le contexte désigne le bon fichier (`pdf.rs` est + qualifié `kesh-qrbill` dans « Où regarder » ; « aucune écriture » vaut pour les deux + `dunning_levels.rs`). Traités **comme classe** : inventaire de tous les noms nus de la fiche et de + leurs homonymes (`pdf.rs`, `types.rs`, `dunning_eligibility.rs`, `dunning_levels.rs` ; `errors.rs` + et `credit_notes.rs` ne restent nus que dans le Change Log), et une convention en tête de fiche. + ⛔ **Boucle close en 5 passes** : `1H/3M/2L → 0 (+1M orchestrateur) → 5M/5L → 1M/2L → 0 >LOW`, + rotation Sonnet → Haiku → Opus → Sonnet → Haiku, deux passes ciblées ; toutes les corrections sur la + fiche. ⚠️ **M5 (le rappel papier) reste en attente d'arbitrage** : s'il ajoute du périmètre, une + passe de plus sera due. - **2026-09-27** — **Validation P4 ciblée** (Sonnet, `6197bffd`, prompt `25-4-b2-validate-prompt-p4.md`) — **1 MEDIUM, 2 LOW**, tous de référence : `credit_notes.rs:586`/`:325` sans chemin, alors que deux fichiers portent ce nom (le contenu est dans `kesh-db/src/repositories/`) ; `invoice_email.rs:510`/ From 46081964dd320cac7f651bac812aab65cb032ad8 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 22:21:00 +0200 Subject: [PATCH 48/51] =?UTF-8?q?docs(25-4-b2):=20M5=20hors=20p=C3=A9rim?= =?UTF-8?q?=C3=A8tre=20(#477),=20validation=20close=20(refs=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-4-b2-residuel-aux-rappels.md | 16 ++++++++++++---- .../implementation-artifacts/sprint-status.yaml | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md b/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md index 1f191276..11fc5ce6 100644 --- a/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md +++ b/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md @@ -195,7 +195,10 @@ variables propres au rappel — `{reminderLevel}`, `{reminderFee}` (frais du niv 3 autres locales, repli `settings/dunning/+page.svelte:263`) ne dit plus « le QR de la facture jointe » mais celui du **rappel joint**. ⚠️ Le manuel dit aussi, sans le corriger, qu'un client qui paie `{totalDue}` (reste + frais) sera refusé en trop-perçu : conséquence des frais non comptabilisés, -tracée par **[#401]**. PDF régénérés et contrôlés **aplatis**. CHANGELOG `[0.12.1]` *Fixed*. +tracée par **[#401]**. Et il dit la **limite du papier** : le PDF « Rappel » ne part qu'avec un rappel +**envoyé par e-mail** ; pour une sommation envoyée hors de Kesh (`user-manual.tex:1003`) ou un contact +sans e-mail, le PDF de la **facture** porte toujours le TTC complet dans sa QR — ne pas le joindre tel +quel à une facture partiellement réglée (**[#477]**). PDF régénérés et contrôlés **aplatis**. CHANGELOG `[0.12.1]` *Fixed*. ## Tasks / Subtasks @@ -262,9 +265,10 @@ tracée par **[#401]**. PDF régénérés et contrôlés **aplatis**. CHANGELOG - **Q2 — « déjà réglé » à zéro** : *« ok »*. Sans règlement ni avoir, le PDF ne montre que le total, qui est le reste à payer (AC 6). - **Signal de découpage P2 → P3 (MED → MED)** : *« ne découpe pas »* (Guy, 2026-09-27). -- **M5 — le rappel papier** : *« les 1er et 2ème rappels n'ont pas besoin d'être en recommandé »* - (Guy, 2026-09-27) — seul le **3ᵉ** (mise en demeure, `user-manual.tex:1003`) part en recommandé ; - suite de l'arbitrage en attente (§ Change Log). +- **M5 — le rappel papier** : *« les 1er et 2ème rappels n'ont pas besoin d'être en recommandé »*, + puis *« le troisième rappel, la sommation, sera envoyé par un autre moyen, pas par kesh (pour + l'instant) »* (Guy, 2026-09-27). ⇒ **Hors périmètre** : l'impression du PDF de rappel (sommation, + contact sans e-mail) est tracée par **[#477]** ; le manuel dit la limite (AC 11). ## Dev Agent Record @@ -278,6 +282,9 @@ tracée par **[#401]**. PDF régénérés et contrôlés **aplatis**. CHANGELOG ## Change Log +- **2026-09-27** — **M5 arbitré** (Guy) : la sommation part hors de Kesh pour l'instant ; l'impression du + PDF de rappel sort du périmètre, tracée par **#477** (ouverte) ; l'AC 11 ajoute la limite au manuel. + Changement de texte seul, issu d'un arbitrage et non d'un finding : pas de passe supplémentaire. - **2026-09-27** — **Validation P5 ciblée** (Haiku, `d06b5c6c`, prompt `25-4-b2-validate-prompt-p5.md`) — 2 findings rendus MEDIUM, **reclassés LOW** par l'orchestrateur : `pdf.rs` et `dunning_levels.rs` nus et homonymes, mais sans numéro de ligne, et le contexte désigne le bon fichier (`pdf.rs` est @@ -333,3 +340,4 @@ tracée par **[#401]**. PDF régénérés et contrôlés **aplatis**. CHANGELOG [#416]: https://github.com/guycorbaz/kesh/issues/416 [#476]: https://github.com/guycorbaz/kesh/issues/476 [#401]: https://github.com/guycorbaz/kesh/issues/401 +[#477]: https://github.com/guycorbaz/kesh/issues/477 diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index 67563d2a..a2dfd826 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -357,7 +357,7 @@ development_status: 25-3-annuler-reglement-et-rapprochement: split # [#414] [#418] — **l'Epic 24 a livre l'encaissement et le rapprochement ; il n'a PAS livre le moyen de les DEFAIRE.** Une erreur d'imputation est aujourd'hui incorrigible autrement qu'a la main — et le gel de la 24-4b interdit precisement la main. ⚠️ *C'est le prix d'une story qui ferme une porte sans ouvrir la suivante : le gel est juste, et il rend cette story-ci necessaire.* 25-4-a-residuel-juste: done # 2026-09-27 REVUE CLOSE EN 1 PASSE ; PR #472 OUVERTE (closes #455 #456), attend « merge ». # IMPLEMENTEE — 7/7 mutations tuees ; gates 2484/2484, 826/826, E2E 222/10/19 sans regression ; prochaine etape : code review. # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (masque a l'ecran, mais rendu par GET /invoices/{id} aux cles API : amountDue = la TVA sur une facture creditee) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE ; validation : P1 Sonnet 1H/3M/1L -> P2 Haiku 1M retenu -> P3 ciblee Opus 2M/5L -> P4 ciblee Sonnet 0 > LOW (1M reclasse LOW) : VALIDEE en 4 passes. Arbitrage 2026-09-27 : refus maintenu, levee tracee par #471. 25-4-b1-residuel-aux-agregats: done # 2026-09-27 revue CLOSE en 2 passes (2M/1L -> 0 >LOW), gates complets verts (2494, 834, E2E 225/8). # [#416, refs] balance agee + echeancier (totaux, colonne reste du, CSV, statut partiel, dialogue pre-rempli) + invariant balance agee = grand livre. CREEE ; validation P1 Sonnet 2M/3L -> P2 Haiku 0 (repris : 1M) -> P3 ciblee Opus 3M/3L : portee de l'invariant REECRITE PAR UNE REGLE ; issues #473 #474 ouvertes -> P4 1M -> P5 0 : VALIDEE en 5 passes. Signal MED->MED : pas de decoupage (Guy, 2026-09-27). Branche EMPILEE sur 25-4-a. - 25-4-b2-residuel-aux-rappels: ready-for-dev # 2026-09-27 CREEE : frais non comptabilises => QR = reste du SANS frais (regle existante, admin-manual:1200) ; PDF de rappel = variante titree ; Q1 ligne "Frais de rappel" et Q2 deja regle masque a zero, tranchees par Guy. # [#416, closes] le rappel reclame le reste du (texte, QR, PDF montant initial / deja regle / reste), frais configurables masques a zero ; point ouvert : frais non comptabilises. + 25-4-b2-residuel-aux-rappels: ready-for-dev # 2026-09-27 CREEE : frais non comptabilises => QR = reste du SANS frais (regle existante, admin-manual:1200) ; PDF de rappel = variante titree ; Q1 ligne "Frais de rappel", Q2 deja regle masque a zero, M5 papier hors perimetre (#477) ; validation CLOSE en 5 passes (1H/3M -> 0+1M -> 5M -> 1M -> 0 >LOW), pas de decoupage (Guy). # [#416, closes] le rappel reclame le reste du (texte, QR, PDF montant initial / deja regle / reste), frais configurables masques a zero ; point ouvert : frais non comptabilises. 25-4-b-residuel-aux-agregats: split # 2026-09-27 DECOUPEE en b1 (agregats) / b2 (rappels) — six modules apres les arbitrages Q1. # [#416] + montant des RELANCES (TTC complet, trouve a l'inventaire) — Q1 TRANCHEE 2026-09-27 : la QR du rappel porte le RESTE DU (= TTC sans reglement), reste a payer sur le PDF et dans le texte ; point ouvert : frais de rappel non comptabilises vs trop-percu. 25-4-c-residuel-au-rapprochement: backlog # [#420] — DEUX sites : filtre SQL des candidats (HAVING total_ttc) avant le score, puis score et re-score a l'acceptation. 25-4-d-solder-le-reste: backlog # [#384] ramenee de la 25-6 le 2026-09-27 (Guy) — perte sur debiteur, escompte, frais : clore une facture partiellement reglee ; la part TVA reduit la TVA due. From 7b20d6877494525fd2c6555fb85bf22c9259408e Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 23:09:55 +0200 Subject: [PATCH 49/51] =?UTF-8?q?feat(25-4-b2):=20le=20rappel=20r=C3=A9cla?= =?UTF-8?q?me=20le=20reste=20d=C3=BB=20=E2=80=94=20texte,=20PDF=20=C2=AB?= =?UTF-8?q?=20Rappel=20=C2=BB=20et=20QR=20(refs=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- CHANGELOG.md | 6 + .../25-4-b2-residuel-aux-rappels.md | 89 +++++- .../sprint-status.yaml | 2 +- crates/kesh-api/src/errors.rs | 14 + crates/kesh-api/src/routes/credit_notes.rs | 2 + crates/kesh-api/src/routes/invoice_email.rs | 161 ++++++++-- .../src/routes/invoice_pdf_service.rs | 275 +++++++++++++++++- .../kesh-api/tests/invoice_send_email_e2e.rs | 164 +++++++++++ crates/kesh-db/src/entities/email_template.rs | 5 + .../src/entities/email_template_defaults.rs | 76 +++-- crates/kesh-i18n/locales/de-CH/messages.ftl | 10 +- crates/kesh-i18n/locales/en-CH/messages.ftl | 10 +- crates/kesh-i18n/locales/fr-CH/messages.ftl | 10 +- crates/kesh-i18n/locales/it-CH/messages.ftl | 10 +- crates/kesh-i18n/src/loader.rs | 25 ++ crates/kesh-qrbill/src/lib.rs | 6 +- crates/kesh-qrbill/src/pdf.rs | 239 ++++++++++++++- crates/kesh-qrbill/src/types.rs | 36 +++ crates/kesh-qrbill/tests/golden_test.rs | 1 + docs/manual/fr/admin-manual.pdf | Bin 312734 -> 314317 bytes docs/manual/fr/admin-manual.tex | 14 +- docs/manual/fr/user-manual.pdf | Bin 293148 -> 298019 bytes docs/manual/fr/user-manual.tex | 23 +- docs/testing.md | 9 + .../reminders/reminder-error-label.test.ts | 4 + .../reminders/reminder-error-label.ts | 2 + .../(app)/settings/dunning/+page.svelte | 2 +- frontend/tests/e2e/dunning-roundtrip.spec.ts | 5 +- frontend/tests/e2e/reminders.spec.ts | 53 +++- 29 files changed, 1178 insertions(+), 75 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8eff70ad..b84f9262 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,12 @@ Le contenu est rédigé en français à destination des **fiduciaires, PME, ind - **La balance âgée et l'échéancier comptaient le montant facturé, et non ce que le client doit encore ([#416](https://github.com/guycorbaz/kesh/issues/416)).** Depuis le règlement partiel, une facture de 1'000.— réglée à 900.— y pesait toujours 1'000.—. ⚠️ La balance âgée est l'outil qui dit **qui relancer et pour combien** : elle surévaluait chaque créance de tout ce qui avait déjà été encaissé, sans que rien ne le signale, et ne concordait plus avec le compte clients du grand livre. Elle répartit désormais le **reste dû**, dans la tranche de l'échéance de la facture — un acompte ne rajeunit pas la créance. L'échéancier montre une colonne **« Reste dû »** à côté du total, le statut **« Partiellement payée »**, des totaux au reste dû, et son dialogue de règlement se **pré-remplit** au reste dû ; l'export CSV porte la même colonne. Le manuel dit à quelles conditions le total de la balance âgée égale le solde du compte clients. +- **Un rappel réclamait le montant entier d'une facture déjà réglée en partie ([#416](https://github.com/guycorbaz/kesh/issues/416)).** Une facture de 1 081.— réglée de 900.— était relancée pour **1 081.— plus les frais**, et le PDF joint — la facture elle-même — portait une QR-facture à 1 081.— : le client qui la scannait **payait une seconde fois** ce qu'il avait déjà réglé. Le rappel réclame désormais le **reste dû** : le courrier l'annonce (plus les frais s'il y en a), et le PDF joint est un **rappel** — il en porte le titre, dit ce qui est déjà réglé et ce qui reste à payer, et sa QR demande le reste, avec la **même référence** que la facture, pour que le rapprochement reconnaisse le paiement. + + **Les frais de rappel ne s'affichent plus quand ils sont nuls** — les modèles fournis écrivaient « frais de rappel de 0.00 ». Ils ne sont **jamais** dans la QR : ils ne sont pas comptabilisés ([#401](https://github.com/guycorbaz/kesh/issues/401)), et un versement qui les inclurait serait refusé comme trop-perçu ; le PDF les mentionne sur une ligne à part. + + ⚠️ **Le rappel PDF ne part qu'avec un rappel envoyé par e-mail.** Pour une mise en demeure envoyée hors de Kesh ou un contact sans e-mail, le PDF imprimable reste celui de la facture, au montant total ([#477](https://github.com/guycorbaz/kesh/issues/477)). ⚠️ **Un modèle de rappel personnalisé** qui écrit `{reminderFee}` en toutes lettres affiche toujours « 0.00 » sans frais : la nouvelle variable `{feeNotice}` est vide dans ce cas. + ### Changed - **Le bouton *Créer un avoir* s'affiche aussi sur une facture payée**, et c'est voulu. Il était masqué sur une facture payée mais pas sur une facture réglée en partie : l'écran ne couvrait que la moitié de la règle. Il reste désormais visible, et Kesh explique le refus dans le dialogue — comme le bouton *Dévalider*. diff --git a/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md b/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md index 11fc5ce6..cf605b82 100644 --- a/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md +++ b/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md @@ -1,6 +1,6 @@ # Story 25.4-b2 : Le résiduel aux rappels — le rappel réclame le reste dû -Status: ready-for-dev +Status: review **Issue : [#416]** — cette story en livre la partie **rappels** ; la partie agrégats est la 25-4-b1 (PR #475). ⛔ **La PR de b2 porte `closes #416`**, titre ET corps (§ *Issue Tracking Rule*). @@ -202,18 +202,18 @@ quel à une facture partiellement réglée (**[#477]**). PDF régénérés et co ## Tasks / Subtasks -- [ ] **T1 — texte** (AC 1-4) : `render_reminder`, `{feeNotice}` (liste blanche, phrase Rust par `Language` ×4, +- [x] **T1 — texte** (AC 1-4) : `render_reminder`, `{feeNotice}` (liste blanche, phrase Rust par `Language` ×4, rendu serveur), gabarits par défaut ×4 langues × niveaux. -- [ ] **T2 — PDF de rappel** (AC 5-8) : variante de `render` (paramètre explicite, pas de booléen +- [x] **T2 — PDF de rappel** (AC 5-8) : variante de `render` (paramètre explicite, pas de booléen muet, qui **porte les montants déjà calculés** — la construction des entrées QR reste testable sans base), champs optionnels dans `InvoicePdfData` sur le patron d'`origin_reference`, bloc sous le total dans `pdf.rs`, clés `I18N_KEYS`/`DEFAULT_EN` ajoutées **en fin** des deux tableaux, les deux appelants de rappel branchés. -- [ ] **T3 — refus du reste nul** (AC 9) : variant `AppError`, clé `error-*` ×4, `render_reminder` +- [x] **T3 — refus du reste nul** (AC 9) : variant `AppError`, clé `error-*` ×4, `render_reminder` et variante PDF, **deux** sites classés en lot, libellé du compte-rendu ×4. -- [ ] **T4 — tests et mutations** (AC 10). -- [ ] **T5 — textes** (AC 11). -- [ ] **T6 — gates** : backend complet (base remise à zéro), frontend complet, **E2E complet**. +- [x] **T4 — tests et mutations** (AC 10). +- [x] **T5 — textes** (AC 11). +- [x] **T6 — gates** : backend complet (base remise à zéro), frontend complet, **E2E complet**. ## Dev Notes @@ -274,14 +274,88 @@ quel à une facture partiellement réglée (**[#477]**). PDF régénérés et co ### Agent Model Used +Claude Opus 5.5 (`claude-opus-5-5`). + ### Debug Log References +- Clippy `too_many_arguments` sur `build_qrbill_inputs` (8 arguments avec `PdfDocument`) : `allow` + explicite, comme `build_reminder_vars`. +- Débordement LaTeX de 6 pt sur le paragraphe des variables (`user-manual.tex`) : `sloppypar`. Celui de + `admin-manual.tex:1163` (60 pt) est **préexistant** — premier élément de la liste, non touché. +- Le signe moins typographique (U+2212) devant « déjà réglé » n'existe pas dans l'encodage WinAnsi des + polices intégrées : tiret ASCII. + ### Completion Notes List +- **Deux écarts de mise en œuvre, qui servent l'intention mieux que la lettre** : + - **Le titre « Rappel » ne passe pas par une surcharge de `i18n.entries`** (patron de l'avoir) mais + par un champ `reminder: Option` d'`InvoicePdfData` : `draw_invoice_section` choisit + `invoice-pdf-reminder-title`, résolu par `build_i18n` dans la locale **passée à `render_document`** + (celle du contact). Le piège de locale de l'AC 5 disparaît **par construction**. + - **Les montants se calculent une fois** : `render_reminder` rend `(sujet, corps, ReminderAmounts)`, + et le lot passe **ces mêmes montants** au PDF — le texte et la QR ne peuvent pas diverger, même si + un règlement arrive entre les deux. Le variant reste classé dans `classify_render_error` (AC 9, + second site), en défense : `build_qrbill_inputs` refait `reminder_amount_due` sur les montants reçus. +- **Où vit le refus** : `reminder_amount_due` (arrondi `MidpointAwayFromZero`, puis refus ≤ 0.00) — + appelé par `reminder_amounts` (aperçu, lot, et unitaire **avant le SMTP**) et par + `build_qrbill_inputs`. `AppError::ReminderNothingDue` (422, `REMINDER_NOTHING_DUE`). +- **`{feeNotice}`** : Rust indexé par `Language` (patron `salutation_line`), précédé d'une espace, + vide à frais cumulés nuls ; les 16 bras des gabarits par défaut l'emploient, plus aucune phrase de + frais en dur. `{totalDue}` passe de « montant total dû » à « montant dû ». +- **Mutation exécutée** : retirer la hauteur du bloc de `recap_reserve` fait rougir + `reminder_block_is_reserved_in_the_capacity_guard` (« la réserve ne sert à rien ») — tuée, + restaurée par `sed` (qui date le fichier du présent, cf. l'incident de mutation de la b1). Les + autres tests échoueraient **par construction** sur le code d'avant (montants 128.10 / 972.90, + `facture-…pdf`, `INVOICE_NOT_PDF_READY`) ; non mutés un à un. +- **Tests ajoutés**, recomptés (`#[test]`/`#[sqlx::test]`/`it(` ajoutés dans le diff) : `kesh-db` 1, + `kesh-qrbill` 4, `kesh-api` 5 unitaires (dont `reminder_vars_ajoute_les_4_variables_rappel` + **renommé** et étendu, non compté) + 3 d'intégration, `kesh-i18n` 1 — **14** backend ; frontend 1 + Vitest ; Playwright 1 test ajouté (`reminders.spec.ts`), 1 assertion changée + (`dunning-roundtrip.spec.ts`). +- **Sept clés i18n × 4 locales** : cinq `invoice-pdf-*`, `error-reminder-nothing-due`, + `reminders-error-nothing-due` ; `dunning-cgv-hint` ×4 et son repli Svelte rectifiés. + +### Gates + +- Backend : base remise à zéro, `scripts/test-fast.sh` **2508 / 2508** (2494 + 14). +- Frontend : `check` 0 erreur (27 avertissements, préexistants), `lint-i18n-ownership` PASS, + `test:unit` **835 / 835** (834 + 1), build OK. +- E2E : ciblé `reminders.spec.ts` + `dunning-roundtrip.spec.ts` **10 / 10**. Complet, deux runs sur + `kesh_e2e` reconstruite : + - run 1 : **214 / 20 / 19** — les 7 KF-029, `product-revenue-account:133` (pollution répertoriée) et + **12 hors liste**, tous `page.fill('#username')` sur un `/login` en « Erreur 500 » : **12 / 12 verts + rejoués seuls**. Second passage du symptôme vu en b1 ⇒ **KF-053 ouverte ([#478])**, ajoutée à + `docs/testing.md` § « Les échecs attendus » ; + - run 2 : **224 / 10 / 19** — les 7 KF-029, `sidebar-navigation:75` (**KF-046, #424** : rouge rejoué + seul, déterministe), `bank-accounts-crud:112` et `setup:75` (**verts rejoués seuls** : pollution). + Conforme à la baseline. + ### File List +| Fichier | Nature | +|---|---| +| `crates/kesh-qrbill/src/types.rs`, `lib.rs` | `ReminderPdf`, champ `reminder`, 5 clés `I18N_KEYS`/`DEFAULT_EN` | +| `crates/kesh-qrbill/src/pdf.rs` | titre, bloc sous le total, réserve, `REMINDER_NOTE_MAX_CHARS`, 4 tests | +| `crates/kesh-qrbill/tests/golden_test.rs` | `reminder: None` | +| `crates/kesh-api/src/routes/invoice_pdf_service.rs` | `PdfDocument`, `ReminderAmounts`, `reminder_amount_due`, `reminder_amounts`, `render_document`, 3 tests | +| `crates/kesh-api/src/routes/invoice_email.rs` | `fee_notice`, `render_reminder`, unitaire, lot, classement, pièce jointe `rappel-`, 2 tests | +| `crates/kesh-api/src/routes/credit_notes.rs` | `reminder: None` | +| `crates/kesh-api/src/errors.rs` | `ReminderNothingDue` | +| `crates/kesh-api/tests/invoice_send_email_e2e.rs` | 3 tests d'intégration | +| `crates/kesh-db/src/entities/email_template.rs` | `feeNotice` en liste blanche | +| `crates/kesh-db/src/entities/email_template_defaults.rs` | 16 bras, 1 test | +| `crates/kesh-i18n/locales/{fr,de,it,en}-CH/messages.ftl`, `src/loader.rs` | 7 clés, `dunning-cgv-hint`, 1 test | +| `frontend/src/lib/features/reminders/reminder-error-label.ts` / `.test.ts` | `REMINDER_NOTHING_DUE` | +| `frontend/src/routes/(app)/settings/dunning/+page.svelte` | repli `dunning-cgv-hint` | +| `frontend/tests/e2e/reminders.spec.ts`, `dunning-roundtrip.spec.ts` | reste dû ; `rappel-…pdf` | +| `docs/manual/fr/user-manual.tex` / `.pdf`, `admin-manual.tex` / `.pdf` | ce que réclame un rappel, variables, QR, #401, #477 | +| `CHANGELOG.md` | *Fixed* | + ## Change Log +- **2026-09-27** — **Dev** : T1-T5 faits (§ *Completion Notes*) ; deux écarts de mise en œuvre écrits + (titre par champ plutôt que par surcharge de locale ; montants calculés une fois et partagés). + Gates verts (§ *Gates*) ; **KF-053 (#478) ouverte** pour le symptôme E2E revenu. Story en `review`. - **2026-09-27** — **M5 arbitré** (Guy) : la sommation part hors de Kesh pour l'instant ; l'impression du PDF de rappel sort du périmètre, tracée par **#477** (ouverte) ; l'AC 11 ajoute la limite au manuel. Changement de texte seul, issu d'un arbitrage et non d'un finding : pas de passe supplémentaire. @@ -341,3 +415,4 @@ quel à une facture partiellement réglée (**[#477]**). PDF régénérés et co [#476]: https://github.com/guycorbaz/kesh/issues/476 [#401]: https://github.com/guycorbaz/kesh/issues/401 [#477]: https://github.com/guycorbaz/kesh/issues/477 +[#478]: https://github.com/guycorbaz/kesh/issues/478 diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index a2dfd826..a9cb3acf 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -357,7 +357,7 @@ development_status: 25-3-annuler-reglement-et-rapprochement: split # [#414] [#418] — **l'Epic 24 a livre l'encaissement et le rapprochement ; il n'a PAS livre le moyen de les DEFAIRE.** Une erreur d'imputation est aujourd'hui incorrigible autrement qu'a la main — et le gel de la 24-4b interdit precisement la main. ⚠️ *C'est le prix d'une story qui ferme une porte sans ouvrir la suivante : le gel est juste, et il rend cette story-ci necessaire.* 25-4-a-residuel-juste: done # 2026-09-27 REVUE CLOSE EN 1 PASSE ; PR #472 OUVERTE (closes #455 #456), attend « merge ». # IMPLEMENTEE — 7/7 mutations tuees ; gates 2484/2484, 826/826, E2E 222/10/19 sans regression ; prochaine etape : code review. # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (masque a l'ecran, mais rendu par GET /invoices/{id} aux cles API : amountDue = la TVA sur une facture creditee) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE ; validation : P1 Sonnet 1H/3M/1L -> P2 Haiku 1M retenu -> P3 ciblee Opus 2M/5L -> P4 ciblee Sonnet 0 > LOW (1M reclasse LOW) : VALIDEE en 4 passes. Arbitrage 2026-09-27 : refus maintenu, levee tracee par #471. 25-4-b1-residuel-aux-agregats: done # 2026-09-27 revue CLOSE en 2 passes (2M/1L -> 0 >LOW), gates complets verts (2494, 834, E2E 225/8). # [#416, refs] balance agee + echeancier (totaux, colonne reste du, CSV, statut partiel, dialogue pre-rempli) + invariant balance agee = grand livre. CREEE ; validation P1 Sonnet 2M/3L -> P2 Haiku 0 (repris : 1M) -> P3 ciblee Opus 3M/3L : portee de l'invariant REECRITE PAR UNE REGLE ; issues #473 #474 ouvertes -> P4 1M -> P5 0 : VALIDEE en 5 passes. Signal MED->MED : pas de decoupage (Guy, 2026-09-27). Branche EMPILEE sur 25-4-a. - 25-4-b2-residuel-aux-rappels: ready-for-dev # 2026-09-27 CREEE : frais non comptabilises => QR = reste du SANS frais (regle existante, admin-manual:1200) ; PDF de rappel = variante titree ; Q1 ligne "Frais de rappel", Q2 deja regle masque a zero, M5 papier hors perimetre (#477) ; validation CLOSE en 5 passes (1H/3M -> 0+1M -> 5M -> 1M -> 0 >LOW), pas de decoupage (Guy). # [#416, closes] le rappel reclame le reste du (texte, QR, PDF montant initial / deja regle / reste), frais configurables masques a zero ; point ouvert : frais non comptabilises. + 25-4-b2-residuel-aux-rappels: review # 2026-09-27 DEV FAIT, gates verts (2508, 835, E2E conforme ; KF-053 #478 ouverte) ; revue de code a lancer. # 2026-09-27 CREEE : frais non comptabilises => QR = reste du SANS frais (regle existante, admin-manual:1200) ; PDF de rappel = variante titree ; Q1 ligne "Frais de rappel", Q2 deja regle masque a zero, M5 papier hors perimetre (#477) ; validation CLOSE en 5 passes (1H/3M -> 0+1M -> 5M -> 1M -> 0 >LOW), pas de decoupage (Guy). # [#416, closes] le rappel reclame le reste du (texte, QR, PDF montant initial / deja regle / reste), frais configurables masques a zero ; point ouvert : frais non comptabilises. 25-4-b-residuel-aux-agregats: split # 2026-09-27 DECOUPEE en b1 (agregats) / b2 (rappels) — six modules apres les arbitrages Q1. # [#416] + montant des RELANCES (TTC complet, trouve a l'inventaire) — Q1 TRANCHEE 2026-09-27 : la QR du rappel porte le RESTE DU (= TTC sans reglement), reste a payer sur le PDF et dans le texte ; point ouvert : frais de rappel non comptabilises vs trop-percu. 25-4-c-residuel-au-rapprochement: backlog # [#420] — DEUX sites : filtre SQL des candidats (HAVING total_ttc) avant le score, puis score et re-score a l'acceptation. 25-4-d-solder-le-reste: backlog # [#384] ramenee de la 25-6 le 2026-09-27 (Guy) — perte sur debiteur, escompte, frais : clore une facture partiellement reglee ; la part TVA reduit la TVA due. diff --git a/crates/kesh-api/src/errors.rs b/crates/kesh-api/src/errors.rs index a93bc1f6..8eeec26e 100644 --- a/crates/kesh-api/src/errors.rs +++ b/crates/kesh-api/src/errors.rs @@ -448,6 +448,12 @@ pub enum AppError { /// Story 21-5b — rappel sur une facture aux rappels suspendus. 422. #[error("Rappels suspendus pour cette facture")] DunningPaused, + /// Story 25-4-b2 (#416) — rappel d'une facture dont le reste dû, arrondi au + /// centime, est nul ou négatif (état hérité : trop-perçu d'avant la 0.12.1). + /// Refus NOMMÉ plutôt qu'un `INVOICE_NOT_PDF_READY` trompeur (la QR refuse + /// un montant ≤ 0). 422. + #[error("Rien à réclamer sur cette facture")] + ReminderNothingDue, /// Story 21-5b — envoi d'un niveau de rappel > prochain attendu (saut interdit, /// ou niveau déjà couvert par un envoi concurrent). 409. #[error("Niveau de rappel déjà couvert")] @@ -1317,6 +1323,14 @@ impl IntoResponse for AppError { "Les rappels sont suspendus pour cette facture.", ), ), + AppError::ReminderNothingDue => build_response( + StatusCode::UNPROCESSABLE_ENTITY, + "REMINDER_NOTHING_DUE", + &t( + "error-reminder-nothing-due", + "Il ne reste rien à réclamer sur cette facture : aucun rappel à envoyer.", + ), + ), AppError::LevelAlreadySent => build_response( StatusCode::CONFLICT, "LEVEL_ALREADY_SENT", diff --git a/crates/kesh-api/src/routes/credit_notes.rs b/crates/kesh-api/src/routes/credit_notes.rs index 83ccb395..bc931807 100644 --- a/crates/kesh-api/src/routes/credit_notes.rs +++ b/crates/kesh-api/src/routes/credit_notes.rs @@ -258,6 +258,8 @@ fn build_credit_note_pdf_data( total: ttc, currency: Currency::Chf, origin_reference, + // Un avoir n'est jamais un rappel (Story 25-4-b2). + reminder: None, } } diff --git a/crates/kesh-api/src/routes/invoice_email.rs b/crates/kesh-api/src/routes/invoice_email.rs index 68e4bde8..318c2955 100644 --- a/crates/kesh-api/src/routes/invoice_email.rs +++ b/crates/kesh-api/src/routes/invoice_email.rs @@ -205,10 +205,34 @@ pub(crate) fn days_overdue(due_date: Option, today: chrono::N due_date.map(|d| (today - d).num_days().max(0)).unwrap_or(0) } +/// `{feeNotice}` (Story 25-4-b2, #416) : la phrase qui dit les frais **cumulés** +/// compris dans `{totalDue}`, **précédée d'une espace** — elle se colle à la fin de +/// la phrase du montant dans les gabarits par défaut. **Vide** quand il n'y a pas +/// de frais : le moteur de gabarits n'a pas de condition, c'est la seule façon de +/// ne rien afficher à zéro (arbitrage de Guy : « si 0, ne rien afficher »). +/// +/// En Rust indexé par `Language`, comme [`salutation_line`] : le builder est pur +/// et n'a pas le bundle Fluent. +fn fee_notice(fees: &rust_decimal::Decimal, language: Language) -> String { + if *fees <= rust_decimal::Decimal::ZERO { + return String::new(); + } + let amount = format_money(fees); + match language { + Language::Fr => format!(" Ce montant comprend des frais de rappel de {amount}."), + Language::De => format!(" Dieser Betrag enthält Mahngebühren von {amount}."), + Language::It => format!(" Questo importo comprende spese di sollecito di {amount}."), + Language::En => format!(" This amount includes reminder fees of {amount}."), + } +} + /// Variables de substitution pour un rappel débiteur (Story 21-5b) : les 6 variables -/// de base de [`build_invoice_vars`] (`amount` = TTC facture) + les 4 spécifiques rappel. -/// `total_due`/`reminder_fee`/`days_overdue`/`level_number` sont **pré-calculés** par -/// l'appelant (le builder reste pur, sans accès DB). +/// de base de [`build_invoice_vars`] (`amount` = TTC facture) + les 5 spécifiques rappel. +/// `total_due`/`reminder_fee`/`fees_total`/`days_overdue`/`level_number` sont +/// **pré-calculés** par l'appelant (le builder reste pur, sans accès DB). +/// +/// ⛔ Story 25-4-b2 : `total_due` est le **reste dû** plus les frais cumulés, pas le +/// TTC ; `{amount}` reste le TTC de la facture. #[allow(clippy::too_many_arguments)] pub(crate) fn build_reminder_vars( invoice: &kesh_db::entities::Invoice, @@ -218,12 +242,14 @@ pub(crate) fn build_reminder_vars( language: Language, level_number: i16, reminder_fee: &rust_decimal::Decimal, + fees_total: &rust_decimal::Decimal, total_due: &rust_decimal::Decimal, days_overdue: i64, ) -> HashMap { let mut vars = build_invoice_vars(invoice, lines, contact, company, language); vars.insert("reminderLevel".to_string(), level_number.to_string()); vars.insert("reminderFee".to_string(), format_money(reminder_fee)); + vars.insert("feeNotice".to_string(), fee_notice(fees_total, language)); vars.insert("totalDue".to_string(), format_money(total_due)); vars.insert("daysOverdue".to_string(), days_overdue.to_string()); vars @@ -307,9 +333,13 @@ fn next_reminder_level( .min() } -/// Calcule `{totalDue}`, `{reminderFee}`, `{daysOverdue}` puis rend subject+body d'un -/// rappel de niveau `level` pour la facture (helper partagé preview/preview-lot). -/// `total_due` = TTC + Σ frais non-annulés dédupliqués (hors niveau courant) + frais du niveau. +/// Calcule `{totalDue}`, `{reminderFee}`, `{feeNotice}`, `{daysOverdue}` puis rend +/// subject+body d'un rappel de niveau `level` pour la facture (helper partagé +/// aperçu / lot). Rend aussi les **montants** : le lot les passe au PDF, si bien +/// que le texte et la QR ne peuvent pas diverger. +/// +/// `total_due` = **reste dû** (arrondi au centime) + frais cumulés — Story 25-4-b2 +/// (#416) ; avant, le TTC. Reste ≤ 0 → `AppError::ReminderNothingDue`. #[allow(clippy::too_many_arguments)] async fn render_reminder( state: &AppState, @@ -320,18 +350,16 @@ async fn render_reminder( language: Language, level_number: i16, level_fee: &rust_decimal::Decimal, -) -> Result<(String, String), AppError> { - let ttc = kesh_core::accounting::vat::invoice_total_ttc( - lines.iter().map(|l| (l.line_total, l.vat_rate)), - ); - let other_fees = invoice_reminders::sum_fees_deduped_excluding( +) -> Result<(String, String, invoice_pdf_service::ReminderAmounts), AppError> { + let amounts = invoice_pdf_service::reminder_amounts( &state.pool, company.id, invoice.id, level_number, + *level_fee, ) .await?; - let total_due = ttc + other_fees + *level_fee; + let total_due = amounts.amount_due + amounts.fees; let today = chrono::Utc::now().naive_utc().date(); let days = days_overdue(invoice.due_date, today); @@ -351,12 +379,13 @@ async fn render_reminder( language, level_number, level_fee, + &amounts.fees, &total_due, days, ); let subject = kesh_core::email_template_engine::render(&template.subject, &vars); let body = kesh_core::email_template_engine::render(&template.body, &vars); - Ok((subject, body)) + Ok((subject, body, amounts)) } /// `GET /api/v1/invoices/{id}/reminder-preview?level=N` — Comptable+ (Story 21-5b). @@ -382,7 +411,7 @@ pub async fn preview_reminder_email( let contact = load_active_contact(&state.pool, invoice.contact_id, company.id).await?; let language = resolve_language(&contact, &company); - let (subject, body) = render_reminder( + let (subject, body, _amounts) = render_reminder( &state, &company, &invoice, @@ -496,8 +525,26 @@ pub async fn send_reminder( validate_text_len(&body, REMINDER_BODY_MAX, "corps")?; let language = resolve_language(&contact, &company); let locale = kesh_i18n::Locale::from(language.as_str()); - let rendered = - invoice_pdf_service::render(&state.pool, &state.i18n, locale, &company, id).await?; + // Story 25-4-b2 (#416) : le texte vient de l'aperçu (déjà édité), mais le PDF + // est un RAPPEL dont la QR porte le reste dû — calculé ICI, avant le SMTP, ce + // qui refuse aussi un reste nul (`ReminderNothingDue`) avant tout envoi. + let amounts = invoice_pdf_service::reminder_amounts( + &state.pool, + company.id, + id, + req.level_number, + level.fee_amount, + ) + .await?; + let rendered = invoice_pdf_service::render_document( + &state.pool, + &state.i18n, + locale, + &company, + id, + invoice_pdf_service::PdfDocument::Reminder(amounts), + ) + .await?; let email = OutgoingEmail { to: to.clone(), @@ -506,7 +553,7 @@ pub async fn send_reminder( from_display_name: Some(company.name.clone()), reply_to: company.email.clone(), attachment: Some(EmailAttachment { - filename: format!("facture-{}.pdf", rendered.filename_base), + filename: format!("rappel-{}.pdf", rendered.filename_base), content_type: "application/pdf".to_string(), bytes: rendered.bytes, }), @@ -944,10 +991,24 @@ fn classify_render_error(e: AppError, invoice_id: i64) -> BatchItemError { AppError::InvoiceNotPdfReady(_) | AppError::InvoiceTooManyLinesForPdf(_) | AppError::InvoicePdfHeaderOverflow => BatchItemError::failed("INVOICE_NOT_PDF_READY"), + // Story 25-4-b2 (#416) — reste dû nul : un refus métier, pas une panne. + AppError::ReminderNothingDue => BatchItemError::failed("REMINDER_NOTHING_DUE"), other => BatchItemError::infra("render pdf", invoice_id, other), } } +/// Classe une erreur de [`render_reminder`] pour la boucle du lot (Story 25-4-b2, +/// #416). Même règle que [`classify_render_error`] : le refus métier est énuméré, +/// le bras final est réservé aux pannes. ⛔ Avant cette story, TOUTE erreur de +/// `render_reminder` partait en `infra` — le refus du reste nul y serait ressorti +/// en `DATABASE_ERROR`, avec une fausse alerte d'infrastructure. +fn classify_reminder_render_error(e: AppError, invoice_id: i64) -> BatchItemError { + match e { + AppError::ReminderNothingDue => BatchItemError::failed("REMINDER_NOTHING_DUE"), + other => BatchItemError::infra("render reminder", invoice_id, other), + } +} + #[derive(Debug, Serialize)] #[serde(rename_all = "camelCase")] pub struct SendReminderBatchResponse { @@ -1111,11 +1172,11 @@ async fn send_one_batch_reminder( .ok_or_else(|| BatchItemError::failed("CONTACT_EMAIL_MISSING"))?; let language = resolve_language(&contact, company); - let (subject, body) = render_reminder( + let (subject, body, amounts) = render_reminder( state, company, &invoice, &lines, &contact, language, next_level, &level_fee, ) .await - .map_err(|e| BatchItemError::infra("render reminder", invoice_id, e))?; + .map_err(|e| classify_reminder_render_error(e, invoice_id))?; if subject.trim().is_empty() || body.trim().is_empty() { return Err(BatchItemError::failed("REMINDER_CONTENT_EMPTY")); } @@ -1137,10 +1198,18 @@ async fn send_one_batch_reminder( // toutes les écraser sur `INVOICE_NOT_PDF_READY` (AC 12 énumère les codes // séparément). Le bras final ne fourre PAS les pannes d'infra dans un code // métier (review Pass 2) : les causes métier sont énumérées explicitement. - let rendered = - invoice_pdf_service::render(&state.pool, &state.i18n, locale, company, invoice_id) - .await - .map_err(|e| classify_render_error(e, invoice_id))?; + // Story 25-4-b2 : le PDF reçoit les montants DU TEXTE — texte et QR ne + // peuvent pas diverger, même si un règlement arrive entre-temps. + let rendered = invoice_pdf_service::render_document( + &state.pool, + &state.i18n, + locale, + company, + invoice_id, + invoice_pdf_service::PdfDocument::Reminder(amounts), + ) + .await + .map_err(|e| classify_render_error(e, invoice_id))?; // Rate-limit : consomme 1 slot par e-mail (le pré-check a garanti la capacité, mais un // envoi concurrent peut avoir consommé entre-temps → RATE_LIMITED per-facture). @@ -1161,7 +1230,7 @@ async fn send_one_batch_reminder( from_display_name: Some(company.name.clone()), reply_to: company.email.clone(), attachment: Some(EmailAttachment { - filename: format!("facture-{}.pdf", rendered.filename_base), + filename: format!("rappel-{}.pdf", rendered.filename_base), content_type: "application/pdf".to_string(), bytes: rendered.bytes, }), @@ -1491,7 +1560,7 @@ mod tests { } #[test] - fn reminder_vars_ajoute_les_4_variables_rappel() { + fn reminder_vars_ajoute_les_variables_rappel() { let invoice = sample_invoice(Some("F-2026-0042"), NaiveDate::from_ymd_opt(2026, 6, 30)); let vars = build_reminder_vars( &invoice, @@ -1501,10 +1570,13 @@ mod tests { Language::Fr, 2, &Decimal::new(2000, 2), // 20.00 (frais niveau 2) + &Decimal::new(2500, 2), // 25.00 (frais cumulés) &Decimal::new(135456, 2), // 1354.56 (total dû) 45, ); - // 10 variables = les 6 base + 4 rappel (allowed_variables InvoiceReminder). + // 11 variables = les 6 base + 5 rappel (allowed_variables InvoiceReminder) — + // dont `feeNotice` (Story 25-4-b2) : la liste blanche et le builder vont + // ensemble, ce test les tient d'accord. let mut keys: Vec<&str> = vars.keys().map(String::as_str).collect(); keys.sort_unstable(); let mut expected = EmailTemplateType::InvoiceReminder @@ -1517,6 +1589,41 @@ mod tests { assert_eq!(vars["totalDue"], "1\u{2019}354.56", "apostrophe U+2019"); assert_eq!(vars["daysOverdue"], "45", "entier brut, pas format_money"); assert_eq!(vars["amount"], "1\u{2019}334.56", "TTC facture inchangé"); + assert_eq!( + vars["feeNotice"], " Ce montant comprend des frais de rappel de 25.00.", + "les frais CUMULÉS, pas ceux du seul niveau" + ); + } + + /// Story 25-4-b2 (AC 2, 3) — `{feeNotice}` est VIDE sans frais, dans les 4 + /// langues, et dit le montant sinon : « à zéro, rien ne s'affiche ». + #[test] + fn fee_notice_est_vide_sans_frais() { + for language in [Language::Fr, Language::De, Language::It, Language::En] { + assert_eq!(fee_notice(&Decimal::ZERO, language), "", "{language:?}"); + let notice = fee_notice(&Decimal::new(2000, 2), language); + assert!( + notice.starts_with(' '), + "{language:?} : colle à la phrase précédente" + ); + assert!(notice.contains("20.00"), "{language:?} : {notice}"); + } + } + + /// Story 25-4-b2 (AC 9) — ⛔ en lot, le refus du reste nul est un échec MÉTIER + /// par facture ; avant la story, toute erreur de `render_reminder` partait en + /// `DATABASE_ERROR`. Symétrique de `classify_render_error_ne_deguise_pas_un_refus_en_panne`. + #[test] + fn classify_reminder_render_error_ne_deguise_pas_le_reste_nul_en_panne() { + assert_eq!( + classify_reminder_render_error(AppError::ReminderNothingDue, 1).code(), + "REMINDER_NOTHING_DUE" + ); + assert_eq!( + classify_reminder_render_error(AppError::Internal("pool fermé".into()), 1).code(), + "DATABASE_ERROR", + "une panne d'infrastructure doit rester détectée comme telle" + ); } #[test] @@ -1567,6 +1674,8 @@ mod tests { "INVOICE_NOT_PDF_READY", ), (AppError::InvoicePdfHeaderOverflow, "INVOICE_NOT_PDF_READY"), + // Story 25-4-b2 (#416) — second site du lot : le rendu du PDF de rappel. + (AppError::ReminderNothingDue, "REMINDER_NOTHING_DUE"), ]; for (err, attendu) in metier { let libelle = format!("{err:?}"); diff --git a/crates/kesh-api/src/routes/invoice_pdf_service.rs b/crates/kesh-api/src/routes/invoice_pdf_service.rs index 9cd5aeac..ec8e8f1b 100644 --- a/crates/kesh-api/src/routes/invoice_pdf_service.rs +++ b/crates/kesh-api/src/routes/invoice_pdf_service.rs @@ -15,14 +15,16 @@ use kesh_db::entities::{BankAccount, Company, Invoice, InvoiceLine, contact::Contact}; use kesh_db::errors::DbError; -use kesh_db::repositories::{bank_accounts, contacts, invoices}; +use kesh_db::repositories::{ + bank_accounts, contacts, invoice_reminders, invoice_settlements, invoices, +}; use kesh_i18n::Locale; use kesh_qrbill::{ Address, AddressType, Currency, InvoiceLinePdf, InvoicePdfData, InvoiceVatLinePdf, QrBillData, - QrBillError, QrBillI18n, Reference, + QrBillError, QrBillI18n, Reference, ReminderPdf, validation::{build_qrr, normalize_iban}, }; -use rust_decimal::Decimal; +use rust_decimal::{Decimal, RoundingStrategy}; use std::collections::HashMap; use crate::errors::AppError; @@ -74,6 +76,72 @@ pub struct RenderedInvoicePdf { pub filename_base: String, } +/// Le document à produire (Story 25-4-b2, #416) : la facture, ou un **rappel** +/// pour le montant restant. Un paramètre qui dit ce qu'il porte, plutôt qu'un +/// booléen : `render_document(…, PdfDocument::Invoice)` se relit. +#[derive(Debug, Clone, Copy, PartialEq)] +pub enum PdfDocument { + /// La facture : titre « Facture », QR au TTC — inchangée (téléchargement, + /// envoi et renvoi de facture). + Invoice, + /// Un rappel : titre « Rappel », bloc réglé / reste / frais, QR au **reste + /// dû**. Les montants sont **déjà calculés** par [`reminder_amounts`] — la + /// construction des entrées QR reste testable sans base. + Reminder(ReminderAmounts), +} + +/// Les montants d'un rappel, calculés **une fois** et partagés par le texte +/// (`{totalDue}`), le PDF et la QR (Story 25-4-b2, AC 7). +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct ReminderAmounts { + /// Total des règlements enregistrés. + pub amount_settled: Decimal, + /// Reste dû **arrondi au centime** (`MidpointAwayFromZero`), strictement + /// positif — le montant de la QR. + pub amount_due: Decimal, + /// Frais cumulés : ceux des niveaux déjà émis (dédupliqués, hors niveau + /// courant) plus ceux du niveau envoyé. ⛔ Jamais dans la QR : ils ne sont pas + /// comptabilisés (#401), un virement qui les inclurait serait refusé. + pub fees: Decimal, +} + +/// Arrondit un reste dû brut au centime et refuse ce qui ne se réclame pas +/// (Story 25-4-b2, AC 7 et 9). Le refus porte sur la valeur **arrondie** : un +/// reste de 0.004 est refusé ici, au lieu d'atteindre une QR invalide et de +/// ressortir en `INVOICE_NOT_PDF_READY`. +pub fn reminder_amount_due(raw: Decimal) -> Result { + let due = raw.round_dp_with_strategy(2, RoundingStrategy::MidpointAwayFromZero); + if due <= Decimal::ZERO { + return Err(AppError::ReminderNothingDue); + } + Ok(due) +} + +/// Calcule les montants d'un rappel de niveau `level_number` (Story 25-4-b2). +/// +/// Le reste dû vient d'`invoice_settlements::amount_due` (forme scalaire : une +/// facture à la fois) — jamais réécrit. ⚠️ `amount_due` et `amount_settled` ne +/// prennent pas de `company_id` : l'appelant DOIT avoir chargé la facture par +/// `find_by_id_with_lines(pool, company.id, …)`, qui porte le scoping. +pub async fn reminder_amounts( + pool: &sqlx::MySqlPool, + company_id: i64, + invoice_id: i64, + level_number: i16, + level_fee: Decimal, +) -> Result { + let amount_due = reminder_amount_due(invoice_settlements::amount_due(pool, invoice_id).await?)?; + let amount_settled = invoice_settlements::amount_settled(pool, invoice_id).await?; + let other_fees = + invoice_reminders::sum_fees_deduped_excluding(pool, company_id, invoice_id, level_number) + .await?; + Ok(ReminderAmounts { + amount_settled, + amount_due, + fees: other_fees + level_fee, + }) +} + /// Génère le PDF QR-facture d'une facture **validée**, scopée à /// `company` (anti-IDOR). /// @@ -93,6 +161,28 @@ pub async fn render( locale: Locale, company: &Company, invoice_id: i64, +) -> Result { + render_document( + pool, + i18n, + locale, + company, + invoice_id, + PdfDocument::Invoice, + ) + .await +} + +/// [`render`], pour un document au choix : la facture, ou un rappel (Story +/// 25-4-b2). Le titre du rappel est résolu dans `locale` — celle du contact +/// pour un envoi —, pas dans celle de l'installation. +pub async fn render_document( + pool: &sqlx::MySqlPool, + i18n: &kesh_i18n::I18nBundle, + locale: Locale, + company: &Company, + invoice_id: i64, + document: PdfDocument, ) -> Result { // Chargement facture + lignes (scopé company). let (invoice, lines) = invoices::find_by_id_with_lines(pool, company.id, invoice_id) @@ -143,6 +233,7 @@ pub async fn render( &primary_bank, &creditor_country, &debtor_country, + document, )?; let qr_i18n = build_i18n(i18n, locale); @@ -159,6 +250,7 @@ pub async fn render( } /// Convertit les entités DB en `QrBillData` + `InvoicePdfData`. +#[allow(clippy::too_many_arguments)] fn build_qrbill_inputs( invoice: &Invoice, lines: &[InvoiceLine], @@ -167,6 +259,7 @@ fn build_qrbill_inputs( primary_bank: &BankAccount, creditor_country: &str, debtor_country: &str, + document: PdfDocument, ) -> Result<(QrBillData, InvoicePdfData), AppError> { // Adresse créancier — STRUCTURÉE type S (#213, conformité SIX 21.11.2025). let ca = company.structured_address(); @@ -236,11 +329,31 @@ fn build_qrbill_inputs( lines.iter().map(|l| (l.line_total, l.vat_rate)), ); + // Story 25-4-b2 (#416, AC 7) : la QR d'un rappel porte le RESTE DÛ — la même + // valeur, déjà arrondie, que le texte et le bloc imprimé. ⛔ La référence et + // le message ci-dessous ne dépendent PAS du document : c'est ce que lit le + // rapprochement. + let (qr_amount, reminder) = match document { + PdfDocument::Invoice => (total_ttc, None), + PdfDocument::Reminder(a) => { + // Défense : `reminder_amounts` ne produit jamais un reste ≤ 0. + let due = reminder_amount_due(a.amount_due)?; + ( + due, + Some(ReminderPdf { + amount_settled: a.amount_settled, + amount_due: due, + fees: a.fees, + }), + ) + } + }; + let qr_data = QrBillData { creditor_iban: iban, creditor: creditor.clone(), ultimate_debtor: Some(debtor.clone()), - amount: Some(total_ttc), + amount: Some(qr_amount), currency: Currency::Chf, reference, unstructured_message: invoice.invoice_number.as_ref().map(|n| { @@ -301,6 +414,7 @@ fn build_qrbill_inputs( total: total_ttc, currency: Currency::Chf, origin_reference: None, + reminder, }; Ok((qr_data, pdf_data)) @@ -561,6 +675,7 @@ mod tests { &primary_bank(), "CH", "CH", + PdfDocument::Invoice, ) .expect("le montage doit produire un PDF exploitable"); @@ -600,6 +715,7 @@ mod tests { &primary_bank(), "CH", "CH", + PdfDocument::Invoice, ) .expect("le montage doit produire un PDF exploitable"); @@ -627,6 +743,7 @@ mod tests { &primary_bank(), "CH", "CH", + PdfDocument::Invoice, ) .expect("le montage doit produire un PDF exploitable"); @@ -648,9 +765,159 @@ mod tests { &primary_bank(), "CH", "CH", + PdfDocument::Invoice, ) .expect("le montage doit produire un PDF exploitable"); assert!(data.debtor_client_number.is_none()); } + + // ─── Story 25-4-b2 (#416) — le PDF de rappel ────────────────────────── + + /// Une ligne à TVA non nulle : 1 000.— HT à 8,1 % = 1 081.— TTC. + fn lines_1081() -> Vec { + vec![kesh_db::entities::InvoiceLine { + id: 1, + invoice_id: 1, + position: 1, + description: "Prestation".into(), + quantity: dec!(1), + unit_price: dec!(1000.00), + vat_rate: dec!(8.10), + line_total: dec!(1000.00), + revenue_account_id: None, + created_at: chrono::NaiveDateTime::default(), + }] + } + + fn qr_bank() -> kesh_db::entities::BankAccount { + kesh_db::entities::BankAccount { + qr_iban: Some("CH4431999123000889012".into()), + ..primary_bank() + } + } + + fn inputs( + bank: &kesh_db::entities::BankAccount, + document: PdfDocument, + ) -> (QrBillData, InvoicePdfData) { + build_qrbill_inputs( + &invoice(), + &lines_1081(), + &contact_with_structured_address(), + &company_with_contact_details(), + bank, + "CH", + "CH", + document, + ) + .expect("montage exploitable") + } + + /// AC 7 — ⛔ la QR du rappel d'une facture réglée en partie porte le RESTE + /// DÛ ; la référence (QRR ou aucune) et le message sont ceux de la facture, + /// à l'identique — c'est ce que lit le rapprochement. Les frais n'y sont pas. + #[test] + fn reminder_qr_carries_the_amount_due_and_keeps_the_reference() { + let amounts = ReminderAmounts { + amount_settled: dec!(900.00), + amount_due: dec!(181.00), + fees: dec!(20.00), + }; + for bank in [primary_bank(), qr_bank()] { + let (facture_qr, facture_pdf) = inputs(&bank, PdfDocument::Invoice); + let (rappel_qr, rappel_pdf) = inputs(&bank, PdfDocument::Reminder(amounts)); + + assert_eq!( + facture_qr.amount, + Some(dec!(1081.00)), + "la facture reste au TTC" + ); + assert_eq!( + rappel_qr.amount, + Some(dec!(181.00)), + "le rappel au reste, sans frais" + ); + assert_eq!( + rappel_qr.reference, facture_qr.reference, + "référence identique" + ); + assert_eq!( + rappel_qr.unstructured_message, facture_qr.unstructured_message, + "message identique" + ); + assert!( + facture_pdf.reminder.is_none(), + "la facture n'est pas un rappel" + ); + let r = rappel_pdf.reminder.expect("le rappel porte son bloc"); + assert_eq!(r.amount_due, dec!(181.00), "même valeur que la QR"); + assert_eq!(r.amount_settled, dec!(900.00)); + assert_eq!(r.fees, dec!(20.00)); + assert_eq!( + rappel_pdf.total, + dec!(1081.00), + "le total imprimé reste le TTC" + ); + } + // Anti-vacuité : la branche QR-IBAN porte bien une QRR. + assert!(matches!( + inputs(&qr_bank(), PdfDocument::Invoice).0.reference, + Reference::Qrr(_) + )); + } + + /// AC 7 et 9 — un seul arrondi, au centime, loin de zéro ; le refus porte sur + /// la valeur ARRONDIE. + #[test] + fn reminder_amount_due_rounds_once_and_refuses_nothing_due() { + assert_eq!(reminder_amount_due(dec!(181.0000)).unwrap(), dec!(181.00)); + assert_eq!(reminder_amount_due(dec!(10.0050)).unwrap(), dec!(10.01)); + for rien in [dec!(0), dec!(0.0040), dec!(-40.00)] { + assert!( + matches!(reminder_amount_due(rien), Err(AppError::ReminderNothingDue)), + "{rien} ne se réclame pas" + ); + } + // Défense : des montants de rappel à reste nul ne passent pas non plus + // au montage des entrées QR. + let nul = ReminderAmounts { + amount_settled: dec!(1081.00), + amount_due: dec!(0.00), + fees: dec!(0), + }; + assert!(matches!( + build_qrbill_inputs( + &invoice(), + &lines_1081(), + &contact_with_structured_address(), + &company_with_contact_details(), + &primary_bank(), + "CH", + "CH", + PdfDocument::Reminder(nul), + ), + Err(AppError::ReminderNothingDue) + )); + } + + /// AC 8 — ⚠️ la mention des frais court sur toute la largeur utile ; les + /// gardes du PDF ne surveillent que l'ordonnée. Sa traduction, dans les 4 + /// locales réelles, tient dans `REMINDER_NOTE_MAX_CHARS` — l'allemand est le + /// plus long. + #[test] + fn reminder_fees_note_fits_its_width_in_all_four_locales() { + let dir = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../kesh-i18n/locales"); + let bundle = kesh_i18n::I18nBundle::load(&dir).unwrap(); + for locale in [Locale::FrCh, Locale::DeCh, Locale::ItCh, Locale::EnCh] { + let note = build_i18n(&bundle, locale) + .get("invoice-pdf-reminder-fees-note") + .to_string(); + assert!( + note.chars().count() <= kesh_qrbill::REMINDER_NOTE_MAX_CHARS, + "{locale:?} : « {note} » dépasse {} caractères", + kesh_qrbill::REMINDER_NOTE_MAX_CHARS + ); + } + } } diff --git a/crates/kesh-api/tests/invoice_send_email_e2e.rs b/crates/kesh-api/tests/invoice_send_email_e2e.rs index 67f443f7..24feb511 100644 --- a/crates/kesh-api/tests/invoice_send_email_e2e.rs +++ b/crates/kesh-api/tests/invoice_send_email_e2e.rs @@ -2104,3 +2104,167 @@ async fn send_reminder_batch_partial_success(pool: MySqlPool) { "BATCH_TOO_LARGE" ); } + +// ─── Story 25-4-b2 (#416) — le rappel réclame le reste dû ───────────────────── + +/// Règle `amount` sur la facture par compte interne (caisse 1000), à une date +/// postérieure à la facture du montage (14.04.2026). +async fn settle( + pool: &MySqlPool, + admin_id: i64, + company_id: i64, + invoice_id: i64, + amount: rust_decimal::Decimal, +) { + let (cash,): (i64,) = + sqlx::query_as("SELECT id FROM accounts WHERE company_id = ? AND number = '1000'") + .bind(company_id) + .fetch_one(pool) + .await + .unwrap(); + kesh_db::repositories::invoice_settlements_write::settle_invoice( + pool, + admin_id, + company_id, + invoice_id, + kesh_db::entities::SettlementChoice::InternalAccount { account_id: cash }, + amount, + NaiveDate::from_ymd_opt(2026, 5, 20).unwrap(), + ) + .await + .expect("règlement"); +} + +/// AC 1, 2, 10 — l'aperçu d'un rappel sur une facture RÉGLÉE EN PARTIE réclame +/// le reste dû plus les frais : 108.10 réglée de 40 → reste 68.10 ; niveau 2 +/// (frais 20.00) → `{totalDue}` = 88.10, et non 128.10 (TTC + frais). Niveau 1 +/// (frais nuls) : 68.10, et aucune phrase de frais. +#[sqlx::test(migrations = "../kesh-db/test-schema")] +async fn reminder_preview_claims_the_amount_due(pool: MySqlPool) { + let (admin_id, company_id, invoice_id) = seed_sendable(&pool).await; + seed_dunning(&pool, company_id).await; + settle(&pool, admin_id, company_id, invoice_id, dec!(40.00)).await; + let app = spawn_app(pool.clone(), MockMailer::new(), true, 20).await; + let token = login(&app, "admin", TEST_ADMIN_PASSWORD).await; + + let preview = |level: i16| { + app.client + .get(app.url(&format!( + "/api/v1/invoices/{invoice_id}/reminder-preview?level={level}" + ))) + .bearer_auth(&token) + .send() + }; + let body: serde_json::Value = preview(2).await.unwrap().json().await.unwrap(); + let text = body["body"].as_str().unwrap(); + assert!(text.contains("88.10"), "reste 68.10 + frais 20.00 : {text}"); + assert!(!text.contains("128.10"), "plus le TTC + frais : {text}"); + assert!( + text.contains("108.10"), + "{{amount}} reste le TTC de la facture : {text}" + ); + assert!( + text.contains("frais de rappel de 20.00"), + "{{feeNotice}} dit les frais : {text}" + ); + + let body: serde_json::Value = preview(1).await.unwrap().json().await.unwrap(); + let text = body["body"].as_str().unwrap(); + assert!( + text.contains("68.10"), + "niveau 1 sans frais : le reste seul : {text}" + ); + assert!( + !text.to_lowercase().contains("frais"), + "à zéro, rien ne s'affiche : {text}" + ); +} + +/// AC 5 — l'envoi unitaire joint un RAPPEL, nommé comme tel. +#[sqlx::test(migrations = "../kesh-db/test-schema")] +async fn send_reminder_attaches_a_reminder_pdf(pool: MySqlPool) { + let mock = MockMailer::new(); + let (admin_id, company_id, invoice_id) = seed_sendable(&pool).await; + seed_dunning(&pool, company_id).await; + settle(&pool, admin_id, company_id, invoice_id, dec!(40.00)).await; + let app = spawn_app(pool.clone(), mock.clone(), true, 20).await; + let token = login(&app, "admin", TEST_ADMIN_PASSWORD).await; + + let resp = app + .client + .post(app.url(&format!("/api/v1/invoices/{invoice_id}/reminders/send"))) + .bearer_auth(&token) + .json(&json!({ "levelNumber": 1, "subject": "Rappel", "body": "Corps." })) + .send() + .await + .unwrap(); + assert_eq!(resp.status(), 201); + let sent = mock.sent_emails(); + let name = sent[0].attachment_filename.as_deref().unwrap(); + assert!( + name.starts_with("rappel-") && name.ends_with(".pdf"), + "la pièce jointe est un rappel : {name}" + ); +} + +/// AC 9 — reste dû nul sur une facture validée sans `paid_at` (état hérité, +/// fabriqué en SQL) : refus NOMMÉ `REMINDER_NOTHING_DUE` à l'aperçu, à l'envoi +/// unitaire — avant le SMTP — et, en lot, en échec PAR FACTURE, pas en +/// `DATABASE_ERROR`. +#[sqlx::test(migrations = "../kesh-db/test-schema")] +async fn reminder_with_nothing_due_is_refused_by_name(pool: MySqlPool) { + let mock = MockMailer::new(); + let (admin_id, company_id, invoice_id) = seed_sendable(&pool).await; + seed_dunning(&pool, company_id).await; + settle(&pool, admin_id, company_id, invoice_id, dec!(108.10)).await; + sqlx::query("UPDATE invoices SET paid_at = NULL WHERE id = ?") + .bind(invoice_id) + .execute(&pool) + .await + .unwrap(); + let app = spawn_app(pool.clone(), mock.clone(), true, 20).await; + let token = login(&app, "admin", TEST_ADMIN_PASSWORD).await; + + let preview = app + .client + .get(app.url(&format!( + "/api/v1/invoices/{invoice_id}/reminder-preview?level=1" + ))) + .bearer_auth(&token) + .send() + .await + .unwrap(); + assert_eq!(preview.status(), 422); + let body: serde_json::Value = preview.json().await.unwrap(); + assert_eq!(body["error"]["code"], "REMINDER_NOTHING_DUE", "{body}"); + + let unit = app + .client + .post(app.url(&format!("/api/v1/invoices/{invoice_id}/reminders/send"))) + .bearer_auth(&token) + .json(&json!({ "levelNumber": 1, "subject": "Rappel", "body": "Corps." })) + .send() + .await + .unwrap(); + assert_eq!(unit.status(), 422); + assert_eq!(mock.sent_emails().len(), 0, "refusé AVANT le SMTP"); + + let batch = app + .client + .post(app.url("/api/v1/dunning/reminders/send-batch")) + .bearer_auth(&token) + .json(&json!({ "invoiceIds": [invoice_id] })) + .send() + .await + .unwrap(); + assert_eq!(batch.status(), 200); + let body: serde_json::Value = batch.json().await.unwrap(); + let failed = body["failed"].as_array().unwrap(); + assert_eq!(failed.len(), 1, "{body}"); + assert_eq!( + failed[0]["errorCode"], "REMINDER_NOTHING_DUE", + "pas DATABASE_ERROR" + ); + assert_eq!(mock.sent_emails().len(), 0); + assert_eq!(reminder_count(&pool, invoice_id).await, 0); +} diff --git a/crates/kesh-db/src/entities/email_template.rs b/crates/kesh-db/src/entities/email_template.rs index 40b0040e..6ab79e5b 100644 --- a/crates/kesh-db/src/entities/email_template.rs +++ b/crates/kesh-db/src/entities/email_template.rs @@ -71,6 +71,11 @@ impl EmailTemplateType { "reminderFee", "totalDue", "daysOverdue", + // Story 25-4-b2 (#416) : phrase disant les frais cumulés compris + // dans `{totalDue}`, précédée d'une espace — VIDE sans frais. Le + // moteur n'a pas de condition : c'est la seule façon de ne rien + // afficher à zéro. + "feeNotice", ], } } diff --git a/crates/kesh-db/src/entities/email_template_defaults.rs b/crates/kesh-db/src/entities/email_template_defaults.rs index a2b49a88..f446496e 100644 --- a/crates/kesh-db/src/entities/email_template_defaults.rs +++ b/crates/kesh-db/src/entities/email_template_defaults.rs @@ -68,6 +68,10 @@ fn invoice_send_default(language: Language) -> (&'static str, &'static str) { /// (courtois → ferme → mise en demeure avant poursuite) ; le bras `_` (niveau 0 /// générique ou ≥ 4) est un rappel neutre-ferme. N'utilise que des tokens déclarés /// dans `allowed_variables(InvoiceReminder)` (`reminderLevel` volontairement non utilisé). +/// +/// ⛔ Story 25-4-b2 (#416) : aucune phrase de frais n'est écrite en dur — les +/// frais passent par `{feeNotice}`, vide quand ils sont nuls. `{totalDue}` est le +/// **reste dû** plus les frais cumulés ; `{amount}` reste le TTC de la facture. fn reminder_default(language: Language, level_number: i16) -> (&'static str, &'static str) { match (language, level_number) { // ---- Français ---- @@ -76,7 +80,7 @@ fn reminder_default(language: Language, level_number: i16) -> (&'static str, &'s "{salutation},\n\n\ Sauf erreur de notre part, la facture {invoiceNumber} d'un montant de {amount}, \ échue le {dueDate}, demeure impayée à ce jour ({daysOverdue} jours de retard).\n\n\ - Nous vous remercions de bien vouloir régler le montant dû de {totalDue} dans les meilleurs délais.\n\n\ + Nous vous remercions de bien vouloir régler le montant dû de {totalDue} dans les meilleurs délais.{feeNotice}\n\n\ Avec nos meilleures salutations,\n{companyName}", ), (Language::Fr, 2) => ( @@ -84,7 +88,7 @@ fn reminder_default(language: Language, level_number: i16) -> (&'static str, &'s "{salutation},\n\n\ Malgré notre premier rappel, la facture {invoiceNumber} de {amount}, échue le {dueDate}, \ reste impayée ({daysOverdue} jours de retard).\n\n\ - Des frais de rappel de {reminderFee} ont été ajoutés ; le montant total dû s'élève désormais à {totalDue}. \ + Le montant dû s'élève à {totalDue}.{feeNotice} \ Nous vous invitons à le régler sous huitaine.\n\n\ Avec nos salutations,\n{companyName}", ), @@ -93,8 +97,8 @@ fn reminder_default(language: Language, level_number: i16) -> (&'static str, &'s "{salutation},\n\n\ La facture {invoiceNumber} de {amount}, échue le {dueDate}, demeure impayée malgré nos rappels \ ({daysOverdue} jours de retard).\n\n\ - Nous vous mettons en demeure de régler le montant total dû de {totalDue} \ - (frais de rappel de {reminderFee} inclus) sans délai. À défaut de paiement, \ + Nous vous mettons en demeure de régler le montant dû de {totalDue} sans délai.{feeNotice} \ + À défaut de paiement, \ nous engagerons une procédure de recouvrement sans autre avis.\n\n\ {companyName}", ), @@ -103,7 +107,7 @@ fn reminder_default(language: Language, level_number: i16) -> (&'static str, &'s "{salutation},\n\n\ La facture {invoiceNumber} d'un montant de {amount}, échue le {dueDate}, \ reste impayée ({daysOverdue} jours de retard).\n\n\ - Nous vous prions de régler le montant total dû de {totalDue} dans les meilleurs délais.\n\n\ + Nous vous prions de régler le montant dû de {totalDue} dans les meilleurs délais.{feeNotice}\n\n\ Avec nos meilleures salutations,\n{companyName}", ), // ---- Deutsch ---- @@ -112,7 +116,7 @@ fn reminder_default(language: Language, level_number: i16) -> (&'static str, &'s "{salutation}\n\n\ Sofern sich unsere Angaben mit den Ihren decken, ist die Rechnung {invoiceNumber} über {amount}, \ fällig am {dueDate}, bis heute unbeglichen ({daysOverdue} Tage überfällig).\n\n\ - Wir bitten Sie, den offenen Betrag von {totalDue} baldmöglichst zu begleichen.\n\n\ + Wir bitten Sie, den offenen Betrag von {totalDue} baldmöglichst zu begleichen.{feeNotice}\n\n\ Freundliche Grüsse\n{companyName}", ), (Language::De, 2) => ( @@ -120,7 +124,7 @@ fn reminder_default(language: Language, level_number: i16) -> (&'static str, &'s "{salutation}\n\n\ Trotz unserer ersten Erinnerung ist die Rechnung {invoiceNumber} über {amount}, \ fällig am {dueDate}, weiterhin offen ({daysOverdue} Tage überfällig).\n\n\ - Wir haben Mahngebühren von {reminderFee} erhoben; der Gesamtbetrag beläuft sich nun auf {totalDue}. \ + Der offene Betrag beläuft sich auf {totalDue}.{feeNotice} \ Wir bitten um Begleichung innert acht Tagen.\n\n\ Freundliche Grüsse\n{companyName}", ), @@ -129,8 +133,8 @@ fn reminder_default(language: Language, level_number: i16) -> (&'static str, &'s "{salutation}\n\n\ Die Rechnung {invoiceNumber} über {amount}, fällig am {dueDate}, ist trotz mehrfacher Mahnung \ unbeglichen ({daysOverdue} Tage überfällig).\n\n\ - Wir fordern Sie letztmals auf, den Gesamtbetrag von {totalDue} (inkl. Mahngebühren von {reminderFee}) \ - unverzüglich zu begleichen. Andernfalls leiten wir ohne weitere Ankündigung die Betreibung ein.\n\n\ + Wir fordern Sie letztmals auf, den offenen Betrag von {totalDue} \ + unverzüglich zu begleichen.{feeNotice} Andernfalls leiten wir ohne weitere Ankündigung die Betreibung ein.\n\n\ {companyName}", ), (Language::De, _) => ( @@ -138,7 +142,7 @@ fn reminder_default(language: Language, level_number: i16) -> (&'static str, &'s "{salutation}\n\n\ Die Rechnung {invoiceNumber} über {amount}, fällig am {dueDate}, ist offen \ ({daysOverdue} Tage überfällig).\n\n\ - Wir bitten Sie, den Gesamtbetrag von {totalDue} baldmöglichst zu begleichen.\n\n\ + Wir bitten Sie, den offenen Betrag von {totalDue} baldmöglichst zu begleichen.{feeNotice}\n\n\ Freundliche Grüsse\n{companyName}", ), // ---- Italiano ---- @@ -147,7 +151,7 @@ fn reminder_default(language: Language, level_number: i16) -> (&'static str, &'s "{salutation},\n\n\ Salvo errore da parte nostra, la fattura {invoiceNumber} di {amount}, scaduta il {dueDate}, \ risulta ancora non saldata ({daysOverdue} giorni di ritardo).\n\n\ - La preghiamo di saldare l'importo dovuto di {totalDue} al più presto.\n\n\ + La preghiamo di saldare l'importo dovuto di {totalDue} al più presto.{feeNotice}\n\n\ Distinti saluti,\n{companyName}", ), (Language::It, 2) => ( @@ -155,7 +159,7 @@ fn reminder_default(language: Language, level_number: i16) -> (&'static str, &'s "{salutation},\n\n\ Nonostante il nostro primo sollecito, la fattura {invoiceNumber} di {amount}, scaduta il {dueDate}, \ risulta ancora non saldata ({daysOverdue} giorni di ritardo).\n\n\ - Sono state applicate spese di sollecito di {reminderFee}; l'importo totale dovuto ammonta ora a {totalDue}. \ + L'importo dovuto ammonta a {totalDue}.{feeNotice} \ La invitiamo a saldarlo entro otto giorni.\n\n\ Distinti saluti,\n{companyName}", ), @@ -164,8 +168,8 @@ fn reminder_default(language: Language, level_number: i16) -> (&'static str, &'s "{salutation},\n\n\ La fattura {invoiceNumber} di {amount}, scaduta il {dueDate}, risulta non saldata nonostante i nostri solleciti \ ({daysOverdue} giorni di ritardo).\n\n\ - La diffidiamo a saldare l'importo totale dovuto di {totalDue} (spese di sollecito di {reminderFee} incluse) \ - senza indugio. In mancanza di pagamento, avvieremo una procedura esecutiva senza ulteriore avviso.\n\n\ + La diffidiamo a saldare l'importo dovuto di {totalDue} \ + senza indugio.{feeNotice} In mancanza di pagamento, avvieremo una procedura esecutiva senza ulteriore avviso.\n\n\ {companyName}", ), (Language::It, _) => ( @@ -173,7 +177,7 @@ fn reminder_default(language: Language, level_number: i16) -> (&'static str, &'s "{salutation},\n\n\ La fattura {invoiceNumber} di {amount}, scaduta il {dueDate}, risulta non saldata \ ({daysOverdue} giorni di ritardo).\n\n\ - La preghiamo di saldare l'importo totale dovuto di {totalDue} al più presto.\n\n\ + La preghiamo di saldare l'importo dovuto di {totalDue} al più presto.{feeNotice}\n\n\ Distinti saluti,\n{companyName}", ), // ---- English ---- @@ -182,7 +186,7 @@ fn reminder_default(language: Language, level_number: i16) -> (&'static str, &'s "{salutation},\n\n\ Unless our records are mistaken, invoice {invoiceNumber} for {amount}, due on {dueDate}, \ remains unpaid ({daysOverdue} days overdue).\n\n\ - We kindly ask you to settle the amount due of {totalDue} at your earliest convenience.\n\n\ + We kindly ask you to settle the amount due of {totalDue} at your earliest convenience.{feeNotice}\n\n\ Kind regards,\n{companyName}", ), (Language::En, 2) => ( @@ -190,7 +194,7 @@ fn reminder_default(language: Language, level_number: i16) -> (&'static str, &'s "{salutation},\n\n\ Despite our first reminder, invoice {invoiceNumber} for {amount}, due on {dueDate}, \ remains unpaid ({daysOverdue} days overdue).\n\n\ - A reminder fee of {reminderFee} has been added; the total amount due is now {totalDue}. \ + The amount due is {totalDue}.{feeNotice} \ Please settle it within eight days.\n\n\ Kind regards,\n{companyName}", ), @@ -199,8 +203,8 @@ fn reminder_default(language: Language, level_number: i16) -> (&'static str, &'s "{salutation},\n\n\ Invoice {invoiceNumber} for {amount}, due on {dueDate}, remains unpaid despite our reminders \ ({daysOverdue} days overdue).\n\n\ - We formally request payment of the total amount due of {totalDue} (including a reminder fee of {reminderFee}) \ - without delay. Failing payment, we will initiate debt-collection proceedings without further notice.\n\n\ + We formally request payment of the amount due of {totalDue} \ + without delay.{feeNotice} Failing payment, we will initiate debt-collection proceedings without further notice.\n\n\ {companyName}", ), (Language::En, _) => ( @@ -208,7 +212,7 @@ fn reminder_default(language: Language, level_number: i16) -> (&'static str, &'s "{salutation},\n\n\ Invoice {invoiceNumber} for {amount}, due on {dueDate}, remains unpaid \ ({daysOverdue} days overdue).\n\n\ - Please settle the total amount due of {totalDue} at your earliest convenience.\n\n\ + Please settle the amount due of {totalDue} at your earliest convenience.{feeNotice}\n\n\ Kind regards,\n{companyName}", ), } @@ -245,4 +249,36 @@ mod tests { } } } + /// Story 25-4-b2 (AC 3) — à frais nuls (`{feeNotice}` vide), aucun rappel par + /// défaut ne parle de frais, dans aucune langue ni à aucun niveau. Avant la + /// story, les niveaux 2 et 3 écrivaient « frais de rappel de {reminderFee} » + /// en dur — soit « frais de 0.00 » sans frais configurés. + #[test] + fn reminder_defaults_say_nothing_of_fees_when_there_are_none() { + let mut vars = std::collections::HashMap::new(); + for name in EmailTemplateType::InvoiceReminder.allowed_variables() { + vars.insert(name.to_string(), "X".to_string()); + } + vars.insert("feeNotice".to_string(), String::new()); + for language in [Language::Fr, Language::De, Language::It, Language::En] { + for level in 0..=4 { + let (subject, body) = + default_template(EmailTemplateType::InvoiceReminder, language, level); + let text = + kesh_core::email_template_engine::render(&format!("{subject} {body}"), &vars) + .to_lowercase(); + for word in ["frais", "gebühr", "spese", "fee"] { + assert!( + !text.contains(word), + "{language:?}/niv{level} parle de frais sans frais : « {word} »" + ); + } + // Anti-vacuité : le gabarit porte bien la variable. + assert!( + format!("{subject} {body}").contains("{feeNotice}"), + "{language:?}/niv{level} n'emploie pas {{feeNotice}}" + ); + } + } + } } diff --git a/crates/kesh-i18n/locales/de-CH/messages.ftl b/crates/kesh-i18n/locales/de-CH/messages.ftl index 883ca037..20fe04b2 100644 --- a/crates/kesh-i18n/locales/de-CH/messages.ftl +++ b/crates/kesh-i18n/locales/de-CH/messages.ftl @@ -594,6 +594,12 @@ invoice-pdf-phone = Tel. invoice-pdf-email = E-Mail invoice-pdf-website = Web invoice-pdf-client-number = Kundennummer +# Story 25-4-b2 (#416) — le PDF joint à un rappel. +invoice-pdf-reminder-title = Mahnung +invoice-pdf-settled = Bereits bezahlt +invoice-pdf-amount-due = Noch zu bezahlen +invoice-pdf-reminder-fees = Mahngebühren +invoice-pdf-reminder-fees-note = Die Mahngebühren sind im Einzahlungsschein nicht enthalten. invoice-pdf-recipient = Empfänger invoice-pdf-description = Beschreibung invoice-pdf-quantity = Menge @@ -1432,7 +1438,7 @@ dunning-edit = Bearbeiten dunning-delete = Löschen dunning-example-heading = Voraussichtlicher Zeitplan dunning-example-line = { $level }. Mahnung { $days } Tage nach Fälligkeit vorgeschlagen -dunning-cgv-hint = Mahngebühren sind nur mit einer vertraglichen Grundlage (AGB) geschuldet. Sie sind nicht im QR der beigefügten Rechnung enthalten. +dunning-cgv-hint = Mahngebühren sind nur mit einer vertraglichen Grundlage (AGB) geschuldet. Sie sind nicht im QR der beigefügten Mahnung enthalten. dunning-delay-label = Frist (Tage) dunning-delay-help = Tage seit dem vorherigen Schritt (Fälligkeit + Karenz für die 1.). dunning-fee-label = Gebühr (CHF) @@ -1505,6 +1511,8 @@ reminders-error-contact-email-missing = Kontakt ohne E-Mail-Adresse reminders-error-content-empty = Mahnvorlage leer reminders-error-content-too-long = Mahninhalt zu lang reminders-error-not-pdf-ready = Rechnung nicht als PDF druckbar +reminders-error-nothing-due = Nichts offen +error-reminder-nothing-due = Auf dieser Rechnung ist nichts mehr offen: keine Mahnung zu versenden. reminders-error-rate-limited = Sendelimit erreicht reminders-error-database-error = Technischer Fehler reminders-error-smtp-failed = E-Mail-Versand fehlgeschlagen diff --git a/crates/kesh-i18n/locales/en-CH/messages.ftl b/crates/kesh-i18n/locales/en-CH/messages.ftl index 7842a8f6..0a27de13 100644 --- a/crates/kesh-i18n/locales/en-CH/messages.ftl +++ b/crates/kesh-i18n/locales/en-CH/messages.ftl @@ -594,6 +594,12 @@ invoice-pdf-phone = Phone invoice-pdf-email = Email invoice-pdf-website = Web invoice-pdf-client-number = Client no. +# Story 25-4-b2 (#416) — le PDF joint à un rappel. +invoice-pdf-reminder-title = Reminder +invoice-pdf-settled = Already paid +invoice-pdf-amount-due = Amount due +invoice-pdf-reminder-fees = Reminder fees +invoice-pdf-reminder-fees-note = Reminder fees are not included in the payment slip. invoice-pdf-recipient = Recipient invoice-pdf-description = Description invoice-pdf-quantity = Qty @@ -1437,7 +1443,7 @@ dunning-edit = Edit dunning-delete = Delete dunning-example-heading = Projected schedule dunning-example-line = Reminder { $level } proposed { $days } days after the due date -dunning-cgv-hint = Reminder fees are only due with a contractual basis (T&Cs). They are not included in the QR of the attached invoice. +dunning-cgv-hint = Reminder fees are only due with a contractual basis (T&Cs). They are not included in the QR of the attached reminder. dunning-delay-label = Delay (days) dunning-delay-help = Days since the previous step (due date + grace for the 1st). dunning-fee-label = Fee (CHF) @@ -1510,6 +1516,8 @@ reminders-error-contact-email-missing = Contact without e-mail address reminders-error-content-empty = Reminder template empty reminders-error-content-too-long = Reminder content too long reminders-error-not-pdf-ready = Invoice not printable as PDF +reminders-error-nothing-due = Nothing due +error-reminder-nothing-due = Nothing is left to claim on this invoice: no reminder to send. reminders-error-rate-limited = Send limit reached reminders-error-database-error = Technical error reminders-error-smtp-failed = E-mail sending failed diff --git a/crates/kesh-i18n/locales/fr-CH/messages.ftl b/crates/kesh-i18n/locales/fr-CH/messages.ftl index efec23fe..6a842246 100644 --- a/crates/kesh-i18n/locales/fr-CH/messages.ftl +++ b/crates/kesh-i18n/locales/fr-CH/messages.ftl @@ -623,6 +623,12 @@ invoice-pdf-phone = Tél. invoice-pdf-email = E-mail invoice-pdf-website = Web invoice-pdf-client-number = N° client +# Story 25-4-b2 (#416) — le PDF joint à un rappel. +invoice-pdf-reminder-title = Rappel +invoice-pdf-settled = Déjà réglé +invoice-pdf-amount-due = Reste à payer +invoice-pdf-reminder-fees = Frais de rappel +invoice-pdf-reminder-fees-note = Les frais de rappel ne sont pas compris dans le bulletin de versement. invoice-pdf-recipient = Destinataire invoice-pdf-description = Description invoice-pdf-quantity = Qté @@ -1525,7 +1531,7 @@ dunning-edit = Modifier dunning-delete = Supprimer dunning-example-heading = Échéancier prévisionnel dunning-example-line = { $level }. rappel proposé { $days } j après l'échéance -dunning-cgv-hint = Les frais de rappel ne sont exigibles qu'avec une base contractuelle (CGV). Ils ne sont pas inclus dans le QR de la facture jointe. +dunning-cgv-hint = Les frais de rappel ne sont exigibles qu'avec une base contractuelle (CGV). Ils ne sont pas inclus dans le QR du rappel joint. dunning-delay-label = Délai (jours) dunning-delay-help = Jours depuis l'étape précédente (échéance + grâce pour le 1er). dunning-fee-label = Frais (CHF) @@ -1602,6 +1608,8 @@ reminders-error-contact-email-missing = Contact sans adresse e-mail reminders-error-content-empty = Modèle de rappel vide reminders-error-content-too-long = Contenu du rappel trop long reminders-error-not-pdf-ready = Facture non imprimable en PDF +reminders-error-nothing-due = Rien à réclamer +error-reminder-nothing-due = Il ne reste rien à réclamer sur cette facture : aucun rappel à envoyer. reminders-error-rate-limited = Limite d'envoi atteinte reminders-error-database-error = Erreur technique reminders-error-smtp-failed = Échec de l'envoi e-mail diff --git a/crates/kesh-i18n/locales/it-CH/messages.ftl b/crates/kesh-i18n/locales/it-CH/messages.ftl index 627734b4..c6716cf1 100644 --- a/crates/kesh-i18n/locales/it-CH/messages.ftl +++ b/crates/kesh-i18n/locales/it-CH/messages.ftl @@ -594,6 +594,12 @@ invoice-pdf-phone = Tel. invoice-pdf-email = E-mail invoice-pdf-website = Web invoice-pdf-client-number = N. cliente +# Story 25-4-b2 (#416) — le PDF joint à un rappel. +invoice-pdf-reminder-title = Sollecito +invoice-pdf-settled = Già pagato +invoice-pdf-amount-due = Rimanenza da pagare +invoice-pdf-reminder-fees = Spese di sollecito +invoice-pdf-reminder-fees-note = Le spese di sollecito non sono comprese nella polizza di versamento. invoice-pdf-recipient = Destinatario invoice-pdf-description = Descrizione invoice-pdf-quantity = Qtà @@ -1430,7 +1436,7 @@ dunning-edit = Modifica dunning-delete = Elimina dunning-example-heading = Scadenzario previsionale dunning-example-line = { $level }° sollecito proposto { $days } g dopo la scadenza -dunning-cgv-hint = Le spese di sollecito sono esigibili solo con una base contrattuale (CGC). Non sono incluse nel QR della fattura allegata. +dunning-cgv-hint = Le spese di sollecito sono esigibili solo con una base contrattuale (CGC). Non sono incluse nel QR del sollecito allegato. dunning-delay-label = Scadenza (giorni) dunning-delay-help = Giorni dalla fase precedente (scadenza + tolleranza per il 1°). dunning-fee-label = Spese (CHF) @@ -1503,6 +1509,8 @@ reminders-error-contact-email-missing = Contatto senza indirizzo e-mail reminders-error-content-empty = Modello di sollecito vuoto reminders-error-content-too-long = Contenuto del sollecito troppo lungo reminders-error-not-pdf-ready = Fattura non stampabile in PDF +reminders-error-nothing-due = Nulla da esigere +error-reminder-nothing-due = Su questa fattura non resta nulla da esigere: nessun sollecito da inviare. reminders-error-rate-limited = Limite di invio raggiunto reminders-error-database-error = Errore tecnico reminders-error-smtp-failed = Invio e-mail non riuscito diff --git a/crates/kesh-i18n/src/loader.rs b/crates/kesh-i18n/src/loader.rs index 0c27528e..83c48f8b 100644 --- a/crates/kesh-i18n/src/loader.rs +++ b/crates/kesh-i18n/src/loader.rs @@ -276,6 +276,31 @@ mod tests { } } + /// **Story 25-4-b2 (#416)** — les libellés du PDF de rappel et le refus du + /// reste nul existent dans les quatre locales, et ne replient pas sur le + /// français (même mécanisme que la KF #283, cf. le test précédent). + #[test] + fn reminder_pdf_labels_are_translated_in_all_four_locales() { + let bundle = I18nBundle::load(&locales_dir()).unwrap(); + for key in [ + "invoice-pdf-reminder-title", + "invoice-pdf-settled", + "invoice-pdf-amount-due", + "invoice-pdf-reminder-fees", + "invoice-pdf-reminder-fees-note", + "error-reminder-nothing-due", + "reminders-error-nothing-due", + ] { + let fr = bundle.format(&Locale::FrCh, key, None); + assert_ne!(fr, key, "{key} doit exister en fr-CH"); + for locale in [Locale::DeCh, Locale::ItCh, Locale::EnCh] { + let msg = bundle.format(&locale, key, None); + assert_ne!(msg, key, "{key} doit exister en {locale:?}"); + assert_ne!(msg, fr, "{key} en {locale:?} replie sur le français"); + } + } + } + /// **Story 22-2b (#301)** — les quatre libellés des sondes anti-doublon /// existent dans les quatre locales. /// diff --git a/crates/kesh-qrbill/src/lib.rs b/crates/kesh-qrbill/src/lib.rs index 40fef2d8..48fd5e21 100644 --- a/crates/kesh-qrbill/src/lib.rs +++ b/crates/kesh-qrbill/src/lib.rs @@ -18,11 +18,11 @@ pub mod validation; pub use generator::build_payload; pub use parser::{ScannedAddress, ScannedQrBill, ScannedReference, parse_spc_payload}; pub use pdf::{ - generate_credit_note_pdf, generate_credit_note_pdf_with_date, generate_qr_bill_pdf, - generate_qr_bill_pdf_with_date, + REMINDER_NOTE_MAX_CHARS, generate_credit_note_pdf, generate_credit_note_pdf_with_date, + generate_qr_bill_pdf, generate_qr_bill_pdf_with_date, }; pub use types::{ Address, AddressType, Currency, InvoiceLinePdf, InvoicePdfData, InvoiceVatLinePdf, QrBillData, - QrBillError, QrBillI18n, Reference, + QrBillError, QrBillI18n, Reference, ReminderPdf, }; pub use validation::validate; diff --git a/crates/kesh-qrbill/src/pdf.rs b/crates/kesh-qrbill/src/pdf.rs index 263ce8bf..c046437e 100644 --- a/crates/kesh-qrbill/src/pdf.rs +++ b/crates/kesh-qrbill/src/pdf.rs @@ -9,7 +9,7 @@ //! Uses `BuiltinFont::Helvetica` (PDF standard 14) — no external font embedding. use crate::generator::{build_payload, render_qr_image}; -use crate::types::{InvoicePdfData, QrBillData, QrBillError, QrBillI18n, Reference}; +use crate::types::{InvoicePdfData, QrBillData, QrBillError, QrBillI18n, Reference, ReminderPdf}; use chrono::{Datelike, NaiveDate}; use kesh_core::text::is_invisible; use printpdf::{ @@ -463,8 +463,15 @@ fn draw_invoice_section( // Title + metadata (right). let meta_x = 120.0; let meta_title_y = PAGE_H - 20.0; + // Story 25-4-b2 (#416) : un rappel n'est pas la facture réémise — il le dit + // en titre. La clé est résolue dans la locale que l'appelant a passée. + let title_key = if inv.reminder.is_some() { + "invoice-pdf-reminder-title" + } else { + "invoice-pdf-title" + }; layer.use_text( - i18n.get("invoice-pdf-title"), + i18n.get(title_key), 18.0, Mm(meta_x), Mm(meta_title_y), @@ -583,7 +590,7 @@ fn draw_invoice_section( 0.0 } else { 4.5 + 4.5 * inv.vat_lines.len() as f32 + 1.0 - }; + } + reminder_block_height(inv.reminder.as_ref()); for line in &inv.lines { if ty < content_floor + 15.0 + recap_reserve { @@ -697,6 +704,27 @@ fn draw_invoice_section( helv_bold, ); + // Story 25-4-b2 (#416) — le bloc du rappel, sous le total. Sa hauteur est + // RÉSERVÉE dans `recap_reserve` (garde `TooManyLines`) : ⛔ ne pas le traiter + // comme `payment_terms` ci-dessous, qui se contente de clamper et tasserait + // le bloc sur la zone de paiement au lieu de refuser. + if let Some(r) = &inv.reminder { + for line in reminder_lines(r, i18n, inv.currency.code()) { + ty -= REMINDER_LINE_STEP; + let x = if line.full_width { col_desc } else { col_unit }; + let font = if line.bold { helv_bold } else { helv }; + let label = if line.full_width { + truncate_display(&line.label, REMINDER_NOTE_MAX_CHARS) + } else { + line.label + }; + layer.use_text(label, 9.0, Mm(x), Mm(ty), font); + if let Some(amount) = line.amount { + layer.use_text(amount, 9.0, Mm(col_tot), Mm(ty), font); + } + } + } + if let Some(terms) = &inv.payment_terms { ty -= 8.0; layer.use_text( @@ -1111,6 +1139,87 @@ fn format_date_ch(d: NaiveDate) -> String { // ne pas dessiner une ligne blanche qui consommerait un `META_LINE_STEP` pour // une valeur faite de ZWSP/BOM/word-joiner, vides à l'impression. +/// Pas vertical entre deux lignes du bloc de rappel, en mm (Story 25-4-b2). +const REMINDER_LINE_STEP: f32 = 4.5; + +/// Longueur maximale, en caractères, de la **mention** des frais de rappel, qui +/// court sur toute la largeur utile (170 mm, de `col_desc` à la marge droite). +/// Même calibrage que [`IDENTITY_MAX_CHARS`] (46 caractères pour 100 mm à 9 pt), +/// avec la même limite : une borne en caractères, pas une largeur mesurée. +/// +/// ⚠️ Les gardes de capacité ne surveillent que l'ORDONNÉE : sans cette borne, +/// une traduction plus longue déborderait à droite sans que rien ne rougisse. +pub const REMINDER_NOTE_MAX_CHARS: usize = 78; + +/// Une ligne du bloc de rappel, **construite** avant d'être dessinée — c'est ce +/// qui rend son contenu testable (le texte d'un PDF est hex-encodé dans les +/// opérateurs `Tj` et ne se compare pas). +#[derive(Debug, Clone, PartialEq)] +struct ReminderLine { + label: String, + amount: Option, + bold: bool, + /// `true` ⇒ la ligne part de `col_desc` et court sur toute la largeur (la + /// mention des frais, trop longue pour la colonne des libellés). + full_width: bool, +} + +/// Les lignes du bloc de rappel, dans l'ordre (Story 25-4-b2, AC 6 et 8) : +/// « déjà réglé » et « reste à payer » **seulement s'il y a eu un règlement** +/// (sinon le total est le reste — arbitrage Q2), puis « frais de rappel » et sa +/// mention **seulement si les frais sont non nuls** (arbitrage Q1). +fn reminder_lines(r: &ReminderPdf, i18n: &QrBillI18n, currency: &str) -> Vec { + let money = |d: Decimal| { + format!( + "{} {}", + currency, + format_ch( + d.round_dp_with_strategy(2, RoundingStrategy::MidpointAwayFromZero), + 2 + ) + ) + }; + let mut out = Vec::new(); + if r.amount_settled > Decimal::ZERO { + out.push(ReminderLine { + label: i18n.get("invoice-pdf-settled").to_string(), + amount: Some(format!("-{}", money(r.amount_settled))), + bold: false, + full_width: false, + }); + out.push(ReminderLine { + label: i18n.get("invoice-pdf-amount-due").to_string(), + amount: Some(money(r.amount_due)), + bold: true, + full_width: false, + }); + } + if r.fees > Decimal::ZERO { + out.push(ReminderLine { + label: i18n.get("invoice-pdf-reminder-fees").to_string(), + amount: Some(money(r.fees)), + bold: false, + full_width: false, + }); + out.push(ReminderLine { + label: i18n.get("invoice-pdf-reminder-fees-note").to_string(), + amount: None, + bold: false, + full_width: true, + }); + } + out +} + +/// Hauteur du bloc de rappel, à réserver dans la garde de capacité. +fn reminder_block_height(r: Option<&ReminderPdf>) -> f32 { + r.map(|r| { + // Le `QrBillI18n` par défaut suffit : seul le NOMBRE de lignes compte. + reminder_lines(r, &QrBillI18n::default(), "CHF").len() as f32 * REMINDER_LINE_STEP + }) + .unwrap_or(0.0) +} + fn truncate_display(s: &str, max_chars: usize) -> String { if s.chars().count() <= max_chars { s.to_string() @@ -1191,6 +1300,7 @@ mod tests { total: dec!(1292.40), // 1200.00 + 92.40 currency: Currency::Chf, origin_reference: None, + reminder: None, }; (data, invoice, QrBillI18n::default()) } @@ -1389,6 +1499,128 @@ mod tests { ); } + fn reminder(settled: Decimal, due: Decimal, fees: Decimal) -> ReminderPdf { + ReminderPdf { + amount_settled: settled, + amount_due: due, + fees, + } + } + + /// Story 25-4-b2 (AC 6, 8) — le CONTENU du bloc, mesuré sur les lignes + /// construites (le texte d'un PDF ne se compare pas, cf. `golden_test.rs`) : + /// réglé et reste seulement après un règlement, frais et mention seulement + /// avec des frais, montants au centime. + #[test] + fn reminder_lines_show_only_what_is_not_zero() { + let i18n = QrBillI18n::default(); + let full = reminder_lines( + &reminder(dec!(900.00), dec!(181.0000), dec!(20.00)), + &i18n, + "CHF", + ); + let labels: Vec<&str> = full.iter().map(|l| l.label.as_str()).collect(); + assert_eq!( + labels, + [ + "Already paid", + "Amount due", + "Reminder fees", + "Reminder fees are not included in the payment slip." + ] + ); + assert_eq!(full[0].amount.as_deref(), Some("-CHF 900.00")); + assert_eq!(full[1].amount.as_deref(), Some("CHF 181.00")); + assert!(full[1].bold, "le reste à payer est en gras"); + assert_eq!(full[2].amount.as_deref(), Some("CHF 20.00")); + assert!(full[3].full_width && full[3].amount.is_none()); + + // Q2 : sans règlement, le total EST le reste — ni réglé, ni reste. + let unpaid = reminder_lines(&reminder(dec!(0), dec!(1081.00), dec!(20.00)), &i18n, "CHF"); + assert_eq!(unpaid.len(), 2); + assert_eq!(unpaid[0].label, "Reminder fees"); + // Q1 : sans frais, ni ligne de frais, ni mention. + let no_fees = reminder_lines(&reminder(dec!(900.00), dec!(181.00), dec!(0)), &i18n, "CHF"); + assert_eq!(no_fees.len(), 2); + assert!(no_fees.iter().all(|l| !l.label.contains("fee"))); + assert!( + reminder_lines(&reminder(dec!(0), dec!(1081.00), dec!(0)), &i18n, "CHF").is_empty() + ); + } + + /// Story 25-4-b2 (AC 5) — un rappel se rend, et n'est pas la facture : titre + /// et bloc ajoutent du texte (delta de taille, date figée). + #[test] + fn reminder_pdf_renders_and_differs_from_the_invoice() { + let (data, base, i18n) = invoice_fixture(); + let facture = generate_qr_bill_pdf_with_date(&data, &base, &i18n, fixed_date()) + .unwrap() + .len(); + let rappel = InvoicePdfData { + reminder: Some(reminder(dec!(900.00), dec!(392.40), dec!(20.00))), + ..base + }; + let bytes = generate_qr_bill_pdf_with_date(&data, &rappel, &i18n, fixed_date()).unwrap(); + assert!(bytes.starts_with(b"%PDF-1.")); + assert!( + bytes.len() > facture, + "le rappel porte titre et bloc : {} ≤ {facture}", + bytes.len() + ); + } + + /// Story 25-4-b2 (AC 10) — ⛔ la hauteur du bloc est RÉSERVÉE : il existe un + /// nombre de lignes que la facture tient et que le rappel complet (trois + /// lignes et la mention) refuse en `TooManyLines`, au lieu de se tasser sur + /// la zone de paiement. Et un rappel ne tient jamais là où la facture ne + /// tient pas. + #[test] + fn reminder_block_is_reserved_in_the_capacity_guard() { + let (data, base, i18n) = invoice_fixture(); + let with_lines = |n: usize, r: Option| InvoicePdfData { + lines: (0..n) + .map(|i| InvoiceLinePdf { + description: format!("Ligne {i}"), + quantity: dec!(1), + unit_price: dec!(100.00), + vat_rate: dec!(7.70), + line_total: dec!(100.00), + }) + .collect(), + reminder: r, + ..base.clone() + }; + let full = || Some(reminder(dec!(100.00), dec!(50.00), dec!(20.00))); + let mut discriminated = false; + for n in 1..=12 { + let facture_ok = generate_qr_bill_pdf(&data, &with_lines(n, None), &i18n).is_ok(); + let rappel = generate_qr_bill_pdf(&data, &with_lines(n, full()), &i18n); + if rappel.is_ok() { + assert!( + facture_ok, + "{n} lignes : le rappel tient là où la facture ne tient pas" + ); + } else { + assert!(matches!(rappel, Err(QrBillError::TooManyLines(m)) if m == n)); + discriminated |= facture_ok; + } + } + assert!( + discriminated, + "aucun nombre de lignes ne sépare facture et rappel : la réserve ne sert à rien" + ); + } + + /// Story 25-4-b2 (AC 8) — la mention de repli tient dans sa largeur. Les + /// traductions sont bornées côté API, sur les 4 locales. + #[test] + fn reminder_fees_note_fallback_fits_its_width() { + let note = QrBillI18n::default() + .get("invoice-pdf-reminder-fees-note") + .to_string(); + assert!(note.chars().count() <= REMINDER_NOTE_MAX_CHARS); + } + /// #151 (code-review HIGH) : une facture dont les lignes **plus** le bloc /// récap TVA multi-taux ne tiennent pas au-dessus du séparateur QR /// (`SEP_Y`) doit être **refusée** (`Err`) plutôt que rendue avec le récap @@ -1810,6 +2042,7 @@ mod tests { let lines = build_meta_lines( &InvoicePdfData { origin_reference: Some(origin.into()), + reminder: None, ..base }, &i18n, diff --git a/crates/kesh-qrbill/src/types.rs b/crates/kesh-qrbill/src/types.rs index b68a91ba..d83f2fef 100644 --- a/crates/kesh-qrbill/src/types.rs +++ b/crates/kesh-qrbill/src/types.rs @@ -156,6 +156,29 @@ pub struct InvoicePdfData { /// Référence à la facture d'origine, affichée uniquement sur les avoirs /// (Story 12.1). `None` pour une facture normale (pas de régression). pub origin_reference: Option, + /// Story 25-4-b2 (#416) — `Some` fait du document un **rappel** : titre + /// « Rappel », et sous le total, ce qui est déjà réglé, le reste à payer et + /// les frais de rappel. `None` pour une facture ou un avoir (pas de + /// régression). Même patron conditionnel qu'`origin_reference`. + pub reminder: Option, +} + +/// Les montants d'un rappel (Story 25-4-b2, #416), **déjà calculés et arrondis** +/// par l'appelant — le crate reste présentationnel. +/// +/// ⛔ La QR du rappel porte `amount_due`, jamais `total` ni `amount_due + fees` : +/// les frais ne sont pas comptabilisés, un virement qui les inclurait serait +/// refusé comme trop-perçu. C'est à l'appelant de passer ce même montant dans +/// `QrBillData::amount`. +#[derive(Debug, Clone)] +pub struct ReminderPdf { + /// Total des règlements enregistrés. Nul ⇒ les lignes « déjà réglé » et + /// « reste à payer » ne s'affichent pas : le total **est** le reste. + pub amount_settled: Decimal, + /// Reste dû, arrondi au centime — le montant de la QR. + pub amount_due: Decimal, + /// Frais de rappel cumulés. Nuls ⇒ ni ligne de frais, ni mention. + pub fees: Decimal, } #[derive(Debug, Clone)] @@ -255,6 +278,13 @@ pub const I18N_KEYS: &[&str] = &[ // seul filet contre le décalage d'appariement (cf. le doc-comment de // l'assertion ci-dessous). "invoice-pdf-client-number", + // Story 25-4-b2 (#416) — le rappel. Ajoutées EN FIN, mêmes positions que + // dans `DEFAULT_EN`. + "invoice-pdf-reminder-title", + "invoice-pdf-settled", + "invoice-pdf-amount-due", + "invoice-pdf-reminder-fees", + "invoice-pdf-reminder-fees-note", ]; /// ⚠️ Invariant tenu **à la compilation** : `I18N_KEYS` et `DEFAULT_EN` ont @@ -312,6 +342,12 @@ const DEFAULT_EN: &[&str] = &[ "Web", // Story 16-3b (#151) — MÊME POSITION que la dernière de `I18N_KEYS`. "Client no.", + // Story 25-4-b2 (#416) — MÊMES POSITIONS que les cinq dernières de `I18N_KEYS`. + "Reminder", + "Already paid", + "Amount due", + "Reminder fees", + "Reminder fees are not included in the payment slip.", ]; #[derive(Debug, Error)] diff --git a/crates/kesh-qrbill/tests/golden_test.rs b/crates/kesh-qrbill/tests/golden_test.rs index da15949e..ea1cfa08 100644 --- a/crates/kesh-qrbill/tests/golden_test.rs +++ b/crates/kesh-qrbill/tests/golden_test.rs @@ -82,6 +82,7 @@ fn sample_invoice() -> InvoicePdfData { total: dec!(1329.62), // 1234.56 + 95.06 currency: Currency::Chf, origin_reference: None, + reminder: None, } } diff --git a/docs/manual/fr/admin-manual.pdf b/docs/manual/fr/admin-manual.pdf index 7ae58b9fcd0ffb21a3824b6b4945f01b9940b465..ae3e9545fddf8cffbeec584fa46f1ac9b38ba6fa 100644 GIT binary patch delta 103902 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 z zhilG%@M}EM<31&SoUT5H0-nv{XPq>5O2)_nNk6JmE`?e*R(pDcv*D>Rdw+7kO2O_T zaPq{qK*mgNoI3|c(Xq1NxQE>_HjkI5bP$`?XhBq%sMS07wonAUz)3;|qFoKIhSHR_ zSj6@>EjQC=0lO;i8i#K^@3g6tkiOn|v8dd!eZEnbS9kDr-8Uog;{(h#q>=6aDA@nE zIxiCk6BiL9(SHi{#$n+D>}>ykrE9k$h$jB{2FswWhWx;b3PTKms`VmS9xu6$!lGF4 zix%wrhmXNTu_`P|&hGWtn$sn3@Vz&;UDKf9Q~4%Ggfs2Js_T4l@5dZRsk>CV4Nr+| z%?i7O(ua-fs4Zg!K-)IBPmkVvIC!bw>H7-Y{rT|be=Oy{5AgwRd2HmXMn4XoE!2Yy z6Bq8>x!p<`cfJT~`0-|KH!2_d%~`3!w+mMv?9V3qLtf`U$bH)RUze+tyKFf6Lk>OT zvT5aYAJbe*`7ri>@lN!r1umUw98b}u&oQjZ;Y5y%n(0KECQrJ@uFSVRl+hkP*4hFe z^sjE0`Xyxys!5f6;L0PO-#PmKxLS$(Fup}8Ni4(xw8emM;GZe=XqJ*TxB!Q3jAAu)rL+B!k&zAHJ z7xN`~!xR6y>X}3-9-LIPh{-l0_j>ycEifwm@Z`aKbR9wR2FG>#ggqXTooh%SAY%M= zQ1JTd-EL!wX$71?#l+<{f{-d`|Dy_Lyjg;b%#*Z=T@F~t8R#3TJ^2kp4#`Ya8qP!D zJJnNNe&c!sWVu-|w4jQtFhc9Q_jSG2b^|T7DqwtxBP(8+Z_L>kx?Cw^CUb$b48STghGqTJQC+w|g(#+oC@l z%_lRpsxYPL2#a^CcI{Q%R$ILu2oKyggI5scUh^)pZj9WWyiZ>>fa~*;yna*E=vnBB z))oEN+8dGO&ZmCvw5%wt%VM*-E1UPtmjLp!XPtNI5RbNrV&Giq&yie?F46bY6gDvO z3K)}$ex%}`#PVTHipb_GDCP<}C{)p*sLU0GNXvhbmUp43f?Q)sCxj9EVE!&q7h4k# zQxf2j5d?}-KBG)i7dVJMh^kf*DbWR<1WJ>YGzup*!1a73Ws3-pqwxMDR-#)LYd}g= zfDIkdCdTWhk^vlyn`_V{W|IUtYlS((kHgR;RNRU1zV?i<%l_;PN%Hez)fcPC$uDJW|W+j$tET}21@beEBu_gX!>QN*)54Q^U zsInEM=wB6P&TByl?rS140>y*AfLPUJPi|G7lVip6BXWS!XPmEDw$tyi>L2>&22xjH zuOmrghPvSL+3XQIzneMDZwmZva(y9p>OjSx;Bs2|dC(^fscvbKA+46j+cuC&i*O^u zO^7^E@?qbxWo5^k=;1h04R2G@DeqqWDmQ`+aFPrnLzs9K#)|GQ6FM(nxM~!BGIad_knZ%eQbY3N5kr17sPDc=+p)5VG=y{PiEfH34Xd=Kr8R zUxP}O5h9Fb2-ltG6>SIiJ6GClQLY&_IiPsLoDQ|@20spPf5<<~v`~$UuCk$0dvh#$ zhVI-n5Nw>3qhD*^zjQv|?wWsow0mi9ye+*J+kDRR`{22iV*LGDu6uVUtQZ=4J+UXG z^jdFoVpuqp41Id!^~reC<+WbQ|`;3DA3OrKm~IJe+xq70Lb5L6?AADIzchWwMy z0w(1g-&nFwG&Tnm;9D{)X61;FD5?-qna9Ka(I5(thxZhx3_F1obwQcW29qjFaObCz z^wjh}3JRQ+Zij&}ODj-X{k^4q!L?VlqP_G0XH4GRvlDzJjFR zHrRDr=ii<9O_T~mxtCZTdE6*CW)0g`8pl&)v%erz5YsY;4PT&<8%|kld(dN1W`U;i zm$C`(Di>K+DC&=?{nR87W`2Kodw<+L1s0R94zGCwcUbY-wq1FW2<2Q}Uuvavl|%Tx z>rMDbGGDtk@DL8#FEzf>r%qBzF~7Ske{v!m?wM-3*=>*Bw-x6ih|G3Ua#Z!x`_}Q? zze{iiy2_d+^pn^o$5)@6*q@Ekz?r-fP~0x>*GV3vkD4*Td?}pUHm{_P^YX5Jz}|TxL>JW)%^RG+a58fq*q zPI8}?A@2Ja`zHE??P+@D^kvO}!(abx*V&%9;@(7WR4|^yu2`_J-!h=PGBPl_A`=>) zboIglvr)H`ooFxwWT5DL^$KqD%`m!T@2^HVnIiPXnZFK7T3_}1t6P$Fp^Juos$FY* z@gy?@Qih%(!&Al^66M1++Tyup9!D+PB+_EcIF?2Fy)m^Ir|KnuTiFY_ln%XJS!Ml4 zgJkLTtu&qT;c>%Y_smxYwi|M0)0$9B9Okj9gRhJ$wdh%GFgqvOSxdJ8KDFGk6MkL6 z$s2c;jg}xT>R|T4nhTO%$kQQQm3*%~cCo|EppZ{ysT?l}5n+zendN`eP^)D=35&uA+iyvBHVXJTkM4 zJ{KRm-wo)?uw!#)H1l*kx?k4T@-K)(4Ry9B!b2X_D-lTWc!W(ER>9}O{Yf%NpZNi` zEvcRr_=*N5te(BeK)5-%U)nPJw(t7)2n5ab#~#4V1Kv1(Uz0lMCt}0>JpGOIw1lbd+@`z-0Uhu*iUvfnvM zpC3yj<~+}&yxY!QMA$rM-+Qp5_|VYJwkX#KD}5j1EQ)u(143 zr(s6PDu5B`+m;(3M!+M^q*ab4YCdnv?~Gd))KN6N48sO9&Hr>+>^2huf!0ap#ua~i zTUO%C!}vLht=ao8P5lQ{hX*Ij8Elifm(Y;vj}Wn^1diGZ%!-a&27NI+2Ic%Yi~9_zNNnDnJP%DO@0 z0G8o)typDC%g3l(MsHX4z4`$G|H$8gVU$rIJ3Uaav+O2x^i>sX^+_WnD3qLck zp%AB8kzeUssFPLGmhP_cY_8EgmxzZtrTPEYPtWqZ%0EG%V?Zk&5)sOhPrnM=&>pkF5{p1mVpjj%3~&LA#@^?bo1)qo3Kz zKrUh%gLMy5+V(>-nAp}r5Mlhy2gMiA7D%LHl_93dxj2>Zl|kyFj69q|=p+goVMxOn z>X3%T8B;Aeh7=U>wL81#X3wh#iDWElVHHL`B88-nA_u@LqlcR#z=CgRb%T640xUC- z+x7iHf>}N4ka+Nil5((yWDrV%=i*ke_!GvoCY)xW4ms?QmUTMjJ==cjSZl>-HA8^` zOtdtF!T($_ehG?bR6?Wx=rS@$J)0gRG&&=b+W+pvd1d6CB&|({@^H4 zA2r89)eiWan# zAPgFg8sP>xSOqzx2Pxqjtc5dr{te-7;*o004-p>+Ct8C3X4W|9>EfW<5^aeUK)=t(@GEAk zMj@tl_w~8BEE+CEaHx6+?v)iui}GajW*d-Ei!qg2pr3RX{mL|~>5{Dj{ zY+Iu+ox@eCWt2yr7TUgYE2wczWt;wCUn8DZF_p|nnQt9ckuM1}PyHb5_nq@HlJfY| zQCdFzUS09n8U2C18D+~4kOP+vBj|~dA01tUjLelq#Q`2IZZ8ZeGjk4--?u936#%Nw z#2NiZunhXkk>hJ5%){|Q21Dr~Fk*Skr2V*GKchUf3!oJYbT7gTCoqzU?TY#A;GUKCKx>zH!$RM% z)SknSz7JRsIxxpaU&=+CQo;KS8R45j>~brRFqS$_YH+mDr!=%QeKXTb`3?NYbk?$0 zOtG`E%+x=l3^Ff(vZCg7CPp9a&<(u090`m{drm;_o}g=)o(M~?<`Qg;rBw*N76xrA zbo<$2`5+82Pwqrf?sdScLF}*BgQU=>)GJA6IT6$AY3J!a(}}Q5J}$B9RZ<_7eU}g! zvlLme5?^%tHzTK?`}}r5KNQemJaELb!_^l$|3x%CI2g0tI`C8hA_Ue439c%Lg5T|T ziMRGOJwM^WahanngoaKGazzGK^XmiAdcVo0X%x6aZ(OB-5I96do34+F!GNQ~gm>yZ zu9k9h;>b7S2U*W3Fy(qX4@LAPoq>fX^{XlAWBA6iD;qNfq4&WKFW}yFX=hnZ_VRG) zZ;l>k7O?ua8=4rjD5W!BJAfy>eSZO|tAmoF>EU`Urpje=uaT$kihOcyFH9y2vtvS= zDO$4TD6J?0Qg*%CWcw$?lkdrio?c|pDMGi}n)80%sb-E#V>9HPF2e)9?vURGj#2S^%qjb?j9rZOiu$VerD(Vtf+m*xB}%+prN{ZF7} zCKbI0{J8uA{cagK%XQrqcXb+*n_1a!&)_GWn*=8}6&2;nKzE%bbI<-If$8nd?eksH zjoQn(J9`!3L$t*Fprb%rg@g%T*2YC~VdQUd;Du;lp9)NQHoUK`))dU*E z38LaPfv_CYU(2wAL}_;_cQa(2|8EPGMv&R73u0kagUf`)0%_W|*f5B+bx;uI`H1n^t4rt7U-{8ZyNp^alY0^EMr{<5V=lA8+uF5P1 zFz%y!rGLAvTXAO+Bry%?q%oEO66|qoB z)0n)T|4&_K8V-f~?(syFwNlxKtiQ4j4TG^1(by$XcCw9i_}Q09c4myFP$SBcL55=N z3?{?;v!uq1U70C0+4tS?=A0MjI_LfU=Dwcm`8?nIx}N*{9qR1!MXYw{cD6veme1^e zPzBt0SYH-S%tF{GE?T`%1++b1>n=6V;ZOr8?0+Zqu6m5;BU1y&k?Q>=Lm7^D(2H-3 zcl1Y$uEq5b7hioLK0<63bw-69O{HcTq6K0YCM1O!J}1Z6{!A{;jbQj~I3XI2zr%Nc zYxlzl7kv2!Ewn93isH(f-Mv7_4qx3E(jUmDrMiCKLg;WI&R>oft@7T;vrK#yoZl(@ zsq129Vv&n3K`Z8f!I+;ZLE@en#z~bcDBx=Eoq5Xx@#$||zwzRN(!X$`LU)4D2cq7? z9z6{pJFKcgSnk-0EAr$x#BgO@#Ju>` z+Gy`KpJNV{RZZXjOOt}s|3{N5KZpwURJOnG>7@)cbbx4jsH#3u^Hc+#M%B5gy8$&l zRXkO};9ED{H8g-=cXvqioXv3h;7WTr`0K7LnbGH^+7OgGF<}zMKHkutChCmD4ciQNX3@beT`i(>MsioQ8^Mm4E873KTQl);q7^ApGFJ@ zXLaX*IWv*`&x59(+zR+u7|os42L}V>T!9v!pkSfO?++Au?iZzegR>8RI`y+}fb$Ob zMPYSY&um30-sv2XX}MDHBg8R59)1-^0+G_k{punVX*G7W#4YwF$IiU&G@4^o0?^G%Ee8 z6Ik@j3{xTz)Vf{jpsor1m>)mIV}nuybpv$ztnnn@tm=|V5$`p=?V#aR4Om43=}`%6 zBb0HKG%+?LJ0^`mAZ^;Z4T?GB$J%#b?45ZBb{U)1jx5TEQ=8$AXV z=l73C#iHTItHu~dIcvW;mEj%n0A~YSJ|VriK3{$*u*hY0g3vMK0#F?;sMD#;D$i(} z6`V7{Xk?35ba|M4p%DnC@q>kF_c6C}i^{va%?d&=a|k&-Pctfw!9w=+SdR->&t`D1 zG{||0*lcRYY+f=R5wcMolSM;^ZS;U%e>^aHG6dJbcdi(SRIB04lfkYP|Kp-V&MhvF zYL9^9+`|;$mW$qmoivElkyZ~?Bb$44)i#m+aveyAQ7z`P+0*L34zw^GGF587Qcorr zVo+0r-^o6{nIPw@qI6Q%`ID9GMCa7;%tK3~NMk?$g5o7xEsrKz*2_AgJ|q7KMuZi< z<`5U8jdNl|a*av0`A_%-$R6~^&O!VdWPW<};D_{7Miu;ZT4OpNlpkLQcRH>eIvQ{h zvLmu!8YQF5mx3J4>-=Y59irfI)p)2#E~1&VRe2G^mffL&Bk+ENN|24267>BQ0SreT zLUozy?SJ`>%l(;aQ$i6Bo|;dFQUoLBH8KB6tO-VVb(uE`uK|}k*fB{tyTTEp9GIlM zU7-l*OLNJ4hp3q46aUN5uahmb_f1ga+%wF7km}1z6Wc!A#)(*MH-&H#7}>9cD0H3X zh;OVjXW)BCaUu2Qj~|}Z)r&FK+p!I5-#h%Kt=!DGK{*2QapYFs7x*qAYF2Ed!^Q;% zM`@TX9F`0$(9f=OGm~4+3*>pg9R6sYijFyGKDE=YdwaDE99qZk!5c>MxtThL-QRZEy&FCV28cGJt1Z#@W1$Sl8T zoW0W*KVA~cZP86;uwqT&?D;th)+7BgMRNwlmLK_dzO#hHy*npu8!2j;$5*PGDqyvw zS(uOb&)(6O)Y$W3^8Sel41*8Z(x=!+iWLlV@JGL85UU)@Cad-K&NC4Z(KKd)6#Pp1 zal!G&w2riBh{f$0m$IseAG#1j-IN2#=Zx#RJqw~@nRKg#*yOr3#Z%Q2u?qkxU9~~X zALbO^*3D_t_A1*aOBb1aS!KROTR0xltUe zwZ*1D@>v(60LL$Y5S&BhS^aFHcXYWv-%AN8ka4@Y=g&N7L`N5RWouHDHTT(EvPUZ7 zQ7fygdypbD*MQz=Oqg=}fWZAA26mRL5`wxT6)asnbInHJhtC6X`)9&sq#u#Pj<>sz zPc(6##uz5l@6prua5({LfqemtQwov8hY9KXEPF6!CH5gA+5opfFh(s2E7C&P69Xwn z?Yy)+e^MZJ6kpUPw@ngV=b;E6-J<%kPu!akIQVg`h-i%;IVF}>^@!&UoWz_-C#P+V zd6RVwDEx~-2D#a0r;nx3(m8$q^I1w{#Ymjo);-Zgelke)x%-9X>vQIDXKGgeY0X-e zd6~}ae1%xK)vG}A#9D^yZ3!=D7Vjn=+*04WGks(Je175?+YTkXFMlLkM2`z9#wO~BK zFAo*AKpp8}j0Nn{hk* zJedymXcWWF>MzQ8JZXqQ1D{wO+g)suB3Ou}SYtnIvWH2&bJg++ZDbFcS6p{4a%rd} z;T|*Lr%yuO+&d*=RBZUG119#gTVs6g`+oLZL$f=m*$C`6U>*&Y990kj5(cRwU`BrB zNn8oDDs*Fs>K0W{JuEJBQoRg($*u$NKK>USCf?s>EcaBwf4pL zIXtwvrD&aH69Ly?q|t@HZ}wkMZ$4J^X^Mv8USOym=NNTZj&FfE*se*lPQYh4Yb#Yy zLdR$Y9mc-S={Zz+B#W5#_1IuH2+NzvrgCw-zk`s3B}qT&vC~vB7IC#M&kv<_R(W1#U8%6!*5~ABDpN!l#j3)logGn;^~nOeA??P0 zVke(^B;BS>Y38F}dSGc^Ji6>ua^N3Al8o1+Pcf)wkJ?8dqsz7*{RMAGTwaP`r#n+l zzQ#TO?ESp2X7a5r*OJhwwiz?Ut1hOEVgY05$47F-q0F26We;;F6=B{QFB}iP2!TZw z@)m5Adn;O=Ich(w9S7NzNGW&UmKIpO?0lWJ_~r$X=lyjW=e8_NtW=$nCCf3Udo;iW z7vz-_f4YZgWb%Z}aMc8ZaMx){A&SgzH{`_ccCu)=pNqN#L$_WCn!gaTRA)JV17eQr zTsX~XhKVm3)mU%ro?BnTzV=mwEyo+-I$``>`ZEHPegsnUZcgmwS~sf=Q?XVf!VLy+ zTqrEU53-mM9r#Y$TB^Jl{)hZxIqN>Gc4KR^N)RCje;~#DwC!xcRLo zWATm>O?_7DeUw)>+<^(P7s6D%LcH*~;b{iJf?3ioDW9R6fDAb29w*Zm%nvfCEvITD zXrm?}OIi^>oGJe8!eK5x8gXnO{vk;hV;up3`O6`-zw^t&H)F`3eGRq-p;+f;mN4%> zzUciamUT|1K_nX};`iRuaJNe9(9~kZB040%y6oq*X_Lzdftxb4z)^Ah@C~Us3muNJ zZ`ZQ@lv~diywMe?bqikyO#e=0UT2=}5(_4^ZO>5JBz0s4q-c4A30UtJleRny*vGbN zeeofv2c~e%R%(L0)rj|IU@7@e3y7^!iEzCNmLHc1xnSR@8 zt9sIT5v1y8TlPqo6|eMFu15FWo{|X2()aZj{;i@fsg7lS@{~zi`H^pw>*D|fk$ieQ zi%V$@aHZDhtmUKRmO@AEK$p#ab;d#!o}K!*SrO(`4RmZEgipK`9Dcc_>HMxMm2dTW zE42-6b#TQ1H}*Q5rwa?hP>D2XqZIYHx!AFxdb=Kl9etm&e+d>*c2e59s1yH7r%r~} z)|Ou`D!=;)6>T zckHQ&QG#H@N zeYZupVBTap?QgwkgsV(oPXN{hE&9o+MPP>xhamUk5W|lsD*>AhSC007-gGuZvF^Sa`85n<*s-CerBKt_sO^IzeL9>c zK&SwsyXNeGTAh@g^!wiIoOm*ip8>=atI&NI{EkiDxP7Wg~#l*w_u>eRj z0UyRkulkG+L#|Dq6x22#7k=9J@99-No+^OzvhWLp{_7U*G-dDZuZtZ{dexAh`&5voPwDvWvy_LJ9 z0%yBq*7}p+wgRAcug<%@`KLmGq(_@lCSm7DWOGs`29o7#SJe7t!cc#tKyjEm0UIP1 zI6Npt@X8Z}f_)kw{BZ^{gfw%7K7Qmy6vi>TNeJfQ0?I{Eo!oQX#8~a|cV6@oA(tUY z2FkrBfe+&!c%jqQnW7qO`>#h{r~#q%D^{i(+Hh_L8UW;)rh&308A*51a>Am&k_*-l z?(((Zno(xGsK+bOXn0J#j^<0KfV|ePYu@e(UmhX9fl`O+=mdI~Ktt{vo8jAj3bg+8 zQ#~+FdLc&8i3ia@r@dsRUjosy4N3I_>R10z_`e2CuV95ST#V-*$_S6| zSc-;&q{YbHS!`=zmq^J|TFqS=gI!Cga|O!ydY{=)lnV#qL;|9i`c+aZ0H!sfB%F=D|A%^GGv9S!CR7z06rIkB3_@2YtU zI(rZ9Emd2jAlN`lSJvkbv)0FK@%!y4Q$34=r4@?L@!R?ZZnsGc@fZyq+@)lWy0vlLmp3H4BeVAYUakRfYfv>i+G#*jIUsMm6?fwum=4i08@!JRP-E&Ohn*Y z9qalmBAJ0$JbQj5>L0P782Ge19;g#|!89r;HYun?5{;Y+Al4f0rSL?__ou?$9rUB6 zt-IoQph8$c3MAtJ6&lQw*3tlx#7r=Sp+1=2)@9PDoDO_j5-0^a2vP~&aL=LL2#@lCDF)WU4V)lF|L;+RBCp^3GOBiL+)P^j%Z?ssfZu^}mb zVFec@uUuMbXwW$7%G$puknm8m!l??1K~_05x};V8z9yn1a|Kq56hm>ZLef|x{)!nB z(Xs5y|52fi)Mk`A#og6oTmr4aW@M17!WE!xFfa)VD3HWOr@7daNnNXUKQ}%&h-pTw z0t%nGx`;5%Jat7(maK$v^8#N|RyKAtnwR;+I*Q#7)A~eBNRl0-v$5VI`nqRpWQjsO zf+HZW3Lld^OmjW}%C-lNM%gtFGjjcNd1B>)`|pi1oC>yD@ZGHmjbyZIawhA z2ukp+l#^l>VWIExw|5QH@o+!b+gJQ>!03n17jG48a+$*64aPLpppm+Y_us)v)^MnS zW!t)EF=#d!m9P*aM3sa=4LP8FhTt6C*R?BRZQnN8Vl4@lBh6=v2M3#FL5?yViKIrO z@TH@XvJKrD4EJ_9)=w^QXU5Y-4qn0mzyayr2^jpzGE9iI3TfepHcd)t*y{lcJ!ko_ z(9KD7Q$iv!*YL+xz;=tg0i&GHiT4ak+eNdsg-f_H4FZP*20RU zlFnN*VwC$!xG3$C{4cT&ej`S?bYvp_oSJ=)S||1xrE{y%X_rY z&wB=XRCJtecx;pSu|spl==t9~ouY0YpCAl(!&XVXf;HHM5iLv}d1QE}H0)0$#%fMtk>F!WtfhmcP>T5cgewLQ3d7it|(HW9i`?U__`{Kq{ zVq=inbe{G?u--&v30T$@?@ct+BQzjD(xj_bo?bJqb9e;$=q)GVs#`N!ui1lq)Q?$+VkILeVxh!Dtj5;?IGko zex}zcHJ2^hEINYkt@r2EFhLgqk^JClf7vpUX^2wI zlenfV%mT-&$lb>!`hjeO#k|C<&vRdI#@`U$$XQ;;d_)7=iBy2u#>b?=U?cq_&rm@mqlQ2R4T`>ep$-$jP{G82WxPK> z3WC`Ql4E{|+)Qpvcrw#XPh9839g(;mu~UXFJ!DA&)8~Y{)M;<^S(q&MBm8tr=~vx{ z3I_*O{l^abU6byccJ^jF4wRp&N@I|aBQUCm+WY1$J|f-$FlwypT@lFrG-p8`wH=Uu zy<3g+9g$rla->9ZY;eRHjT0szh#Q}V!V=<^(@n%xrqX6gkQ$7&4pIKPR`pQ&!W00P zcsT1LjxCJ-BWN>ibfAT4?IDE7Cq$tSyb~iX#FiFKK5({*E2Vh*i?z=Y6$UJVhf5~n zD7I?=!tVeCkRL?6D>8(U0mXZYMxcx?5az1@$bJws(krn&rfak@4D2}lh3Bw3n{;fL z=yNoY@N&|zJn6ULyypc1+I&lIIJ?m0}XSNXb32JFDG#oCalDAKSOfFw3cX&~9z?W9U0J653E&3Mf< z+4uUlV(xO|B^hCA>E8jPG}&pi&soibpv72~6O(X}%?8PKAv)F1rCfX{rnL?9>SMZr zp=}4bRM=!gUC^Ux(w7ABGQ2dXPmy<^>lpSE(@(nT1+|`trV9%zqb2fiWT0o|RcjqJ0AH6VF(L!nw?hWn0-)}fjos?T>)d#?c zWr@Oq3`3KdfyeWWvaHf>6xS~oHw_-zved`=YiV(F@Ebz9vwawDENeaw$1u6#csx!uDZqR9N;@TutibXP zerxrw6a|J}*g&yJrztQ}t@9=vZ@SxYplNOfZs?lgly{tZVUvUq*0h;|h(vm(;Nc<`yAwAv5aXlI#R7u>seLSPqr*Szg~F{FGI$ z|CTqyGDfekYgwi7Mt?Lzuk9v(YJjne2~)IUge^gIT)c5)SM#=Z%>sMwmpT-hjyq6v z2DgrqCG@-W#hxYIXrGSyx~VIIQ1--{AuMXT#2w))e2F=wh@XsuvaGHyfVNVRt_l*0 zVuf|9CKC`F0RTD(g-jzI$+plmz8*1PaWY53WW23o4O4PR^!Cak^0Fi(P{HKBAZFS! z-9T2U!Jrml3CB7}*aKL^)@5nd=GA5=`BzmIo0}RHm+8Hi$#mSeTChy;rjiD0el=m? z{p(pRVD%c>@MJhE%K|NTR>A!i_3zWbmQ9zP{y9iYC_u!%j4i|Y2B@gSUTc(-E`us> z+}Ns+vuac=OU?ToKQ3XU$Ciqdh!=m1WH*C2s%8RCf3@ce-_8#NLh`^X-+k z_C_<5oF&hilPQJeuHQ=$1*OMmIlT9-NIsepF3M_`mo=*=iNhy&&7V7tO9U0r*;MwS z&pQPy5&%kY@}4s*65uzHq0|>=MJf|}+3M1E=@{{yV#BR((c2>MW1i9&FVKf-dtWsG zQxz)Pi`RwzSg=%m%mH11qh&|IDTt!yAJ%T#>X94xAI^O1jG!9yGW^Rj9SEF6F~pWw ziDU(?{$Ik8e8gUkf+(OhiGx*b7J7#@-nS;EK3W7eS6U@lxAVj z@aVEm0aM^hJlv8vJv1>iN+xfKr}|JBUH2*JgS32mJPcH4@~OYiFeVLHs4gbnFoHQ3 zD2lSbBxA+d6Gpv-T)0iqxqs+BaMeL1>s@>)BLJbXN33tQNV2I(0uLMtF8u`N-@RhN3sHysLsuRxn-6Chw=!>jACO9 z!I3G6Wu%01k>+d*z?Y&=P=29|Oumcps?cN*U6@XrWu7v67LsITirkcGG%!+7sv+SI z00ikiRi5+-7voox5vWxSZ9FZk>(;;irlCeKC)Od;QYax_&7Ws78X==4$`SHp$3KaE zk$f&5{5gY29QUd21&|Icjx`7wvcwQPC=(hvO=S>~n-wqWS6eL& z&7`(K;BgAQ3>^u-2b{G8`=WF>8a=#Q0lBDazwB`{`)4iQ@1zk-yS+{!%LAoS9*Q_b zqXN$=PK}iBF>xNrDqcf!Z3hsQs!J5{n5lRUrzy7Xpp9u2jX&~avf*R7QIiV=0<`k5 z35`pM79$mN(*|*`IakWjjqa(w8{Up@xvPp!V6-0w zILJ_0uI`6s@*nxhO)vrhHG@N=Y6{r!LhdaobhnQ46SK+ z-93n6^%2Ga`s@~*=qe>(AkE4TG78biY6DP9<)mwJG3Q$mO*oMStVCO_n=wxtx>&T- z3>YV-;zo7WKsIpFYE{cFs&J$_C(i%)H?7l!5m5}=uDrN5RWE;7iSR0-H zbT~bF;>S%KOT|rMI2P%$(B(Gcb!BK5+OmYund!@i5ifW#rx<%fwsg$nF^jY!hksn! z_T9g;R9cgJ&iA{lV05lt06Bxt&BBP~L4iGGew+db@`7s*Cn>hQqU(IC*8>kr#BeRK zk5l^MpDHrh=5vyCAo95c;ZVHapDB^hIm}d zgPm<-WwLi-%L6JQtIV-YR;iV@M6l?DiR4iFR;d_0=I~tR8{I7cNVwmgy}iW^K2T3^ z%2~Fr3r}72ycR2u`wezwZT_+BUjJHG?1o;Y8=X$5EsYAm9!(W49* z1{h8bu6UsUv!ZhIwiufwHo~CbC7;bY)c4^Hstme#h^g&66_mdOwVu_lJ>8dadO`Ks zil^h1;D>V22gRSGQy6;6C`75sv$>ZjV&ENaO5S-y zfu(3R<%u0OEa`u5*!=Ji(SpIafsE{8119HNN6Mrb^(Bk|m)mm7WO)A^J2CJdDCY32g9pgn zb``fE9IW9Y5EhO*_wQxm2i{*S4p!btjCV81mPXYzlRAfb70`QLBQ_SAst(>aneQ}C zOHtMzbnNa@hE4ZY0TVYnT;zdXTq#;2=d$)MO%&Ze6=C_x&F1n59j)H}fKDlIU;oeM z{u>BO*$PVu3Tz*?>SXp!cS}1LC9l-0x^NVn*L`W$vd_5#1Xnp zaEbHqDy&!_Qm(ShYs?Kja(z>=5Loc`CQ+ZlkJb+LmKdoX>Fx;cxb7D^8GH8*g1|Qb z*`tn&`ek1g{99c=xyvVK=l9+4b^Q3SPY&oFV&ytcnXQe~>5hwhnB$Fkn^rT*#ELD2uIoY%zSywnZZwx=>66kSlh%DL3Dn3O9EOS z`RgN`bp3p(o*PgC*ou_AqRry{qVbN4Y4;ZG&fOKB z%D<9}zx8X@Y7{H+8;?4ytciR$4}$}5DVo_ORZif!`7qXJyi>%!HU z*3GO_n0(W+?Zk8?Ki>$(OUw%K&L5=k2;gfH^us(c7C#}ffP4iDNm(DY&(*R*qs7tQ z7v;3cw>t8he<}DYUNL*s!-)zNv~a@6y$bJ7R$H5fvJ=J;fr;TaDG{8?Y}YAI8^jl; ziG2s*xN0DHjQN8-Lnu{V76A{Ow<_zY4TPSJk+J4EJlDnRwo~~~Vv{0sK{Rq&Lqvq( z5YD24aUqDJ9X%y#qGwd5?Ymh8HQ=S+8R9SgnpeeBWuNobz5WAP5VAwVyR z;=LK=B7FhMh2R%S7NCf&lM?Vz;vW*=#_W6$CLb(jP3C8zLh>961_225m;-+?7<@N& z5|n)rjtB|l;3h2BVgR2*a&&riCK^3Fj{3h^lbZ(LdiL>yig_6n1Bk2sY9LB>=-~s2ipJ^GYQ|%`tCkqUU{Q)Mt>Gza*K;YcCU|woi4Vda+cP%-Yj#euS?&OO7Y$tRZ zLfkgcUP=+B_}#(0N^_E@=@{=~dVV-&Jn(YEi>H!){C)U#X+Tiu(%QA2gkJ|_)qSUSO-%!Yp0$tHa}=->oQ z1j-^Azzp2P#AGz|@12CK3Yn<5RW2d9zV5d9`jnBo8hGpKCT(o$)zO*_XZ`Yadla%z zMrztcju~6{m<~6H&7fZP9@qr+pTE)NSPP2YOhZ(5IAB1oYSLh+q`T8`x&Ff&zO-TZ zi(Kj0l>YFEJMluS_8jA4KW}!q|8XL$3}n0^@z}cPq=v&~Pzc=&Zj#{!yxQzBttLMT zML1}aQoZyW%F~6p8|Q*`)%DC^&FxZwt=`%EXDIu5yEVdte2>5q&g~m$6%6UiD%m^NI>Nv$1j&cO|F11Mfgxvy*DM3f{&zQh ze$JB6C0=yBgnfa^3O z4+4jT^Uc6>W8VebkmUl>3|k6v)^XH)^DZ!j2tbA^TC-W1Ir0KKvn{Kn$`!`5sluHG z79z*P&dC0=p~U02%nFLoJNn$^!0qpP9vLQE$x1uQxooz$dp?n6nJr$Knbt-H>~6OW zM9r}w69q-fyTycP zS&jm1G?c5v-;vvN3Y-%HYTHZ`rIuIw5HkU*SDpDF9DrJkTPAYDIgz zDDFfH;9jE$IujEDHJTMfXXS2MqUc7ID(fv6P~;X8d?VV?u;Fe-p0-?$MoUti7bt38 zYRS+}h3W|_R(s1c)>1 zIP~cn=)yuhr@YD9kZ$FoAN4Va4mjXzjVDKNc1(2kEQHIY=!l|;q{$S~lm$1`UlaTy zV#c9J#1?4FB|;-(p2g?+6tl!Q#JEcKGw(Q(i0&d_q!ztIo^vNt(uH+FHh zpT;#mP`YW0qtx1BK}AMEc(LT50!-}KQW5?spt~hQb`l@JCf4$Yr$ zB}>yGBQeat5hMzTX0S6GUWy3}52vUm2Xt>KfLtUXgJ`3Cb)6W*C>MVkWGYSe%M>i- zz2Dfvaq%H#2VNz2E}tD$MmOjG6{({3MJQk333ML|6UoYq?C2mYqzI|b21u6k-sy2P zim22%w=oq%Azd?tZrU;30y;_C&7hp%L^!AWF_8qhmS;Yd87DWxH{`()v5MTXCc9LO zHP#oS2!%m-906z2H!o*m|ABay*NyN<%0>n!TcXnJ^b?~o-yDA<-$wOL%Mkf^ST9py zyo+GRNtiiHQA5Z#!?lVJAOZ;}j&d2Z2RSL_eF{-QdqC|iDNQ$uR4DYLPGg{A&1J5q zk$K^MyQl|~;lA#dV}!ORm1qJ>t}Z_PI`!Kye}pT0qIGUk3Dn7(%6@DsEq$5K)NGn$ zgke+B>hWICST%jNpcX3SJYtVQIM8;}GFy0nsMrFIJ7Szwq6At1CqL1kLn5jW%*M{U$W|U#3~c^z@`eN{weLC@ zX(Rf+^lbK$xiaR0$EN>}aSJ@{rK<<2fSBwpV$T!FgBFhT>Mr%#D??fxoYRQhwRnG9 zOcli4y_{>f<$5L^uvzf2{l!YxQ>_=2sMOf?en9~#W0H${?-E%# z;GL4uUH>#;wwf!$sHb918Il1K;k&%TArPl)?N`<#oZB1$5O_VG#ePQE$z9?9ssnYc zJi-e24iPcu5Af=S)d1`B$e&e=7-_R~>#H89^cGOToRBkzz#%C*;ecWeKcPsZDEpau zKgXmE3W3M%>S2rb_1!kc#8!kc)QKCHUN=skr5m)iPR(s_Gv(16OdHy0$y%Z_183Nm zf!y9WcSI8fSX0hO;Y{Uc-c9vgHK-Epz;AK=0}pO27jc`i3Q|5J6%3em8JvdmU*q5a zvf|7Fn~i{7vMRb}5P+1-YTN4XF^ae4F*L-h*ju&yLsJzXXy?Xb3$?kfsY&>n+*~y` z0wH|a&P)F=ex$&t*u(X&x>)odsq2y!DuEs8CSH;npfbe?(#gD|SiN*PuiRNCzIkYz zbNqryT`~RxyFlUMICSJ>B;xb0BK; zBgZm2s_%?Z_=%@e+5lAV_J;j*go@T}goO*%v3d^Yxf$HLNr;jYLQ$Lq{_DL!-s*Q2 z_VTYj0883mamzZ)(oXa+kv11bnvk7@;|qv36%=VA8Q5{^ZQ-0swY`;(+UkbFY;ak) z5H?5Ekm6ceRXBz1vnL-bwZtSIV*_$18^A#m#&JJXBNaAzr%gxTF)@_7GqZSsmr{q5 zAD5m7?^3Nx@^)3%_;*?aB00`g^aq5^a%|otAfNvjSQEr3re5fdcVvRwNTbciHYZXY z7Y9gXHUdQp4;-JACIL@coW6N}RE#j0i|>jjQqOOwrU-@uyVq2`18GKIAF-1(Qkj97 zzW~H|BBty?EuzLPeRgoi0;d6Y#9!W4;FRs$y~~pk5u1kKK#ZE3*#wn5U>P-~pwY}7 zFsf5P-kLapW8D=YZ<3qLQ&x+n%cZfE$}~lov$jdjm7~ao>i8i!5u%_bH6TGF>Of{# zswwK*v)O&`?=JU1qq3;Khui+WCEI!zxq2HVjsgF6&UI`_Vf$$nr^TuiKWozGeu|dG z;rE#@!?MHS^9iiX@9CRgaKp&S+yfK@zu|*B1-iOSy*Jnrr`*m8bV+G%y}_fNgI8Vyat|B=<> z@hw&6Q>K!hvi^y#t&-Qv?REd<`#$HFeQ3f?Rj361n~K#5Oa@?OVEn(Nc&sZOOZ@*y z(V}_>q0a&gI05{nrGE>}+o5wianL3%`+rDL>OWGPh}pc(!LzSBua{m4ETV|`5>ZXr zMQ@gPlcyD=?Vq<>fMq>erDhsOhaKP^72%C{0MksuUh#H(E5!^fY;tArncQ$Twgko4pK zI8p2l`pM1?7xc85mFUn;z!-M}ZkYW1k<(?0w?2guC65>Jv25)z#;x*`GeZL2r+A^=EAC5DJttWMig6VS>mr9N zLG`?nqn{Hq>zV_e@9EX$RQ~x<@+LdJ`!mdonv8W+S0Z7r6NiKH#b!~=m{JaZY^eFU zBJuONYq=WJ$Hs#ADJ;OEDin9uji`>ZMaEI#77qvBC&bz_?fU6YL&Txrs5q$>Q2t7Q zOTeC%KW`3aO3E+w@t@uR4BgmW>7Y?~&IdHl?=dfNRKCZW1BviDCycDWDwW&wW2DIA zbPEY%G5=)!!HR8a;u}XjT`P)&S&otrIAhj9@vc9|urFy`U2H%J8q;xelv(E_RGv-B`u}sQkW=)~`NPOw_17 z%dZv>1DQA?4lC(?{p^-?*&<5)lnuN~?H{Rt)DK@tHy>^09{F&#A9BGXCx46Lp4q9s%tx1I6kFST*LA`$*e7~JxqTxv_ZB@O= z;i1<0ZJvTHsGPA^()~Ryl;U1>L=I~p;E@QHEG&0!VnW- ze1B9V_;zus;`^REp@Is8eEpKU<)YW(OU(e{nDyhTJXZ!sa5)a z=kS%RuFo*lWPu(G{)MPP_<|AZI3cntV_q>KvIZ)(=6FL#NBb%gMn488Bhgkn7d1ue zt@5*0UFL4Yc^=QIxN5y~KsJsgDU9?D7#S53(RBdSP7KVOwdl3R&U{2_`t1aZ$@r-- zz$Ajlnjx?e6EB1N*fwZ)y>Cf%f>g#tB}_%+Z@ZPYEX%-Ul2pKOS^dK1KR8o!5wA&> zW7!+=T9BxP9GWOdE7u6C8*JA)s%-wno(MtUKd=1-%NHW=4DrqJCv>Ig*N&lkjjb6j zD=q_!_ED!@51qI@jJ3>gz*3DL^^t7NReXmNSDKi0_ z8xFL=M1z5(mcrc^RnuMDMG8M}^(L=?L2;@hEy|cHCdYWEXr^%CBStm)e7Kl^;9|b% zt7&<2fu;sSNCh`p1M#r3G*h#O)#9@wUL0#DV&WeP>^XiG1xy!ky6mOfKqbzNm_5;D z&VIFDNCmnd_Va$Z)gxlxo9$&T6KMckU2Xa#ymBqhMtIQguDjEFXy4qFkuV$toAeXV zxOTLFWFck(vho+6f-VF&8`8`7qv$97&NzKf>?BvB6x;H>W-weWJs=2~Qv@6}{^Oahw|!CGd4dw`_!_6fbt1=?(oA zsZIP9Yc(t_vrmuZ3wP;HR=~#?*m)2eCm5#S*VqgWFi%#b|LYpWMaE5p@AMMQ6}m3cS?(~<@0fOspbF)VP-RS!4~3<>cly? zze6p{Whe4A1*k2443yz@QUQ-`DT{?8Y9HrFOG1tUI+P=J-`8I{&v;Evv0T?)L}a6G zkWb!Onkd1Ky!nXLGR1{*LtTE{$-X{u0$5-RLBOa-HRRT20b&3REW?9@*0G@e&SWnHjPf)_nZ-^U4gi*K6^$=A!C=qNW(~1uSkX%(sRyfkKGL5;vZIDbsUVX#5~a zr}vAihJ~1w)dh8dSdByHz#FyaLG6hF%Okqt$E7Uuv|-Ie^e)A7~<{-%dDdt#1+xf%> zWCO1%Q!VLJ;gkf;YHXPwjRjO@_l2c_4nu^?Q=8*dxW37pXSwv=ovPXGJa=ia?3P}) ztwHv=6V0-Q1SGbBM%sO%>miq@#T4V6IN?QO?w2&uzY_q?jO-bNjE|5>dR`Aw7O>T2 zu->_GcxSl>t9c*xDR~}ZEa)pp$3e@FrhHNQsB`h0twk5JHbtg+YZ9;k!!;Tz)gBwZ zL&NwD*UDp5O+T~7B?HDM4+`cfKr^RHkNI@mqi*MgnYum2!H7j>1jdu5s0}(|1wJQP zGqdj0p(lV@+hke>&$1|hcldK%+aHS-R!3Al+TmTyDz9LdqlwNn<8U`;jWqC`r0zxK zWr1xXKer4C{dxhUml*}3S`OpdeRQ*NSoOaHOtbn`5E4m=#k^~Y53iV6*~AYk zU6-=?jbiCP0?p>B#;-)h#5x@9X# zephAcic&KIp+9ZwwLwcz1Rf|x9qJEwqIJY}T^=18`FnekwQD<)6dGHs%S0_@JGV=Z zc2tbc?Voi)!upJTHhtUVz|aM3ecE+$vvjQHKh@pm2eW&kW&2|Jl|2zs%4+?8^_v@a z+0Xzt*wNU4!Fb0F!8hA=*7{YWC*$~=P#on>wsaXe0fk=e zIV&3ma!$4u#irUdZ`ONomraJ+&wHQA943=37aY1_mE+i!F|OLfJecp{H&D&rqNRzL z995xyrex2IAxq%XWG=?7EOLR4cva%gU{nBOH&RFd4{4|Yo@bhw2|UIn1+fsrP7{gv zj}v`47@l^H5|oXnN3&TZ9lfH^4B}L1o3VBAvELJ`!iCZohZq<+nn^cS>$SVTF?Q$Z zz=6NLC**2CF52`4Df#MoN~*(X{Y3Qz5tlBzDM;nO!pqdSfBak#KMfrlK!n}kp#3lv`UHRyHN^`v1;SWodBhsP|AOo?* z>Q_~M`*6fBTUnz2;v~T5v%_7W=<=49L#Op7R8IigBjSuWaY0<-#C4nnjDe-N% zDY-{}F#1#p_lnh^5xh_n@dJK!F3-L69&|2@cxjk3{Y-M_)Vr-jDaAV3Af^UnIumQv zQ=~21d}Fb7G^u?w>WAf`Z&FzuSQ$s{jjjP4PwvwVz|Pl$R{xeAE_*Z=1 z0$y^x&JTt>SwD&5y9e8{_L#l!VEe!fVxQ1*UOF)f@OF>TS4KWWHusXQ3#Y6Y_Q8`; zU^@EJFnq8aZ19-mW#&k__?t3ePBO8zhVEo$&>t5+o!GufZvX}7#2IBb@u?NQ$N9$} zF7E6pET7o3qS4ol0JvKcyay?0ON$A{l5xfu8g%&zw$}BVQg|?-IK2zCOgPkP;D_;g zH-nWgRdzFuf!I_KA2{ag4P=^yhbX;rp3COgQmOeFV%t(!QRrW4BfZk1tdtb(AwQ6o=Pru(_XIO1Mg6)_qApEO&^81?J7opYaOf&V8 zNUia-XHtA1rwnY@Qh22`)y$@x_c(AWLJGY71)Oi{6!5%9j#+IP@Ur^eWlWEmGFbS` zKn{{Hswb!((M1#Y6i2NqCt7~`dw+t-taD`{n;~s{&bv*RJ>Jjk5+C@=WT1Y@ zZoJB7T(X14Y3-1|Q$sm;x5-L)pK5F0)zh_l5bpUn*-4q4598iJV(I}AWNr_6A-{&lSze+=(7%$uy5^6I77ZysV0wWkY0Buct3FVRC7H zmL}lqKs2uNS|myRhaVvD73%HM${;w1woJjTB&sGlL%L6Y)DYq{wsBqlyd1Lm{hMGB zt*x7JK3KN9r39mfh4du#$HT>+o&OGH5yQ3{+DP9jWY18-I_p;F`@GjCME>r7eNNUC zFc~NZCwr*-r~Bhz&pr(4X9O{|7tp)-_MfInjh%D{ zJW6XyJ6XQJwXLyYcecT0w;mr3#cHz0{)Gu4kRZei@6y3_gLf@^ZW(NwO3GxE%ev|LGqH&p5fVs3 z!2B_Q^xx!8!{_@!>e)B`_vcT~Ag@mzFONcJBXfkCf^rM%5zqcAoXpDxJO}nF(+mzK z@4m`>8)VMvUi;n($87vd7zh}(40ou{`I|rPXTUkY!Mw1fb`WWeIol*7JNzD6Y*Ye2 zzildNmQg(<3F)}z?+Jn)I=k1Qj#jt)B>bK6oh`Tc0hd281n>;T9utUhE5{8J^y7={ zz0n+d6B=fC-l0#jBBqP_Zi)5=!ILliaG}|{!b;LVy*lN;^sa&HNRbEOun6w#cfQi0 z;EMWy|Drt$K2$ao@xY~)z0I>8{<56dMZTjb?K&0ohE{s(`+4!#Sz|DKiDMuLou5U& z6y}?yrMgg{aJ;?*umBJ|I7FBXD4#1k-v}!Qdws+T9{Q6A&NG#U4;2kDU&KT? z@{apoBl*%~6r$4S5cU^|O(9AsfiWtIz$|+}#MRng_4)zl1yn}C?J#ojYjsZ@X0|_Q z3#+_Y9z@tTz{Pl#YLhFdZx$aAg0%V zZe)E~Ff%G2kH=3(?O_}T#Y96$x-epBSgIGY^QdQ4hv;P+l{b!~AG)oqNW+>93lB?tdULRN zf}n}!T0NtFNG$HY=6}rzH;i-+YgAFdhK95HCZ!ai7fPIKfT<$%lC%L%R6&FFDch&d zf%Rp3#I#?-jT{ZGJk6rkY|Vg%0c9}{l=0u@q1%S|8kD%Hf8leeQ0XK^nVW`K{v+uS z4pogz0aHnKlyOeZW*lC#{o+Q}tzEIrm9s!hq4Iw1;|9+mKD^GWw_YHI&Dx28VLuW$ z>&7`&g7ZvSY=gof(|!%`5}b0nozBkjioSNBFo`qgp9U2N>aJze&4Y)_fa#}PO?dvt zT7<8YkdvcYuEo%n$5J&Pr#wwR4Zknw9z27q*Sq&7=2B-raMQonR(pH(hcet}%({4f ze-q|Y~i4gTP!Nrpec)^GTr&Sk}xLS ze}A6dP7i_adVM|+_J?bV+b~jd-{<>w)AD}JE$b?y+h}BTvIG++swrBeus5}1CXqof zL=2EPm%lJGQOa7c*q3pDaPy{x)GE)|fQx4~GCb#JI}{BrD+#V}|M~;~G)-vuR=(#c ze2U}&DK!iixv(0{@SS;uvdhbipZ>cucBTlO4t=c_tO3QMhi%QQV0|eK%N7C3iOg}I z0ElT2hC)rZpx7?mbc=!cpeuVX6~>-ZOzw2EH{)`G+|{#(hU)gOT#7vRt@}z7dJgG& zoBZ*ex`KSPj5FCvSA$$Y{{mr(zupR#Go@`7&tUyHkX}DUQByz8dTqT3wzhUm-z0Fm zme~z$1KSK~bi<7KGFe^IIMPB37c3Cw7>K|~Sl06Ff-BdDL?EUqL1$NJVDTK8ES76E zZ9vU16yjJvZ3(zCx9zkubCE_dFunvs2wZQ-7j@5>ILK#?LED|mtI?r9zK z;14J}g^Co4%+d=n_VI1|H;5H^m7h0fra){E>uFo2fK?Ckd34_>Rh%{p`;AyE5E7ev z9VbWJ5MjNz(`?10XB)O~zwpqNH7C|jPXxz1`fuApQ7`|%peHb=4Q&=yr}%rMq5$^f zg%{dH{Hz9OR_P7E0ELvYMT-d%n1N&u2AMb43re#XaW~5m#G5b&^nHP#-Sy9ZcYnTU z8#8jj0ed&2eftUVBOs$AxP(*@R0eD9M)WQGMobLnVVe+dA2A5)%9nk(fwcbp?N-F^ z@Bqj43!oOnUF_g?YA`(ohs`&&g3klPj7HxMW#W(hn$k^xi%0ID2RMs=v$GRTh08W# zMSEv`EAQ2naLt#?X`TAa->Zc$Qr@#Y1LQ)8qRX{tX5=SnCe$aF{j&Q_h~2u0xZ=fr zqH_U9=JcWw2htD<-Jla+TuD2LwA7ubZ-avj!756EMQb>cFz8SC)BABkMk&G-o428l zI10u*_n~@#I`e7iALZb{AlYcUP|k0*V65_D)9h)87?BM?Qo|k(b*XycUwQ7v<%`x$mhxd_hGpHIIzzt#4>KPh| zN)YAqX`k45X8XOf2Yi$O_$LYXHK`sWp}gEmH*plO%#)#z`0sZ;ey3ZapGX`g(QJ`v zNs(tc7D3G={CQhMH78Rz0?Tr4z@wSvbNcEde_%TGRpZJ`OV5cGJPC8f6=ti|zo?Uw zjvL+wyd3JxU@*~npZUVGdcW#eH7#_D``NZ&@b%{HW~oZ!*LhcY%&n|V7H(2VXqU)F z{nJwFQlLL)OJ5BX!lN^E%HJMX^_D1lB#NvE0*q%$qGY0pYBG~0X-X%g#Y279j6(hE z6CiK3QIU|x9JSl(el2n`LL23^-mq zreo)V7wdpS59D!RR%sQAD&SWBMJK8CYVk{d#jDn9hzOJYeBgw2g_%!fG6y-6xjdGp zH;b(-x0nZkG6b2&_*a^EpY<2*7Gnlk4={$;t5RT|YFeWDZ~yMwF(v;fI6Pe@vx2t~ zqlug+J{-%k=jjZ99+SZ9+Svf!AKsYx{%Nc$)8bsV67kpjB%RHXgi5nGuET2@zUvBj zcO3g(ZbLdP-kR61t$ft<Dweeq&@ZNzOww1?IRa@Gq^+re=OOf|_0+mD8~ zdy3}aRP2-OuT}q-hS;18=j?R2dnVdE5(HMl&XW)@rs97^39^~-@GPa`)dy`ABxt?V!79~;~NsI6viW|LXq>0qM9`rSatHv7ZA1F$z1U?dr$ z2n`;h_7v|-6N>(n3txnZ_9CU>uRFl(bX{v66wDn~o8bJ~+znZi5{|aeQjKx`mMlJI zr^!HJ@rHFLR77BwT@tM;zTKsvv1!t@6Wb-??FKSaCX)o3M`P zO^#Wq;G3Q&WHZcaZE~q0p4J$l(c5*V4fi~lmMvS4s`z{pQ;r;NdHIzwv;OQ6S0=X} z7T2w#ilh6+Kr33dVMBmPfE*X+^+OJXT&XB|o$hMn(Lz6{xMhgc0y@~z)*F28Opc$G z47a92Ii@*fsJ%s&^=xSVrrBg>En&Zo@(TZ+@2O~CiO5N2H1c(Q*${uCFy)MP;n%i; z>$Ss$+b&?_x3kHoDxjYj%STszEwcr|$=Ty1mwr5%4SPmz)-(q~!R4UM`&Dxf+y z;w54DwqL+A~Am$k_g<%0=RlE=PTAy+% zUS&UbXbG&@{@Yga@#;nz+lfCaK(SnvUV{P0Nfpypc&Bueo)&!>waKmY(bCKC1eeE~uirlcVVJj46y54{+m7=L zg+Ih{Z%~84f`@FoEN(?IpRTIW{^79SMrbhN0462?CoofnfnoDda&TnD!FLqOu6-)d zZL`~N0(LgjO(Z2>A=^3=GC`4Y)4Q;VfO%w39mXRv+ud|E00S4t3?&g1dTIyD9C^{H z^C4#wLoq)+b9vShvUDyDsrl(LTrU{4{1M~Napeq4dhhnJ&y6hR6b7lYy5E%s!I@3S zQtIDf3}F4Us(Ps2avJ>vB(ID_beU3}@N_{gq@DS4AQ%3}mrVdu{FUny`f$((4eb{N ze5Ff#Ux9#whIG$&mP|6>S;D%1jQ$H>`QHzg2(x1O%dey(T+|}8JDrb~;J&zNoYbx;jpSi29H%mZxenDd zR0nkz@uWxs+BL#Jg<-WDP7m`fad$-y4Pi2f(OQYAmun=AOA;M%Wi{G0$G{4|5pjnthQ_dJ^-QbRda^8flQ?y z)#y#B5O!X7vlo+}q79JoGOzdXDjU6Q%je($$SKpB*<7`fz#t|TRGBt}r%(SjlI|$U zoXyU7EMUKjuT%V5>WF>XixBz=L7ry1^?(ut>IC>{?e@6Ka&nvK5fK5gnJ0&Wqp0eq zhmYHfTL*RV4xhmwB3E1pAKaiIXB^G6*q??IgS1T6k&t< zyJ5V|?W`7uCyA>l!ss?m6D-Xv)?LzSp*y*Ld=2XPPyz+~#3=BU{~}j1FM{>gLm9)* zF3(`?y*|XlSlqj4#Ys(08cNY@Ra;&y4}xgmNYydhA520YY7qjxma*TuNGNfhMYsVT zME6!cY*@SyNns3Qw<3s&$>2lIYd9a_7Kdm9=Zz9J01buspZeoH+Of@8|L>~`QHyW;SeZogk2W5V>ma;7aIh`@+OE+xHUz6QeWM_M6UwBAfPGaQZR zu9%DpGVZ#K0pIy&J{nJwFg>1yHEZWKiil)-J^PT;XzN3%C|v-EQ`Evk3BGbh(eEv_ zCooj@J1Fz#!9NB0EX{Utfz$Y>B*6K@=+1aui5!U5-s@afwAnxjy&uV5F0*A84dVUty{ z{Vz{-6Olt0xNp54OBe+Eql9D4`1B0%!BorSC>r#xpvk)PJJUUUVF{&?#%M18Gm8SI zjA3s_dSf8p`U(nB#ojtmym+DOFI>tEt+-HR!1>35|Ch2U=1o?z>{L4$XaRluE~!Y@l*qp$V-zh&yWb zKmm({kO)xUm14<(yS&_l4d}j8)Qj7;f&P9(`UpvzIKC}{j?`(uqSD; zF}$p|3(AxpxWLE0k*S_E!h))`Njw0m1mspAf|uC>5|^!g%RDr+Se!OmXG-kkHfq$? z<=`O>U>ERPY~f3!XvxU%()L;gaDdWIQI&a_az@m1KESg@Lrifi{l`K!OP|FmWlnny zhbiZiH0aj9sblB^xstBtX7liDNZe@cB9XnMZaQ9pepNAk-LXA9GD&u)n9|m!1!QBl z$%)0niu4Ofz>;O=(AIPbUpcYkXI3_QU|5g705#01(N%W-c(N&J!}(^85|E`coMbc& zT%));Vg1BiWR~Ht#X_>|*L*StT1F~668~i+31A=rasCp7*)l&&gdwbaJdY>D-SBxY zB_&x^8{UqF;cqK>1`_J@j49!TBbR^1v6 z-Eg?lMcVELQ}rsw=D%n{P9U{H+a_3O@6+FTF8uXuES^2Vw?pihZ(cugG;bsa+}(2T z>qMGJ&21xXcib{*;g0cj->29U1CB<=+eGy}EGLY*{^D6F&zn!t9 zSnIroJ32Yf@V+d+M3@T+Ja1B}_}hW)O97W#$#1!|8k*%wU2?2b)K~RHt&Km4iQC(T z+u7fUDA#at^OF7*5lE#62m3>d91J*-mT%$@HJh!M^(MKoytB zdmtL5I<3zi81|gqUSJ9vfIkM6mCt-cema@RY5aV-CHE4cQ?d7GY?A4(LlH>-njeeG z$)Yx0XR!y@MH1?-NqVpFUYWe~EboF<`(K%?$lhEMyd`-TXLYCOz@DwjURV-<$HgxV zlFi7qcZga>ZY(<{yN>aOY$0&b@ph!^_U!_v^oPYq2N~_8H)T&j6=}7H@Uk*n!~oVa zgtXli^eMa=fqdpamWTD8cnMNLiH{lrl|y|#d3BJEdD33R&;kpm#m?VHu2l7s$KT4A zv5#)MPj>%$e-4PVWytX}G7mtxf$VI6|BYZ0Ogm7t-{;q#5u?n$g5$sl2aW_f;$O|) z3ERZw4)a9ji3SL&Q^e3W`C3RW&dB5#Y2tB2B$)JSt6v?ziZh^nS5lr)zEPOytnOja zq(;AO4X=sdw|;(&=Zy&lgcaS5f)xx=Aoka~-fd}XN&si#nEx^rWDtK_q*ElX1-yUu zP@|UUxCPERzkfbG3d>lQK3y0{zir{rT*C>LeIj0a@`!y($Uy!)v|qsXPws7sdb86Z zb^IJZDoz^;8iFgO@CDjPDAo1@Aj%|_D1)&JDftE@&_4G8w(q=rb_bm}E7-3yiPhrT z#x-k%<3P`OvXsh1UqhpZx_~;wHb9M8>-?0wET+#;dAdq{m`xz&c|uq|CwardGp>&6 z`(RRAe9Qb685;PrTVF^l3h4En=0jSQDn4j#V8vATkUvdi;V?u4@3c z)CywBN;Aek7QIffOtO@#QxlC;Ff>f&kqJJp)d51eCAdxJX@&NUSH&ZtjvuON492Z) z4rYh3jPQYVR2bI2MDS4=f(5ES&l_S)cV5;;-`c?Zt&mmb4zH?vu&^zl87zk# zavky~wa5wVYxsGF;FTa1WrM%Gr0~rZ^EmV$l54+>5tfXxMhAfVT-)pkswtLt?AyS}aX}1OXwS7y?C|fEoKs5#o@@4k8c^D0p1}mM*8AHPkrx=q3dS zQ>xHnqS{sU&3RM^v;pO)g1S%r&ej*9--+;|6LX&v2&B4w zth7NA^GgDrT#whE^(B&%bv6Iqc)p3L8j})7z3~^~4JsY^@)!K<{On|j%Ws#8fct$2 zV-Ci(%V|5YX+&HY{4`rsa3=;y__1m;`RGw|GR6KoNmt?lqEn+H7w}N5C0Ag$+0`g1tTzZrMT2ZOq7M ze5dX=qUu7~6ZKme(PzcXn7WPjNTEZE)Zy-~J_!MW$4N1KXh;a;IunTAqYFQlsFB3-2_LB-6b`m3S7L{5Cqqm8UQ zk?;0~AD|(^2~%Obg`=xS5(}3#qOD!s6mH(U*mYz@!fQ@C@GZ|&bTauO;#yX+6H1H5 z=(O$}d%iiPk?vDduo3MCBzb{@ZOQm?Sf}HfH|T59TxGR2W>G*XV?Y3~iS=B~$?Qh( zO$PMs&sc02*UkJvaz);r;jmoHT@;u}>>Y|tei7@Hhw8uF*#39epwaX`@ZQ^?5!`9E zpKZ&`C-rF&PxKOBF!toCOnIM_g{Phg5{H1d)(d_x4MxKcz4$j5==8S*6`i!7sZ;kR zqZwj>;YYin^Aq}L<@95%{9{%>t2y8(OF+Nn??#ZzyY>4!_M2C5qu|h=UB(v9hSAZY zC0rNI^6SDsZa!~VC5q36JKN*i&FGV7IgUQfuL&Vw_@VMKU}Dteb#b5~B5tgbjy11D z$eJqncN@Z)>BQg9z{|&iHE77Ux92@bCYh3w!PAdg0a~Wm@q5DxP@$K7>BAA}kVPe0 zxJ;C?lEz+heJoqTDd)wScX&?UBopQ&4qYKhgh{A2I7f1&hnm_>#*Z)nnw>vpXm3cc zA~Ss4=y*>*D;)8(BCzbg6oMGu>OOo2qj;u~1v_?BvDRc0ILrv+|g@h1wj z>mc5+)HiOPQGCm-9utSFS^n9lh@I=Gp~W3G6su${EOnF12dWVkghT|U1QG>_{XP#TqAT}iaKJ(T9DbS+qhb5 zh2&woBS#oaER`n&%mWenBYjW%R=uj6i0iroJfQ}WbX(ONf9X_x`9ElvSTpjLixR5Q4>H|kWS)7frnqTs%ss@8;scL)&MjK3(X7Aba zb*tPa5FUDNp(V~yZN?3)eN!BiXdObGze90DEu;GO$N+D}kD*W1$4<(H)q2tQi8VxK zU8BLsmmOw*Z9l-c3R|tsnSNyOP@PIOo$Te9hOd2lU=|LuMAbY_U@z72Rps3Xj@OX+1(B#^$fkpzV$yagtIagOq3fot{Ta7Fv>w(C5vRRXi`)6av%C+5WjI5f~l0aS5Mq( zAcru-tOM;)Pn(h0d^V^(dqXIP*ANC)moX@E!+kq;tW{OAf|E|e>?)ty@rjSM9nD&2 zkdu{LrzMOVIa=5q!{MjMuT;I`xg=gCG8Q^Zo8FF(kdPq7B3N?ues%>NUdL6JTRUU; zLVJleDS7UWz`U8FwR*3)-Ax$NrIB3(AbOA73Zd5=r=SA=jnFUR@DUMvZrcexJa={L zyK!Z2>d9B;8b}ejkU3nTj0z0{k5pwB2$Dv9(XKM7^=~*5VT~`<6W>V0WK+f!T&}WT zSrkxb$72qfKK2h)`j?7PPEJN0AqQV-z-P2f z5e7TqUM>cHSdcrHdn6H>aJwU1y;*+d&mitHp5hX(4D&|X68=4ns=={bUH!+RWJb}n zlsZH!-N~_~@qq68)|0uD#hL9G@2xSysTOKCy6J|)u(#i{x7(hh;0O+pvwIrYj($C zvs%{norRRLg9c>LwaLDd_7H?09nd7xJy!ROdmrM ziW}+SoxCksb;C7rcRU>)?sUh1%wQDB_UH*IV@MWFH87K`@wsEm?g^l zPdRVKD2^>?DiQi4(|>gxzNY9%c0bUVzrr&;CB$-~;xJ*I7w}q2{;W>+jQg4$d%&i$34`bE%M-yQ-8n+ zccUkmm_T;0K+|wUgQv6-8BEEK7XlRTiPr$4ZP~MP72J7{OltTLsE~Ik;To}ks`uNm z>e&4*C3F6?FY0B#@pIg>+!2=In`y9CiUW~DddyR-`mqfzfi>F22=w`N|4g>~J?Yt{ zv8CcxEEOlR@`v7{GPkuGG1G>94dVHB{lS2a{s1wj_cMZou^faMqA^Qy(z6^Y7 zoYMI}*b=0<(vaQcI%a!F!-w-RBYs)gyO8{-7GxK48d_bPmNLfy z;snw;zcsQ8#9g#68|Opv{%Sd?f`cjj9IH$`eg#*xyUVJNW6xD^C`5*sN^aaxch!=` z^^D;reb6~Kjcn^Ef+ACIq~>@~85!0DmiLKA%FwN3U>=V*U60jUI$lvbO=Yly?c1A3 zrEeY*J-MOd!tMAeQ{sBGQC_IEz+Y9Yj4>*S_{pGjyanqi*w&8EDah8bb9d}}9RxOv zISMD^0sRzum&qkB4lQ3x**SScJIy5+(V4#tV+Fw z?)lsiP2~L-h?CIqkc4i_wLH)Dv1N8Yui4ATrohB&EovS<3O5axb?^SO@INsk3+Fa$ zf{Hqvve`60!*Knb2Kwcj5P0h|H5vegAW z9gpoznu%RAj7Gi{uYD;8O%)b4blw={q4l5^e{Sx;f{m}uZ z0e3BnhX*0EsBPQWnC(f~=5QfMApVZ|jMk}e_#qOcr>Dy=_w`en=q^ivhj4ZOduFii zz}hXhEN@vBvb?qGE%BTsH@rH6sM^tmDLRhn&PC(p*q{uLUf)tKDc$alhz-nYAPf;d z%UsRN)%yVl(V>>a@UCrIv0Um3^DuAU`oA7_@#C#0_SOZvcKA)Chmmmm7CEcwpg?0 zodkhOcI(+s+c$prfMB^BxJKO-ans%x#uI(SpYQ`=A5<-kOmt3=VOYg08vfH^h%t>{ z?T)vn<=^XRW*c{lF8v>}c+t4OywzxQ9}uy-52{G~wrl@6Qiy|wTX5~_?>f+(y_xIF*QNMQqTa{jMbR)Xnxg8wm6aIzgagGR|<5^?V2qa4DKi#N27NuV2D zCvMBNYRF>j;yo-GMn%A^*_Z4DqMt3)mA9C3HrPK|benXewXeOqKM@f3hEGj@G#GW? z)*?WDporW01NyB#pATQkU$;Dg&bk`hz|D?c;BKtUrX8p7slV^f(_zT!pe^BS@xt8} zckLIXK;3uvONzX&cX4Zw;M*!+8sKeJa9Prm2Al}!^E3Q%`f3RFUrZBtA)(~&=Z0WG zUw8p#5S;E79%uHJ3ds22%|pJM2h>`$O!4HzXP_HxLmAN9+JYS%!7b%W@`Wh@8~0&x z)&)S(hYlxG9d%hEna3ZC?~$8yd(xwD2hF2c2Mjw(83U=2UKY}&leLg}d0|y`1#Rq^ zdIVl3Al$4O@rA)|`36{(|2zYnLSM>ESUJ761?1FWm3V!|l6(=6-Sb(A3sD4LHqXo? zbXsrK0suZVrXFu=P>Il(uUhXw3y1&igOESz#DYy4RK2&*+sP&&DU!%EY*KI!dD2sY^KO>_2aJjLYy>i{mFUN4#Uuy zF28o%;w|F6J?>UmDKVManzSORW)b-VAHY*_(ar=tP;C|TCyv7g5QY2I`G|5ssDdFR ztAUpPybhMHSq#9CU7QEn61d4K{LRRbfY_7J1wk*}I1!8aB-A2_RZ7x7#M%zl3 z87AiovNl{LE0cSbe{1Yb1foa7ivh)m7h2m)XVQI3?)EF^*^*+E(+aHtxb##;i;ZRV z8|RO?Hh5M%#mHLVuiRFxvaZKfR_fUQ(E5eNp!QS5-XD0LwvC=doGdA`hTc z&l;y-cg)x$H$*3q2-Vq*^9)rAPo+F_v;I?yTd_lULc+&P*bUa?I^;Uk6{}E$Vr#$$ zvwG#ZvNZ0-7P6?) zv_%j~eh$$#U)hs^9gKa34P(ltAu#(@#f+|ca|8^W(Mfgr!gF{iN$bHtIanJ)HtZxM zw0N=2^MD7GwX?n*r0uUI(W{b5VU9VDw=SvE7WJ8gWuO2LU{L3$$Ut2ZDZx2jGkHhh zK$2GtD8P5slqAcnH~p4r*Xm~cPTKD`wUze627jkOUe*>1en}XPLe;-8bJ1z@uw=N)Kdh7aZ+ZTFzI~2QZ-DR!d{_S-t;l8QXct@?$62`{i#+({ zqaf4>Q3sH6ZR4?b*6g0Gi#t4>hC(BVp0M1)0}7^%Rj|H|`Px2#eCD$T?onaO_Xy05 z*Y>Rc+L%Cj#)KOnjC_D-zFU8Y%&97#GW~k8yn!qJ?z8_xShO*w*SBADsFcOsEk+&r zL=-zh(<;^CqPpdG0JC%t&YFxyaMJHR!&(@sy({Tm!v7$KZb0?~xZ606??^*n{Ft*<^xj^t=_zdPnQVBvd zJf$w+x+eVwk7`kZYo5CmB1Qm!J!&m01m;e%*ke_ok&&>{=EUytf^`}TkpR-=!54bL zds-#dIqdLSv~zmfVIW*`#7Np%xcptfIzogH!IHNB^CYhC1kQaO`h(VC%lrHD~W!c^3e(NwosC19*TQaKCH^)TN3Oc^mEdDhrs^-ohA{D7#Vz~RZGL$s#p z)kya(;Y-8sIV9B6kyichLdsyn?~JG>N6Q%qT&P;kaL>|r)EM`F^Tp+Ag#%^NV?}ZP zJauI99&ONzV2Br%P-?BBLc_-P10fM+FXLj37S@w9WRFYJ8)0|Bkt**azL%w9xyNl4 zIiuZVMm6>CRoe9j=n)1<3wBL~z>X1c0-)^Sf~QB6V8PcET&Lm=BXQt|Ns+UR}OW!Tsh_Tx&~ z8@*-j&v5fkq|;I6dR2;336H0ivPx>4EG@8g$iq*X33^fF!p-U2`Cht>IB>(9yBEAU z;sAxo;sug8ZPNxyQuB;NAp5n_YbuxfaY;V+qt_fbMYLn{OXCK+?STJAL)34$i#1w_ zi`<)qk7&hm?5y^16{zcc1oAp;vQp^9{i$;_B3B0f#5(?Q-88NQ=o+qgIn{XcB!@d~ zZ(^UDXf`iQ2tzhZ_8#)iGAEnD{8}2FdOGB5NIqG<_xWc2U)X#Nz#jqYL)LE2{%41!4zqJ=GZgU8=673OSYTu@^=;bZ|q zQfE=hql@Yt(>}&})?n!*SPgw^4#ZVJ%%#AGblUq2X<~%rWwyX?T1_s%Rik;8V*ULB z?Y5nvqufLAdf5;f&`e69G50?|UKSGz0om1nt2I`$HYACUi-(b4@{PwiErc1Ll3Gdu zO}*5~JZ+m+^ep=yvzuwcbTg|b8DY-4>&Z~9C}N?UDT7+bPRPT+6+g26k}XAV#S0B7 zf`hcb1-2yDB>W&u_k*vZbU;ToqY zoLfctaQUU$4c%a^z`hA|1DXnBjF$UY=pgz0G?f)KM_-~W&03O5*)pYlu)CJ7VLCncquG!X@|0g$lc+k#x}-DRhNJ@8-Up3s!{rTQnDsZmF^;} z(9yAwMlAFONL6NF?Otu{?DVNh?Wab>pqS9f|%1%=I=SIza6bF zeT9>PzwC(vX{EDfX1d9eKklKipJ!3s)PZPxVb^qFEPhw0w%%5jo=wKTswPH0q*l`q zWozF&nI2jvdhRE7jEpIf_C<2Ij1YB8Ro>G!eSzc%ux^h9(pQkF|H?#Lv<|)A_&jg- zfcoiw|E8f@)T?^L1CTxeAYc|U8NWlLx);rnP}RItk_UtE7NcuouGBcs8_K-Btr!`D zi9yks3yI|B&0f*t zMDVOWX0A0H@W4edEBT@1Cx;qh$sDrY17Y2k{n0*bZ@Qv4QDIXVKDj7~ItOTaAH8u|jmHS~SHO?wY!~2Ew;d#8AM}KYpx0!~u zls!9BrfpKa7k4HiE06o*rR_SwSt4w_Gw!43RR`d79MAB`Qh+-`YR)CHah}Lp*Bz?S zG3%v&Gj%-eQi9A6T>E-tMd>UN8~Iq}@v+eCYvT-<+4=KueYERwSys`~O!uyJ)1M@X zQ+|?~h_f{5ryv@v1B*P;OS(PT3mn`7CsSZrFxbab8-$EDNpmsOg_xOj<%8taIA&Hc;KJ8U;<`j26-ZmUE0r^A1u4LpHM%XIg zjI)&9t~whL!$Bsh6>sCV-_* zwZhRJCHDB+)dB3=Mz+y(-dMp)XCT*EXFJpX@&^ti7Q6W9$*dPn9#mhRPG!D0?I}J1 z#XhF73?0(FfBQ$cSUhq`sKb>!U*d(C3y_@%>G)7(IS>HSvX{`LNkgXBk z%k{u_L53qJ+YFWyF!YRmSTHIe8ykS@|5wM?`m+v~JV?8LRNo*kP$@5vshe>2=O8US zp)CQK;@M@E?%1xoKxgT%jpQY^a%tKvVdWBOf~^m!Bn)xor@MYoC}AM87Pr=+ zjyxp?$%v$z@=9|);_rXghQp3~H^O-j;b*EG{#Hn|OJ-+bWTtJQqP{-&OyzGIMA%+f z+Zk{;5I?|2szKX$`LjSI7-aOvf(qSIg?$C4TMlf-hzpmle%rbT^k(M1%xO7_kGJ1_ z`@R5@`8Xs#4pc`H!zg^6^mqXh;-l{9b!lyiH%oUJ*22z|&bak3VXZ}bDGCs_ZfS>x zuJBvEI%nbVx622ySxJK4GtKuQOU&Hzz(*RlDp;U?CUB_zQ#xmTV+Or;Nmc_pJ!TG_ zLXPXLdkTR|@-HP;8rIOdksULC<4XTu@MJgmFsW;>7DPf&Q2_!TOXIZZxXD zo(&%(7bJGGjU=xWWuFBfTy} z4fE8NXYEk3h5=R-0cWzGnYdM7=M7}z!qt+?##lypK7xi3-CB^MYMtp-Y4jp-2e|}d zTBBq&6A31$vjT2eVxs;+Kd~i_ zXq`zuve8yuSUJQC(32r|m-WQzxC8SaD874f{or_Sa((8bXAs+t1VzRbPI`c3abN6S zJKWZDO7*R&v!^A#w|uZi{gYwBBCa`?Egw!+?8*)R072ax_T{9!6aEprY-P~~(@*ew z`12tBz;|+n&`mC?!^tS*J%50jn<%)C08RUHpf&ygyHxqxBYNeut6q21!3%q6H@mp{ zGrPMx%^eq-yy28`vp5{U2ONlhI4wfcVs){G(KWqjbLK2$-gK9cE#tDB*4 zMLN@wVc~tZ^JonsS{76~`_>;iuiUNb-h@hIQc3N-n?PI@F*W-oLPF+g;d98qcyKG& z0d)|b_<~XBI#9bA$mw?`M42@fF!2ztNTD6ZD%%{&dP&EFX+40SGKoY>Lgrp|C~V)J z>G968TBCaOKUbgt0J_ey%}$(ggTCgBWwYZ>0j622$|OCe?de!0>4#{_IW&UPt~^h_vDTEP#!n#o*4wt(ihdqm>d*)x(Jr92 zo)9@h47*yR6-{i;lJ+ouU!-|=t}Eg1^^(Wqr2sdyEKU62xpu?B8mA%jxKYg2S~UCC zP59RYixzLnJ;^EUEw9WdlHb&JI9F3nDrU&3b-Dlgn*JL4hRG|AfRGo9m%~8_L1)%pz+p)^AHN20s zG?p}vm}3S2ON>1H)~s^`0B>>SALYZ?EK>z z0Xe4kudvU19CD0csut8u&uIDRjJyqmhmrY&W48=ws6xt(ij6*Oa;U54btEn!Fo)Yx zbd{xeo{?E6{m!SMV7_pq+g~a){%at(ln|SI$zV*k^yAB|F1&?7o8wTjKPQR+kFbmN zegT-urP8~Yl#uVJXf2Oh>OM?}XfQ=xyLFqjfF~M;cxeA)&xaUnIA?cLpu9i_hOnnF8oIzi}LQxctB)o}Mpa+x!VUQexO>CIM7xT@u# zzq5_j{>ZFH7nKj$a3GvaVuR*7(-a!JqXs;A{Z+d5IvLEWTcLhI@LzBHZWk_{Oyd=F zMeFa$!3=oB)iT>;vE9XmKrIc2JwW}VLR7Y#lz5{cTh4`uv0~vnBK`6=8~pBbrRG$( z^{k1Q&lb0Kbo)3H)Yo^b1m>a@=*7W^M9LP7EPRPiMxfeQI1daWN)+!YQ@s>ZB@ghK zF}R9AemM-telJccLRumF*Y*`VWWG@1sk?H&kXsb5v1&Ct_lOlXo2VkVd@F{qR9kb$ z>CcXZb+aa7p{Wyl`OX@M*^iAZVjv=vr0ZxAROO|i$G(QMzu?{0#KCnnGNpU~2PR#N zYxTL7L9VX+_yBl$qrKs{jB%*O_$rVl_KxmQ`R4(|bH1c?2hBtBQ!{P~(oiY6`-I5J zT8s{x2>75SOU|Lr(!_Z@bSh<8N$@Tdw2LuQk2}9wzxAJhaht0U-!o}da5gWUZmo@J z>&}9)!4;s;oSpUHjND=av35I^%k4^vC$d%$wyOxep^4-Oj7R#v2N1g&;D{6pB*#=d zx&V#H+|KN8pCUgQpKxXW(?sKZBEFbes%u@>Xbsi&WYy*Qu8NekehC9|?Rn2^a=mqx z)k3Y}?;HyG6xoz*)F3i>U9vNMP$W{jpx*vIMfA(kzCUfYC(r?kqmG??buDXa98|Vh zufJ0z3FWt>R2z3@OVDiLfk)WaC#0a8iG&MxlMX5?6L=0P^2cxvDv(BqfJ&$abwH&= zXLycVamDwDeAUforNg4m1!t!;N3E_?ip`|Xw0xCP%>~s8Yg2fR+SXC)cFD@yz#r8V zFKMb(JyI$2)LRFr((?2{L-vq@Ykr4ufSU!yQ_h}cnWViotGD@om{Sb3-OhWNz_0kf zYgJ0q*dIc@&t3`7Y(kbc{B*mRkLz`^N`21Rsv(^r3o}a@A7g)q(VPDim}f4y{5C^; zYR=c`LH!MSMLoIRqV~s=I`<-2=D%gOiT!`EX@42M$|kjnCF$ZM(~+;moZ2RMj&GM z-vcl!LzWr2MXCBll+P@XNSceKFVGj{8=t^CJ^Jz6TQCqfMO$~okdEU7-s+1Wr!&$u%6TrZucxDFI(rEFHRls9#vb&-uR74^{hwZn&+cf?* zhfmbe|IXVd&pX7lFLew2yk_ER1eg0CS(J|XpDbeK;`-mRh+xv;sOvxadLFrjOv4!! zR5Su)^1mAJAV*;&d&O7Y=JT$EGBIH65;q8bsLBA@ZBz7=R zGAlEcX0W^rkg}sr$)=@nkZ4tsDgosVH#7?v!IEF@E+l2C1%}4A4%%X>m)OE@%81@MewW&@0`zsyUONwy z8Ue*C0bDZ{>{w9p7SosBNLs)O9+~m5ob*(pjh>d6&dLWJH?VoSj53ynQ^pn z>xig$I`$?x4?y=TVc<_^Z9L49RF#T(qyUxFzxHp$kBSV7B-BBS_ji|0BjG~Gz{{~? zuna;fFiOn%lDs<8V2HB?bc&5}3^KtziVcqB3{5I93gEhhC4pN8%Norm-Q+uEWov|T z$hoWSPi3b&@3>mzY-N6c)&HUD9D^$fw{V^8I1`%_+qP}nw#_}UlL>b);l#FW+qN^Y zlgXWP&X0TVzph@j`m5^duI}$$Ydvq81QPbL1o@VX6HHH1gK^+Fm#cw+>lUk$PPY%! z?{0k{xO}bHGl(3#)E4*9u)Yw9F3qUNX>v4(nsbW5(vdblV%RjPLL>R}SX#LA5_MT9 zF%Em7Q89CR1yTg4z^$uKV|&w4l0*tQQ*KV<{zV5iJ{ijSWbO5jIabQUMjP5>-q5kh zV{3@I;ybxcoIiRIwriXlKhj%j9M)d9(uiqH9cTp6NB7p*UY%0|AG;uq+JxqY*#h%( zaBIERv%3S6QC36L*WGSz7lYfh>6=m`!Yb!Ke5EFHq~$NXs>6U^HhWnR{T`|^nIa8d zA;A9fwJGyw;|EYO6+i))=niqs;^rAB?&b6z!=QPqKb~zqjc7?rAzyz&8nw9HaJ+`v zTt1??;V{!SK^`I>Ih0yz$hD{`%xMJyOE#kKsc5Dkf}fd+vn3XvsfC5NxJ!TpXP_2J zZCYzWn1`7!Kq($rygPD933%e3R@AbSz5UR~Tq^I3Nq^cu@>Vch1&#bw2lGP?G@UGZ z(Js-avbWj08mub)vCsBS=XiA{`T&-G&Fm-vmK5k^*T$`%$a=kWR zp>k|%l-`lpBr&mz$*lCD$gSsFNzhIFy76=Qj0AO414My8x`zhztuJ9qpIp4U7k?JgO<1FaBf4chr(jB!I_FS=3|Cjz|%DV-;E9? zY4`s}qB{|*8*tb$0%>+L^@ufi~;pYjp zC-k+l)^iR0>sTNq4oq-}}j=7!Id4c0>{Ur;d1w%7h z3GxTGw|Gn@Pi#_aG>g@#D%&_V5Hc-{j75UzJBW!EfCcQykp)BD_Bf&}eSiZnU!AMw zQ5I$U8#$K1?L1siY8blw3>2!dA2DK+dJS{pK= z=hD?xhKucNZ&@iZ+DknVN(n2<&Vv25inEcnMsky!U!b=?oGb& zWv(q@4*)kS=%8^Gj>`zbGq5eJbx9ist07Yt!{@YV;UE_~%SayD!*9mSWTcv*p697GA)S~Q?d0_Ib*2DLDio! zv>%60{3_pTtAAh&{}dY`QDSZ@oB})9gq{m_7F0lIp?rePjfrG6#dupWv-5Rr&2@YBtmZVC$55nxWm% zV~W-%(kO?vm!>j}F{8yp3Pv|wx>`c3Q)b3(9m{3acaQS@XjlG(H9rpRIH)#q`}Y=$ z%L8?{emzPn+Lf0N-aJWUYI_qCJD?p1L%S|^TH=fMYKqA~nka?gtKQj>6`UHoVXO;7 zS1o3t@gO%Mu2dGagBH`_zo5!_RYt4v*3JNZWlc0*DOkLO+Yzz3_)u=Yj0L9MRR%7!$CT<9nXsIAzzYk9MvafCZ3T zNO5g?^S76&x4;{Q?@IJ(7%ijW49F@nq86xH!8%%_4LXIsb{MsNIXL&l%(cmz zhjUbs!TUGjPDEV5F6zeL@N>o%XhkSVeWunsYwKahK-Of2 z%wxqyj5DmF(63fV!p$Tf6{B25S5=HGKBbG%padmBj4sTybwQ-NqJVG0In+PNuzgZ& zK|J#n10`R%);M&Of-q7|erQhTg6YjIq z$Sr<1@(fzC%@MPifM`)rq26TrZnpV{@&N9>Diev=*a}F$uSAkR+EJUInn}}b)ycV9Sxl5R~V7?9b;0fjeocVuis z_&2~%#0JbT^y>5|HHS49;kC@RY`*q6rEZw6W_mbo_|`Gt%`~;2<>LT9uxtiM zg+L621TES&?RU&osngHdnm(h%Yi!p+o)tT>dSXghBE8m=-sBeBHoPsZI={<$`4k#4 znjy;!?}nxBtDK^8NqeX=*%{FiqMuW2#_tWS;Z37*IM$22mhrFo@q!)J79f$W9P98n zwdLRf*~n$3^%(hOf4ALHe^>&=7qTD+$oP$3WM{AibbS)^6uTTFsj?pB^F*x4Jb`)_D{v>P2O7^Q9)PSGA+ooufhYdeH;6ftRDD8 zBZmH%G~*jRcJ`@qK?D88yHDk2P(&cRd~>e#oJNJbbIzpMn5p~Ti)#wSRMuf2^kx3} zV7b$KZ)GJa-5iu(tQ2d_?o?w#d{-7Ubm!=$tf{sOa8k+53lcp?pNZIffWym=wwzU) z`p*G&K*8gw1mY($3$Prj2?MdN;G$D?j)T3R9giKmfERz*-kLLTZ>izWG0nZk%53fI z676$l+(~QwoY54*L?oxQzUEJ7Wx3_StTR~%ltBivYA%0l;cJvNq$ z%o0@*wvfYA+Xb)9#C9StHnlEl7AsMt1Gx1Gm3lNQ9vgLYY@jO^Xfpe!-0~LdKO4rf zk~WVmF}X?pbt}d&S6?JN3e5m2J+lKr>lFS!A(Axv)Dyak1xEQn{S{EUM6^nJ{-WP) zW0X{Y8NB(KzT{Dhm5El>VY>E><0a)MimpGQ%g?mu)WE()*BKa+@hZpH^3 z&sGWq*+0wAFo5YW`5rb&>_vW$m|Mt%z8g3Pj;xvUo|MqgYOI$-$Q>gkv@w(nf2zh? z&;4W+-mnA+?qp^XG-rRDCfk!_O3Nu6^OjRIiiGpMrCDUX=8O$(o#Hv1Gqr~Ynfosa z=|;Slmf(C3Oze{2{#Z&K4ElVmAG1Xc2r^wLp^vuqkO$f>ME^k_Dzvh=!A1IOxuu2M zP^x9W8pORBhCM|}H)DNQHonc)U56BS$Xgqbh}+8)D?gYy9)~bp-;Lfv=!cbMJwdyR zI{5n!e)VW(X9#wStF^5F=A(!qy-ZDkzDkl|26oH$_Tf=tB5u~E3=fA``APY*t1U0& zp0ATBqVK>h{Y`xbxP;fSy@7+45vzn8Lw!RBAOG9A+cCuFfKWssgN@~fy{=~@V4!EG zzq`l%+TKjh`{~Wul8_S;5zy;)X(^(l1zFLF=YRXMn}x5(n~{N$2xOseB{9HfpUb&D3xAVK>+uNvb zJwbO=`u>_zEMCqOQ!?7rMaknSmPpwG*lQ=bJq7*|oQ<(E+Nxd#3tSu^R0oEmqZox$ylM*n5jU#`xAN_s` zC)YsNUlDlMPzpK|yBPK+CA(!+c>@20&$%K}zvy<zr!qxI(=lc zxyz&c3XNi(_4|X!NDbkS!KuEM3=Jzy^pB^Vo#v0#)K8B~s3SQ&Bb;_R!4afRM{}%U zZ`L1p^T|o5N<2hT+W&TJc0=i~!wZw%fg>DBWCA+i z!f?9%aFGDCwHC1a$kiWbeX}XP?y4Y{t0Q0RLI{-pOmq23g+$8eA3Bqc-^a?F5>u59 zNUo!ha+Z0OzW4U*$|6%T5b@pt<7;=g(zBIs;u9+$L&|5gucih0ZNVrNFVfUQqFrjQXb1JE-a z7)wEz5!a?7la8vpXGc{#;6m`hON$eRFWfukxiKfD(HL*52#bCM|J6}+Hvk&bx83u? zO;$&=iV5d>xc}gW^i=gf`}nexK88YbgUJ#p^kmwdTs&g+;?YWKqv!sn^X+Ja>b*5K zgxBrozHp>z6?ZOu{4|02$x6s2-sn!K_Q7c=if9goCpdTN33G=p?phExFUdt}XRyC( zRPViGxB^0^0q(ylbTbVUCds@p}GUGp>0jQD(>Xk6Wr-TxebX1zW~5L)SVbtPJL-E z%u={(ysWeE=*et|;q-%SdLOJNi^^)6n61sf_5c&w=dX{|mw6G{t>y7cU#OagC{V2Q zi9TyhFJ(|%vvIUx5hSGGbQ3t~ON^<(3wGk3eKsoc2v8GrgFmJXOLVJx!$DVhW!}H*jL+2vNWznr zED$btbrH4n)G@^kS8yRdl#Nn$qC$Aun4$dPKlpR%a=2yFG$(^-Zh8;f>LL|9D~?FX zz%I729s`+fn3Ed_!|)U(Akvx`H$g775m!kXv^V!Yt->xCpfh0Jm1##HJ&vTik_GsF zsjf~wINRV#)I+AM)@UE}tSIp*NP8DbDRkl*hTv=+uuC?ahcDTNbiO5xf|_} z;ucqabyI~f75#c!5?Uk5in*Tut+v)@=@P33gm>8=enDNY2RN_({ zYGEh}`$NAXuvEB;#`x|-U7*hxL~2-RtA$hMXfDj&mdBPbMKWI~P8l%$K9=uQ)o|e{ zn~pxy@IvV-A0ka{<`tv)W;BAL`7;MxU{bqAv?0<_BZNt@G zQ27JI!6UxqaTJV_VaGjBJq{syNx^tvj4Ueec$uq$B*RS;uL}3?zDA%l>5wD|QD7RH z8v6aAV>iA#%0OxMIdauyDt<0cj0sS=-pGOWzS9P3oSI(}#xvNl*r|lYbFT&^Lx&f* zdVR#w3h$L-=?(WG{SwEjNYZop8H^ae|LT4Nb;Y@qSH9npU_hkE$A?x8Co2YcqAb_kCDGDA`QXQC53HC?$EKr1AW!FHwQW?`R1Zae*rz;A~} zc&Yu@c*5wM8J4hBbz^7nlm2T-lkkKH+0PktDo*vG_PxZyK@2Hejo1Jhb^98|AWjVMezA`@Rx;nQp`PpfS zw6+@Poc2(=sGd)n@Md@=w7b-m&p|9jDIk;tCqM?m*oAe71-07hhJjCTMrAp*2jMtI zKhokonk6aNN)*n7aWRT#Z4NefG7zB!iB&tCO{B9E&RR8g_ChodZvRn1S}nFTYsigE zfr(}Y-?l=TBYSAKajuT;U3ZV;>1knH;9MSViT>YEWoJo!=u2llr$h+^DQR0gg55Id zTr?uAiIWt=UzVqZ93l!oK*k$s-Aqvw_h7jT+S+Qa^1 z;w9C!yL}XtazfYzC6l1$|8`?mMhl~d5*OaZ&@~vQi-JVm8hxiaCwW&J`hrk8ns=H4 z3taEYN%Bl8p%^?d=zFCHn z2G2>Z`VCclq5TwXeZg8!71-s1gOY}gOe?Gpo*S0!5VkI2d(fMn=a9mjY+@O=XayEm zt1~2-xi=1j(A9zorn|bPipBT0Dpmj*qEl^1Dn`zF=0;Q_qbZJK3=2)M$j)wQL-EIS zt<{-l(H8^Smyyihbd^W^jExDE&j~7`i^q!^C&wJauP5i1A1XVq&_EL_g&F%qYhVNZP^ju+z`xf6%O)8<)_`tjSyW3?+S)bx=)84aR7KGh_ie0 zC zpYreB%i+X`5pXNI&+b*ria+UrW!U!0>s&0b4B)e1gS0+NAx{x!D*b{~emQbv?Lc2Bq1qOaa$V_9 zud1>cebF5^pY5W~UOYwTx>&C&hfEL2`>x*h+_+CA1)LTVArF3b?GiG!AwTyR&)@PV3)wM^YP zK)F0g;_tnYJNW94yP`So9ENC%k%*R|;^K7?* zuL~ItyDobjs?25o>lni?Xb$=h=>L`a2!sLDEx(lkk|^}_mcBfl?b+i{B{$U3m_*Ji zxRN(F_*|ODKX&sK=kLZ+tbUIY{e2MfWBK0pzhpmU0A-7!34j6-yb$E>2q1+ZXp;V4 zh}z^|Xxik5kS>q6a)xBrL%X5{os@Bqv?=xOA;$^~o|e#+FW_Vr*?Y-WP{-&Anc|L98p$>nKz$pvU2(7KyG*Nj3< zG91HV`{(sc{O(!!J%iE;#hBJqMEHmOkm~~BQ|SwQ{S&VAe``C1Q|do&)bJsM;y5RS1Qnrs1ek#Do&GN}3_(zIS9icy z8`MdcI%$~X&%4)K5X8wFxL~x~H=?3=uX!GvF65W2k@sV7s@)CgbhqGyJiZ&@K+@?3 zDO_jvf%%V@i<8`cZWV#wIyGv4wBa$gNDaMXvOWFzeuH?^$7lDpwdHg(w&TOmr?V>} z&e~U_$mG=vZgXc_>m*Wf_OpBFK$;6Eu?UHzp+8FXC@ktcwf)Lfu6`apKKxJ?ws6N~Qq_kb}-k{lq7cZJ4+lB9da(neZw z7wcUD6`S|7klN83JB<=tPfz6E(0kgiyVM`R%_w%R{B+{6CJ8P6?@;^agDPl1J&V4? z+Hj5s5|@SO$tezl3#>81OqB6fiM%*L^F-Y5PN5-idnyP8klIek>aig^IZWxeP{Q>6 zEHtr>kfSoiUE?2Gyk$`aOd}Q@!SM1S?N4&6_9D&~qr{EmZ?kiBv6WY$%tDzN%)iaa z&Wkin?#Yp1~ciE>4K_WC?_tr?fRP^~Fw)!{=l>-8`OFFdZtyL(;BK~3hRmk;#N!(a6UDKL# z)Mn?uG|V&1eVS(Vz!NHFG+E_c)P8LC%D|E6fT^@@%RQpZhNno2TNsQEcl%mLYWt(M zq8qf)cTdko9<9;J5Y*|6u!6(~C|WC!m$FyuMGtO0M{}qw6{0*J0hxHP!J!;1ut}oK z5YNy_c}#Ig=Yr=Fq!VU9G@FmoCR^uUdZJ0?NT;RNe~!wNR?wK{NUEf;@=*Uu;xvnb zUF2yd=mkF3bRN~-0B{(>^y@&XvTI-zpR1?a#Yl^7G>p-2l{D!!Ghm_*_Xl(X+yH6!ny#~ zxzpx!9a-t&R+Mb5VAv#5U4deNUf?dKkJbyhA(9IH(0Vp@$wp)cWekQZc~jbrg>z89 z@E_9higoHsHBlPLD<#B`>w{rR4CnB%yo#Dyo`R=DsklpOj&Dgel8wr9){()jJ_znsm znQ@ltmt~Hfla7msWBwpGKbT)js?af?t7c6B*)OH|Y{-muAgd z?@^26@Ri?adzk1yjblUOXhZmxLCiVdg=5~@r;pQFPksNOZUH8ze?REE+G}JTMWxr3 z$ogKzI_Jaz6X26ISWjXe2B#+3CQZ>ESlFKaiY9Wt1tG!7A=45dmMsYfb2(>rSTL9Z+>y${6N*nTbSWVS|S{Rr(*C zN{(z^-T$_)xHN0%}Cn50fLqR3Xp=HAi&Xh3`EmKWqiYBHM{G?Yf z|8v<$M#)xMt{Fp;mH6{y0WgJ*he~B!_+Wj!)^<1>VJ6 z(``@*VV9;{p@cGu4NBQdP!WYU-_B|TqfkY3yr0EmR`h!~f@GpQMx$G~F+ursdc-7jE`$z&(u&iL7M)zBHbUIA9r;A0{sm{ zd-wc7G!$v^ST-48789QoHZYj;e-HFhfPzOrA2*@n9Fcnx$*#v@F264q={&;pPN*c| zy=~twae$Mzd-=LRAi`#&-zJgOp(>8vpb; zjFff!xg?GR_LQQ;dau<4bi@E*xnB)W3BvlK9O$6tV31E1q;=k;@V=LZEPs+pBB!9h z*NH2~I1Aa(WH0hqw7lGZR-xY{ISh$c@0&p_)O@dA`9VSW=T7UDdwQ6@`&5tx+x#JSGrSzqPf z2ZXidr_5rc=mdTo8A|3Z=poxtNil}A@pSOqa*9FBSU)p?KX{W^^0W`XfkE*<*dsgA zi~-Dj^dYql?0U_jHDnBMHvc9~<4^@LeTQ53f5PCY&ZB_QzURjsU%U86G(u?X?2PNy z)@1Tn6@M;L2q+keSvAem2oS=QoY9~F_RE7k6-DjOI1SVkC{xE}eb=z$vSKZlby@s- zqIh1l{vO5s`0E`D69CRf4+JB1w&{P>*}&se-n6OC@R$M@*}ak(aehml3H+0Sp%Bf# ze4~EuyLrWRrbOFnwY_X6eVg76T^151>s16^FO-Ke>DqIqse(GVikl)?r=E2~&+!|bHJj-l@&3=n?nlgj*zN3kjyS&W&Vsy3@dD-;n4ARXIqXz2^3{`_j0IpfDz*# zgjYYKATH+-M#&5j*dPF@Aexu7@p;wHqG}sb=6opsD=^wJDcLraV-8o}7@ePzb33nG zD%TAal>r@iPiNBlTuHh6B6(fLvoMRk(YRO~D(866YRq>R*_@7RPW8=}2@pib6e{j) z9du=-_g?6&Z|C)(05^f|WC0=h?Z64>fxx&GqrVwlFJem~Tj!26<=CIKGKWTgJn?jq zEUVlcJ_A|=Xr{!I+Su^8S-ZOIJ2|vD7j!wKhfK~V6nI-`hw-GWO?K@t9xbTw0<>?r60h;ko!b%yf%!{P9d>Vc3j3C2Zp48f z%IXbiEbcgO1#EdM8|~-O_s!J>@BYk_Wel9Gb|q|{%u-h*Zfc>l`n*e-lJ|lO2Z-a? zlEZ4T_wRa3m7Y6dHtk3e0T;#jNtZUBa}?pQe!i_&!dnjb<%BUzE%kr8f8M=qSb%zD z9>e7qGBf5=fB}*fr@w3nQxwB#8ZRbj9r8-zeF3L0iR zj?L=riP>nkp`RLW)8!=gq*d9et&Rf<73n`uo<*lK*1-1^Y`pNsqps+5^}Z+BuokB+ ztt;1EP+q+OT@SnU=_p*f;Hw**N0C zJL;afsa#<%uCe}58ACEbR+G%#=_$4}5EQ@|Nk}7l3-(SnPHx-=mA4CAy=GTc_=cGJ z2i(8@GX2O68tZS^9el0QSKGqNdvLl-2?c%`Ta>$EbLVCD%q-a3@)z{_kI!}?9Zaz2 z#+x|y0%QkKob{(Zs)I2(H&w(n-qGwh%@V86=&+)0DMr@MM>BnDp%{?fxJ zgKkkIKNde`9Q2i-rZC-H#bC@?Et_8AC?!wq(X@pu0;^f*x^*oCKaYS;vzc!H-5def zIFkE{DIi$cI9g8I03isp6Ij(FfTS4HB>-|hn^SBNQF2a9U&aYWQzS{t!5c5*R*%uw zgOEyw)b{^&SKVy@O3=(O01Y@1Pu79Bbwc+6VW8!d3N{b})&^cL$J{~ut!2YaOXu+K z7bzNzYN4#>^TWerUda`0s!OEoc|&h~ z;minVr2lcB@MhiRQr^R5r2ok^sQnd3vX6d0^fqYJlO6cJl{>DPBnK>U+EMbH7|zkJ z4tZW^X#wWO$xN@lt+eWW`qv0Oy4^fJKbju2ZFPK{YzQd=-=8oq-jisd4AoHPhqB%_ zS~M<{m_gVex2~j`;Xzg4dNzLG^a_~((eZAC6yWH|{QlS;A;g2}QFb(n`YWEjNUQja zO7q6zTPl|?oL|T4Fpz*d)6NWum3H>|jc4cf<#MAH%K%?27U8k(^1NlWnD*+--1~`nn5n^3`uEC4pRYEdl>m8UECBD11 z7f6NjJ%Ua_ADGGTz=s0O)$uSSFTN)zjB^e>IKdEx@+PZ;TZ zDa^O4=T#hg|2t#C4@037U$jxHFG4to{d2_v2@#tDLoIe1^(zJ_27l0z$({*1__9xa zhLQbxaKZo+7zBVYo2+M+f~UD*n1#nPI@R60rOiBJ7pUE>??|WD@@rE`x;iKS3TBb> z4Y}OGUn<_Em~v!_+}(uXgwfKhOv~B+Q!i4txzBoFl{tzb9w=r1PR!7p?b;2dXBWd6 zvr^455Fa{@`|m+Y72=AN9UyP-h4!KtVRWqa#`=~dX8`C(CYDkh(KakXJLdBSPivstNLg}ixX+ph-5zWoHnN>^0 zRDslJO_CW!OcG^y;Liu95Y%(Kg%C$0Vr5LQ7w0R!?mp2MACGhgyj|e~wUE;;wNsob z)_)iNVJJP1k^s;leEqwBw%6H~*HHVIH^XbGXu@pA&ENZ8H-2Cpmh}^e+Ae)qYoGXU zyXHH*F?KXV+9bR!8l(onL9&klHqgQd_JA$Cp4zAc*waGaG00ff8hZcr1x|~ASGR?q zT9@%@ob8Vn(zc3cO?e5$y@yb^_&K!M&EaFN4$E$H#^w;3Wih{Cj0HcVQ(QCifd=I( z#fb@`+57Tt1yS>nS|#Bv*xo}^!EU%w6txNXwOtHm`p6zqRAaXU9`%@K-AQa%w}6vm zhE3UI5TPX1vGMUGWVTAbv!z%E?;SKl-XQnzXU<2|l0(GzFjNwX5~+Pb>XZyagooWj zmWPMD$TMu}2P!61gw`;g_K4o`Jh7Ht!>D4t)bc3RgR1^o&09pojzYG=3`c8qemzJ0 z(pS)M2r2^i{WL}9b2xh#ItnTxoWJLVxuip89HM<7$B6-j~uA>CSIU3<96OvIb* zJ;`@8gHqx+enyjR%e0Y|$K$O(Q>N7ckCRn4BYi6P@pZ!Bd>4y;3s>$5;{vG(qIJqV zd!kp&2}#AG7&phqH>k}_B#}DP#8G}T!HF)<-tkBJ8Di58yLa@%yt!+rf4+G~Cze89ifPnjmfk0Jc0 z^CdbBW__~ULBqCMAFnFwcqiCvRlK~B{(AB5P!4TfuVb?iw6-6MIOz$d<2fF-p^#p8 zj?|=*mQBb{?R=W-JpJasi3%dy(1(I(X0M&p1o!e5nVJiNX^)d3VQ25rV)ag$4VT8E z!>CJYi+-|iU(t@iMFU|XRL!d3e(q%w_8u{Vw;Er*!iE7zpU(Ag+G+-=ix|S;@P{P& zPkf>wWpI!@rR!ncarU$gL#i;dpj{3tCB%+4Snc@uB5P^xtaH$ZNCV zk8g`{C2Yd*_aYx;t zjdSihjnZvOLIMj3M5x>2NhW1FI+XC@4m4KL#yh^RzqR@Z-9T`Qdn=X%`?@!`ifQp= zlBM-7xgb~`k=u~{;$2kRI%*E3@ZQ~ZW|fccGn>iALqtQWtob5t|7~G4CmboOh=$9{ zBQs-|U!90tVd-dm8fdhQGdVVHjfB{zHo*(xFcD%DI|b5T`zFGb_nSS#8BKOhqC57X zg=K24S~1#e!5rgl?7G64R6@lufP>?Yg{!iY;fI+@&~8tBC-Xh9;fQG@fmQTxsx~hi)TRZTifNgY}LkP1yZvRdC2zH8u%;qjMi*~Y4RMYZfhZdoN zV0%&!zychy?0k?_pg5I50X8<;O*n^!%B=jl@dM&7tV8zG#ltyyZ&}%E*^KEZZUl}H zm11{R)iqcAC>x!W-f8gD@TmtG+u>wvsW)5-sZAP`xD04`Yo;yp!-aQh>(OvKfLY#!_3UMz9`gR9!ye8E)is z>;S6apqIGS-{jZ35B3>UkK8UhtB$MBs&zp!?P_Tm;1QF;%j;@?gX%CFEnkRxRj#$~ zBY!MVbzoLIBt3T;3h4y2|e)xok4!$tN7e z{63^w67m{5krEQsaCNSYf@ZDK9Z+(1*Ce}d62CNg`xL-!YJBg3;e=c#r~;p_Y{V?M zxpwFL%#iSa6WL0t@BeK)BeoYZ%@gnhLqthP!eFf`ijQBVAhzf7eecF+f6PG;3<22c z>V`gM;4hNCnoN+t9_&wTBRHW=i1K2#-AeD#l%fu zZIO+lIoqpIz#2%pQd-yA9xn=T(|n*o;ZzXVKS`NF`*jzt9YW(b?u{Fcf`Syd?uLEI zyyExlKPt6XEn%wVROky;hsEo z9<}Mgu=|aN7uHRhdz-X>kS&=Ti3)#P+B<6X+sd}btWyggJlTeEy)UlrDF{v^kr?DR zs0M*=DkxcqvdiE)@-gyXq_7mHab2JM8{-4?pNxnLCid4s)Q0NmwE|(*3di_JkaY>d zZJf<1S{-q|p%#rLd+w&1$)U?S>|A6yFOO<2ovv(Rx^GvZyCNyYOP-KsWo5+IR{XiG z+$pSm(|~6Ym3kL>YKe#TO6rj>I`2qZ5EHLX%1p4NaEOvy{3BWhUj5W<=A=aWqkB7f zH5~8$Q+}tlXEH4G;}xh63wUTRvEEOa7&9bC@&kzjKlfL8s<#nRmYyFJ9|@`4y9yf9 zFX`%*Ks^g5pPF;?Go4E%mdbfbVMtZOB(^a%*?yL^$b<;+@#*8!J)ef;<)a>41;4|1 zt5$`Y2V+4@3_|B|He+H3>dm4{c`QHHH9p3i2A?{R+XD$k2!LQ73K^`DcUMQ!8II8o zuL1N8OsgKFd%LR9LGyCQYv_hY)WcMk8VVSn0dyOxcUVd18@kSIlIuQfe%jrPtPC96 zX}ICNGgWX%YPj$9o;L-VpGYk3@R}f2mKb7Lsz1$_Qw}wd(cR->uOT1j^4=|O2Ohp8 zspw+?W+S7CP{81wyNsRUtfc)^ZMu5rdp+VD-ECpcE~4vC0!0&@v5>eardgWXyFV(C zdDKP)S>g_Sxz2JaIICkLdMArY+R_kkfL%-Spp{U&?0zPBtXvM1u3lMEt`g# zWMmkb4$&Rz+~RkUN&mpTlc$8$BNfG^J-guxc<#=_y2W3T^^pnN9#{;C)>5w!LY)n= zc~N)S#Q!3;VqZExdPVTQ#9ftP4M7z=8^`};c&7XJ3qj~($LA8$kNovc-P0t-|G|sa zcNH4f94H`tbLibx@&0l=x$CKVkv~sC*dkuhh%U!qdXH0vJQ0XVR(>^uOhggZE^!n}y*u zE}~y&{dnr$Ocm1c6;IxR*nL8C z4yDWZ3Hl*I28)7!;}Ft?D>(V^V2^Y`?1|*_`Llppg;qo9+Sjv7hCk=Z(F0Q=aes$u znZAe7S7%R(X^x(Sys7Bu?wkJyc%V=(woorqCv6tO$3v1jqYP z$Msc`Iy@!)wGmd;emOS!-oAs+*T=#@J9LBXi_R3(w$UE;Hs80J1gk5en~wXLYoI>p z`w4&m=wc8MZ1iy~dVO#(iab#gm5}B$FGGi}657M~dhYLI>2W{NgH2HUrPY)+bF|fQ zHx(tF29iJ95Adjn~ZG(ce6gC#lXV~3xJo9pXsQySP3P`4V zqSd*#NSmzK{(#3vezJij*F{7!k7i_VboOG@?|3ri}Z&~!aJs2t44kJ2i2{@M9 ztL|Z%kkhkSZ^j&>BB~nD`rVf+uL=Kdf3M4!Ce^*}D{{*c-h1KU?6v6buoni0IEhpN z{I2-~<79oMEEO*(W3-^O#j-c`{-;5=D%BIErW4*FTT0UpMy_Wta~Y953R(^)dHNzb^>2F&OdDw$e`#zxc1h(>Zr6yw zPl5JhWoFaPh8Tc(GLwB2{EGmM9>h0_X+{WvH%FV>`Q(9MdUa0dXkEN1>Frnu917u| zkzyI{RNo)9$?i%Q+|icLy*Bxx6}m49nfnbdnJ5x(&VZAOf{!dSx5R=Bj`eHVbg})l zcCVZyEIg+C!#fY17LFMcBFp$LuWce6me$9|WCd<0mPI~0`i zi@mV46_*d;Mz4RM=CJ{2YHQ*#V1nWCbBC4$_yA^wYbYo-Bo+i#fs(jV$Yxv+8=q>| zFJ~|8Zyw_H=DG~W@@ph^(k?)upv^RJ^Cz5cN@qZ+QFx_!@f6X1S~$ zFpu>d3anP&!etsbTUU4f3HA|6m5sC*#{&XqOAZPaB{GC`u+P9seXjb z#rdw-wy;8Yp%bhaF)7!nUwyBAkno#{wwY6MFB|O2>7ApKxetbfLD8LdjX?&IZM2kM zwnl_;{Vf;bZBd4B9sV`l3OP!5E&QH!M$H*Zb!QJ7{u21?dFVG6kCbKQgEWKJW7E+s z3!k!6hyayJlM+!|pk7QjKyS1(T)7jg4wI8d>93>JkL+)7wKTPshgZt!l6QF>lZ1Xp z=jY#N8dI%2PrIV?aT}E;!#BudDtq(ze2y5DHLbZixi{~|GSoFUQ-$`zC+ck^Idwdm zq14(2D+dU5{kJGJ;FHzOQN-kF9rN9!GDdq<9=lBYxCOPwmo@ zVU=B+#p_tb%K+{!SbCx$zDAeP@ z5p_F)n*m!jnlT)BLAc5s)KX?}Nu-vRB=kK7`PSZEU%xmsR&bA5c({;jsqPUEh)d4D z%YqT|6FT6*fRhok^-7iE_M?x2Ckt$nof_UYkU%_V3Z5VwCI#&LDScc3L0th%m`nau z0yU@H{4W8nD*l-E|C(^pG!UgX7#mj4--)f?ba>rD6o8}0lN&g{3$O*>GC*lp01{wZ zw#QnggkgsMwjH}du0WG}Y$_?*OsDF@1VN1XB6})#B}tU_py&mrOn!)&GSb##0Irj1 zv`Vp?%Z6281dT`c62FMZi}TN~xhVq28_S(z_FrX*8kS*)uX7elcl%*t%k;g*$RV6n zcP=Oe_Vi)!e?;>z0L-cNi~FyT*u=mPyR+BcpT{MMmTHy_tS-F5+})4`EUNx3cCy|b zJn;g4`PRB&iCyf3uJd}`Izk(zk-go;r9<*{V6DoaMo8$m36Xq{x81nv z4wi_-HAdaKEaB%RS}$6KJ_y*M3#^Xdtk$R6C9_J#nX&QnaRRbMFvH;fbU`3~b!_li zvMn=Nwc`fDpD5FAFRSb>rQaPbT={XjY3)n!x6w}ZQY=^ntwara%f(GilBI^B6h~xw zp7~Zh&V!e2&2EY!h#K|uhKx(6!>Rr<5%@z_A}Mu;#IjJq6mww}2_I8tnKarFg&*e~ zor(A71hu47XI-V==#OwhUD(kb*_>=ZYF7nonH7UkU#)x)AA=yNYXCKP6Ug}*zyVGL zD!v9Z)4Bb&WYWqLB$xNJd9l*t;xhZ&ys3&ZO)ToyJmh*bW46%T_{UBkIYlkdW6b6&50wC_6wHG`zBC(1dfJK-cmu{EOR zeNIpgC9KCo{)nH>PbSozd+G%sf>7>-gu5l=n;yr$W_nux&4#j6C49hkcjp>{s{pmr zmx)VlT2+e)2;=+X{OOu=wDr5UL4;%GGnzHcxy^0k4h(bnSCm64FzlnIgp~l zU%GVr#K6$PX_>b%kBZet0t}7`W}I>mTa{DyM^mf(13i2~680Sw0rRr^bInx4)Z>Cx z#zjF}Cv>W=i`duv?|HI({`KdbyN4>9yRPV=-x~QEpl~lj`TgKXy9{A)9hfdwfqt{f zQJ7*O)(o5S$gZmr86sq~A^`j(ehJyEgE!4>Gv~T5S*Ki+VyIPAV|LZONJB*QVqJ?P z}tu;1N^*NXX11CGcxLXisp1*+9mvx0`~#k9JF!P#I)^~V#U z2*zYEK1Kn-k7VlGdB6 z*l5dUL>Vp#ELL3XPQz)Z!I@W|cA*mG>~qCuS)1D<9?L>h>5Z%@(u&>5?yp(Rr_&XX zD?XX~-E3I(a z427d?Du^+S{1HTfM{VT=`_}x9f>m7sW9g!aSH97LvdGgM!ysFaAkqBa$R5|8%{x7~ znVz>bqxdTh!fDJg>1i&j^3o#v=&7 z`MO>=2bJ9;h?{fl#bEU0OIW=@nr=!|fNg z%245AIlDbXY{y=7j#N>~~&kKVE8)S2|uFKY4=+v)k{{T{OF)F zSqFL}HSqprS{rhWl)9_}8oB$>s_eT$%(HmMm&K`&Gk%`X|nBT)a0* z&O9B$>wF#TIchCO3$j&-f;elVxu6yF&SOTr$bGFE<6*@;nZvzJBiz1nki!A>a+D?o zc(T|KZY#prgEw;Ua_?+cPR?-Yo^V6>9|5noIvb#5MDY9C?*6b_-&=0^9n+b%-HP@S>^l4)gS6U$G8egxTd5nv*B>f+z;&OWB)vR!o-K?FC49Yya4zR z6zzX?{2zv!`U*k`%FM>x(hma)gG67+`Ig%uUkVa3Y{Q1jV<=Q!)Td+$B1ZF)iAa^Q z++@E$D{+6lkoyH|QOMi;zXd?pIg)NO$XnQOL1|&A`V5d^O>GOidO<&9qWMhU-~vfC z-mdhe(R^_H<5*9_wtu+D|I*7d|5us@j|=+4&i%hR^j+FA4rDFJ-Nzaagex3ldxg+& zM@U2*@tLTbL3rZTbNUy-&xt*`-gTqKGm`q%WG2kK^c-4rOZSy~bO1VkrApk89f^WFMyY){)cv!fpFj0 z`rXY#Zj#IHTpL_o0agGs$VSzS#-lI>XBf;)wH$6E2pOUKw z)j2=S{;sTKyG!=O(apcd~J#8Z#u{yzZA4nL@PdMc4XeH~e zEtJN#K)p76lrw+d&+McY$yq**Qg)$FpUsz6o|c*r zINg1WNCFHc0SHp~Pyd{ZQ4R@63*;s<#kp>i;wr2w)rib1K1v0XScM)-I$ki3cwU4@ za_t+18~pgkJ5~l9O!vyqWPcfNeu%_ z_P$n(uaPy@O(fy4?Sy2%ex4qSUT}@}W(_sjV})hoh}6HL^yG&6N8Dw(Z&n6^VBMec zi_t*9VGaS?Eo%`Fn+R{e)r4<68NtY;YyAW*nnA~dp!H%Uu^H#8v3-CV%lsiN(v@SW z%x0jy1h9fBjc43-2oH-A2Uv2lF%KT4fT?(AQDBqf!&_wbj1??8w}&cVOmMiW#jo0C z@RQ*n_A%vc&4I*%WfG{@3=hP6m-EwFM}18gszunWM*Wix2zr^r)lJz6zfC62-8-9y z{{(HSeNOQ6hF)o;u`uoVC5b4j|lP3bS}I(K6Zmxa(oaKv{}P-+3k< zZl@3q=XqGayFOfQp{n4WGl)pQ{c`u9l2mO&M@A8#`oFM|NM;fPA z+g_G2t|_*f!upp)*%j9}MF9rRkqtTFFOX6ggBV*{WgrF)2Yv7xCi6cl$B0T|zdx=z+pP z^38#pc;K`w0;Hp3Y=h^LmB(%evKAMBp@KpyapsX%+#f8N<7H@@7O0W<&Y-t2x#LUO; zONegv>BG+odwxVhm7>nCO@Cg~a0?Fr_gE58zWJP15CqMv&&3ATuVjv2jx%yuys&65 zSvbhw-c9!9?8~U^5dJt=+^0^94tN1(eOaRQHLh{pKOQ}r#yal;TyX8(XP`5aNS|$% z5C#sig8yEpYXQr8Jf((tx2rn0Q*Fr;0?WwOlG_>smObW8g7QH160+iFO0@gYYV)9L zEA9WXtgmGIg}C{ovMy#KIs!c+9T6#T^;UGMyD}?Vj)84tUYr6dhwTMZ zUDE}gl0{HJQc!p1$l}yW0`jO!Hy+2t2O~AQNp@jK$r&G0Mk<&ZGtCGa3_4S_TX)BB zEXl_zWL0(0Cfx*SkoU=**Jm8~Y>O`w&h`B6BvsHq&Z6YAib@tqH2s5WccuG&`-wK! zzG~%PDILG%2$2v^L9nHH0dUKGLQS7ql~T@c?RTPlnvz%-6}N}#%2O2Sfs}RJt-j)p zDX7I?qL4#$*cTs4?s(n0N7^CDDNik^AoH>8_A2#B{5b2k%)x?$I94Ea4{C&9tX76a zO1WR1(|1fn*zVE-YFW{kTC}W;9C5^kxanL@`k9JN0{^pUvgyU+hih@fZS`%VEDmBf zyGrY!10?|*#n$W`GEk+j2hEjn^!5^j8g;;P6ta3-MlVt)1$R|tG*KDTt5*@Hx(#fc z>9;cDy=WF0GdVk|xDda(_n{|8b%C~(v!UB=Tv8U~+;Oz0=gtbtY>|4dZUthR!?5Z* zu8Aph?}G#8)47G+Ea#J-YNyZE(0N#GlYjC3daMT+CWyuP-RGdQrNYN-yK_$1o>)#) z!_T-dgr6e|^1%Iex&LeOea;^@ucm)?rx@qfc9Dgf?Hx=uiSDk zNLh3>Ggfryj6Zg}q6^*C0g#+hxG_d7B&}Dl&Y*O4e9n=HjqEi&a-JX258+!~hhw4Z z2j2&*Sv4AUJo{5rX8khgDOGMl-t`otVb<7Z-e2XB5R5*msReVnO)rNWpNeCX7G-aa zTaj}iN~{dmy^nl`pe|)Eecr&GM5|&4ax^C41G0u^!FYbvm#wEE#hC5>;s-Q*TICnR zIGpPj>wb~#OfUX}Fx8_iJFUQuB464^Km!H5$$BVe(!^A}zd9Hv0DixRl^F5LF=g%+ zTL3dvX^C(f<9Jv19K{>-`?ew*Aq|JWA&_QJZ-gZ~QSu8%UCOQQWS36lFaI8$&LJ5Q zZM$ZhBHShZdnNcNvDb=P)SZ^}g}I44KjU}uXBO#OGruVph<}xzUOWk58F54R^JGS` znnTs?ZwnszAiJAN`%ZMh-?vm!6Gu{WNH4m&D9mD&YV+*ADSN8c7gf3*+OOzz&qMJn)sU9 zAuX4)*(Q6Z<@UxKk=hpU=|A^!PKgD>$nmma$8odnh1k<|?>4vrMf&yN^nS(YKH-Bv zVN00H(IrvLiJI@SCLr+T38+o>QXI!E-cX~?l-J%|KF-U(1QEpO&Q)03q^*89ogReZ z*Bz$Ba^miTEhdynYDnb)!*jPASV!#qJl#iJ&lT(*QMN^>!{TKa4ow;YU*RZJ2~pr1 zXaEw4b6|M%;Um2DdNl8Bx9HP#;JFg_S@!tRALzoty9`!-m=4C>0^Xvubk|%S7TB8B znN&9EQm#&+rNrr1Mq1m;TSMz+Ji6^%xt2NhG6bXz;vH^IyWQ`x30ZzT9)W}qoIwu3m>pPcg<^olRhx=PaUu4ak9M*{MwNB_-z$VxK>mEIeE6o8LdHp;d3oV& z2QW5M6|rAgU33FEa}*UUlS_B)n;TLno%>%KZL&yv8{vY)d4_(aoky=|%iOk2_Rh8G z_K157Q^O=&&x-)EKEmF9_CrO&30ZI@Lf8R81y30LnT=2h@ zeq~1mW#8TYCX)ot5NC@iq<8Y^;@W7Zas5y=`H8DnNvpLX*l82aDqCI}ZCg0rgf-a^ zaP#ifKQ_R|Y!1fK9Z?CGMm21>vco>g#Z56iE=)W@fVRqcNpr@Pnvn`$ScwuG(R@8! z)b?Sj>*)oK3!+bhfd$Zzz*0Nn4^Tf^KD~81si)Cdb>vK~wFO~F3GXudR(3hJm`z(1 zw&q84nimMXy(@6YhU3*?l&kwP*>r6dScie~%+T=&g0X7bx}kN^G>~o@A(tX^rPjao z_erLu0Ce8>)>4E*72=%;%78iRE(2H}j?_LDo^DgzoHa{gx;^OZhM zNZRxydU4S?CKiFsDp~6qA&r&aImSWIiivoCC2<$0o|SDHxa8WUDLZiY+tUTrWTU(f zh=NKen-}8eY>o+fGHHoN`=mm5LRbH#;8vhT0>B%U@Spz>fxz1_hrOXiO`yw{J1!rZ zMgta9jfw?!D#v`2mQ88mHcpG44IeLlLB&bZOIEBS(63Ae9xdnJYiT;OO}=9I*Qkm; zMkr%GTJNR1lVWuyZg0jZ8U7hYG2(Mx68Q}){7W!sI9=jQ1s!Cd9V2BnLIrDpwJ|X` z9N^igqNcr?)Q-ZbN?nd)8=tJnGoGk2)!`avJ@f?9~FF4gyLYzZ(D6Iv;07H5N+l#R=_zo;*`_D*pd&7vwY z&4GcnJZ{Zow|u>X{!DdBi24*%xqFK(1*Z~kIY-i-THh^5demMKU!=uWAiR57NHt@$ z+LT;v%Q#VPa)Z=%El`6o4(Un%PF$@JpITjjcHbvLH)VGDn3`B~9r-zBQ>quZ>eHfY zr68BsoXCv|uQjwB#t2eO(ow3AWF4(ywMKf*lsHX+9TXifWv7R$+fh&kD#e7K499my zfXqBvO=8RzItwpAOBM@K>8l~;OziA@)2fX%7)ar92TWHTHmXe3G-O=0>G$O4iSwA< zNb&@dgf0Xg^MPjTQ5VHiht|bRlGBJ^i4F!!td^mRend&kJD)srTY;@xks@!|E`Vz4 znjTK23*V2|Csn5)t8{;*AnTpRM|r9^Bc?Ywd6x`}H-UNEqeJ^+_1q{Mb+PcC zOqDM>&+$}vW;#FoaTa=$qk|xajh;4svQT7}1viL`zHEU%Wx;~SE!;7}YcF{}ZBim} zEVkSXRt^5;{aCOH5-_t=w0tP|K=aKk-0J4q3%vZhFjx%;v|ZWS9!@AGmpiX%gKcVY zOm31!#1?@oW>S!K2g5MldvS)l*sUN_>MhvM4pehi7O4~%J(xIynx0DiDBm25Eii9^ zfH&(2%`gPK8`S^%FBky# z#aDiNd-61#^YEcdQV>dHb_=iZ1M)yDsv^y6404rOTMaAa}i3X?J(i@On&TC;FBT^-5IC?1y~U8<$> zFLfAI-jn{8w9Pp!7>wa4LS-ycT*((4Qm<1v<3nbG>2TnSv=t=g8={Q5>l zL$BjLr8xJemTt8=Q}-mVv%583!&4)Sl) z`_{Pse>gG0exTnmH$@*~GbV6tAb-M@^1Rc}=Cf^R#FUz;HACyXCc?JhCB`~fNeTq- z@^sLL3uxZYmU`9NAJtY=t)Dz?DZVhG$wpMN>5~2vWh^zH-RI6>QA=Fe)>_ikdB9Ub zj6x$4`-sdLTf7dpITUZJ$AfkfY{w{4q#a2*A>5mHfT>tn@esmH|7^v+)czt9ORV znfG+L4x#CMSxiR)8x5Up?}oL*aVNN$f~vnA3AORH>uB#^aq0kcs$w#PES0V9KQ7~C z8UO;bxp=kdPz}1?=@BvgBTmoN5hmjl{fFM>{Iv2a7(|DZFRkifr2>YRI|NEs zb9v>|Uc1;PEy1He&}3PYw9;kKZ55^9W7a{wAwzDr!}O74{Rz=pC6rA}Z2r{N*ND;_ z0St3wV1Fx3$d^~m>DAyDam4vUbrR1aL%_ZG#1sBm%>8&lG|S#**fD|xH@G_JH_4N7 zxVe1HA0=n)bE+nOgI8-OYxP(b+RGSqQ}tHzhYvy&(kGR?RNLgpJ^iEwiuCEB645=j zIWW;9#P!>dB}5kj)-Liswp^m;1`nE4IpCr>lgoETo%-6L-qeQcgBF0@itab04q!27 zy#?`dN-uO(0Hz4hwjww4b~VuY-RS+6^2IZxetTf16kOJ%ccX*eaJ7vV{G&4n;q>W- zRGM(D=WpxwaRz@Y*HI?pTiw$(BDC&?9t5FGTGE3@2@o=|S4w>>u<$05)9r8&CCJtJ z)25&R|L3jq(yus$?<&_hpJ@o)DnRafA-m6{=ED6SoQs_CK5Sns^!&a{<~{&lQ;Y83 zDQ-Ss_|=G`nH4yyQYZv_2ltw+$Bq@s1i27N;PEND>6wNE#q%VhBYad}5Gpnd!ilpp zD&H!>&p++`Wj%K5Dy4Sv&|Uld@0R%fIN5hme~GrnY^3z96VQ%0v<0iEtN~JFNPn=1 zG2R@AS$5YWWMTV9{%V4-DOr*{I?$AO3XY<<(S&@{-<#}T$!(xiU4IY0_zs{061JK< zZn?RaI_wz<$SODMYzpz9UaoxIfnjHTC;yDhu|~*&J^T_TZ2^waJfm+q{u=>p8LlfA z?*lvayRIzZ=#_2_3KJqW{SI&;2Rz$b0%QqirS&SSM>#jbpDtD6p=dy)8DzUiCN*M5 za8bo-K42OKnH^5h4LcioDgh4)T#l?^SEo<*z7>Iuqo|uNa!sEYvPdN*X&0gpzQuIK z)dV3VZ4L6PlR(?@J!{<|-o4<=q1GZ;tPr!1G9S-=(aF1J4SsoW{2$wVrUxQq zw!U!ljwx{e&xDkU+UvbrW{dr&T<&#&{MS}@C+h6>_Hb}#0Krmkb)8Ifw!wiEErvkx zrfGZlA&Tf*g_={3s*`6~ne%<|zqLDM{2Di<68ssqSoz$pd^$Kx^x14W%;U^p2KiDT zwn9l;y4s0UHYvS8Nf>~-qejBU9<>?0kIo6L^(rD&+J!myHC`h{vc}n?X9ES6%XbO- zDUZ@@dxiJj1pYp8<*MApNZM}wC=HdERmv~K)=Qt;D8KLKi zf0N~bQ}DeBx9PwSOS-3ImbTnTNW8?Rd^TJsJQI4QLaoEyivWPpN%IkHZhC)`GXp=Um!@*#X3mWER->fs(jHT$w~MZV^yXQ+00;%@TIcg%fy#wFwaPhQXG%i znYW4%D+>@kAA-k#F=WZ+d~=CrC?A81By3$)?#`=WcxW|lGomXa3V_#qGWK^nmdh@T z89Cw9*Oa4pUEW?zXSqL>^7=6@>{_)aySB!v(c1sqCE(#2^?O=r@dBWDz-npL0-%_H z*_z~@+`NxQj1Za4v$06r>6A_?{bJT3fq&_J&(DQfELFJw*eKHXkhj_|h^DtNhX;zB zD+KV^DtD*XG110o8AY?```tQ2sy2LeO0XG{*!B7UFpPMs6JM;PpHDek1<+ojO;ZZ0 z<%AS%@OhlZ@UuSfq6tAgv>}CjG~kkJqHMEtx8c8Z-6FmdDS&%nGo`-AkuSHu~KO{$J}a#0dHmna9rhf3hKlbY$X4+kS{~8ZU^hVknPPz+s5M4X_8PhW0`T z_Hmr0c!}SD2r>cDa#jAE(^XSU{>_?1s;Huu7b=4j}2I?cbnY59f@nD0A z8Nv5!_y*eVH>B~NzVIJPoF3oDj36W6&G~ho(Gf7F6U(6A{o!7(!}7GJjNNI_?fd!u z59`@p)^Yfyl(}xZs%`Jsa-vbb7LIVr01^$L;&O< z&!yDDX=&%@NLr8X*T7)f~FkkvGyGE(n{D zF8F*~K-2Q?2v;}9zkI&iU(r9y?COpTmCr{$ltQ;ht+Org^)H<{)!jijV^~vnCgV-d zabvAJ3>;I3M!thc@ObtV)UjahiI{$i3;ynEauVa!rR9p%x%);3UceHu8a~C7kBk!CbO%uX zj^>?e2zLJXyS|vVrA6k36Q9`MyiSjWp^5&J64Bt79I?QIEQ_rnFYRMdiKP7N_cHh1 z+OLp%2n>$2ai^%v@Lw@0&%b}1IA_*zJ!PaFa4_uHUooX8;XGaV@%l@e#q)ncn%SYZ zVLT?wSqIBom;acn*)KpbaoXZerl0`Eg$<^M;5QfwYKLQ8HD^+$TemSUqQ&1R@6T%Z zop(BT}gLO)+BVs=*$_qR-&z`8<;n2#ow(j!Q+?&?a?T&>q1(c|k zOc#f5P{H}%l5 z9$hk1R6QwFfu<4FT%!TSy5&zQJd&s7hvH$$QV(P9qz+qi`9oTkeZvzhzi?)Z=Z-uj zop|D@v~5jXa{Ramtr(vqkf$?T_v@G=uh(ci{me zPWcu!fgr>yqJgu5?G9GVK^t0)q3@QKt+7v5u2lDKF)hwuD%njclN1~-9%wH$KD)tF zF?c6Zn^JWS35Qn1L)#=-K{J^%`Mhp+`5yQv@aG2~DBN60zER6TdF^%d)~P(GQOoNSh?$}AT1av=9d~YZmjKfYf+Vd-qj1%A?R!@#5DFf8O_bHN} z*2H6;T*4bZnY&qbCP4n;X5rb>0dzUXA>bC$IzgOw+#BvR2Ww!|XqIslcPOpZ4Rqo{ zvZr|dH+=+Y3pu7S_bIkTG21;$D~-!F=#bahXT8%ICo$TzT)m0kOTWIe3L|kwuFs z$8s!9Z`2&l9C^uVX3n=H?#KxNsrEnVTAYM%C=a9OioBY5CoanFdaxKFW`e)OKqI0p zJ;Jr4TOtA2{G9jRF|@pzR8A&1<(N&8TdNf(56mcGIq0epDfjyZg|-=ag@$Bd9M&3cLHsEjwYMs=LFT7WA8G zFzbL63#&VU5%J^nDO6#RItYDIY_F=zq*HQA=sy@-9<)z}D({Pn7jPjxLPk}okIv;_X zON@4b-~sXXF!n*82J1e(xB2U7Zbmfg)=GF&4nV9&sd?mE=KR!8JWEh)-6f{vZlDUM zI%^tfTM|Eypxn;o&$Z@?0qn5WHr^Sn8wr}ift*^2vJA`vn5Hel8ypO9;Pfv-r#ajf zuMVha=C8>*E;u9--dMeIBMJH}QOg-U4 z##Rxm;J2>c8FMARqKh$Iv0nzqsKaOKp8#QwD5Zb95!!Di zbH2OXse}|M>NGGGIDicn?GBepC+~mR4az?18Cgz@e0mc#o3=(9LdCviKdh&S5pPQw ztq#x+w$2>8uy;i=lb)&1O`#`MB&lp=)SB_f+R(ZP;Mb8H7rY$ zs|L}u;12m)g33iDTT_OK{Xg&MoroE~Ho=Ig}tx9r55%eUpT{15D>~ z(Lo$?%K*2}hBz__YmI{Nu;+PS?BhD;6l7gN1tat8Gkmb1O` z-AF@Z&Z=!wD-A*}z`q}PFg9%y0%#HFY*%%#!A_4pr82ynB{gVAgxSvW9veHfh|{M2 zVAc+;w`Hp75R!(1L*+Mn5#;%8ptuq*_YP`O3Q3YKMUn}V8%aAlhy!Ix>1luP2g95d zzu&<$Zclcf`&d@=mDM&k-*nP$Ak>EEf+9(Z!wJk_ou{J$z(9X9?TqXU0s-F z`{J}D<$v;>#@1h;$*DpeC7`$ZN0|D~l!zTtwz`KZ0;oIY1;O`f_ zRIJruU39J{W)sJu#NoL)0p94_!ry4LYCADsPzZjcYVVwu6!ahBX(r@Q zHuXBreVW$L{ZVqRC!noUKJs06#6F*s5i=IdZRWvEd2h~!DGG&&T_M>VW z`F!wjc*YTQ1JI+dOTzCR=K2OsEa@B+Qkv8Z#TT@b#$J}@K2I4Qk2_6z9Wf3ca{2>w zVYYfxH-r$JHwarxN~c{e5te&yC+aN-ZfXH9j6Qv$H2*by)quhj!B5D>0Rrm(iihMtDOw`5K{;UP zH68RzmHVi9B^vWVQ|s%c!?s%~D!e~_Z_=s?X_jl52anjyT+bMMAtucU+5cBzyV%HxmG>1KG|S;up_xLJQUNbTtc0HAek5dwZ^*Fi&8dOikVl@0uk zL>Ax6Ru&i_+~S_U_G}qCwzbaTZ#1mI#Mdb7vN7!pM8*U)+1fY5)iP*QO{F z$1{X`lGqHZKp2g!f;p`DB|e|>-aeOog?51)&BNjp^b492r}Yo2E2RH# z#5YnURP_*CGaoY`63Fa#kg^7P=s(OX0tE>rR+fS{&?AW9liOwJ^K=44B zI94*ZgH)p}1=%b@W{0w6+zf7~30i=n1AnEdS%8WIQ2jN;8miRANTSlU-!4hl%(4Q7 zZFANd^93{xD<&f^ZnKPiBhUU-;6|5ptX$)*oXVLPFYv$c;q$$2L+L98k3~V0Xe=k- zZWjm)T$nZTq)CKI`2t9ulg{*3)hR z=yb76T*pl;++Af}n%EG~wp&V&-Xk2siZ!n6YueqyM=Ttm$4`hwXkA%C+->@_(IDvk zt6Vw8am8G{j(+15H%LAV2)uqueuRNAT1(PMgPm*R>f{@|tchXSq2Q>Z>2oBU*!th?6n_L~u1R-#@L~eyr$3V-H%)rMRPH3kBLa_uy#3PocRmU8UkL1w|QMA7x; zH|u6!xP$>AN1&fQtuskw7vq~IJD?sighc9HuvVTa*={M|1#%} zGBu!Ju6KT1K`(XzlqUJ8n3fhpvSpk7K1eU3y@&*zFhcjQz^4N9nc4zRc{*LbILkGBDk*sd54ROWACokT zk?~(o?_3}-d5zbbqieju-HD+lL~#u*wsMN?XgGOVVua{M*)_|_lW2v2g6g~nMQp4c_+=N$M^?9>Xz z=pwdYVB*T8;$K>-pG=IzeF*vM5~zNjCKUk-H7H($*QTZ$kE7+*F*13(xS7mzW=;H7 z0cC&7u_F6j`jTVjQK!VYo-~!}E~)CO^1?htTUn;CIii0sP&Wr0u*!WfL0D34nBc^xI~WjkxdVhF0d zN{X&pRi!WAANer=LLDDse^u43Sq6A|c6VBK;H2wM=vdVFWJAG$S6v7}%ujZypws2v zd!f^*%XBWNHB49P{nOJE56zC4%WNps>b1K(x1~k!%9o6O#Rv&FJ z`tSq|hi~{kHaHu>G~olS_crkC-Z1SQ6ie#yHixkH-m3Nipb2a5oTRn+J%&8CZ^*`I zxTyijgJ7MM{4H(`DrvjozuZ5fe)0PRY~Dq>?ivD$VEL^au4*iMzc~a(?v#&4caKOg zG29xTUi^%=;7$1uH0J0GQ|zEOO#pV0g2G5P~RxQ;Qb# z^61?eSGcd_T9i*rARo9&c(2r*4-$nCsr1owmqYrW_+>80Wc;^*J$$dJNKwWl_x3J0 zN<}yoiMu*uxa`z(V@4&rr?-A9l0jpRDvGF@-vV+5vHE}fQ-x9@X?6N!wu*r= zs8|zTGAqcJZ0S(Lfj;Uxe}gxI!cE!)iC%sWtacuy*0MBV1l4C{VQEiV|AMc`|7QjM zoo-}y+z1;zjfC%wd*ghtt_w%ccq4*(?sMpJm;QkAA7m>dFrClQ59>@2CJ!;t5-SMxQmQm{AM_0~p9}HE|yv94u zY}wRtruehWE+`B~`14dEtrM+)UdBwod*Yr#Qw8$_o5{{v&0_CHff#s%Bohay06a+7 z53apFz>Fv}{C!xXX|OdykG>Zuf=@FdKq^rI%9wL(FS>hVmMY_@dU9$V(>{|AP2HPK zOS%0~JqClmAJKqLq}l7Ze``jxtq`wZ-4{1+2dkCQUT)=oT?CRz#H%?EJdN;)o*8-O z_MI^rd|qbg?7%be!cs{ks*r9+vVO?>ZM8iA%lFfDlV zJ78z}Ra@kg`RGLmkM-5Y$>A%~D>$Xn3|gcn=oXX85qthVxMmU5aP#P^$>#HQtcu!V zvZ4g8Cc|$GdESAOiiibRDYLNz3JPB-ib?eogu8L%g1x50QeK0w>XHkICia3dWf8+OU*V46znBo#nvpHa1l&N9%1!fbL5+-z&PHgjZmL za~RK$q7RQJ?PZNFdU9SF!^(`M?-K_ZqdxAb4wzf|ZIT9vN$D)7I(6-vEfmbUw!T*f z8N@hq_uzp@`D)HVTCrXkfXGmvTu!l;CcVIPBsD<;~{@Fj(}){fS;To!BBJ%CLw-qV*M#u z2$q^Y%by!qqll)S92ogk_6&IZx?qTJNa2^?HpUw8`W>Z9M*AMx6f^r<9fF^TPh;*_ z|8;g>rvJaG71r-Y^5w*?c z2`zHt4+Z@!fWR#JG2V;pEC5f^is&zyG{6WCu)m9erE-j+6voj_|MB&vS!LMU@eEQ< z?1L796%xm`E+G71Gpdpd_5h9>;qsjM0ikY$tf2VdbCmnVu=spzj9BNj4XatS!Mqa- zhHPCBzEN2TD8Pn1@4pw5-^! z_+{;)V3db;85GV1{lzJ2(IxW0lvDzZ36w(7gvFr9FA9Y`vIm1Dt!d)Ml~HG$B+WpEytFOXc&Q&D1AJKScI=GP!cG!`i~*8gaxLPVa}1& zPQN*nsFooYu!wpXTvk8z3OF8rpCbq^z*O228G8^|5+r_a7gSj=!Yei)Jzfr*XpB$2 zKEu)-TAWiOoR2+5W)IN+RS$=jpSojf{$9_<_=WduLAOS~YLS>K=IIDo2nlvaH{pA=+ z+0pVu)ffwcE#ra$@ejDlBE4rn$Qt3pis!Lduz*z+rTGB2L~`1J2jw{i+Z~H{lMikt z9@Omz!{Xw;{-r6-yNK=8i+lXT&=<>FomuP+$&PCWYrhBiggfS`+AlW4u*4XMqSGF%Bavg(g2be!gbtbr)XgJNbe`MO0>D*bf$_0d z8E0L3@2&XT=sJKH7oXpCX05ixCQ#gjTAabQ-7`9s|%ylXQ(xLQMd1B}}8jfqkzBhEK zpqwLdIOZGAub&WQX^MnG??*!6|?qLiC zGz zaM7?$6&YE@;&K$2a)fnvj=_3DtVF`Iphk#=3ADXTh^STY96l4*&}GCi0g+yFGjmD3 zOh11*vzMvLaI|7?2fM8;P&A09S;OXDxriKGU?UN=))o$Z@ zCg_0xsQd)KFqHupz-7SMZVPUrxVnD=J;(&Z@6GjjxnsSu_9@(=qsRYk_3HdnA$$|F zmeJr!P|IIH-@p6i=yU<_ZpZO?ju3luvyzzw4`4Y3&AVA4?)e(Y{Jfgsr?^4ncQ5W=HqsSn@jdz-PR z?pxsP%F)y1`?_QE^RtptqlI%@zX$LCk@XG0fdt*UvF(kWjcwbuv$1VWY}*@S<7{ka zgNs57iO`V#ap6QwC^PO|Lzhk)d;ro8FaNz0l==``HxxI~jruEL| zP3~aK$>4L(MH9Y70tRS2A7MlxUp(hWZu1FLX5PN9wXl>n-kHvQ;^hliLd~E%eDlz- z4rSAE3l_1<`KOW~kwS6_8;ZOW$CCL5<^K`48BqjWK{X2&ErgYmORV{F3mOBX5Z|0G zeU7XeSwv?ulFs20zX&QyxEkh=TO2=rJEVV9XpC>MpZcRH0>Colb^L@)r7}=&{+yrr zH+NR{s>rb}UBsmE5#_1r7n?JVa`eYXFqzw|RVw`45fhJm$XQxldmHoeE4%H|a)*bz zNE3@*M*++va&w@cm*3OH`R(<|!~Mm<8lbna$=~zl_4xkr(E*)+5gofsJI@7mn{Z`$ zY4NAS$(suK9Vp}%{CL`XI{z4|d{^8%h+bOa+*|PIc&|L&SXh`GM_N1XfxP^{5_8|$ zw3A2p?r>%n@(6L0q5F=L@*#y@HhS5)m*rGGiZAYyDDYw?NHWjwr}wor9Ag6q0(ZFFy5UN8c!UEMx6z`u(d$M?sU*Nv7X&U8-A*H?mw z=YNjRZ!Zh?KR!(XPv@4;otI6p=Z=9>%^^ONDOjg}R$0HLhzU(#E=?#OmjwB}ygXhX z{^IkzW^ZJ7tYJIUB0VZzJbDP~Wgky5I&}ARdwE&63hHfkws!hBz2BA`6mD!?<{25+ zo~Q~J0ykFv+R@a@1<2;ZU)NiDY;pPP-Dr@ap-jvpBYld**Nf}y(%${&#osAI|Bq|wZNVCbL`o+=H}2Ll#q@_By`FA?b-~x8xwT5F zy5|eW>ly6u_tP19?5(qp!<+k$swss|BYmtkpsuKQ?mXnxOaA$v-u>)p+*h{S>-v$+ zxSw~P>#qxby?&M_B}E3CClq|xn%<-rUT#y^?*7xWw31y`m6}(2I>$5c&T}UM`pdj0 zDh{CaRv(wA*pE|Z8L&6Ek=r+w3#SaoIXV^RpV& zz_Gs9+5oM6C>UX{LP-TD;r*BfW9P2s=EGGKa-~oHc}0ch?@juOX<`2ZTja7QOphO3 zON7lkeS!*DfM+^j^6_QU$VpQ8o8WqXuX-ZfPOK9FK~}Q7;SVX=Y+Z=v4oxis=R?y# z*#?D^?}ipQS*SMfB(LHl*hba4CO}33+DbQ5?q?ep;M1qa=9tno21EIj&-!^Q^>Z+s zuR`$o_HP}MFI?qh8V``YBQ#v8xI#6Ew?TQAt&jOBDOM>d?v(Vnv$s=Pp+JpBC^wEX zQY^DmrcFl1sQ4Xa^uBsfvPJvA$#u$>Ga{(fBiKPVP{zI)?2f*ua=%ud0L1`YK!zIM zoS!gZT}nnm&rWl=sG+}e)<=(&$F0qW5$~nGiWaLEqJ)D>|O*RimMn z{8cJ@G$?*Fwq+ENzqpd?$5+xD&9CQ~HE-TFao)3Y7DYZDTSEAGgbNu^{g-@dWS??v zKa5a@)=<<=CzOAmn%$)nA6&B83YPz&WI!4@CrM*|2t1`2zBWgL<6wxI8d_ycnvETn z@vEV(c_EboZNKc`J1)eqU-Ff+oPC45{ZZuH*h(R`Q`heSa3^aO-~&gpUEaRb?7%wL zv4@mzzsLs7AU60+D5c_(4tdOHlkOs!tElQnTd+bT5(9;k!GI4)t4+B zy0G^8ec^p);r<-}rMP^8m~nOQz}?rQV_0ju)zGS=V>$erFqz#Ndx7)D=v7i@>U7=U zmM3VT>z~dqXX^k#zqgpW^5`LpP&R=+IaVI7wtN(WST1zj*~Di9^*f#5pN1^LDqa?+ zsEvu`RVvK~h+V}l@^q4~!;z~%<4;`C;6bl&Z_2nut>z$rb0PLHb2=e&WFv?U-Z@cP2o8(g_p;p1mZ+KgQc=9z^$aA>B+f32zuVGP+wk!t%Xm5* zqGiL=+tPH@QO?Z6aJ^Taa=8VZLQtAS-xPL|^2<$j8-h1!A{XedGp8xRA*^E%vK&XJ zjj&RM5$F?vgTy?fvLTv(rUTqXPLr1F;~+nh34+;5!Ly_?L6u4+DnJmzWf{TqL-;!! zKw;CQq?Irllx2Jai|){R&BtQDt%b-sulkN}kGM8rzmD5FYDg(rj4B(vgBS zH@Hm!3cLPQggoSxy`|N3OKYMZRJf*cwl`#36L|Kwb;EYo1!i%0mLoLPgYlFv3Li!I zks1F8VT%Rf&Yd3y<+2%_plnt{Tm|&iy0_jvsy4~`a=H5Vlmd45VHMomOf>U1unA?j zH%deEic|$sRwRwK0d%Ud3(KUe3kk^P`hvL-G%?$ys74qIma*rks`R-+*s3RZ%KOPc zLY72;a=nDjnG^RS3z(}D!lg)LxQW6f6^k5qCcXN}+o36c7i90eUTc6u)d4zKfia?I z`R?)*l^UJimymc|&xActNe`T`J>&H`Bq}sI3m)4v)250NCCcU*;=hHyXxUE4+W&AX zVMBIxL;@C6f{{$>T1QwZ1n_|`YtY_!lG~oz^{_|5_s+OWB|AQp`zN2Xz=rX0j&&2p z>~798qh@+8g<0skP^7p(%wJy^?KGWov1v`~0x*5LccsWs^epnw?>2uow#yg6ATbvF zb8K;Nht1nT1e>tP^UKnhjia=DNYHH4JMFB_0?f5*Qu2RnD%<>W>lFm7yxFiDP~oj8 zMuPrnP2zp`Yi7gyN+&vjTd(iEF~V#X2tI3=^tGnY&Rmi+<}xRFc$KULGbQ_8grJbXJ$E z{Zi%&d{DE2?rJ|Ex7(_jUS7V-C{~M-W|>m6mR2R-(D|}NSUx6bM-2m|KKNvBc<2P& zEihYjO4wNLOIwn_eJ&aZi;>i7;9X8v8|6r-%Li z>PYc*oDNpcD!iv-$YlLu&iJ&XKw756Ip$xc%z z!5dQFvi4-8`9e|gxmh%gin4IL!-3V;Y9WI;MK)8TU6^^Sc&qCeuuK1_i2<)|P+Q$m zU%Ys7;_Yr64%ehLtH{tCQeWL!u-B&6eQOHsk&aUON*KS*Xx5ueit1nWdGAU|)drL5 zJ3;asqfngA;CiZV=e0mCt}^89*`$J*MXJ0+0PHQyud`>Ct4*>d_i0kYTgcDyr^?-K z@!IO(!k^L6rWTEwE@Y{}4QQvkB2&%1ji6>@+2ewm(vBpLjxkr@D^9i-`|xQylC0G! z(E%0Yz%zvWjZ-f9*MtGrRl&_UXnf$ws+~$z5ye+XW3?1vY`@uLdxfpTy(6cwf2=k@ z@XPha4_yYY+$#8+G8wxydv!|aZ-(4f2QgH~YSlPxjWXN{{vxsko_!I0OkVMDALw5> zaf0LkdD%0W>|Y{n>lO|=jeXXp99h&++1neDF97w}*ltu>z1b{^4pRP%_~FXlKai`? zj)k$Ak_LKJQrU)3bH^Uvm)w0>cPl;`|2IGA(~sT@9Lw-({m!zM?JhgxLDj?+eZGOI z@s^JMv|l^+1C^JMj=!&DwI*DmipSWvgxP3CWsPFkwvNTW!3W3X}{ z(7yMRb*uxcoU+19*$My$3JS#5FszQqtuLDoYCNi!>Z7aD+)94-j3_%dAq6Z}BFfYK zXTI$1;7e>o0x`hyjAo$lr$cW*gzvj?3jW6^#14S|>H?c-bS%)!b_r%2N1NeEAT-AG zg7B^tW2KH!XNvxPSyUp{rcx1-lWO+a$aWMeP6LcS7Fw5bgs&J zfcuY_;t@U4c0{rIy3ee_>6=;_?&h{ht-;+Ia;xvDo=w_(gTdWxgZg6hZ&KiVAzHw8 zPV%(tfUZJCCF7sd*fyv5uQ`)o}wS6>mP&?}v2AU&ahbV1A)jAOWOxq>#QYB9MmAQa zh1we9B6BMq@ zd>6RX9BJt0d``Aral?EglDH)1b4c7Ydtrud5kj80s=Tlwl*CO;XL`8Fus7tcU!d5eu%9G(1y_^E&`$NhF`j7_L%SH6Qp+Z zH5|^&-qgj_+3bhie;qj(Tf=d)GNl(VfRRG5FmbXa&+Om>+${gg#hI%&Uh_qkyzxqF z{SEq06M2$1h_FAgFqSq2bEhNP0J9Nq*vQA{l~T!?`j;u@!&;51zK`l9C9R%CU4Vb_ zeK4G=w#ONQ`b8IM*At^O82!|Nrx0E;(UE-iT10YE8&FRZ0}iejjD@&6u?bL*uK9$>=>X1-e->$=e^2)D-lIjgE9o9@X9S2_^sXG7Fib+e z81oIHUQu{Ngcs!?VL5w>yjRM|=^&ws*2bk;9=Y&fu-K+JN-;Z>R~AOsDL+MQ4j*F} zPbYZiuA{;-D-B4RPRM6Vsxj+)L`Z{|BXS#4Ca00<;CH>yaQl!JlRPaC~^P1E@y7Qiu@;ycTQe_%7xEm^SlqH_QI^Z}}m582>;wQqy{Zb*7@5d?; zZY*U-DEuY{esD|Lj3x@p*imPrU|go^K?XFI*dh{^_v$-aRxG8Q_iFY&BG8T1k!}|| zE5joA^##^Om^p4!qfvTJvj8wU5+V+{R~_Jjq9Cw*>yFMy%&;L>Xp{sn;9SOZ-{f&5 z3UpU?W+o)yjt-0v0@yj=GGIMNNFbYz>5CVmy?j*7C)u<6_{2cFu;ifB228ywND%+I z+VmTavh|`0NLv26vK?J)w4zOK)V5t!(%2^c%g)AZw`jaGx&u0+WdpEgxSb9ylcWAM z9Rib&ug4Nm0TT(S?-h%%8d5aR6Vf7;6XLx?miUK~^UDfft`rcfCR|lR&-ydni<6qj z3K3K{6blkBEbpf!Zp%On@&ihsh>NvUTt;$g#AX^@z?D z!>Ec9)OUk+@$AB0B<1Qxdokd{nB^$Lx0(1d`I2%11;5qe6iab{hEX+X2{AHN;Msx< zOFS(lahffgda_`OCGU)$2|I@EHK4`^N^^rC=38Jn)GR2k$N~`68e}rOW;xPk-V)52X?e1bAG47jfelnz`Fn8_|I{s zy{4p>JDNIcs6X0_HYhJ^WmWD(k--!0O+iate{7URFZ&-#h(h)soie6ID|Nmd>gW(_ z;pFR#kpM7og=YZ6)@g3v#d5J9Wd>p?=Y{<{(ph}Z-kdLUt6tC6YUR zBP)p<%p6IjN-_tlhEHlChWdF87c|T_X}1`VY0lMzUi;CvJ@$iw>;xDtX*jN z9{noTrkbeX6%|M^nIv|qhVKmFT_^0B2)5u$@%8_Ep(u(BCAV578_b8M;G_9+P{+_k zLY+TlCjorbgX#g&Bfd6n9hs?szNHhJ>|k_@jdp*mWE zf;B$t5z=m)io^88QQ^JQ>l+6Q;@-Sw6reR6MH2V=V0=`ck;!5PI*1150DQ=~{-uYzRYXxs+6=vrk^sx|^(anaMF1D$jdJ{6vr}lcx z#?}DdWV_XyUIF4?Q)6f^e@JT($VCWCJ;X&qHcT(UjV??@xRM4+!k`$std#L?Bmg2U z*TF;TM|@Yz8%~TBaa~@am_e)v5rLAb*``F2bB7pPb$@1HIJN|Jc>@C{S6!u zNvRB=1e1&NxF@H;8sLVnqt_&gDQdNGM_;3}QC|UI`~8c#RHv)WYkm zat!{%;vaRGF;aTswEKrfowzBt!A4#VlB-}U)C-~>rhScK*&T?Lq zb(08Mge&_SbXiAbICN0Hlq1e7Qi1Q-y7JN0r6tWeRGYsPy8bm}5g4cKngVE7zFA&` z(UPlbY2A+Fy8+7SSA2EtHQRe$4K-|Ds%pi8hA_VTzZsjHP4jSAWLZ#g8e2n!2tp{p zm^cn2NthVZBS9wc6hn;_Xg|c=|G3G^SN9%hY&-J?+Qz4vOfyEcSQ3uMf{9yg6DoCKbbVXlS+J6;t zOu;7GWhH}ww9a(N1>G5G@>adLYu!6v9QfYV(syxoZMKL2%ZuCY0uN4jjP%cfe(&d; z4wabLeG$puN%*H6QVwrl9TPBMPksgJ6tNHbth`p1W| zh{SaC#&?IA;xg^x5Ip?Q#Jb<47opTI_2*2!SBuWzz_QLc?@tBC8e4xusB zGO}6s8n%x26y(=ace4H^TZ>yjgN?Pk>gKOz6K@%Qrms&Z%qz&Tda$ti-Hw@hywP%= zV(Ul9+8713trIP_hY>8SeI`bGLJr~uJ2anXq(E94u+4DMJBzZ;LhTyJg;$|T?|Fsh zNB6ByKM9Qei$hgyqu~cgH7eW(nlH^!t0QiP-}3YGyKemkLGuv=Rkc&v;dXjOZ*`25 z;jmgEvVlqo!TGSHq`eI;0WzP`zLTAC^L&qB-2+3ORyZ8(s!XNzTLZ)#KC+W{x_Px}OT-Gj| zkh==}qT%oA6&<@|uvbSqXJrPxK8I>j8O>?w152hLLF145*+2#VQ(2C(S;5lzfx#P# zEhPjH`TocXAnG*DVoQHG&=Vr-22kXMkh@X-($RZi>0X)q^h9Obg`Xm|9Kv38PV28%+=)OLEjf}1kz)9WaO|Rswzs8T52x#QaEA343)$aA zetm7&*Xi~Dcv<_|^KsnM1Dqy*1S)X}H%yyJtfwgBbl&eSivm(47iuOkmSIJvAaUKI+_Bg(t zTe|}7eL-wISfC0G%zE}=m#^ce-_=vS;bD}=L>YHGm&XO5o;&ojR)+}L_5+ibBf}o$ zFVrL7J6beF@CiBDM63^pfhOl^te6BZR)TJu*xTa(l1ttrNlu(3$xG5zZU=<2jvW?G zgs_yrtYy4#mUiqJhU}c4j_dA`E(8^EaOV0gM6*AhYxfMzbMeAE_UVW2!U-%)bM6CX zQhH~RR`nYO;u#Dbf88%BQ#34AKZ0_AZWj4_>9wxmW+gML7kA}EAbZj4yf>^>q9FaW?RIv+?QQsgKYV2;kP{_(LwPAyFlEDC_P{rjWhMRD8D`1J_b{_M}p+< z)p#pSu^0ftbv{EFk^(NFz373$35XDcB!k=#H7K)#Xm13!Vjw+3ET{o>qg^s+-Rpye z?mt3TQ|YWV8!SD-NWBU05<&t3v5MkHX6d2ln!gBqZpky-a0UGy_-kbHrb`rxWYN z`n?!X^9hzaZ^mp{(>U9;*QlS%#{L~8lqq=!`;KmLij~#1rp?HCYV~an%nsb?+#BBq z_Z3yShZ?OS+EPc1O|_rPvtS} zM-=|6U{`p0Ji#m8sW?@Sl}ISsd$-h&sbAWS)aOU*d;G|QKro9W0zFNw030!!*5XR# zZ#GxV6h1>}6w$}^wn&){Ls7{0Zb-EF`f+{d1$UmEdpqHU`CwIl+%MkbcoN~7*Lfn2 zyLA#QkVZz0F zQ2I%jePOVsjD{@gwx|EVj{`L2cm}xlisd)jV}CMj(_L(87jJLQ zyw|Yeg;Ok^)qW}+{IJgaWtIhJBS7(Cw{Bgh@X%bFzh0B?)Dbi+Ex>dwJv_|$X}imA zqN+222qFL5XoywI%5bYN)cy#;CToy&c}0m=b1kEw~ z@$Fmso=8N@_%V1Lju1eR^;kkaX>jX=b z(Kn{$N%$P^QWJee=)mPVGH1D$?iLMsOZ!hak{t5 z>c6_@_Mv$%9!8Tyt4a94R5zz`)!X)kcdCRXRULV`E z|B~_2@I75WMbN^M=!^YB>n^FDZ}i%9j$Hm_SF&LDr13Pa!KU95Q;x9aT>Ca`-X=ZG zLF*Si&uIfLEUviP?|Yl{++(-N;%rO4m(K0s&#VI9bD)&wVm?cQUN7z{PkbH>L`F$! zqa*aQS?ZpP2Y0iZ^N#DF4$m%nuR_UqFRBD|rPvW4okhZmu4Zo6lFJj@$yq;AOIPkF zIM1&dDQO?63?aQRJ62ONefxZ6Hkw;mp2yG{JqR6p-#63FU!vfU zNz>XjB8l{AA*4V|f=Ap`6`VNO3Q82a0;Mbc1Bx{h&d3jD8m>yaOcqW&V8wdXXz7=b zK5+}zY+pT|shQcD#&1WuUr~kiu$74T6+h@|2S!;OL<&Wk($pgi-h>*e=DEg()Kg%XQDmGN!j&=6FiC1* zn>8{0DKWcL-gB)q8(fjrvri(WJmIS)%Hnz|m)#0;_pT>V5qAH*mrHGvRXznEr;@+s zn{Q_>=0ky%cGA#vl8{P!@|J_n>RW(6`qInQD-9Qfk&Z#(nfj7c0!T04ivzH%27N{C zNE+yj*-?#97q2v;>k5r$chXft$Y4qm24a`7l$8}4@M-?4IZ^)N5)QNG0V%H@ize@C zf&-<;Fk^PnvNY5tAFMEDPO4?QwkGARSOf=c9w?TYq2m#yx#9DSZx1F#4*9Mr8a^i%|=(N2T)|Ex{3vRV*~{kzL|o*z{)}gxs}F7e?-PCLsAWJ-xnk~Vz((7 z?>uou$UOCZFTB|0(QFmVs5*nw#}U0Ff-X{16SJg=o{wg8Q2y;HigK-~49AO< zn!tkMKOP~(rVM9YbZQ>pBP!-qr;?8JoeU}^C|pM}%Lh6^;cll5^2VdS6TA3<}LsC_jtjUe;o?t7wayc zZ?6aATRm@PPmXA+BD~Vi`Z;fOrR5&@e&Rk`+-DBP2e;B^1CPwqwb)D6D;1xb2VQ5W zmt(psk;BM$X22HnjXnGU_4&Y7Dtg+C!Hm*P-d10lhsr_6vO`{M*HcI9QrEtR)BeV3 z$Fkia+y~`9nKzOPJM1a6Cd_V=|Eq*AgSXsbsQ7# z{Sp!S0^M4+!h3Us(9&@DLR0Fox;Nl)hhyOszacpMI>b5G2c+C`a79B`-4qNsA?j7Q z7}Yq%0>kx9n%4m;0@!L@O7!QOzS4R_cNnbkTQIP$c8Z+S=p@=5XW1I&@gKi7j6`*< z1ZP$VF3Max2c~R2f_1YPdwFwM-?ds=OMmy>D{n4o}0a|NAUMllzvKvqbs4_ESuQa04Bj&)rb9u+~CrrRBUp!F`j@!_cQ;g zpx5&@!QUy{_hB*9#o1TZk5%ucSw%Yk+q_Oi_)B<#$-+?O;1rF`GSA5KM_J3sS09Vz zaf8)sOPQ zAUxX7`Imo?-EqgHx5s@~QZOFADar5kA6Skf>5a{w$?>2ie>pdT{iBcn-sFE$0YvCB zgX>}&_j5$)n0af~2R~zZo*x5R+8d|v?Ck`oUJLdy3kWYpUu5-$O>`q$Z03`; zqI*&6MbaSsUUB{Tz-%-@^mB~e(f!4q)35kh;r_q{{S$ghS&ZvH_#j=v6awiB7jXOs z7l3iFq=Pm<-~&vo>;eLC{}a>mTus%IP5X-0t-oS;fkizfFI~wr=Q-pb=3ZV#oMkd- zm{XK!%OOX9_k|%2GK$m`d|~cKP8OXQPIO0j%l40mCMXLkJi zlP2IvNeZDZ6GOfYFvZu9mL}L7Vcwp#nl{5XCCGx z!!fQV#5rP#(eWVQbl=O)elQ*bSn&^p)tUfe!S7}+~43}x-EZ6He*h|cqGA?kR zyal*Y7uDLa@aAbbTJXY$QY+IulN$L`bUu z@g+wJ2N&XS2#hxZk!q-U%+!lFOX6Etku~rurm6_-mz2tOhxH%heE0=NOZT8vBia1| z2BtB47dEZ@^b{*Nu~Lh)X%gIF9x||BP*F7#vzh*Xe-}7e|K-wTN)2WYRHRRvN?@S( z{MXmCO!PexNqA*PZAAh7(>1?^GM;Iwdl-p**^DPz(w(=;gHR2emU2AbGFQl1%-9e3 zu!KhEe{HWbp8eZqd`(cnsSXCI{{uH9)2(VbHO#(_agYRrY`>053sdt6Jmw}p0`q!a zbG(nN6Sn@i9A4uJm5C-O1-CC469qpRF&;s;Fd1P+r=cZeG6@t0F+Im80Sg?Z{d*xH zqIb0j;4dhpQD0q2UyxHc6XFf>37-E4w;Z5@&;&*@ALf z+6{wmOYNp4M|*{VcTziZUsIXEe-Tu?krCg)js&d-o_y7yel!189BVz-sg<-Vwvt|z$19qG z+l8buyoWesyN_KjP6cGv((ygy=GtZ?J=^CbjctnJJ^Bp>E}#UC-Ud+~(t}<ee-m-B@Prf&>Cz_YqNGXY%)$O8%&8V@s@f4_PF; zo87F=LQwQoXSQUUInU}7cluMjIY;82E7MMSh!)! z#$AJ&Tif}bDZ3&MzS4}?H6m5do+nx3As%?aK_-*86$rrY(wisznQ573+X>HbjF#%+ zIR}wW@->|z6L7JA;PcLz@1NkqR-w565(?qAe(XX9tr&B-&g1yez99bvQG6HEA{JWp z$D_iMG#6BB+)^>&+`*G-J_ul?wNDwKCu2WrW=q|lpBzxNUerjk#KOmQy zU26L>66)5EZLxpcQa+eHwU2ZATWi%w_F)N;LqDIJI;rEL?ZY}1~)y=Vh__$7MV{Dv(0M|z0ysF zb)m41i9m>Wxq+_bQP8K7oy(g%n}Mx;h_}KX{x|(LYi7ca=+!o3^#{%gXg9+Gx{t~e zBcO0f(9^FKU-of#Ir?$9w&yivH}vCr=!P@px9r;6E`)cJ_nR5z*77x_yJ)S$W@fqY z?SW?h``?_`?6wD?&U)Sb7oAx@X@T;hYy+-&zfpnmJp%)YEWa6n^6@b+9)I?y?xYX{ zL%njb?3Xv&ZDf^N&W5;an@zt5_NO&oc9aJBHP4ZVw|BggPf*bp0kw2tQwa1gn85kp zFoB)(e_#UJ{|6K3sgQDfFslNf3Xp9FiY^|mk$m}XKL~`oe#ugLdDTLxheszQh^T;Q zm!zr9Ix1F|uF55~sFf_TVaySj$f{E}ZiBs@5F{lQBgyEXW&g@6hPS|I#X(ttJ6(c=;KY5dSl4(AX%CI^>^_=4R@&}d)R|I6wyGZ ziO?f1M>)nwo=~W0$r50pW|a^klr^$N2?YtQA*`aND+gtQ>O<+0fA8-Rv8d`j1#<{; zRHMc)?(Qc5XKL!tt^24~PHhtcXSpD7v<_3_<`-4=+!i4}3Sz4jnzw1A~>AQ}*7!`T^mNbfI?)^TUem8$rfQC=!OXTh&Qa zO3IiownE>Xkp6e3%3!Z*2pi&hxbGz(-`W{MM~9H96~F`gj5f8ItH~wL0&v6r84;(} z(Zr}8f++BwNESmw0a?Xg8Bw!ll`P}b{?G-iCVv-ZfYDNG!}a+tGbXN;szpzy$TjX8 zH6#a%#l4Oj96YSnNAEs! z$`ZQaFKS!SUDi}H;t@AI4DIy(ghMcR;F}1HF0&NmQzS>J`tr#cElz&~H6?G%7-%Q% zktVdI-QCI&-4~A@W$r?W%ivAc2H3um7&(?$Sw8lp(|&Op&kl(d2~~hu(D=3mG+Z!c zB@B<|+L<_Usof2na}^zn6mywrT38&|77B_Z{8+46z{D@i3*kXKtYoLbFgp-+I}W-z zAu(pjeli|J!3AhtB1h|qzuW=x?nRRTh$?R{tOP%A5}<7%3H5t23;}8?jC|?@rXifl zL=cK+a}2ow(oG%={9D0IT?F_UPQZu|PGpsBDu(fQ4YKhNmw*VcI9y)mSr%TjXf75l zkwaov9qUmHwvuukGHyIOvf};kj(eM^_`NW%e-M7jBw{D=nd4t`2Qf>Ih#M^?4)p#E zMe&FLYXZz&p#J5qx#nZ{fm+ih5Sdt^`gjIJiLBb@Z3nJnhW!9~vFwG+ng8FfO_&4t3f~F>ip?mTeKvZ=hgIcT}B@Y>9Di;*Om` z^6o}M7f&y`Wwpr6=f^Mq)G+Uh7Zt*mnC}fAv(0!k^xknV8h8jPf48jnLJV#wvfVFj zsDaI)rbfD#l*xGGzEmopjZ*!xNlh0jxHEMR;?F};JQrs_qQ;fcMfiqO;@<;xg%bSg zC0@tsnm=cYLyU`SEA5-qLJb5lnvI@7j4!7F_PW5lnWqNe;D516B>G8lOE8@?;WI@+ zXtMQJuzal~+uB#PE7r~9S=!M~HJ)y-1la7ZV9;tRf8|^lm#OW*XXRG7!Kw7`DVr1$ zul?me?V*1L4|BWfT)gehWVmNb7(UhK3kmz^q?F#Cqu=43ysp?048NCez&>8NSF)+~ zwRPpJdO6e3kCEdqrNhwTQjsE7&C8i3%C#_oX3$dRXZ|GXetr%8lDm?mI$g)5GeA)J ztUt*+BF$jNy-T>yH+V8P`bpx!BoY7k;yF)vz7#R^5xj0TvlZXhTRnpP{9L@U5Pk6C zd+>tkMs(2dN;zWZ%1*S!7Qd=9ampDyaNx6{--Czm?Y*(lQ(^FW8syxD|DMEABRIZr za@Kxdv>fjc(M3TEQ_zh``;m^l20RUOm~e}D)YpX1GYoGIZAP81(r4pb#)pnw7_X)Q=SaT%O^B%cC7O zR~;U$!#Q=T`VL0f9?l;^s@Xs5JD_@eEZibL`uM*^e++zhmJ!Xgg|%F6U72$g7%n=@ zBR?>HoIkeW;a$9xpy@2lsnyN z4jdm~=%x!qb*~8`JAN; zwIIoyyCA;60pnc85qqAPBoz8hZiOJH5mK1!O?vXA24y0$T{qN?Hd$Q?C?r$wg|{F@K6-}ZA^C%)9G9M30&6+-B=2_M-;9j z{CN9V1|-~oULI(`F_>xw1-fpVEN&YExz*7$Ro*8^f;NpxtSvlwhd~Z%-pJ;j_pM)= zJ+OLE2tBkb17G_J%2E^@9e!x{dn#T*p)%yph*(@xI0PXCZ)5l%C&(apGa>8ghJ}b> z;r;}!eiX13W?8S1@2x*HQJd;!$S?&_uc1`>86)7*rpwuZ)mbCf2qGs(HHkoILQG&c zmzHfOkQb4f7=o3A{0+WRH+dnrB|p#7R(67_F7CLD4vRwymvYjYmX~lk2|pYuoV&== zl_^|xTl>CfE_eFIXsU!!j=>tAS7&CqWX+!BR-XaEr(zh1fM#R1=AY!bAq$73Y7frl4==2v7w#fGQ`k`sX9>>N=+?ZsE95vfLM^0(mkVs zoKd1mpzE%7^Ec;YK7u$aU*2p(oL*>4M>$9ZKRA_DoQK_7$2--JtsuVwwZaSXZ%mMJz3wu&p{+uDO%RPk|OC$G6C5*}X{(S5Jd_v1H zi>CFuhphl_&*4NL_p~uCoJi8pD1_4qi3_UsfE#I}F&bR$?-E_;W2K z7MuY8_STi$pOdB*rG3Z46ZX6WAq#m7{*JEj-*()qd#%j#xuo(nIt5p$^5)(hm-a9- zEun&c!dv*+r5kWf1N5&3TwHzwrv_ZaG^0X11FW&dtn(R@9&3_XY0$ImeXYqzXKcy5 z=}3?R)9!@8x)6`i@N%H5eAQ*K=(`4)HzPn`+p%Kr!IJ@`ffgpJOEe4jX-eLHxTe#r z;iG7GynlF(iyq`=bK4Ef_Mw$G`x6rs=1R;qm3_6>=43<4%-nc>*tmIrKouJgzSrFA zn{VBUAMhTyHy$}1MgBj8y;W2lLDMdr;0XjvaCZsrvT^s|4#C|m=!D?zY%CDm-QC@t zjk~)$hxh%?#rgi5|Dso~S>3B<2IK(^)pRK z3$HMMUzNOP$J}!huzY%P6wkvc;c#%~GD_-taD?Z{rx#0Qpwoo#r=Qw>TrLGkW(M(9 zP1G%g;4yD6QN)>hL$!#EHh`0H?l?+Xl@qwtD=O zWw@^SU@E%z)M9$XHE3%UG|Y{WrIDn}C9q7QGrexlSY4kF1X+oh6@RnvXqjR2vFGx~ zvp^P9Nr{7iogI^mK8Hawx!QB}!KXkMSDDxyiaX>NUev5DKZsZJqelyINbZM;9kE5K z{=+{;MwangVQzWP-aIgOgNN>A`^iLP6}XfkpE)I`kJ%)-tyQnbrSoWszVOLRNjLm7 zz{$my9~C(hXcD`W=UVPH-_7938e7C#t?S@^mG*25iR^_|8W>! zvs8c@Ts$*}!V21|ACYraN0%;L_F10)$B!*xnmE~zbm3vVYx#2OK`ZGk1h@4Y^GhE) zA1q{j0L9yQfY#crIs162tNm>KE4KElMq{bn^tSnZExV^S?*aM&6!3C?eNry)^1Ly9 z@^E!W1f-Gl+O4*FKAyfP)DsCXGM3WrW!Sy}4=pXdk-3@DxNNpu33`cj5@r=*($_(% zJeqxuPwp1QJwl0%!;3LJ&g2(v0xPerEoAeT`kK`PDef!Qz#o(swR7%Y3-@CHfMmVfA_u>@Lwi*JWXUFOOp4>LTa)R|R* zfi>W5I)6Mh_wD|5+VmiQ&HEYWvwd!e#q)+dTPEhprPjn#Td%}zz#7|U_Q+78ImrP4 zr5185&-bWHX44Rz*hYzYH#P60{lw~FOwLUp)kfOK>CuD8H%DC|hFpe9XNJ}!*2R-P zzkEB8&rT}6R%M!l7v+o?VS6CVNz(+V`ef-fp(OSG8dDf52@%^a66?ORmUrG{c(UJU{}ZZBC##g1DjXw#$)RP$_7}3g{B^mP zhO?y0nS@;xo6965bOoh)UXq6=woD^Q8}TZjL<~+M^-g3^{%&E*reyd0I79{5Rq-fo znI2KlE?ITzxN^zcWZ>Y{O+6lV%q(^;8OKvFhN!_PYSWjbCEEyxt+F557Tf7twQ27D zSnj*T@!2|d$;fVXsAMfU${5y!g*aQ0k)Ay)nv$Q4KMt}e=nbW0W#n5%vARma^B1m= zdIy6HpM{lct6WgoW)l1iV32^q#saT;t%d?Gt%ia0EVFNTeA&pfBlbh`RCGfT+jTK5 zWmd~HVH_^dPha^gThtqXGMq_k4c)#$4ep7x_=lRPm<0E;S?i+1Fzp8iJR?R;i(p2G z?zaZ1?leM`WCoQyd6UI1?x3oJcTTA<+#zj=Om9C%Jqv~3a_M8P7PWy-8{oLCN_KdH zWFs-hk_fV0p{?@(hX(e@%bn05WutrA`CfX)5~l+-qa7s+LYlw0xhH6nK$!Il`klD?-_S++b?eUgjHE zw&LD3<5NSU)hGQV|64|6H@m>1KD=dAVY9lMUefN=CESBoLeyd&7#pe`s(AvkIA_pa zYP4PK?}32RSw7bJrK-WdCqE8a4po{x1B8Iog}th*H_Q2^wi*D|;{nzzhZE(R;SH|l z@Py%-zsPAkHd^z!%8>Y|=J3Lxm`@$#e}k;N*3C+A zGTeD(4SVk?UE`OpbxJF_$lzJ*;8?^q+gmAJ307z*MKd<`mpH!xw)?-YW@;ELsM@93 zVUAF7Egfs;n^~kcZ*Mmili3zJ?3aCZay!o*hQ^v;^aPL^I^vIl7uhlLv*A_$>F<^` z8k&`IIDKLH#dtd0_VjA&`KO^Beag>Zk0;h`bZ40z#XgdV4f{=)bC$F5uUgcPOAIXT z`4|_oid~HHK|i=S#+KGRc|}W{v;E$)*U*bL)m51r`ngFrkE35jReHKj3lRqO>isfg zLj%EbA^X6xpSZLBFTA!U@id$(t8(O(uX%Ye?*5C#-(}x68}dSj(Ysy1lVj`jwNLP0 zPS^G+`F}JZ?|7EpB-T4~KE)WM46O#hfBD+PIHo7AztUo|;O*dpM7BfJ+4)wrTQoGm zNrS<`J5w8DMOcZI0bZm|n-eFCEGkFUhlQw)y%(vXU{gwwmaa0hJ2`O!PD}D!`|VE5 zG|lb=(2w{|{zV?V<&!4)oe}HYm7ZGN=<0b;cQ?HA=~(G$w0i%z;n~zHF5fp{?c@{g z&Xsf~SGtJcLLVrKbeYzBW*v@$P=g|FuW1n!x56n2v564hcszLvT zrClMSm7MKWM=z!UGx%8jeT=wU2>2ch?R zLj!Tc${Wgk9@o|Pix(`OZPV)i>sWI9cf*<#OmGNI0x+@tFQ<}kxQK$=(Gv(ryv?J< z@DQ11T3A5DV+}V`zs@>bb&~TtV9}lJd-ar%%p8eUDx7ItVH%my`3vHSx$rq)UUbjr z$oVryC+1%*FT+CJM^Q>X`;9cv5G`I@Y2Q zz9WFK-{Yt$VTz5T#shlX3;Q+*Lz)Unl%?kw4_H!-+xs?y)OKF!W-+Jn8QeS5;@IRr zgrE(gTRzu~AkxCf*vTjcsEA7eVguhuWU_M2e7a-mL&X0XlD|HT7Sy0M^JOIx@5U$( zqBHnh(LP)veY9Rm3_>tq#a%mQ&#EDbyp9)*wYbHF{NY0X)g`zTpRtMZUdEHnC!plR zBaZL~5z~Nd=BSt{EBqt2c4A6>^s*9Tm9E8{iihl_fJdr);NcPl7q7H#qs? zJ(l!Kgf2X}5e~rQ$m)%Ig!v8PjLpJCxUWNne)(fA26;e251QM}M_>*_@+IyQb@uF{ zIiN#KNeHKCNK9`EhxV2Sd}mg&kvr-jAkK}62GIOwg*`e3RGr}2btDp%%>&J1_A2_Q zSSr*uZKv4H?~>w_Yb<9v)QLKK7K6Z)4r=;#B~-)6)?-j=M#oB@P65T^I zNk%KOX~sIPA9u!%lbE@%{ClQi0e>B$&o=$8R9R`&p73dXBjH8umEPhJI%^+VWU%LA5= z>CoQ$2@sYHpCf&D1|M<0jt~9qo-|va{?H4Vo;(J(H{l8J|As?&nRvnGy43m5A*$R6I3!8KF=3trsQ7> zcL6~n`l9HspASEl4c5q-rgtA#a*cO=IDt0ny3YV!ZpVvTI}%x*FW?J?m^5kU82u!_Jgv~ChZFRHq5%kgSPDiYSJqad?p zuDop2{xcH(55xT#nRoE8o8g}iN;$|Csk|uhFC@~&no4?!#_{J8Gq}!(GN&!9hj1md zxMwD}Z^*AhE&S2Np$bT(#2;~16BZ20MsR+|>?Vfj>1(@8q zD*M9-qKY@e2y{l9I+q|^Y5G53Iw@${EVY3_vUd27PGs`sRI-FlXp&Q4l~*K8Yn3$F}vMclaGznO)Y*ebUR(3fwYb6yaWG~yZMCXyMuT@2KOO%hN%>@gir_ifvefN@3)kw~6qr*X zsT6VJFK%2oQ)477j|xX1TChxEZu_70o)y%h!p90JtX!>cRI}rFbwF(bw4HCr<-CTX^E5I~ol3@O_mRkG z3~qb2?-saMj9;vSXLE`oWyQWrk)`_1uiBc{O*#{3AkT6fH#i;w*4dwqE*O+6v&1g@ z#<(Lz+*RB55DvY5eNUe=fBsTdR=p*Wx;C#A9KN-^EviRU#Om2NNk6~zE6%v5A-Ig% z!ZqVBvMUOnjjs{QOxi7`Dt4yU13u=D9VVw;rD9mfj-XktC;EKeM-+KH%N>;`3inku zQ8p8IA%N45OK$Qz?O-X+ajy3gbgiGoCS0ZSi_o=H3-EhZ^ZGi2n;BlMGE6zO)=PF`MQii=}f5Ss&DDkDC0D0mX62$ zvi)r)S?ymoH!)1g3qI>a%gVm~zAQWYC*`UzV}8gnpe2@Z-Qz=}DK|E9;AWT0YrJ;9 z299;v<+cNjCvcA?{1D6-EgtaF^JmD{#_S9hn-!JoW~v`xn!Z)OrOOQyV3#|Zmm{o3 znsLjGAa23lqwh2oKM$2hNLYKKv6I*YId-cIC#4Co>AFfR2yQu>@Z=im_7v;^PT*j2wUJKA~)e=Gi!H~LqeAXA1=N2Oc>&m)yN z>)0by1T-1d_cSU#pnBLJIKtUrO&5-|nig#<`%YZLHdSi0Vi zOjZxQ?2H9!HB9Ma-cQGprLDM{FC=0@D3|Zr+_F+6t+nx+afZ@gc92CBSxRc?rxZg6 zK2Y~RsU^t8i`U|#(v3r3r6k~crPjmUJ4o$ljTd++onR?Ss4Z<+(L zqv67q6Yq38XW2CbDp!7mlFzp%OL@S(?CBJ^iLphdgW=|PSJ1)()k==ZB3XUL^k zm@_t|NiK1*hyT;PSHqPIaLob%7Cpw1u`B&{%2V;>m&A5eh_b1)8}zy1E3%f`HQYV4 z1dN|L@U?ZZ77Kb%S&arlePmULR*~O;NBJ^Q(Dyw}utZOGs~<6D`c=7EHkO#%5xa}XU!9*5w?+HNr3#I-RGVIauN_s7PX5Yl zPNXu*_~7OCmsE1~AiNP1a+m%gw`#mP{aOHjvP^tW)88}l5hs@^t7g#!Z-4X4%I+XR zr}xEQEek%&-AhgDyg*xSbv9CD)}%=*(`ydRMtRQbAp#tQ^)}8Q{PibIrqJ##3y%wW zo{eqaT?9>!{Mfm$_8^MDF)kDVkg|vZF%zjro&#s|ba8*T!13gx=X9Lk= zr`yKmWu!C8dS83MuYMt#taaUI{Wy1c;k*9(PCH-Umo_Keegn*6rTL`eeM?8IU{2?N zu-d`;$UDQ-GvzM}dS;BcA=#xpt!qUD@oh?rTRT=upxf6&y5aD8gT5t7g+I>SOTV_e zN9XQ8w$^GkKbcj!(I17|Wh)}sU~tWYxv~ofZAM&0lyS{~&#G|65MhmVsp`J*l}6mX zOXQ!BPa!7mceWc;wN_7jjHc+V3EN_0amHiNa_-i~V{v7U>2;r3)w!ci>sn@5$=N?A zoeGYYWbE&$Wz{pdGs|5XjzEPH<3}O9dRAyP;{RL2o{Z)dBNE?dZI_Fi#BLT0xA?A) z(`rd%s*(^5mob)kXEov&wxG&dAafOwfttfurj30q)-5f>YM!kVU@bi@ zTQJ&9=Eds{H9)V^$-MN3-0gDtAmEfhK5i$ep+o#0z^i1QW6$@CU|HfJKyR~m&Cfkf zJyt(j9en7EPf_X1frU%C&C$nBgG)_J2i7MeJcuNe(RFfhU%JYymSXegrgTt7!wcmY zOzL6t7RmBgwIP?XXFtPcRbT%eiE%aIy5Zeb>x7bw{(n8P)d0#+EU zOl{T#Zi@3L6Rn>pH^@T7%XMlK8QPcFs{l-QF}Z@Hz$3iChEF2a({WW59jI$NW)>}! z^tu+Ox(}OHx3zoV(}y$!0kW(RnK?RCl3Ty|L^u1b7fQ0X3h-xEv!s6Itgi3^UQLkZ z!(3zp%E_q@O>>^ILv5V$5oJ_#et*(knuI@449Xg9IH6-cEb}nOt2M;wTd`K)`-_({ zklQ@ui?%#@gSbCrg%9)Dn`=PNhIgR(uwdSy9i&s-r`y-&LOnVw>?+L?E?HKz@XdjP zj!BU2J3C^nl8^+iy*|&A6V{lCeM)uT%!?v_!SWe#N3oxa?;U`~V2R!h^vQU;k*=CtVu|4?|H4!5ltJgIxt5qx6a1(mYmzU&h; zU_$s9DTC5EA(}w26wkT^?NlmPYvG$}!t6S+D0}j7lS|;6J#-y1T%O{$QAH!r8f-x- zv9x42jNaaXj>^70TFZNBK6C1!*EDss`|Q0ok$SUKdven1@K81ws-r<%_gmjtj^Jvj>Jzvuz`+f1&o}-r$*l1w272Q6P5qs*BJ|C5C=s_| zK2DLEgM@pVkBY!)6^fhO&~nA}67jS43czFoS}e0X4Q|-7J4rjNCp;jSne33?DT=Bo1F`}3y!h&*EK-koZ{_)3wyoT=xv9W z|Ngennn2xzaa#dlPg%2E$;2~?)^k_|BAh#fOs+bi3QMJm*{cGP${Y%WQk~mV)f`hZ z*-=gCl~$cQP|@U9&i$sAi&rj@&03eHjH*_*T5@QNVirS;Ys(2|q83K$RihRNcwE8ou`8r9XvFSe zkDmuBt{R~MgL$DO5fuYTLk%kCG)dWUtN1!q7CIW&kfvXqthE=h22Up&7@fa5nc9At zfAZ(WR!cJ*uYeiu2+hVoT4IFhKRZUf=gI3;mRUbXwy^h_#8+bL|MGVvDPew0;2Jr& z6+nUF(187z+V){%PG~{*Uqyr$t@S)Pgizy5`EED^5bz~5q53z)>vfpc!8l&U}|?eAezGehQs4CI_C_1}$_$(Ffa)D%Ke&sRr;rjuJHx z6aL(4K9pT;&+Lg}xwD8iBX{ZiMmQp7D517FB32va@r`G1mfxjkvLewVFFBYhQO@Y5 z02)4Q%nRxG&mWCEAsNaBH;%Pvhq_NJoLcU7!MLLN;xuBjBfH>2#@Z_H(%1X67eJ9vcg`*|{2tU&K{YI?& ztqo5?jv_MH%`R05?;87DAyir|@<3)X!3&||1Z zbg$zQL+0iyrwiKHO+wRb#WB6<(_&ETl(tvX}zTv8C!DW*+ia}#4e;wG=vpl? zeG5Fh`tAi`mVTzN@I?(K@ErcPq@lH7WBFb8Uu8s`-u4>f+|^VU(kD=r^Vkz1fy|X- zGsLxDhV700c63ZXtGm)l0ytgk>ysFN-B}ooWwVSL75ny@I_;A*Ivn(JZUkITw)iaY zd9Qf^KG#5-p2XW|)XPKLzW&lvem_s8;t|S-PYW`?bnnvWsYl!WbRF;Yq$77&*29_h z`ISk_d*)&taGQ}=nPGI)Z*+&g!k5s@RON{ms197NP=uNlt0I7j%MY{x!rKU>F; zFW5q?XJjtgF!9G|6X*wKwS4^Ln4obzX_c8iF|-Y_3>?TflKNKzJ%XYr;vCH`u97Ra zV>Et9PRenkN*H=oHU&5cmK^1s^L>V*-w$JhgpnAefkx;^o3zy#nxh5D)#~Bj#sGTw zHP9ki;&DLBaL^l_q36+xx_~a1;!T7^nbQajFNE!dQXz)`P$~?=YhYp}%|#azLDJ8-0hEp!#yL5GGF^231dl)NgY;j_K{2z&ppk>6VPVh!{r})hV(p6Nxq(@l4ibw? z4clK?-}PEqW8^9OH5ai)-hL{`=Ly0iFf}EJ7fE)o>f}N%ca+*ISI=uQo$=z+8lG?6 ze8k}mI?Z@;89CkRE=$EuwQ)U)qkhpBC`FF5c(HN0Z}SL+)I7f2SuJ@rMF9Nm*B3I! zcl}}d7r@4Y!>s=DN?o5>YJ*AF$uNnjnpd?(8@|HDLEh47b#bv&qFj(g^Hw1+$gh(6 z;{D9U|1@c5*nUL#Zk^n)@M-cBAxB-%xaQMk=;-I~AmNnVrTzky%vI{Upg1@tpky2! z7ZLE!$1T{bzSv%-x!*0_w5z_^J`3g%Qjg0(1N7+big5#vqIExW0;I)5y|R9YREydo zt4=_rR7-zETL}x+Q;E*98clRJ$s#pNAGl2Q8<-9osBZAb7iAFpN$ArZ&8FZllBsG> z{Y?S+W2|3rNl>}yP|AL86(-K}KyG|DQmh|BP;65?*DtgL#zL2n7%T%7rA~A*#@HB1 zabQSHoYXb9r=Vv%?EL${^oAKkE=XT0gZsG!q5TiP)BTs}uNzpR_nMZw=hdM>875Kq zK8YjmO`7XDZS#HPkcZ`pi|cW53ssbh>luVBl*3P!uAVXZl`!bf*rnqS5ckico81XB z!XV+34wfpGj{A&=?1RD4jpgqL*Yx!~!w5!QKdqWN6~Px}UJQA6b8X zdlzoqtz)PtX%1eYobK|4Yg5z|$I?=*E+i-jH$;h;UU8MkBaX1v;>at*<(s$Pg zd2S?0J&JpASs2lB>PK84dvUz)V4*d=5(o{$QVAoxv$;{0s!rZixrMhtj>pHaG*aJ4 zj#OC~Q+o90RIv@cMEc~g&L|14338!DDx8v5A-n9TolWS^2r^;x3fQF|6b{AiHd@m~ zIExVNzZbN)<&#(RO+Kej8^SVfHchns+BWmOS1w))M17hEX9B5Yb-e!<@@(&r2RPW7 z{=aG#SLj{MzF>GJEB$G{O8$-D5YZc!my1i?%6eoT(7;fvcYjuV)sllMv;%=8bB}Xh zF_-L3yEpS8eG5+?{hPb;VNHxsm&FMq_X8z^o~wgRM^Nrd%L;zz zr1_6;-B$H07c=^y&G|PQ^xlnpPm|@!?N;@@D^{%o3YdFko(fMh>7kBHgnJvb!q&(~ z&c|wUhw3LBU&MEASQ*5tkIX=lCy&aWs)^U0OKbq3{*r%Jt}?4mE2AznEh}`LHs~*# z_a~iLq#eB~+7~}N*o#tMghct9m^l=mpz?l(Wl zhHO*CW(1uhl0F|p`)5$FgvF4VVP+F|4Oo5)FWHS#^fx9~QXQ!6-G2m2iT7+8lgFaP zaN_`c!Yt?p+XKnn)WHQw*~rN4#9iYtxw7UYpTIQt=kVR`@gK}l86+(4?JJ=``NMe_X{peyU;n_5rQb36 z^gq9eVY^#Hi!0`^4;%|w{V*~#)^rgP2ev89)hiF7kQM#?W|7`sNH_wNjDRhMCZ3Ly z6`sU5^uC|48P0-UC_Y0{Bu*L*QVro@7o8cX)*|zH7bTgyCE9#pB+>Wy_Ep@oV+ZGG zu(Z99Ff)1aGF6qIJ3_v{D8;16k+Qf&CVZo%z>D6O% zZ;5)1qTUFY&x=AV=5?;udw4=g)Ck1?zc^+8FHV^`{ufT;CoTWS9Qf9Dj7^bfE%n9! z_ZF8noUTM%m#wb$0aAnw{vD~Efc9FZ9}fCG9l_r>0UrM0=L+7MQEYnPi>}MHk+bch z$NBuJQGwU>;aZAorn3s?EcLh7Vi^cy;)4<7jgFCD3zKm?zn@4SPbq<$Jk^)?G|67ffB;Q5{8L>)D;KT=FFO+_4^FP&FXI^K6h+0 zKIV({`==BFf$ufN+JHN(wMfO51?w({&%UbaPgeSBKGaK`?Hc{l)gg0F2M{_h?YH{Z zpPxMW)PW&`)v`;#!V^E=@~b)4fH04NoCuATu=X5!uyP4%J~@sGOiCTh;#V-7wBe>d zn-v^sGX|;W%^m^xeC)FO^Dcx>g zuNE%_7mxF92#kDEJQ5ufH6w*gTI|!wl>SAn?yu^ccM2*wb1eYNBYTvz1CsbhMX!~T^{+ufzWL6-g z#0!g|&3xxOo2mTlqB_+L!OSYtrlwlsKb{#v#bVj_PcdUa;!HNYN=l`=-uqp~A83G^ zXb>L63{n`$yUBQ`+<)YzeSU>f64g8XA4Vmx#5-jI6f?(vtc2??Fz7(o<`2|>y9W$6 z$mm2;zjqDs#|WN=B>3!6q}DL01DHkf<(_~ypIA@i)}-HE;G!9B&VENl{JNkzoY~F% zv!d+q!>O8DaAxz9^o(Yi93DksQK}_*z}cbN?PS)y+U?qKYC-RrVYSbiH}_yhISOO% z3d&yq;!JciykwD~p$ZJcp5#j~(ozuB_4hLkolNNQ)M|-I)BDIx2TcmhOgEj5U4qu0 zHmok>JXIC!dYPBGSD#)*Y^Ne=BQHVWGVA4smN<`9==yc)A!--SJC?N>WuVx)*K%7H zkZYR?AR|yu)jLDj&oc;Z1FiWZ1x9-QAJShM$?UiqA$n+oJb>avaoV>En_Ve1<)ct% ztn5E)M92M_f9lS$1*d{4REjU`(Rn-}dwzfNz!brHl3b;IsT205Qkb=05cugo@wB5z8Jec-9vouOkR+mWOzY|bXlErAem$loza_WPcF+m zVCMmwDgMXG?^%jYhZo(E>HMG|@)>_tN=3pa@{l|o<$*gr${!yI-D#kcz8m-aj-Roo zWhf(6XQee`j`rA7W5K;XMUDRr{jn?~<8ua}3p0zv89DaQ&9g(D+iLfV)?*-kFM0$h=d@cIod*Nw zw;#A8y8H88FDxGk5vk~N?7 zyPHl|yTMOx0zo`Ta!)a!7R>(p(Tl~qj1BxnX3Y_`;s#ymuA<`ZT*hLi_!EgFdaP-) z1iHIvGj>Fqm$j>Wv&7bnB7q%yfDfS0o5wws z5>%MLT&!RSDmWEY8CNxsXoXs=9upms+7-narxRtNBGr6_(F~?*%!aDtE{yP#JP{o) znNGKooHf}d!3miehxJ#K7jVLf85xkw(TkfNIKzp}KoAfaNAi*Pe}7mcAK<;uY=#qf z|Bp)g4E^WV2S?_Y@%24@b9xi(FooHEkRW-_jpoChZ+KDdJh8ba#v|ZidNHhm(jNY` z`rd^6y*YPnnyI1)FisI{>uHCxjLjJsyYDhxl7`dOA(JtZx{QrFN=G!4D+L^hn14mV%f$lDs_HmpKVnNi^mlxpCNTg*Ym`uYrTE+#F}&;Cb-6SkFmwv zt2YG;_b~99M~QT%d*ZvsOvUrLG0PNYbU9j^UaH+iU zXYP_0Yc|#d{MwGriZ{pgs})R|{s(yEu3|t)2mTsUMN=s^n5#T~Dzj*giTceUpl`P0vx~;wG6y zWF_8k*ZWX@^yi=A+v`H#zQ+R@Xydwp6o;1pu?r`H&)X!Vo-9jv`WcyfS5*? zE$a)v?QTg}i3*^QV)rrWf7XH!5e5l7_7z45KJ47-;?jAp9`hT_%}1E(_mA{HGseEW zuNEsS*Z(pFrba{km{32gH!H*#fpf7-RbkMyPNITN8LXPGE#oS`&yb6Ho}Z|jT3;(<{g`I|a{X`KQlD#A5Qi)IcqKIgM}xWekd6SD!O34sqGK7L7>ELOCh) zXLRp8`UD;sRM^85H}9wc0>+c-QQ~xrd#zY3pV)iT;Gst{bhmdVZYD5`=IEsG`{V`R> z0+BNxDc(w-(z{62+?F%l}p zOhY!R={OZxBU0);m0lw*hR==}oHZoOLz1P{^(Dme6OEZ@t*DcZWT>P@a=(QQ)>iK* zC!6lZ%*S##R0XU4pbm~ss&u_<#q&e*?9p!lYeZ~sh5i4t*1_m7NcH_#FdUdrEbk^5 z1(=)xMiq*M6Wodg!&6_&0CS1;kp+zA`H=!VDh{Lnk-45;0;U!Jy}WT}9t9ZH7)A_= zmHj`HdFx}1VZt!p2bhH^z#<+nN>Hra|08A60|o~j{P6*b0*n#?!}XCB{4N7j?;imp zjSt1f{$EKqg)rh!Y@GFcMKF!UmvD69VCQdr93O zk!iDJ|8lNGog+EcnY@M+BpqPtkDf^}35P3^6fKG^&1K?`Q}k&b6AlJVNu)T$7>Wu% z1{2{+%~;n5BT-Fpe^@}i3vGj(Ic*DuqK}8XvWIp&9-WHX0N0rH^YKp{Kh0m$$m%Tj zCKQf4=pL9M4HP=&X&7ntRNrm|$qelO!l=^qGt-3RAgjW_DJhB}#c1IgcM6$lH zH2O`ehDwICf7$`{dE^7FgJF#y2~)6x651F+JQBKhV}ntK?)sE& z1`gBK4bznmvD*zWHP8qX6Jheha1$ifj-OF}~5sRm> zu%emNLyDCMH)_4GhpznH)zs3jzdHM%CS_c>r%MnuD+`ri$sF0r=t%e|i^aB-#WtHI zoPlO5F~NY2wz@~@Y)r`p8cM%X_QRiu5B83DwTmCf$Vjb$tQFY`C|Bx&-Q?zme- z=5iJZO~GzJ#+x?sUWif`b&ZzjkYbLwJd6EJY1q+_i%vJTGfj~DN47ux{Cp#kr@Nf0 z1hB}yF$Rj*w-!HZ$8`a-!TsCd;}xItoZZF3OU`KsQX*U4a`GJAjtn)wIkCt2@O4#GllFBMSM7bOa9)s4x@>vuX7ey-Bzx z(WuCd?pJFXkR2n>5Jm9KV7GV_XqgHf8Pz%K82&X3x59H>4Smx&FrNP7*Xd=YeDrK6 zKqH#X_e*9Y53x|=^o7(PP^UzNl79Jh?j&P(?G#ICjU3HDJ{)J%5=&fmh5TK8MX%r| z(6l|a?ZTM0w~8Z!y&1x-h21DN{NSK*ri-GGrER!W>2=*2B)#-7$UpcHJW5?uYO%OB zgsheI^{?Bj@XjA*@Yb)ThtEYu(5iI&K1lQIV`g6vaEUpH|B+(R{`t7Z?VriC_Awx` zhrroBNKHQsJyXXI^Gse8vBwLKzSCi>9zbJn7(D+le|t3U0SflvU&_cziEA#xoO+Lt zjOWyI5sN(~!YliZn^;HK!J?GLuNtiUwuASSK17K+ot-w2G3MlM)&E%^>#_0c^`!!i z${#7o@iEfi%ZBx(nuf^hZA?nu!rK?AP77O`3-@FU?Bhi=cm5bJzz}jh0C9acA*px@%NJ}ut3 zQugZqltO@Fnw!Db+~DeI=;IDzB*9du{)UGg0!@) z@#3mx48I)9@zEY#Tzi~(!Ei2JJo^xludK=sG5(s&{ZUQ!Hton!(qC`i2q3MkRd5Kr zNH*j``p@0VACM-@TmB73nu=_jmWKctuE$@?B;iIZtlTH^J#R9((gT&ErnIg_la-$S4QVw zL#@#vGqx9v#Ru+i&z|N%Q-F6fwE7~ar#uj(6Esmn;e)wuIeLp1bh2OQxBc4>3vzW( zf$OVWHK)O}Z2rMg<$j0U%X(;4^(@~=Lw9ozu}v=Ori1(Oe6P5APuJxGnOmID3-!X} z_k~K7&d9HLnPkRzJj)+(W~M(7*ptM$@;P6N&lJ!XKumj(?MKk=c?LfCc1`rGxKjKJf_VMNaJEX7e$^A4`?zT)`zd?xWbz_^dW#~0knwIH0SMI`f+x`N>i0ur*xgwF zGyHPcIV;U~95hyDV``l(!GJMRrO??TCTaJ~)dVN7Cg)$$%ufz&ccyu-kGv5@c4O`1 z$Xf8p3{os~j99rakUyW#IIfVMrla#ZxKArNLwVJKb+^_chMJ!DY?%h(Ty(ul6~QmC*gQ)|Sdmza z{Li~A0Zdms|#STFuxwA035g?HX*9d>47CgT6pg#&>YRov}O7&VkkOc|v_ zwLu(AEKJNS+^mLd%-q~Y#>UK?Z0uZIT+D_>+@^-y9ESY=zcavPEifeS*5^dafBk{~ z*BxMARR5v6M9_cHI>!Bv6aj%$5)H$vhDbcm-Ykc0(Xzj zo;xoi?$6*h^TJ17z_7$2?Pvdm)&Uno|EJ5jG9P-cS~rw1Nu;KU2*PU-z}lC-5(Dn1 z6;cnewO=RppUj2CtpooHas%wh6DFu7BXV&A`0zgL@LsOt;6*bi*Dlem`+$XN`AskI z54S#J*-jPNZs+4aI13o8m3aMYIA5ijj4(}&P>w@dD>!dEfwl#dr>zh8!G88k$es8j zy&(M1ZYH9jEd>0K?1~Q(MkJUx`Err1ltvAd!v+1DT=-F6?Mdak2DxDKH`&r6S?wvu zx*%Nedz+xNC`5abA_4~SmF(OCBkjoV_7r7Zvkh?b??H(uJo{`1(!0eg`dzQuAh`yd z`k$W?4RI2;0JY`7B?tJ^9^D4KyPvS9z1|H(DC)6Xr_@T=yvg>9aYGOtpH*UQdb&H)#!!*j~jOr)R!Pqdrmj>Ot?=xEYjiDZ07`kxS)1 zV{aK;KuR7jZmVvPES5I1`rYDGzW&~P!>m1y%W4!Vmm)c)EWm84nmw8ktB$8kXdY)q z&OS39!F>*&+D_aq`ZASth@IL_+HNY_UC;ZJvfacyZe@KLm@}7@0bbaqAN*qUdQX(v zLe^+8qR+Xo%{NGIYWVwn*_`RTl_1lk$x!QR;GEQU!<}f=&fo(!nR`^5>VbtQ6k1j<6Y_{XDsW5R~dB~kVwrsJi>+4L8u(nP$jN+KIQtoJTcOc|xJ=kvT z@EjHrn=GejYY_53JvPg6m`gc)AsG(i>>MHF7o4ZFsn+OXQ?X6Z;&^VFcFn5QDIX3s z!n-4}qdqNs`Wn%k1$nhW2bLBazPIZF%x4QHcW(M`XKlMy0zPl&5xuLR1P@~5KKx6z zL!FWC%6v&d+0K7?c! zR^S10-P2r>BX}H7ljl*N#cI^`9Lkk>!v6iyLq3eU1qNUsc|Hy&3BooQOg@4-1lwXb z`AF(ksB1Nld=&Ly%t5ul0vt`E|D{hBf07qckH@Lln!Jd55AMgqi#$o2a`{u z?tle2ntVESAr|2n@)!z7NOd}3RE984)vUtkgp=!87fCLvztVl* zOzH2{u zBlTfChNs9MQJ=x{{FVB;$Jj*TkF8KMmM7G0FcdY%)3c+|Z7zN!e@6Y4yQ~(a`J2Y6 z7xPw74__E9?}8pv4LDO zle?&q_aXU5>c{vLe{~j`!+a*u5x&J3@-JM6B-F}6?_8?Q>Kl*a z3Gx8ym-rgrlDDRQk6P*I_yegu*aG{I2Vol$&EGC@cH7B=f2lQ=X>{8~u6eRXD~&RT z$kj?O;}yJ0-WJ11u3;_Kk%v>?Lal=)khi0b!bv!VJc4>EPDfqy_83Vr8|UJDa`k2r z7>)7dS}S$NG|VKA#@DE8`yOL37UMYg<9HHJlXs*(gXgh^T&+u2_zGSl*Bo^e*5F0* zPMFA9jN#b)e^4zXi8=t=psusdr9H-A0(mk%raDXHQ)wYjdC90*RQJ=ypJWHNV zT}`dF{Q|q-OMHcIP^<5*_zpjyo})~T(}f<~L#~xbGNxiWd3Wjz%*5{e)jqanVK(+4 zKZKQdl3cULDm;f5$a|sIS;g!*k3{R8p|}tClj}L^f6G1U&R>OM7`fJr?Jxq>N;NZ# z!e~^B8bGb~lfXW876VZ;Nv#&OvYSS(b?9uIkBiBNP%p!kxQ1LSR?XOZQlBHwMU4U% z@FHF&A4;v6!*#4B*9`Us*0E1rL#=3fqpr^Y^5HlFN0JZ1Azan#s?qrc>bcNb`whOsPvn!i8V+iFsV7(Or+zO6JED4tY1Exj@6Gfis)y7&F1@+Z z(=mfu^ZW+ti8z_9>QQImY@EYZ{TKbMwyKZSf7W@pfLyg!$C}sOA=mnP5AH?vLi#Ix z{tzC;{LiL$i33g@w zld1LgX(jb=9ED@ZSK(@s2{;93kguVhjq^}X>st1&S*X_6yUEv4@5O_tHPm|4bD?#_ ze+l+57Z;KjQ!m98xSCuuI<4i^n@u9$Og$O(wr48&7SxlaHgFIRlj}V|C7!@jGf(p*TZMa^*Z_C{@H2esPR5?n^Ewd4xaI}jJS<}kZS z{IM0Pg{Wl)q2A1tkylV_?XNeVL&$YsfAscp7>>XKwrV`mNTFHZN?eWVjWrL{o0(t? zCD&6BhMEiQBtJ~O3w0J1M&CRsF4o4lyNb*b6_wgY%l53Xx2(?0S$ThFidchCX zdNmWiMxwQ_R=&5%HJ)nqdJi9v*HS-1t!wmOG>Uz|FC6nma?Pl3l5ECO?zq0ExJA95 zz4gN0=G`ZoKI!+6wKf75_^sAZAORe?qLe%r9wYHwbSkw&sKDB1K z*HOo>|Dx;g5Ow7r;bY@|b?Z%*}XX(H--Pkk%e z67@}`zWvlUp8A$E2=&co80vRWp{Q>#!?8WK!wBqvkr;(>7>zL)iybi@6R;Czqkc!! z8Iv&uQ!x#@Vmfxg49vnzf9!_cu`l+(p4ba}V;{`Je%K!e;6NONgK-GvU@nfpp*Rfl zaX5~}kvIwqa5NTT5$g9slW`o5#|bzQC*gFQf>UuC&chiv6KCOUoP%@u##U`$7cR$z zxEPn>I$VKka0_n4O}GIeXmDB?_y5-V zp17Y1y?R{5KK=52w)oL!fWObc2D^v0#uN0tFA2%FNwo2V{>j#1#*-Rv>o{*+W9x9^ z$@!VB6O1Q!jIG-lXV08KTPJzz5?e9%bvU#`7f8asCf_lf@_sWo~41baG{3Z3<;>WN%_>3UhQ}a&&ldWo8O9 PFgQ0jG72RnMNdWwoq|QU diff --git a/docs/manual/fr/admin-manual.tex b/docs/manual/fr/admin-manual.tex index eb7aad8c..1e662d59 100644 --- a/docs/manual/fr/admin-manual.tex +++ b/docs/manual/fr/admin-manual.tex @@ -1166,6 +1166,18 @@ \subsection{Mod\`eles d'e-mail}\label{sec:email-templates-admin} \texttt{\{companyName\}} — remplac\'ees automatiquement \`a l'envoi (montants et dates au format suisse). Une variable inconnue est refus\'ee \`a l'enregistrement avec un message explicite. + \item \textbf{Variables propres aux rappels} : + \texttt{\{reminderLevel\}} (niveau), \texttt{\{reminderFee\}} + (frais du seul niveau envoy\'e), \texttt{\{totalDue\}} (\textbf{reste + d\^u} de la facture \textbf{plus} les frais de rappel cumul\'es), + \texttt{\{daysOverdue\}} (jours de retard) et \texttt{\{feeNotice\}} + (phrase disant les frais compris dans \texttt{\{totalDue\}}, + pr\'ec\'ed\'ee d'une espace, \textbf{vide} sans frais) ; + \texttt{\{amount\}} reste le montant total de la facture. Les mod\`eles + fournis n'\'ecrivent aucune phrase de frais en dur et passent par + \texttt{\{feeNotice\}} : \`a frais nuls, ils n'en parlent pas. Un mod\`ele + \textbf{personnalis\'e} qui \'ecrit \texttt{\{reminderFee\}} en toutes + lettres affichera « 0.00 » sans frais — c'est \`a vous de l'\'eviter. \item \textbf{Z\'ero configuration requise} : un mod\`ele par d\'efaut soign\'e est fourni pour chaque langue — une PME peut envoyer une facture correcte sans jamais ouvrir cette section. @@ -1197,7 +1209,7 @@ \subsubsection{Période de grâce} \end{keshwarning} \begin{keshnote} -En v0.7, les frais de rappel sont \textbf{affichés mais non comptabilisés} (produit accessoire) et \textbf{ne figurent pas sur la QR-facture} : le montant demandé par la QR-facture reste le \textbf{total TTC de la facture d'origine}, jamais le total augmenté des frais. Les frais apparaissent dans le courrier de rappel et dans l'historique, à titre de créance accessoire. +Les frais de rappel sont \textbf{affichés mais non comptabilisés} (produit accessoire, issue \#401) et \textbf{ne figurent pas sur la QR-facture} du rappel : depuis la version \textbf{0.12.1}, celle-ci demande le \textbf{reste dû} de la facture (son total TTC diminué des règlements partiels), jamais augmenté des frais. Les frais apparaissent dans le courrier de rappel, sur une ligne à part du rappel PDF et dans l'historique, à titre de créance accessoire. \end{keshnote} \subsection{J'ai oublié mon mot de passe administrateur (recovery break-glass)} diff --git a/docs/manual/fr/user-manual.pdf b/docs/manual/fr/user-manual.pdf index 44a073f25e99b04fe9f64b4366920f3fdbf2dd15..4456f16cdaafe0d42102ac69b29738e7993d6525 100644 GIT binary patch delta 149916 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 z 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⪚t8?G{iGGz6 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 { expect(reminderErrorLabel('INVOICE_ALREADY_PAID')).toBe('Facture déjà payée'); }); + it('libelle le refus du reste nul (Story 25-4-b2), pas le fallback brut', () => { + expect(reminderErrorLabel('REMINDER_NOTHING_DUE')).toBe('Rien à réclamer'); + }); + it('retombe sur le fallback avec le code brut pour un code inconnu', () => { expect(reminderErrorLabel('SOMETHING_NEW')).toContain('SOMETHING_NEW'); }); diff --git a/frontend/src/lib/features/reminders/reminder-error-label.ts b/frontend/src/lib/features/reminders/reminder-error-label.ts index aff1eae5..e5f700f7 100644 --- a/frontend/src/lib/features/reminders/reminder-error-label.ts +++ b/frontend/src/lib/features/reminders/reminder-error-label.ts @@ -18,6 +18,8 @@ const LABELS: Record = { REMINDER_CONTENT_EMPTY: ['content-empty', 'Modèle de rappel vide'], REMINDER_CONTENT_TOO_LONG: ['content-too-long', 'Contenu du rappel trop long'], INVOICE_NOT_PDF_READY: ['not-pdf-ready', 'Facture non imprimable en PDF'], + // Story 25-4-b2 (#416) : reste dû nul — rien à réclamer. + REMINDER_NOTHING_DUE: ['nothing-due', 'Rien à réclamer'], RATE_LIMITED: ['rate-limited', "Limite d'envoi atteinte"], DATABASE_ERROR: ['database-error', 'Erreur technique'], // Codes « e-mail parti » : le message dit explicitement qu'il a été envoyé. diff --git a/frontend/src/routes/(app)/settings/dunning/+page.svelte b/frontend/src/routes/(app)/settings/dunning/+page.svelte index 0df9e67f..20d9ef97 100644 --- a/frontend/src/routes/(app)/settings/dunning/+page.svelte +++ b/frontend/src/routes/(app)/settings/dunning/+page.svelte @@ -260,7 +260,7 @@

- {i18nMsg('dunning-cgv-hint', 'Les frais de rappel ne sont exigibles qu’avec une base contractuelle (CGV). Ils ne sont pas inclus dans le QR de la facture jointe.')} + {i18nMsg('dunning-cgv-hint', 'Les frais de rappel ne sont exigibles qu’avec une base contractuelle (CGV). Ils ne sont pas inclus dans le QR du rappel joint.')}

diff --git a/frontend/tests/e2e/dunning-roundtrip.spec.ts b/frontend/tests/e2e/dunning-roundtrip.spec.ts index 6f3fed0c..3df25698 100644 --- a/frontend/tests/e2e/dunning-roundtrip.spec.ts +++ b/frontend/tests/e2e/dunning-roundtrip.spec.ts @@ -78,8 +78,9 @@ test('round-trip rappels : config → envoi unitaire + lot → historique → su .toBe(before + 1); const unit = (await fetchSentEmails(page)).at(-1)!; expect(unit.to).toBe('debiteur-a@example.ch'); - // La PJ du rappel est la QR-facture PDF (backend `facture-{base}.pdf`). - expect(String(unit.attachmentFilename)).toMatch(/^facture-.*\.pdf$/); + // La PJ du rappel est un RAPPEL (Story 25-4-b2, #416 : backend `rappel-{base}.pdf`), + // dont la QR porte le reste dû — plus la facture réémise. + expect(String(unit.attachmentFilename)).toMatch(/^rappel-.*\.pdf$/); // (5) ENVOI LOT (facture B) — la facture A a quitté la liste après son envoi // niveau 1 ; B reste sélectionnable. diff --git a/frontend/tests/e2e/reminders.spec.ts b/frontend/tests/e2e/reminders.spec.ts index 8b31edde..1d023336 100644 --- a/frontend/tests/e2e/reminders.spec.ts +++ b/frontend/tests/e2e/reminders.spec.ts @@ -11,7 +11,13 @@ import { expect, test } from '@playwright/test'; import type { Page } from '@playwright/test'; import AxeBuilder from '@axe-core/playwright'; -import { seedTestState, clearAuthStorage, fetchSentEmails } from './helpers/test-state'; +import { + seedTestState, + clearAuthStorage, + fetchSentEmails, + authedApiContext, + disposeContextSafe, +} from './helpers/test-state'; import { createContactWithAddressViaApi, ensurePrimaryBankAccountViaApi, @@ -70,6 +76,51 @@ test.describe('Page Rappels (Story 21-6b)', () => { expect(String(sent.attachmentFilename)).toMatch(/\.pdf$/); }); + // Story 25-4-b2 (#416, AC 10) — une facture RÉGLÉE EN PARTIE : l'aperçu du + // rappel réclame le reste dû, pas le TTC. 4.5 × 200.— à 8.1 % = 972.90 ; + // réglée de 400.— → reste 572.90, montant qui n'existait nulle part avant la + // story (le texte réclamait 972.90 + frais). Seule la frontière HTTP réelle + // dit que la grandeur traverse jusqu'à l'écran. + test('facture réglée en partie : l’aperçu réclame le reste dû', async ({ page }) => { + await login(page); + await ensurePrimaryBankAccountViaApi(page); + const name = uniq('Partiel SA'); + const contact = await createContactWithAddressViaApi(page, name, 'partiel@example.ch', 'Madame'); + const invoiceId = await createAndValidateInvoiceViaApi(page, contact, overdueDate()); + const ctx = await authedApiContext(page); + try { + const accounts = await ctx.get('/api/v1/accounts?includeArchived=false'); + expect(accounts.ok(), `comptes: ${accounts.status()}`).toBeTruthy(); + const cash = ( + (await accounts.json()) as { + id: number; + number: string; + accountType: string; + active: boolean; + postable: boolean; + }[] + ).find((a) => a.active && a.postable && a.accountType === 'Asset' && a.number.startsWith('10')); + expect(cash, 'un compte de liquidités imputable').toBeTruthy(); + const settled = await ctx.post(`/api/v1/invoices/${invoiceId}/settlements`, { + data: { + settlementType: 'internal_account', + accountId: cash!.id, + amount: '400.00', + settledOn: new Date().toISOString().slice(0, 10), + }, + }); + expect(settled.ok(), `règlement: ${settled.status()}`).toBeTruthy(); + } finally { + await disposeContextSafe(ctx); + } + + await page.goto('/invoices/reminders'); + const group = page.locator('div.rounded', { hasText: name }); + await group.getByTestId('reminder-row').first().getByTestId('reminder-send-open').click(); + await expect(page.getByTestId('reminder-send-confirm')).toBeEnabled(); + await expect(page.getByRole('dialog').locator('textarea')).toHaveValue(/572\.90/); + }); + test('contact sans e-mail : badge + case désactivée + envoi absent, manuel possible', async ({ page, }) => { From 7541702694755ce35fbc81633ed5b247b6501b3d Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 23:33:49 +0200 Subject: [PATCH 50/51] =?UTF-8?q?fix(25-4-b2):=20revue=20P1=20=E2=80=94=20?= =?UTF-8?q?envoi=20refus=C3=A9=20si=20le=20reste=20a=20chang=C3=A9=20depui?= =?UTF-8?q?s=20l'aper=C3=A7u=20;=20montants=20lus=20dans=20une=20transacti?= =?UTF-8?q?on=20(refs=20#416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 2 + .../25-4-b2-residuel-aux-rappels.md | 36 ++++++++++ .../implementation-artifacts/deferred-work.md | 4 ++ crates/kesh-api/src/errors.rs | 13 ++++ crates/kesh-api/src/routes/invoice_email.rs | 61 +++++++++++++++- .../src/routes/invoice_pdf_service.rs | 43 +++++++++-- .../kesh-api/tests/invoice_send_email_e2e.rs | 67 ++++++++++++++++++ .../src/repositories/invoice_reminders.rs | 14 ++-- crates/kesh-i18n/locales/de-CH/messages.ftl | 1 + crates/kesh-i18n/locales/en-CH/messages.ftl | 1 + crates/kesh-i18n/locales/fr-CH/messages.ftl | 1 + crates/kesh-i18n/locales/it-CH/messages.ftl | 1 + crates/kesh-i18n/src/loader.rs | 1 + crates/kesh-qrbill/src/lib.rs | 4 +- crates/kesh-qrbill/src/pdf.rs | 8 ++- docs/manual/fr/user-manual.pdf | Bin 298019 -> 298325 bytes docs/manual/fr/user-manual.tex | 2 +- .../lib/features/reminders/reminders.types.ts | 10 +++ .../(app)/invoices/reminders/+page.svelte | 12 +++- 19 files changed, 266 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b84f9262..b6eb4302 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,8 @@ Le contenu est rédigé en français à destination des **fiduciaires, PME, ind - **Un rappel réclamait le montant entier d'une facture déjà réglée en partie ([#416](https://github.com/guycorbaz/kesh/issues/416)).** Une facture de 1 081.— réglée de 900.— était relancée pour **1 081.— plus les frais**, et le PDF joint — la facture elle-même — portait une QR-facture à 1 081.— : le client qui la scannait **payait une seconde fois** ce qu'il avait déjà réglé. Le rappel réclame désormais le **reste dû** : le courrier l'annonce (plus les frais s'il y en a), et le PDF joint est un **rappel** — il en porte le titre, dit ce qui est déjà réglé et ce qui reste à payer, et sa QR demande le reste, avec la **même référence** que la facture, pour que le rapprochement reconnaisse le paiement. + **Un règlement arrivé pendant que l'aperçu est ouvert fait refuser l'envoi** : le courrier validé annoncerait un autre montant que la QR jointe. Il suffit de rouvrir l'aperçu. + **Les frais de rappel ne s'affichent plus quand ils sont nuls** — les modèles fournis écrivaient « frais de rappel de 0.00 ». Ils ne sont **jamais** dans la QR : ils ne sont pas comptabilisés ([#401](https://github.com/guycorbaz/kesh/issues/401)), et un versement qui les inclurait serait refusé comme trop-perçu ; le PDF les mentionne sur une ligne à part. ⚠️ **Le rappel PDF ne part qu'avec un rappel envoyé par e-mail.** Pour une mise en demeure envoyée hors de Kesh ou un contact sans e-mail, le PDF imprimable reste celui de la facture, au montant total ([#477](https://github.com/guycorbaz/kesh/issues/477)). ⚠️ **Un modèle de rappel personnalisé** qui écrit `{reminderFee}` en toutes lettres affiche toujours « 0.00 » sans frais : la nouvelle variable `{feeNotice}` est vide dans ce cas. diff --git a/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md b/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md index cf605b82..39f692ef 100644 --- a/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md +++ b/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md @@ -215,6 +215,22 @@ quel à une facture partiellement réglée (**[#477]**). PDF régénérés et co - [x] **T5 — textes** (AC 11). - [x] **T6 — gates** : backend complet (base remise à zéro), frontend complet, **E2E complet**. +### Review Findings + +*Passe 1 de `bmad-code-review` (2026-09-27) — Blind Hunter, Edge Case Hunter, Acceptance Auditor, tous +Sonnet, sur `46081964..7b20d687`. Brut : 4 + 3 + 0 ; après dédoublonnage et tri : 1 décision, 2 patch, +1 defer, 2 écartés.* + +- [x] [Review][Decision] **HIGH — à l'envoi unitaire, le texte et la QR peuvent diverger** — `send_reminder` envoie le sujet et le corps de l'aperçu (`invoice_email.rs:515-516`) mais recalcule les montants de la QR au moment de l'envoi (`:531`) : un règlement enregistré entre l'aperçu et le clic fait annoncer au courrier l'ancien reste, et à la QR le nouveau. Le lot n'a pas le défaut (montants calculés une fois). Convergé Blind + Edge. Options : refuser l'envoi si le reste a changé depuis l'aperçu (l'aperçu rend le reste, l'envoi le renvoie, écart → 409 à rouvrir) ; ou l'accepter et le documenter. ✅ **Tranché (Guy, « ok, continue » sur la recommandation)** : refuser — `409 REMINDER_AMOUNTS_CHANGED`. +- [x] [Review][Patch] **MEDIUM — `reminder_amounts` lit reste, réglé et frais en trois requêtes hors transaction** [crates/kesh-api/src/routes/invoice_pdf_service.rs] — un règlement inséré entre la lecture du reste et celle du réglé rend « déjà réglé » et « reste à payer » incohérents entre eux, et la QR peut réclamer un reste d'avant le paiement. Risque introduit par la story (avant, le TTC se calculait des lignes). Blind Hunter. +- [x] [Review][Patch] **LOW — les libellés courts du bloc (déjà réglé, reste à payer, frais de rappel) ne sont bornés ni testés en largeur** [crates/kesh-qrbill/src/pdf.rs] — seule la mention pleine largeur l'est ; la colonne n'a que ~23 caractères. Edge Case Hunter. +- [x] [Review][Defer] **près du seuil de capacité, `payment_terms` se clampe sur le bas du bloc** [crates/kesh-qrbill/src/pdf.rs:728-736] — deferred, pre-existing : `payment_terms` n'est pas réservé et se clampe à `content_floor + 5` ; avant la story il pouvait déjà chevaucher la ligne du total au seuil, le bloc de rappel reproduit la même géométrie sans l'aggraver. Le réserver changerait la capacité des factures. + +Écartés : montant imprimé sur le bulletin (Blind F3) — il vient de `data.amount`, le montant de la QR +(`pdf.rs:819-822`, `:947-950`) ; borne en caractères d'une police proportionnelle (Blind F4) — +limite documentée, même méthode qu'`IDENTITY_MAX_CHARS`. L'Acceptance Auditor : 0 finding, recomptes +concordants. + ## Dev Notes ### Ce qu'il ne faut pas faire @@ -353,6 +369,26 @@ Claude Opus 5.5 (`claude-opus-5-5`). ## Change Log +- **2026-09-27** — **Revue de code, passe 1** (Sonnet ×3, `46081964..7b20d687`) — **1 HIGH (décision), + 1 MEDIUM, 1 LOW** corrigés, 1 différé, 2 écartés (§ *Review Findings*) : + - HIGH, tranché par Guy : l'aperçu rend `amountDue` et `fees` ; l'envoi unitaire les renvoie + (`expectedAmountDue`, `expectedFees`, optionnels pour un client d'API) et un écart → + `409 REMINDER_AMOUNTS_CHANGED`, rien ne part. Test d'intégration + `send_reminder_refuses_amounts_changed_since_preview` (aperçu → règlement → envoi refusé → nouvel + aperçu → envoi) — ⛔ **mutation vérifiée** : sans l'appel à la garde, 201 au lieu de 409. Test + unitaire `check_amounts_unchanged_compare_des_valeurs`. Page des rappels, types, clé + `error-reminder-amounts-changed` ×4, manuel et CHANGELOG ; + - MEDIUM : `reminder_amounts` lit reste, réglé et frais dans **une** transaction (instantané + REPEATABLE READ) ; `sum_fees_deduped_excluding` devient générique sur l'exécuteur. ⚠️ **Pas de + test** : la course demande une concurrence réelle, non reproductible de façon déterministe — + correctif structurel ; + - LOW : `REMINDER_LABEL_MAX_CHARS = 23`, troncature défensive au dessin, borne testée dans les 4 + locales. + Tests, recomptés depuis le diff de `7b20d687` : **+2** backend (1 unitaire, 1 intégration). + ⛔ Un repository de `kesh-db` touché ⇒ **gate complet** : base remise à zéro, **2510 / 2510** ; + frontend `check` 0 erreur, **835 / 835**, build OK ; E2E ciblé `reminders` + `dunning-roundtrip` + **10 / 10** ; E2E complet au dernier commit de la boucle. PDF du manuel utilisateur régénéré, + contrôlé aplati. - **2026-09-27** — **Dev** : T1-T5 faits (§ *Completion Notes*) ; deux écarts de mise en œuvre écrits (titre par champ plutôt que par surcharge de locale ; montants calculés une fois et partagés). Gates verts (§ *Gates*) ; **KF-053 (#478) ouverte** pour le symptôme E2E revenu. Story en `review`. diff --git a/_bmad-output/implementation-artifacts/deferred-work.md b/_bmad-output/implementation-artifacts/deferred-work.md index 4876d9b9..544e7e31 100644 --- a/_bmad-output/implementation-artifacts/deferred-work.md +++ b/_bmad-output/implementation-artifacts/deferred-work.md @@ -144,3 +144,7 @@ Pass 1 Opus 4.8 × 3 reviewers (Blind Hunter + Edge Case Hunter + Acceptance Aud - **La balance âgée déduit tous les règlements, quelle que soit `as_of`** (`crates/kesh-report/src/aged_receivables.rs`, `generate`). Depuis la 25-4-b1 le montant sommé est le reste dû, qui soustrait les règlements et avoirs **existants** sans comparer leur date à `as_of` : une balance « au jour J » passé serait sous-évaluée. **Différé** : la limite est écrite dans le doc-comment de `generate`, et la seule route appelante fixe `as_of` à aujourd'hui. À reprendre si une balance âgée historique (audit, clôture) est demandée. - **Trois tests préexistants de `invoice_echeancier_e2e.rs` déstructurent `seed_base` en `(company_id, admin_id)`** alors qu'elle rend `(admin_id, company_id)`. Ils passent parce que les deux valent 1 sur une base neuve. **Différé** : préexistant, relevé au Debug Log de la 25-4-b1 ; les deux tests hérités de la 25-4-a ont été rectifiés. + +## Deferred from: code review of 25-4-b2-residuel-aux-rappels (2026-09-27) + +- **Près du seuil de capacité, les conditions de paiement se clampent sur la dernière ligne du bloc de rappel** (`crates/kesh-qrbill/src/pdf.rs`, bloc `payment_terms`). `payment_terms` n'entre pas dans `recap_reserve` et se contente de `ty.max(content_floor + 5.0)` : au seuil, il se dessine à ~2 mm de la dernière ligne au-dessus. **Différé** : préexistant — sur une facture au seuil, il chevauchait déjà la ligne du total ; la 25-4-b2 réserve son propre bloc et reproduit la même géométrie sans l'aggraver. Le réserver lui aussi réduirait la capacité en lignes de toutes les factures portant des conditions de paiement : décision à prendre, pas correctif mécanique. diff --git a/crates/kesh-api/src/errors.rs b/crates/kesh-api/src/errors.rs index 8eeec26e..3b2b5723 100644 --- a/crates/kesh-api/src/errors.rs +++ b/crates/kesh-api/src/errors.rs @@ -454,6 +454,11 @@ pub enum AppError { /// un montant ≤ 0). 422. #[error("Rien à réclamer sur cette facture")] ReminderNothingDue, + /// Story 25-4-b2 (#416) — les montants d'un rappel ont changé entre l'aperçu et + /// l'envoi (un règlement est arrivé) : le texte validé ne correspond plus à la + /// QR. Rien n'est envoyé ; rouvrir l'aperçu. 409. + #[error("Montants du rappel modifiés depuis l'aperçu")] + ReminderAmountsChanged, /// Story 21-5b — envoi d'un niveau de rappel > prochain attendu (saut interdit, /// ou niveau déjà couvert par un envoi concurrent). 409. #[error("Niveau de rappel déjà couvert")] @@ -1323,6 +1328,14 @@ impl IntoResponse for AppError { "Les rappels sont suspendus pour cette facture.", ), ), + AppError::ReminderAmountsChanged => build_response( + StatusCode::CONFLICT, + "REMINDER_AMOUNTS_CHANGED", + &t( + "error-reminder-amounts-changed", + "Le montant dû a changé depuis l'aperçu (un règlement est arrivé) : rouvrez l'aperçu avant d'envoyer.", + ), + ), AppError::ReminderNothingDue => build_response( StatusCode::UNPROCESSABLE_ENTITY, "REMINDER_NOTHING_DUE", diff --git a/crates/kesh-api/src/routes/invoice_email.rs b/crates/kesh-api/src/routes/invoice_email.rs index 318c2955..5b5c852c 100644 --- a/crates/kesh-api/src/routes/invoice_email.rs +++ b/crates/kesh-api/src/routes/invoice_email.rs @@ -308,6 +308,12 @@ pub struct ReminderPreviewResponse { pub level: i16, pub subject: String, pub body: String, + /// Story 25-4-b2 (#416) — le reste dû (arrondi) et les frais cumulés sur + /// lesquels le texte a été rendu. Le client les renvoie à l'envoi : s'ils ont + /// changé entre-temps (un règlement est arrivé), l'envoi est refusé — sans quoi + /// le courrier annoncerait l'ancien reste et la QR le nouveau. + pub amount_due: rust_decimal::Decimal, + pub fees: rust_decimal::Decimal, } /// Corps de l'envoi unitaire d'un rappel (Story 21-5b). **PAS de champ `to`** @@ -318,6 +324,15 @@ pub struct SendReminderRequest { pub level_number: i16, pub subject: String, pub body: String, + /// Story 25-4-b2 (#416) — les montants de l'aperçu (`amountDue`, `fees`). Présents, + /// ils sont comparés aux montants recalculés à l'envoi : un écart → + /// `409 REMINDER_AMOUNTS_CHANGED`, rien n'est envoyé. Absents (client d'API qui + /// ne passe pas par l'aperçu), aucune comparaison — le texte est alors de la + /// seule responsabilité de l'appelant. + #[serde(default)] + pub expected_amount_due: Option, + #[serde(default)] + pub expected_fees: Option, } /// Prochain niveau de rappel à envoyer = plus petit `level_number > current_level` @@ -411,7 +426,7 @@ pub async fn preview_reminder_email( let contact = load_active_contact(&state.pool, invoice.contact_id, company.id).await?; let language = resolve_language(&contact, &company); - let (subject, body, _amounts) = render_reminder( + let (subject, body, amounts) = render_reminder( &state, &company, &invoice, @@ -429,6 +444,8 @@ pub async fn preview_reminder_email( level: q.level, subject, body, + amount_due: amounts.amount_due, + fees: amounts.fees, })) } @@ -536,6 +553,7 @@ pub async fn send_reminder( level.fee_amount, ) .await?; + check_amounts_unchanged(&amounts, req.expected_amount_due, req.expected_fees)?; let rendered = invoice_pdf_service::render_document( &state.pool, &state.i18n, @@ -997,6 +1015,24 @@ fn classify_render_error(e: AppError, invoice_id: i64) -> BatchItemError { } } +/// Refuse l'envoi unitaire si les montants ont changé depuis l'aperçu (revue de +/// code 25-4-b2, P1 — HIGH). Le texte envoyé vient de l'aperçu, la QR des montants +/// recalculés : sans cette garde, un règlement arrivé entre les deux faisait +/// annoncer au courrier l'ancien reste et à la QR le nouveau. Comparaison de +/// VALEUR (`Decimal` : 68.1 = 68.1000). Un attendu absent n'est pas comparé. +fn check_amounts_unchanged( + amounts: &invoice_pdf_service::ReminderAmounts, + expected_amount_due: Option, + expected_fees: Option, +) -> Result<(), AppError> { + let changed = expected_amount_due.is_some_and(|e| e != amounts.amount_due) + || expected_fees.is_some_and(|e| e != amounts.fees); + if changed { + return Err(AppError::ReminderAmountsChanged); + } + Ok(()) +} + /// Classe une erreur de [`render_reminder`] pour la boucle du lot (Story 25-4-b2, /// #416). Même règle que [`classify_render_error`] : le refus métier est énuméré, /// le bras final est réservé aux pannes. ⛔ Avant cette story, TOUTE erreur de @@ -1610,6 +1646,29 @@ mod tests { } } + /// Revue de code 25-4-b2, P1 (HIGH) — l'envoi unitaire refuse si les montants + /// ont changé depuis l'aperçu ; la comparaison porte sur la VALEUR, et un + /// attendu absent n'est pas comparé. + #[test] + fn check_amounts_unchanged_compare_des_valeurs() { + let amounts = invoice_pdf_service::ReminderAmounts { + amount_settled: Decimal::new(4000, 2), + amount_due: Decimal::new(6810, 2), + fees: Decimal::new(2000, 2), + }; + let v = |s: &str| Some(s.parse::().unwrap()); + assert!(check_amounts_unchanged(&amounts, v("68.1000"), v("20")).is_ok()); + assert!(check_amounts_unchanged(&amounts, None, None).is_ok()); + assert!(matches!( + check_amounts_unchanged(&amounts, v("108.10"), v("20.00")), + Err(AppError::ReminderAmountsChanged) + )); + assert!(matches!( + check_amounts_unchanged(&amounts, v("68.10"), v("40.00")), + Err(AppError::ReminderAmountsChanged) + )); + } + /// Story 25-4-b2 (AC 9) — ⛔ en lot, le refus du reste nul est un échec MÉTIER /// par facture ; avant la story, toute erreur de `render_reminder` partait en /// `DATABASE_ERROR`. Symétrique de `classify_render_error_ne_deguise_pas_un_refus_en_panne`. diff --git a/crates/kesh-api/src/routes/invoice_pdf_service.rs b/crates/kesh-api/src/routes/invoice_pdf_service.rs index ec8e8f1b..04c75eae 100644 --- a/crates/kesh-api/src/routes/invoice_pdf_service.rs +++ b/crates/kesh-api/src/routes/invoice_pdf_service.rs @@ -123,6 +123,12 @@ pub fn reminder_amount_due(raw: Decimal) -> Result { /// facture à la fois) — jamais réécrit. ⚠️ `amount_due` et `amount_settled` ne /// prennent pas de `company_id` : l'appelant DOIT avoir chargé la facture par /// `find_by_id_with_lines(pool, company.id, …)`, qui porte le scoping. +/// +/// ⛔ Les trois lectures se font dans UNE transaction (revue de code 25-4-b2, P1) : +/// sous REPEATABLE READ, elles voient le même instantané. Lues séparément, un +/// règlement inséré entre deux d'entre elles rendait « déjà réglé » et « reste à +/// payer » incohérents entre eux, et la QR pouvait réclamer un reste d'avant le +/// paiement. pub async fn reminder_amounts( pool: &sqlx::MySqlPool, company_id: i64, @@ -130,11 +136,24 @@ pub async fn reminder_amounts( level_number: i16, level_fee: Decimal, ) -> Result { - let amount_due = reminder_amount_due(invoice_settlements::amount_due(pool, invoice_id).await?)?; - let amount_settled = invoice_settlements::amount_settled(pool, invoice_id).await?; - let other_fees = - invoice_reminders::sum_fees_deduped_excluding(pool, company_id, invoice_id, level_number) - .await?; + let mut tx = pool + .begin() + .await + .map_err(|e| AppError::Internal(format!("begin tx: {e}")))?; + let raw_due = invoice_settlements::amount_due(&mut *tx, invoice_id).await?; + let amount_settled = invoice_settlements::amount_settled(&mut *tx, invoice_id).await?; + let other_fees = invoice_reminders::sum_fees_deduped_excluding( + &mut *tx, + company_id, + invoice_id, + level_number, + ) + .await?; + // Lecture seule : rien à valider, la transaction ne sert qu'à l'instantané. + tx.rollback() + .await + .map_err(|e| AppError::Internal(format!("rollback tx: {e}")))?; + let amount_due = reminder_amount_due(raw_due)?; Ok(ReminderAmounts { amount_settled, amount_due, @@ -918,6 +937,20 @@ mod tests { "{locale:?} : « {note} » dépasse {} caractères", kesh_qrbill::REMINDER_NOTE_MAX_CHARS ); + // Revue de code 25-4-b2, P1 — les libellés COURTS, dans leur colonne de + // 50 mm : la troncature au dessin est une défense, pas une mise en page. + for key in [ + "invoice-pdf-settled", + "invoice-pdf-amount-due", + "invoice-pdf-reminder-fees", + ] { + let label = build_i18n(&bundle, locale).get(key).to_string(); + assert!( + label.chars().count() <= kesh_qrbill::REMINDER_LABEL_MAX_CHARS, + "{locale:?} : « {label} » dépasse {} caractères", + kesh_qrbill::REMINDER_LABEL_MAX_CHARS + ); + } } } } diff --git a/crates/kesh-api/tests/invoice_send_email_e2e.rs b/crates/kesh-api/tests/invoice_send_email_e2e.rs index 24feb511..fce37a43 100644 --- a/crates/kesh-api/tests/invoice_send_email_e2e.rs +++ b/crates/kesh-api/tests/invoice_send_email_e2e.rs @@ -2268,3 +2268,70 @@ async fn reminder_with_nothing_due_is_refused_by_name(pool: MySqlPool) { assert_eq!(mock.sent_emails().len(), 0); assert_eq!(reminder_count(&pool, invoice_id).await, 0); } + +/// Revue de code 25-4-b2, P1 (HIGH) — ⛔ un règlement arrivé entre l'aperçu et +/// l'envoi unitaire : le texte validé annonce l'ancien reste, la QR recalculée le +/// nouveau. L'envoi qui renvoie les montants de l'aperçu est REFUSÉ (409), rien +/// ne part ; un nouvel aperçu permet l'envoi. +#[sqlx::test(migrations = "../kesh-db/test-schema")] +async fn send_reminder_refuses_amounts_changed_since_preview(pool: MySqlPool) { + let mock = MockMailer::new(); + let (admin_id, company_id, invoice_id) = seed_sendable(&pool).await; + seed_dunning(&pool, company_id).await; + let app = spawn_app(pool.clone(), mock.clone(), true, 20).await; + let token = login(&app, "admin", TEST_ADMIN_PASSWORD).await; + let preview = || async { + let v: serde_json::Value = app + .client + .get(app.url(&format!( + "/api/v1/invoices/{invoice_id}/reminder-preview?level=1" + ))) + .bearer_auth(&token) + .send() + .await + .unwrap() + .json() + .await + .unwrap(); + v + }; + let send = |p: serde_json::Value| { + app.client + .post(app.url(&format!("/api/v1/invoices/{invoice_id}/reminders/send"))) + .bearer_auth(&token) + .json(&json!({ + "levelNumber": 1, + "subject": p["subject"], + "body": p["body"], + "expectedAmountDue": p["amountDue"], + "expectedFees": p["fees"], + })) + .send() + }; + + let avant = preview().await; + assert_eq!( + avant["amountDue"] + .as_str() + .unwrap() + .parse::() + .unwrap(), + dec!(108.10), + "l'aperçu dit le reste sur lequel il a rendu le texte : {avant}" + ); + // Un règlement arrive pendant que l'aperçu est ouvert. + settle(&pool, admin_id, company_id, invoice_id, dec!(40.00)).await; + + let refus = send(avant).await.unwrap(); + assert_eq!(refus.status(), 409); + let body: serde_json::Value = refus.json().await.unwrap(); + assert_eq!(body["error"]["code"], "REMINDER_AMOUNTS_CHANGED", "{body}"); + assert_eq!(mock.sent_emails().len(), 0, "rien n'est parti"); + assert_eq!(reminder_count(&pool, invoice_id).await, 0); + + // Un nouvel aperçu : le texte et la QR disent le même reste. + let apres = preview().await; + assert!(apres["body"].as_str().unwrap().contains("68.10"), "{apres}"); + assert_eq!(send(apres).await.unwrap().status(), 201); + assert_eq!(mock.sent_emails().len(), 1); +} diff --git a/crates/kesh-db/src/repositories/invoice_reminders.rs b/crates/kesh-db/src/repositories/invoice_reminders.rs index 1461e006..0d0375ca 100644 --- a/crates/kesh-db/src/repositories/invoice_reminders.rs +++ b/crates/kesh-db/src/repositories/invoice_reminders.rs @@ -66,12 +66,18 @@ pub async fn list_all_by_company( /// ré-émis — D18 — ne compte le frais qu'UNE fois : `MAX(fee_amount)`), en **excluant** /// `exclude_level` (le niveau en cours d'envoi, dont le frais de config est ajouté à part /// par l'appelant — évite le double comptage H2). Pour `{totalDue}` (21-5b). 0 si aucun. -pub async fn sum_fees_deduped_excluding( - pool: &MySqlPool, +/// +/// Générique sur l'exécuteur (Story 25-4-b2) : les montants d'un rappel se lisent +/// dans UNE transaction, avec le reste dû et le réglé, pour voir le même instantané. +pub async fn sum_fees_deduped_excluding<'e, E>( + executor: E, company_id: i64, invoice_id: i64, exclude_level: i16, -) -> Result { +) -> Result +where + E: sqlx::Executor<'e, Database = MySql>, +{ let sum: Option = sqlx::query_scalar( "SELECT SUM(fee) FROM ( \ SELECT level_number, MAX(fee_amount) AS fee FROM invoice_reminders \ @@ -82,7 +88,7 @@ pub async fn sum_fees_deduped_excluding( .bind(company_id) .bind(invoice_id) .bind(exclude_level) - .fetch_one(pool) + .fetch_one(executor) .await .map_err(map_db_error)?; Ok(sum.unwrap_or(rust_decimal::Decimal::ZERO)) diff --git a/crates/kesh-i18n/locales/de-CH/messages.ftl b/crates/kesh-i18n/locales/de-CH/messages.ftl index 20fe04b2..0bb1a195 100644 --- a/crates/kesh-i18n/locales/de-CH/messages.ftl +++ b/crates/kesh-i18n/locales/de-CH/messages.ftl @@ -1513,6 +1513,7 @@ reminders-error-content-too-long = Mahninhalt zu lang reminders-error-not-pdf-ready = Rechnung nicht als PDF druckbar reminders-error-nothing-due = Nichts offen error-reminder-nothing-due = Auf dieser Rechnung ist nichts mehr offen: keine Mahnung zu versenden. +error-reminder-amounts-changed = Der offene Betrag hat sich seit der Vorschau geändert (eine Zahlung ist eingegangen): Öffnen Sie die Vorschau erneut, bevor Sie senden. reminders-error-rate-limited = Sendelimit erreicht reminders-error-database-error = Technischer Fehler reminders-error-smtp-failed = E-Mail-Versand fehlgeschlagen diff --git a/crates/kesh-i18n/locales/en-CH/messages.ftl b/crates/kesh-i18n/locales/en-CH/messages.ftl index 0a27de13..eb833fb7 100644 --- a/crates/kesh-i18n/locales/en-CH/messages.ftl +++ b/crates/kesh-i18n/locales/en-CH/messages.ftl @@ -1518,6 +1518,7 @@ reminders-error-content-too-long = Reminder content too long reminders-error-not-pdf-ready = Invoice not printable as PDF reminders-error-nothing-due = Nothing due error-reminder-nothing-due = Nothing is left to claim on this invoice: no reminder to send. +error-reminder-amounts-changed = The amount due has changed since the preview (a payment came in): reopen the preview before sending. reminders-error-rate-limited = Send limit reached reminders-error-database-error = Technical error reminders-error-smtp-failed = E-mail sending failed diff --git a/crates/kesh-i18n/locales/fr-CH/messages.ftl b/crates/kesh-i18n/locales/fr-CH/messages.ftl index 6a842246..425c0dd8 100644 --- a/crates/kesh-i18n/locales/fr-CH/messages.ftl +++ b/crates/kesh-i18n/locales/fr-CH/messages.ftl @@ -1610,6 +1610,7 @@ reminders-error-content-too-long = Contenu du rappel trop long reminders-error-not-pdf-ready = Facture non imprimable en PDF reminders-error-nothing-due = Rien à réclamer error-reminder-nothing-due = Il ne reste rien à réclamer sur cette facture : aucun rappel à envoyer. +error-reminder-amounts-changed = Le montant dû a changé depuis l'aperçu (un règlement est arrivé) : rouvrez l'aperçu avant d'envoyer. reminders-error-rate-limited = Limite d'envoi atteinte reminders-error-database-error = Erreur technique reminders-error-smtp-failed = Échec de l'envoi e-mail diff --git a/crates/kesh-i18n/locales/it-CH/messages.ftl b/crates/kesh-i18n/locales/it-CH/messages.ftl index c6716cf1..25711aad 100644 --- a/crates/kesh-i18n/locales/it-CH/messages.ftl +++ b/crates/kesh-i18n/locales/it-CH/messages.ftl @@ -1511,6 +1511,7 @@ reminders-error-content-too-long = Contenuto del sollecito troppo lungo reminders-error-not-pdf-ready = Fattura non stampabile in PDF reminders-error-nothing-due = Nulla da esigere error-reminder-nothing-due = Su questa fattura non resta nulla da esigere: nessun sollecito da inviare. +error-reminder-amounts-changed = L'importo dovuto è cambiato dall'anteprima (è arrivato un pagamento): riaprire l'anteprima prima di inviare. reminders-error-rate-limited = Limite di invio raggiunto reminders-error-database-error = Errore tecnico reminders-error-smtp-failed = Invio e-mail non riuscito diff --git a/crates/kesh-i18n/src/loader.rs b/crates/kesh-i18n/src/loader.rs index 83c48f8b..1b81a7b5 100644 --- a/crates/kesh-i18n/src/loader.rs +++ b/crates/kesh-i18n/src/loader.rs @@ -289,6 +289,7 @@ mod tests { "invoice-pdf-reminder-fees", "invoice-pdf-reminder-fees-note", "error-reminder-nothing-due", + "error-reminder-amounts-changed", "reminders-error-nothing-due", ] { let fr = bundle.format(&Locale::FrCh, key, None); diff --git a/crates/kesh-qrbill/src/lib.rs b/crates/kesh-qrbill/src/lib.rs index 48fd5e21..3218c44c 100644 --- a/crates/kesh-qrbill/src/lib.rs +++ b/crates/kesh-qrbill/src/lib.rs @@ -18,8 +18,8 @@ pub mod validation; pub use generator::build_payload; pub use parser::{ScannedAddress, ScannedQrBill, ScannedReference, parse_spc_payload}; pub use pdf::{ - REMINDER_NOTE_MAX_CHARS, generate_credit_note_pdf, generate_credit_note_pdf_with_date, - generate_qr_bill_pdf, generate_qr_bill_pdf_with_date, + REMINDER_LABEL_MAX_CHARS, REMINDER_NOTE_MAX_CHARS, generate_credit_note_pdf, + generate_credit_note_pdf_with_date, generate_qr_bill_pdf, generate_qr_bill_pdf_with_date, }; pub use types::{ Address, AddressType, Currency, InvoiceLinePdf, InvoicePdfData, InvoiceVatLinePdf, QrBillData, diff --git a/crates/kesh-qrbill/src/pdf.rs b/crates/kesh-qrbill/src/pdf.rs index c046437e..c1fbc429 100644 --- a/crates/kesh-qrbill/src/pdf.rs +++ b/crates/kesh-qrbill/src/pdf.rs @@ -716,7 +716,7 @@ fn draw_invoice_section( let label = if line.full_width { truncate_display(&line.label, REMINDER_NOTE_MAX_CHARS) } else { - line.label + truncate_display(&line.label, REMINDER_LABEL_MAX_CHARS) }; layer.use_text(label, 9.0, Mm(x), Mm(ty), font); if let Some(amount) = line.amount { @@ -1151,6 +1151,12 @@ const REMINDER_LINE_STEP: f32 = 4.5; /// une traduction plus longue déborderait à droite sans que rien ne rougisse. pub const REMINDER_NOTE_MAX_CHARS: usize = 78; +/// Longueur maximale des **libellés courts** du bloc de rappel (déjà réglé, reste +/// à payer, frais de rappel), dessinés dans la colonne des libellés : 50 mm de +/// `col_unit` à `col_tot`, soit 23 caractères au calibrage d'[`IDENTITY_MAX_CHARS`]. +/// Au-delà, le libellé chevaucherait le montant (revue de code 25-4-b2, P1). +pub const REMINDER_LABEL_MAX_CHARS: usize = 23; + /// Une ligne du bloc de rappel, **construite** avant d'être dessinée — c'est ce /// qui rend son contenu testable (le texte d'un PDF est hex-encodé dans les /// opérateurs `Tj` et ne se compare pas). diff --git a/docs/manual/fr/user-manual.pdf b/docs/manual/fr/user-manual.pdf index 4456f16cdaafe0d42102ac69b29738e7993d6525..bb5b4dd8fbcc32fb8846c9d50fdcf965a447039d 100644 GIT binary patch delta 128549 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

{6SlwA)l!z6=) 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 delta 128209 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

o*66* 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 ejP|8)90R+kq)0 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 GVE-4372t;e diff --git a/docs/manual/fr/user-manual.tex b/docs/manual/fr/user-manual.tex index e78d7438..eaee416f 100644 --- a/docs/manual/fr/user-manual.tex +++ b/docs/manual/fr/user-manual.tex @@ -1008,7 +1008,7 @@ \subsection{Relancer les débiteurs}\label{sec:relances-user} \item Une \textbf{protection anti-double-envoi} empêche qu'un double-clic n'envoie deux fois le même rappel. Une facture arrivée au \textbf{dernier niveau} reste affichée avec le badge « Dernier niveau atteint » (poursuite à envisager) — elle ne disparaît jamais silencieusement. \end{itemize} -\paragraph{Ce que réclame un rappel.} Un rappel réclame ce que le client \textbf{doit encore} : le \textbf{reste dû} de la facture, après ses règlements partiels --- le montant total s'il n'a rien payé. Le courrier annonce ce reste, augmenté des frais de rappel s'il y en a ; à frais nuls, il ne parle pas de frais. Le PDF joint n'est pas la facture réémise, c'est un \textbf{rappel} : il en porte le titre, rappelle le numéro de la facture d'origine et, sous le total, ce qui est \textbf{déjà réglé} puis le \textbf{reste à payer} (ces deux lignes n'apparaissent qu'après un règlement). Sa \textbf{QR-facture porte le reste dû}, avec la même référence que la facture, ce qui permet au rapprochement bancaire de reconnaître le paiement. Les \textbf{frais de rappel n'y sont jamais inclus} : ils figurent sur une ligne à part, avec la mention qu'ils ne sont pas compris dans le bulletin de versement. +\paragraph{Ce que réclame un rappel.} Un rappel réclame ce que le client \textbf{doit encore} : le \textbf{reste dû} de la facture, après ses règlements partiels --- le montant total s'il n'a rien payé. Le courrier annonce ce reste, augmenté des frais de rappel s'il y en a ; à frais nuls, il ne parle pas de frais. Si un règlement est enregistré \textbf{entre l'ouverture de l'aperçu et l'envoi}, l'envoi est \textbf{refusé} : le courrier validé annoncerait un autre montant que la QR-facture jointe. Fermez puis rouvrez l'aperçu, qui reprend le nouveau reste. Le PDF joint n'est pas la facture réémise, c'est un \textbf{rappel} : il en porte le titre, rappelle le numéro de la facture d'origine et, sous le total, ce qui est \textbf{déjà réglé} puis le \textbf{reste à payer} (ces deux lignes n'apparaissent qu'après un règlement). Sa \textbf{QR-facture porte le reste dû}, avec la même référence que la facture, ce qui permet au rapprochement bancaire de reconnaître le paiement. Les \textbf{frais de rappel n'y sont jamais inclus} : ils figurent sur une ligne à part, avec la mention qu'ils ne sont pas compris dans le bulletin de versement. \begin{keshwarning} Les frais de rappel ne sont \textbf{pas comptabilisés} par Kesh. Un client qui paie le montant du courrier (reste dû \emph{et} frais) verra son versement \textbf{refusé comme trop-perçu} au rapprochement comme au règlement manuel ; seul le montant de la QR-facture s'enregistre (issue \#401). diff --git a/frontend/src/lib/features/reminders/reminders.types.ts b/frontend/src/lib/features/reminders/reminders.types.ts index 1539d859..4651b622 100644 --- a/frontend/src/lib/features/reminders/reminders.types.ts +++ b/frontend/src/lib/features/reminders/reminders.types.ts @@ -47,6 +47,13 @@ export interface ReminderPreviewResponse { level: number; subject: string; body: string; + /** + * Story 25-4-b2 (#416) — reste dû (arrondi) et frais cumulés sur lesquels le + * texte a été rendu (décimales string). À renvoyer à l'envoi : le serveur refuse + * (409 `REMINDER_AMOUNTS_CHANGED`) s'ils ont changé entre-temps. + */ + amountDue: string; + fees: string; } // --- Envoi unitaire (POST /api/v1/invoices/{id}/reminders/send) --- @@ -56,6 +63,9 @@ export interface SendReminderRequest { levelNumber: number; subject: string; body: string; + /** Montants de l'aperçu (Story 25-4-b2) — cf. `ReminderPreviewResponse`. */ + expectedAmountDue?: string; + expectedFees?: string; } /** Un rappel enregistré (réponse d'envoi unitaire / manuel, 201). */ diff --git a/frontend/src/routes/(app)/invoices/reminders/+page.svelte b/frontend/src/routes/(app)/invoices/reminders/+page.svelte index ac2735b2..7dc3f181 100644 --- a/frontend/src/routes/(app)/invoices/reminders/+page.svelte +++ b/frontend/src/routes/(app)/invoices/reminders/+page.svelte @@ -196,7 +196,17 @@ sendingUnit = true; // (C) sendError = ''; try { - await sendReminder(sendTarget.invoiceId, { levelNumber, subject, body }); + // Story 25-4-b2 (#416) : les montants de l'aperçu repartent avec le texte — + // si un règlement est arrivé entre-temps, le serveur refuse (409 + // REMINDER_AMOUNTS_CHANGED) plutôt que d'envoyer un courrier dont le + // montant ne serait plus celui de la QR jointe. + await sendReminder(sendTarget.invoiceId, { + levelNumber, + subject, + body, + expectedAmountDue: sendPreview?.amountDue, + expectedFees: sendPreview?.fees, + }); notifySuccess(i18nMsg('reminders-send-success', 'Rappel envoyé')); sendOpen = false; await load(); From f05285a04062e6af58272384604bd33b0ddca5b4 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sun, 27 Sep 2026 23:50:23 +0200 Subject: [PATCH 51/51] docs(25-4-b2): revue close en 2 passes, gates verts, story done (refs #416) Co-Authored-By: Claude Opus 5.5 --- .../25-4-b2-residuel-aux-rappels.md | 20 ++++++++++++++++++- .../sprint-status.yaml | 2 +- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md b/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md index 39f692ef..8a69584b 100644 --- a/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md +++ b/_bmad-output/implementation-artifacts/25-4-b2-residuel-aux-rappels.md @@ -1,6 +1,6 @@ # Story 25.4-b2 : Le résiduel aux rappels — le rappel réclame le reste dû -Status: review +Status: done **Issue : [#416]** — cette story en livre la partie **rappels** ; la partie agrégats est la 25-4-b1 (PR #475). ⛔ **La PR de b2 porte `closes #416`**, titre ET corps (§ *Issue Tracking Rule*). @@ -226,6 +226,17 @@ Sonnet, sur `46081964..7b20d687`. Brut : 4 + 3 + 0 ; après dédoublonnage et tr - [x] [Review][Patch] **LOW — les libellés courts du bloc (déjà réglé, reste à payer, frais de rappel) ne sont bornés ni testés en largeur** [crates/kesh-qrbill/src/pdf.rs] — seule la mention pleine largeur l'est ; la colonne n'a que ~23 caractères. Edge Case Hunter. - [x] [Review][Defer] **près du seuil de capacité, `payment_terms` se clampe sur le bas du bloc** [crates/kesh-qrbill/src/pdf.rs:728-736] — deferred, pre-existing : `payment_terms` n'est pas réservé et se clampe à `content_floor + 5` ; avant la story il pouvait déjà chevaucher la ligne du total au seuil, le bloc de rappel reproduit la même géométrie sans l'aggraver. Le réserver changerait la capacité des factures. +*Passe 2 (2026-09-27) — Haiku ×3, protocole complet (la passe 1 touchait plusieurs modules), diff aplati +`46081964..75417026`. Brut : 6 + 0 + 0 ; après vérification : **0 au-dessus de LOW**.* Écartés : décimaux +en chaîne JSON (comparaison de valeur, testée) ; double arrondi (idempotent, défense documentée) ; +attendus absents acceptés (voulu : clients d'API, documenté) ; transaction de lecture annulée +(usage correct pour un instantané) ; commentaires français des `.ftl` (convention du dépôt) ; sens de +`{reminderFee}` (documenté dans les deux manuels). ⚠️ L'Edge Case Hunter rendait 0 finding avec deux +affirmations inexactes (décimaux « en nombres », classement de `ReminderAmountsChanged` en lot, qui +n'y survient pas) ; l'axe du **changement de niveau dans le dialogue** repris par l'orchestrateur : +`refetchPreview` remplace `sendPreview`, relu par `confirmSend`, et le dialogue ré-hydrate son texte +depuis ce même aperçu (`ReminderSendDialog.svelte:60-65`) — cohérent. + Écartés : montant imprimé sur le bulletin (Blind F3) — il vient de `data.amount`, le montant de la QR (`pdf.rs:819-822`, `:947-950`) ; borne en caractères d'une police proportionnelle (Blind F4) — limite documentée, même méthode qu'`IDENTITY_MAX_CHARS`. L'Acceptance Auditor : 0 finding, recomptes @@ -369,6 +380,13 @@ Claude Opus 5.5 (`claude-opus-5-5`). ## Change Log +- **2026-09-27** — **Revue de code CLOSE en 2 passes, story `done`.** Tendance : passe 1 `1H/1M/1L` + (Sonnet ×3 ; HIGH tranché par Guy) → passe 2 **0 au-dessus de LOW** (Haiku ×3, protocole complet ; 6 + points écartés à la vérification, un axe repris par l'orchestrateur). Gates au dernier commit de + code : backend **2510 / 2510**, frontend **835 / 835** ; E2E complet sur `kesh_e2e` reconstruite + **223 / 11 / 19** — les 7 KF-029, `product-revenue-account:133` (pollution répertoriée) et trois + **verts rejoués seuls** : `reminders.spec.ts:84` (le test de la story — tombé sur le symptôme + **KF-053, #478**, `#username` introuvable), `invoices.spec.ts:415` et `:536`. Conforme. - **2026-09-27** — **Revue de code, passe 1** (Sonnet ×3, `46081964..7b20d687`) — **1 HIGH (décision), 1 MEDIUM, 1 LOW** corrigés, 1 différé, 2 écartés (§ *Review Findings*) : - HIGH, tranché par Guy : l'aperçu rend `amountDue` et `fees` ; l'envoi unitaire les renvoie diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index a9cb3acf..3d6be1dd 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -357,7 +357,7 @@ development_status: 25-3-annuler-reglement-et-rapprochement: split # [#414] [#418] — **l'Epic 24 a livre l'encaissement et le rapprochement ; il n'a PAS livre le moyen de les DEFAIRE.** Une erreur d'imputation est aujourd'hui incorrigible autrement qu'a la main — et le gel de la 24-4b interdit precisement la main. ⚠️ *C'est le prix d'une story qui ferme une porte sans ouvrir la suivante : le gel est juste, et il rend cette story-ci necessaire.* 25-4-a-residuel-juste: done # 2026-09-27 REVUE CLOSE EN 1 PASSE ; PR #472 OUVERTE (closes #455 #456), attend « merge ». # IMPLEMENTEE — 7/7 mutations tuees ; gates 2484/2484, 826/826, E2E 222/10/19 sans regression ; prochaine etape : code review. # 2026-09-26 [#455] [#456] — l'avoir soustrait HT d'un TTC (masque a l'ecran, mais rendu par GET /invoices/{id} aux cles API : amountDue = la TVA sur une facture creditee) ; un avoir accepte sur une facture partiellement reglee rend la creance creditrice. CREEE ; validation : P1 Sonnet 1H/3M/1L -> P2 Haiku 1M retenu -> P3 ciblee Opus 2M/5L -> P4 ciblee Sonnet 0 > LOW (1M reclasse LOW) : VALIDEE en 4 passes. Arbitrage 2026-09-27 : refus maintenu, levee tracee par #471. 25-4-b1-residuel-aux-agregats: done # 2026-09-27 revue CLOSE en 2 passes (2M/1L -> 0 >LOW), gates complets verts (2494, 834, E2E 225/8). # [#416, refs] balance agee + echeancier (totaux, colonne reste du, CSV, statut partiel, dialogue pre-rempli) + invariant balance agee = grand livre. CREEE ; validation P1 Sonnet 2M/3L -> P2 Haiku 0 (repris : 1M) -> P3 ciblee Opus 3M/3L : portee de l'invariant REECRITE PAR UNE REGLE ; issues #473 #474 ouvertes -> P4 1M -> P5 0 : VALIDEE en 5 passes. Signal MED->MED : pas de decoupage (Guy, 2026-09-27). Branche EMPILEE sur 25-4-a. - 25-4-b2-residuel-aux-rappels: review # 2026-09-27 DEV FAIT, gates verts (2508, 835, E2E conforme ; KF-053 #478 ouverte) ; revue de code a lancer. # 2026-09-27 CREEE : frais non comptabilises => QR = reste du SANS frais (regle existante, admin-manual:1200) ; PDF de rappel = variante titree ; Q1 ligne "Frais de rappel", Q2 deja regle masque a zero, M5 papier hors perimetre (#477) ; validation CLOSE en 5 passes (1H/3M -> 0+1M -> 5M -> 1M -> 0 >LOW), pas de decoupage (Guy). # [#416, closes] le rappel reclame le reste du (texte, QR, PDF montant initial / deja regle / reste), frais configurables masques a zero ; point ouvert : frais non comptabilises. + 25-4-b2-residuel-aux-rappels: done # 2026-09-27 revue CLOSE en 2 passes (1H/1M/1L -> 0 >LOW), gates verts (2510, 835, E2E conforme). PR a ouvrir : closes #416. # 2026-09-27 CREEE : frais non comptabilises => QR = reste du SANS frais (regle existante, admin-manual:1200) ; PDF de rappel = variante titree ; Q1 ligne "Frais de rappel", Q2 deja regle masque a zero, M5 papier hors perimetre (#477) ; validation CLOSE en 5 passes (1H/3M -> 0+1M -> 5M -> 1M -> 0 >LOW), pas de decoupage (Guy). # [#416, closes] le rappel reclame le reste du (texte, QR, PDF montant initial / deja regle / reste), frais configurables masques a zero ; point ouvert : frais non comptabilises. 25-4-b-residuel-aux-agregats: split # 2026-09-27 DECOUPEE en b1 (agregats) / b2 (rappels) — six modules apres les arbitrages Q1. # [#416] + montant des RELANCES (TTC complet, trouve a l'inventaire) — Q1 TRANCHEE 2026-09-27 : la QR du rappel porte le RESTE DU (= TTC sans reglement), reste a payer sur le PDF et dans le texte ; point ouvert : frais de rappel non comptabilises vs trop-percu. 25-4-c-residuel-au-rapprochement: backlog # [#420] — DEUX sites : filtre SQL des candidats (HAVING total_ttc) avant le score, puis score et re-score a l'acceptation. 25-4-d-solder-le-reste: backlog # [#384] ramenee de la 25-6 le 2026-09-27 (Guy) — perte sur debiteur, escompte, frais : clore une facture partiellement reglee ; la part TVA reduit la TVA due.