Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ Le contenu est rédigé en français à destination des **fiduciaires, PME, ind

### Fixed

- **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.

- **L'export de souveraineté ne portait que la moitié de votre comptabilité.** Il promettait de quoi « migrer vers un autre logiciel » et laissait dehors **les factures fournisseurs, les avoirs, les règlements, les projets, les ordres de virement, les personnes de contact, les pièces reçues et le journal d'audit** — onze tables comptables sur les trente que compte désormais l'archive.

⚠️ **Un cas était particulièrement trompeur** : les écritures exportaient bien un identifiant de projet, mais la table des projets manquait — l'identifiant ne renvoyait donc à rien. *Un fichier qui a l'air complet est pire qu'un fichier manifestement incomplet.*
Expand Down Expand Up @@ -48,6 +52,8 @@ Le contenu est rédigé en français à destination des **fiduciaires, PME, ind

### Changed

- **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*.

- **Supprimer une facture validée n'est plus possible — il faut la « dévalider » d'abord.** Jusqu'ici, le bouton *Supprimer* d'une facture validée effaçait la facture **et son écriture comptable** d'un seul geste. La destruction d'une écriture était donc un **effet de bord du mot « supprimer »** : rien, dans le vocabulaire de l'écran, ne disait qu'on touchait aux livres.
Expand Down

Large diffs are not rendered by default.

45 changes: 45 additions & 0 deletions _bmad-output/implementation-artifacts/25-5-b-review-prompt-p1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Prompt — revue de code P1, Story 25-5-b (la balance porte un solde d'ouverture)

*Versionné le 2026-10-03. Trois lentilles (Sonnet), contexte frais chacune.*

Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-5-b-balance-solde-ouverture`. **Diff à revoir : `git diff 42623926 46edd970`**
— un seul commit d'implémentation. Fiche : `_bmad-output/implementation-artifacts/25-5-b-balance-solde-ouverture.md`
(AC 1–10, Dev Notes, Dev Agent Record). Issue : `gh issue view 385`. Règles : `CLAUDE.md`.

## Lentilles

- **A — Blind hunter** : le diff **seul**, sans la fiche. SQL de `trial_balance.rs` (liaisons dans le bon ordre —
compte-les une à une contre les `?` ; `SUM(CASE … END)` sans `ELSE` → `NULL` couvert par `COALESCE` ? ; `CAST … AS
SIGNED` lu en `i64` ; la jointure et le filtre de société), la requête d'ouverture réécrite du grand livre, `Decimal`,
rendus CSV/PDF, réactivité Svelte 5 et `big.js`.
- **B — Edge-case hunter** : le diff et le code environnant.
- Le grand livre : sa nouvelle requête d'ouverture rend-elle **exactement** l'ancien résultat dans tous les cas — compte
de bilan, compte de résultat, `from` hors de tout exercice, `from` = premier jour d'un exercice, exercices avec trous ?
- La balance : `fy_start` lu par `find_by_id_in_company` — exercice d'une autre société ? Une écriture d'une **autre
société** sur un compte de cette société (impossible ?) ; une écriture datée hors de son exercice ; un compte retypé.
- La règle d'inclusion : un compte archivé dont l'ouverture est nulle mais qui a des lignes **de montant net nul** dans
la période ; `period_lines` compte-t-il les bonnes lignes ?
- `opening_balanced` : faux positif possible sur des livres exacts (arrondi `Decimal`, échelle 4 décimales) ?
- L'écran : `retainedEarnings` absent ou illisible, rapport vide, ligne calculée quand il n'y a aucun compte.
- La performance : la sous-requête lit toutes les lignes jusqu'à `end` — index utilisés (`idx_jel_account`) ?
- **C — Acceptance auditor** : chaque AC tenu ? Recompte depuis la source (`sitesTotal`, relevé des libellés en dur, clés
dans les 4 locales, décomptes de tests du Dev Agent Record aux deux bornes `42623926` / `46edd970`). **Pars du
symptôme** : `grep -rn "\.balance\b\|totalDebit\|reports-column-balance" frontend/src crates/kesh-report crates/kesh-api/src`
— un consommateur de la balance qui suppose encore l'ancienne forme ? Les tests prouvent-ils ce qu'ils disent (chaque
mutation déclarée est-elle tuée 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 — § *Balance des
comptes*, § *Grand livre*, glossaire, § *Reprise de comptabilité* ? Le CHANGELOG ? Le Dev Agent Record n'affirme-t-il que
ce qui a tourné ?

## 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/`.
33 changes: 33 additions & 0 deletions _bmad-output/implementation-artifacts/25-5-b-review-prompt-p2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Prompt — revue de code P2 ciblée, Story 25-5-b

*Versionné le 2026-10-03. **Une lentille** (Haiku), contexte frais — passe ciblée sur la remédiation de P1 (P1 Sonnet ×3 :
1 MED, LOW).*

Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-5-b-balance-solde-ouverture`. **Diff à relire, un seul commit, aplati :
`git show 84505eed`.** Fiche : `_bmad-output/implementation-artifacts/25-5-b-balance-solde-ouverture.md`.

## Lentille — regression hunter

1. `crates/kesh-report/src/pdf.rs` : le libellé `opening_unbalanced` est-il ajouté à `SectionLabels` **et** à ses défauts,
sans autre construction littérale de `SectionLabels` ailleurs (`grep -rn "SectionLabels {" crates`) ? L'avertissement
est-il dessiné après `ensure_space_for_row` ? Tient-il sur une ligne (Helvetica-Bold 10 pt, ~0,55 em par caractère,
largeur utile 180 mm) ? Le test l'exerce-t-il dans les deux sens ?
2. `crates/kesh-report/tests/trial_balance_opening.rs`, test `un_compte_archive_aux_mouvements_compenses_figure` : les deux
écritures tombent-elles dans l'exercice et la période ? L'assertion distingue-t-elle « présent à zéro » d'« absent » ?
3. Manuel et CHANGELOG : la phrase corrigée dit-elle juste ? Lis `crates/kesh-report/src/income_statement.rs` (filtre des
mouvements) et vérifie : sur une période qui ne commence pas au premier jour de l'exercice, compte de résultat ≠ clôture
de la balance ; sur l'exercice entier, égalité. Reste-t-il **ailleurs** la promesse fausse ? `grep -rn "montant au compte
de résultat" docs CHANGELOG.md _bmad-output/implementation-artifacts/25-5-b-*.md crates`.
4. La doc de module de `trial_balance.rs` : `DateOutsideFiscalYear` existe-t-il bien dans `journal_entries::create_in_tx`
(`grep -n "DateOutsideFiscalYear" crates/kesh-db/src/repositories/journal_entries.rs`) ?

## Ce que tu rends

Findings avec sévérité, endroit, **preuve obligatoire : la commande ET sa sortie** — un finding sans sortie sera rejeté,
un « 0 finding » sans les sorties 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`.
48 changes: 48 additions & 0 deletions _bmad-output/implementation-artifacts/25-5-b-validate-prompt-p1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Prompt — validation P1, Story 25-5-b (la balance porte un solde d'ouverture)

*Versionné le 2026-10-03. Trois lentilles (Sonnet), contexte frais chacune.*

Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-5-b-balance-solde-ouverture`. **Fiche à valider :**
`_bmad-output/implementation-artifacts/25-5-b-balance-solde-ouverture.md` (commit `ac40f66b`). Issue : `gh issue view 385`.
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 — Exactitude comptable.** La règle d'ouverture (bilan depuis l'origine, résultat depuis le début de l'exercice)
est-elle juste pour une balance suisse ? La ligne calculée du résultat reporté rend-elle **réellement** les colonnes
d'ouverture et de clôture équilibrées — refais le calcul sur deux exercices (vente et charge en exercice 1, vente en
exercice 2, balance de l'exercice 2 entière puis d'une période mars–juin) : Σ des ouvertures en sens débit −
`retained_earnings` = 0 ? Et la clôture ? Le résultat **de l'exercice en cours avant la période** (janvier–février)
est-il compté une fois, pas deux (dans les ouvertures des comptes de résultat ET dans `retained_earnings`) ? Le
contrôle de l'AC 5 est-il une vraie vérification ou une identité ? La concordance avec le bilan tient-elle quand la
période ne finit pas au dernier jour de l'exercice ? Un compte physique de rôle `RetainedEarnings` (report d'ouverture
d'un migrant) est-il compté deux fois avec la ligne calculée ?
- **B — Faisabilité dans le code.** Chaque référence `fichier:ligne` de la fiche existe-t-elle et dit-elle ce que la fiche
affirme (`grep -nF`, `sed -n`) ? L'extraction de l'AC 2 est-elle possible sans changer le comportement du grand livre
(lis `general_ledger.rs` en entier) ? `fetch_retained_earnings` prend-il la bonne date ? La requête agrégée unique
est-elle écrivable (règle d'inclusion sur un solde d'ouverture non nul : `HAVING` ou sous-requête ?) ? Les six colonnes
tiennent-elles en A4 portrait avec la police et les positions actuelles (`pdf.rs`) ? Tous les consommateurs de
`TrialBalance`/`TrialBalanceRow` et de la clé `reports-trial-balance-period-note` sont-ils listés (`grep -rn`) ? Le
périmètre (trois modules de code) est-il exact ?
- **C — Complétude et tests.** Chaque AC est-il testable, et le test prévu aurait-il échoué avant le patch ? Manque-t-il
un cas (période d'un seul jour ; premier exercice, `retained_earnings` = 0 ; exercice sans écriture ; compte de bilan
sans aucun mouvement ni ouverture ; écriture datée le jour même du début de période) ? Le manuel : relis
`docs/manual/fr/user-manual.tex` § *Balance des comptes*, § *Grand livre*, glossaire **et le PDF aplati**
(`pdftotext docs/manual/fr/user-manual.pdf - | tr '\n' ' ' | tr -s ' '` vers
`/tmp/claude-1000/-home-gcorbaz-devel-kesh/379e6f94-8029-42cb-9720-fa27c2fb204c/scratchpad/`) : la fiche liste-t-elle
**tous** les sites que le patch rendra faux ? Pars du symptôme : `grep -rn "mouvement de la période\|balance de vérification\|Balance des comptes" docs website README.md crates/kesh-i18n frontend/src`.
CHANGELOG, README, site.

