Ledger pour la compta d’une asso

Dans mon vil­la­ge, nous avons ré­cem­ment créé une chouette as­so­cia­tion : La Tour­billon­nante. Il se trouve que j’ai l’in­signe hon­neur d’en être le tré­so­rier (il faut dire qu’il n’y a en gé­né­ral pas beau­coup de vo­lon­taires pour ce pos­te).

J’ai dé­ci­dé d’uti­li­ser led­ger pour te­nir la comp­ta­bi­li­té… Je vous dé­cris ici pour­quoi et com­ment je m’y suis pris.

Contexte

J’ai dé­jà ra­con­té ici com­ment j’uti­li­sai led­ger-cli pour faire mes comptes. Entre-temps, j’ai eu l’oc­ca­sion d’as­su­rer l’in­té­rim pour la ges­tion de la tré­so­re­rie de la Bi­blio­thèque mu­ni­ci­pale de La Tour-d’Aigues (qui en vrai est une bi­blio­thèque as­so­cia­tive et res­semble for­te­ment à une dé­lé­ga­tion de ser­vice pu­blique par des bé­né­vo­les, mais c’est une autre his­toi­re).

Le tré­so­rier pré­cé­dent fai­sait ses comptes sur un ta­bleau ex­cel et j’ai pas­sé des di­zaines d’heures à fi­na­li­ser les comptes en fin d’an­née tel­le­ment il y avait des er­reurs de co­pier/­col­ler, de for­mules er­ro­nées, etc. J’avais hé­si­té à tout mi­grer sous led­ger cli, mais je me suis dit que ça ren­drait dif­fi­cile la re­prise par quel­qu’un d’au­tre, et comme j’étais juste là pour dé­pan­ner, je n’ai rien chan­gé.

Ré­sul­tat : le tré­so­rier sui­vant à tout chan­gé et a uti­li­sé le lo­gi­ciel qu’il connais­sait pour faire les comptes. Je me suis ren­du compte que chaque chan­ge­ment de tré­so­rier condui­sait à un chan­ge­ment des ou­tils uti­li­sés. À par­tir de ce mo­ment, je me suis dit que si l’oc­ca­sion se pré­sen­tait, je par­ti­rais sur led­ger cli la pro­chaine fois.

Et l’oc­ca­sion s’est pré­sen­tée !

Mise en place

J’ai uti­li­sé cinq fi­chiers pour les comp­tes :

  • 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 fichier legal.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’inclure periodic.ledger et d’initialiser les comptes. C’est ce fichier qui est utilisé par le script budget.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 dif­fi­cul­té est qu’en uti­li­sant l’ar­bo­res­cence des nu­mé­ros de comp­te, le re­gistre et la ba­lance n’est pas très ex­pli­ci­te :

$ 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 po­si­tion­né des va­riables d’en­vi­ron­ne­ments (dans le fi­chier .en­vrc qui peut être char­gé au­to­ma­ti­que­ment si vous uti­li­sez di­renv), qui uti­lise l’an­no­ta­tion de compte pour af­fi­cher un jour­nal plus ex­pli­ci­te :

$ 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 com­men­cé à écrire quelques scripts d’ai­de :

  • 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 utilisateurs users.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 don­ne :

$ ./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 €

ain­si qu’un fi­chier CSV qui peut être im­por­té et fa­ci­le­ment mis en forme dans li­breof­fice pour les be­soins de com­mu­ni­ca­tions à des per­sonnes qui at­tendent ce type de for­mat.

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 tran­sac­tion peut se no­ter en heu­res :

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 paie­ment des co­ti­sa­tions dans le jour­nal des tran­sac­tions, je me suis dit que c’était l’oc­ca­sion d’écrire un script pour connaître l’état cou­rant des co­ti­sa­tions.

J’ai par ailleurs la liste des membres dans un fi­chier yaml.

Ça donne par exem­ple :

$ 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 fi­chiers dé­crits dans cet ar­ticle sont dis­po­nibles sur git­lab.

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’ai­me­rais idéa­le­ment pou­voir sor­tir le bi­lan au for­mat ex­cel, afin qu’il soit plus fa­ci­le­ment ex­ploi­table par les gens ha­bi­tués à cet ou­til.

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.