From fbdf6617c84a8b3277ce95a215e3d7ed0f80f5be Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sat, 3 Oct 2026 15:58:23 +0200 Subject: [PATCH 01/20] =?UTF-8?q?docs(25-6-a):=20d=C3=A9coupage=20de=20la?= =?UTF-8?q?=2025-6=20et=20fiche=20du=20tableau=20de=20bord=20(refs=20#388,?= =?UTF-8?q?=20refs=20#389)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-6-a-tableau-de-bord.md | 152 ++++++++++++++++++ .../sprint-status.yaml | 4 +- 2 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 _bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md diff --git a/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md b/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md new file mode 100644 index 00000000..811686b2 --- /dev/null +++ b/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md @@ -0,0 +1,152 @@ +# Story 25.6-a : Le tableau de bord dit vrai — dernières écritures, factures ouvertes, solde comptable + +Status: ready-for-dev + +**Issues : [#388], [#389]**, que cette story **ferme** : la PR porte `closes #388, closes #389` dans le **titre ET le +corps**. Branche `story/25-6-a-tableau-de-bord`, partie de `main` (`d7c74f02`). + +⛔ **Issue du DÉCOUPAGE de la 25-6** (2026-10-03, recommandation non contestée de Guy) : la 25-6 réunissait trois issues +isolées. #388 et #389 portent sur la page d'accueil ; **#387** (figer le PDF d'une facture) touche stockage, migration +et rendu — elle part en **25-6-b**. Ensemble, elles dépassaient le seuil de cinq modules de la § *Règle de splitting +préventif*. + +## Story + +En tant que **personne qui ouvre Kesh**, +je veux que **la page d'accueil montre ce que contiennent réellement mes livres** — mes dernières écritures, mes factures +ouvertes et leur montant, et un solde bancaire nommé pour ce qu'il est, +afin de **ne pas lire « Aucune écriture » sur une comptabilité pleine**, ni prendre un solde comptable pour l'argent en +banque. + +## Les faits, vérifiés dans le code + +- **La tuile « Dernières écritures » n'appelle rien** (`frontend/src/routes/(app)/+page.svelte:82-98`) : elle affiche + inconditionnellement `homepage-entries-empty` (« Aucune écriture. ») ou sa variante guidée. Le endpoint existe : + `GET /api/v1/journal-entries` (`crates/kesh-api/src/routes/journal_entries.rs:240-405`), **tout rôle authentifié** + (`lib.rs:710-715`, `authenticated_routes`), tri par défaut `entry_date` **décroissant** (`kesh-core/src/listing/mod.rs`), + `limit` borné à 500. Client frontend : `features/journal-entries/journal-entries.api.ts:27`. +- **La tuile « Factures ouvertes » n'affiche aucun montant** (`+page.svelte:100-128`) : seulement « N facture(s) à + rappeler », **pour Admin/Comptable**, depuis `/dunning/reminders` (Comptable+) — un rôle Consultation voit « Aucune + facture ouverte » en permanence. Le résumé existe : `GET /api/v1/invoices/due-dates` (`lib.rs:751`, **tout rôle**) rend + `DueDatesSummary { unpaidCount, unpaidTotal, overdueCount, overdueTotal }` (`kesh-db/src/repositories/invoices.rs:870-905`) + — des **restes dus** depuis la 25-4-b1 (#416), factures `validated` non soldées. Client : `invoices.api.ts:118`. +- **Le « solde bancaire » est le solde comptable** : `bank_accounts::list_by_company_with_balances` + (`kesh-db/src/repositories/bank_accounts.rs:620-690`) rend `SUM(debit) − SUM(credit)` du compte de grand livre lié, + toutes dates. L'accueil l'affiche sous « Comptes bancaires » et le totalise en « **Total liquidités** » + (`+page.svelte:130-185`) — rien ne dit qu'il s'agit du solde **comptable**. +- **Le solde du relevé est déjà stocké** : `bank_imports.closing_balance DECIMAL(18,2) NULL` et `period_to DATE` (une + ligne par import, `idx_bank_imports_company_account_imported`) — jamais lu par l'accueil. +- ⚠️ **Montants en `Number`** : `bank-accounts.api.ts:55-69` convertit `currentBalance` (chaîne décimale du serveur) en + `Number`, et l'accueil somme ces nombres (`+page.svelte:62-65`). Contraire à la règle du dépôt (`big.js` pour tout + montant). Second consommateur : `routes/(app)/bank-accounts/+page.svelte:397`. +- **E2E existants de l'accueil** : `homepage-reminders.spec.ts`, `homepage-settings.spec.ts`. +- **Manuel** : `docs/manual/fr/user-manual.tex:215-235` (§ *Tableau de bord*) — « Dernières écritures — accès rapide au + journal », « Comptes bancaires — soldes calculés » : à réécrire. + +## Acceptance Criteria + +**AC 1 — Dernières écritures, branchées.** La tuile appelle `GET /api/v1/journal-entries?limit=5` (tri par défaut : +date décroissante) et liste au plus **cinq** écritures : date, numéro, libellé, montant (somme des débits de +l'écriture, en `big.js`). Chaque ligne mène à l'écriture (`/journal-entries/{id}`). Sans écriture, le texte vide actuel +(et sa variante guidée) reste. Échec de l'appel : la tuile le dit (« indisponible ») au lieu de prétendre qu'il n'y a +rien. Le bouton « Saisir une écriture » n'apparaît que pour Admin/Comptable (Consultation ne saisit pas). + +**AC 2 — Factures ouvertes, chiffrées, pour tous les rôles.** La tuile appelle `GET /api/v1/invoices/due-dates` (sans +filtre) et affiche **N factures ouvertes — reste dû total** et, s'il y en a, **dont M échues — montant**. Les montants +passent par `big.js` et le formatage suisse du dépôt. Le compteur « à rappeler » (Admin/Comptable) reste. Le bouton +« Créer une facture » n'apparaît que pour Admin/Comptable. Sans facture ouverte, le texte vide actuel reste ; échec de +l'appel : « indisponible ». + +**AC 3 — Le solde est nommé « solde comptable ».** Dans la tuile « Comptes bancaires », chaque solde est libellé +**« Solde comptable »** et le total **« Total (solde comptable) »** au lieu de « Total liquidités ». Le libellé d'aide dit +d'où vient le chiffre : le grand livre, non la banque. + +**AC 4 — Le solde du dernier relevé, et l'écart.** `GET /api/v1/bank-accounts` gagne, par compte, le **dernier relevé +importé** qui porte un solde de clôture : `statementClosingBalance` (`Decimal` | `null`), `statementDate` (`period_to`) et +`ledgerBalanceAtStatement` (le solde comptable du compte lié **au `period_to` inclus**). L'accueil affiche, quand un relevé +existe : « Relevé du {date} : {montant} » et, si `ledgerBalanceAtStatement ≠ statementClosingBalance`, **« Écart : +{différence} »** (solde comptable à cette date − relevé), mis en évidence. Sans relevé, rien de plus. Les champs neufs +sont `null` quand le compte n'a pas de compte de grand livre lié (le solde comptable ne se calcule pas) ou aucun relevé +avec solde. « Dernier » = `period_to` le plus récent, départagé par `imported_at` puis `id`. + +**AC 5 — Les montants ne passent plus par `Number`.** `currentBalance` et les trois champs neufs restent des **chaînes +décimales** côté frontend (`BankAccountSummary`), le total et l'écart se calculent en `big.js`, l'affichage par le +formateur existant (adapté à une chaîne si nécessaire). Les deux consommateurs (accueil, page des comptes bancaires) +sont mis à jour. + +**AC 6 — L'API et la doc.** Les champs neufs dans la réponse de `GET /api/v1/bank-accounts` (et des routes qui rendent +le même DTO, s'il y en a — à inventorier), documentés au DTO. Le calcul du solde comptable à une date partage la +requête existante (pas de seconde copie du `SUM(debit) − SUM(credit)`). + +**AC 7 — Tests.** Chacun aurait échoué avant le patch : +- `kesh-db` : relevé le plus récent choisi (deux imports, `period_to` différents ; égalité départagée) ; relevé sans + `closing_balance` ignoré ; solde comptable **à la date du relevé** (une écriture postérieure n'y entre pas, une écriture + du jour même y entre) ; compte sans grand livre lié → `null` ; isolation par société ; +- `kesh-api` : forme de la réponse (`statementClosingBalance`, `statementDate`, `ledgerBalanceAtStatement` en chaînes) ; +- Vitest de l'accueil (`+page.svelte` ou composants extraits) : dernières écritures listées / vide / échec ; factures + ouvertes chiffrées pour un rôle **Consultation** ; « dont M échues » absent à zéro ; « Solde comptable » et le total + renommé ; écart affiché seulement s'il est non nul ; boutons d'action absents pour Consultation ; total calculé en + `big.js` (cas `0.1 + 0.2`) ; +- **E2E** : une écriture postée par l'API apparaît dans la tuile ; une facture validée apparaît dans « Factures + ouvertes » avec son montant (sélecteurs `data-testid`, jamais un libellé traduit — garde `e2e-selecteurs-traduits`). + +**AC 8 — Le manuel et le CHANGELOG.** `user-manual.tex` § *Tableau de bord* réécrit : les trois tuiles telles qu'elles +sont, le solde **comptable** expliqué (le grand livre, pas la banque ; il ne reflète un encaissement qu'une fois +celui-ci comptabilisé), le dernier relevé et l'écart, et ce que voit un rôle Consultation. PDF régénéré, contrôlé +**aplati**. CHANGELOG `[0.12.1]` : `Fixed` (#388, #389), `Changed` (« Total liquidités » → « Total (solde comptable) »). +README et site relus (`grep -rni "tableau de bord\|liquidit" README.md website/`). + +## Tasks / Subtasks + +- [ ] **T1 — le dernier relevé et le solde à sa date** (AC 4, 6), `kesh-db` `bank_accounts.rs`. +- [ ] **T2 — le DTO** (AC 4, 6), `kesh-api` `routes/bank_accounts.rs`. +- [ ] **T3 — les montants en chaînes** (AC 5), `bank-accounts.api.ts`, page des comptes bancaires. +- [ ] **T4 — l'accueil** (AC 1, 2, 3, 4) et l'i18n (4 locales, `sitesTotal`, relevé des libellés en dur). +- [ ] **T5 — tests** (AC 7). +- [ ] **T6 — manuel, CHANGELOG** (AC 8). +- [ ] **T7 — gates** : backend complet, frontend complet, **E2E complet**. + +## Dev Notes + +### Ce qu'il ne faut pas faire + +- **Ne pas** présenter le solde du relevé comme « le solde bancaire actuel » : c'est le solde **au `period_to`** du + dernier relevé importé, daté à l'écran. +- **Ne pas** créer d'endpoint « tableau de bord » agrégé : les trois endpoints existent, sont ouverts à tout rôle, et un + agrégat recopierait leurs règles (DRY). +- **Ne pas** recopier le calcul du reste dû : `due-dates` le porte déjà (25-4-b1). +- **Ne pas** afficher « Aucune … » quand l'appel a échoué — c'est le défaut même de #388. + +### Limites assumées + +- Le solde comptable ne reflète un encaissement qu'une fois celui-ci **comptabilisé** (rapprochement ou règlement) : c'est + précisément ce que l'écart avec le relevé rend visible. +- Le relevé ne vaut que pour sa date : entre deux imports, l'écart n'est pas recalculé contre la banque réelle. + +### Modules + +`kesh-db` (dernier relevé, solde à une date), `kesh-api` (DTO), `frontend` (accueil, API des comptes bancaires, page des +comptes), `kesh-i18n` (+ `docs`, `CHANGELOG`) — **quatre modules de code**, sous le seuil. + +### References + +- Issues [#388], [#389] ; audit du 2026-08-26 (DAF § 1.4). +- `frontend/src/routes/(app)/+page.svelte` ; `crates/kesh-db/src/repositories/bank_accounts.rs:620-690` ; + `crates/kesh-db/src/repositories/invoices.rs:870-905` (`DueDatesSummary`). + +## Dev Agent Record + +### Agent Model Used + +### Debug Log References + +### Completion Notes List + +### File List + +## Change Log + +- **2026-10-03** — Créée (Guy : « ok, merge et continue » ; découpage 25-6-a / 25-6-b non contesté). + +[#388]: https://github.com/guycorbaz/kesh/issues/388 +[#389]: https://github.com/guycorbaz/kesh/issues/389 diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index 7f684779..b6c284c9 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -370,7 +370,9 @@ development_status: 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: done # 2026-10-03 CREEE, validee (3 passes), implementee, revue close en 2 passes (P1 1 MED -> P2 0) (partie de main). ouverture + mouvements + cloture, ligne calculee du resultat reporte, closes #385. [#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] [#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*. + 25-6-tableau-de-bord-et-dettes: split # 2026-10-03 DECOUPEE en 25-6-a (#388 #389) et 25-6-b (#387). [#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*. + 25-6-a-tableau-de-bord: ready-for-dev # 2026-10-03 CREEE (partie de main). [#388] [#389] — dernieres ecritures branchees, factures ouvertes chiffrees (tout role), solde COMPTABLE nomme + dernier releve et ecart ; closes #388 #389. + 25-6-b-pdf-facture-archive: backlog # [#387] — figer le PDF de la facture a la validation (patron des justificatifs entrants : SHA-256, ON DELETE RESTRICT). 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. From 06c9a685f597dd86777d22c585a5a1bb60bdd710 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sat, 3 Oct 2026 15:58:49 +0200 Subject: [PATCH 02/20] docs(25-6-a): prompt de validation P1 (refs #388, refs #389) Co-Authored-By: Claude Opus 5.5 --- .../25-6-a-validate-prompt-p1.md | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 _bmad-output/implementation-artifacts/25-6-a-validate-prompt-p1.md diff --git a/_bmad-output/implementation-artifacts/25-6-a-validate-prompt-p1.md b/_bmad-output/implementation-artifacts/25-6-a-validate-prompt-p1.md new file mode 100644 index 00000000..b2755362 --- /dev/null +++ b/_bmad-output/implementation-artifacts/25-6-a-validate-prompt-p1.md @@ -0,0 +1,44 @@ +# Prompt — validation P1, Story 25-6-a (le tableau de bord dit vrai) + +*Versionné le 2026-10-03. Trois lentilles (Sonnet), contexte frais chacune.* + +Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-6-a-tableau-de-bord`. **Fiche :** +`_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md` (commit `fbdf6617`). Issues : `gh issue view 388`, +`gh issue view 389`. Règles : `CLAUDE.md`. La fiche décrit du travail **à faire** : un finding qui reproche au code de ne +pas encore le porter sera rejeté. + +## Lentilles + +- **A — Justesse métier et RBAC.** Ce que la tuile montre est-il vrai pour chaque rôle (Admin, Comptable, Consultation) + et pour une clé API ? Les trois endpoints sont-ils réellement ouverts à Consultation (lis `crates/kesh-api/src/lib.rs`, + blocs `authenticated_routes` / `comptable_routes`) ? `due-dates` rend-il bien des **restes dus** de factures validées non + soldées — et qu'en est-il d'une facture **soldée** (25-4-d, write-off) ou d'un avoir ? L'**écart** relevé / comptable + (AC 4) est-il juste — même date, même signe (compte d'actif : débit − crédit), relevé en `DECIMAL(18,2)` contre un + solde à 4 décimales ? Un compte bancaire **archivé** ? Plusieurs comptes bancaires liés au **même** compte de grand + livre (le total les compterait deux fois) ? +- **B — Faisabilité dans le code.** Chaque référence `fichier:ligne` existe-t-elle et dit-elle ce que la fiche affirme + (`grep -nF`, `sed -n`) ? Le DTO `BankAccountWithBalance` est-il rendu par d'autres routes que `GET /api/v1/bank-accounts` + (inventaire : `grep -rn "BankAccountWithBalance\|list_by_company_with_balances" crates`) ? « Le calcul du solde comptable + à une date partage la requête existante » (AC 6) est-il réalisable sans changer le résultat actuel ? `formatChfBalance` + accepte-t-il une chaîne ? Où vit `i18nMsg` pour l'accueil (`features/onboarding`) et la garde `lint-i18n-ownership` + accepte-t-elle des clés neuves `homepage-*` depuis `routes/(app)/+page.svelte` ? Le périmètre (quatre modules) est-il + exact ? +- **C — Complétude et tests.** Chaque AC est-il testable, et le test prévu aurait-il échoué avant le patch ? Cas + manquants : un relevé dont `period_to` est **postérieur** au solde comptable courant ; deux comptes bancaires ; un + relevé importé **puis** un autre plus ancien (ordre d'import ≠ ordre des dates) ; mode guidé ; les E2E existants de + l'accueil (`frontend/tests/e2e/homepage-*.spec.ts`) — un sélecteur cassé par le renommage ? Le manuel : relis + `docs/manual/fr/user-manual.tex` (§ *Tableau de bord* et tout site qui parle de « liquidités » ou du solde bancaire) **et + le PDF aplati** (`pdftotext docs/manual/fr/user-manual.pdf - | tr '\n' ' ' | tr -s ' '` vers `target/gate-logs/`). Pars + du symptôme : `grep -rn "liquidit\|solde bancaire\|Total liquid" docs frontend/src crates/kesh-i18n README.md website`. + +## Ce que tu rends + +Findings avec sévérité (CRITICAL/HIGH/MEDIUM/LOW), endroit, **preuve** (commande ET sortie, `grep -nF` pour toute +présence ou absence), correction proposée. ⛔ La liste des axes exercés ET non exercés. + +## Interdits + +⛔ N'écris aucun fichier du dépôt hors `target/gate-logs/` ; aucune commande qui écrit dans le dépôt ou dans une base : +`scripts/*` (dont `scripts/prepare-release.sh`), `make`, `latexmk`, `git commit`/`add`/`checkout`, `sqlx`, +`cargo test`/`nextest`, `npm run`, `npx`, `gh issue create`/`comment`/`edit`. Autorisés : lecture, `grep`, `sed`, +`git log`/`show`/`diff`, `gh issue view`, `pdftotext` vers `target/gate-logs/`. From 0d815161bcbd3550e41eb79599a6bb0aaea5561d Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sat, 3 Oct 2026 16:01:33 +0200 Subject: [PATCH 03/20] =?UTF-8?q?docs(25-6-a):=20validation=20P1=20?= =?UTF-8?q?=E2=80=94=20total=20d=C3=A9doublonn=C3=A9,=20solde=20=C3=A0=20u?= =?UTF-8?q?ne=20date,=20composants=20testables,=20Consultation=20en=20E2E?= =?UTF-8?q?=20(refs=20#388,=20refs=20#389)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-6-a-tableau-de-bord.md | 134 ++++++++++++++---- 1 file changed, 103 insertions(+), 31 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md b/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md index 811686b2..fc2a2586 100644 --- a/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md +++ b/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md @@ -28,7 +28,7 @@ banque. - **La tuile « Factures ouvertes » n'affiche aucun montant** (`+page.svelte:100-128`) : seulement « N facture(s) à rappeler », **pour Admin/Comptable**, depuis `/dunning/reminders` (Comptable+) — un rôle Consultation voit « Aucune facture ouverte » en permanence. Le résumé existe : `GET /api/v1/invoices/due-dates` (`lib.rs:751`, **tout rôle**) rend - `DueDatesSummary { unpaidCount, unpaidTotal, overdueCount, overdueTotal }` (`kesh-db/src/repositories/invoices.rs:870-905`) + `DueDatesSummary { unpaidCount, unpaidTotal, overdueCount, overdueTotal }` (`kesh-db/src/repositories/invoices.rs`, `DueDatesSummary` et `due_dates_summary`) — des **restes dus** depuis la 25-4-b1 (#416), factures `validated` non soldées. Client : `invoices.api.ts:118`. - **Le « solde bancaire » est le solde comptable** : `bank_accounts::list_by_company_with_balances` (`kesh-db/src/repositories/bank_accounts.rs:620-690`) rend `SUM(debit) − SUM(credit)` du compte de grand livre lié, @@ -46,20 +46,27 @@ banque. ## Acceptance Criteria **AC 1 — Dernières écritures, branchées.** La tuile appelle `GET /api/v1/journal-entries?limit=5` (tri par défaut : -date décroissante) et liste au plus **cinq** écritures : date, numéro, libellé, montant (somme des débits de -l'écriture, en `big.js`). Chaque ligne mène à l'écriture (`/journal-entries/{id}`). Sans écriture, le texte vide actuel +`entry_date DESC, entry_number DESC`) et liste au plus **cinq** écritures : date, numéro, libellé, montant (somme des +débits de l'écriture, calculée côté client en `big.js` depuis les lignes que la liste rend déjà — la liste lit les +lignes par écriture, cinq requêtes de plus : acceptable à cette taille, aucun champ d'API ajouté). Une contre-passation +s'affiche comme toute écriture, sous son propre numéro. Chaque ligne mène à l'écriture (`/journal-entries/{id}`). Sans écriture, le texte vide actuel (et sa variante guidée) reste. Échec de l'appel : la tuile le dit (« indisponible ») au lieu de prétendre qu'il n'y a -rien. Le bouton « Saisir une écriture » n'apparaît que pour Admin/Comptable (Consultation ne saisit pas). +rien — et l'échec **prime sur la variante guidée**. Le bouton « Saisir une écriture » n'apparaît que pour Admin/Comptable (Consultation ne saisit pas). -**AC 2 — Factures ouvertes, chiffrées, pour tous les rôles.** La tuile appelle `GET /api/v1/invoices/due-dates` (sans -filtre) et affiche **N factures ouvertes — reste dû total** et, s'il y en a, **dont M échues — montant**. Les montants +**AC 2 — Factures ouvertes, chiffrées, pour tous les rôles.** La tuile appelle `GET /api/v1/invoices/due-dates?limit=1` +(seul le `summary` sert ; la liste paginée qui l'accompagne est réduite à une ligne) et affiche **N factures ouvertes — reste dû total** et, s'il y en a, **dont M échues — montant**. Les montants passent par `big.js` et le formatage suisse du dépôt. Le compteur « à rappeler » (Admin/Comptable) reste. Le bouton « Créer une facture » n'apparaît que pour Admin/Comptable. Sans facture ouverte, le texte vide actuel reste ; échec de l'appel : « indisponible ». -**AC 3 — Le solde est nommé « solde comptable ».** Dans la tuile « Comptes bancaires », chaque solde est libellé +**AC 3 — Le solde est nommé « solde comptable », et compté une fois.** Dans la tuile « Comptes bancaires », chaque solde est libellé **« Solde comptable »** et le total **« Total (solde comptable) »** au lieu de « Total liquidités ». Le libellé d'aide dit -d'où vient le chiffre : le grand livre, non la banque. +d'où vient le chiffre : le grand livre, non la banque. **Le total ne compte chaque compte de grand livre qu'une fois** : +rien n'empêche deux comptes bancaires d'être liés au même compte (`idx_bank_accounts_journal_account` n'est pas unique, +`validate_journal_account_id` ne contrôle pas l'usage), et le total les compterait deux fois ; une note le signale +quand des comptes partagent un même compte lié. La clé `homepage-bank-total-liquidity` est **remplacée** par +`homepage-bank-total-ledger` (4 locales) et le `data-testid` `homepage-bank-total-liquidity` par `homepage-bank-total` +(cité par aucun test). **AC 4 — Le solde du dernier relevé, et l'écart.** `GET /api/v1/bank-accounts` gagne, par compte, le **dernier relevé importé** qui porte un solde de clôture : `statementClosingBalance` (`Decimal` | `null`), `statementDate` (`period_to`) et @@ -67,41 +74,78 @@ importé** qui porte un solde de clôture : `statementClosingBalance` (`Decimal` existe : « Relevé du {date} : {montant} » et, si `ledgerBalanceAtStatement ≠ statementClosingBalance`, **« Écart : {différence} »** (solde comptable à cette date − relevé), mis en évidence. Sans relevé, rien de plus. Les champs neufs sont `null` quand le compte n'a pas de compte de grand livre lié (le solde comptable ne se calcule pas) ou aucun relevé -avec solde. « Dernier » = `period_to` le plus récent, départagé par `imported_at` puis `id`. +avec solde ; `ledgerBalanceAtStatement` (donc l'écart) est aussi `null` quand **plusieurs comptes bancaires partagent le +compte de grand livre** — son solde ne s'attribue pas à l'un d'eux. « Dernier » = `period_to` le plus récent **parmi les +relevés qui portent un solde** (un relevé sans `closing_balance` plus récent ne masque pas un plus ancien), départagé par +`imported_at` puis `id`. **Signe** : `débit − crédit` du compte lié, quel que soit son type — c'est la convention du +relevé (un découvert est négatif au CAMT, `DBIT`, comme le solde d'un compte de passif lié à une ligne de crédit tirée). +**Échelle** : l'écart se calcule au centime — les deux soldes arrondis à 2 décimales (`round_dp` à mi-chemin loin de +zéro) avant la soustraction ; le relevé est en `DECIMAL(18,2)`, le grand livre à 4 décimales. **AC 5 — Les montants ne passent plus par `Number`.** `currentBalance` et les trois champs neufs restent des **chaînes -décimales** côté frontend (`BankAccountSummary`), le total et l'écart se calculent en `big.js`, l'affichage par le -formateur existant (adapté à une chaîne si nécessaire). Les deux consommateurs (accueil, page des comptes bancaires) -sont mis à jour. - -**AC 6 — L'API et la doc.** Les champs neufs dans la réponse de `GET /api/v1/bank-accounts` (et des routes qui rendent -le même DTO, s'il y en a — à inventorier), documentés au DTO. Le calcul du solde comptable à une date partage la -requête existante (pas de seconde copie du `SUM(debit) − SUM(credit)`). +décimales** côté frontend (`BankAccountSummary`), le total et l'écart se calculent en `big.js`. `formatChfBalance` +(`features/bank-accounts/format.ts:21`, aujourd'hui `(balance: number)`) prend une **chaîne ou un `Big`** et formate +`new Big(v).toFixed(2)` — TypeScript refuse une chaîne nue dans `Intl.NumberFormat.format`. Les deux lecteurs de +`currentBalance` (accueil, page des comptes bancaires) sont mis à jour ; côté `Raw`, les champs neufs sont **optionnels** +et normalisés à `null` aux quatre sites de `parseBankAccount` (`bank-accounts.api.ts:101,125,149,164` — les routes de +mutation rendent un `BankAccount` nu) ; les fixtures de `bank-accounts.api.test.ts` et de +`BankAccountJournalLinkForm.test.ts` complétées. + +**AC 6 — L'API et la doc.** Les champs neufs dans la réponse de `GET /api/v1/bank-accounts` — seule route qui rend +`BankAccountWithBalance` (`routes/bank_accounts.rs:345-356`, inventaire fait) —, documentés au DTO. **Contrat** : une +seule requête par appel, **par compte bancaire** (et non plus par compte de grand livre) : `LEFT JOIN` du dernier relevé +avec solde du compte bancaire, et deux sommes sur le compte lié — `SUM(debit) − SUM(credit)` toutes dates (le +`currentBalance` d'aujourd'hui, **inchangé**) et la même somme bornée par `CASE WHEN je.entry_date <= period_to` —, pas +de seconde copie du calcul. Un test de **non-régression** fige `currentBalance` et `lastTransactionDate` sur un jeu +existant. **AC 7 — Tests.** Chacun aurait échoué avant le patch : -- `kesh-db` : relevé le plus récent choisi (deux imports, `period_to` différents ; égalité départagée) ; relevé sans - `closing_balance` ignoré ; solde comptable **à la date du relevé** (une écriture postérieure n'y entre pas, une écriture - du jour même y entre) ; compte sans grand livre lié → `null` ; isolation par société ; +- `kesh-db` : relevé le plus récent choisi — deux imports dont le **plus récent importé est le plus ancien en date** + (l'ordre d'import ne décide pas), et une égalité de `period_to` départagée ; un relevé sans `closing_balance` **plus + récent** qu'un relevé avec solde ne le masque pas ; solde comptable **à la date du relevé** (une écriture postérieure + n'y entre pas, une écriture du jour même y entre ; un relevé daté **après** la dernière écriture rend le solde + courant) ; compte sans grand livre lié → `null` ; **deux comptes bancaires sur le même compte de grand livre** → + `ledgerBalanceAtStatement` `null` ; un compte lié de **passif** (ligne de crédit tirée) → solde et relevé de même + signe, écart nul ; isolation par société ; non-régression de `currentBalance` / `lastTransactionDate` ; - `kesh-api` : forme de la réponse (`statementClosingBalance`, `statementDate`, `ledgerBalanceAtStatement` en chaînes) ; -- Vitest de l'accueil (`+page.svelte` ou composants extraits) : dernières écritures listées / vide / échec ; factures - ouvertes chiffrées pour un rôle **Consultation** ; « dont M échues » absent à zéro ; « Solde comptable » et le total - renommé ; écart affiché seulement s'il est non nul ; boutons d'action absents pour Consultation ; total calculé en - `big.js` (cas `0.1 + 0.2`) ; -- **E2E** : une écriture postée par l'API apparaît dans la tuile ; une facture validée apparaît dans « Factures - ouvertes » avec son montant (sélecteurs `data-testid`, jamais un libellé traduit — garde `e2e-selecteurs-traduits`). +- **Vitest, par composant** — les trois tuiles sont **extraites** en composants (`features/dashboard/` + `RecentEntriesCard.svelte`, `OpenInvoicesCard.svelte`, `BankAccountsCard.svelte`, données en props, appels dans la + page) : aucune page n'est testée aujourd'hui, et monter `+page.svelte` exigerait cinq mocks. Cas : dernières écritures + listées / vide / vide **guidé** / échec (l'échec prime sur le guidé) ; factures ouvertes chiffrées pour un rôle + **Consultation** ; « dont M échues » absent à zéro ; vide guidé ; « Solde comptable » et le total renommé ; total + **dédoublonné** par compte lié, avec sa note ; écart affiché seulement s'il est non nul **au centime** (`"100.0049"` + contre `"100.00"` : pas d'écart) ; boutons d'action absents pour Consultation ; total en `big.js` (`0.1 + 0.2`) ; + `formatChfBalance` sur une chaîne à 4 décimales ; +- **E2E** (sélecteurs `data-testid`, jamais un libellé traduit — garde `e2e-selecteurs-traduits`) — testids : + `homepage-entry-row`, `homepage-entries-unavailable`, `homepage-invoices-open-count`, `homepage-invoices-open-total`, + `homepage-invoices-overdue`, `homepage-bank-statement-{id}`, `homepage-bank-gap-{id}`, `homepage-bank-total` : + - une écriture postée par l'API apparaît dans la tuile — helper **neuf** `createJournalEntryViaApi` dans + `tests/e2e/helpers/api-fixtures.ts` (aucun n'existe) ; + - une facture validée apparaît dans « Factures ouvertes » avec son montant ; + - un rôle **Consultation**, créé par l'API sur le patron de `homepage-reminders.spec.ts:59-88`, voit les factures + ouvertes chiffrées et aucun bouton d'action — la frontière HTTP n'est vérifiée que là. +- Les E2E existants de l'accueil (`homepage-reminders.spec.ts`, `homepage-settings.spec.ts`) gardent leurs sélecteurs : + les `data-testid` `homepage-card-*` et `homepage-reminders-count`, et le titre de la tuile « Comptes bancaires », sont + conservés. **AC 8 — Le manuel et le CHANGELOG.** `user-manual.tex` § *Tableau de bord* réécrit : les trois tuiles telles qu'elles sont, le solde **comptable** expliqué (le grand livre, pas la banque ; il ne reflète un encaissement qu'une fois celui-ci comptabilisé), le dernier relevé et l'écart, et ce que voit un rôle Consultation. PDF régénéré, contrôlé -**aplati**. CHANGELOG `[0.12.1]` : `Fixed` (#388, #389), `Changed` (« Total liquidités » → « Total (solde comptable) »). -README et site relus (`grep -rni "tableau de bord\|liquidit" README.md website/`). +**aplati**. Le manuel renvoie à l'**import bancaire** pour l'origine du relevé (le solde de clôture du fichier CAMT). La capture +`dashboard.png` (`% TODO capture`, `:220`) ne correspondra plus : limite assumée, déjà marquée. Le glossaire (« Actif : +liquidités, créances… », `:2065`) parle de liquidités au sens comptable : **inchangé**. Manuels DE/IT/EN : un README +chacun, rien à traduire. CHANGELOG, section `## [0.12.1] — Non publié` : `Fixed` (#388, #389), `### Changed` **à +créer** (« Total liquidités » → « Total (solde comptable) »). README et site relus +(`grep -rni "tableau de bord\|liquidit" README.md website/`). ## Tasks / Subtasks - [ ] **T1 — le dernier relevé et le solde à sa date** (AC 4, 6), `kesh-db` `bank_accounts.rs`. - [ ] **T2 — le DTO** (AC 4, 6), `kesh-api` `routes/bank_accounts.rs`. -- [ ] **T3 — les montants en chaînes** (AC 5), `bank-accounts.api.ts`, page des comptes bancaires. -- [ ] **T4 — l'accueil** (AC 1, 2, 3, 4) et l'i18n (4 locales, `sitesTotal`, relevé des libellés en dur). +- [ ] **T3 — les montants en chaînes** (AC 5), `bank-accounts.api.ts`, `format.ts`, page des comptes bancaires, fixtures. +- [ ] **T4 — l'accueil** (AC 1, 2, 3, 4) : trois composants extraits dans `features/dashboard/`, la page qui les + alimente ; l'i18n (4 locales, parité, `sitesTotal`, `CLES_RELEVEES` de `i18n-un-repli-par-cle.test.ts`, relevé des + libellés en dur). - [ ] **T5 — tests** (AC 7). - [ ] **T6 — manuel, CHANGELOG** (AC 8). - [ ] **T7 — gates** : backend complet, frontend complet, **E2E complet**. @@ -119,14 +163,23 @@ README et site relus (`grep -rni "tableau de bord\|liquidit" README.md website/` ### Limites assumées +- **Dépendance avec la 25-4-d** (chaîne non mergée) : la tuile suit `due-dates`, qui compte les factures `validated` + sans `paid_at`. Une facture **soldée** par la 25-4-d y pose `paid_at` — elle sort donc des factures ouvertes. Si ce + contrat changeait, la tuile compterait une facture au reste nul. +- `due-dates` classe « échue » sur `UTC_DATE()`, non sur la date suisse : entre minuit et 1 h / 2 h, une facture peut + être classée un jour trop tôt. Hérité, non corrigé ici. +- À date égale, « dernières » suit `entry_number`, unique **par exercice** : le départage n'est pas chronologique entre + deux exercices. + - Le solde comptable ne reflète un encaissement qu'une fois celui-ci **comptabilisé** (rapprochement ou règlement) : c'est précisément ce que l'écart avec le relevé rend visible. - Le relevé ne vaut que pour sa date : entre deux imports, l'écart n'est pas recalculé contre la banque réelle. ### Modules -`kesh-db` (dernier relevé, solde à une date), `kesh-api` (DTO), `frontend` (accueil, API des comptes bancaires, page des -comptes), `kesh-i18n` (+ `docs`, `CHANGELOG`) — **quatre modules de code**, sous le seuil. +`kesh-db` (dernier relevé, solde à une date), `kesh-api` (DTO), `frontend` (accueil et trois composants +`features/dashboard/`, API et formateur des comptes bancaires, page des comptes, helper E2E), `kesh-i18n` (+ `docs`, +`CHANGELOG`) — **quatre modules de code**, sous le seuil. ### References @@ -146,6 +199,25 @@ comptes), `kesh-i18n` (+ `docs`, `CHANGELOG`) — **quatre modules de code**, so ## Change Log +- **2026-10-03** — Validation P1 (Sonnet ×3, prompt `25-6-a-validate-prompt-p1.md`) : **4 HIGH, 7 MED**, LOW. + - **Réfuté — A1 (HIGH)**, « signe de l'écart faux pour un compte de passif ». `débit − crédit` est la convention du + relevé quel que soit le type : un passif lié à une ligne de crédit tirée de 1000 vaut −1000, comme le relevé + (`DBIT`). Écrit à l'AC 4, avec un test. + - **Retenus** : + - deux comptes bancaires sur un même compte de grand livre : total dédoublonné, écart `null` (A2) ; + - le test de l'accueil : trois composants extraits (C1) ; + - les cas du solde à une date : ordre d'import inversé, relevé postérieur, relevé sans solde plus récent, compte de + passif, échelle (C2, A6) ; + - le contrat de la requête et la non-régression (B1) ; + - `formatChfBalance` sur une chaîne (B2) ; + - le helper E2E et les testids (C3) ; + - un E2E pour le rôle Consultation (C4) ; + - le mode guidé (C5) ; + - les sites du manuel (C6) ; + - la clé et le testid du total (C7) ; + - `due-dates?limit=1` et la limite `UTC_DATE()` (A4) ; + - la dépendance avec la 25-4-d (A3). + - **LOW** : tri et montant (A5, C9, B5), les sites `Raw` (B3), les références (B4), `CLES_RELEVEES` (B6). - **2026-10-03** — Créée (Guy : « ok, merge et continue » ; découpage 25-6-a / 25-6-b non contesté). [#388]: https://github.com/guycorbaz/kesh/issues/388 From 8951155925be0df41e5061769e22595dd126bcb0 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sat, 3 Oct 2026 16:01:51 +0200 Subject: [PATCH 04/20] =?UTF-8?q?docs(25-6-a):=20composants=20dans=20featu?= =?UTF-8?q?res/homepage=20=E2=80=94=20la=20garde=20d'appartenance=20i18n?= =?UTF-8?q?=20(refs=20#388,=20refs=20#389)?= 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-6-a-tableau-de-bord.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md b/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md index fc2a2586..3ca4e174 100644 --- a/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md +++ b/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md @@ -108,9 +108,11 @@ existant. `ledgerBalanceAtStatement` `null` ; un compte lié de **passif** (ligne de crédit tirée) → solde et relevé de même signe, écart nul ; isolation par société ; non-régression de `currentBalance` / `lastTransactionDate` ; - `kesh-api` : forme de la réponse (`statementClosingBalance`, `statementDate`, `ledgerBalanceAtStatement` en chaînes) ; -- **Vitest, par composant** — les trois tuiles sont **extraites** en composants (`features/dashboard/` +- **Vitest, par composant** — les trois tuiles sont **extraites** en composants (`features/homepage/` `RecentEntriesCard.svelte`, `OpenInvoicesCard.svelte`, `BankAccountsCard.svelte`, données en props, appels dans la - page) : aucune page n'est testée aujourd'hui, et monter `+page.svelte` exigerait cinq mocks. Cas : dernières écritures + page) : aucune page n'est testée aujourd'hui, et monter `+page.svelte` exigerait cinq mocks. ⚠️ Le dossier est + `homepage/`, pas `dashboard/` : `lint-i18n-ownership` n'admet dans `features/X/` que les clés `X-*`, et les clés de + l'accueil sont `homepage-*`. Cas : dernières écritures listées / vide / vide **guidé** / échec (l'échec prime sur le guidé) ; factures ouvertes chiffrées pour un rôle **Consultation** ; « dont M échues » absent à zéro ; vide guidé ; « Solde comptable » et le total renommé ; total **dédoublonné** par compte lié, avec sa note ; écart affiché seulement s'il est non nul **au centime** (`"100.0049"` @@ -143,7 +145,7 @@ créer** (« Total liquidités » → « Total (solde comptable) »). README et - [ ] **T1 — le dernier relevé et le solde à sa date** (AC 4, 6), `kesh-db` `bank_accounts.rs`. - [ ] **T2 — le DTO** (AC 4, 6), `kesh-api` `routes/bank_accounts.rs`. - [ ] **T3 — les montants en chaînes** (AC 5), `bank-accounts.api.ts`, `format.ts`, page des comptes bancaires, fixtures. -- [ ] **T4 — l'accueil** (AC 1, 2, 3, 4) : trois composants extraits dans `features/dashboard/`, la page qui les +- [ ] **T4 — l'accueil** (AC 1, 2, 3, 4) : trois composants extraits dans `features/homepage/`, la page qui les alimente ; l'i18n (4 locales, parité, `sitesTotal`, `CLES_RELEVEES` de `i18n-un-repli-par-cle.test.ts`, relevé des libellés en dur). - [ ] **T5 — tests** (AC 7). @@ -178,7 +180,7 @@ créer** (« Total liquidités » → « Total (solde comptable) »). README et ### Modules `kesh-db` (dernier relevé, solde à une date), `kesh-api` (DTO), `frontend` (accueil et trois composants -`features/dashboard/`, API et formateur des comptes bancaires, page des comptes, helper E2E), `kesh-i18n` (+ `docs`, +`features/homepage/`, API et formateur des comptes bancaires, page des comptes, helper E2E), `kesh-i18n` (+ `docs`, `CHANGELOG`) — **quatre modules de code**, sous le seuil. ### References From 917b5242759a73f52a973fda019cf8685bcad844 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sat, 3 Oct 2026 16:02:11 +0200 Subject: [PATCH 05/20] docs(25-6-a): prompt de validation P2 (refs #388, refs #389) Co-Authored-By: Claude Opus 5.5 --- .../25-6-a-validate-prompt-p2.md | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 _bmad-output/implementation-artifacts/25-6-a-validate-prompt-p2.md diff --git a/_bmad-output/implementation-artifacts/25-6-a-validate-prompt-p2.md b/_bmad-output/implementation-artifacts/25-6-a-validate-prompt-p2.md new file mode 100644 index 00000000..6d22a255 --- /dev/null +++ b/_bmad-output/implementation-artifacts/25-6-a-validate-prompt-p2.md @@ -0,0 +1,45 @@ +# Prompt — validation P2, Story 25-6-a (le tableau de bord dit vrai) + +*Versionné le 2026-10-03. Une passe (Opus), contexte frais, les trois lentilles. Trend : P1 4H/7M (Sonnet ×3, dont un HIGH +réfuté).* + +Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-6-a-tableau-de-bord`. **Fiche :** +`_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md` (tête `89511559`). Remédiation de P1 : +`git diff 06c9a685 89511559`. Issues : `gh issue view 388`, `389`. Règles : `CLAUDE.md`. La fiche décrit du travail **à +faire** : un finding qui reproche au code de ne pas encore le porter sera rejeté. + +## Ce que tu vérifies + +1. **La remédiation de P1** : + - **La réfutation du HIGH A1 tient-elle ?** Vérifie le signe du solde CAMT (`crates/kesh-import/src/camt053/`) et + celui d'un compte de passif lié (`débit − crédit`), sur un découvert et une ligne de crédit tirée. Calcul chiffré. + - **Le contrat de la requête (AC 6) est-il réalisable** dans `bank_accounts.rs:620-690` sans changer + `currentBalance` ni `lastTransactionDate` — y compris quand deux comptes bancaires partagent un compte de grand livre + (la requête passe de « par compte de grand livre » à « par compte bancaire ») ? + - **Le dédoublonnage du total (AC 3)** : par `journalAccountId` — quel solde garder, et que devient un compte sans + compte lié ? La note, en quels termes ? + - **`formatChfBalance` sur `Big`** : `new Big(v).toFixed(2)` arrondit-il comme le reste du dépôt (mode d'arrondi de + `big.js` par défaut) ? Ses autres appelants (`grep -rn formatChfBalance frontend/src`) restent-ils compilables ? + - **L'extraction en composants dans `features/homepage/`** : la garde `lint-i18n-ownership` + (`frontend/scripts/lint-i18n-ownership.js`, `keyBelongsToFeature`) admet-elle bien les clés `homepage-*` dans ce + dossier ? D'autres clés que la page emploie aujourd'hui (`grep -o "msg('[a-z-]*'" "frontend/src/routes/(app)/+page.svelte"`) + seraient-elles refusées une fois déplacées ? +2. **Cohérence interne** : la fiche dit-elle la même chose partout (AC, tâches, Dev Notes, *Modules*, limites) ? +3. **Ce que P1 n'a pas regardé** : l'accessibilité des tuiles (titres, liens, axe — un E2E axe existe-t-il pour + l'accueil ?) ; le rendu de l'écart (couleur seule ?) ; une clé API sur ces endpoints ; la taille du `limit=5` face au + N+1 réel de la liste (`journal_entries.rs`, lecture des lignes) ; le mode expert/guidé et les textes de + `homepage-*-empty-guided`. +4. **Le manuel** — `docs/manual/fr/user-manual.tex` § *Tableau de bord* et l'import bancaire, **PDF aplati** vers + `target/gate-logs/`. + +## Ce que tu rends + +Findings avec sévérité (CRITICAL/HIGH/MEDIUM/LOW), endroit, **preuve** (commande ET sortie, `grep -nF` pour toute +présence ou absence, calcul chiffré), correction proposée. ⛔ La liste des axes exercés ET non exercés. + +## Interdits + +⛔ N'écris aucun fichier du dépôt hors `target/gate-logs/` ; aucune commande qui écrit dans le dépôt ou dans une base : +`scripts/*` (dont `scripts/prepare-release.sh`), `make`, `latexmk`, `git commit`/`add`/`checkout`, `sqlx`, +`cargo test`/`nextest`, `npm run`, `npx`, `gh issue create`/`comment`/`edit`. Autorisés : lecture, `grep`, `sed`, +`git log`/`show`/`diff`, `gh issue view`, `pdftotext` vers `target/gate-logs/`, `node -e` sans effet de bord. From 6e078f6fb7c44e11397725a4cc1deb3bdeacf7f1 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sat, 3 Oct 2026 16:10:36 +0200 Subject: [PATCH 06/20] =?UTF-8?q?docs(25-6-a):=20validation=20P2=20?= =?UTF-8?q?=E2=80=94=20arrondi,=20non-r=C3=A9gression,=20partage,=20textes?= =?UTF-8?q?=20guid=C3=A9s,=20axe,=20CSV=20;=20H1=20et=20d=C3=A9coupage=20s?= =?UTF-8?q?oumis=20=C3=A0=20Guy=20(refs=20#388,=20refs=20#389)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-6-a-tableau-de-bord.md | 71 +++++++++++++++---- 1 file changed, 58 insertions(+), 13 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md b/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md index 3ca4e174..516ec8e2 100644 --- a/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md +++ b/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md @@ -62,7 +62,9 @@ l'appel : « indisponible ». **AC 3 — Le solde est nommé « solde comptable », et compté une fois.** Dans la tuile « Comptes bancaires », chaque solde est libellé **« Solde comptable »** et le total **« Total (solde comptable) »** au lieu de « Total liquidités ». Le libellé d'aide dit d'où vient le chiffre : le grand livre, non la banque. **Le total ne compte chaque compte de grand livre qu'une fois** : -rien n'empêche deux comptes bancaires d'être liés au même compte (`idx_bank_accounts_journal_account` n'est pas unique, +tous les comptes liés au même compte de grand +livre ont **par construction** le même solde (la somme porte sur le même `account_id`) : on en garde un, sans autre +règle ; rien n'empêche deux comptes bancaires d'être liés au même compte (`idx_bank_accounts_journal_account` n'est pas unique, `validate_journal_account_id` ne contrôle pas l'usage), et le total les compterait deux fois ; une note le signale quand des comptes partagent un même compte lié. La clé `homepage-bank-total-liquidity` est **remplacée** par `homepage-bank-total-ledger` (4 locales) et le `data-testid` `homepage-bank-total-liquidity` par `homepage-bank-total` @@ -79,14 +81,22 @@ compte de grand livre** — son solde ne s'attribue pas à l'un d'eux. « Dernie relevés qui portent un solde** (un relevé sans `closing_balance` plus récent ne masque pas un plus ancien), départagé par `imported_at` puis `id`. **Signe** : `débit − crédit` du compte lié, quel que soit son type — c'est la convention du relevé (un découvert est négatif au CAMT, `DBIT`, comme le solde d'un compte de passif lié à une ligne de crédit tirée). -**Échelle** : l'écart se calcule au centime — les deux soldes arrondis à 2 décimales (`round_dp` à mi-chemin loin de -zéro) avant la soustraction ; le relevé est en `DECIMAL(18,2)`, le grand livre à 4 décimales. +**Échelle** : l'écart se calcule **côté client**, en `big.js`, au centime — les deux soldes arrondis à 2 décimales +(`.round(2, Big.roundHalfUp)`, l'arrondi du dépôt — `vat-purchase.ts:12` ; **pas** `round_dp`, qui est l'arrondi +bancaire) avant la soustraction ; le relevé est en `DECIMAL(18,2)`, le grand livre à 4 décimales. **Partage** : le +nombre de comptes bancaires liés à un même compte de grand livre se compte **en SQL, sur tous les comptes de la +société, archivés compris** (l'historique d'un compte archivé alimente le même compte de grand livre) — la réponse ne +dépend donc pas de `includeArchived`. **Imports CSV** : ils ne portent jamais de solde de clôture +(`kesh-import/src/csv/parser.rs:342`) — un compte alimenté par CSV seul n'a pas de relevé, et un import CSV plus récent +ne masque pas un relevé CAMT plus ancien. **AC 5 — Les montants ne passent plus par `Number`.** `currentBalance` et les trois champs neufs restent des **chaînes décimales** côté frontend (`BankAccountSummary`), le total et l'écart se calculent en `big.js`. `formatChfBalance` (`features/bank-accounts/format.ts:21`, aujourd'hui `(balance: number)`) prend une **chaîne ou un `Big`** et formate `new Big(v).toFixed(2)` — TypeScript refuse une chaîne nue dans `Intl.NumberFormat.format`. Les deux lecteurs de -`currentBalance` (accueil, page des comptes bancaires) sont mis à jour ; côté `Raw`, les champs neufs sont **optionnels** +`currentBalance` (accueil, page des comptes bancaires) sont mis à jour. Forme imposée : +`format(new Big(v).round(2, Big.roundHalfUp).toNumber())` — un `string` (même issu de `toFixed`) ne compile pas, et le +`Number` d'un montant **déjà arrondi au centime** est exact jusqu'à ~9·10¹³ CHF. Côté `Raw`, les champs neufs sont **optionnels** et normalisés à `null` aux quatre sites de `parseBankAccount` (`bank-accounts.api.ts:101,125,149,164` — les routes de mutation rendent un `BankAccount` nu) ; les fixtures de `bank-accounts.api.test.ts` et de `BankAccountJournalLinkForm.test.ts` complétées. @@ -96,8 +106,11 @@ mutation rendent un `BankAccount` nu) ; les fixtures de `bank-accounts.api.test. seule requête par appel, **par compte bancaire** (et non plus par compte de grand livre) : `LEFT JOIN` du dernier relevé avec solde du compte bancaire, et deux sommes sur le compte lié — `SUM(debit) − SUM(credit)` toutes dates (le `currentBalance` d'aujourd'hui, **inchangé**) et la même somme bornée par `CASE WHEN je.entry_date <= period_to` —, pas -de seconde copie du calcul. Un test de **non-régression** fige `currentBalance` et `lastTransactionDate` sur un jeu -existant. +de seconde copie du calcul ; le dernier relevé par compte se réduit à une ligne avant les sommes (`ROW_NUMBER()`, +MariaDB 10.11). ⚠️ **Le calcul actuel n'a aucun test** : un test de **non-régression** est écrit et vert **contre le code +actuel, dans un commit séparé, avant la réécriture** — compte lié avec écritures, compte lié **sans** écriture +(`currentBalance` sérialisé `"0"`, pas `"0.0000"` : asserté sur le **JSON** de la route, une assertion `Decimal` ne +verrait rien), compte non lié (`null`), ordre de la liste. Il est **exempté** de la règle « aurait échoué avant ». **AC 7 — Tests.** Chacun aurait échoué avant le patch : - `kesh-db` : relevé le plus récent choisi — deux imports dont le **plus récent importé est le plus ancien en date** @@ -114,9 +127,12 @@ existant. `homepage/`, pas `dashboard/` : `lint-i18n-ownership` n'admet dans `features/X/` que les clés `X-*`, et les clés de l'accueil sont `homepage-*`. Cas : dernières écritures listées / vide / vide **guidé** / échec (l'échec prime sur le guidé) ; factures ouvertes chiffrées pour un rôle - **Consultation** ; « dont M échues » absent à zéro ; vide guidé ; « Solde comptable » et le total renommé ; total + **Consultation** ; « dont M échues » absent à zéro ; vide guidé — sans « première » (une facture émise puis soldée + laisse la tuile vide : « Créez votre première facture » serait faux) ; un rôle **Consultation** voit le texte vide + **non guidé**, sans injonction à une action qu'il ne peut faire ; « Solde comptable » et le total renommé ; total **dédoublonné** par compte lié, avec sa note ; écart affiché seulement s'il est non nul **au centime** (`"100.0049"` - contre `"100.00"` : pas d'écart) ; boutons d'action absents pour Consultation ; total en `big.js` (`0.1 + 0.2`) ; + contre `"100.00"` : pas d'écart ; `"100.005"` contre `"100.01"` : pas d'écart — le cas qui départage l'arrondi du + dépôt de l'arrondi bancaire) ; boutons d'action absents pour Consultation ; total en `big.js` (`0.1 + 0.2`) ; `formatChfBalance` sur une chaîne à 4 décimales ; - **E2E** (sélecteurs `data-testid`, jamais un libellé traduit — garde `e2e-selecteurs-traduits`) — testids : `homepage-entry-row`, `homepage-entries-unavailable`, `homepage-invoices-open-count`, `homepage-invoices-open-total`, @@ -125,7 +141,12 @@ existant. `tests/e2e/helpers/api-fixtures.ts` (aucun n'existe) ; - une facture validée apparaît dans « Factures ouvertes » avec son montant ; - un rôle **Consultation**, créé par l'API sur le patron de `homepage-reminders.spec.ts:59-88`, voit les factures - ouvertes chiffrées et aucun bouton d'action — la frontière HTTP n'est vérifiée que là. + ouvertes chiffrées et aucun bouton d'action — la frontière HTTP n'est vérifiée que là ; + - un passage **axe** sur l'accueil **peuplé** (écriture, facture, compte avec relevé et écart) — celui de + `homepage-settings.spec.ts:65-70` tourne sur un accueil vide et ne voit rien de ce que la story ajoute. Les + écritures sont une liste (`ul`/`li`), chaque lien a un nom accessible, l'écart a un libellé (pas la couleur seule) ; + - montage déterministe : `seedTestState('with-company')` en `beforeAll` (patron `homepage-reminders.spec.ts:19`), + l'écriture datée pour être la plus récente. - Les E2E existants de l'accueil (`homepage-reminders.spec.ts`, `homepage-settings.spec.ts`) gardent leurs sélecteurs : les `data-testid` `homepage-card-*` et `homepage-reminders-count`, et le titre de la tuile « Comptes bancaires », sont conservés. @@ -136,8 +157,9 @@ celui-ci comptabilisé), le dernier relevé et l'écart, et ce que voit un rôle **aplati**. Le manuel renvoie à l'**import bancaire** pour l'origine du relevé (le solde de clôture du fichier CAMT). La capture `dashboard.png` (`% TODO capture`, `:220`) ne correspondra plus : limite assumée, déjà marquée. Le glossaire (« Actif : liquidités, créances… », `:2065`) parle de liquidités au sens comptable : **inchangé**. Manuels DE/IT/EN : un README -chacun, rien à traduire. CHANGELOG, section `## [0.12.1] — Non publié` : `Fixed` (#388, #389), `### Changed` **à -créer** (« Total liquidités » → « Total (solde comptable) »). README et site relus +chacun, rien à traduire. CHANGELOG, section `## [0.12.1] — Non publié` : `Fixed` (#388, #389), sous la section `### Changed` **existante** +(« Total liquidités » → « Total (solde comptable) »). Le § *Tableau de bord* dit que **seuls les relevés CAMT.053 portent +un solde de clôture** — un import CSV n'en a pas ; la section *Import bancaire* le dit aussi. README et site relus (`grep -rni "tableau de bord\|liquidit" README.md website/`). ## Tasks / Subtasks @@ -146,8 +168,15 @@ créer** (« Total liquidités » → « Total (solde comptable) »). README et - [ ] **T2 — le DTO** (AC 4, 6), `kesh-api` `routes/bank_accounts.rs`. - [ ] **T3 — les montants en chaînes** (AC 5), `bank-accounts.api.ts`, `format.ts`, page des comptes bancaires, fixtures. - [ ] **T4 — l'accueil** (AC 1, 2, 3, 4) : trois composants extraits dans `features/homepage/`, la page qui les - alimente ; l'i18n (4 locales, parité, `sitesTotal`, `CLES_RELEVEES` de `i18n-un-repli-par-cle.test.ts`, relevé des - libellés en dur). + alimente ; l'i18n (4 locales, parité, `sitesTotal`, relevé des libellés en dur). Les composants appellent `i18nMsg` + **directement** (la garde `lint-i18n-ownership` ne lit que `i18nMsg(`, `scripts/lint-i18n-ownership.js:151` — le + relais `msg()` de la page lui échappe). **Clés neuves** : `homepage-entries-unavailable`, + `homepage-invoices-unavailable`, `homepage-invoices-open` (« { $n } facture(s) ouverte(s) — { $amount } »), + `homepage-invoices-overdue` (« dont { $n } échue(s) — { $amount } »), `homepage-bank-ledger-balance` (« Solde + comptable »), `homepage-bank-ledger-help`, `homepage-bank-total-ledger`, `homepage-bank-shared-ledger-note`, + `homepage-bank-statement` (« Relevé du { $date } : { $amount } », date au format suisse), `homepage-bank-gap` + (« Écart : { $amount } ») ; `homepage-invoices-empty-guided` **réécrite** sans « première » ; + `homepage-bank-total-liquidity` **retirée**. - [ ] **T5 — tests** (AC 7). - [ ] **T6 — manuel, CHANGELOG** (AC 8). - [ ] **T7 — gates** : backend complet, frontend complet, **E2E complet**. @@ -201,6 +230,22 @@ créer** (« Total liquidités » → « Total (solde comptable) »). README et ## Change Log +- **2026-10-03** — Validation P2 (Opus, prompt `25-6-a-validate-prompt-p2.md`) : **1 HIGH, 6 MED, 8 LOW**. + - Retenus : + - l'arrondi de l'écart en `big.js` côté client (`round_dp` est bancaire) (M1) ; + - la non-régression écrite contre le code actuel, avant la réécriture, JSON `"0"` (M2) ; + - le partage compté en SQL, archivés compris (M3) ; + - les textes guidés (« première ») et la variante Consultation (M4) ; + - axe sur l'accueil peuplé (M5) ; + - les imports CSV sans solde (M6) ; + - `formatChfBalance` qui compile (L1), `CLES_RELEVEES` retiré (L2), `### Changed` existante (L3), `i18nMsg` + direct (L4), clés nommées (L5), règle de dédoublonnage écrite (L6), E2E déterministes (L7). + - ⚠️ **H1 (HIGH) — date de valeur contre date de comptabilisation** : le relevé CAMT (`CLBD`) est un solde par date de + comptabilisation ; les écritures de rapprochement sont datées à la date de **valeur** + (`reconciliation.rs:1958`). Sur des livres entièrement rapprochés, un mouvement de fin de mois à valeur décalée + produit un écart fictif. **Deux voies, soumises à Guy** ; **non appliqué** dans l'attente. + - ⚠️ **Signal de découpage** : sévérité maximale HIGH → HIGH (P1 → P2). Défauts **distincts** (P1 : partage, + solde à une date ; P2 : date de valeur), aucun recyclé. Recommandation : **ne pas découper** — arbitrage à Guy. - **2026-10-03** — Validation P1 (Sonnet ×3, prompt `25-6-a-validate-prompt-p1.md`) : **4 HIGH, 7 MED**, LOW. - **Réfuté — A1 (HIGH)**, « signe de l'écart faux pour un compte de passif ». `débit − crédit` est la convention du relevé quel que soit le type : un passif lié à une ligne de crédit tirée de 1000 vaut −1000, comme le relevé From 761f144d675f3693b98032fca750d3985fba50e2 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sat, 3 Oct 2026 17:40:39 +0200 Subject: [PATCH 07/20] =?UTF-8?q?docs(25-6-a):=20arbitrage=20de=20Guy=20?= =?UTF-8?q?=E2=80=94=20=C3=A9cart=20corrig=C3=A9=20de=20la=20date=20de=20v?= =?UTF-8?q?aleur,=20pas=20de=20d=C3=A9coupage=20(refs=20#388,=20refs=20#38?= =?UTF-8?q?9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-6-a-tableau-de-bord.md | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md b/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md index 516ec8e2..33c9e60e 100644 --- a/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md +++ b/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md @@ -81,6 +81,18 @@ compte de grand livre** — son solde ne s'attribue pas à l'un d'eux. « Dernie relevés qui portent un solde** (un relevé sans `closing_balance` plus récent ne masque pas un plus ancien), départagé par `imported_at` puis `id`. **Signe** : `débit − crédit` du compte lié, quel que soit son type — c'est la convention du relevé (un découvert est négatif au CAMT, `DBIT`, comme le solde d'un compte de passif lié à une ligne de crédit tirée). +**Date de valeur** (arbitrage de Guy, 2026-10-03, voie (a)) : le solde du relevé CAMT (`CLBD`) est arrêté à la date +de **comptabilisation bancaire** (`camt053/mod.rs:541`), alors que les écritures de rapprochement sont datées à la date +de **valeur** (`reconciliation.rs:1958`, `:2295`, `kesh-reconciliation/src/manual.rs:35`). `ledgerBalanceAtStatement` +est donc **corrigé** par les transactions bancaires **rapprochées** du compte (`bank_transactions.status = 'reconciled'`, +`matched_entry_id` non nul) dont les deux dates tombent de part et d'autre de `period_to` : **+ Σ `amount`** des +transactions dont `booking_date ≤ period_to` et dont l'écriture (`journal_entries.entry_date` de `matched_entry_id`) est +**postérieure** ; **− Σ `amount`** de celles dont `booking_date > period_to` et dont l'écriture est **antérieure ou +égale**. La date de l'écriture est **lue**, jamais déduite de `value_date` (un rapprochement manuel peut la choisir). +Le montant de la transaction est signé comme le relevé (`amount` du CAMT) : la correction s'ajoute au solde `débit − +crédit` sans changement de signe. Une transaction **non rapprochée** n'entre pas dans la correction : son absence du +grand livre est précisément l'écart que la tuile doit montrer. + **Échelle** : l'écart se calcule **côté client**, en `big.js`, au centime — les deux soldes arrondis à 2 décimales (`.round(2, Big.roundHalfUp)`, l'arrondi du dépôt — `vat-purchase.ts:12` ; **pas** `round_dp`, qui est l'arrondi bancaire) avant la soustraction ; le relevé est en `DECIMAL(18,2)`, le grand livre à 4 décimales. **Partage** : le @@ -120,6 +132,10 @@ verrait rien), compte non lié (`null`), ordre de la liste. Il est **exempté** courant) ; compte sans grand livre lié → `null` ; **deux comptes bancaires sur le même compte de grand livre** → `ledgerBalanceAtStatement` `null` ; un compte lié de **passif** (ligne de crédit tirée) → solde et relevé de même signe, écart nul ; isolation par société ; non-régression de `currentBalance` / `lastTransactionDate` ; + **date de valeur** — un crédit de 200 comptabilisé par la banque le jour du relevé, rapproché par une écriture datée + du lendemain : écart **nul** ; le cas inverse (comptabilisé le lendemain, écriture du jour) : écart nul ; une + transaction **non rapprochée** du jour du relevé : écart égal à son montant ; un rapprochement manuel dont la date + d'écriture diffère de `value_date` : la date **lue** fait foi ; - `kesh-api` : forme de la réponse (`statementClosingBalance`, `statementDate`, `ledgerBalanceAtStatement` en chaînes) ; - **Vitest, par composant** — les trois tuiles sont **extraites** en composants (`features/homepage/` `RecentEntriesCard.svelte`, `OpenInvoicesCard.svelte`, `BankAccountsCard.svelte`, données en props, appels dans la @@ -205,6 +221,9 @@ un solde de clôture** — un import CSV n'en a pas ; la section *Import bancair - Le solde comptable ne reflète un encaissement qu'une fois celui-ci **comptabilisé** (rapprochement ou règlement) : c'est précisément ce que l'écart avec le relevé rend visible. - Le relevé ne vaut que pour sa date : entre deux imports, l'écart n'est pas recalculé contre la banque réelle. +- La correction de date de valeur ne connaît que les écritures **issues d'un rapprochement** (`matched_entry_id`). Une + écriture saisie à la main pour un mouvement bancaire, à une date différente de sa comptabilisation par la banque, + n'est pas corrigée — l'écart le montre, et c'est juste : rien ne relie cette écriture au relevé. ### Modules @@ -230,6 +249,9 @@ un solde de clôture** — un import CSV n'en a pas ; la section *Import bancair ## Change Log +- **2026-10-03** — Arbitrage de Guy (« ok, vas-y ») : **H1 par la voie (a)** — l'écart est corrigé par les + transactions rapprochées de part et d'autre de la date du relevé, la date de l'écriture étant lue via + `matched_entry_id` ; **pas de découpage**. - **2026-10-03** — Validation P2 (Opus, prompt `25-6-a-validate-prompt-p2.md`) : **1 HIGH, 6 MED, 8 LOW**. - Retenus : - l'arrondi de l'écart en `big.js` côté client (`round_dp` est bancaire) (M1) ; @@ -243,9 +265,9 @@ un solde de clôture** — un import CSV n'en a pas ; la section *Import bancair - ⚠️ **H1 (HIGH) — date de valeur contre date de comptabilisation** : le relevé CAMT (`CLBD`) est un solde par date de comptabilisation ; les écritures de rapprochement sont datées à la date de **valeur** (`reconciliation.rs:1958`). Sur des livres entièrement rapprochés, un mouvement de fin de mois à valeur décalée - produit un écart fictif. **Deux voies, soumises à Guy** ; **non appliqué** dans l'attente. + produit un écart fictif. Deux voies soumises à Guy — **voie (a) retenue**, appliquée à l'AC 4. - ⚠️ **Signal de découpage** : sévérité maximale HIGH → HIGH (P1 → P2). Défauts **distincts** (P1 : partage, - solde à une date ; P2 : date de valeur), aucun recyclé. Recommandation : **ne pas découper** — arbitrage à Guy. + solde à une date ; P2 : date de valeur), aucun recyclé. **Arbitrage de Guy : pas de découpage.** - **2026-10-03** — Validation P1 (Sonnet ×3, prompt `25-6-a-validate-prompt-p1.md`) : **4 HIGH, 7 MED**, LOW. - **Réfuté — A1 (HIGH)**, « signe de l'écart faux pour un compte de passif ». `débit − crédit` est la convention du relevé quel que soit le type : un passif lié à une ligne de crédit tirée de 1000 vaut −1000, comme le relevé From 27ef4413b9531bcd37e1a716f0388d6008194c0e Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sat, 3 Oct 2026 17:41:01 +0200 Subject: [PATCH 08/20] docs(25-6-a): prompt de validation P3 (refs #388, refs #389) Co-Authored-By: Claude Opus 5.5 --- .../25-6-a-validate-prompt-p3.md | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 _bmad-output/implementation-artifacts/25-6-a-validate-prompt-p3.md diff --git a/_bmad-output/implementation-artifacts/25-6-a-validate-prompt-p3.md b/_bmad-output/implementation-artifacts/25-6-a-validate-prompt-p3.md new file mode 100644 index 00000000..aeaaf553 --- /dev/null +++ b/_bmad-output/implementation-artifacts/25-6-a-validate-prompt-p3.md @@ -0,0 +1,42 @@ +# Prompt — validation P3, Story 25-6-a (le tableau de bord dit vrai) + +*Versionné le 2026-10-03. Une passe (Sonnet), contexte frais. Trend : P1 4H/7M (Sonnet ×3) → P2 1H/6M/8L (Opus). La +remédiation de P2 change une **règle métier** (correction de l'écart par la date de valeur, arbitrée par Guy) : la passe +porte sur la fiche entière, avec une attention particulière au diff.* + +Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-6-a-tableau-de-bord`. **Fiche :** +`_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md` (tête `761f144d`). Remédiation de P2 : +`git diff 917b5242 761f144d`. Issues : `gh issue view 388`, `389`. Règles : `CLAUDE.md`. La fiche décrit du travail **à +faire** : un finding qui reproche au code de ne pas encore le porter sera rejeté. + +## Ce que tu vérifies + +1. **La correction de date de valeur (AC 4)** — refais le calcul, chiffré : + - le montant de la transaction (`bank_transactions.amount`, signé comme le relevé) est-il bien égal au mouvement que + l'écriture de rapprochement porte sur le compte lié (`journal_entry_lines` du compte, dans `matched_entry_id`) ? + Lis les chemins qui posent `matched_entry_id` (`grep -n "matched_entry_id = ?" crates/kesh-api/src/routes/reconciliation.rs`) + — rapprochement d'une facture (avec écart d'arrondi, 25-4-c3), éclatement (split), règle, rapprochement manuel : + la ligne du compte bancaire vaut-elle **toujours** `amount` ? Sinon, la correction est fausse ; + - une transaction rapprochée **puis** son rapprochement annulé (25-3-b) : `matched_entry_id` et `status` reviennent-ils + à l'état non rapproché ? l'écriture annulée et sa contre-passation, datées comment, faussent-elles la correction ? + - un rapprochement qui solde **plusieurs** transactions par une seule écriture, ou l'inverse ? +2. **Cohérence interne** : la fiche dit-elle la même chose partout (AC 1 à 8, tâches, Dev Notes, limites, *Modules*, + Change Log) ? Les clés i18n neuves nommées sont-elles cohérentes avec les AC qui les emploient ? +3. **Les références ajoutées** existent-elles et disent-elles ce qu'affirme la fiche : `camt053/mod.rs:541`, + `reconciliation.rs:1958`, `:2295`, `kesh-reconciliation/src/manual.rs:35`, `csv/parser.rs:342`, `vat-purchase.ts:12`, + `lint-i18n-ownership.js:151`, `homepage-settings.spec.ts:65-70`, `homepage-reminders.spec.ts:19`, `:59-88` ? +4. **Ce que les passes précédentes n'ont pas regardé** : la performance de la requête par compte bancaire (une correction + qui joint `bank_transactions` à `journal_entries`, index disponibles) ; le cas d'un compte bancaire lié **changé** de + compte de grand livre après des rapprochements. + +## Ce que tu rends + +Findings avec sévérité (CRITICAL/HIGH/MEDIUM/LOW), endroit, **preuve** (commande ET sortie, `grep -nF` pour toute présence +ou absence, calcul chiffré), correction proposée. ⛔ La liste des axes exercés ET non exercés. + +## Interdits + +⛔ N'écris aucun fichier du dépôt hors `target/gate-logs/` ; aucune commande qui écrit dans le dépôt ou dans une base : +`scripts/*` (dont `scripts/prepare-release.sh`), `make`, `latexmk`, `git commit`/`add`/`checkout`, `sqlx`, +`cargo test`/`nextest`, `npm run`, `npx`, `gh issue create`/`comment`/`edit`. Autorisés : lecture, `grep`, `sed`, +`git log`/`show`/`diff`, `gh issue view`. From 71f0d3d1b6af22c9271c87b7c67cc68f4b26ff01 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sat, 3 Oct 2026 17:43:46 +0200 Subject: [PATCH 09/20] =?UTF-8?q?docs(25-6-a):=20validation=20P3=20?= =?UTF-8?q?=E2=80=94=20correction=20sur=20la=20ligne=20du=20compte=20li?= =?UTF-8?q?=C3=A9,=20table=20d=C3=A9riv=C3=A9e,=20cas=20d'annulation=20(re?= =?UTF-8?q?fs=20#388,=20refs=20#389)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-6-a-tableau-de-bord.md | 52 ++++++++++++++----- 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md b/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md index 33c9e60e..c9c3a8ac 100644 --- a/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md +++ b/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md @@ -81,16 +81,21 @@ compte de grand livre** — son solde ne s'attribue pas à l'un d'eux. « Dernie relevés qui portent un solde** (un relevé sans `closing_balance` plus récent ne masque pas un plus ancien), départagé par `imported_at` puis `id`. **Signe** : `débit − crédit` du compte lié, quel que soit son type — c'est la convention du relevé (un découvert est négatif au CAMT, `DBIT`, comme le solde d'un compte de passif lié à une ligne de crédit tirée). -**Date de valeur** (arbitrage de Guy, 2026-10-03, voie (a)) : le solde du relevé CAMT (`CLBD`) est arrêté à la date -de **comptabilisation bancaire** (`camt053/mod.rs:541`), alors que les écritures de rapprochement sont datées à la date +**Date de valeur** (arbitrage de Guy, 2026-10-03, voie (a)) : le solde du relevé CAMT (`CLBD`, `camt053/mod.rs:541`) +vaut à la fin de la période du relevé (`period_to`, lu de `FrToDt/ToDtTm`, `:336` — la date propre du bloc `` +n'est pas lue) et reflète les mouvements par date de **comptabilisation bancaire**, alors que les écritures de rapprochement sont datées à la date de **valeur** (`reconciliation.rs:1958`, `:2295`, `kesh-reconciliation/src/manual.rs:35`). `ledgerBalanceAtStatement` est donc **corrigé** par les transactions bancaires **rapprochées** du compte (`bank_transactions.status = 'reconciled'`, -`matched_entry_id` non nul) dont les deux dates tombent de part et d'autre de `period_to` : **+ Σ `amount`** des -transactions dont `booking_date ≤ period_to` et dont l'écriture (`journal_entries.entry_date` de `matched_entry_id`) est -**postérieure** ; **− Σ `amount`** de celles dont `booking_date > period_to` et dont l'écriture est **antérieure ou -égale**. La date de l'écriture est **lue**, jamais déduite de `value_date` (un rapprochement manuel peut la choisir). -Le montant de la transaction est signé comme le relevé (`amount` du CAMT) : la correction s'ajoute au solde `débit − -crédit` sans changement de signe. Une transaction **non rapprochée** n'entre pas dans la correction : son absence du +`matched_entry_id` non nul) dont les deux dates tombent de part et d'autre de `period_to` : **+** le mouvement que +l'écriture `matched_entry_id` porte **sur le compte de grand livre lié actuel** (`SUM(jel.debit − jel.credit)`, +`jel.entry_id = matched_entry_id AND jel.account_id = `, une fois par écriture) pour les transactions dont +`booking_date ≤ period_to` et dont l'écriture (`journal_entries.entry_date`) est **postérieure** ; **−** ce même +mouvement pour celles dont `booking_date > period_to` et dont l'écriture est **antérieure ou égale**. La date de +l'écriture est **lue**, jamais déduite de `value_date` (un rapprochement manuel peut la choisir). On somme la **ligne de +l'écriture**, pas `bank_transactions.amount` (validation P3) : une écriture posée sur un **autre** compte — lien du compte +bancaire **changé** après des rapprochements, `set_journal_account_id_for_company` ne le garde pas — sort d'elle-même de +la correction, et la correction ne suppose plus que la ligne bancaire vaille `amount` (vrai aujourd'hui sur les cinq +chemins de rapprochement, `reconciliation.rs:1575, 2022, 2386, 3082, 3547`, mais rien ne le garantit demain). Une transaction **non rapprochée** n'entre pas dans la correction : son absence du grand livre est précisément l'écart que la tuile doit montrer. **Échelle** : l'écart se calcule **côté client**, en `big.js`, au centime — les deux soldes arrondis à 2 décimales @@ -119,7 +124,11 @@ seule requête par appel, **par compte bancaire** (et non plus par compte de gra avec solde du compte bancaire, et deux sommes sur le compte lié — `SUM(debit) − SUM(credit)` toutes dates (le `currentBalance` d'aujourd'hui, **inchangé**) et la même somme bornée par `CASE WHEN je.entry_date <= period_to` —, pas de seconde copie du calcul ; le dernier relevé par compte se réduit à une ligne avant les sommes (`ROW_NUMBER()`, -MariaDB 10.11). ⚠️ **Le calcul actuel n'a aucun test** : un test de **non-régression** est écrit et vert **contre le code +MariaDB 10.11). La **correction de date de valeur** se calcule dans une **table dérivée (ou sous-requête corrélée) par +compte bancaire**, jamais par une jointure `bank_transactions ⋈ journal_entries` dans le même `FROM` que les lignes du +grand livre — elle multiplierait ces lignes par le nombre de transactions et fausserait les deux `SUM`. Le test de +non-régression de `currentBalance` tourne **avec des transactions rapprochées présentes**, ce qui détecte ce produit +cartésien. ⚠️ **Le calcul actuel n'a aucun test** : un test de **non-régression** est écrit et vert **contre le code actuel, dans un commit séparé, avant la réécriture** — compte lié avec écritures, compte lié **sans** écriture (`currentBalance` sérialisé `"0"`, pas `"0.0000"` : asserté sur le **JSON** de la route, une assertion `Decimal` ne verrait rien), compte non lié (`null`), ordre de la liste. Il est **exempté** de la règle « aurait échoué avant ». @@ -135,7 +144,10 @@ verrait rien), compte non lié (`null`), ordre de la liste. Il est **exempté** **date de valeur** — un crédit de 200 comptabilisé par la banque le jour du relevé, rapproché par une écriture datée du lendemain : écart **nul** ; le cas inverse (comptabilisé le lendemain, écriture du jour) : écart nul ; une transaction **non rapprochée** du jour du relevé : écart égal à son montant ; un rapprochement manuel dont la date - d'écriture diffère de `value_date` : la date **lue** fait foi ; + d'écriture diffère de `value_date` : la date **lue** fait foi ; le chemin **facture** (écriture datée + `value_date.unwrap_or(booking_date)`, `reconciliation.rs:1270`) ; un **lien changé** après rapprochement (écritures sur + l'ancien compte) : hors de la correction ; un rapprochement **annulé** (`reconciliation_cancel.rs:331` — + `matched_entry_id` à `NULL`, `pending`) : hors de la correction ; - `kesh-api` : forme de la réponse (`statementClosingBalance`, `statementDate`, `ledgerBalanceAtStatement` en chaînes) ; - **Vitest, par composant** — les trois tuiles sont **extraites** en composants (`features/homepage/` `RecentEntriesCard.svelte`, `OpenInvoicesCard.svelte`, `BankAccountsCard.svelte`, données en props, appels dans la @@ -148,7 +160,8 @@ verrait rien), compte non lié (`null`), ordre de la liste. Il est **exempté** **non guidé**, sans injonction à une action qu'il ne peut faire ; « Solde comptable » et le total renommé ; total **dédoublonné** par compte lié, avec sa note ; écart affiché seulement s'il est non nul **au centime** (`"100.0049"` contre `"100.00"` : pas d'écart ; `"100.005"` contre `"100.01"` : pas d'écart — le cas qui départage l'arrondi du - dépôt de l'arrondi bancaire) ; boutons d'action absents pour Consultation ; total en `big.js` (`0.1 + 0.2`) ; + dépôt de l'arrondi bancaire ; et `"-100.005"` contre `"-100.01"` — l'écart est **signé**, et la référence + `vat-purchase.ts:12` ne vaut que pour des montants positifs) ; boutons d'action absents pour Consultation ; total en `big.js` (`0.1 + 0.2`) ; `formatChfBalance` sur une chaîne à 4 décimales ; - **E2E** (sélecteurs `data-testid`, jamais un libellé traduit — garde `e2e-selecteurs-traduits`) — testids : `homepage-entry-row`, `homepage-entries-unavailable`, `homepage-invoices-open-count`, `homepage-invoices-open-total`, @@ -170,7 +183,8 @@ verrait rien), compte non lié (`null`), ordre de la liste. Il est **exempté** **AC 8 — Le manuel et le CHANGELOG.** `user-manual.tex` § *Tableau de bord* réécrit : les trois tuiles telles qu'elles sont, le solde **comptable** expliqué (le grand livre, pas la banque ; il ne reflète un encaissement qu'une fois celui-ci comptabilisé), le dernier relevé et l'écart, et ce que voit un rôle Consultation. PDF régénéré, contrôlé -**aplati**. Le manuel renvoie à l'**import bancaire** pour l'origine du relevé (le solde de clôture du fichier CAMT). La capture +**aplati**. Le manuel dit que l'écart tient compte des **dates de valeur** des mouvements rapprochés, et ses limites (une écriture +saisie à la main n'est pas reliée au relevé). Le manuel renvoie à l'**import bancaire** pour l'origine du relevé (le solde de clôture du fichier CAMT). La capture `dashboard.png` (`% TODO capture`, `:220`) ne correspondra plus : limite assumée, déjà marquée. Le glossaire (« Actif : liquidités, créances… », `:2065`) parle de liquidités au sens comptable : **inchangé**. Manuels DE/IT/EN : un README chacun, rien à traduire. CHANGELOG, section `## [0.12.1] — Non publié` : `Fixed` (#388, #389), sous la section `### Changed` **existante** @@ -224,6 +238,13 @@ un solde de clôture** — un import CSV n'en a pas ; la section *Import bancair - La correction de date de valeur ne connaît que les écritures **issues d'un rapprochement** (`matched_entry_id`). Une écriture saisie à la main pour un mouvement bancaire, à une date différente de sa comptabilisation par la banque, n'est pas corrigée — l'écart le montre, et c'est juste : rien ne relie cette écriture au relevé. +- **Résidu après annulation de rapprochement** : une transaction comptabilisée par la banque **après** `period_to`, dont + l'écriture d'origine était **antérieure ou égale** et dont le rapprochement a été annulé (la contre-passation est + datée du jour), redevient `pending` et sort de la correction — le grand livre à `period_to` porte l'écriture, le + relevé non : écart fictif. Rare. +- La correction parcourt toutes les transactions rapprochées du compte antérieures à `period_to` à chaque ouverture de + l'accueil (`idx_bank_transactions_pending` sert la recherche). Acceptable à cette échelle ; `EXPLAIN` relevé à la mise + en œuvre. ### Modules @@ -249,6 +270,13 @@ un solde de clôture** — un import CSV n'en a pas ; la section *Import bancair ## Change Log +- **2026-10-03** — Validation P3 (Sonnet, prompt `25-6-a-validate-prompt-p3.md`) : **0 CRITICAL/HIGH, 2 MED, 4 LOW**, + retenus. La correction somme la **ligne de l'écriture sur le compte lié actuel**, pas `amount` — juste après un + changement de lien (M1) ; le contrat de requête impose une table dérivée par compte bancaire, non-régression avec + transactions rapprochées présentes (M2) ; tests annulation, lien changé, chemin facture, arrondi négatif (L1) ; + résidu après annulation et performance en limites (L2, L4) ; `period_to` et `CLBD` reformulés (L3) ; manuel : + correction et limites de la date de valeur (LOW). La P3 a vérifié que la ligne bancaire vaut `amount` sur les cinq + chemins de rapprochement et le sens de la correction (chiffré). Trend : P1 4H/7M → P2 1H/6M → P3 2M. - **2026-10-03** — Arbitrage de Guy (« ok, vas-y ») : **H1 par la voie (a)** — l'écart est corrigé par les transactions rapprochées de part et d'autre de la date du relevé, la date de l'écriture étant lue via `matched_entry_id` ; **pas de découpage**. From 238dda934ba9a40702de31c9d0428941bf82fa6c Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sat, 3 Oct 2026 17:44:04 +0200 Subject: [PATCH 10/20] =?UTF-8?q?docs(25-6-a):=20prompt=20de=20validation?= =?UTF-8?q?=20P4=20cibl=C3=A9e=20(refs=20#388,=20refs=20#389)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-6-a-validate-prompt-p4.md | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 _bmad-output/implementation-artifacts/25-6-a-validate-prompt-p4.md diff --git a/_bmad-output/implementation-artifacts/25-6-a-validate-prompt-p4.md b/_bmad-output/implementation-artifacts/25-6-a-validate-prompt-p4.md new file mode 100644 index 00000000..584b68ec --- /dev/null +++ b/_bmad-output/implementation-artifacts/25-6-a-validate-prompt-p4.md @@ -0,0 +1,35 @@ +# Prompt — validation P4 ciblée, Story 25-6-a + +*Versionné le 2026-10-03. **Une lentille** (Haiku), contexte frais — passe ciblée sur la remédiation de P3. Trend : +P1 4H/7M → P2 1H/6M → P3 2M/4L.* + +Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-6-a-tableau-de-bord`. **Diff à relire, un seul commit, aplati : +`git diff 27ef4413 71f0d3d1`** (la fiche `_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md`). La fiche +décrit du travail **à faire** : un finding qui reproche au code de ne pas encore le porter sera rejeté. + +## Lentille — regression hunter + +1. **Résidus de l'ancienne règle** : la correction somme désormais la **ligne de l'écriture sur le compte lié**, plus + `bank_transactions.amount`. Reste-t-il une phrase de la fiche qui parle de sommer `amount` pour la correction ? + `grep -nF "amount" ` — lis chaque occurrence et dis si elle concerne la correction. +2. **Le sens de la correction**, chiffré : relevé au 30 (`CLBD` 1000), une transaction rapprochée de +200 comptabilisée + le 30, écriture le 31 portant `débit 200` sur le compte lié. Solde comptable au 30 = 800 ; correction = ? ; écart = ? + Puis le cas inverse (comptabilisée le 31, écriture le 30). Puis un lien changé : l'écriture porte sur l'ancien compte — + que vaut `SUM(jel.debit − jel.credit)` sur le compte lié actuel ? +3. **Cohérence** : les cas de test ajoutés (annulation, lien changé, chemin facture, arrondi négatif) contredisent-ils une + limite assumée ou un autre AC ? La limite « résidu après annulation » est-elle compatible avec le test « un + rapprochement annulé : hors de la correction » ? +4. **Références ajoutées** : `camt053/mod.rs:336`, `reconciliation.rs:1270`, `reconciliation_cancel.rs:331`, + `bank_accounts.rs` (`set_journal_account_id_for_company`) — existent-elles et disent-elles ce qu'affirme la fiche ? + +## Ce que tu rends + +Findings avec sévérité, endroit, **preuve obligatoire : la commande ET sa sortie, ou le calcul** — un finding sans preuve +sera rejeté, un « 0 finding » sans les preuves des quatre vérifications aussi. ⛔ La liste des axes exercés ET 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/*` dont +`scripts/prepare-release.sh`, `make`, `latexmk`, `git commit`/`add`/`checkout`, `sqlx`, `cargo test`/`nextest`, +`npm run`, `npx`, `gh issue create`/`comment`/`edit`). Autorisés : lecture, `grep`, `sed`, `git log`/`show`/`diff`. From 91ca244f961c8095f5da2512d6652fec79e14581 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sat, 3 Oct 2026 17:46:34 +0200 Subject: [PATCH 11/20] =?UTF-8?q?docs(25-6-a):=20validation=20P4=20cibl?= =?UTF-8?q?=C3=A9e=20=E2=80=94=200=20finding,=20boucle=20close=20(refs=20#?= =?UTF-8?q?388,=20refs=20#389)?= 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-6-a-tableau-de-bord.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md b/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md index c9c3a8ac..dec2918b 100644 --- a/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md +++ b/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md @@ -270,6 +270,11 @@ un solde de clôture** — un import CSV n'en a pas ; la section *Import bancair ## Change Log +- **2026-10-03** — Validation P4 ciblée (Haiku, prompt `25-6-a-validate-prompt-p4.md`) : **0 finding**, preuves des + quatre vérifications fournies. ⚠️ Son **cas 2 chiffré est mal posé** (il garde le grand livre à 800 alors que + l'écriture du 30 y figure, d'où un « écart −400 volontaire ») — **refait par l'orchestrateur** : grand livre au 30 = 1000, + relevé = 800 (mouvement comptabilisé le 31), correction −200, écart **nul** ; la règle de la fiche est juste. **Boucle + close** : P1 4H/7M (Sonnet ×3) → P2 1H/6M (Opus) → P3 2M (Sonnet) → P4 0 (Haiku). - **2026-10-03** — Validation P3 (Sonnet, prompt `25-6-a-validate-prompt-p3.md`) : **0 CRITICAL/HIGH, 2 MED, 4 LOW**, retenus. La correction somme la **ligne de l'écriture sur le compte lié actuel**, pas `amount` — juste après un changement de lien (M1) ; le contrat de requête impose une table dérivée par compte bancaire, non-régression avec From 8713c9de0bc0afdc683eff1df755dd1b8b753f06 Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sat, 3 Oct 2026 17:47:51 +0200 Subject: [PATCH 12/20] =?UTF-8?q?test(25-6-a):=20non-r=C3=A9gression=20des?= =?UTF-8?q?=20soldes=20bancaires,=20verte=20contre=20le=20code=20actuel=20?= =?UTF-8?q?(refs=20#389)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Écrite AVANT la réécriture de list_by_company_with_balances : fige currentBalance, lastTransactionDate et l'ordre de la liste au JSON près, avec une transaction rapprochée présente (détecte un produit cartésien). Co-Authored-By: Claude Opus 5.5 --- .../25-6-a-tableau-de-bord.md | 2 +- .../sprint-status.yaml | 2 +- crates/kesh-api/tests/bank_accounts_e2e.rs | 202 ++++++++++++++++++ 3 files changed, 204 insertions(+), 2 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md b/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md index dec2918b..fe252129 100644 --- a/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md +++ b/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md @@ -1,6 +1,6 @@ # Story 25.6-a : Le tableau de bord dit vrai — dernières écritures, factures ouvertes, solde comptable -Status: ready-for-dev +Status: in-progress **Issues : [#388], [#389]**, que cette story **ferme** : la PR porte `closes #388, closes #389` dans le **titre ET le corps**. Branche `story/25-6-a-tableau-de-bord`, partie de `main` (`d7c74f02`). diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index b6c284c9..fa23a2c0 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -371,7 +371,7 @@ development_status: 25-5-b-balance-solde-ouverture: done # 2026-10-03 CREEE, validee (3 passes), implementee, revue close en 2 passes (P1 1 MED -> P2 0) (partie de main). ouverture + mouvements + cloture, ligne calculee du resultat reporte, closes #385. [#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: split # 2026-10-03 DECOUPEE en 25-6-a (#388 #389) et 25-6-b (#387). [#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*. - 25-6-a-tableau-de-bord: ready-for-dev # 2026-10-03 CREEE (partie de main). [#388] [#389] — dernieres ecritures branchees, factures ouvertes chiffrees (tout role), solde COMPTABLE nomme + dernier releve et ecart ; closes #388 #389. + 25-6-a-tableau-de-bord: in-progress # 2026-10-03 CREEE, validee (4 passes) (partie de main). [#388] [#389] — dernieres ecritures branchees, factures ouvertes chiffrees (tout role), solde COMPTABLE nomme + dernier releve et ecart ; closes #388 #389. 25-6-b-pdf-facture-archive: backlog # [#387] — figer le PDF de la facture a la validation (patron des justificatifs entrants : SHA-256, ON DELETE RESTRICT). 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 diff --git a/crates/kesh-api/tests/bank_accounts_e2e.rs b/crates/kesh-api/tests/bank_accounts_e2e.rs index 1ca9687c..ca05bf77 100644 --- a/crates/kesh-api/tests/bank_accounts_e2e.rs +++ b/crates/kesh-api/tests/bank_accounts_e2e.rs @@ -997,3 +997,205 @@ async fn delete_primary_unique_is_allowed_ac10(pool: MySqlPool) { assert_eq!(resp.status(), 200); } + +// =========================================================================== +// Story 25-6-a (#389) — non-régression des soldes, écrite et verte CONTRE LE +// CODE D'AVANT la réécriture de `list_by_company_with_balances` (commit +// séparé). Elle fige ce que la route rend aujourd'hui, au JSON près : une +// assertion sur des `Decimal` ne verrait pas `"0"` devenir `"0.0000"`. +// =========================================================================== + +async fn insert_fiscal_year_2026(pool: &MySqlPool, company_id: i64) -> i64 { + sqlx::query( + "INSERT INTO fiscal_years (company_id, name, start_date, end_date, status) \ + VALUES (?, 'Exercice 2026', '2026-01-01', '2026-12-31', 'Open')", + ) + .bind(company_id) + .execute(pool) + .await + .unwrap() + .last_insert_id() as i64 +} + +/// Écriture équilibrée à deux lignes, en SQL brut. Renvoie son id. +#[allow(clippy::too_many_arguments)] +async fn insert_entry( + pool: &MySqlPool, + company_id: i64, + fiscal_year_id: i64, + number: i64, + date: &str, + debit_account: i64, + credit_account: i64, + amount: &str, +) -> i64 { + let entry_id = sqlx::query( + "INSERT INTO journal_entries (company_id, fiscal_year_id, entry_number, entry_date, journal, description) \ + VALUES (?, ?, ?, ?, 'Banque', 'écriture de test')", + ) + .bind(company_id) + .bind(fiscal_year_id) + .bind(number) + .bind(date) + .execute(pool) + .await + .unwrap() + .last_insert_id() as i64; + for (order, account, debit, credit) in [ + (1, debit_account, amount, "0"), + (2, credit_account, "0", amount), + ] { + sqlx::query( + "INSERT INTO journal_entry_lines (entry_id, account_id, line_order, debit, credit) \ + VALUES (?, ?, ?, ?, ?)", + ) + .bind(entry_id) + .bind(account) + .bind(order) + .bind(debit) + .bind(credit) + .execute(pool) + .await + .unwrap(); + } + entry_id +} + +async fn add_bank_account(pool: &MySqlPool, company_id: i64, iban: &str) -> i64 { + bank_accounts::create( + pool, + NewBankAccount { + company_id, + bank_name: "PostFinance".into(), + iban: iban.into(), + qr_iban: None, + is_primary: false, + }, + ) + .await + .unwrap() + .id +} + +async fn link(pool: &MySqlPool, bank_account_id: i64, account_id: i64) { + sqlx::query("UPDATE bank_accounts SET journal_account_id = ? WHERE id = ?") + .bind(account_id) + .bind(bank_account_id) + .execute(pool) + .await + .unwrap(); +} + +#[sqlx::test(migrations = "../kesh-db/test-schema")] +async fn list_bank_accounts_balances_non_regression(pool: MySqlPool) { + let ctx = setup_full(&pool, "Acme", "CH4431999123000889012", Role::Consultation).await; + let fy = insert_fiscal_year_2026(&pool, ctx.company_id).await; + let revenue = create_account( + &pool, + ctx.company_id, + ctx.user_id, + "3200", + "Ventes", + AccountType::Revenue, + ) + .await; + let other_asset = create_account( + &pool, + ctx.company_id, + ctx.user_id, + "1021", + "Banque 2", + AccountType::Asset, + ) + .await; + + // A : lié, deux écritures (+500, −120). + link(&pool, ctx.bank_account_id, ctx.asset_account_id).await; + let e1 = insert_entry( + &pool, + ctx.company_id, + fy, + 1, + "2026-03-10", + ctx.asset_account_id, + revenue, + "500.00", + ) + .await; + insert_entry( + &pool, + ctx.company_id, + fy, + 2, + "2026-04-02", + revenue, + ctx.asset_account_id, + "120.00", + ) + .await; + // B : lié, aucune écriture. C : non lié. + let b = add_bank_account(&pool, ctx.company_id, "CH9300762011623852957").await; + link(&pool, b, other_asset).await; + let c = add_bank_account(&pool, ctx.company_id, "CH5604835012345678009").await; + + // Une transaction RAPPROCHÉE présente sur A : la réécriture ne doit pas + // multiplier les lignes du grand livre par les transactions. + let import_id = sqlx::query( + "INSERT INTO bank_imports \ + (company_id, bank_account_id, filename, file_hash, source_format, period_from, period_to, \ + closing_balance, transaction_count, imported_by_user_id) \ + VALUES (?, ?, 'r.xml', 'b1b2c3d4e5f6789012345678901234567890123456789012345678901234abcd', \ + 'CAMT053', '2026-03-01', '2026-03-31', 500.00, 1, ?)", + ) + .bind(ctx.company_id) + .bind(ctx.bank_account_id) + .bind(ctx.user_id) + .execute(&pool) + .await + .unwrap() + .last_insert_id() as i64; + sqlx::query( + "INSERT INTO bank_transactions \ + (company_id, import_id, bank_account_id, booking_date, amount, currency, details, status, matched_entry_id) \ + VALUES (?, ?, ?, '2026-03-10', 500.00, 'CHF', 'tx', 'reconciled', ?)", + ) + .bind(ctx.company_id) + .bind(import_id) + .bind(ctx.bank_account_id) + .bind(e1) + .execute(&pool) + .await + .unwrap(); + + let app = spawn_app(pool.clone()).await; + let resp = app + .client + .get(app.url("/api/v1/bank-accounts")) + .bearer_auth(&ctx.jwt) + .send() + .await + .unwrap(); + assert_eq!(resp.status(), 200); + let body: Value = resp.json().await.unwrap(); + let got: Vec<(i64, Value, Value)> = body + .as_array() + .expect("liste") + .iter() + .map(|r| { + ( + r["id"].as_i64().unwrap(), + r["currentBalance"].clone(), + r["lastTransactionDate"].clone(), + ) + }) + .collect(); + assert_eq!( + got, + vec![ + (ctx.bank_account_id, json!("380.0000"), json!("2026-04-02")), + (b, json!("0"), Value::Null), + (c, Value::Null, Value::Null), + ], + "soldes, dates et ordre de la liste, au JSON près" + ); +} From 297003c2f8941e7d0220485b64dd2b2286f9c8eb Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sat, 3 Oct 2026 17:51:52 +0200 Subject: [PATCH 13/20] =?UTF-8?q?feat(25-6-a):=20le=20dernier=20relev?= =?UTF-8?q?=C3=A9=20et=20le=20solde=20comptable=20=C3=A0=20sa=20date,=20co?= =?UTF-8?q?rrig=C3=A9=20des=20dates=20de=20valeur=20(refs=20#389)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- crates/kesh-api/src/routes/bank_accounts.rs | 25 +- crates/kesh-api/tests/bank_accounts_e2e.rs | 57 +++ .../kesh-db/src/repositories/bank_accounts.rs | 235 +++++++--- .../tests/bank_account_statement_gap.rs | 429 ++++++++++++++++++ 4 files changed, 673 insertions(+), 73 deletions(-) create mode 100644 crates/kesh-db/tests/bank_account_statement_gap.rs diff --git a/crates/kesh-api/src/routes/bank_accounts.rs b/crates/kesh-api/src/routes/bank_accounts.rs index 2e085e55..61caf8ce 100644 --- a/crates/kesh-api/src/routes/bank_accounts.rs +++ b/crates/kesh-api/src/routes/bank_accounts.rs @@ -125,8 +125,18 @@ pub struct ListBankAccountsQuery { pub struct BankAccountWithBalance { #[serde(flatten)] pub account: BankAccount, + /// **Solde comptable** du compte de grand livre lié (pas le solde bancaire). pub current_balance: Option, pub last_transaction_date: Option, + /// Story 25-6-a (#389) — solde de clôture du dernier relevé importé qui en + /// porte un (CAMT ; un import CSV n'en a pas). + pub statement_closing_balance: Option, + /// Date de ce relevé (`period_to`). + pub statement_date: Option, + /// Solde comptable à `statement_date`, corrigé des dates de valeur ; `null` + /// sans relevé, sans compte lié, ou si plusieurs comptes bancaires partagent + /// le compte de grand livre. + pub ledger_balance_at_statement: Option, } // =========================================================================== @@ -352,13 +362,14 @@ pub async fn list_bank_accounts( let payload: Vec = rows .into_iter() - .map( - |(account, current_balance, last_transaction_date)| BankAccountWithBalance { - account, - current_balance, - last_transaction_date, - }, - ) + .map(|(account, balances)| BankAccountWithBalance { + account, + current_balance: balances.current_balance, + last_transaction_date: balances.last_transaction_date, + statement_closing_balance: balances.statement_closing_balance, + statement_date: balances.statement_date, + ledger_balance_at_statement: balances.ledger_balance_at_statement, + }) .collect(); Ok(Json(payload)) diff --git a/crates/kesh-api/tests/bank_accounts_e2e.rs b/crates/kesh-api/tests/bank_accounts_e2e.rs index ca05bf77..3a50dbfe 100644 --- a/crates/kesh-api/tests/bank_accounts_e2e.rs +++ b/crates/kesh-api/tests/bank_accounts_e2e.rs @@ -1199,3 +1199,60 @@ async fn list_bank_accounts_balances_non_regression(pool: MySqlPool) { "soldes, dates et ordre de la liste, au JSON près" ); } + +/// Story 25-6-a (#389) — les trois champs neufs traversent la frontière HTTP, en +/// chaînes décimales (jamais des nombres JSON). +#[sqlx::test(migrations = "../kesh-db/test-schema")] +async fn list_bank_accounts_exposes_the_last_statement(pool: MySqlPool) { + let ctx = setup_full(&pool, "Acme", "CH4431999123000889012", Role::Consultation).await; + let fy = insert_fiscal_year_2026(&pool, ctx.company_id).await; + let revenue = create_account( + &pool, + ctx.company_id, + ctx.user_id, + "3200", + "Ventes", + AccountType::Revenue, + ) + .await; + link(&pool, ctx.bank_account_id, ctx.asset_account_id).await; + insert_entry( + &pool, + ctx.company_id, + fy, + 1, + "2026-03-10", + ctx.asset_account_id, + revenue, + "500.00", + ) + .await; + sqlx::query( + "INSERT INTO bank_imports \ + (company_id, bank_account_id, filename, file_hash, source_format, period_from, period_to, \ + closing_balance, transaction_count, imported_by_user_id) \ + VALUES (?, ?, 'r.xml', REPEAT('c', 64), 'CAMT053', '2026-03-01', '2026-03-31', 480.00, 0, ?)", + ) + .bind(ctx.company_id) + .bind(ctx.bank_account_id) + .bind(ctx.user_id) + .execute(&pool) + .await + .unwrap(); + + let app = spawn_app(pool.clone()).await; + let body: Value = app + .client + .get(app.url("/api/v1/bank-accounts")) + .bearer_auth(&ctx.jwt) + .send() + .await + .unwrap() + .json() + .await + .unwrap(); + let a = &body.as_array().expect("liste")[0]; + assert_eq!(a["statementClosingBalance"], json!("480.00")); + assert_eq!(a["statementDate"], json!("2026-03-31")); + assert_eq!(a["ledgerBalanceAtStatement"], json!("500.0000")); +} diff --git a/crates/kesh-db/src/repositories/bank_accounts.rs b/crates/kesh-db/src/repositories/bank_accounts.rs index c89287ba..fb91e0fb 100644 --- a/crates/kesh-db/src/repositories/bank_accounts.rs +++ b/crates/kesh-db/src/repositories/bank_accounts.rs @@ -597,91 +597,194 @@ pub async fn acquire_company_sentinel_lock( Ok(()) } +/// Soldes d'un compte bancaire, tels que la liste les rend (Story v014-1, +/// Story 25-6-a #389). +#[derive(Debug, Clone, Default, PartialEq)] +pub struct BankAccountBalances { + /// **Solde comptable** du compte de grand livre lié — `SUM(debit) − + /// SUM(credit)`, toutes dates. `None` sans compte lié ; `0` si le compte lié + /// n'a aucune ligne. + pub current_balance: Option, + /// `MAX(entry_date)` des lignes du compte lié. + pub last_transaction_date: Option, + /// Solde de clôture du **dernier relevé** importé qui en porte un (CAMT ; + /// un import CSV n'en a jamais) — `period_to` le plus récent, départagé par + /// `imported_at` puis `id`. + pub statement_closing_balance: Option, + /// `period_to` de ce relevé. + pub statement_date: Option, + /// Solde comptable du compte lié **à `statement_date` inclus**, corrigé des + /// dates de valeur (voir [`list_by_company_with_balances`]). `None` sans + /// relevé, sans compte lié, ou quand **plusieurs** comptes bancaires + /// partagent le compte de grand livre (son solde ne s'attribue à aucun). + pub ledger_balance_at_statement: Option, +} + +/// Agrégats d'un compte bancaire, lus en une requête (voir +/// [`list_by_company_with_balances`]). +#[derive(Debug, sqlx::FromRow)] +struct BalancesRow { + bank_account_id: i64, + balance: Option, + last_entry_date: Option, + closing_balance: Option, + period_to: Option, + ledger_at: Option, + booked_before_entered_after: Option, + booked_after_entered_before: Option, + sharing: Option, +} + /// Liste les comptes bancaires avec leurs soldes calculés + date dernière -/// transaction depuis `journal_entry_lines`. +/// transaction depuis `journal_entry_lines`, et le dernier relevé. /// /// Story v014-1 T5 (FINDING-10 Pass 3 Opus — périmètre du calcul) : /// - **Pas de filtre de status** : `journal_entries` n'a pas de colonne -/// `status` ; toute écriture insérée est par construction validée (la -/// double-partie est balanced et toutes les FK existent — il n'y a pas -/// de notion de draft v0.1). Donc toutes les `journal_entry_lines` -/// participent au solde. -/// - Pas de filtre `fiscal_year_id` : « solde depuis création » v0.1. -/// - Pas de rollup hiérarchique (uniquement sur `journal_account_id` exact — -/// pas sur les enfants `parent_id`). Tooltip helper text AC#27 recommande -/// de lier le bank_account au sous-compte spécifique. -/// - **F13 Pass 1 code review (AC#30)** : retourne aussi `last_transaction_date` -/// = `MAX(je.entry_date)` agrégé sur le `journal_account_id` du compte. -/// `None` si journal_account_id NULL OU aucune écriture sur ce compte. +/// `status` ; toute écriture insérée est par construction validée. Donc +/// toutes les `journal_entry_lines` participent au solde. +/// - Pas de filtre `fiscal_year_id` : « solde depuis création ». +/// - Pas de rollup hiérarchique (uniquement sur `journal_account_id` exact). +/// - `last_transaction_date` = `MAX(je.entry_date)` sur le compte lié. +/// +/// # Le dernier relevé et l'écart (Story 25-6-a, #389) /// -/// Retourne `Vec<(BankAccount, Option, Option)>` — le -/// solde et la date sont `None` si le bank_account n'a pas de -/// `journal_account_id` configuré (`L4`). +/// Le solde comptable n'est **pas** le solde bancaire. Pour les confronter, la +/// liste rend le solde de clôture du dernier relevé portant un solde, et le +/// solde comptable **à sa date**. ⚠️ Le relevé reflète les mouvements par date +/// de **comptabilisation bancaire** (`booking_date`), alors que les écritures de +/// rapprochement sont datées à la date de **valeur** : le solde à la date du +/// relevé est donc **corrigé** des transactions rapprochées dont les deux dates +/// tombent de part et d'autre de `period_to` — `+` le mouvement que leur +/// écriture porte sur le compte lié quand la banque l'a comptabilisé avant (ou +/// le jour même) et l'écriture après, `−` dans le cas inverse. On somme la +/// **ligne de l'écriture sur le compte lié actuel**, pas `amount` : une écriture +/// posée sur un ancien compte lié sort d'elle-même de la correction. Une +/// transaction **non rapprochée** n'y entre pas — son absence du grand livre est +/// l'écart à montrer. +/// +/// # Forme +/// +/// Une requête agrégée **par compte bancaire** ; chaque somme dans sa propre +/// table dérivée ou sous-requête corrélée. ⛔ Ne jamais joindre +/// `bank_transactions` dans le même `FROM` que les lignes du grand livre : le +/// produit multiplierait ces lignes et fausserait les sommes. pub async fn list_by_company_with_balances( pool: &MySqlPool, company_id: i64, include_archived: bool, -) -> Result< - Vec<( - BankAccount, - Option, - Option, - )>, - DbError, -> { +) -> Result, DbError> { let accounts = list_by_company(pool, company_id, include_archived).await?; if accounts.is_empty() { return Ok(Vec::new()); } - let account_ids: Vec = accounts - .iter() - .filter_map(|b| b.journal_account_id) - .collect(); - - if account_ids.is_empty() { - return Ok(accounts.into_iter().map(|b| (b, None, None)).collect()); - } - - let mut builder = sqlx::QueryBuilder::::new( - "SELECT jel.account_id, \ - COALESCE(SUM(jel.debit) - SUM(jel.credit), 0) AS balance, \ - MAX(je.entry_date) AS last_entry_date \ - FROM journal_entry_lines jel \ - INNER JOIN journal_entries je ON jel.entry_id = je.id \ - WHERE je.company_id = ", - ); - builder.push_bind(company_id); - builder.push(" AND jel.account_id IN ("); - let mut sep = builder.separated(", "); - for id in &account_ids { - sep.push_bind(*id); - } - builder.push(") GROUP BY jel.account_id"); - - let rows: Vec<(i64, rust_decimal::Decimal, Option)> = builder - .build_query_as() - .fetch_all(pool) - .await - .map_err(map_db_error)?; + let rows: Vec = sqlx::query_as( + "SELECT ba.id AS bank_account_id, \ + agg.balance, agg.last_entry_date, \ + st.closing_balance, st.period_to, \ + CASE WHEN st.period_to IS NULL OR ba.journal_account_id IS NULL THEN NULL ELSE \ + (SELECT COALESCE(SUM(jel.debit) - SUM(jel.credit), 0) \ + FROM journal_entry_lines jel \ + INNER JOIN journal_entries je ON jel.entry_id = je.id \ + WHERE je.company_id = ba.company_id \ + AND jel.account_id = ba.journal_account_id \ + AND je.entry_date <= st.period_to) END AS ledger_at, \ + CASE WHEN st.period_to IS NULL OR ba.journal_account_id IS NULL THEN NULL ELSE \ + (SELECT COALESCE(SUM(jel.debit) - SUM(jel.credit), 0) \ + FROM journal_entry_lines jel \ + INNER JOIN journal_entries je ON jel.entry_id = je.id \ + WHERE je.company_id = ba.company_id \ + AND jel.account_id = ba.journal_account_id \ + AND je.entry_date > st.period_to \ + AND je.id IN (SELECT bt.matched_entry_id FROM bank_transactions bt \ + WHERE bt.bank_account_id = ba.id AND bt.company_id = ba.company_id \ + AND bt.status = 'reconciled' AND bt.matched_entry_id IS NOT NULL \ + AND bt.booking_date <= st.period_to)) END \ + AS booked_before_entered_after, \ + CASE WHEN st.period_to IS NULL OR ba.journal_account_id IS NULL THEN NULL ELSE \ + (SELECT COALESCE(SUM(jel.debit) - SUM(jel.credit), 0) \ + FROM journal_entry_lines jel \ + INNER JOIN journal_entries je ON jel.entry_id = je.id \ + WHERE je.company_id = ba.company_id \ + AND jel.account_id = ba.journal_account_id \ + AND je.entry_date <= st.period_to \ + AND je.id IN (SELECT bt.matched_entry_id FROM bank_transactions bt \ + WHERE bt.bank_account_id = ba.id AND bt.company_id = ba.company_id \ + AND bt.status = 'reconciled' AND bt.matched_entry_id IS NOT NULL \ + AND bt.booking_date > st.period_to)) END \ + AS booked_after_entered_before, \ + CAST(shared.n AS SIGNED) AS sharing \ + FROM bank_accounts ba \ + LEFT JOIN ( \ + SELECT jel.account_id, \ + COALESCE(SUM(jel.debit) - SUM(jel.credit), 0) AS balance, \ + MAX(je.entry_date) AS last_entry_date \ + FROM journal_entry_lines jel \ + INNER JOIN journal_entries je ON jel.entry_id = je.id \ + WHERE je.company_id = ? \ + GROUP BY jel.account_id \ + ) agg ON agg.account_id = ba.journal_account_id \ + LEFT JOIN ( \ + SELECT bank_account_id, closing_balance, period_to, \ + ROW_NUMBER() OVER (PARTITION BY bank_account_id \ + ORDER BY period_to DESC, imported_at DESC, id DESC) AS rn \ + FROM bank_imports \ + WHERE company_id = ? AND closing_balance IS NOT NULL \ + ) st ON st.bank_account_id = ba.id AND st.rn = 1 \ + LEFT JOIN ( \ + SELECT journal_account_id, COUNT(*) AS n \ + FROM bank_accounts \ + WHERE company_id = ? AND journal_account_id IS NOT NULL \ + GROUP BY journal_account_id \ + ) shared ON shared.journal_account_id = ba.journal_account_id \ + WHERE ba.company_id = ?", + ) + .bind(company_id) + .bind(company_id) + .bind(company_id) + .bind(company_id) + .fetch_all(pool) + .await + .map_err(map_db_error)?; - use std::collections::HashMap; - let agg_by_account: HashMap)> = rows - .into_iter() - .map(|(aid, bal, dt)| (aid, (bal, dt))) - .collect(); + let by_bank_account: std::collections::HashMap = + rows.into_iter().map(|r| (r.bank_account_id, r)).collect(); Ok(accounts .into_iter() - .map(|b| match b.journal_account_id { - Some(aid) => match agg_by_account.get(&aid) { - Some((balance, date)) => (b, Some(*balance), *date), - // journal_account_id existe mais aucune ligne → solde = 0.00, - // date = None. - None => (b, Some(rust_decimal::Decimal::ZERO), None), - }, - None => (b, None, None), + .map(|b| { + let balances = match (b.journal_account_id, by_bank_account.get(&b.id)) { + (Some(_), Some(r)) => { + // Le partage se compte sur TOUS les comptes de la société, + // archivés compris : la réponse ne dépend pas d'`include_archived`. + let shared = r.sharing.unwrap_or(1) > 1; + let ledger_balance_at_statement = match ( + r.ledger_at, + r.booked_before_entered_after, + r.booked_after_entered_before, + ) { + (Some(at), Some(plus), Some(minus)) if !shared => Some(at + plus - minus), + _ => None, + }; + BankAccountBalances { + // Compte lié sans aucune ligne → 0 (comportement v014-1). + current_balance: Some(r.balance.unwrap_or(rust_decimal::Decimal::ZERO)), + last_transaction_date: r.last_entry_date, + statement_closing_balance: r.closing_balance, + statement_date: r.period_to, + ledger_balance_at_statement, + } + } + // Sans compte lié : ni solde comptable ni écart ; le relevé reste. + (None, Some(r)) => BankAccountBalances { + statement_closing_balance: r.closing_balance, + statement_date: r.period_to, + ..Default::default() + }, + (_, None) => BankAccountBalances::default(), + }; + (b, balances) }) .collect()) } diff --git a/crates/kesh-db/tests/bank_account_statement_gap.rs b/crates/kesh-db/tests/bank_account_statement_gap.rs new file mode 100644 index 00000000..6ff48c72 --- /dev/null +++ b/crates/kesh-db/tests/bank_account_statement_gap.rs @@ -0,0 +1,429 @@ +//! Le dernier relevé et le solde comptable à sa date — Story 25-6-a (#389). +//! +//! Le solde comptable n'est pas le solde bancaire : la liste des comptes +//! bancaires rend le solde de clôture du dernier relevé et le solde comptable à +//! sa date, **corrigé des dates de valeur** (le relevé compte par date de +//! comptabilisation bancaire, les écritures de rapprochement par date de +//! valeur). Chaque test nomme la mutation qu'il tue. +//! +//! Pré-requis : MariaDB démarré. + +use chrono::NaiveDate; +use kesh_db::entities::NewBankAccount; +use kesh_db::repositories::bank_accounts::{self, BankAccountBalances}; +use kesh_db::test_fixtures::{SeededCompany, seed_accounting_company}; +use rust_decimal::Decimal; +use rust_decimal_macros::dec; +use sqlx::MySqlPool; + +fn ymd(y: i32, m: u32, d: u32) -> NaiveDate { + NaiveDate::from_ymd_opt(y, m, d).unwrap() +} + +async fn bank_account(pool: &MySqlPool, seeded: &SeededCompany, iban: &str) -> i64 { + bank_accounts::create( + pool, + NewBankAccount { + company_id: seeded.company_id, + bank_name: "Banque".into(), + iban: iban.into(), + qr_iban: None, + is_primary: false, + }, + ) + .await + .expect("compte bancaire") + .id +} + +async fn link(pool: &MySqlPool, bank_account_id: i64, account_id: i64) { + sqlx::query("UPDATE bank_accounts SET journal_account_id = ? WHERE id = ?") + .bind(account_id) + .bind(bank_account_id) + .execute(pool) + .await + .unwrap(); +} + +/// Écriture équilibrée à deux lignes, en SQL brut (numéro unique par test). +async fn entry( + pool: &MySqlPool, + seeded: &SeededCompany, + date: NaiveDate, + debit: i64, + credit: i64, + amount: Decimal, +) -> i64 { + let n: i64 = sqlx::query_scalar( + "SELECT COALESCE(MAX(entry_number), 0) + 1 FROM journal_entries WHERE company_id = ?", + ) + .bind(seeded.company_id) + .fetch_one(pool) + .await + .unwrap(); + let id = sqlx::query( + "INSERT INTO journal_entries (company_id, fiscal_year_id, entry_number, entry_date, journal, description) \ + VALUES (?, ?, ?, ?, 'Banque', 'test')", + ) + .bind(seeded.company_id) + .bind(seeded.fiscal_year_id) + .bind(n) + .bind(date) + .execute(pool) + .await + .unwrap() + .last_insert_id() as i64; + for (order, account, d, c) in [ + (1, debit, amount, Decimal::ZERO), + (2, credit, Decimal::ZERO, amount), + ] { + sqlx::query( + "INSERT INTO journal_entry_lines (entry_id, account_id, line_order, debit, credit) VALUES (?, ?, ?, ?, ?)", + ) + .bind(id) + .bind(account) + .bind(order) + .bind(d) + .bind(c) + .execute(pool) + .await + .unwrap(); + } + id +} + +/// Un import ; `closing` `None` = un import sans solde (CSV). Renvoie son id. +async fn import( + pool: &MySqlPool, + seeded: &SeededCompany, + bank_account_id: i64, + period_to: NaiveDate, + closing: Option, +) -> i64 { + let n: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM bank_imports") + .fetch_one(pool) + .await + .unwrap(); + sqlx::query( + "INSERT INTO bank_imports \ + (company_id, bank_account_id, filename, file_hash, source_format, period_from, period_to, \ + closing_balance, transaction_count, imported_by_user_id) \ + VALUES (?, ?, 'r.xml', ?, 'CAMT053', '2026-01-01', ?, ?, 0, ?)", + ) + .bind(seeded.company_id) + .bind(bank_account_id) + .bind(format!("{n:064}")) + .bind(period_to) + .bind(closing) + .bind(seeded.admin_user_id) + .execute(pool) + .await + .unwrap() + .last_insert_id() as i64 +} + +/// Une transaction bancaire ; `matched` = l'écriture qui la rapproche. +async fn tx( + pool: &MySqlPool, + seeded: &SeededCompany, + bank_account_id: i64, + import_id: i64, + booking: NaiveDate, + amount: Decimal, + matched: Option, +) { + sqlx::query( + "INSERT INTO bank_transactions \ + (company_id, import_id, bank_account_id, booking_date, amount, currency, details, status, matched_entry_id) \ + VALUES (?, ?, ?, ?, ?, 'CHF', 'tx', ?, ?)", + ) + .bind(seeded.company_id) + .bind(import_id) + .bind(bank_account_id) + .bind(booking) + .bind(amount) + .bind(if matched.is_some() { "reconciled" } else { "pending" }) + .bind(matched) + .execute(pool) + .await + .unwrap(); +} + +async fn balances(pool: &MySqlPool, seeded: &SeededCompany, id: i64) -> BankAccountBalances { + bank_accounts::list_by_company_with_balances(pool, seeded.company_id, true) + .await + .unwrap() + .into_iter() + .find(|(b, _)| b.id == id) + .expect("compte présent") + .1 +} + +const IBAN_A: &str = "CH9300762011623852957"; +const IBAN_B: &str = "CH5604835012345678009"; + +/// Un compte lié à 1100 (Banque CI), un compte de produits pour la contrepartie. +async fn linked(pool: &MySqlPool) -> (SeededCompany, i64, i64, i64) { + let seeded = seed_accounting_company(pool).await.unwrap(); + let ba = bank_account(pool, &seeded, IBAN_A).await; + let bank = seeded.accounts["1100"]; + link(pool, ba, bank).await; + let sales = seeded.accounts["3000"]; + (seeded, ba, bank, sales) +} + +/// ⛔ Le dernier relevé est le plus récent **en date**, pas en ordre d'import ; +/// à date égale, le dernier importé. Mutation tuée : un tri par `imported_at`. +#[sqlx::test(migrations = "../kesh-db/test-schema")] +async fn le_dernier_releve_est_le_plus_recent_en_date(pool: MySqlPool) { + let (seeded, ba, _, _) = linked(&pool).await; + import(&pool, &seeded, ba, ymd(2026, 3, 31), Some(dec!(300))).await; + import(&pool, &seeded, ba, ymd(2026, 2, 28), Some(dec!(200))).await; // importé APRÈS, plus ancien + let b = balances(&pool, &seeded, ba).await; + assert_eq!(b.statement_date, Some(ymd(2026, 3, 31))); + assert_eq!(b.statement_closing_balance, Some(dec!(300))); + + import(&pool, &seeded, ba, ymd(2026, 3, 31), Some(dec!(310))).await; // même date, importé après + assert_eq!( + balances(&pool, &seeded, ba).await.statement_closing_balance, + Some(dec!(310)) + ); +} + +/// Un import sans solde (CSV) plus récent ne masque pas le relevé CAMT. +/// Mutation tuée : le filtre `closing_balance IS NOT NULL` retiré. +#[sqlx::test(migrations = "../kesh-db/test-schema")] +async fn un_import_sans_solde_ne_masque_pas_le_releve(pool: MySqlPool) { + let (seeded, ba, _, _) = linked(&pool).await; + import(&pool, &seeded, ba, ymd(2026, 3, 31), Some(dec!(300))).await; + import(&pool, &seeded, ba, ymd(2026, 4, 30), None).await; + assert_eq!( + balances(&pool, &seeded, ba).await.statement_date, + Some(ymd(2026, 3, 31)) + ); +} + +/// ⛔ Le solde comptable À LA DATE du relevé : l'écriture du jour même y entre, +/// celle du lendemain non ; un relevé daté après la dernière écriture rend le +/// solde courant. Mutation tuée : `<=` → `<`, ou la borne retirée. +#[sqlx::test(migrations = "../kesh-db/test-schema")] +async fn le_solde_comptable_a_la_date_du_releve(pool: MySqlPool) { + let (seeded, ba, bank, sales) = linked(&pool).await; + entry(&pool, &seeded, ymd(2026, 3, 31), bank, sales, dec!(100)).await; + entry(&pool, &seeded, ymd(2026, 4, 1), bank, sales, dec!(50)).await; + import(&pool, &seeded, ba, ymd(2026, 3, 31), Some(dec!(100))).await; + let b = balances(&pool, &seeded, ba).await; + assert_eq!(b.ledger_balance_at_statement, Some(dec!(100))); + assert_eq!(b.current_balance, Some(dec!(150))); + + import(&pool, &seeded, ba, ymd(2026, 5, 31), Some(dec!(150))).await; + assert_eq!( + balances(&pool, &seeded, ba) + .await + .ledger_balance_at_statement, + Some(dec!(150)) + ); +} + +/// ⛔ La date de valeur : un crédit comptabilisé par la banque le jour du relevé +/// et rapproché par une écriture du lendemain — et le cas inverse — ne +/// produisent AUCUN écart. Mutation tuée : la correction retirée. +#[sqlx::test(migrations = "../kesh-db/test-schema")] +async fn la_date_de_valeur_ne_cree_pas_d_ecart(pool: MySqlPool) { + let (seeded, ba, bank, sales) = linked(&pool).await; + let base = entry(&pool, &seeded, ymd(2026, 3, 10), bank, sales, dec!(800)).await; + let late = entry(&pool, &seeded, ymd(2026, 4, 1), bank, sales, dec!(200)).await; + let early = entry(&pool, &seeded, ymd(2026, 3, 31), bank, sales, dec!(70)).await; + let imp = import(&pool, &seeded, ba, ymd(2026, 3, 31), Some(dec!(1000))).await; + tx( + &pool, + &seeded, + ba, + imp, + ymd(2026, 3, 10), + dec!(800), + Some(base), + ) + .await; + // Comptabilisé par la banque le 31, écriture le 1er : la banque l'a, le + // grand livre au 31 non. + tx( + &pool, + &seeded, + ba, + imp, + ymd(2026, 3, 31), + dec!(200), + Some(late), + ) + .await; + // Comptabilisé le 1er, écriture le 31 : le grand livre l'a, la banque non. + tx( + &pool, + &seeded, + ba, + imp, + ymd(2026, 4, 1), + dec!(70), + Some(early), + ) + .await; + + let b = balances(&pool, &seeded, ba).await; + // Grand livre au 31 = 800 + 70 ; + 200 − 70 = 1000 = le relevé. + assert_eq!(b.ledger_balance_at_statement, Some(dec!(1000))); + assert_eq!(b.statement_closing_balance, Some(dec!(1000))); +} + +/// Une transaction NON rapprochée du jour du relevé n'est pas corrigée : son +/// absence du grand livre est l'écart. Mutation tuée : `status` ignoré. +#[sqlx::test(migrations = "../kesh-db/test-schema")] +async fn une_transaction_non_rapprochee_reste_un_ecart(pool: MySqlPool) { + let (seeded, ba, bank, sales) = linked(&pool).await; + let e = entry(&pool, &seeded, ymd(2026, 4, 2), bank, sales, dec!(200)).await; + let imp = import(&pool, &seeded, ba, ymd(2026, 3, 31), Some(dec!(200))).await; + // Rapprochement annulé : `pending`, `matched_entry_id` remis à NULL. + tx(&pool, &seeded, ba, imp, ymd(2026, 3, 31), dec!(200), None).await; + let _ = e; + assert_eq!( + balances(&pool, &seeded, ba) + .await + .ledger_balance_at_statement, + Some(Decimal::ZERO) + ); +} + +/// ⛔ Le lien changé après des rapprochements : les écritures portent sur +/// l'ANCIEN compte et sortent de la correction. Mutation tuée : sommer +/// `bank_transactions.amount` au lieu de la ligne de l'écriture. +#[sqlx::test(migrations = "../kesh-db/test-schema")] +async fn un_lien_change_sort_de_la_correction(pool: MySqlPool) { + let (seeded, ba, bank, sales) = linked(&pool).await; + let late = entry(&pool, &seeded, ymd(2026, 4, 1), bank, sales, dec!(200)).await; + let imp = import(&pool, &seeded, ba, ymd(2026, 3, 31), Some(dec!(200))).await; + tx( + &pool, + &seeded, + ba, + imp, + ymd(2026, 3, 31), + dec!(200), + Some(late), + ) + .await; + // Relié à la caisse, qui ne porte aucune de ces écritures. + link(&pool, ba, seeded.accounts["1000"]).await; + assert_eq!( + balances(&pool, &seeded, ba) + .await + .ledger_balance_at_statement, + Some(Decimal::ZERO) + ); +} + +/// Un compte de PASSIF lié (ligne de crédit tirée de 1000) : solde comptable +/// et relevé de même signe — `débit − crédit` est la convention du relevé. +#[sqlx::test(migrations = "../kesh-db/test-schema")] +async fn un_compte_de_passif_lie_a_le_signe_du_releve(pool: MySqlPool) { + let seeded = seed_accounting_company(&pool).await.unwrap(); + let ba = bank_account(&pool, &seeded, IBAN_A).await; + let credit_line = seeded.accounts["2000"]; // Capital CI, de type Liability + link(&pool, ba, credit_line).await; + entry( + &pool, + &seeded, + ymd(2026, 3, 5), + seeded.accounts["4000"], + credit_line, + dec!(1000), + ) + .await; + import(&pool, &seeded, ba, ymd(2026, 3, 31), Some(dec!(-1000))).await; + let b = balances(&pool, &seeded, ba).await; + assert_eq!(b.ledger_balance_at_statement, Some(dec!(-1000))); + assert_eq!(b.statement_closing_balance, Some(dec!(-1000))); +} + +/// ⛔ Deux comptes bancaires sur le MÊME compte de grand livre — l'un archivé : +/// le solde ne s'attribue à aucun, pas d'écart. Mutation tuée : le partage +/// compté sur les seuls comptes actifs, ou pas compté du tout. +#[sqlx::test(migrations = "../kesh-db/test-schema")] +async fn un_compte_de_grand_livre_partage_n_a_pas_d_ecart(pool: MySqlPool) { + let (seeded, ba, bank, sales) = linked(&pool).await; + let other = bank_account(&pool, &seeded, IBAN_B).await; + link(&pool, other, bank).await; + sqlx::query("UPDATE bank_accounts SET archived = TRUE WHERE id = ?") + .bind(other) + .execute(&pool) + .await + .unwrap(); + entry(&pool, &seeded, ymd(2026, 3, 5), bank, sales, dec!(100)).await; + import(&pool, &seeded, ba, ymd(2026, 3, 31), Some(dec!(100))).await; + let actives = bank_accounts::list_by_company_with_balances(&pool, seeded.company_id, false) + .await + .unwrap(); + let mine = &actives.iter().find(|(b, _)| b.id == ba).expect("présent").1; + assert_eq!(mine.ledger_balance_at_statement, None); + assert_eq!( + mine.current_balance, + Some(dec!(100)), + "le solde comptable reste" + ); +} + +/// Sans compte lié : ni solde comptable ni écart, le relevé reste. +#[sqlx::test(migrations = "../kesh-db/test-schema")] +async fn sans_compte_lie_le_releve_reste(pool: MySqlPool) { + let seeded = seed_accounting_company(&pool).await.unwrap(); + let ba = bank_account(&pool, &seeded, IBAN_A).await; + import(&pool, &seeded, ba, ymd(2026, 3, 31), Some(dec!(42))).await; + let b = balances(&pool, &seeded, ba).await; + assert_eq!(b.current_balance, None); + assert_eq!(b.ledger_balance_at_statement, None); + assert_eq!(b.statement_closing_balance, Some(dec!(42))); +} + +/// Isolation : le relevé et les écritures d'une autre société n'entrent pas. +#[sqlx::test(migrations = "../kesh-db/test-schema")] +async fn une_autre_societe_n_entre_pas(pool: MySqlPool) { + let (seeded, ba, bank, sales) = linked(&pool).await; + entry(&pool, &seeded, ymd(2026, 3, 5), bank, sales, dec!(100)).await; + // Une seconde société, son compte bancaire et son relevé — en SQL brut, la + // fixture ne se pose qu'une fois par base. + let other_company = sqlx::query( + "INSERT INTO companies (name, address, org_type, accounting_language, instance_language) \ + VALUES ('Autre SA', 'Rue 2', 'Pme', 'FR', 'FR')", + ) + .execute(&pool) + .await + .unwrap() + .last_insert_id() as i64; + let oba = bank_accounts::create( + &pool, + NewBankAccount { + company_id: other_company, + bank_name: "Autre".into(), + iban: IBAN_B.into(), + qr_iban: None, + is_primary: false, + }, + ) + .await + .unwrap() + .id; + sqlx::query( + "INSERT INTO bank_imports \ + (company_id, bank_account_id, filename, file_hash, source_format, period_from, period_to, \ + closing_balance, transaction_count, imported_by_user_id) \ + VALUES (?, ?, 'o.xml', REPEAT('f', 64), 'CAMT053', '2026-01-01', '2026-03-31', 999, 0, ?)", + ) + .bind(other_company) + .bind(oba) + .bind(seeded.admin_user_id) + .execute(&pool) + .await + .unwrap(); + let b = balances(&pool, &seeded, ba).await; + assert_eq!(b.statement_closing_balance, None); + assert_eq!(b.current_balance, Some(dec!(100))); +} From 9e17de0c28b762d7c2de9d3d127114e19c1a110d Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sat, 3 Oct 2026 18:14:49 +0200 Subject: [PATCH 14/20] =?UTF-8?q?feat(25-6-a):=20le=20tableau=20de=20bord?= =?UTF-8?q?=20dit=20vrai=20=E2=80=94=20=C3=A9critures=20branch=C3=A9es,=20?= =?UTF-8?q?factures=20chiffr=C3=A9es,=20solde=20comptable=20et=20=C3=A9car?= =?UTF-8?q?t=20au=20relev=C3=A9=20(refs=20#388,=20refs=20#389)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Trois tuiles extraites dans features/homepage, testables isolément ; montants en chaînes et big.js ; total dédoublonné par compte de grand livre ; dernier relevé CAMT et écart corrigé des dates de valeur ; manuel et CHANGELOG. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 4 + .../25-6-a-tableau-de-bord.md | 80 ++++++- .../sprint-status.yaml | 2 +- crates/kesh-i18n/locales/de-CH/messages.ftl | 13 +- crates/kesh-i18n/locales/en-CH/messages.ftl | 13 +- crates/kesh-i18n/locales/fr-CH/messages.ftl | 13 +- crates/kesh-i18n/locales/it-CH/messages.ftl | 13 +- docs/manual/fr/user-manual.pdf | Bin 302018 -> 305254 bytes docs/manual/fr/user-manual.tex | 50 ++++- .../BankAccountJournalLinkForm.test.ts | 3 + .../bank-accounts/bank-accounts.api.test.ts | 3 + .../bank-accounts/bank-accounts.api.ts | 33 ++- .../src/lib/features/bank-accounts/format.ts | 10 +- .../features/homepage/BankAccountsCard.svelte | 99 +++++++++ .../features/homepage/HomepageCards.test.ts | 184 ++++++++++++++++ .../features/homepage/OpenInvoicesCard.svelte | 82 +++++++ .../homepage/RecentEntriesCard.svelte | 60 +++++ .../lib/features/homepage/homepage.test.ts | 98 +++++++++ .../src/lib/features/homepage/homepage.ts | 71 ++++++ frontend/src/lib/shared/i18n-keys.test.ts | 22 +- frontend/src/routes/(app)/+page.svelte | 206 ++++++------------ .../routes/(app)/bank-accounts/+page.svelte | 2 +- frontend/tests/e2e/helpers/api-fixtures.ts | 35 +++ frontend/tests/e2e/homepage-dashboard.spec.ts | 103 +++++++++ 24 files changed, 1012 insertions(+), 187 deletions(-) create mode 100644 frontend/src/lib/features/homepage/BankAccountsCard.svelte create mode 100644 frontend/src/lib/features/homepage/HomepageCards.test.ts create mode 100644 frontend/src/lib/features/homepage/OpenInvoicesCard.svelte create mode 100644 frontend/src/lib/features/homepage/RecentEntriesCard.svelte create mode 100644 frontend/src/lib/features/homepage/homepage.test.ts create mode 100644 frontend/src/lib/features/homepage/homepage.ts create mode 100644 frontend/tests/e2e/homepage-dashboard.spec.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 25986289..e120cc9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ Le contenu est rédigé en français à destination des **fiduciaires, PME, ind ### Fixed +- **Le tableau de bord disait faux ([#388](https://github.com/guycorbaz/kesh/issues/388), [#389](https://github.com/guycorbaz/kesh/issues/389)).** La tuile *Dernières écritures* n'appelait rien et affichait « Aucune écriture » sur une comptabilité pleine ; elle liste désormais les cinq dernières écritures. *Factures ouvertes* n'affichait aucun montant et, pour un rôle Consultation, toujours « Aucune facture ouverte » : elle donne maintenant le nombre de factures ouvertes et leur **reste dû**, dont la part échue, à tous les rôles. Une tuile qui ne peut pas se charger le dit. Le solde des comptes bancaires est nommé **solde comptable** — il vient du grand livre, pas de la banque —, et la tuile le confronte au **dernier relevé CAMT importé** : solde du relevé, date et **écart**, corrigé des dates de valeur des mouvements rapprochés. Un compte du grand livre partagé par plusieurs comptes bancaires n'est plus compté deux fois dans le total, et les soldes ne passent plus par des nombres flottants. + - **La balance des comptes ne concordait pas avec le bilan ([#385](https://github.com/guycorbaz/kesh/issues/385)).** Elle ne montrait que les **mouvements** de la période : le compte « clients » de la balance 2026 ne valait pas celui du bilan 2026, qui reporte les soldes depuis l'origine. Deux rapports, un compte, deux nombres — c'est ce qu'un réviseur trouve en dix minutes. **Désormais**, chaque compte porte son **solde d'ouverture**, ses mouvements et son **solde de clôture**. Un compte de bilan reporte son solde depuis l'origine ; un compte de produits ou de charges repart de zéro au début de l'exercice. La clôture d'un compte de bilan **est** son solde au bilan ; celle d'un compte de résultat est son montant **depuis le début de l'exercice** — égal au compte de résultat quand la période commence au premier jour de l'exercice —, et ouverture comme clôture concordent toujours avec le grand livre. Une ligne **« Résultat reporté (calculé) »** porte le résultat des exercices antérieurs, qu'aucun compte ne porte faute d'écriture de clôture, et un **contrôle ✓/⚠️** vérifie que les ouvertures s'équilibrent avec elle (écrit en toutes lettres dans le PDF quand il tombe). Un compte archivé figure tant qu'il porte un solde. @@ -52,6 +54,8 @@ Le contenu est rédigé en français à destination des **fiduciaires, PME, ind ### Changed +- **« Total liquidités » devient « Total (solde comptable) »** sur le tableau de bord ([#389](https://github.com/guycorbaz/kesh/issues/389)) : le chiffre est le solde du grand livre, pas l'argent en banque. *(API : `GET /api/v1/bank-accounts` ajoute `statementClosingBalance`, `statementDate` et `ledgerBalanceAtStatement` ; les montants restent des chaînes décimales.)* + - **La balance des comptes change de colonnes — écran, PDF et CSV ([#385](https://github.com/guycorbaz/kesh/issues/385)).** Ouverture | Débit | Crédit | Clôture : la colonne **« Solde »**, qui était le net des mouvements de la période et se prenait pour un solde de compte, disparaît de l'écran et du PDF. ⚠️ **Dans le CSV, la colonne `Solde` est remplacée** par `SoldeOuverture` (avant `TotalDebit`) et `SoldeCloture` (en dernier) : un outil qui lit ce fichier par position doit être adapté. Le CSV porte aussi la ligne du résultat reporté. *(API : `openingBalance` et `closingBalance` par compte, `retainedEarnings` et `openingBalanced` au rapport ; `balance` garde son sens — le net des mouvements.)* - **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-6-a-tableau-de-bord.md b/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md index fe252129..a9b27a1f 100644 --- a/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md +++ b/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md @@ -1,6 +1,6 @@ # Story 25.6-a : Le tableau de bord dit vrai — dernières écritures, factures ouvertes, solde comptable -Status: in-progress +Status: review **Issues : [#388], [#389]**, que cette story **ferme** : la PR porte `closes #388, closes #389` dans le **titre ET le corps**. Branche `story/25-6-a-tableau-de-bord`, partie de `main` (`d7c74f02`). @@ -194,10 +194,10 @@ un solde de clôture** — un import CSV n'en a pas ; la section *Import bancair ## Tasks / Subtasks -- [ ] **T1 — le dernier relevé et le solde à sa date** (AC 4, 6), `kesh-db` `bank_accounts.rs`. -- [ ] **T2 — le DTO** (AC 4, 6), `kesh-api` `routes/bank_accounts.rs`. -- [ ] **T3 — les montants en chaînes** (AC 5), `bank-accounts.api.ts`, `format.ts`, page des comptes bancaires, fixtures. -- [ ] **T4 — l'accueil** (AC 1, 2, 3, 4) : trois composants extraits dans `features/homepage/`, la page qui les +- [x] **T1 — le dernier relevé et le solde à sa date** (AC 4, 6), `kesh-db` `bank_accounts.rs`. +- [x] **T2 — le DTO** (AC 4, 6), `kesh-api` `routes/bank_accounts.rs`. +- [x] **T3 — les montants en chaînes** (AC 5), `bank-accounts.api.ts`, `format.ts`, page des comptes bancaires, fixtures. +- [x] **T4 — l'accueil** (AC 1, 2, 3, 4) : trois composants extraits dans `features/homepage/`, la page qui les alimente ; l'i18n (4 locales, parité, `sitesTotal`, relevé des libellés en dur). Les composants appellent `i18nMsg` **directement** (la garde `lint-i18n-ownership` ne lit que `i18nMsg(`, `scripts/lint-i18n-ownership.js:151` — le relais `msg()` de la page lui échappe). **Clés neuves** : `homepage-entries-unavailable`, @@ -207,9 +207,9 @@ un solde de clôture** — un import CSV n'en a pas ; la section *Import bancair `homepage-bank-statement` (« Relevé du { $date } : { $amount } », date au format suisse), `homepage-bank-gap` (« Écart : { $amount } ») ; `homepage-invoices-empty-guided` **réécrite** sans « première » ; `homepage-bank-total-liquidity` **retirée**. -- [ ] **T5 — tests** (AC 7). -- [ ] **T6 — manuel, CHANGELOG** (AC 8). -- [ ] **T7 — gates** : backend complet, frontend complet, **E2E complet**. +- [x] **T5 — tests** (AC 7). +- [x] **T6 — manuel, CHANGELOG** (AC 8). +- [x] **T7 — gates** : backend complet, frontend complet, **E2E complet**. ## Dev Notes @@ -262,14 +262,78 @@ un solde de clôture** — un import CSV n'en a pas ; la section *Import bancair ### Agent Model Used +Claude Opus 5.5 (`claude-opus-5-5`). + ### Debug Log References +- Deux erreurs de montage dans les tests `kesh-db`, corrigées avant toute conclusion : l'archivage d'un compte bancaire + est la colonne `archived` (pas `active`) ; `seed_accounting_company` ne se pose qu'une fois par base (`admin` est + unique) — la seconde société est montée en SQL brut. +- Garde-fous i18n recomptés depuis la source, pas ajustés : la page d'accueil pesait 17 sites (15 appels par son relais + `msg()`, sa déclaration, son corps) et en pèse 24 (1 + 23 dans les trois tuiles) — `sitesTotal` 1758 → 1765 ; le relais + disparaît — `relais` 7 → 6, `sitesNonResolus` 34 → 32. + ### Completion Notes List +- **T1, le dernier relevé et le solde à sa date** — `list_by_company_with_balances` rend désormais une + `BankAccountBalances` par compte : `current_balance` et `last_transaction_date` **inchangés** (même expression), plus le + dernier relevé portant un solde (`ROW_NUMBER()` sur `period_to`, `imported_at`, `id`), le solde comptable à sa date et + sa **correction de date de valeur** (deux sous-requêtes corrélées sur les lignes de l'écriture rapprochée, sur le compte + lié actuel, dédoublonnées par `je.id IN (…)`), et le décompte du partage (tous les comptes de la société, archivés + compris). Une requête agrégée par appel, chaque somme dans sa propre table dérivée ou sous-requête — aucune jointure + `bank_transactions` dans le `FROM` des lignes du grand livre. +- **Non-régression, commit séparé et antérieur** (`8713c9de`) : verte contre le code d'origine, puis contre le code + réécrit — JSON `"380.0000"`, `"0"`, `null`, ordre de la liste, avec une transaction rapprochée présente. +- **T2, le DTO** — trois champs neufs, documentés. +- **T3, les montants en chaînes** — `currentBalance` et les champs neufs restent des chaînes ; `formatChfBalance` prend une + chaîne ou un `Big` (arrondi `big.js` demi loin de zéro, puis `Number` d'un montant déjà au centime) ; champs neufs + optionnels côté `Raw`, normalisés à `null` ; fixtures complétées. +- **T4, l'accueil** — trois tuiles extraites dans `features/homepage/` (`RecentEntriesCard`, `OpenInvoicesCard`, + `BankAccountsCard`), calculs purs dans `homepage.ts` (`entryAmount`, `ledgerTotal` dédoublonné, `statementGap` au + centime). La page charge les quatre sources en parallèle. Dix clés neuves × 4 locales, `homepage-invoices-empty-guided` + réécrite, `homepage-bank-total-liquidity` retirée (parité : 28 clés `homepage-*` par locale). +- ⚠️ **Écart à la fiche** : le testid `homepage-invoices-open-total` est remplacé par un attribut `data-amount` sur + `homepage-invoices-open-count` — un élément `sr-only` portant le montant brut l'aurait fait lire deux fois aux lecteurs + d'écran. +- ⚠️ **Couverture E2E du relevé et de l'écart** : non exercée en E2E (il faudrait un import CAMT réel) ; tenue par les dix + tests `kesh-db` et par le Vitest de `BankAccountsCard`. Le passage axe porte sur l'accueil peuplé d'une écriture, d'une + facture et d'un compte bancaire, sans relevé. +- **T5, tests** — **périmètre : de `91ca244f` (validation close, aucun code) à l'arbre de travail** : + - `kesh-db` **+10** (`bank_account_statement_gap.rs`, neuf) ; + - `kesh-api` **+2** (`bank_accounts_e2e.rs` : non-régression, forme des champs neufs) ; + - Vitest **+20** (`homepage.test.ts` 9, `HomepageCards.test.ts` 11) ; + - E2E **+4** (`homepage-dashboard.spec.ts`, neuf) et le helper `createJournalEntryViaApi`. +- **Gates** (T7) : base remise à zéro, `scripts/test-fast.sh` **2559/2559, 4 ignorés** (fmt, clippy, nextest) ; frontend + `check` 0 erreur, `lint-i18n-ownership` PASS, `test:unit` **865/865**, `build` OK ; **E2E complet** sur `kesh_e2e` + reconstruite (run de 16:04 UTC) : **232 passés, 8 échoués, 19 ignorés** — les 8 attendus (KF-029 ×7, + `sidebar-navigation:75` KF-052) ; les 4 tests de `homepage-dashboard.spec.ts` verts. +- **Mutations tuées** (`kesh-db`) : tri par ordre d'import ; imports sans solde admis ; borne `<` au lieu de `<=` (2 + tests) ; correction de date de valeur retirée ; partage compté sur les seuls comptes actifs. +- **T6, manuel et CHANGELOG** — § *Tableau de bord* réécrit, sous-section *Solde comptable, relevé et écart* (dates de + valeur, leurs deux limites, CAMT seul), `\label{sec:import-bancaire}` et une phrase à l'import bancaire ; PDF régénéré + et contrôlé aplati. CHANGELOG `[0.12.1]` : `Fixed` (#388, #389) et `Changed`. README relu : seule mention, une + évolution prévue en v0.5+, toujours vraie. + ### File List +- `CHANGELOG.md` +- `crates/kesh-db/src/repositories/bank_accounts.rs` +- `crates/kesh-db/tests/bank_account_statement_gap.rs` (neuf) +- `crates/kesh-api/src/routes/bank_accounts.rs` +- `crates/kesh-api/tests/bank_accounts_e2e.rs` +- `crates/kesh-i18n/locales/{de-CH,en-CH,fr-CH,it-CH}/messages.ftl` +- `docs/manual/fr/user-manual.{tex,pdf}` +- `frontend/src/lib/features/bank-accounts/{bank-accounts.api.ts,format.ts,bank-accounts.api.test.ts,BankAccountJournalLinkForm.test.ts}` +- `frontend/src/lib/features/homepage/{homepage.ts,RecentEntriesCard.svelte,OpenInvoicesCard.svelte,BankAccountsCard.svelte,homepage.test.ts,HomepageCards.test.ts}` (neufs) +- `frontend/src/lib/shared/i18n-keys.test.ts` +- `frontend/src/routes/(app)/+page.svelte` +- `frontend/src/routes/(app)/bank-accounts/+page.svelte` +- `frontend/tests/e2e/helpers/api-fixtures.ts` +- `frontend/tests/e2e/homepage-dashboard.spec.ts` (neuf) + ## Change Log +- **2026-10-03** — Implémentée (dev-story) : T1–T7, gates ci-dessus. Statut → `review`. - **2026-10-03** — Validation P4 ciblée (Haiku, prompt `25-6-a-validate-prompt-p4.md`) : **0 finding**, preuves des quatre vérifications fournies. ⚠️ Son **cas 2 chiffré est mal posé** (il garde le grand livre à 800 alors que l'écriture du 30 y figure, d'où un « écart −400 volontaire ») — **refait par l'orchestrateur** : grand livre au 30 = 1000, diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index fa23a2c0..dcd70968 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -371,7 +371,7 @@ development_status: 25-5-b-balance-solde-ouverture: done # 2026-10-03 CREEE, validee (3 passes), implementee, revue close en 2 passes (P1 1 MED -> P2 0) (partie de main). ouverture + mouvements + cloture, ligne calculee du resultat reporte, closes #385. [#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: split # 2026-10-03 DECOUPEE en 25-6-a (#388 #389) et 25-6-b (#387). [#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*. - 25-6-a-tableau-de-bord: in-progress # 2026-10-03 CREEE, validee (4 passes) (partie de main). [#388] [#389] — dernieres ecritures branchees, factures ouvertes chiffrees (tout role), solde COMPTABLE nomme + dernier releve et ecart ; closes #388 #389. + 25-6-a-tableau-de-bord: review # 2026-10-03 CREEE, validee (4 passes), implementee, gates verts (partie de main). [#388] [#389] — dernieres ecritures branchees, factures ouvertes chiffrees (tout role), solde COMPTABLE nomme + dernier releve et ecart ; closes #388 #389. 25-6-b-pdf-facture-archive: backlog # [#387] — figer le PDF de la facture a la validation (patron des justificatifs entrants : SHA-256, ON DELETE RESTRICT). 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 diff --git a/crates/kesh-i18n/locales/de-CH/messages.ftl b/crates/kesh-i18n/locales/de-CH/messages.ftl index 18dcf17a..230c684d 100644 --- a/crates/kesh-i18n/locales/de-CH/messages.ftl +++ b/crates/kesh-i18n/locales/de-CH/messages.ftl @@ -124,7 +124,7 @@ homepage-entries-empty-guided = Noch keine Buchungen. Erfassen Sie Ihre erste Bu homepage-entries-action = Buchung erfassen homepage-invoices-title = Offene Rechnungen homepage-invoices-empty = Keine offenen Rechnungen. -homepage-invoices-empty-guided = Keine offenen Rechnungen. Erstellen Sie Ihre erste Rechnung. +homepage-invoices-empty-guided = Keine offenen Rechnungen. Erstellen Sie eine Rechnung. homepage-invoices-action = Rechnung erstellen homepage-reminders-count = { $n } Rechnung(en) zu mahnen homepage-bank-title = Bankkonten @@ -1017,10 +1017,19 @@ bank-accounts-toast-create-success = Bankkonto erstellt. bank-accounts-toast-update-success = Bankkonto geändert. bank-accounts-toast-archive-success = Bankkonto archiviert. # Story v014-1 — Homepage widget bank accounts (F14) -homepage-bank-total-liquidity = Liquide Mittel insgesamt homepage-bank-total-partial = (nur verbundene Konten) homepage-bank-balance-unavailable = Saldo nicht verfügbar — mit Kontenrahmen verbinden homepage-bank-last-transaction = Letzte Transaktion +homepage-entries-unavailable = Buchungen derzeit nicht verfügbar. +homepage-invoices-unavailable = Rechnungen derzeit nicht verfügbar. +homepage-invoices-open = { $n } offene Rechnung(en) — { $amount } +homepage-invoices-overdue = davon { $n } überfällig — { $amount } +homepage-bank-ledger-balance = Buchsaldo +homepage-bank-ledger-help = Aus dem Hauptbuch berechnet, nicht von der Bank. +homepage-bank-total-ledger = Total (Buchsaldo) +homepage-bank-shared-ledger-note = (ein gemeinsam genutztes Hauptbuchkonto wird nur einmal gezählt) +homepage-bank-statement = Auszug vom { $date }: { $amount } +homepage-bank-gap = Differenz: { $amount } settings-bank-manage = In Administration → Bankkonten verwalten settings-bank-manage-hint = Um ein Bankkonto hinzuzufügen, zu ändern oder zu archivieren, nutzen Sie die spezielle Seite Administration → Bankkonten. bank-accounts-toast-link-success = Bankkonto erfolgreich mit dem Kontorahmen verbunden. diff --git a/crates/kesh-i18n/locales/en-CH/messages.ftl b/crates/kesh-i18n/locales/en-CH/messages.ftl index 9ccb420e..1fcb22ee 100644 --- a/crates/kesh-i18n/locales/en-CH/messages.ftl +++ b/crates/kesh-i18n/locales/en-CH/messages.ftl @@ -124,7 +124,7 @@ homepage-entries-empty-guided = No entries yet. Start by recording your first jo homepage-entries-action = Record an entry homepage-invoices-title = Open invoices homepage-invoices-empty = No open invoices. -homepage-invoices-empty-guided = No open invoices. Create your first invoice to bill your clients. +homepage-invoices-empty-guided = No open invoices. Create an invoice to bill your clients. homepage-invoices-action = Create an invoice homepage-reminders-count = { $n } invoice(s) to follow up homepage-bank-title = Bank accounts @@ -1017,10 +1017,19 @@ bank-accounts-toast-create-success = Bank account created. bank-accounts-toast-update-success = Bank account updated. bank-accounts-toast-archive-success = Bank account archived. # Story v014-1 — Homepage widget bank accounts (F14) -homepage-bank-total-liquidity = Total liquidity homepage-bank-total-partial = (linked accounts only) homepage-bank-balance-unavailable = Balance unavailable — link to chart of accounts homepage-bank-last-transaction = Last transaction +homepage-entries-unavailable = Entries are unavailable right now. +homepage-invoices-unavailable = Invoices are unavailable right now. +homepage-invoices-open = { $n } open invoice(s) — { $amount } +homepage-invoices-overdue = of which { $n } overdue — { $amount } +homepage-bank-ledger-balance = Book balance +homepage-bank-ledger-help = Computed from the general ledger, not from the bank. +homepage-bank-total-ledger = Total (book balance) +homepage-bank-shared-ledger-note = (a shared ledger account is counted once) +homepage-bank-statement = Statement of { $date }: { $amount } +homepage-bank-gap = Difference: { $amount } settings-bank-manage = Manage in Administration → Bank accounts settings-bank-manage-hint = To add, edit or archive a bank account, use the dedicated page Administration → Bank accounts. bank-accounts-toast-link-success = Bank account successfully linked to chart of accounts. diff --git a/crates/kesh-i18n/locales/fr-CH/messages.ftl b/crates/kesh-i18n/locales/fr-CH/messages.ftl index 1da1b3e6..9c4407a4 100644 --- a/crates/kesh-i18n/locales/fr-CH/messages.ftl +++ b/crates/kesh-i18n/locales/fr-CH/messages.ftl @@ -124,7 +124,7 @@ homepage-entries-empty-guided = Aucune écriture pour le moment. Commencez par s homepage-entries-action = Saisir une écriture homepage-invoices-title = Factures ouvertes homepage-invoices-empty = Aucune facture ouverte. -homepage-invoices-empty-guided = Aucune facture ouverte. Créez votre première facture pour facturer vos clients. +homepage-invoices-empty-guided = Aucune facture ouverte. Créez une facture pour facturer vos clients. homepage-invoices-action = Créer une facture homepage-reminders-count = { $n } facture(s) à rappeler homepage-bank-title = Comptes bancaires @@ -1071,10 +1071,19 @@ bank-accounts-toast-update-success = Compte bancaire modifié. bank-accounts-toast-archive-success = Compte bancaire archivé. # Story v014-1 — Homepage widget bank accounts (F14 Pass 1 code review) -homepage-bank-total-liquidity = Total liquidités homepage-bank-total-partial = (comptes liés uniquement) homepage-bank-balance-unavailable = Solde non disponible — lier au plan comptable homepage-bank-last-transaction = Dernière transaction +homepage-entries-unavailable = Écritures indisponibles pour le moment. +homepage-invoices-unavailable = Factures indisponibles pour le moment. +homepage-invoices-open = { $n } facture(s) ouverte(s) — { $amount } +homepage-invoices-overdue = dont { $n } échue(s) — { $amount } +homepage-bank-ledger-balance = Solde comptable +homepage-bank-ledger-help = Calculé depuis le grand livre, pas depuis la banque. +homepage-bank-total-ledger = Total (solde comptable) +homepage-bank-shared-ledger-note = (un compte du grand livre partagé n'est compté qu'une fois) +homepage-bank-statement = Relevé du { $date } : { $amount } +homepage-bank-gap = Écart : { $amount } settings-bank-manage = Gérer dans Administration → Comptes bancaires settings-bank-manage-hint = Pour ajouter, modifier ou archiver un compte bancaire, utilisez la page dédiée Administration → Comptes bancaires. bank-accounts-toast-link-success = Compte bancaire lié avec succès au plan comptable. diff --git a/crates/kesh-i18n/locales/it-CH/messages.ftl b/crates/kesh-i18n/locales/it-CH/messages.ftl index 4491a46e..6b44b966 100644 --- a/crates/kesh-i18n/locales/it-CH/messages.ftl +++ b/crates/kesh-i18n/locales/it-CH/messages.ftl @@ -124,7 +124,7 @@ homepage-entries-empty-guided = Nessuna registrazione per il momento. Iniziate i homepage-entries-action = Inserire una registrazione homepage-invoices-title = Fatture aperte homepage-invoices-empty = Nessuna fattura aperta. -homepage-invoices-empty-guided = Nessuna fattura aperta. Create la vostra prima fattura per fatturare ai vostri clienti. +homepage-invoices-empty-guided = Nessuna fattura aperta. Create una fattura per fatturare ai vostri clienti. homepage-invoices-action = Creare una fattura homepage-reminders-count = { $n } fattura/e da sollecitare homepage-bank-title = Conti bancari @@ -1017,10 +1017,19 @@ bank-accounts-toast-create-success = Conto bancario creato. bank-accounts-toast-update-success = Conto bancario modificato. bank-accounts-toast-archive-success = Conto bancario archiviato. # Story v014-1 — Homepage widget bank accounts (F14) -homepage-bank-total-liquidity = Totale liquidità homepage-bank-total-partial = (solo conti collegati) homepage-bank-balance-unavailable = Saldo non disponibile — collegare al piano dei conti homepage-bank-last-transaction = Ultima transazione +homepage-entries-unavailable = Registrazioni al momento non disponibili. +homepage-invoices-unavailable = Fatture al momento non disponibili. +homepage-invoices-open = { $n } fattura/e aperta/e — { $amount } +homepage-invoices-overdue = di cui { $n } scaduta/e — { $amount } +homepage-bank-ledger-balance = Saldo contabile +homepage-bank-ledger-help = Calcolato dal libro mastro, non dalla banca. +homepage-bank-total-ledger = Totale (saldo contabile) +homepage-bank-shared-ledger-note = (un conto di mastro condiviso è contato una sola volta) +homepage-bank-statement = Estratto del { $date }: { $amount } +homepage-bank-gap = Differenza: { $amount } settings-bank-manage = Gestisci in Amministrazione → Conti bancari settings-bank-manage-hint = Per aggiungere, modificare o archiviare un conto bancario, utilizza la pagina dedicata Amministrazione → Conti bancari. bank-accounts-toast-link-success = Conto bancario collegato con successo al piano dei conti. diff --git a/docs/manual/fr/user-manual.pdf b/docs/manual/fr/user-manual.pdf index 77a65c233f26c2f3e55e9786ea54be866eed30ca..b5b84a2c53c62f7dc137b2885eee6f52b759d5b7 100644 GIT binary patch delta 131142 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 delta 127903 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

lv;TrR)V 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 RFE1A>H#{ZfHzi5<{{=lw9U=e# diff --git a/docs/manual/fr/user-manual.tex b/docs/manual/fr/user-manual.tex index 50deb098..9d71bd00 100644 --- a/docs/manual/fr/user-manual.tex +++ b/docs/manual/fr/user-manual.tex @@ -215,15 +215,49 @@ \subsection{Chemin B — Mode production} \section{Tableau de bord} Le tableau de bord est votre page d'accueil après connexion. Il présente trois -tuiles de synthèse avec un accès rapide à chaque section : +tuiles de synthèse : \keshscreenshot{dashboard.png}{Tableau de bord : dernières écritures, factures ouvertes et comptes bancaires.} % TODO capture: dashboard avec donnees demo \begin{itemize} - \item \textbf{Dernières écritures} — accès rapide au journal. - \item \textbf{Factures ouvertes} — accès rapide à la facturation. - \item \textbf{Comptes bancaires} — soldes calculés lorsque des comptes - bancaires sont configurés. + \item \textbf{Dernières écritures} — les cinq plus récentes (date, numéro, libellé, + montant), chacune menant à son détail. + \item \textbf{Factures ouvertes} — le nombre de factures validées non soldées et leur + \textbf{reste dû} total, dont la part échue. S'y ajoute, pour un comptable ou un + administrateur, le nombre de factures à rappeler. + \item \textbf{Comptes bancaires} — pour chaque compte, son \textbf{solde comptable} et, + si un relevé a été importé, le solde de ce relevé et l'écart entre les deux + (détails ci-dessous). +\end{itemize} + +Un rôle \emph{Consultation} voit les mêmes chiffres, sans les boutons de saisie. Si une +tuile ne peut pas se charger, elle le dit — elle n'affiche jamais « Aucune écriture » sur +une comptabilité qui en contient. + +\subsection{Solde comptable, relevé et écart} + +Le chiffre affiché sous chaque compte bancaire est le \textbf{solde comptable} : il vient +du compte du grand livre lié au compte bancaire (\emph{Paramètres} → \emph{Comptes +bancaires}), \textbf{pas de la banque}. Il ne reflète un encaissement qu'une fois celui-ci +comptabilisé, par un rapprochement ou un règlement. Le total ne compte qu'une fois un +compte du grand livre partagé par plusieurs comptes bancaires. + +Quand un relevé a été importé, la tuile affiche aussi \emph{Relevé du \dots} : le solde de +clôture du \textbf{dernier relevé} importé, à sa date. Seuls les relevés \textbf{CAMT.053} +portent un solde de clôture — un import CSV n'en a pas (\S\ref{sec:import-bancaire}). Si +le solde comptable à cette date diffère du relevé, la tuile affiche l'\textbf{écart} +(solde comptable − relevé) : typiquement un mouvement bancaire pas encore rapproché. + +L'écart tient compte des \textbf{dates de valeur} : la banque arrête son relevé par date de +comptabilisation, Kesh date les écritures de rapprochement à la date de valeur. Un +mouvement comptabilisé par la banque le dernier jour du relevé, mais rapproché à une date +de valeur postérieure, ne crée donc pas d'écart. Deux limites : +\begin{itemize} + \item seule une écriture \textbf{issue d'un rapprochement} est ainsi corrigée : une + écriture saisie à la main pour un mouvement bancaire, à une autre date, apparaît dans + l'écart — rien ne la relie au relevé ; + \item quand plusieurs comptes bancaires partagent un même compte du grand livre, + l'écart n'est pas affiché : le solde de ce compte ne s'attribue à aucun d'eux. \end{itemize} \begin{keshnote} @@ -1280,9 +1314,11 @@ \subsection{Importer des factures depuis un dossier} \end{keshnote} %%───────────────────────────────────────────────────────────────────────────── -\section{Import bancaire} +\section{Import bancaire}\label{sec:import-bancaire} -L'import bancaire est l'étape clé pour automatiser votre comptabilité. Kesh supporte deux formats : +L'import bancaire est l'étape clé pour automatiser votre comptabilité. Kesh supporte deux formats. +Seul le CAMT.053 porte le \textbf{solde de clôture} du relevé, que le tableau de bord confronte +au solde comptable ; un import CSV n'en a pas : \subsection{Import CAMT.053 (ISO 20022)} diff --git a/frontend/src/lib/features/bank-accounts/BankAccountJournalLinkForm.test.ts b/frontend/src/lib/features/bank-accounts/BankAccountJournalLinkForm.test.ts index 4da33811..73aaba39 100644 --- a/frontend/src/lib/features/bank-accounts/BankAccountJournalLinkForm.test.ts +++ b/frontend/src/lib/features/bank-accounts/BankAccountJournalLinkForm.test.ts @@ -53,6 +53,9 @@ function makeBankAccount(journalAccountId: number | null): BankAccountSummary { version: 3, archived: false, currentBalance: null, + statementClosingBalance: null, + statementDate: null, + ledgerBalanceAtStatement: null, lastTransactionDate: null, }; } diff --git a/frontend/src/lib/features/bank-accounts/bank-accounts.api.test.ts b/frontend/src/lib/features/bank-accounts/bank-accounts.api.test.ts index 6cb0138b..83be2097 100644 --- a/frontend/src/lib/features/bank-accounts/bank-accounts.api.test.ts +++ b/frontend/src/lib/features/bank-accounts/bank-accounts.api.test.ts @@ -38,6 +38,9 @@ describe('bank-accounts.api', () => { version: 4, archived: false, currentBalance: null, + statementClosingBalance: null, + statementDate: null, + ledgerBalanceAtStatement: null, lastTransactionDate: null, }), headers: new Headers(), diff --git a/frontend/src/lib/features/bank-accounts/bank-accounts.api.ts b/frontend/src/lib/features/bank-accounts/bank-accounts.api.ts index 146fbb98..6600ed14 100644 --- a/frontend/src/lib/features/bank-accounts/bank-accounts.api.ts +++ b/frontend/src/lib/features/bank-accounts/bank-accounts.api.ts @@ -21,22 +21,30 @@ export interface BankAccountSummary { /** Story v014-1 — true si soft-deleted (archivé). */ archived: boolean; /** - * Story v014-1 T5 — solde calculé serveur-side depuis journal_entry_lines. - * `null` si `journal_account_id` n'est pas configuré sur ce compte (L4 - * limitation v0.1 — lien plan comptable obligatoire pour calcul du solde). + * Story v014-1 T5 — **solde comptable** calculé serveur-side depuis + * journal_entry_lines (pas le solde bancaire). `null` si `journal_account_id` + * n'est pas configuré sur ce compte. * - * Décimal sérialisé en string par serde (feature `serde-str`), converti - * en `number` ici. La précision CHF (2 décimales en pratique) ne pose pas - * de problème via Number ; si v0.2 nécessite plus de précision, migrer - * vers `decimal.js`. + * Story 25-6-a (#389) — reste une **chaîne décimale** (jamais un `Number`) : + * tout calcul passe par `big.js`, tout affichage par `formatChfBalance`. */ - currentBalance: number | null; + currentBalance: string | null; /** * Story v014-1 F13 Pass 1 code review (AC#30) — date `MAX(je.entry_date)` * agrégée sur le `journal_account_id` lié. Format ISO `YYYY-MM-DD`. * `null` si journal_account_id NULL ou aucune écriture. */ lastTransactionDate: string | null; + /** Story 25-6-a — solde de clôture du dernier relevé importé (chaîne décimale). */ + statementClosingBalance: string | null; + /** Story 25-6-a — date de ce relevé (`YYYY-MM-DD`). */ + statementDate: string | null; + /** + * Story 25-6-a — solde comptable à `statementDate`, corrigé des dates de + * valeur. `null` sans relevé, sans compte lié, ou si plusieurs comptes + * bancaires partagent le compte de grand livre. + */ + ledgerBalanceAtStatement: string | null; } /** @@ -54,6 +62,10 @@ interface BankAccountSummaryRaw { archived: boolean; currentBalance: string | null; lastTransactionDate: string | null; + // Absents des réponses de mutation (POST/PUT/PATCH/DELETE rendent un compte nu). + statementClosingBalance?: string | null; + statementDate?: string | null; + ledgerBalanceAtStatement?: string | null; } function parseBankAccount(raw: BankAccountSummaryRaw): BankAccountSummary { @@ -66,8 +78,11 @@ function parseBankAccount(raw: BankAccountSummaryRaw): BankAccountSummary { journalAccountId: raw.journalAccountId, version: raw.version, archived: raw.archived, - currentBalance: raw.currentBalance == null ? null : Number(raw.currentBalance), + currentBalance: raw.currentBalance ?? null, lastTransactionDate: raw.lastTransactionDate, + statementClosingBalance: raw.statementClosingBalance ?? null, + statementDate: raw.statementDate ?? null, + ledgerBalanceAtStatement: raw.ledgerBalanceAtStatement ?? null, }; } diff --git a/frontend/src/lib/features/bank-accounts/format.ts b/frontend/src/lib/features/bank-accounts/format.ts index 3ba96b1a..14c2b85a 100644 --- a/frontend/src/lib/features/bank-accounts/format.ts +++ b/frontend/src/lib/features/bank-accounts/format.ts @@ -1,4 +1,5 @@ // Story v014-1 — utilitaires d'affichage partagés pour les bank_accounts. +import Big from 'big.js'; // F17 Pass 1 code review : factoriser `shortIban` entre `+page.svelte` // homepage et `bank-accounts/+page.svelte` pour éviter la divergence de // seuil (4 vs 8 caractères). @@ -17,11 +18,16 @@ export function shortIban(iban: string): string { /** * Formate un solde CHF avec 2 décimales (locale `fr-CH`). * `null` → message i18n « Solde non disponible » fourni par le caller. + * + * Story 25-6-a (#389) — prend une **chaîne décimale ou un `Big`**, jamais un + * `number` : l'arrondi au centime se fait en `big.js` (demi loin de zéro, + * l'arrondi du dépôt) ; seul le résultat, déjà au centime, devient un `Number` + * pour `Intl` — exact jusqu'à ~9·10¹³ CHF. */ -export function formatChfBalance(balance: number): string { +export function formatChfBalance(balance: string | Big): string { return new Intl.NumberFormat('fr-CH', { style: 'currency', currency: 'CHF', minimumFractionDigits: 2, - }).format(balance); + }).format(new Big(balance).round(2, Big.roundHalfUp).toNumber()); } diff --git a/frontend/src/lib/features/homepage/BankAccountsCard.svelte b/frontend/src/lib/features/homepage/BankAccountsCard.svelte new file mode 100644 index 00000000..575b2942 --- /dev/null +++ b/frontend/src/lib/features/homepage/BankAccountsCard.svelte @@ -0,0 +1,99 @@ + + +

