Kesh est un logiciel de comptabilité et de gestion pour indépendants, TPE et associations en Suisse. Gratuit, open source, auto-hébergé.
- Fonctionnalités
- Pile technique
- Démarrage rapide
- Structure du projet
- Documentation
- Développement
- Tests
- Feuille de route
- Contribuer
- Licence
- Comptabilité en partie double — plan comptable suisse, écritures validées, modifiables et supprimables tant que l'exercice est ouvert et qu'elles ne sont pas lettrées, journal d'audit consultable à l'écran
- Lettrage et postes ouverts — ce qui reste ouvert sur un compte de tiers, à une date, ligne à ligne, et dont le total égale le solde du compte (Mensuel → Postes ouverts) ; lettrage manuel avec des rapprochements proposés (Kesh propose, il ne lettre jamais une proposition de lui-même) et délettrage à l'écran ; factures clientes soldées, factures fournisseurs payées et contre-passations lettrées d'office ; le code de lettrage sur la fiche d'écriture et au Grand livre ✓
- 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) ; 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 Paramètres ; chaque champ est facultatif et n'occupe aucune place s'il est vide ✓
- Carnet de contacts structuré — contacts Personne (prénom + nom) ou Entreprise (raison sociale), adresse structurée (QR-facture), et personnes de contact rattachées à une entreprise (interlocuteurs, à titre informatif) ✓
- Prévention des doublons à la saisie — pendant que vous tapez le nom d'un nouveau contact, Kesh signale ceux qui lui ressemblent déjà (casse, accents, traits d'union et espaces indifférents), et avertit si l'IDE saisi appartient à une fiche existante — y compris archivée, cas où l'enregistrement serait refusé sans que la fiche soit visible dans le carnet. Kesh signale, il ne bloque jamais : deux clients peuvent légitimement porter des noms très proches ✓
- Règlements clients — enregistrement d'un règlement depuis la fiche (virement, espèces ou un autre compte de contrepartie — jamais le compte débiteurs de la facture), partiel ou total, avec son écriture ; liste des règlements de la facture et annulation par contre-passation ✓
- Avoirs (notes de crédit) — annulation d'une facture validée par création d'un avoir lié (séquence séparée
AV-…), contre-passation comptable automatique (TVA comprise), PDF « Avoir » ✓ - Envoi de factures par e-mail — bouton sur la facture validée : QR-facture PDF jointe, objet/message pré-remplis dans la langue du contact avec civilité personnalisée (modèles multilingues FR/DE/IT/EN configurables par l'admin), destinataire verrouillé sur la fiche contact, Reply-To = e-mail de la société, traçage « Envoyée le … à … » et renvoi possible ✓
- Import bancaire CAMT.053 + CSV multi-encodage — parser + persistance + UI ✓, profils banque réutilisables ✓, réconciliation automatique avec score ✓, réconciliation manuelle ✓, éclatement de transaction agrégée ✓, règles d'affectation automatique ✓, annulation d'un rapprochement par contre-passation ✓, suppression d'un import dont aucune transaction n'est rapprochée, pour le réimporter ✓, devise du relevé lue — un relevé qui n'est pas en CHF est refusé ✓, sens des débits réglé au profil — le relevé CSV d'UBS s'importe tel quel, un montant de signe contraire à sa colonne fait refuser le fichier ✓ — et description courte des comptes bancaires (« UBS — Personnel ») dans les listes et sélecteurs ✓, annulation du rejet d'une transaction, remise parmi les propositions ✓, clôture d'un compte bancaire — lecture seule, historique conservé, réouverture possible ✓, rattachement d'une transaction au règlement déjà saisi depuis la fiche de la facture, sans nouvelle écriture ✓, paiement reçu après l'échéance ou un rappel proposé, et facture échue la première en tête à score égal (art. 87 CO) ✓, réconciliation des débits avec les factures fournisseur — proposée, acceptée, payée et lettrée ✓
- Factures fournisseurs & règlement — enregistrement d'une facture reçue (écriture d'achat automatique : charge + impôt préalable + dette créancier), règlement binaire en un clic (virement bancaire → compte source, ou compte interne libre), annulation de la facture — même payée, son règlement restant au grand livre — et annulation du règlement, toutes deux par contre-passation ✓
- Paiement par fichier pain.001 — génération d'un fichier de virement ISO 20022
pain.001.001.09(Swiss Payment Standards / SIX) à partir des factures fournisseurs ouvertes, flux deux temps (lot → import e-banking → confirmation comptabilise les règlements) ✓ - Documents à traiter — dépôt de documents fournisseurs (PDF ou images, avec ou sans Swiss QR-facture) dans un dossier d'import, import lancé depuis l'écran, décodage du QR côté serveur quand il y en a un, archivage du document et liste « Documents à traiter » avec badge QR-facture ou Sans QR-code, aperçu, « Retirer de la liste » et « Créer une facture » à côté du document (coordonnées de paiement reprises du QR et verrouillées, ou saisies et contrôlées sans QR ; fournisseur proposé — jamais choisi d'office — ou créé sans quitter la saisie), avec rapport d'import ; « Voir le document » depuis la fiche de la facture et depuis son écriture, document joint après coup à une facture saisie sans pièce, ou détaché ✓
- TVA suisse — calcul et rapport par période ✓, comptabilisation de la TVA due aux ventes ✓, assistant d'achat avec impôt préalable ✓, décompte TVA (solde net dû à l'AFC) et réconciliation rapport ↔ grand livre ✓ (décompte officiel AFC / e-décompte ESTV à venir)
- Comptabilité analytique par projet — dimension « projet » (2 niveaux, projet → sous-projets) affectable sur tous les flux de saisie : écritures manuelles (par ligne), factures de vente et fournisseurs (document), et réconciliation bancaire (rapprochement, ventilation, projet par défaut sur règle) ✓ ; deux rapports exportables PDF/CSV — Dépenses par projet (toutes les charges, drill-down jusqu'à l'écriture, pour les déductions fiscales) et Rendement par projet (coût investi / revenus / résultat net / rendement %), avec agrégation des sous-projets et vue par exercice ou cumulée ✓
- Clôture d'exercice & report à -nouveau — les soldes du bilan se reportent automatiquement d'un exercice à l'autre, calculés en temps réel depuis l'origine (aucune écriture de clôture ni de report à passer à la main) ✓ ; lignes « Résultat reporté » et « Résultat de l'exercice » au bilan, section « Capitaux propres » dédiée (CO 959a) ✓ ; la clôture est un verrou (immutabilité + audit, CO art. 957-964) avec réouverture possible par un administrateur sur motif justifié et tracé ✓ ; rôle explicite par compte — Kesh ne devine jamais la fonction d'un compte d'après son numéro, le plan comptable reste librement renumérotable ✓ ; bilan d'ouverture pour reprendre une comptabilité existante (écran « Soldes de départ »), avec complément d'un compte oublié sans tout ressaisir ✓ ; préparation de la clôture — sept contrôles en lecture seule avant de clôturer un exercice (transactions à rapprocher, relevé de fin d'exercice, brouillons, pièces à compléter…), chacun menant à l'écran où agir ✓ ; transitoires contre-passées au premier jour de l'exercice suivant, depuis la fiche de l'écriture (#232) ✓
- API externe à clé PAT — clés d'accès read / read-write par entreprise pour intégrations IA & logiciels tiers (auth
Authorization: Bearer, gestion via/settings/api-keys) ✓ ; aucune clé n'atteint les fonctions d'administration, quel que soit le rôle de qui l'a créée — révoquer une clé compromise suffit ✓ — voirdocs/api-external.md - Export/import d'installation — sauvegarde complète
.keshbackup(la société de l'installation, ses utilisateurs et les données système — et, depuis la v0.15.0, les pièces justificatives : documents fournisseur, PDF figés) via l'UI admin (Administration → Sauvegarde complète/Restaurer / Importer) pour migrer ou restaurer une installation sans accès SSH ✓ ; sur une installation neuve, la restauration se lance depuis l'assistant, juste après/setup(v0.15.0) ; sauvegarde automatique faite par Kesh — chaque jour par défaut, avec rétention, contrôle de l'espace disque, état et alerte à l'écran, sauvegardes du serveur téléchargeables (v0.15.0) — réservé au rôle Admin - Exploitation sur NAS Synology — sauvegarde planifiée de la base par
scripts/synology/kesh-dump.sh(dump cohérent, verrou, empreinte, dans le Planificateur de tâches de DSM) et restauration parkesh-restore.sh(refus tant qu'un conteneur de Kesh est actif ou qu'aucun n'est trouvé, dump de sécurité de la base courante avant tout rechargement) — procédures au manuel d'administration, § Sauvegarde et restauration ✓ - Récupération de mot de passe par email — lien de réinitialisation self-service (valable 30 min, usage unique, anti-énumération), opt-in via
KESH_FEATURE_FORGOT_PASSWORD+ config SMTP ✓ — fallback break-glass admin conservé - Multilingue — messages d'erreur API en FR/DE/IT/EN (langue choisie à l'onboarding ; sélecteur de langue dans l'interface à venir)
- Multi-utilisateurs — RBAC avec rôles, JWT + refresh tokens, isolation multi-tenant par
company_id
- Backend : Rust 1.97 (édition 2024), Axum, SQLx
- Frontend : SvelteKit 2 + Svelte 5, TypeScript, Tailwind CSS 4
- Base de données : MariaDB 10.11+ (parité prod NAS Synology Package Center DSM, compat ≥ 10.6 — cf. Story 10-1 D3)
- Déploiement : Docker Compose (web app uniquement)
- Tests :
cargo test, Vitest, Playwright
- Rust ≥ 1.97 (installé automatiquement via
rust-toolchain.toml) - Node.js ≥ 20
- Docker + Docker Compose
# 1. Cloner le repo
git clone https://github.com/guycorbaz/kesh.git
cd kesh
# 2. Démarrer MariaDB + backend (mode dev complet) — sans .env : au premier
# accès, l'écran /setup crée l'administrateur. Depuis le clone principal,
# jamais un worktree (cf. docs/testing.md § « Base de dev jetable »).
docker compose -f docker-compose.dev.yml up -d
# 3. (Facultatif) Fixer vos propres valeurs
cp .env.example .env
# Adapter les valeurs dans .env, dont KESH_JWT_SECRET (openssl rand -hex 32) —
# le placeholder <GENERATE_ME: …> laissé tel quel est refusé au démarrage
# 4. Frontend (hot reload)
cd frontend
npm install
npm run devL'application est accessible sur http://localhost:5173 (frontend dev) et http://localhost (API en mode Docker, port 80 ; en mode cargo run natif sur Linux non-root, lancer le backend avec KESH_PORT=3000 — et KESH_ADMIN_BACKUP_DIR sur un dossier inscriptible, sans quoi tout import et tout export d'installation sont refusés — ET le frontend avec KESH_BACKEND_URL=http://localhost:3000 npm run dev pour aligner le proxy vite).
Les images officielles sont publiées sur Docker Hub à chaque tag v*.*.* :
docker pull gcorbaz/kesh:latestkesh/
├── crates/ # Backend Rust (workspace multi-crates)
│ ├── kesh-core/ # Logique métier pure (types, validation)
│ ├── kesh-db/ # Persistance MariaDB, migrations
│ ├── kesh-api/ # Serveur HTTP Axum
│ ├── kesh-i18n/ # Internationalisation (Fluent)
│ ├── kesh-qrbill/ # Génération QR Bill 2.2
│ ├── kesh-payment/ # Fichiers pain.001
│ ├── kesh-import/ # Parseurs CAMT.053, CSV
│ ├── kesh-reconciliation/ # Rapprochement bancaire
│ ├── kesh-report/ # Bilan, résultat, balance
│ └── kesh-seed/ # Données d'amorçage
├── frontend/ # SvelteKit SPA
├── charts/ # Plans comptables suisses
├── docs/ # Documentation technique
└── .github/workflows/ # Pipelines CI/CD
- Manuel utilisateur complet (FR) :
docs/manual/fr/user-manual.pdf— référence d'utilisation au quotidien (onboarding, comptabilité, facturation QR Bill, import bancaire, réconciliation, rapports, conformité). - Guide de démarrage rapide (FR) :
docs/user-guide/fr/getting-started.md— prise en main express pour un premier usage. - Manuel administrateur (FR) :
docs/manual/fr/admin-manual.pdf— installation, configuration, sécurité, déploiement Docker, sauvegardes. - API externe :
docs/api-external.md— authentification par clé API (PAT), points d'accès, exemples.
Les manuels DE / IT / EN sont prévus pour une version ultérieure (le français reste la langue canonique de la documentation).
Le modèle isole chaque société par company_id ; une installation en porte une :
- JWT claims : chaque token contient
user_id,role, etcompany_id - Scoping : toutes les requĂŞtes filtrent par
company_iddu JWT (défense en profondeur contre IDOR) - Onboarding : création de la company lors de l'inscription (contrat Story 6.1)
- Foreign Key :
users.company_idNOT NULL, FK verscompanies.id
Chaque user est assigné à exactement une company. Le company_id est inclus au JWT à la connexion (story 1.5) et utilisé pour scoper tous les accès aux ressources (comptes, contacts, factures, écritures comptables, etc.).
Les recherches sur les colonnes texte longues utilisent un index FULLTEXT MariaDB avec MATCH AGAINST IN BOOLEAN MODE (10Ă—+ speedup vs LIKE '%query%' au-delĂ de ~50k lignes) :
- 4 colonnes indexées :
contacts.name,products.name,products.description,journal_entries.description. - LIKE conservé sur les colonnes structurées courtes (
email,invoice_number,payment_terms). - UX prefix-search préservée via auto-append
*côté repository (Mar*matcheMarie). - Régression v0.1 documentée : perte du mid-word search (
argone matche plusCamargo) — accepté pour v0.1, traçable via 3 régression detectors actifs.
Détails du pattern, limitations BOOLEAN MODE, runbook récupération échec migration : docs/search-patterns.md.
# Backend
cargo build --workspace
cargo clippy --workspace --all-targets -- -D warnings
cargo fmt --all
# Frontend
cd frontend
npm run check # svelte-check
npm run build # build production- Branche principale :
main - Les commits sur
maindéclenchent le pipeline CI (tests + build). - Les tags
v*.*.*déclenchent le pipeline Release (build et push Docker Hub).
# Tests unitaires + intégration backend
DATABASE_URL='mysql://kesh:kesh_dev@127.0.0.1:3306/kesh' \
cargo test --workspace -- --test-threads=1
# Tests unitaires frontend
cd frontend && npm run test:unit
# Tests E2E Playwright
cd frontend && npm run test:e2eNote : les tests d'intégration SQLx créent des bases éphémères
_sqlx_test_*. L'utilisateurkeshdu conteneur de dev en a les droits — sur\_sqlx\_test%.* etkesh%., aucun droit global, comme la production qui n'a quekesh. —, posés parscripts/mariadb-init/01-dev-grants.sql; ne pas employerroot, qui laisserait passer un test dépendant d'un droit que la production n'a pas.scripts/test-fast.shvérifie ces droits avant de compiler.
Le projet suit une approche BMAD (Breakthrough Method of Agile AI-driven Development) avec une feuille de route structurée en epics :
| Version | Epics | Statut |
|---|---|---|
| v0.1 | E1 Fondations & Authentification, E2 Onboarding & Configuration, E3 Plan comptable & Écritures, E4 Carnet d'adresses & Catalogue, E5 Facturation QR Bill, E6 Qualité & CI/CD, E7 Technical Debt Closure, E8 Import bancaire & Réconciliation, E9 Rapports & Exports, E9.5 Technical Debt Closure, E10 Déploiement & Opérations | ✅ Done |
| v0.1.1 (hotfix) | Logs fichier avec rotation, fix onboarding catch-22 (fresh install) | âś… Done |
| v0.1.2 (hotfix) | Port 80 par défaut, onboarding self-service unifié (admin créé via UI au 1er boot, recovery break-glass via .env) |
âś… Done |
| v0.1.3 (hotfix) | Déblocage déploiements LAN HTTP-only (KESH_COOKIE_SECURE=false pour LAN privé *.home.arpa derrière Traefik sans HTTPS) |
âś… Done |
| v0.1.4 (hotfix) | CRUD bank_accounts post-onboarding + sidebar collapsible + restructuration UX (pages orphelines, widget solde homepage) |
âś… Done |
| v0.1.5 (hotfix) | Fix pages Facturer/Échéancier blanches en HTTP LAN (crypto.randomUUID hors contexte sécurisé) + scroll des listes déroulantes longues (plan comptable) |
âś… Done |
| v0.1.6 (hotfix) | Page détail d'une écriture comptable (/journal-entries/{id}) + fix bouton 404 « Voir l'écriture comptable » + UX facture (placement boutons ajout de ligne, libellé bouton impression) |
âś… Done |
| v0.1.7 (hotfix) | Aide + message d'erreur actionnable sur le champ QR-IBAN (compte bancaire) + fiabilisation de la suite de tests fiscal_year (dette technique) |
âś… Done |
| v0.1.8 (hotfix) | Numéro de version affiché corrigé : provient désormais du backend au runtime (champ version de /health) au lieu d'être codé en dur dans le frontend |
âś… Done |
| v0.2.0 | E17 Infra & Souveraineté — API externe PAT, export/import complet d'installation (.keshbackup), récupération de mot de passe par email, fix sécurité TOCTOU onboarding |
âś… Done |
| v0.3.0 | E11/E18 TVA Suisse — calcul + rapport par période, comptabilisation TVA due aux ventes, assistant d'achat (impôt préalable), décompte TVA (solde net AFC) et réconciliation rapport ↔ grand livre (décompte officiel AFC / e-décompte ESTV hors périmètre) | ✅ Done |
| v0.3.1 (hotfix) | Message actionnable lors de la suppression d'une écriture liée à une facture validée + garde-fou journaux (pas de déversement SQL+données quand RUST_LOG=debug) |
âś… Done |
| v0.3.2 | E12 Avoirs (notes de crédit) — annulation d'une facture validée par avoir lié, contre-passation comptable automatique (TVA comprise), PDF « Avoir », décompte TVA cohérent | ✅ Done |
| v0.4.0 | E12 Factures fournisseurs & paiements (#191/#194) — enregistrement de factures reçues + règlement binaire (virement bancaire / compte interne), génération pain.001 (virement en deux temps), import de factures déposées dans un dossier d'import, lancé depuis l'écran, avec décodage QR-facture, scan QR à la saisie ; E19 Comptabilité analytique par projet (#195) — dimension projet sur tous les flux (écritures manuelles, factures ventes & fournisseurs, réconciliation bancaire) + rapports Dépenses et Rendement par projet (rollup sous-projets, exercice/cumulé, PDF/CSV) ; base technique modernisée (Rust 1.96, dépendances à jour) | ✅ Done |
| v0.5.0 | Adresses structurées (QR-facture type S) (#213) — conformité SIX : adresses société & contacts en champs séparés (rue/n°/NPA/localité/pays), génération QR type S ; contacts Personne/Entreprise (prénom/nom séparés) + personnes de contact d'une entreprise (CRM informatif) | ✅ Done |
| v0.6.0 | E20 Envoi de factures par e-mail (#224) — modèles d'e-mail multilingues FR/DE/IT/EN éditables (Paramètres, Admin), envoi de la facture PDF QR au contact (langue & civilité du contact, destinataire verrouillé, Reply-To société) | ✅ Done |
| v0.7.0 | E21 Échéances & relances débiteurs (#245, #231, #246) — conditions de paiement structurées sur le contact (échéance pré-calculée), correction des montants TTC (QR/PDF/e-mail/échéancier), rappels de paiement multi-niveaux configurables (frais, envoi manuel par e-mail via les modèles), historique de relance, balance âgée, suspension de relance, doc admin/user | ✅ Done |
| v0.8.0 | E14 Clôture d'exercice (#232) — report à -nouveau automatique : soldes de bilan cumulés en temps réel d'un exercice à l'autre (modèle virtuel Odoo/Flectra), lignes « Résultat reporté » + « Résultat de l'exercice » au bilan, exports CSV/PDF, clôture = verrou (immutabilité CO 957-964) ; rôles de comptes explicites (le rôle d'un compte ne se déduit plus de son numéro) + réactivation d'un compte archivé (#269) ; réouverture d'un exercice clôturé (Admin, motif obligatoire, audit, garde LIFO) ; bilan d'ouverture (écran « Soldes de départ » : reprise de comptabilité, écriture d'ouverture équilibrée datée au 1er jour du premier exercice) | ✅ Done |
| v0.9.0 | E16 Facturation avancée (#152, #144, #151) — compte de produit par ligne de facture : chaque ligne peut porter son propre compte de produit (repli sur le compte par défaut de la société), l'écriture comptable ventile le crédit sur les bons comptes, avoirs compris ; compte de produit par défaut sur la fiche produit ; compléments du PDF de facture (#151) — récapitulatif TVA par taux, coordonnées de contact de l'émetteur, et numéro de client du destinataire (saisi sur la fiche contact, unique par société, cherchable, avoirs compris) | ✅ Done |
| v0.10.0 | E22 Technical Debt Closure (#294, #295, #167, #251, #301) — prévention des doublons à la saisie d'un contact : pendant la frappe, Kesh signale les contacts au nom proche (casse, accents, traits d'union et invisibles indifférents) et avertit si l'IDE saisi appartient déjà à une fiche, y compris archivée — cas où l'enregistrement serait refusé sans que la fiche soit visible ; il signale, il ne bloque jamais. Également : numéro de client canonique (deux numéros identiques à l'œil sont le même numéro, quelle que soit la composition Unicode ou la collation), durcissement des clés API (un PAT n'atteint plus aucune route d'administration — révoquer une clé compromise suffit désormais), et suite de tests 42× plus rapide (squash du schéma de test, l'heure devenue la minute et demie) | ✅ Done |
| v0.11.0 | E23 Dette i18n (#316, #283) — les écrans réclamaient des libellés que aucun des quatre catalogues ne contenait : Kesh servait alors du français correct à un germanophone, sans erreur ni avertissement. 1600 messages écrits — 358 libellés français neufs et 414 dans chacune des trois autres langues, les quatre catalogues portant désormais les mêmes 1630 clés —, et six garde-fous posés pour que le défaut ne puisse plus revenir en silence — le principal étant devenu inconditionnel : une clé sans traduction ne peut plus être tolérée, elle fait rougir le gate | ✅ Done |
| v0.11.1 (hotfix) | Trois défauts qui ne disaient rien — l'écran d'import bancaire se vidait dès qu'on y déposait un fichier CAMT.053, rendant la fonction inutilisable ; un compte de facturation pouvait s'effacer tout seul après être devenu non imputable, faisant échouer la facturation suivante sur une erreur qui ne nommait pas la cause ; le filtre Statut des factures rendait une liste vide trompeuse depuis la page 2. Plus un en-tête de colonne sans nom pour les lecteurs d'écran | ✅ Done |
| v0.12.0 | E24 « Les livres justes » — première vague de correction issue d'un audit par trois experts (comptable, fiscaliste, directeur financier) mené le 2026-08-26 sur l'ensemble du logiciel. |
✅ Publiée |
| v0.12.1 | E25 « Vague 1, la suite » — l'Epic 24 s'appelait « vague 1 » et n'en avait livré que le quart ; cet epic-ci ne se clôt qu'avec le jalon Vague 1 à zéro issue ouverte — atteint le 2026-10-07, 27 issues fermées. Une piste de contrôle qui tient : le journal d'audit survit à l'import d'une sauvegarde (#376), quatorze routes qui n'écrivaient aucune trace en écrivent une (#379), et il se consulte à l'écran (#378). Des livres qu'on corrige sans les falsifier : un numéro d'écriture n'est plus jamais réattribué (#381), le verrou de période tient contre la suppression (#443), une facture validée se dévalide au lieu de s'effacer avec son écriture (#440), et un règlement, un rapprochement ou une facture fournisseur payée s'annulent par contre-passation (#414, #418, #454). Le reste dû partout : avoir compté TTC (#455), balance âgée, échéancier et rappels au reste dû (#416), rapprochement d'un solde (#420), plus de double règlement concurrent (#480), paiement au centime (#476), total arrondi à 5 centimes (#494), montant minimum de facture (#495) et solder le reste — escompte, frais bancaires, perte sur débiteur, TVA corrigée au décompte (#384, #490). Des états qui concordent : la balance porte un solde d'ouverture et concorde avec le bilan (#385), le tableau de bord dit vrai (#388, #389), l'export de souveraineté porte toute la comptabilité (#386), le PDF d'une facture émise est figé (#387), et les soldes de départ se complètent d'un compte oublié (#445). |
âś… Done |
| v0.13.0 | E15 Lettrage & compléments — le lettrage rapproche les lignes d'un même compte qui se soldent, et une facture cliente réglée en a désormais deux : l'écriture d'encaissement livrée par l'E24 (#371) crédite le compte débiteurs que la vente avait débité. Le lettrage (#518) : l'écran Postes ouverts — ce qui reste ouvert sur un compte à une date, dont le total égale le solde —, le lettrage à la main ou sur proposition (Kesh propose, il ne lettre jamais de lui-même), le délettrage, le code de lettrage sur la fiche d'écriture et au Grand livre ; les factures clientes soldées, les factures fournisseurs payées et les contre-passations sont lettrées d'office, l'existant compris à la mise à jour. Des livres qu'on corrige : une écriture se modifie et se supprime tant que son exercice est ouvert (#532), les exercices se clôturent dans l'ordre (#543), un compte non imputable est refusé partout (#427, #429), l'avoir et le règlement passent sur les bons comptes (#473, #474, #523, #524), et l'onboarding s'inscrit au journal d'audit (#434). Exploitation : la configuration de .env atteint enfin Kesh (#550), MariaDB n'est plus publiée et n'a plus de mot de passe par défaut (#551), la sauvegarde pré-import survit au conteneur (#552). .env sont à reprendre à la mise à jour (voir le CHANGELOG). |
✅ Publiée |
| v0.13.1 (correctif) | E26 Recette de la v0.13.0 — l'import CSV d'UBS inversait chaque débit : une dépense devenait un encaissement, sans un mot (#620) ; le sens des débits devient un réglage du profil, un relevé de signe contraire est refusé, et jusqu'à 20 lignes à ignorer laissent importer le relevé UBS tel quel (#621, lecture de son préambule encore ouverte). Un compte bancaire porte une description courte affichée partout (#622) ; la garde de kesh-restore.sh échoue fermée (#619) ; le manuel décrit le plan comptable et l'import réels (#616, #617). |
✅ Publiée |
| v0.13.2 (correctif) | E27 Recette de la v0.13.1 — un import bancaire dont aucune transaction n'est rapprochée se supprime, pour être réimporté (#632) ; la devise d'un relevé est lue — colonne Devise du profil CSV, devise du montant en CAMT.053 — et un relevé qui n'est pas en francs suisses est refusé, là où il s'enregistrait en CHF sans un mot (#624) ; changer de profil après la prévisualisation la recalcule, et un import dont le profil, le compte ou le fichier a changé depuis est refusé (#626) ; un lot de réconciliation qui contient une transaction disparue est traité proposition par proposition au lieu d'être refusé en entier (#634). Aucune migration : le retour à la 0.13.1 reste possible, après avoir retiré la colonne Devise des profils (voir le CHANGELOG). |
✅ Publiée |
| v0.13.3 (correctif) | E28 Six bugs et la clôture d'un compte bancaire — un compte bancaire se clôt et se rouvre : il passe en lecture seule, son historique reste entier, et plus rien ne s'y écrit (#642) ; une transaction rejetée se remet parmi les propositions depuis le détail de son import (#526) ; la sauvegarde d'installation lit toutes ses tables dans un instantané unique (#633) ; la réconciliation ne propose plus une facture qu'elle refuserait ensuite (#548) et refuse proprement un débit présenté contre une facture (#482) ; une erreur ne s'affiche plus « [object Object] » (#520) ; les boutons d'action destructive se voient (#640). Une migration, qui ne relève pas la version minimale : le retour à la 0.13.2 passe par la sauvegarde prise avant la mise à jour (voir le CHANGELOG). |
✅ Publiée |
| v0.13.4 (correctif) | E29 Préparer la première clôture — première partie — la préparation de la clôture d'un exercice passe l'exercice en revue en lecture seule : sept contrôles, chacun menant à l'écran où agir (#232 ; la contre-passation des transitoires suit en v0.14.0) ; une transaction bancaire se rattache au règlement déjà saisi depuis la fiche de la facture (#670) ; la réconciliation propose un paiement reçu après l'échéance ou un rappel (#529), met en tête la facture échue la première à score égal (#668), ne propose plus une facture qu'un paiement dépasse de quelques centimes (#665) et dit quelle proposition elle affiche (#527) ; un import, un lot ou une annulation commencés juste avant la clôture d'un compte bancaire ne passent plus sur ce compte (#651) ; la liste de réconciliation dit qu'il reste des transactions au-delà des 100 plus récentes (#649) ; trois correctifs d'écran (#655, #646, #678). Aucune migration : le retour à la 0.13.3 se fait en reprenant son image (voir le CHANGELOG). |
✅ Publiée |
| v0.14.0 | E29 Préparer la première clôture — seconde partie — les transitoires contre-passées au premier jour de l'exercice suivant, depuis la fiche de l'écriture (#232). La répétition à blanc d'une clôture au manuel d'administration (29-7) est reportée à l'Epic 31, après la sauvegarde complète. E30 Les factures fournisseur, de la pièce au règlement — la réconciliation propose les factures fournisseur ouvertes pour un débit et les règle, et Annuler le rapprochement défait le règlement (#686) ; tout document fournisseur, avec ou sans QR-code, entre dans la liste « Documents à traiter », avec un aperçu, d'où la facture se crée à côté de son document, le fournisseur proposé — jamais choisi d'office — ou créé sans quitter la saisie ; un document se joint à une facture après coup, s'en détache, et se voit depuis l'écriture (#685) ; une même facture ne peut plus entrer dans deux lots de paiement en cours ; le manuel et les messages nomment le vrai chemin, « Administration → Facturation » (#585). |
✅ Publiée |
| v0.15.0 | E31 Tenir les livres — une sauvegarde qui restaure tout : le .keshbackup emporte les justificatifs et les PDF figés, Kesh fait seul, à intervalle régulier, une sauvegarde complète réglée dans l'interface, les sauvegardes du serveur se listent et se téléchargent depuis l'écran, et une installation neuve se restaure depuis l'assistant (#503) ; la répétition à blanc d'une clôture au manuel d'administration, jouée sur une copie restaurée d'une sauvegarde de démonstration ; quatre défauts courts (#707, #589, #504, #469) ; un smoke E2E en CI (#577) et Rust 1.97.1. |
✅ Publiée |
| v0.16.0 (en cours) | E32 Le serveur MCP de Kesh — un serveur MCP intégré, pour qu'un agent IA du réseau local lise les livres : désactivé par défaut, activé par l'administrateur, accessible par une clé dédiée à portées fines, en lecture seule ; des prompts tenus dans Kesh, avec leur historique, et les données montrées à l'utilisateur avant de partir à l'agent. Aucune écriture par l'agent dans cette version (les propositions de l'agent sont prévues pour la 0.17.0). Quelques défauts courts de la v0.15.0 (#711, #714, #716). | 🚧 En cours |
| v0.5+ (prévu) | Tableau de bord & Comptabilité personnelle — widgets configurables sur la page d'accueil (évolution du patrimoine fortune & dettes mois par mois #164, donut de répartition des dépenses par compte/sous-compte #165, comparatif recettes/dépenses mensuel #166) ; Budgets (E13 #196) + comparatif budget validé vs réalité #197 | 📋 Backlog |
Détails : PRD complet.
Les contributions sont les bienvenues. Merci d'ouvrir une issue avant tout changement significatif pour en discuter.
- Respecter les règles de qualité du code (
CLAUDE.md) - Ajouter des tests pour toute nouvelle logique métier
cargo fmt+cargo clippydoivent passer sans warning
Distribué sous licence EUPL 1.2.