Skip to content
guycorbazPublic

About

Open source tiny erp

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

390 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Kesh

CI Release Docker Pulls Docker Image Version Docker Image Size License: EUPL 1.2 Rust SvelteKit

Kesh est un logiciel de comptabilité et de gestion pour indépendants, TPE et associations en Suisse. Gratuit, open source, auto-hébergé.

Table des matières

Fonctionnalités

  • 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 âś“ — voir docs/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 par kesh-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

Pile technique

  • 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

Démarrage rapide

Prérequis

  • Rust ≥ 1.97 (installĂ© automatiquement via rust-toolchain.toml)
  • Node.js ≥ 20
  • Docker + Docker Compose

Installation

# 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 dev

L'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).

Image Docker (production)

Les images officielles sont publiées sur Docker Hub à chaque tag v*.*.* :

docker pull gcorbaz/kesh:latest

Structure du projet

kesh/
├── 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

Documentation

  • 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).

Architecture

Multi-tenant (Story 6.2)

Le modèle isole chaque société par company_id ; une installation en porte une :

  • JWT claims : chaque token contient user_id, role, et company_id
  • Scoping : toutes les requĂŞtes filtrent par company_id du 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_id NOT NULL, FK vers companies.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.).

Recherche full-text (Story 7.4)

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* matche Marie).
  • RĂ©gression v0.1 documentĂ©e : perte du mid-word search (argo ne matche plus Camargo) — 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.

Développement

Commandes utiles

# 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

Workflow Git

  • Branche principale : main
  • Les commits sur main dĂ©clenchent le pipeline CI (tests + build).
  • Les tags v*.*.* dĂ©clenchent le pipeline Release (build et push Docker Hub).

Tests

# 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:e2e

Note : les tests d'intégration SQLx créent des bases éphémères _sqlx_test_*. L'utilisateur kesh du conteneur de dev en a les droits — sur \_sqlx\_test%.* et kesh%., aucun droit global, comme la production qui n'a que kesh. —, posés par scripts/mariadb-init/01-dev-grants.sql ; ne pas employer root, qui laisserait passer un test dépendant d'un droit que la production n'a pas. scripts/test-fast.sh vérifie ces droits avant de compiler.

Feuille de route

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. ⚠️ Le défaut fondateur : l'encaissement d'une facture client ne produisait aucune écriture comptable — le compte débiteurs accumulait des débits jamais crédités, la banque était sous-évaluée, et le rapprochement bancaire était impossible. Le mode d'échec est silencieux : le bilan reste équilibré, aucun contrôle ne rougit. Cette vague livre l'écriture d'encaissement, le grand livre (l'extrait de compte, qui n'existait pas — « l'instrument qui rend les autres défauts visibles »), la contre-passation d'une écriture — corriger sans effacer, l'écriture inverse laissant l'origine intacte, comme l'exige l'art. 958f CO : l'exigence n'est pas qu'on ne se trompe jamais, c'est que la correction soit apparente —, le gel qui la rend obligatoire (une écriture enregistrée n'est plus ni modifiable ni supprimable, par personne), le verrou de période — arrêter les livres à une date, pour qu'un trimestre TVA déjà déclaré ne bouge plus dans le dos de personne —, et la correction des comptes de clôture. ⚠️ L'epic est clos, la vague ne l'est pas : le jalon Vague 1 compte encore une quinzaine d'issues ouvertes — le journal d'audit n'est consultable par aucun écran et la Balance ne concorde pas avec le Bilan. Publiée le 2026-09-21, cette version emporte aussi les premières stories de l'E25 — piste de contrôle inaltérable, quatorze routes tracées, consultation du journal d'audit par l'API, retypage d'un compte mouvementé, numérotation des écritures par compteur, verrou de période à la suppression. ⚠️ Elle n'est pas encore destinée à tenir une comptabilité réelle : plusieurs fonctions d'un exercice complet manquent, et l'export de sauvegarde est incomplet (#386, corrigé depuis — publié en v0.12.1). ✅ 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). ⚠️ Restent ouverts, hors jalon : les traces de l'onboarding (#434) et des gestes de session (#435). ✅ 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). ⚠️ Pas de retour à une 0.12.x une fois la base migrée, et le compose comme .env sont à reprendre à la mise à jour (voir le CHANGELOG). ⚠️ L'epic reste ouvert : les pièces justificatives (15-2, #235), le versionnage des parseurs et modèles (15-3) et les journaux personnalisables (15-4) sont au backlog. ⚠️ Pas encore destinée à tenir une comptabilité réelle : le bouclement d'exercice (#232) et les pièces justificatives manquent. ✅ 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). ⚠️ Pas de retour à une 0.13.0 une fois la base migrée, et les profils CSV d'une banque qui écrit ses débits avec un signe moins sont à régler (voir le CHANGELOG). ⚠️ Pas encore destinée à tenir une comptabilité réelle : le bouclement d'exercice (#232) et les pièces justificatives (#235) manquent. ✅ 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). ⚠️ Pas encore destinée à tenir une comptabilité réelle : le bouclement d'exercice (#232) et les pièces justificatives (#235) manquent. ✅ 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). ⚠️ Pas encore destinée à tenir une comptabilité réelle : le bouclement d'exercice (#232) et les pièces justificatives (#235) manquent. ✅ 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). ⚠️ L'epic reste ouvert : la contre-passation des transitoires (29-1b, v0.14.0) et la répétition à blanc d'une clôture (29-7) restent à livrer. ⚠️ Pas encore destinée à tenir une comptabilité réelle : le bouclement d'exercice (#232) et les pièces justificatives (#235) manquent. ✅ 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). ⚠️ Migration breaking : retour à la 0.13.4 uniquement par la sauvegarde d'avant la mise à jour. ✅ 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. ⚠️ Une comptabilité réelle est tenue dans Kesh depuis le 2026-10-23 — celle d'une personne physique non assujettie à la TVA ; aucun exercice réel n'y a encore été clôturé, et la TVA n'est pas opposable (jalon Vague 2) : la comptabilité d'un assujetti ne s'y tient pas. Migration non breaking : le retour à la 0.14.0 passe tout de même par la sauvegarde d'avant la mise à jour (voir le CHANGELOG). ✅ 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.

Contribuer

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 clippy doivent passer sans warning

Licence

Distribué sous licence EUPL 1.2.

About

Open source tiny erp

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages