Ledger pour la compta d’une asso
Dans mon village, nous avons récemment créé une chouette association : La Tourbillonnante. Il se trouve que j’ai l’insigne honneur d’en être le trésorier (il faut dire qu’il n’y a en général pas beaucoup de volontaires pour ce poste).
J’ai décidé d’utiliser ledger pour tenir la comptabilité… Je vous décris ici pourquoi et comment je m’y suis pris.
Contexte¶
J’ai déjà raconté ici comment j’utilisai ledger-cli pour faire mes comptes. Entre-temps, j’ai eu l’occasion d’assurer l’intérim pour la gestion de la trésorerie de la Bibliothèque municipale de La Tour-d’Aigues (qui en vrai est une bibliothèque associative et ressemble fortement à une délégation de service publique par des bénévoles, mais c’est une autre histoire).
Le trésorier précédent faisait ses comptes sur un tableau excel et j’ai passé des dizaines d’heures à finaliser les comptes en fin d’année tellement il y avait des erreurs de copier/coller, de formules erronées, etc. J’avais hésité à tout migrer sous ledger cli, mais je me suis dit que ça rendrait difficile la reprise par quelqu’un d’autre, et comme j’étais juste là pour dépanner, je n’ai rien changé.
Résultat : le trésorier suivant à tout changé et a utilisé le logiciel qu’il connaissait pour faire les comptes. Je me suis rendu compte que chaque changement de trésorier conduisait à un changement des outils utilisés. À partir de ce moment, je me suis dit que si l’occasion se présentait, je partirais sur ledger cli la prochaine fois.
Et l’occasion s’est présentée !
Mise en place¶
J’ai utilisé cinq fichiers pour les comptes :
-
legal.ledger
qui reprend la base de comptabilité légale augmentée des comptes spécifiques aux associations. -
account.ledger
qui contient les comptes, tags et monnaies spécifiques à l’association. Il inclut notamment le fichierlegal.ledger
. -
periodic.ledger
qui définit les transactions périodiques pour le budget prévisionnel et le suivi de ce dernier. -
prev.ledger
qui se contente d’inclureperiodic.ledger
et d’initialiser les comptes. C’est ce fichier qui est utilisé par le scriptbudget.sh
(voir budget prévisionnel ci-après). -
asso.ledger
qui contient l’initialisation des comptes et les transactions.
J’ai choisi d’utiliser une arborescence numérique du type 1:0:2:1
. Le fichier legal.ledger
contient par exemple :
# Comptes spécifiques association … account 8:6:2 alias 862 alias Prestations note Prestations account 8:6:4 alias 864 alias Personnel bénévole note Personnel bénévole account 8:7 alias Contributions volontaires en nature note Contributions volontaires en nature account 8:7:0 alias 870 alias Dons en nature note Dons en nature account 8:7:1 alias 871 alias Prestations en nature note Prestations en nature account 8:7:5 alias 875 alias Bénévolat note Bénévolat # Comptes généraux account 1 alias Capital note Capital account 1:0 alias 10 alias capital et réserves note capital et réserves account 1:0:1 alias 101 alias Capital note Capital account 1:0:1:1 alias 1011 alias Capital souscrit - non appelé note Capital souscrit - non appelé
Il est alors possible d’écrire des transactions dans le fichier asso.ledger
en référençant les alias, par exemple :
2024/03/27 * Jeanne Truc cotisation -20.00 € caisse 20 € 2024/03/27 * (FR63908007) OVH SAS ; Jean Truc paye sa cotisation par les frais de nom de domaine cotisation -6.71 € ; Payee: Jean Truc nom de domaine 6.71 € 2024/06/06 * Jean Truc ; avance pour ouverture de compte prêt adhérents -150 € crédit coopératif 2024/08/07 * Jean Truc ; remboursement partiel de l'avance sur la caisse prêt adhérents 130 € caisse
La difficulté est qu’en utilisant l’arborescence des numéros de compte, le registre et la balance n’est pas très explicite :
$ ledger bal -f asso.ledger -20.00 € 4 -20.00 € 6:7:1 40.00 € 5 150.00 € 1:2:1:1 -110.00 € 3:1 16.52 € 6 9.81 € 2 9.81 € 6 6.71 € 5 6.71 € 1:2 -36.52 € 7 -36.52 € 5 -36.52 € 8:1 0 8 60.00 h 6 60.00 h 4 -60.00 h 7 -60.00 h 5 -------------------- 0
J’ai donc positionné des variables d’environnements (dans le fichier .envrc qui peut être chargé automatiquement si vous utilisez direnv), qui utilise l’annotation de compte pour afficher un journal plus explicite :
$ direnv allow # à ne réaliser qu'une fois $ ledger bal -20.00 € 4 Divers – charges à payer et produits à recevoir -20.00 € 6:7:1 Prêt temporaire d'adhérents 40.00 € 5 Comptes financiers 150.00 € 1:2:1:1 compte courant crédit coopératif -110.00 € 3:1 caisse 16.52 € 6 Charges 9.81 € 2 Autres services extérieurs 9.81 € 6 Frais postaux et de télécommunications 6.71 € 5 Autres charges de gestion courante 6.71 € 1:2 achat nom de domaine -36.52 € 7 Produits -36.52 € 5 Autres produits de gestion courante -36.52 € 8:1 Cotisations des adhérents 0 8 Comptes spéciaux 60.00 h 6 Emplois des contributions volontaires en nature 60.00 h 4 Personnel bénévole -60.00 h 7 Contributions volontaires en nature -60.00 h 5 Bénévolat -------------------- 0
J’ai commencé à écrire quelques scripts d’aide :
-
budget.sh
qui sort le budget prévisionnel pour l’année en cours ou l’année passée en paramètre. Il produit également un fichier CSV prêt à être importé dans libreoffice. -
bilan.sh
qui affiche le bilan actif/passif pour l’année en cours ou l’année passée en paramètre. -
compte_résultat.sh
qui affiche les comptes de résultat (exploitation/financiers/contributions volontaires en nature) pour l’année en cours ou l’année passée en paramètre. -
cotisations.sh
qui exploite le fichier des utilisateursusers.yaml
et les comptes pour savoir qui est en retard de paiement de cotisation (compte 7:5:8:1).
Budget prévisionnel¶
Le Budget est défini par les transactions périodiques dans periodic.ledger
.
Par exemple :
~ Monthly From 2024/06/01 627 7.40 € ; frais banquaire / compte crédit coopératif ~ Yearly cotisation -500 € ; Adhésions nom de domaine 6.71 € hébergement 30 € publications 150 € ; achat affiches, flyer, … 6091 50 € ; café, … Fournitures administratives 150 € ; post-it, … poste 50 € ; timbres crédit coopératif ~ Monthly From 2024/04/01 Personnel bénévole (2*2*20 h) ; réunion Bénévolat (-2*2*20 h) ~ Yearly Personnel bénévole (20*10 h) ; actions Bénévolat (-20*10 h)
Ce qui donne :
$ ./budget.sh -473.71 € 6 Charges -200.00 € 0 Achats (sauf 603) -150.00 € 6:4 Fournitures administratives -50.00 € 9:1 de matières premières (et fournitures) -30.00 € 1 Services extérieurs -30.00 € 3:3 achat hébergement services web -237.00 € 2 Autres services extérieurs -150.00 € 3 Publicité, publications, relations publiques -50.00 € 6 Frais postaux et de télécommunications -37.00 € 7 Services bancaires et assimilés 0 3 Impôts, taxes et versements assimilés 0 4 Charges de personnel -6.71 € 5 Autres charges de gestion courante -6.71 € 1:2 achat nom de domaine 0 6 Charges financières 0 7 Charges exceptionnelles 0 8 Dotations aux amortissements, aux dépréciations et aux provisions 500.00 € 7 Produits 0 0 Ventes de produits fabriqués, prestations de services, marchandises 0 1 Production stockée (ou déstockage) 0 2 Production immobilisée 0 3 Concours publics 0 4 Subventions d'exploitation 500.00 € 5 Autres produits de gestion courante 500.00 € 8:1 Cotisations des adhérents 0 6 Produits financiers 0 7 Produits exceptionnels 0 8 Reprises sur amortissements, dépréciations et provisions 0 8 Comptes spéciaux -600.00 h 6 Emplois des contributions volontaires en nature -600.00 h 4 Personnel bénévole 600.00 h 7 Contributions volontaires en nature 600.00 h 5 Bénévolat -------------------- 26.29 €
ainsi qu’un fichier CSV qui peut être importé et facilement mis en forme dans libreoffice pour les besoins de communications à des personnes qui attendent ce type de format.
Bilan et compte de résultat¶
Les scripts bilan.sh
et compte_résultat.sh
permettent d’afficher les
éléments pour le bilan de fin d’année.
J’envisage d’ajouter une sortie au format CSV ou OpenOffice… À suivre
$ ./compte_résultat.sh EXPLOITATION ====================================================== -23.82 € 6 Charges 0 0 Achats (sauf 603) 0 1 Services extérieurs -17.11 € 2 Autres services extérieurs -9.81 € 6 Frais postaux et de télécommunications -7.30 € 7 Services bancaires et assimilés 0 3 Impôts, taxes et versements assimilés 0 4 Charges de personnel -6.71 € 5 Autres charges de gestion courante -6.71 € 1:2 achat nom de domaine 0 7 Charges exceptionnelles 0 8 Dotations aux amortissements, aux dépréciations et aux provisions 36.52 € 7 Produits 0 0 Ventes de produits fabriqués, prestations de services, marchandises 0 1 Production stockée (ou déstockage) 0 2 Production immobilisée 0 3 Concours publics 0 4 Subventions d'exploitation 36.52 € 5 Autres produits de gestion courante 36.52 € 8:1 Cotisations des adhérents 0 7 Produits exceptionnels 0 8 Reprises sur amortissements, dépréciations et provisions -------------------- 12.70 € FINANCIERS ====================================================== 0 6:6 Charges financières 0 7:6 Produits financiers -------------------- 0 CONTRIBUTIONS VOLONTAIRES EN NATURE ====================================================== 0 8 Comptes spéciaux -1080.00 € 6 Emplois des contributions volontaires en nature -1080.00 € 4 Personnel bénévole 1080.00 € 7 Contributions volontaires en nature 1080.00 € 5 Bénévolat -------------------- 0
Comptabilisation des heures de bénévolat¶
Les comptes 8:6:4
et 8:7:5
permettent de comptabiliser les heures des
bénévoles. Au bilan, le résultat est nul, mais ça permet de montrer aux
éventuelles parties intéressées (par exemple pour des demandes de subvention)
l’implication des bénévoles dans l’association. Le plus dur est de faire en
sorte que les bénévoles notent leurs heures…
Une transaction peut se noter en heures :
2024/12/04 * Jean Truc ; Bénévolat sur l'année Personnel bénévole 60 h Bénévolat
Le taux horaire est défini dans account.ledger
par :
# Valuation de la seconde (18€/h) P 2024/01/01 00:00:00 s 0.005 €
Suivi des cotisations¶
Ayant les paiement des cotisations dans le journal des transactions, je me suis dit que c’était l’occasion d’écrire un script pour connaître l’état courant des cotisations.
J’ai par ailleurs la liste des membres dans un fichier yaml.
Ça donne par exemple :
$ ok=1 ./cotisations.sh Caroline Truc est à jour (20240419) Jean Truc est à jour (20240327) Jeanne Truc est à jour (20240327) Béatrice Machin doit payer sa cotisation (n'a jamais payé) 3/4 cotisations payées
Code source¶
Les fichiers décrits dans cet article sont disponibles sur gitlab.
Problèmes et améliorations¶
Alias dans les requêtes¶
Ce bug de ledger ne permet pas
d’utiliser les alias dans les requêtes ledger. On doit donc écrire ledger reg
5:3:1
plutôt que ledger reg caisse
pour voir toutes les transactions de la
caisse. Ce n’est pas pratique. J’espère pouvoir proposer une correction, mais
pour l’instant ma compréhension du fonctionnement interne de ledger est encore
un peu floue.
Export CSV/Excel¶
J’aimerais idéalement pouvoir sortir le bilan au format excel, afin qu’il soit plus facilement exploitable par les gens habitués à cet outil.
Commentaires
With an account on the Fediverse or Mastodon, you can respond to this post. Since Mastodon is decentralized, you can use your existing account hosted by another Mastodon server or compatible platform if you don’t have an account on this one. Known non-private replies are displayed below.