Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
11cf3c9
docs(25-4-c): story créée — le résiduel au rapprochement (refs #420)
guycorbaz Sep 27, 2026
1db610a
docs(25-4-c): arbitrages Q1–Q3 retenus par défaut, rebase sur la b2 (…
guycorbaz Sep 29, 2026
36f9ce3
docs(25-4-c): validation P1 — 3 HIGH, 2 MED, 1 LOW remédiés (refs #42…
guycorbaz Sep 29, 2026
4ba1d29
docs(25-4-c): validation P2 — 0 finding sans preuve, 2 MED repris par…
guycorbaz Sep 29, 2026
73ea2b0
docs(25-4-c): références de lignes du verrou recontrôlées (refs #420)
guycorbaz Sep 29, 2026
de2057a
docs(25-4-c): validation P3 consignée — 1 CRIT / 3 HIGH, découpage et…
guycorbaz Sep 29, 2026
5d74361
docs(25-4-c): découpée — verrou en 25-4-c2 (#480), arrondi en 25-4-c3…
guycorbaz Sep 29, 2026
08646df
docs(25-4-c): validation P4 — 1 MED, 1 LOW remédiés (refs #420)
guycorbaz Sep 29, 2026
7aa56d2
docs(25-4-c): validation P5 ciblée — close, 0 > LOW (refs #420)
guycorbaz Sep 29, 2026
63a6d6a
fix(25-4-c): le rapprochement reconnaît le solde d'une facture réglée…
guycorbaz Sep 30, 2026
8d33460
fix(25-4-c): revue de code P1 — CHANGELOG replacé, traductions univoq…
guycorbaz Sep 30, 2026
4c36ac9
docs(25-4-c): revue de code P2 — close, 0 > LOW ; story done (refs #420)
guycorbaz Sep 30, 2026
b90d0d2
docs(25-4-c2): story créée — l'invariant de version au règlement, et …
guycorbaz Sep 30, 2026
cc79287
docs(25-4-c2): validation P1 — 1 HIGH, 2 MED, 2 LOW remédiés (refs #480)
guycorbaz Sep 30, 2026
6810cd9
docs(25-4-c2): validation P2 — close, 0 > LOW (refs #480)
guycorbaz Sep 30, 2026
177135f
fix(25-4-c2): un règlement partiel marque la facture, et l'acceptatio…
guycorbaz Sep 30, 2026
b3a740a
fix(25-4-c2): revue de code P1 — gardes rows_affected, RELEASE SAVEPO…
guycorbaz Sep 30, 2026
3de67e6
docs(25-4-c2): revue de code P2 ciblée — close, 0 > LOW ; story done …
guycorbaz Sep 30, 2026
de7a340
merge main (#483 squashé, arbre identique à 4c36ac99) dans 25-4-c2
guycorbaz Sep 30, 2026
5d7b1b3
chore(25-4-c3): arbitrage de Guy — l'écart d'arrondi passe en écritur…
guycorbaz Sep 30, 2026
7e98ca7
docs(25-4-c3): découpée en a1 / a2 / b ; story c3-a1 créée — le régla…
guycorbaz Sep 30, 2026
06c075b
docs(25-4-c3-a1): validation P1 — 2 MED remédiés (refs #476)
guycorbaz Sep 30, 2026
e52cde9
docs(25-4-c3-a1): validation P2 ciblée — close, 0 > LOW (refs #476)
guycorbaz Sep 30, 2026
42c1ca4
merge main (#485 squashé, arbre identique à de7a3406) dans 25-4-c3
guycorbaz Sep 30, 2026
55d9855
feat(25-4-c3-a1): désigner le compte de différences d'arrondi dans le…
guycorbaz Sep 30, 2026
aa76eb2
fix(25-4-c3-a1): revue de code P1 — compte d'arrondi validé seulement…
guycorbaz Sep 30, 2026
c5c5beb
docs(25-4-c3-a1): revue de code P2 ciblée — close, 0 > LOW ; story do…
guycorbaz Sep 30, 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
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ Le contenu est rédigé en français à destination des **fiduciaires, PME, ind

### Added

- **Désigner le compte de différences d'arrondi dans les paramètres ([#476](https://github.com/guycorbaz/kesh/issues/476)).** *Paramètres → Facturation* porte une nouvelle section, *Différences d'arrondi* : le compte — charge ou produit, actif et imputable — qui recevra l'écart d'un demi-centime au plus qu'un paiement arrondi au centime laisse sur une facture dont le total a plus de deux décimales. On le crée dans le plan comptable s'il n'existe pas, puis on le choisit ici. Le réglage n'est encore lu par aucune écriture : le passage des écarts en écriture suit. *(API : `defaultRoundingAccountId` dans `GET` et `PUT /company/invoice-settings` ; absent du corps d'un `PUT`, il est préservé ; à `null`, effacé.)*

- **Consulter le journal d'audit à l'écran.** La trace de chaque opération qui modifie les livres se lisait depuis la v0.12.0 par l'interface de programmation seulement, ce qui supposait un outil technique. Elle se consulte désormais dans l'application — *Administration → Journal d'audit*, pour les comptables et les administrateurs : filtres par période, type d'entité, numéro et action, actions et types traduits dans la langue de l'installation, détail de chaque entrée, export CSV. ⚠️ Les dates filtrent sur des **jours UTC** ; le tableau affiche l'heure locale. ([#378](https://github.com/guycorbaz/kesh/issues/378))

- **Annuler un règlement client.** Un règlement enregistré par erreur était jusqu'ici **définitivement incorrigible** : la contre-passation directe de son écriture était refusée, et la seule sortie — une écriture manuelle — laissait la facture se dire réglée quand le grand livre disait le contraire. La fiche facture liste désormais ses règlements, et chacun s'**annule par contre-passation** : une écriture inverse **datée du jour**, le règlement retiré de la facture, le montant redevenu dû. Les deux écritures restent visibles au grand livre.
Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# Prompts — revue de code P1, Story 25-4-c3-a1 (le réglage du compte d'arrondi)

*Versionné le 2026-09-30. Trois lentilles en parallèle, **Sonnet**, contexte frais. Diff : le commit
d'implémentation, `git show 55d98555 (hors `_bmad-output`, PDF et squash)`, écrit dans
`/tmp/claude-1000/-home-gcorbaz-devel-kesh/379e6f94-8029-42cb-9720-fa27c2fb204c/scratchpad/c3a1-p1.diff`.*

## Commun aux trois lentilles

**Rendu** : findings avec sévérité (CRITICAL/HIGH/MEDIUM/LOW), endroit exact (`fichier:ligne`),
**preuve** (code lu cité, commande et sortie), correction proposée. ⛔ **La liste des axes réellement
exercés ET de ceux qui ne l'ont pas été** — un rapport sans elle ne compte pas.

**Interdits** : n'écrire aucun fichier du dépôt ; aucune commande qui écrit dans le dépôt ou dans une
base — `scripts/prepare-release.sh`, `scripts/regen-test-schema.sh`, `scripts/install-hooks.sh`,
`scripts/test-fast.sh`, `scripts/mem-guard.sh`, `make`, `latexmk`, tout `git commit`/`push`/`add`/
`stash`/`reset`/`rebase`/`checkout`/`switch`/`worktree`, `sqlx migrate`, `cargo test`/`nextest`,
`npm run`, `npx playwright`, `gh issue create`/`comment`/`edit`. Autorisés : lecture, `grep`,
`git log`/`show`/`diff`, `gh issue view`, `pdftotext` vers le scratchpad, `cargo check`.

## Lentille 1 — Blind Hunter (`bmad-review-adversarial-general`)

Reçoit **le diff seul**, aucun contexte projet. Revue adversariale générale.
## Lentille 1 — Blind Hunter (`bmad-review-adversarial-general`)

Reçoit **le diff seul**, aucun contexte projet. Revue adversariale générale.

## Lentille 2 — Edge Case Hunter (`bmad-review-edge-case-hunter`)

Diff **et** lecture du dépôt.
- **Tous les sites qui énumèrent les colonnes** de `company_invoice_settings` : `grep -rn "company_invoice_settings\|default_payable_account_id\|defaultPayableAccountId" crates/ frontend/src` —
une projection oubliée casse au runtime (`ColumnNotFound`), une fixture frontend oubliée casse le type.
- `PUT /company/invoice-settings` : sémantique « absent préservé / `null` effacé » (`double_option`) —
interaction avec le verrou optimiste, le court-circuit no-op, l'audit ; le déplacement de
`double_option` vers `crate::helpers` change-t-il quoi que ce soit pour `reconciliation_rules` ?
- `validate_account_of` : types acceptés, `postable`, société, archivé ; les champs historiques gardent-ils
exactement leur comportement ?
- Migration : P1 (non breaking), P5 (compteurs de `docs/migrations-idempotence-audit.md` — recompte-les),
P6 (`migrations_upgrade_path.rs` : `total` et soustracteur, frontière), P8 (`migrations.sha384`), squash.
- Sauvegarde : l'import d'un backup antérieur (test `strip_column`) — est-il réellement discriminant ?
Un backup **postérieur** vers un binaire antérieur ?
- Frontend : sélecteur, `withCurrentAccount`, envoi ; le test Vitest et le Playwright prouvent-ils ce qu'ils
annoncent ? Le Playwright laisse-t-il la base propre s'il échoue en route ?

## Lentille 3 — Acceptance Auditor

Diff, fiche `_bmad-output/implementation-artifacts/25-4-c3-a1-reglage-compte-arrondi.md`, lecture du dépôt.
Chaque AC (1 à 8) contre le code ; « Ce qu'il ne faut pas faire » (pas de rôle, pas de donnée écrite par la
migration, pas de numéro dans le code, pas d'écriture lisant le réglage) ; le Dev Agent Record (affirme-t-il
seulement ce qui a tourné ? décomptes recomptés ?). ⛔ **Le manuel** : `docs/manual/fr/admin-manual.tex`
(paragraphe *Compte de différences d'arrondi*) et son **PDF aplati**
(`pdftotext docs/manual/fr/admin-manual.pdf - | tr '\n' ' ' | tr -s ' '`) — dit-il vrai sur le code, et
sur ce qui n'est pas encore livré ? Le CHANGELOG dit-il vrai (sémantique de l'API) ?
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Prompt — revue de code P2 ciblée, Story 25-4-c3-a1 (le réglage du compte d'arrondi)

*Versionné le 2026-09-30. **Passe ciblée** : une lentille (Haiku 4.5), contexte frais, braquée sur la
remédiation P1 — `git show aa76eb2c`, écrit dans
`/tmp/claude-1000/-home-gcorbaz-devel-kesh/379e6f94-8029-42cb-9720-fa27c2fb204c/scratchpad/c3a1-p2.diff`.
Dépôt `/home/gcorbaz/devel/kesh`, lecture seule. Fiche : `_bmad-output/implementation-artifacts/25-4-c3-a1-reglage-compte-arrondi.md`.*

## Axes — tous obligatoires

1. **La validation conditionnelle** (`crates/kesh-api/src/routes/company_invoice_settings.rs`, fichier
courant) : `default_rounding_account_id` n'est validé que s'il diffère de `current`. Cherche un chemin
où un compte **invalide** est désormais accepté à tort : `current` lu hors transaction avant le
`update` — une course entre deux `PUT` peut-elle faire enregistrer un compte jamais validé ? Le verrou
optimiste (`version`) le rattrape-t-il ? Un compte d'une **autre société** peut-il passer ainsi ?
2. **Le test neuf** `settings_unchanged_archived_rounding_account_does_not_block_other_changes`
(`crates/kesh-api/tests/idor_multi_tenant_e2e.rs`) : prouve-t-il ce qu'il annonce ?
3. **Le Playwright** (`frontend/tests/e2e/settings-rounding-account.spec.ts`) : le `finally` peut-il
lui-même échouer et masquer l'erreur d'origine ? Laisse-t-il la base propre dans tous les cas ?
4. **`double_option` en `pub(crate)`** : les deux sites l'utilisent-ils toujours
(`grep -rn "double_option" crates/kesh-api/src`) ?

## Ce que tu rends

- **Findings** : sévérité, endroit exact, **preuve** : la commande exécutée **et sa sortie copiée**, ou
l'extrait de code lu avec son numéro de ligne. Un finding sans preuve ne sera pas retenu ; un « 0
finding » sans preuve non plus.
- ⛔ **La liste des axes réellement exercés ET de ceux qui ne l'ont pas été.**

## Interdits

⛔ N'écris aucun fichier du dépôt ; aucune commande qui écrit dans le dépôt ou dans une base
(`scripts/*`, `make`, `latexmk`, `git commit`/`push`/`add`/`stash`/`reset`/`rebase`/`checkout`/`switch`,
`sqlx migrate`, `cargo test`/`nextest`, `npm run`, `npx playwright`, `gh issue create`/`comment`/`edit`).
Autorisés : lecture, `grep`, `git log`/`show`/`diff`, `gh issue view`, `cargo check`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# Prompt — validation P1, Story 25-4-c3-a1 (le réglage du compte d'arrondi)

*Versionné le 2026-09-30. **Une lentille** (Sonnet), contexte frais.*

Dépôt `/home/gcorbaz/devel/kesh`, branche `story/25-4-c3-arrondi-centime`. Fiche à valider :
`_bmad-output/implementation-artifacts/25-4-c3-a1-reglage-compte-arrondi.md`. Issue : `gh issue view 476`
(lire les commentaires : arbitrages de Guy). Registre : `sprint-status.yaml`, lignes `25-4-c3*`. Règles :
`CLAUDE.md` (§ *Migration breaking policy* P1–P8 en particulier). Checklist :
`.claude/skills/bmad-create-story/checklist.md`.

Les arbitrages de Guy (réglage et non rôle ; compte créable dans le plan et choisi dans les paramètres ;
découpage a1 / a2 / b) sont **retenus** : ne pas les contester, en contester la mise en œuvre.

## Axes — tous obligatoires

1. **Chaque référence `fichier:ligne`** existe et dit ce que la fiche affirme.
2. **Inventaire des sites qui énumèrent les colonnes de `company_invoice_settings`** — pars du symptôme :
`grep -rn "default_vat_decompte_account_id\|defaultVatDecompteAccountId\|company_invoice_settings" crates/ frontend/src docs --include=*.rs --include=*.ts --include=*.svelte --include=*.sql --include=*.md --include=*.tex`.
Chaque site qui énumère les champs (projection SQL, `FromRow`, JSON d'audit, export, tests, types
frontend, fixtures E2E, seed, onboarding) doit apparaître dans la fiche ou être explicitement sans
objet. Un site oublié qui casse au **runtime** (`ColumnNotFound`) est au moins HIGH.
3. **La migration** : est-elle réellement non breaking au sens de P1 (un binaire antérieur lit-il une
table avec une colonne en plus — `SELECT *` quelque part ?) ; P5 (compteurs de l'audit) ; P6 (sites
positionnels) ; le squash et `test_schema_guard` ; y a-t-il un manifeste de sommes de contrôle des
migrations (`find crates -name "*.sha384"`) ; `migrations_upgrade_path.rs` a-t-il un `assert_eq!(total, N)` ?
4. **La sauvegarde (AC 6)** : lis `crates/kesh-db/src/backup.rs` et l'import. Un `.keshbackup` antérieur,
sans la colonne, s'importe-t-il (insertion par nom de colonnes ? `parse_and_verify` compare-t-il les
colonnes ?). Et un `.keshbackup` **postérieur** importé par un binaire antérieur ?
5. **La validation (AC 3)** : `validate_account` — l'étendre sans changer le comportement des champs
existants est-il faisable ? Les comptes TVA sont-ils contrôlés `postable` ailleurs ? Un compte de
groupe (`postable = false`) peut-il aujourd'hui être choisi comme compte TVA ?
6. **Les gardes voisines (AC 5)** : que se passe-t-il aujourd'hui quand on archive ou supprime un compte
désigné comme compte TVA dans les réglages (route d'archivage des comptes, message d'erreur de la FK) ?
7. **L'écran (AC 4)** : faisabilité dans `settings/invoicing/+page.svelte`, type frontend, garde i18n
(compteur exact), E2E existant de cet écran (`frontend/tests/e2e/`).
8. **Le manuel** : `docs/manual/fr/admin-manual.tex` autour de `:1994`, et **PDF aplati**
(`pdftotext docs/manual/fr/admin-manual.pdf - | tr '\n' ' ' | tr -s ' '` vers
`/tmp/claude-1000/-home-gcorbaz-devel-kesh/379e6f94-8029-42cb-9720-fa27c2fb204c/scratchpad/`).
`docs/api-external.md` décrit-il les réglages de facturation ?
9. **Périmètre** : modules recomptés depuis les tâches ; frontière avec la c3-a2 et la c3-b nette ?

## Ce que tu rends

- **Findings** : sévérité (CRITICAL/HIGH/MEDIUM/LOW), endroit exact, **preuve** (commande exécutée et sa
sortie, ou code lu cité), correction proposée.
- ⛔ **La liste des axes réellement exercés ET de ceux qui ne l'ont pas été.** Un rapport sans elle ne
compte pas.

## Interdits

⛔ N'écris aucun fichier du dépôt ; aucune commande qui écrit dans le dépôt ou dans une base —
`scripts/prepare-release.sh`, `scripts/regen-test-schema.sh`, `scripts/install-hooks.sh`,
`scripts/test-fast.sh`, `scripts/mem-guard.sh`, `make`, `latexmk`, tout `git commit`/`push`/`add`/
`stash`/`reset`/`rebase`/`checkout`/`switch`/`worktree`, `sqlx migrate`, `cargo test`/`nextest`,
`npm run`, `npx playwright`, `gh issue create`/`comment`/`edit`. Autorisés : lecture, `grep`,
`git log`/`show`/`diff`, `gh issue view`, `pdftotext` vers le scratchpad, `cargo check`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Prompt — validation P2 ciblée, Story 25-4-c3-a1 (le réglage du compte d'arrondi)

*Versionné le 2026-09-30. **Passe ciblée** : une lentille (Haiku 4.5), contexte frais, braquée sur la
remédiation P1 — `git show 06c075be -- _bmad-output/implementation-artifacts/25-4-c3-a1-reglage-compte-arrondi.md`
(contexte ; les numéros de ligne font foi dans les fichiers courants). Fiche :
`_bmad-output/implementation-artifacts/25-4-c3-a1-reglage-compte-arrondi.md`, **état actuel**. Dépôt
`/home/gcorbaz/devel/kesh`, lecture seule.*

⚠️ La fiche décrit du travail **à faire** : ne signale pas comme défaut que le code ne porte pas encore
ce qu'elle prévoit. Juge la fiche : exactitude de ce qu'elle affirme, faisabilité de ce qu'elle demande.

## Axes — tous obligatoires

1. **AC 5** : `crates/kesh-api/src/lib.rs:340-352` — est-il exact qu'aucune route ne supprime un compte
(`grep -rn "delete" crates/kesh-api/src/routes/accounts.rs crates/kesh-db/src/repositories/accounts.rs`) ?
Est-il exact que l'archivage d'un compte désigné comme compte TVA n'est gardé nulle part (lis la
route et le dépôt d'archivage des comptes) ?
2. **AC 6** : `crates/kesh-db/src/backup.rs` — `export_table` et `column_constraints` lisent-ils bien
`INFORMATION_SCHEMA` ? `check_schema_compat` accepte-t-il une colonne absente et facultative ? Le test
`full_import_without_company_column_merges_archive_entries_as_null` existe-t-il à
`crates/kesh-api/tests/admin_full_import_e2e.rs:2167` et utilise-t-il `strip_column` ?
3. **Dev Notes** : `migrations_upgrade_path.rs` porte-t-il `assert_eq!(total, 69` ?
`docs/optimistic-locking-patterns.md:48` est-il bien l'énumération décrite ?
4. **Cohérence interne** : AC ↔ tâches, Change Log.

## Ce que tu rends

- **Findings** : sévérité, endroit exact, **preuve** : la commande exécutée **et sa sortie copiée**, ou
l'extrait de code lu avec son numéro de ligne. Un finding sans preuve ne sera pas retenu ; un « 0
finding » sans preuve non plus.
- ⛔ **La liste des axes réellement exercés ET de ceux qui ne l'ont pas été.**

## Interdits

⛔ N'écris aucun fichier du dépôt ; aucune commande qui écrit dans le dépôt ou dans une base
(`scripts/*`, `make`, `latexmk`, `git commit`/`push`/`add`/`stash`/`reset`/`rebase`/`checkout`/`switch`,
`sqlx migrate`, `cargo test`/`nextest`, `npm run`, `npx playwright`, `gh issue create`/`comment`/`edit`).
Autorisés : lecture, `grep`, `git log`/`show`/`diff`, `gh issue view`, `cargo check`.
Loading
Loading