Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
fbdf661
docs(25-6-a): découpage de la 25-6 et fiche du tableau de bord (refs …
guycorbaz Oct 3, 2026
06c9a68
docs(25-6-a): prompt de validation P1 (refs #388, refs #389)
guycorbaz Oct 3, 2026
0d81516
docs(25-6-a): validation P1 — total dédoublonné, solde à une date, co…
guycorbaz Oct 3, 2026
8951155
docs(25-6-a): composants dans features/homepage — la garde d'apparten…
guycorbaz Oct 3, 2026
917b524
docs(25-6-a): prompt de validation P2 (refs #388, refs #389)
guycorbaz Oct 3, 2026
6e078f6
docs(25-6-a): validation P2 — arrondi, non-régression, partage, texte…
guycorbaz Oct 3, 2026
761f144
docs(25-6-a): arbitrage de Guy — écart corrigé de la date de valeur, …
guycorbaz Oct 3, 2026
27ef441
docs(25-6-a): prompt de validation P3 (refs #388, refs #389)
guycorbaz Oct 3, 2026
71f0d3d
docs(25-6-a): validation P3 — correction sur la ligne du compte lié, …
guycorbaz Oct 3, 2026
238dda9
docs(25-6-a): prompt de validation P4 ciblée (refs #388, refs #389)
guycorbaz Oct 3, 2026
91ca244
docs(25-6-a): validation P4 ciblée — 0 finding, boucle close (refs #3…
guycorbaz Oct 3, 2026
8713c9d
test(25-6-a): non-régression des soldes bancaires, verte contre le co…
guycorbaz Oct 3, 2026
297003c
feat(25-6-a): le dernier relevé et le solde comptable à sa date, corr…
guycorbaz Oct 3, 2026
9e17de0
feat(25-6-a): le tableau de bord dit vrai — écritures branchées, fact…
guycorbaz Oct 3, 2026
6489d6b
docs(25-6-a): prompt de revue de code P1 (refs #388, refs #389)
guycorbaz Oct 3, 2026
9f14ca5
fix(25-6-a): revue de code P1 — filtre status testé, mappage TS testé…
guycorbaz Oct 3, 2026
2f148fa
docs(25-6-a): prompt de revue de code P2 (refs #388, refs #389)
guycorbaz Oct 3, 2026
4f94afd
fix(25-6-a): revue de code P2 — filtre status testé sur ses deux copi…
guycorbaz Oct 3, 2026
d0f3019
docs(25-6-a): prompt de revue de code P3 ciblée (refs #388, refs #389)
guycorbaz Oct 3, 2026
dcb24db
docs(25-6-a): revue de code P3 ciblée — 0 finding, boucle close ; sto…
guycorbaz Oct 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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*.
Expand Down
46 changes: 46 additions & 0 deletions _bmad-output/implementation-artifacts/25-6-a-review-prompt-p1.md
Original file line number Diff line number Diff line change
@@ -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/`.
45 changes: 45 additions & 0 deletions _bmad-output/implementation-artifacts/25-6-a-review-prompt-p2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Prompt — revue de code 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 0 CRITICAL/HIGH, 4 MED
(Sonnet ×3). La remédiation de P1 touche plusieurs modules (SQL `kesh-db`, trois composants, i18n, manuel) : protocole
complet, avec une attention particulière au diff de la remédiation.*

Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-6-a-tableau-de-bord`. **Diff complet : `git diff 91ca244f 9f14ca58`** ;
**remédiation de P1 : `git diff 6489d6b7 9f14ca58`**. Fiche : `_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md`
(AC 1–8, limites, Dev Agent Record, Change Log). Issues : `gh issue view 388`, `389`. Règles : `CLAUDE.md`.

## Ce que tu vérifies

1. **La remédiation de P1** :
- le SQL de `list_by_company_with_balances` (`crates/kesh-db/src/repositories/bank_accounts.rs`) : la table `agg`
désormais bornée aux comptes liés — compte les `?` contre les `.bind` (cinq) ; le résultat de `currentBalance` est-il
inchangé pour TOUT compte lié, y compris un compte lié archivé avec `include_archived` faux ?
- le test `seule_une_transaction_rapprochee_corrige` (`crates/kesh-db/tests/bank_account_statement_gap.rs`) tue-t-il
vraiment la mutation « filtre `status` retiré » — les DEUX sous-requêtes portent-elles le filtre, et le test
exerce-t-il celle qui compte ?
- `BankAccountsCard.svelte` : l'état `error`, l'« écart non calculable » (sa condition est-elle juste dans tous les cas —
compte non lié avec relevé, compte partagé sans relevé ?), le `{#if}`/`{:else}` bien fermé ;
- `format.ts` : le `-0` évité — `Big(…).eq(0)` sur `-0.004` arrondi ?
- la page (`routes/(app)/+page.svelte`) : la tuile bancaire en échec, puis un rechargement réussi ?
- le reclassement de F1 (« plusieurs transactions sur une écriture, non atteignable ») : vérifie les cinq sites de
`reconciliation.rs` cités au Change Log — lient-ils tous une écriture créée dans la même fonction ? Un autre
chemin (`invoices.rs`, règlement de facture, 25-3) pose-t-il `matched_entry_id` ?
2. **Ce que P1 n'a pas couvert** : la page des comptes bancaires (`routes/(app)/bank-accounts/+page.svelte`) avec
`currentBalance` en chaîne — tri, comparaisons, `formatBalance` ; tout autre lecteur de `BankAccountSummary` qui
ferait de l'arithmétique sur `currentBalance` (`grep -rn "currentBalance" frontend/src`).
3. **Le manuel** — `docs/manual/fr/user-manual.tex` § *Tableau de bord*, *Solde comptable, relevé et écart*, *Import
bancaire*, et les trois chemins « Administration → Comptes bancaires » ; **PDF aplati** vers `target/gate-logs/`.
4. **Recomptes** : `sitesTotal` 1767 (`frontend/src/lib/shared/i18n-keys.test.ts`, recompte `grep -o "i18nMsg("` des
trois tuiles), parité des clés `homepage-*` (30 par locale) et `bank-accounts-labels-balance` dans les 4 locales.

## Ce que tu rends

Findings avec sévérité (CRITICAL/HIGH/MEDIUM/LOW), `fichier:ligne`, **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.
35 changes: 35 additions & 0 deletions _bmad-output/implementation-artifacts/25-6-a-review-prompt-p3.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Prompt — revue de code P3 ciblée, Story 25-6-a

*Versionné le 2026-10-03. **Une lentille** (Haiku), contexte frais — passe ciblée sur la remédiation de P2. Trend :
P1 4 MED (Sonnet ×3) → P2 2 MED (Opus). La remédiation de P2 ne touche, en production, qu'une chaîne de repli Svelte ;
le reste est tests, AC et manuel.*

Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-6-a-tableau-de-bord`. **Diff à relire, un seul commit, aplati :
`git show 4f94afd9`.**

## Lentille — regression hunter

1. **Le filtre `status` sur ses deux copies** : `grep -nF "bt.status = 'reconciled'" crates/kesh-db/src/repositories/bank_accounts.rs`
— deux lignes ? Le test `seule_une_transaction_rapprochee_corrige_le_miroir`
(`crates/kesh-db/tests/bank_account_statement_gap.rs`) monte-t-il exactement le cas de la SECONDE sous-requête
(`booked_after_entered_before` : `booking_date > period_to`, écriture `≤ period_to`) ? Calcule ce qu'il attend, avec et
sans le filtre.
2. **L'AC 4 amendé** (`_bmad-output/implementation-artifacts/25-6-a-tableau-de-bord.md`) : dit-il la même chose que le
code (`bank_accounts.rs`, branche `(None, Some(r))`) et que le test `sans_compte_lie_le_releve_reste` ? Reste-t-il dans
la fiche une phrase qui dit encore les trois champs `null` sans compte lié ?
3. **Le test du câblage** (`frontend/src/routes/(app)/homepage-page.test.ts`) : mocke-t-il exactement les modules que la
page importe (`grep -n "import" "frontend/src/routes/(app)/+page.svelte"`) ? Prouverait-il quelque chose si
`listBankAccounts` réussissait ?
4. **Résidus** : `grep -rn "Deux limites\|'Solde')" docs/manual/fr/user-manual.tex "frontend/src/routes/(app)/bank-accounts/+page.svelte"`.

## 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`.
Loading
Loading