## 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é pour la lentille A), correction proposée. ⛔ 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`,
`gh issue view`, `pdftotext` vers le scratchpad.
42 changes: 42 additions & 0 deletions _bmad-output/implementation-artifacts/25-5-b-validate-prompt-p2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Prompt — validation P2, Story 25-5-b (la balance porte un solde d'ouverture)

*Versionné le 2026-10-03. Une passe (Opus), contexte frais, les trois lentilles. Trend : P1 1H/4M (Sonnet ×3).*

Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-5-b-balance-solde-ouverture`. **Fiche :**
`_bmad-output/implementation-artifacts/25-5-b-balance-solde-ouverture.md` (tête `b6c1d5f4`). Remédiation de P1 :
`git diff 7e529131 b6c1d5f4`. Issue : `gh issue view 385`. 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** (le diff) : chaque ajout est-il juste ? En particulier :
- la formule `debit_sense` et la vérification chiffrée de l'AC 5 — refais le calcul ;
- le test du contrôle à `false` : une ligne déséquilibrée insérée en SQL brut dans l'exercice 1 casse-t-elle
**réellement** les deux égalités (ouverture ET clôture) sans faire échouer le rapport ? `fetch_retained_earnings`
lit-il cette ligne (selon le type du compte choisi, elle tombe dans le résultat reporté ou dans une ouverture —
l'écart survit-il ?) ; `TrialBalanceUnbalanced` (mouvements de la période) reste-t-il muet ?
- les positions des six colonnes du PDF (`pdf.rs`, police Helvetica 10 pt, `MARGIN_LEFT_MM`, `PAGE_WIDTH_MM`,
`truncate_with_ellipsis`) : chevauchement ? la colonne de clôture déborde-t-elle de la page ?
- les scénarios ajoutés à l'AC 9 contredisent-ils un autre AC ?
2. **Ce que P1 n'a pas regardé** — cohérence interne de la fiche (AC, tâches, Dev Notes, *Modules*) ; la règle d'ouverture
pour une période **dont le début n'est pas le début de l'exercice** combinée à la règle d'inclusion (AC 6) ; un compte de
**résultat** archivé à ouverture non nulle en cours d'exercice ; la ligne calculée au CSV (libellé fixe fr — cohérent
avec les autres lignes CSV de `csv.rs` ?) ; la doc de l'API publique (`docs/` — `grep -rn "trial-balance" docs`) et le
manuel admin s'ils décrivent la réponse ; le test de concordance existant `general_ledger.rs:150-205` : étendu à
`opening`/`closing`, son scénario (exercice entier) prouve-t-il quelque chose sur l'ouverture ?
3. **Le manuel** — `docs/manual/fr/user-manual.tex` (§ *Balance des comptes*, § *Grand livre*, glossaire) **et le PDF
aplati** (`pdftotext docs/manual/fr/user-manual.pdf - | tr '\n' ' ' | tr -s ' '` vers
`/tmp/claude-1000/-home-gcorbaz-devel-kesh/379e6f94-8029-42cb-9720-fa27c2fb204c/scratchpad/`) : la fiche nomme-t-elle
tous les sites que le patch rendra faux ?

## 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 ; 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 le scratchpad.
36 changes: 36 additions & 0 deletions _bmad-output/implementation-artifacts/25-5-b-validate-prompt-p3.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Prompt — validation P3 ciblée, Story 25-5-b

*Versionné le 2026-10-03. **Une lentille** (Haiku), contexte frais — passe ciblée sur la remédiation de P2. Trend :
P1 1H/4M (Sonnet ×3) → P2 4M/9L (Opus).*

Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-5-b-balance-solde-ouverture`. **Diff à relire, aplati, un seul
commit : `git diff 6fc79cf5 013b2ae7`** (la fiche `_bmad-output/implementation-artifacts/25-5-b-balance-solde-ouverture.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. **Cohérence interne après le patch** : `closing_balanced` a été retiré — reste-t-il une phrase (AC 5, 7, 8, 9, tâches,
Dev Notes) qui suppose deux indicateurs ou un ✓/⚠️ sous la colonne Clôture ? `grep -nF "closing" <fiche>` et lis chaque
occurrence.
2. **L'AC 2 réécrit** : la forme prescrite (trois paires de sommes brutes, `opening_from` en Rust) est-elle compatible
avec le grand livre tel qu'il est ? Lis `crates/kesh-report/src/general_ledger.rs:194-275` : sa requête d'ouverture
peut-elle rendre les deux paires sans changer son résultat ? `fiscal_year_start_containing` y renvoie `None` quand
aucun exercice ne couvre `from` — la forme prescrite conserve-t-elle ce cas ?
3. **Les libellés** : les clés `reports-column-opening` / `reports-column-closing` existent-elles **déjà** dans
`crates/kesh-i18n/locales/fr-CH/messages.ftl` (collision) ? `grep -n "reports-column-" …`. Les champs `col_opening` /
`col_closing` existent-ils déjà dans `SectionLabels` (`crates/kesh-report/src/pdf.rs`) ?
4. **Les références ajoutées** existent-elles et disent-elles ce que la fiche affirme : `balance_sheet.rs:237`,
`BalanceSheetView.svelte:97-100`, `csv.rs:139-145`, `csv.rs:140-144`, `pdf.rs:596-599`, `general_ledger.rs:135-205`,
`user-manual.tex:615`, `CHANGELOG.md` (section `## [0.12.1] — Non publié`) ?

## Ce que tu rends

Findings avec sévérité, endroit, **preuve obligatoire : la commande ET sa sortie** — un finding sans sortie de commande
sera rejeté, un « 0 finding » sans les sorties 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