Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
87302c7
docs(25-6-b): fiche créée — le PDF d'une facture est figé (refs #387)
guycorbaz Oct 3, 2026
9048d8e
docs(25-6-b): registre — découpage de la 25-6 reporté sur cette branc…
guycorbaz Oct 3, 2026
cd4a327
docs(25-6-b): prompt de validation P1 (refs #387)
guycorbaz Oct 3, 2026
84cc3c0
docs(25-6-b): validation P1 — garde de statut au gel, colonnes en une…
guycorbaz Oct 3, 2026
5ed8d63
docs(25-6-b): arbitrages de Guy — refiger (Admin) et gel par tout rôl…
guycorbaz Oct 4, 2026
ac125b2
docs(25-6-b): prompt de validation P2 (refs #387)
guycorbaz Oct 4, 2026
2d858b0
docs(25-6-b): validation P2 — garde de version au gel, chapitre sauve…
guycorbaz Oct 4, 2026
0725de5
docs(25-6-b): arbitrage de Guy (pas de découpage) et prompt de valida…
guycorbaz Oct 5, 2026
5433755
docs(25-6-b): validation P3 — totaux du registre, tests de la garde v…
guycorbaz Oct 5, 2026
b8e9189
docs(25-6-b): prompt de validation P4 ciblée (refs #387)
guycorbaz Oct 5, 2026
7375a80
docs(25-6-b): validation P4 ciblée — 0 finding, boucle close ; dev en…
guycorbaz Oct 5, 2026
51d1696
feat(25-6-b): migration — quatre colonnes du PDF figé sur invoices (r…
guycorbaz Oct 5, 2026
bd753fd
feat(25-6-b): le PDF d'une facture est figé au premier rendu (refs #387)
guycorbaz Oct 5, 2026
9d84298
feat(25-6-b): écran, export, manuels et gates — story en revue (refs …
guycorbaz Oct 5, 2026
8ac0a4d
fix(25-6-b): revue P1 — garde d'envoi, message du 410, inbox, manuels…
guycorbaz Oct 5, 2026
b2eeaab
fix(25-6-b): revue P2 — message du 410, clé d'API, langue du document…
guycorbaz Oct 5, 2026
78b16da
fix(25-6-b): revue P3 — adoption sous garde d'usage, refus du refigea…
guycorbaz Oct 5, 2026
28818c0
docs(25-6-b): revue P4 ciblée — 0 finding, boucle close ; story done …
guycorbaz Oct 5, 2026
23526c6
Merge remote-tracking branch 'origin/main' into story/25-6-b-pdf-fact…
guycorbaz Oct 5, 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
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@ Le contenu est rédigé en français à destination des **fiduciaires, PME, ind

### Fixed

- **Le PDF d'une facture changeait après son émission ([#387](https://github.com/guycorbaz/kesh/issues/387)).** Kesh le régénérait à chaque téléchargement, à partir des données du moment : modifier vos coordonnées, l'adresse du client ou la mise en page modifiait aussi les factures **déjà envoyées**, et deux téléchargements successifs ne rendaient jamais le même fichier. Impossible, dans ces conditions, de produire la copie exacte d'une pièce émise.

**Désormais**, le PDF est **figé** au premier téléchargement ou au premier envoi par e-mail qui suit la validation. Kesh le conserve avec son empreinte et rend ensuite ce même fichier, octet pour octet — y compris pour une facture annulée par un avoir. La fiche facture affiche *Document figé le …*. La dévalidation détache le document ; la revalidation en figera un nouveau. Les factures validées avant cette version sont figées à leur prochain téléchargement, avec les données du moment.

⚠️ **Le répertoire des documents (`KESH_DOCUMENTS_DIR`) contient désormais des pièces à conserver, et il doit être sauvegardé et restauré avec la base** : ni le dump MariaDB ni le fichier `.keshbackup` ne les contiennent ([#503](https://github.com/guycorbaz/kesh/issues/503)). Un fichier manquant n'est jamais régénéré en silence : le téléchargement est refusé avec un message qui nomme le fichier à restaurer, et un administrateur peut, à défaut, **refiger** la facture — un nouveau document, tracé au journal d'audit avec l'ancienne et la nouvelle empreinte. Le manuel administrateur décrit la procédure.

- **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.
Expand Down Expand Up @@ -54,6 +60,10 @@ Le contenu est rédigé en français à destination des **fiduciaires, PME, ind

### Changed

- **`invoices.csv` de l'export de souveraineté gagne trois colonnes** — `pdf_sha256`, `pdf_frozen_at`, `pdf_language`, l'empreinte, la date et la langue du PDF émis ([#387](https://github.com/guycorbaz/kesh/issues/387)). Elles s'insèrent **avant** `version`, `created_at` et `updated_at` : un outil qui lit ce fichier par position de colonne doit être ajusté. Le PDF lui-même n'est pas dans l'archive. L'API expose `pdfFrozenAt` et `pdfLanguage` sur la facture, et une route d'administration `POST /api/v1/invoices/{id}/pdf/refreeze` refige un document dont le fichier a disparu.

- **Le PDF téléchargé d'une facture est dans la langue du client**, comme celui qui part par e-mail ([#387](https://github.com/guycorbaz/kesh/issues/387)). Il suivait jusqu'ici la langue de l'installation : le document téléchargé n'était donc pas forcément celui que le client avait reçu. Le premier téléchargement, quel que soit le rôle de l'utilisateur — consultation comprise —, fige le document et l'inscrit au journal d'audit. Une **clé d'API en lecture** fige aussi, à son nom — et une simple requête `HEAD` suffit. Une facture **annulée** dont le fichier manque ne peut pas être refigée : seule la restauration du fichier la répare. Restaurer une sauvegarde **antérieure** au gel fera figer un nouveau document au téléchargement suivant. Les rappels, eux, restent produits à chaque envoi ([#502](https://github.com/guycorbaz/kesh/issues/502)).

- **« 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.)*
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@

- **Comptabilité en partie double** — plan comptable suisse, écritures validées, journal d'audit consultable à l'écran
- **Carnet d'adresses & catalogue produits** — contacts, conditions de paiement, TVA
- **Facturation QR Bill 2.2** — génération PDF conforme au standard suisse, **adresses structurées (type S)** conformes à l'exigence SIX en vigueur (rue / n° / NPA / localité séparés) ✓
- **Facturation QR Bill 2.2** — génération PDF conforme au standard suisse, **adresses structurées (type S)** conformes à l'exigence SIX en vigueur (rue / n° / NPA / localité séparés) ; le PDF émis est **figé** au premier téléchargement ou envoi, dans la langue du client, et rendu ensuite à l'identique ✓
- **Ventilation du chiffre d'affaires par ligne de facture** — chaque ligne peut porter son propre **compte de produit** (honoraires, marchandises, prestations…), sélectionnable dans le formulaire ; une ligne laissée vide suit le compte par défaut de la société, affiché explicitement. L'écriture comptable ventile le crédit sur les bons comptes dès la validation, avoirs compris — compte de résultat exploitable sans reclassement manuel ✓
- **Compte de produit sur la fiche article** — chaque article du catalogue porte **son** compte de produit, choisi une fois plutôt que ressaisi à chaque facture ; la ligne montée depuis le catalogue le **recopie** automatiquement, puis reste autonome — vidée, elle suit le compte par défaut de la société ✓
- **Coordonnées de l'émetteur sur la facture** — téléphone, e-mail et site web figurent sous votre adresse sur le PDF, saisis une fois dans les réglages ; chaque champ est facultatif et n'occupe aucune place s'il est vide ✓
Expand Down
Loading
Loading