+

+ {i18nMsg('homepage-bank-title', 'Comptes bancaires')} +

+

+ {i18nMsg('homepage-bank-ledger-help', 'Calculé depuis le grand livre, pas depuis la banque.')} +

+
+ {#each accounts as account (account.id)} + {@const gap = statementGap(account)} +
+
+

{account.bankName}

+

{shortIban(account.iban)}

+
+
+ {#if account.currentBalance !== null} +

+ {i18nMsg('homepage-bank-ledger-balance', 'Solde comptable')} +

+

+ {formatChfBalance(account.currentBalance)} +

+ {#if account.lastTransactionDate} +

+ {i18nMsg('homepage-bank-last-transaction', 'Dernière transaction')} : {formatSwissDate( + account.lastTransactionDate, + )} +

+ {/if} + {:else} +

+ + {i18nMsg('homepage-bank-balance-unavailable', 'Solde non disponible — lier au plan comptable')} + +

+ {/if} + {#if account.statementClosingBalance !== null && account.statementDate !== null} +

+ {i18nMsg('homepage-bank-statement', 'Relevé du { $date } : { $amount }', { + date: formatSwissDate(account.statementDate), + amount: formatChfBalance(account.statementClosingBalance), + })} +

+ {/if} + {#if gap !== null} +

+ {i18nMsg('homepage-bank-gap', 'Écart : { $amount }', { + amount: formatChfBalance(gap), + })} +

+ {/if} +
+
+ {/each} + {#if total.any} +
+

+ {i18nMsg('homepage-bank-total-ledger', 'Total (solde comptable)')} + {#if total.partial} + + {i18nMsg('homepage-bank-total-partial', '(comptes liés uniquement)')} + + {/if} + {#if total.shared} + + {i18nMsg( + 'homepage-bank-shared-ledger-note', + "(un compte du grand livre partagé n'est compté qu'une fois)", + )} + + {/if} +

+

+ {formatChfBalance(total.total)} +

+
+ {/if} +
+
diff --git a/frontend/src/lib/features/homepage/HomepageCards.test.ts b/frontend/src/lib/features/homepage/HomepageCards.test.ts new file mode 100644 index 00000000..d8f0a2ca --- /dev/null +++ b/frontend/src/lib/features/homepage/HomepageCards.test.ts @@ -0,0 +1,184 @@ +// Story 25-6-a (#388, #389) — les trois tuiles de l'accueil, isolément. +// i18nMsg est mocké pour renvoyer le fallback interpolé. +import { describe, it, expect, vi } from 'vitest'; +import { render, screen } from '@testing-library/svelte'; + +vi.mock('$lib/shared/utils/i18n.svelte', () => ({ + i18nMsg: (_key: string, fallback: string, args?: Record) => + fallback.replace(/\{ \$(\w+) \}/g, (_m, k) => String(args?.[k] ?? '')), +})); + +import RecentEntriesCard from './RecentEntriesCard.svelte'; +import OpenInvoicesCard from './OpenInvoicesCard.svelte'; +import BankAccountsCard from './BankAccountsCard.svelte'; +import type { JournalEntryResponse } from '$lib/features/journal-entries/journal-entries.types'; +import type { BankAccountSummary } from '$lib/features/bank-accounts/bank-accounts.api'; + +const entry = { + id: 7, + entryNumber: 12, + entryDate: '2026-03-10', + description: 'Vente comptoir', + lines: [ + { debit: '250.00', credit: '0' }, + { debit: '0', credit: '250.00' }, + ], +} as unknown as JournalEntryResponse; + +describe('RecentEntriesCard', () => { + it('liste les écritures avec un lien vers chacune', () => { + render(RecentEntriesCard, { state: 'ready', entries: [entry], canManage: true, isGuided: false }); + const row = screen.getByTestId('homepage-entry-row'); + expect(row.textContent).toContain('Vente comptoir'); + expect(row.textContent).toContain('250.00'); + expect(row.querySelector('a')?.getAttribute('href')).toBe('/journal-entries/7'); + }); + + it('vide : le texte vide ; vide guidé : la variante guidée', () => { + const { unmount } = render(RecentEntriesCard, { + state: 'ready', + entries: [], + canManage: true, + isGuided: false, + }); + expect(screen.getByText('Aucune écriture.')).toBeTruthy(); + unmount(); + render(RecentEntriesCard, { state: 'ready', entries: [], canManage: true, isGuided: true }); + expect(screen.getByText(/première écriture/)).toBeTruthy(); + }); + + it('un échec se dit, et prime sur la variante guidée', () => { + render(RecentEntriesCard, { state: 'error', entries: [], canManage: true, isGuided: true }); + expect(screen.getByTestId('homepage-entries-unavailable')).toBeTruthy(); + expect(screen.queryByText(/Aucune écriture/)).toBeNull(); + }); + + it('Consultation : ni bouton de saisie, ni injonction guidée', () => { + render(RecentEntriesCard, { state: 'ready', entries: [], canManage: false, isGuided: true }); + expect(screen.queryByText('Saisir une écriture')).toBeNull(); + expect(screen.getByText('Aucune écriture.')).toBeTruthy(); + }); +}); + +const summary = { unpaidCount: 3, unpaidTotal: '1250.5000', overdueCount: 1, overdueTotal: '400.00' }; + +describe('OpenInvoicesCard', () => { + it('chiffre les factures ouvertes pour un rôle Consultation, sans bouton', () => { + render(OpenInvoicesCard, { + state: 'ready', + summary, + canManage: false, + isGuided: false, + reminderCount: 0, + }); + const count = screen.getByTestId('homepage-invoices-open-count'); + expect(count.textContent).toMatch(/3 facture\(s\) ouverte\(s\) — 1.250\.50/); + expect(count.getAttribute('data-amount')).toBe('1250.5000'); + expect(screen.getByTestId('homepage-invoices-overdue').textContent).toMatch(/dont 1 échue\(s\) — 400\.00/); + expect(screen.queryByText('Créer une facture')).toBeNull(); + }); + + it('« dont M échues » absent à zéro', () => { + render(OpenInvoicesCard, { + state: 'ready', + summary: { ...summary, overdueCount: 0, overdueTotal: '0' }, + canManage: true, + isGuided: false, + reminderCount: 0, + }); + expect(screen.queryByTestId('homepage-invoices-overdue')).toBeNull(); + }); + + it('vide guidé : sans « première » ; Consultation : texte non guidé', () => { + const empty = { unpaidCount: 0, unpaidTotal: '0', overdueCount: 0, overdueTotal: '0' }; + const { unmount } = render(OpenInvoicesCard, { + state: 'ready', + summary: empty, + canManage: true, + isGuided: true, + reminderCount: 0, + }); + expect(screen.getByText(/Créez une facture/).textContent).not.toMatch(/première/); + unmount(); + render(OpenInvoicesCard, { + state: 'ready', + summary: empty, + canManage: false, + isGuided: true, + reminderCount: 0, + }); + expect(screen.getByText('Aucune facture ouverte.')).toBeTruthy(); + }); + + it('un échec se dit', () => { + render(OpenInvoicesCard, { + state: 'error', + summary: null, + canManage: true, + isGuided: false, + reminderCount: 0, + }); + expect(screen.getByTestId('homepage-invoices-unavailable')).toBeTruthy(); + }); +}); + +function account(over: Partial = {}): BankAccountSummary { + return { + id: 1, + bankName: 'UBS', + iban: 'CH4431999123000889012', + qrIban: null, + isPrimary: true, + journalAccountId: 10, + version: 1, + archived: false, + currentBalance: '800.0000', + lastTransactionDate: '2026-03-10', + statementClosingBalance: null, + statementDate: null, + ledgerBalanceAtStatement: null, + ...over, + }; +} + +describe('BankAccountsCard', () => { + it('nomme le solde « solde comptable » et le total « Total (solde comptable) »', () => { + render(BankAccountsCard, { accounts: [account()] }); + expect(screen.getByText('Solde comptable')).toBeTruthy(); + expect(screen.getByText(/Total \(solde comptable\)/)).toBeTruthy(); + expect(screen.queryByText(/liquidités/)).toBeNull(); + }); + + it('affiche le relevé, et l’écart seulement s’il est non nul', () => { + const { unmount } = render(BankAccountsCard, { + accounts: [ + account({ + statementClosingBalance: '1000.00', + statementDate: '2026-03-31', + ledgerBalanceAtStatement: '800.0000', + }), + ], + }); + expect(screen.getByTestId('homepage-bank-statement-1').textContent).toMatch(/Relevé du 31\.03\.2026/); + expect(screen.getByTestId('homepage-bank-gap-1').textContent).toMatch(/Écart/); + unmount(); + render(BankAccountsCard, { + accounts: [ + account({ + statementClosingBalance: '800.00', + statementDate: '2026-03-31', + ledgerBalanceAtStatement: '800.0000', + }), + ], + }); + expect(screen.queryByTestId('homepage-bank-gap-1')).toBeNull(); + }); + + it('compte une fois un compte de grand livre partagé, avec sa note', () => { + render(BankAccountsCard, { + accounts: [account({ id: 1 }), account({ id: 2, iban: 'CH9300762011623852957' })], + }); + expect(screen.getByTestId('homepage-bank-total').textContent).toMatch(/800\.00/); + expect(screen.getByTestId('homepage-bank-total-shared')).toBeTruthy(); + }); +}); diff --git a/frontend/src/lib/features/homepage/OpenInvoicesCard.svelte b/frontend/src/lib/features/homepage/OpenInvoicesCard.svelte new file mode 100644 index 00000000..87ba3ba2 --- /dev/null +++ b/frontend/src/lib/features/homepage/OpenInvoicesCard.svelte @@ -0,0 +1,82 @@ + + +
+

+ {i18nMsg('homepage-invoices-title', 'Factures ouvertes')} +

+ {#if state === 'error'} +

+ {i18nMsg('homepage-invoices-unavailable', 'Factures indisponibles pour le moment.')} +

+ {:else if state === 'ready' && summary && summary.unpaidCount > 0} +

+ {i18nMsg('homepage-invoices-open', '{ $n } facture(s) ouverte(s) — { $amount }', { + n: summary.unpaidCount, + amount: amount(summary.unpaidTotal), + })} +

+ {#if summary.overdueCount > 0} +

+ {i18nMsg('homepage-invoices-overdue', 'dont { $n } échue(s) — { $amount }', { + n: summary.overdueCount, + amount: amount(summary.overdueTotal), + })} +

+ {/if} + {:else if state === 'ready'} +

+ {#if isGuided && canManage} + {i18nMsg( + 'homepage-invoices-empty-guided', + 'Aucune facture ouverte. Créez une facture pour facturer vos clients.', + )} + {:else} + {i18nMsg('homepage-invoices-empty', 'Aucune facture ouverte.')} + {/if} +

+ {/if} + {#if canManage && reminderCount > 0} + +

+ + + {i18nMsg('homepage-reminders-count', '{ $n } facture(s) à rappeler', { + n: reminderCount, + })} + + +

+ {/if} + {#if canManage} + + {/if} +
diff --git a/frontend/src/lib/features/homepage/RecentEntriesCard.svelte b/frontend/src/lib/features/homepage/RecentEntriesCard.svelte new file mode 100644 index 00000000..d057d564 --- /dev/null +++ b/frontend/src/lib/features/homepage/RecentEntriesCard.svelte @@ -0,0 +1,60 @@ + + +
+

+ {i18nMsg('homepage-entries-title', 'Dernières écritures')} +

+ {#if state === 'error'} +

+ {i18nMsg('homepage-entries-unavailable', 'Écritures indisponibles pour le moment.')} +

+ {:else if state === 'ready' && entries.length > 0} + + {:else if state === 'ready'} +

+ {#if isGuided && canManage} + {i18nMsg( + 'homepage-entries-empty-guided', + 'Aucune écriture pour le moment. Commencez par saisir votre première écriture comptable.', + )} + {:else} + {i18nMsg('homepage-entries-empty', 'Aucune écriture.')} + {/if} +

+ {/if} + {#if canManage} + + {/if} +
diff --git a/frontend/src/lib/features/homepage/homepage.test.ts b/frontend/src/lib/features/homepage/homepage.test.ts new file mode 100644 index 00000000..e2fb2ad2 --- /dev/null +++ b/frontend/src/lib/features/homepage/homepage.test.ts @@ -0,0 +1,98 @@ +// Story 25-6-a (#388, #389) — les calculs de l'accueil. +import { describe, it, expect } from 'vitest'; +import type { BankAccountSummary } from '$lib/features/bank-accounts/bank-accounts.api'; +import type { JournalEntryResponse } from '$lib/features/journal-entries/journal-entries.types'; +import { entryAmount, ledgerTotal, statementGap } from './homepage'; +import { formatChfBalance } from '$lib/features/bank-accounts/format'; + +function account(over: Partial = {}): BankAccountSummary { + return { + id: 1, + bankName: 'UBS', + iban: 'CH4431999123000889012', + qrIban: null, + isPrimary: true, + journalAccountId: 10, + version: 1, + archived: false, + currentBalance: '0', + lastTransactionDate: null, + statementClosingBalance: null, + statementDate: null, + ledgerBalanceAtStatement: null, + ...over, + }; +} + +describe('ledgerTotal', () => { + it('somme en big.js — 0.1 + 0.2 vaut 0.3, pas 0.30000000000000004', () => { + const t = ledgerTotal([ + account({ id: 1, journalAccountId: 10, currentBalance: '0.1' }), + account({ id: 2, journalAccountId: 11, currentBalance: '0.2' }), + ]); + expect(t.total.toString()).toBe('0.3'); + }); + + it('ne compte qu’une fois un compte de grand livre partagé, et le signale', () => { + const t = ledgerTotal([ + account({ id: 1, journalAccountId: 10, currentBalance: '500.0000' }), + account({ id: 2, journalAccountId: 10, currentBalance: '500.0000' }), + ]); + expect(t.total.toString()).toBe('500'); + expect(t.shared).toBe(true); + }); + + it('signale un total partiel quand un compte n’est pas lié', () => { + const t = ledgerTotal([ + account({ id: 1, currentBalance: '100' }), + account({ id: 2, journalAccountId: null, currentBalance: null }), + ]); + expect(t.partial).toBe(true); + expect(t.any).toBe(true); + }); +}); + +describe('statementGap', () => { + it('rend l’écart solde comptable − relevé', () => { + const g = statementGap( + account({ ledgerBalanceAtStatement: '800.0000', statementClosingBalance: '1000.00' }), + ); + expect(g?.toString()).toBe('-200'); + }); + + it('un écart sous le centime n’en est pas un', () => { + expect( + statementGap(account({ ledgerBalanceAtStatement: '100.0049', statementClosingBalance: '100.00' })), + ).toBeNull(); + }); + + it('arrondit à mi-chemin loin de zéro, pas à l’arrondi bancaire', () => { + // Arrondi bancaire : 100.005 → 100.00, d'où un faux écart de −0.01. + expect( + statementGap(account({ ledgerBalanceAtStatement: '100.005', statementClosingBalance: '100.01' })), + ).toBeNull(); + expect( + statementGap(account({ ledgerBalanceAtStatement: '-100.005', statementClosingBalance: '-100.01' })), + ).toBeNull(); + }); + + it('sans relevé ou sans solde à sa date, pas d’écart', () => { + expect(statementGap(account({ statementClosingBalance: '10.00' }))).toBeNull(); + }); +}); + +describe('entryAmount et formatChfBalance', () => { + it('le montant d’une écriture est la somme de ses débits', () => { + const e = { + lines: [ + { debit: '120.50', credit: '0' }, + { debit: '0', credit: '120.50' }, + ], + } as unknown as JournalEntryResponse; + expect(entryAmount(e).toString()).toBe('120.5'); + }); + + it('formatChfBalance accepte une chaîne à quatre décimales', () => { + expect(formatChfBalance('1234.5650')).toMatch(/1.234\.57/); + }); +}); diff --git a/frontend/src/lib/features/homepage/homepage.ts b/frontend/src/lib/features/homepage/homepage.ts new file mode 100644 index 00000000..1fe4ade9 --- /dev/null +++ b/frontend/src/lib/features/homepage/homepage.ts @@ -0,0 +1,71 @@ +// Story 25-6-a (#388, #389) — calculs de la page d'accueil, purs et testables. +// +// ⚠️ Tout montant reste une chaîne décimale jusqu'ici et passe par `big.js` : +// jamais de `Number` sur un montant (l'ancien total des liquidités sommait des +// `Number`). + +import Big from 'big.js'; +import type { BankAccountSummary } from '$lib/features/bank-accounts/bank-accounts.api'; +import type { JournalEntryResponse } from '$lib/features/journal-entries/journal-entries.types'; + +/** Montant d'une écriture : la somme de ses débits (= celle de ses crédits). */ +export function entryAmount(entry: JournalEntryResponse): Big { + return entry.lines.reduce((acc, l) => acc.plus(new Big(l.debit)), new Big(0)); +} + +/** Total des soldes comptables de la tuile « Comptes bancaires ». */ +export interface LedgerTotal { + total: Big; + /** Au moins un compte bancaire sans compte lié (donc sans solde). */ + partial: boolean; + /** Au moins deux comptes bancaires liés au même compte de grand livre. */ + shared: boolean; + /** Au moins un solde est connu. */ + any: boolean; +} + +/** + * Somme les soldes comptables en ne comptant **chaque compte de grand livre + * qu'une fois** : deux comptes bancaires liés au même compte ont, par + * construction, le même solde (la somme porte sur le même compte) — les + * additionner le compterait deux fois. + */ +export function ledgerTotal(accounts: BankAccountSummary[]): LedgerTotal { + const seen = new Set(); + let total = new Big(0); + let shared = false; + let any = false; + for (const a of accounts) { + if (a.currentBalance === null || a.journalAccountId === null) continue; + any = true; + if (seen.has(a.journalAccountId)) { + shared = true; + continue; + } + seen.add(a.journalAccountId); + total = total.plus(new Big(a.currentBalance)); + } + const partial = any && accounts.some((a) => a.currentBalance === null); + return { total, partial, shared, any }; +} + +/** Arrondi du dépôt : au centime, demi loin de zéro. */ +function toCentime(v: string): Big { + return new Big(v).round(2, Big.roundHalfUp); +} + +/** + * Écart entre le solde comptable à la date du relevé et le relevé, **au + * centime** (solde comptable − relevé). `null` quand il ne se calcule pas + * (pas de relevé, pas de compte lié, compte de grand livre partagé) **ou quand + * il est nul** — seul un écart réel s'affiche. + */ +export function statementGap(account: BankAccountSummary): Big | null { + if (account.ledgerBalanceAtStatement === null || account.statementClosingBalance === null) { + return null; + } + const gap = toCentime(account.ledgerBalanceAtStatement).minus( + toCentime(account.statementClosingBalance), + ); + return gap.eq(0) ? null : gap; +} diff --git a/frontend/src/lib/shared/i18n-keys.test.ts b/frontend/src/lib/shared/i18n-keys.test.ts index eb8e271e..75936a0a 100644 --- a/frontend/src/lib/shared/i18n-keys.test.ts +++ b/frontend/src/lib/shared/i18n-keys.test.ts @@ -356,9 +356,18 @@ const ATTENDU = { // quatre catalogues), l'en-tête « Solde » remplacé par « Ouverture » et // « Clôture » (+1, deux clés neuves `reports-column-opening` / `-closing`), et // le libellé de la ligne calculée, qui réemploie les deux clés du bilan (+2). - sitesTotal: 1758, - sitesNonResolus: 34, - relais: 7, + // + // Story 25-6-a (#388, #389) : **1758 → 1765**, recompté par ce test et par + // `grep -o "i18nMsg(\|msg('"` aux deux bornes. La page d'accueil + // `routes/(app)/+page.svelte` pesait **17** sites — ses 15 appels par son relais + // `msg()`, plus la déclaration et le corps du relais —, elle en pèse **24** : 1 dans + // la page et 23 dans les trois tuiles extraites (`features/homepage/` + // `RecentEntriesCard` 5, `OpenInvoicesCard` 8, `BankAccountsCard` 10), qui appellent + // `i18nMsg` directement. Le relais disparaît : `relais` **7 → 6**, + // `sitesNonResolus` **34 → 32** (sa déclaration et son corps). + sitesTotal: 1765, + sitesNonResolus: 32, + relais: 6, sitesGabarit: 10, litterauxMin: 1050, clesDepuisTsMin: 5 @@ -434,8 +443,9 @@ const ANGLE_MORT_CLE_EN_COLONNE = 'routes/(app)/settings/vat-rates/+page.svelte: * ⚠️ **QUATRIÈME angle mort, écrit ici faute de pouvoir le fermer** : `findRelays` * travaille **par fichier**. Un relais qui serait *importé* d'un module partagé ne * serait recensé nulle part — et, contrairement aux autres trous, **aucun compteur ne - * bougerait**. La règle DRY du dépôt pousse vers cette extraction : les sept relais - * actuels sont sept copies de la même fonction de trois lignes. À traiter en 23-2. + * bougerait**. La règle DRY du dépôt pousse vers cette extraction : les six relais + * actuels sont six copies de la même fonction de trois lignes (sept jusqu'à la 25-6-a, + * qui a retiré celui de la page d'accueil). À traiter en 23-2. */ // ⚠️ La carte des codes d'erreur d'import est LUE depuis la production, plus recopiée : // tant qu'elle vivait dans le composant, une entrée ajoutée passait tous les gates au vert @@ -688,7 +698,7 @@ describe('garde i18n — les clés demandées existent au catalogue', () => { ).toEqual([]); }); - it('les 7 relais locaux sont recensés — cardinalité assertée', () => { + it('les 6 relais locaux sont recensés — cardinalité assertée', () => { // ⚠️ **Ce garde-fou manquait au premier jet, alors que la tâche le déclarait fait.** // Sans lui, un huitième relais ajouté sans que le test le sache rendrait TOUTES // ses clés invisibles, en silence — le défaut que le recensement des relais avait diff --git a/frontend/src/routes/(app)/+page.svelte b/frontend/src/routes/(app)/+page.svelte index 2e52478b..8457c523 100644 --- a/frontend/src/routes/(app)/+page.svelte +++ b/frontend/src/routes/(app)/+page.svelte @@ -1,72 +1,84 @@ @@ -74,110 +86,14 @@

- {msg('homepage-title', 'Tableau de bord')} + {i18nMsg('homepage-title', 'Tableau de bord')}

- -
-

- {msg('homepage-entries-title', 'Dernières écritures')} -

- {#if isGuided} -

- {msg('homepage-entries-empty-guided', 'Aucune écriture pour le moment. Commencez par saisir votre première écriture comptable.')} -

- {:else} -

- {msg('homepage-entries-empty', 'Aucune écriture.')} -

- {/if} - -
- - -
-

- {msg('homepage-invoices-title', 'Factures ouvertes')} -

- {#if canManage && reminderLoaded && reminderCount > 0} - -

- - - {msg('homepage-reminders-count', '{ $n } facture(s) à rappeler', { - n: reminderCount, - })} - - -

- {:else if isGuided} -

- {msg('homepage-invoices-empty-guided', 'Aucune facture ouverte. Créez votre première facture pour facturer vos clients.')} -

- {:else} -

- {msg('homepage-invoices-empty', 'Aucune facture ouverte.')} -

- {/if} - -
- - + + + {#if bankLoaded && bankAccounts.length > 0} -
-

- {msg('homepage-bank-title', 'Comptes bancaires')} -

-
- {#each bankAccounts as account (account.id)} -
-
-

{account.bankName}

-

{shortIban(account.iban)}

-
-
- {#if account.currentBalance !== null} -

- {formatBalance(account.currentBalance)} -

- {#if account.lastTransactionDate} -

- {msg('homepage-bank-last-transaction', 'Dernière transaction')} : {account.lastTransactionDate} -

- {/if} - {:else} -

- - {msg('homepage-bank-balance-unavailable', 'Solde non disponible — lier au plan comptable')} - -

- {/if} -
-
- {/each} - {#if hasAnyBalance} -
-

- {msg('homepage-bank-total-liquidity', 'Total liquidités')} - {#if totalIsPartial} - - {msg('homepage-bank-total-partial', '(comptes liés uniquement)')} - - {/if} -

-

- {formatBalance(totalLiquidity)} -

-
- {/if} -
-
+ {/if}
diff --git a/frontend/src/routes/(app)/bank-accounts/+page.svelte b/frontend/src/routes/(app)/bank-accounts/+page.svelte index be0b8f5e..946de457 100644 --- a/frontend/src/routes/(app)/bank-accounts/+page.svelte +++ b/frontend/src/routes/(app)/bank-accounts/+page.svelte @@ -93,7 +93,7 @@ return `${acc.number} — ${acc.name}`; } - function formatBalance(balance: number | null): string { + function formatBalance(balance: string | null): string { if (balance === null) { return i18nMsg( 'bank-accounts-labels-balance-unavailable', diff --git a/frontend/tests/e2e/helpers/api-fixtures.ts b/frontend/tests/e2e/helpers/api-fixtures.ts index b89190f9..b5e1a90d 100644 --- a/frontend/tests/e2e/helpers/api-fixtures.ts +++ b/frontend/tests/e2e/helpers/api-fixtures.ts @@ -131,3 +131,38 @@ export async function createAndValidateInvoiceViaApi( await disposeContextSafe(ctx); } } + +/** + * Story 25-6-a (#388) — poste une écriture équilibrée à deux lignes (compte de + * classe 10 au débit, de classe 3 au crédit), datée du jour : la plus récente, + * donc en tête de la tuile « Dernières écritures ». Renvoie son id. + */ +export async function createJournalEntryViaApi( + page: Page, + description: string, + amount = '321.40', +): Promise { + const ctx = await authedApiContext(page); + try { + const accRes = await ctx.get('/api/v1/accounts?includeArchived=false'); + expect(accRes.ok(), `list accounts: ${accRes.status()}`).toBeTruthy(); + const accounts: Array<{ id: number; number: string }> = await accRes.json(); + const debit = accounts.find((a) => /^10[0-9]{2}$/.test(a.number)) ?? accounts[0]; + const credit = accounts.find((a) => /^3[0-9]{3}$/.test(a.number)) ?? accounts[1]; + const res = await ctx.post('/api/v1/journal-entries', { + data: { + entryDate: new Date().toISOString().slice(0, 10), + journal: 'OD', + description, + lines: [ + { accountId: debit.id, debit: amount, credit: '0.00' }, + { accountId: credit.id, debit: '0.00', credit: amount }, + ], + }, + }); + expect(res.ok(), `create entry: ${res.status()}`).toBeTruthy(); + return ((await res.json()) as { id: number }).id; + } finally { + await disposeContextSafe(ctx); + } +} diff --git a/frontend/tests/e2e/homepage-dashboard.spec.ts b/frontend/tests/e2e/homepage-dashboard.spec.ts new file mode 100644 index 00000000..03e97306 --- /dev/null +++ b/frontend/tests/e2e/homepage-dashboard.spec.ts @@ -0,0 +1,103 @@ +/** + * Story 25-6-a (#388, #389) — le tableau de bord dit vrai : les dernières + * écritures branchées, les factures ouvertes chiffrées pour TOUS les rôles. + * + * Seul un E2E voit les valeurs traverser la frontière HTTP. Sélecteurs + * `data-testid` uniquement — jamais un libellé traduit (garde + * `e2e-selecteurs-traduits`, #326). + * + * Pré-requis : MariaDB up + KESH_TEST_MODE=true (cf. docs/testing.md). + */ +import { expect, test } from '@playwright/test'; +import type { Page } from '@playwright/test'; +import AxeBuilder from '@axe-core/playwright'; +import { seedTestState, clearAuthStorage, authedApiContext, disposeContextSafe } from './helpers/test-state'; +import { + createAndValidateInvoiceViaApi, + createContactWithAddressViaApi, + createJournalEntryViaApi, + ensurePrimaryBankAccountViaApi, +} from './helpers/api-fixtures'; + +test.beforeAll(async () => { + await seedTestState('with-company'); +}); + +test.afterEach(async ({ page }) => { + await clearAuthStorage(page); +}); + +async function login(page: Page, username = 'admin', password = 'admin123') { + await page.goto('/login'); + await page.fill('#username', username); + await page.fill('#password', password); + await page.click('button[type="submit"]'); + await expect(page).toHaveURL('/'); +} + +function uniq(prefix: string): string { + return `${prefix} ${Date.now()}-${Math.floor(Math.random() * 1e6)}`; +} + +test.describe('Tableau de bord — les tuiles disent vrai (25-6-a)', () => { + test('une écriture postée apparaît dans « Dernières écritures »', async ({ page }) => { + await login(page); + const label = uniq('Écriture accueil'); + const id = await createJournalEntryViaApi(page, label); + await page.goto('/'); + const row = page.getByTestId('homepage-entry-row').filter({ hasText: label }); + await expect(row).toHaveCount(1); + await expect(row.locator(`a[href="/journal-entries/${id}"]`)).toHaveCount(1); + }); + + test('une facture validée apparaît chiffrée dans « Factures ouvertes »', async ({ page }) => { + await login(page); + await ensurePrimaryBankAccountViaApi(page); + const contact = await createContactWithAddressViaApi(page, uniq('Accueil SA')); + await createAndValidateInvoiceViaApi(page, contact); + await page.goto('/'); + const count = page.getByTestId('homepage-invoices-open-count'); + await expect(count).toBeVisible(); + const amount = await count.getAttribute('data-amount'); + expect(Number.parseFloat(amount ?? '0'), 'reste dû total').toBeGreaterThan(0); + }); + + test('un rôle Consultation voit les factures ouvertes chiffrées, sans bouton d’action', async ({ + page, + }) => { + await login(page); + const contact = await createContactWithAddressViaApi(page, uniq('Accueil Consult SA')); + await createAndValidateInvoiceViaApi(page, contact); + const username = `consult-tiles-${Date.now()}`; + const ctx = await authedApiContext(page); + try { + const res = await ctx.post('/api/v1/users', { + data: { username, password: 'MotDePasse12345', role: 'Consultation' }, + }); + expect(res.ok(), `create user failed: ${res.status()}`).toBeTruthy(); + } finally { + await disposeContextSafe(ctx); + } + await clearAuthStorage(page); + await login(page, username, 'MotDePasse12345'); + + await expect(page.getByTestId('homepage-invoices-open-count')).toBeVisible(); + const invoicesCard = page.getByTestId('homepage-card-open-invoices'); + await expect(invoicesCard.locator('a[href="/invoices"]')).toHaveCount(0); + const entriesCard = page.getByTestId('homepage-card-recent-entries'); + await expect(entriesCard.locator('a[href="/journal-entries"]')).toHaveCount(0); + }); + + test('axe-core sans violations sur l’accueil peuplé', async ({ page }) => { + await login(page); + await ensurePrimaryBankAccountViaApi(page); + await createJournalEntryViaApi(page, uniq('Écriture axe')); + const contact = await createContactWithAddressViaApi(page, uniq('Axe SA')); + await createAndValidateInvoiceViaApi(page, contact); + await page.goto('/'); + await expect(page.getByTestId('homepage-entry-row').first()).toBeVisible(); + await expect(page.getByTestId('homepage-invoices-open-count')).toBeVisible(); + const results = await new AxeBuilder({ page }).analyze(); + expect(results.violations).toEqual([]); + }); +}); From 6489d6b7c6146ae06e9d5c95361ac0ef30d6a54d Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sat, 3 Oct 2026 18:15:17 +0200 Subject: [PATCH 15/20] docs(25-6-a): prompt de revue de code P1 (refs #388, refs #389) Co-Authored-By: Claude Opus 5.5 --- .../25-6-a-review-prompt-p1.md | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 _bmad-output/implementation-artifacts/25-6-a-review-prompt-p1.md diff --git a/_bmad-output/implementation-artifacts/25-6-a-review-prompt-p1.md b/_bmad-output/implementation-artifacts/25-6-a-review-prompt-p1.md new file mode 100644 index 00000000..09d7a141 --- /dev/null +++ b/_bmad-output/implementation-artifacts/25-6-a-review-prompt-p1.md @@ -0,0 +1,46 @@ +# Prompt — revue de code P1, Story 25-6-a (le tableau de bord dit vrai) + +*Versionné le 2026-10-03. Trois lentilles (Sonnet), contexte frais chacune.* + +Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-6-a-tableau-de-bord`. **Diff à revoir : `git diff 91ca244f 9e17de0c`** +(non-régression `8713c9de`, backend `297003c2`, frontend et docs `9e17de0c`). Fiche : +`_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md` (AC 1–8, limites, Dev Agent Record). Issues : +`gh issue view 388`, `389`. Règles : `CLAUDE.md`. + +## Lentilles + +- **A — Blind hunter** : le diff **seul**, sans la fiche. SQL de `list_by_company_with_balances` (liaisons dans l'ordre — + compte-les contre les `?` ; sous-requêtes corrélées ; `ROW_NUMBER()` ; `CAST … AS SIGNED` ; filtres de société dans + CHAQUE sous-requête) ; `Decimal` ; Svelte 5 (`$props`, `$derived`, `{@const}`) ; `big.js` (aucun `Number` sur un + montant non arrondi) ; gestion d'erreur des quatre chargements de la page. +- **B — Edge-case hunter** : le diff et le code environnant. + - Le calcul, refait chiffré : écriture de rapprochement à **plusieurs lignes** sur le compte lié ; rapprochement par + **éclatement** (split) ; relevé dont `period_to` est antérieur à toute écriture ; `include_archived` vrai/faux et le + partage ; un compte bancaire sans relevé mais lié ; deux sociétés. + - La page : un rôle Consultation (403 évité ?), un appel qui échoue pendant que les autres réussissent, le mode guidé, + un montant négatif, `lastTransactionDate` désormais formaté (`formatSwissDate`) — d'autres lecteurs l'attendaient-ils + brut ? `formatChfBalance` : ses appelants passent-ils tous une chaîne (`grep -rn formatChfBalance frontend/src`) ? + - Les E2E neufs : déterministes ? la facture créée par un test est-elle la seule ouverte (le compteur peut-il valoir + autre chose) ? l'axe sans relevé couvre-t-il ce qu'il prétend ? +- **C — Acceptance auditor** : chaque AC tenu ? Recompte depuis la source : `sitesTotal`, `relais`, `sitesNonResolus` + (`frontend/src/lib/shared/i18n-keys.test.ts`), parité des clés `homepage-*` dans les 4 locales, décomptes de tests du + Dev Agent Record aux deux bornes `91ca244f` / `9e17de0c`. **Pars du symptôme** : + `grep -rn "liquidit\|currentBalance\|Number(" frontend/src/lib/features/bank-accounts frontend/src/lib/features/homepage "frontend/src/routes/(app)"`. + Les tests prouvent-ils ce qu'ils disent (chaque mutation déclarée tuée l'est-elle par l'assertion écrite) ? Le + **manuel** (`docs/manual/fr/user-manual.tex` et **PDF aplati**, `pdftotext … | tr '\n' ' ' | tr -s ' '` vers + `target/gate-logs/`) dit-il ce que fait le code — § *Tableau de bord*, *Solde comptable, relevé et écart*, *Import + bancaire* ? Le CHANGELOG ? Les deux écarts déclarés au Dev Agent Record (testid remplacé, relevé non couvert en E2E) + sont-ils acceptables ? + +## Ce que tu rends + +Findings avec sévérité (CRITICAL/HIGH/MEDIUM/LOW), `fichier:ligne`, **preuve** (commande et sortie, ou code cité relu), +scénario d'échec, correction. Pour tout finding affirmant qu'un code est absent ou présent : la sortie d'un `grep -nF`. +⛔ La liste des axes exercés ET non exercés. + +## Interdits + +⛔ N'écris aucun fichier du dépôt hors `target/gate-logs/` ; aucune commande qui écrit dans le dépôt ou dans une base : +`scripts/*` (dont `scripts/prepare-release.sh`), `make`, `latexmk`, `git commit`/`add`/`checkout`, `sqlx`, +`cargo test`/`nextest`, `npm run`, `npx`, `gh issue create`/`comment`/`edit`. Autorisés : lecture, `grep`, `sed`, +`git log`/`show`/`diff`, `gh issue view`, `pdftotext` vers `target/gate-logs/`. From 9f14ca58e0162f88e0d77d1d8e2a9ed1981cd8fb Mon Sep 17 00:00:00 2001 From: Guy Corbaz Date: Sat, 3 Oct 2026 18:29:56 +0200 Subject: [PATCH 16/20] =?UTF-8?q?fix(25-6-a):=20revue=20de=20code=20P1=20?= =?UTF-8?q?=E2=80=94=20filtre=20status=20test=C3=A9,=20mappage=20TS=20test?= =?UTF-8?q?=C3=A9,=20tuile=20bancaire=20qui=20dit=20son=20=C3=A9chec,=20?= =?UTF-8?q?=C3=A9cart=20non=20calculable=20(refs=20#388,=20refs=20#389)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../25-6-a-tableau-de-bord.md | 29 ++++++++ crates/kesh-api/src/routes/bank_accounts.rs | 4 +- .../kesh-db/src/repositories/bank_accounts.rs | 18 +++-- .../tests/bank_account_statement_gap.rs | 37 +++++++++- crates/kesh-i18n/locales/de-CH/messages.ftl | 4 +- crates/kesh-i18n/locales/en-CH/messages.ftl | 4 +- crates/kesh-i18n/locales/fr-CH/messages.ftl | 4 +- crates/kesh-i18n/locales/it-CH/messages.ftl | 4 +- docs/manual/fr/user-manual.pdf | Bin 305254 -> 305663 bytes docs/manual/fr/user-manual.tex | 16 +++-- .../bank-accounts/bank-accounts.api.test.ts | 67 ++++++++++++++++++ .../bank-accounts/bank-accounts.api.ts | 11 +-- .../src/lib/features/bank-accounts/format.ts | 8 ++- .../features/homepage/BankAccountsCard.svelte | 18 ++++- .../features/homepage/HomepageCards.test.ts | 21 ++++++ .../lib/features/homepage/homepage.test.ts | 7 ++ frontend/src/lib/shared/i18n-keys.test.ts | 7 +- frontend/src/routes/(app)/+page.svelte | 15 ++-- frontend/tests/e2e/helpers/api-fixtures.ts | 4 +- frontend/tests/e2e/homepage-dashboard.spec.ts | 5 +- 20 files changed, 252 insertions(+), 31 deletions(-) diff --git a/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md b/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md index a9b27a1f..99715a69 100644 --- a/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md +++ b/_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md @@ -333,6 +333,35 @@ Claude Opus 5.5 (`claude-opus-5-5`). ## Change Log +- **2026-10-03** — Revue de code P1 (Sonnet ×3, prompt `25-6-a-review-prompt-p1.md`) : **0 CRITICAL/HIGH, 4 MED**, LOW. + - **Retenus** : + - un test qui ne tuait pas la mutation revendiquée (`status`) : test neuf avec une transaction `pending` liée, qui + la tue (C-1, mutation exécutée) ; + - le relevé rendu **sans compte lié**, contraire à l'AC 4 et non déclaré : comportement **gardé** (le relevé est un + fait bancaire), documenté au DTO, au manuel et ici (C-2) ; + - aucun test du mappage TypeScript des champs neufs : deux Vitest, réponse de liste avec valeurs et réponse de + mutation sans les champs (C-3). + - **Reclassé** : **F1 (MED → LOW), plusieurs transactions sur une écriture**. Non atteignable : les cinq chemins de + rapprochement lient une écriture qu'ils viennent de créer (`reconciliation.rs:1520, 2016, 2381, 3075, 3541`). + L'invariant est écrit à la doc de `list_by_company_with_balances`. + - **LOW corrigés** : + - la tuile bancaire dit son échec au lieu de disparaître (A-2, F4) ; + - « écart non calculable » pour un compte du grand livre partagé (F3) ; + - `-0.00 CHF` évité (F2) ; + - la requête agrégée bornée aux comptes liés (F5) ; + - commentaires périmés (C-4) ; + - le chemin de menu du manuel aligné sur l'interface, « Administration → Comptes bancaires », aux trois sites, et + la limite « résidu après annulation » écrite (C-5) ; + - « Solde comptable » aussi sur la page des comptes bancaires (C-6) ; + - E2E : présence avant absence, date locale au lieu d'UTC (C-8, F6). + - **Écartés** : + - `canManage` lu au montage : le layout attend l'authentification (A-3, vérifié par la lentille B) ; + - l'isolation par société, sans conséquence aujourd'hui (C-7). + - **Gates de la remédiation** : + - backend complet sur base remise à zéro, **2560/2560**. Un premier run s'était arrêté au premier échec, un test + de performance de `kesh-core` hors périmètre (226 ms > 200 ms sous charge) ; il est passé au second run ; + - frontend `check` 0 erreur, `test:unit` **870/870**, `sitesTotal` 1765 → 1767 ; + - E2E de l'accueil **9/9**. **E2E complet au push.** - **2026-10-03** — Implémentée (dev-story) : T1–T7, gates ci-dessus. Statut → `review`. - **2026-10-03** — Validation P4 ciblée (Haiku, prompt `25-6-a-validate-prompt-p4.md`) : **0 finding**, preuves des quatre vérifications fournies. ⚠️ Son **cas 2 chiffré est mal posé** (il garde le grand livre à 800 alors que diff --git a/crates/kesh-api/src/routes/bank_accounts.rs b/crates/kesh-api/src/routes/bank_accounts.rs index 61caf8ce..65c9d251 100644 --- a/crates/kesh-api/src/routes/bank_accounts.rs +++ b/crates/kesh-api/src/routes/bank_accounts.rs @@ -129,7 +129,9 @@ pub struct BankAccountWithBalance { pub current_balance: Option, pub last_transaction_date: Option, /// Story 25-6-a (#389) — solde de clôture du dernier relevé importé qui en - /// porte un (CAMT ; un import CSV n'en a pas). + /// porte un (CAMT ; un import CSV n'en a pas). Rendu **même sans compte de + /// grand livre lié** : le relevé est un fait bancaire, seul l'écart exige le + /// compte lié. pub statement_closing_balance: Option, /// Date de ce relevé (`period_to`). pub statement_date: Option, diff --git a/crates/kesh-db/src/repositories/bank_accounts.rs b/crates/kesh-db/src/repositories/bank_accounts.rs index fb91e0fb..72f57dfb 100644 --- a/crates/kesh-db/src/repositories/bank_accounts.rs +++ b/crates/kesh-db/src/repositories/bank_accounts.rs @@ -662,6 +662,13 @@ struct BalancesRow { /// transaction **non rapprochée** n'y entre pas — son absence du grand livre est /// l'écart à montrer. /// +/// ⚠️ **Invariant supposé : une transaction, une écriture.** Les cinq chemins de +/// rapprochement (`kesh-api/src/routes/reconciliation.rs`) lient chacun une +/// écriture qu'ils viennent de créer ; aucune écriture n'est rapprochée de +/// plusieurs transactions. Si cela changeait, la correction ajouterait la ligne +/// entière de l'écriture là où seule la part d'une transaction franchit la date +/// du relevé (revue P1, lentille B). +/// /// # Forme /// /// Une requête agrégée **par compte bancaire** ; chaque somme dans sa propre @@ -723,6 +730,8 @@ pub async fn list_by_company_with_balances( FROM journal_entry_lines jel \ INNER JOIN journal_entries je ON jel.entry_id = je.id \ WHERE je.company_id = ? \ + AND jel.account_id IN (SELECT journal_account_id FROM bank_accounts \ + WHERE company_id = ? AND journal_account_id IS NOT NULL) \ GROUP BY jel.account_id \ ) agg ON agg.account_id = ba.journal_account_id \ LEFT JOIN ( \ @@ -740,10 +749,11 @@ pub async fn list_by_company_with_balances( ) shared ON shared.journal_account_id = ba.journal_account_id \ WHERE ba.company_id = ?", ) - .bind(company_id) - .bind(company_id) - .bind(company_id) - .bind(company_id) + .bind(company_id) // agg : je.company_id + .bind(company_id) // agg : bornée aux comptes liés de la société + .bind(company_id) // st + .bind(company_id) // shared + .bind(company_id) // ba.company_id .fetch_all(pool) .await .map_err(map_db_error)?; diff --git a/crates/kesh-db/tests/bank_account_statement_gap.rs b/crates/kesh-db/tests/bank_account_statement_gap.rs index 6ff48c72..7cddbb2e 100644 --- a/crates/kesh-db/tests/bank_account_statement_gap.rs +++ b/crates/kesh-db/tests/bank_account_statement_gap.rs @@ -275,8 +275,10 @@ async fn la_date_de_valeur_ne_cree_pas_d_ecart(pool: MySqlPool) { assert_eq!(b.statement_closing_balance, Some(dec!(1000))); } -/// Une transaction NON rapprochée du jour du relevé n'est pas corrigée : son -/// absence du grand livre est l'écart. Mutation tuée : `status` ignoré. +/// Une transaction NON rapprochée (rapprochement annulé : `pending`, lien remis +/// à NULL) n'est pas corrigée : son absence du grand livre est l'écart. Ce test +/// ne tue PAS la mutation « `status` ignoré » — le lien NULL suffit à +/// l'écarter ; c'est le test suivant qui la tue. #[sqlx::test(migrations = "../kesh-db/test-schema")] async fn une_transaction_non_rapprochee_reste_un_ecart(pool: MySqlPool) { let (seeded, ba, bank, sales) = linked(&pool).await; @@ -293,6 +295,37 @@ async fn une_transaction_non_rapprochee_reste_un_ecart(pool: MySqlPool) { ); } +/// ⛔ Une transaction `pending` qui porterait encore un lien vers une écriture +/// (état incohérent, posé en SQL brut) n'entre pas dans la correction : seul +/// `status = 'reconciled'` compte. Mutation tuée : le filtre `status` retiré. +#[sqlx::test(migrations = "../kesh-db/test-schema")] +async fn seule_une_transaction_rapprochee_corrige(pool: MySqlPool) { + let (seeded, ba, bank, sales) = linked(&pool).await; + let late = entry(&pool, &seeded, ymd(2026, 4, 1), bank, sales, dec!(200)).await; + let imp = import(&pool, &seeded, ba, ymd(2026, 3, 31), Some(dec!(200))).await; + tx( + &pool, + &seeded, + ba, + imp, + ymd(2026, 3, 31), + dec!(200), + Some(late), + ) + .await; + sqlx::query("UPDATE bank_transactions SET status = 'pending' WHERE matched_entry_id = ?") + .bind(late) + .execute(&pool) + .await + .unwrap(); + assert_eq!( + balances(&pool, &seeded, ba) + .await + .ledger_balance_at_statement, + Some(Decimal::ZERO) + ); +} + /// ⛔ Le lien changé après des rapprochements : les écritures portent sur /// l'ANCIEN compte et sortent de la correction. Mutation tuée : sommer /// `bank_transactions.amount` au lieu de la ligne de l'écriture. diff --git a/crates/kesh-i18n/locales/de-CH/messages.ftl b/crates/kesh-i18n/locales/de-CH/messages.ftl index 230c684d..3deb818b 100644 --- a/crates/kesh-i18n/locales/de-CH/messages.ftl +++ b/crates/kesh-i18n/locales/de-CH/messages.ftl @@ -1003,7 +1003,7 @@ bank-accounts-actions-show-archived = Archivierte anzeigen bank-accounts-actions-hide-archived = Archivierte ausblenden bank-accounts-actions-submit-create = Erstellen bank-accounts-actions-submit-update = Speichern -bank-accounts-labels-balance = Saldo +bank-accounts-labels-balance = Buchsaldo bank-accounts-labels-balance-unavailable = Saldo nicht verfügbar (mit Kontenrahmen verbinden) bank-accounts-labels-qr-iban = QR-IBAN (optional) bank-accounts-error-qr-iban-not-qr = Diese IBAN ist keine QR-IBAN. Wenn Ihnen Ihre Bank keine spezielle QR-IBAN für QR-Rechnungen ausgestellt hat, lassen Sie dieses Feld leer: Ihre normale IBAN genügt. @@ -1030,6 +1030,8 @@ homepage-bank-total-ledger = Total (Buchsaldo) homepage-bank-shared-ledger-note = (ein gemeinsam genutztes Hauptbuchkonto wird nur einmal gezählt) homepage-bank-statement = Auszug vom { $date }: { $amount } homepage-bank-gap = Differenz: { $amount } +homepage-bank-gap-unavailable = Differenz nicht berechenbar: gemeinsames Hauptbuchkonto +homepage-bank-unavailable = Bankkonten derzeit nicht verfügbar. settings-bank-manage = In Administration → Bankkonten verwalten settings-bank-manage-hint = Um ein Bankkonto hinzuzufügen, zu ändern oder zu archivieren, nutzen Sie die spezielle Seite Administration → Bankkonten. bank-accounts-toast-link-success = Bankkonto erfolgreich mit dem Kontorahmen verbunden. diff --git a/crates/kesh-i18n/locales/en-CH/messages.ftl b/crates/kesh-i18n/locales/en-CH/messages.ftl index 1fcb22ee..d6980d57 100644 --- a/crates/kesh-i18n/locales/en-CH/messages.ftl +++ b/crates/kesh-i18n/locales/en-CH/messages.ftl @@ -1003,7 +1003,7 @@ bank-accounts-actions-show-archived = Show archived bank-accounts-actions-hide-archived = Hide archived bank-accounts-actions-submit-create = Create bank-accounts-actions-submit-update = Save -bank-accounts-labels-balance = Balance +bank-accounts-labels-balance = Book balance bank-accounts-labels-balance-unavailable = Balance unavailable (link to chart of accounts) bank-accounts-labels-qr-iban = QR-IBAN (optional) bank-accounts-error-qr-iban-not-qr = This IBAN is not a QR-IBAN. If your bank has not issued you a dedicated QR-IBAN for QR-bills, leave this field empty: your regular IBAN is sufficient. @@ -1030,6 +1030,8 @@ homepage-bank-total-ledger = Total (book balance) homepage-bank-shared-ledger-note = (a shared ledger account is counted once) homepage-bank-statement = Statement of { $date }: { $amount } homepage-bank-gap = Difference: { $amount } +homepage-bank-gap-unavailable = Difference not computable: shared ledger account +homepage-bank-unavailable = Bank accounts are unavailable right now. settings-bank-manage = Manage in Administration → Bank accounts settings-bank-manage-hint = To add, edit or archive a bank account, use the dedicated page Administration → Bank accounts. bank-accounts-toast-link-success = Bank account successfully linked to chart of accounts. diff --git a/crates/kesh-i18n/locales/fr-CH/messages.ftl b/crates/kesh-i18n/locales/fr-CH/messages.ftl index 9c4407a4..9c623985 100644 --- a/crates/kesh-i18n/locales/fr-CH/messages.ftl +++ b/crates/kesh-i18n/locales/fr-CH/messages.ftl @@ -1056,7 +1056,7 @@ bank-accounts-actions-show-archived = Afficher les archivés bank-accounts-actions-hide-archived = Masquer les archivés bank-accounts-actions-submit-create = Créer bank-accounts-actions-submit-update = Enregistrer -bank-accounts-labels-balance = Solde +bank-accounts-labels-balance = Solde comptable bank-accounts-labels-balance-unavailable = Solde non disponible (lier au plan comptable) bank-accounts-labels-qr-iban = QR-IBAN (optionnel) bank-accounts-error-qr-iban-not-qr = Cet IBAN n'est pas un QR-IBAN. Si votre banque ne vous a pas fourni de QR-IBAN dédié aux QR-factures, laissez ce champ vide : votre IBAN normal suffit. @@ -1084,6 +1084,8 @@ homepage-bank-total-ledger = Total (solde comptable) homepage-bank-shared-ledger-note = (un compte du grand livre partagé n'est compté qu'une fois) homepage-bank-statement = Relevé du { $date } : { $amount } homepage-bank-gap = Écart : { $amount } +homepage-bank-gap-unavailable = Écart non calculable : compte du grand livre partagé +homepage-bank-unavailable = Comptes bancaires indisponibles pour le moment. settings-bank-manage = Gérer dans Administration → Comptes bancaires settings-bank-manage-hint = Pour ajouter, modifier ou archiver un compte bancaire, utilisez la page dédiée Administration → Comptes bancaires. bank-accounts-toast-link-success = Compte bancaire lié avec succès au plan comptable. diff --git a/crates/kesh-i18n/locales/it-CH/messages.ftl b/crates/kesh-i18n/locales/it-CH/messages.ftl index 6b44b966..fb1c9837 100644 --- a/crates/kesh-i18n/locales/it-CH/messages.ftl +++ b/crates/kesh-i18n/locales/it-CH/messages.ftl @@ -1003,7 +1003,7 @@ bank-accounts-actions-show-archived = Mostra archiviati bank-accounts-actions-hide-archived = Nascondi archiviati bank-accounts-actions-submit-create = Crea bank-accounts-actions-submit-update = Salva -bank-accounts-labels-balance = Saldo +bank-accounts-labels-balance = Saldo contabile bank-accounts-labels-balance-unavailable = Saldo non disponibile (collegare al piano dei conti) bank-accounts-labels-qr-iban = QR-IBAN (opzionale) bank-accounts-error-qr-iban-not-qr = Questo IBAN non è un QR-IBAN. Se la vostra banca non vi ha fornito un QR-IBAN dedicato alle fatture QR, lasciate vuoto questo campo: il vostro IBAN normale è sufficiente. @@ -1030,6 +1030,8 @@ homepage-bank-total-ledger = Totale (saldo contabile) homepage-bank-shared-ledger-note = (un conto di mastro condiviso è contato una sola volta) homepage-bank-statement = Estratto del { $date }: { $amount } homepage-bank-gap = Differenza: { $amount } +homepage-bank-gap-unavailable = Differenza non calcolabile: conto di mastro condiviso +homepage-bank-unavailable = Conti bancari al momento non disponibili. settings-bank-manage = Gestisci in Amministrazione → Conti bancari settings-bank-manage-hint = Per aggiungere, modificare o archiviare un conto bancario, utilizza la pagina dedicata Amministrazione → Conti bancari. bank-accounts-toast-link-success = Conto bancario collegato con successo al piano dei conti. diff --git a/docs/manual/fr/user-manual.pdf b/docs/manual/fr/user-manual.pdf index b5b84a2c53c62f7dc137b2885eee6f52b759d5b7..123e798f7836aa65a56c10aedfb7250c4a51a198 100644 GIT binary patch delta 55798 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�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

U@yL4&vn5@l2v##VDS%*-E1CW?X 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