1 = Informatiser une comptabilité avec confiance
2 :author: git://git.autogeree.net/tool/hledger
3 :copyright: © 2014 (CC) BY Julien Moutinho <julm+hledger@autogeree.net>
8 :slidebackground: hledgersplash
9 :slidefontsizeadjust: -3
13 :scriptsdir: $PWD/javascripts
14 ifdef::backend-slidy2[:data-uri:]
16 ifdef::backend-slidy2[:slidebackground!:]
18 // a2x: --xsltproc-opts "--stringparam ulink.show 1"
19 // a2x: --xsltproc-opts "--stringparam ulink.footnotes 1"
20 // :source-highlighter: vim
23 == Le ++.ledger++ : un format de journal comptable ouvert.. et simple
27 2014/05/01 Stand manif
33 Achat:Impression:Tracts 7
39 |==================================
46 Transparent:: Visibilité de *toutes* les informations.
47 Pérenne:: Compréhensible sans logiciel particulier pour l’exploiter.
48 Modifiable:: Pas de verrou de validation (plus ou moins illusoire).
49 Accès:: Pas de changement d’interface non-consenti.
50 Versionnable:: Suivi des modifications, fusion des contributions, et sauvegarde simples.
51 Écrit:: Langage pour s’exprimer clairement (par ex. dans un courriel ou une présentation).
52 Hors-ligne:: Pas besoin de réseau.
54 Pas spécifique à un éditeur logiciel particulier
55 (sauf fonctionnalité expérimentale).
57 ledger;; http://ledger-cli.org/[]
58 hledger;; http://hledger.org/[]
59 beancount;; http://furius.ca/beancount/[]
60 penny;; https://massysett.github.io/penny/[]
61 abandon;; https://github.com/hrj/abandon/[]
70 Mais, comme c'est un fichier, un verrou-validant +
71 peut être mis par une **signature cryptographique**.
75 % gpg --detach-sign $fichier.ledger
76 % gpg --verify $fichier.ledger.sig
79 Textuel:: Préférable de ne pas avoir peur des caractères,
80 voire de bien savoir utiliser un éditeur de texte structuré.
83 « __N'a pas été conçu pour empêcher ses utilisateurs de commettre des actes stupides,
84 car cela les empêcherait aussi de réaliser des actes ingénieux.__ »
88 2102/03/21 Chèque ; Erreur de date
89 5.Finance:1.Etablissement:1.Valeur:2.Chèque_à_encaisser -145,00
90 5.Finance:1.Etablissement:2.Banque:001.Courant 145,00
93 NOTE: Mais possibilité de vérifications d’invariants conventionnels avec des scripts.
95 |==================================
97 == ++hledger++ : un outil libre.. et convivial
101 % hledger balance '^6' '^7' --depth 2 -f Paris.2011.hledger
105 55,25€ 2.Autre_service
109 -26,00€ 5.Autre_gestion_courante
115 |==================================
123 * « __Écrivez des programmes qui effectuent une seule chose et qui le font bien.__ »
124 * « __Écrivez des programmes qui collaborent.__ »
125 * « __Écrivez des programmes pour gérer des flux de texte, +
126 car c'est une interface universelle.__ »
128 Utilisation, Étude, Modification, Duplication::
129 Permises techniquement et légalement +
130 (« logiciel libre » sous ++GNU/GPLv3++)
133 Programmé en http://fr.wikipedia.org/wiki/Haskell[Haskell]
135 Fonctionnel pur;; Aucune mutation de données externes à une fonction (sans effet de bord).
136 Typage statique;; Vérification des erreurs de type avant l’exécution du programme.
137 Typage fort;; Aucune conversion implicite de types de données.
139 Relisible:: ≈13 000 lignes de Haskell (ou 160 écrans de 80 lignes) +
140 (plus ≈1 800 lignes pour ++hledger-web++).
142 NOTE: À équivalence fonctionnelle,
143 OpenERPv7 ≈80 000 lignes de Python (≈1 000 écrans).
145 Ancienneté:: Depuis 2007 (≈7 ans).
147 Portable:: GNU/Linux, Apple/MacOS, Microsoft/Windows
150 Contrôle l’ordinateur avec le langage.
154 % hledger add -f $fichier.hledger
155 % hledger balance -f $fichier.hledger
162 % hledger-web --server -f $fichier.hledger
163 % firefox "http://localhost:5000"
166 Support:: ≈1 développeur à mi-temps-libéré
168 * Simon Michael (sm) <simon@joyful.com>
170 NOTE: Dons @ https://www.gittip.com/simonmichael/[]
173 Messagerie instantanée;; <irc://irc.freenode.net#ledger>
174 Liste de discussion;; <hledger+subscribe@googlegroups.com>
180 % ghc hledger-fait-ce-que-je-veux.hs
181 % ./hledger-fait-ce-que-je-veux -f $fichier.hledger
190 Fait de la comptabilité, **et juste** de la comptabilité ;
191 pas un logiciel intégré type ERP (Enterprise Resource Planning)
192 du genre type https://www.odoo.com/[Odoo] (ancien OpenERP) :
193 Comptabilité + Point de vente + Facturation + Paye + Gestion de stock + Adhésion + Calendrier + Wiki + ...
195 En ligne de commande::
196 Peur **irrationnelle** mais fréquente,
197 d’être libre et d’avoir le pouvoir sur la machine,
198 au lieu d’être captif d’une interface.
200 NOTE: L’interface Web est simple, et s’améliore.
202 Read The Fucking Manual::
203 De même que maîtriser un plan comptable néçessite
204 en plus de le parcourir de **s’informer** sur son utilisation, +
205 de même maîtriser un langage et un logiciel en ligne de commande nécessite
206 de **s’informer** sur sa syntaxe, sa sémantique et son utilisation.
208 NOTE: http://hledger.org/manual/[].
210 |==================================
212 == Langage d’un fichier +.ledger+
213 Un +.ledger+ est un fichier de texte brut respectant une syntaxe préçise
214 qui forme une succession d’écritures comptables, classées librement.
216 ifdef::backend-slidy2[>>>]
217 === Définition informelle
219 .Fichier ++data/exemple-syntaxe.ledger++
221 include::data/exemple-syntaxe.ledger[]
224 .Conventions usuelles
225 * Classement des écritures par date
226 * Classement des flux par signe, puis compte
228 === Définition formelle
230 [cols="a,a",options="header"]
231 |==================================
232 ^|Syntaxe (grammaire https://fr.wikipedia.org/wiki/Forme_de_Backus-Naur[BNF])
233 ^|Informations (signatures fonctionnelles)
236 -----------------------------------
237 journal ::= (écriture \| commentaire \| "⏎" \| "␣")*
238 -----------------------------------
242 **journal**:: latexmath:[$
243 :\>f:\textcolor{#D2691E}{\textbf{fichier}} →
244 \lbrack\textcolor{#D2691E}{\textbf{\acute{e}criture}}\rbrack$]
248 écriture ::= date "␣" "␣"* libellé commentaire "⏎"
250 date ::= (année "/")? mois "/" jour
251 libellé ::= (· - (";"\|"⏎"))*
256 **date**:: latexmath:[$
257 :\>e:\textcolor{#D2691E}{\textbf{\acute{e}criture}} →
258 (\textcolor{#083194}{\textbf{ann\acute{e}e}}:\textcolor{#D2691E}{\textbf{ℕ}},~
259 \textcolor{#083194}{\textbf{mois}}:\{\textcolor{#D2691E}{\textbf{01}},...,\textcolor{#D2691E}{\textbf{12}}\},~
260 \textcolor{#083194}{\textbf{jour}}:\{\textcolor{#D2691E}{\textbf{01}},...,\textcolor{#D2691E}{\textbf{31}}\})$]
261 **libellé**:: latexmath:[$
262 :\>e:\textcolor{#D2691E}{\textbf{\acute{e}criture}} →
263 \textcolor{#D2691E}{\textbf{texte}}$]
264 **commentaire**:: latexmath:[$
265 :\>e:\textcolor{#D2691E}{\textbf{\acute{e}criture}} →
266 \textcolor{#D2691E}{\textbf{texte}}$]
267 **tags**:: latexmath:[$
268 :\>e:\textcolor{#D2691E}{\textbf{\acute{e}criture}} →
269 \lbrack\textcolor{#D2691E}{\textbf{tag}}\rbrack
270 \ =\ \textbf{tags}~(\textbf{commentaire}~e)$]
271 **flux**:: latexmath:[$
272 :\>e:\textcolor{#D2691E}{\textbf{\acute{e}criture}} →
273 \lbrack\textcolor{#D2691E}{\textbf{flux}}\rbrack$]
277 flux ::= compte "␣␣" "␣"* ("-" crédit \| débit) ("␣"\|"⏎")* commentaire
278 compte ::= nom ( ":" nom )*
279 nom ::= (· - (":"\|"⏎")) (· - (":"\|"⏎"))*
286 **compte**:: latexmath:[$
287 :\>f:\textcolor{#D2691E}{\textbf{flux}} →
288 \lbrack\textcolor{#D2691E}{\textbf{nom}}\rbrack$]
291 :\>f:\textcolor{#D2691E}{\textbf{flux}} → \textcolor{#D2691E}{ℚ} = \displaystyle{
292 \left\{\begin{array}{ll} -~(\textbf{cr\acute{e}dit}~f) & \mathit{\mbox{si défini}} \\
293 (\textbf{d\acute{e}bit}~f) & \mathit{\mbox{sinon}}
295 **tags**:: latexmath:[$
296 :\>f:\textcolor{#D2691E}{\textbf{flux}} →
297 \lbrack\textcolor{#D2691E}{\textbf{tag}}\rbrack
298 \ =\ \textbf{tags}~(\textbf{commentaire}~f)$]
302 commentaire ::= ( ";" (tag ":" valeur? \| ·)* )
303 ( ("⏎"\|"␣")* ";" (tag ":" valeur? \| ·)* )*
308 **tags**:: latexmath:[$
309 :\>m:\textcolor{#D2691E}{\textbf{commentaire}} →
310 \lbrack\textcolor{#D2691E}{\textbf{tag}}\rbrack$]
311 **tag**:: latexmath:[$
312 :\>(\textcolor{#083194}{\textbf{tag}}:\textcolor{#D2691E}{\textbf{texte}},%
313 ~\textcolor{#083194}{\textbf{valeur}}:\textcolor{#D2691E}{\textbf{\mbox{texte}}\>?})$]
314 |==================================
316 == Commandes `hledger`
319 .Syntaxe quasiment commune à toutes les commandes ++hledger++
321 % hledger $commande $options $filtre -f $fichier.ledger
324 ifdef::backend-slidy2[>>>]
325 === Afficher le plan comptable (`accounts`)
328 |==================================
333 % hledger accounts --tree -f data/exemple-syntaxe.ledger
334 sys::[hledger accounts --tree -f data/exemple-syntaxe.ledger]
339 % hledger accounts --flat -f data/exemple-syntaxe.ledger
340 sys::[hledger accounts --flat -f data/exemple-syntaxe.ledger]
345 latexmath:[$:\>\mathbb E : \lbrack\textcolor{#D2691E}{\textbf{\acute{e}criture}}\rbrack → \{\textcolor{#D2691E}{\textbf{compte}}\}$] +
346 = « __ensemble des comptes vers lesquels fluent les écritures__ » +
347 latexmath:[$=\{\ (\textbf{compte}\>f)\ \|\ f ← (\textbf{flux}\>e)\ \|\ e ← \mathbb E\ \}$]
349 latexmath:[$:\>c : \textcolor{#D2691E}{\textbf{compte}} → \textcolor{#D2691E}{\textbf{compte}}\>?$] +
350 latexmath:[$=\>c_{\lbrack0,\cdots,\|c\|-2\rbrack}\ \mbox{si}\ \|c\| \ge 2$]
351 **hiérachie_de_compte**::
352 latexmath:[$:\>\mathbb c : \textcolor{#D2691E}{\textbf{compte}} → \lbrack\textcolor{#D2691E}{\textbf{compte}}\rbrack$] +
353 // = « __ensemble des comptes vers lesquels fluent les écritures et leur comptes parents__ » +
354 latexmath:[$=\>\lbrack{\ c\ :\ \lbrack{\ c\ \|\ c ← (\mathbf{compte\mbox{_}parent}\>{c})}\ \rbrack}\ \rbrack$]
356 |==================================
358 === Écrire des écritures (`add`)
361 .Sélection d’un modèle selon le libellé
363 % hledger add -f /tmp/test.ledger
364 Adding transactions to journal file /tmp/test.ledger
365 Any command line arguments will be used as defaults.
366 Use tab key to complete, readline keys to edit, enter to accept defaults.
367 An optional (CODE) may follow transaction dates.
368 An optional ; COMMENT may follow descriptions or amounts.
369 If you make a mistake, enter < at any prompt to restart the transaction.
370 To end a transaction, enter . when prompted.
371 To quit, enter . at a date prompt or press control-d or control-c.
372 Date [2014/07/30]: 2014/01/01
373 Description: Libellé de l’écriture ; UN_TAG:, Autre_tag:Avec_Valeur
380 Account 4 (or . or enter to finish this transaction): .
381 2014/01/01 Libellé de l’écriture ; UN_TAG:, Autre_tag:Avec_Valeur
386 Save this transaction to the journal ? [y]: y
388 Starting the next transaction (. or ctrl-D/ctrl-C to quit)
390 Description: Libellé d’une autre écriture
391 Using this similar transaction for defaults:
392 2014/01/01 Libellé de l’écriture ; UN_TAG:, Autre_tag:Avec_Valeur
398 Amount 1 [-42.0]: 100
399 Account 2 [B:BB:BBB]: B
401 Account 3 (or . to finish this transaction) [B:A]: .
402 2014/01/01 Libellé d’une autre écriture
406 Save this transaction to the journal ? [y]: y
408 Starting the next transaction (. or ctrl-D/ctrl-C to quit)
413 .Complètement automatique des comptes
415 % hledger add -f data/exemple-plan-comptable.ledger
416 Adding transactions to journal file /home/julm/admin/cyber.coop/src/tool/hledger/doc/data/exemple-plan-comptable.ledger
417 Any command line arguments will be used as defaults.
418 Use tab key to complete, readline keys to edit, enter to accept defaults.
419 An optional (CODE) may follow transaction dates.
420 An optional ; COMMENT may follow descriptions or amounts.
421 If you make a mistake, enter < at any prompt to restart the transaction.
422 To end a transaction, enter . when prompted.
423 To quit, enter . at a date prompt or press control-d or control-c.
424 Date [2014/07/30]: yesterday
426 Account 1: 1.Capital:
427 1.Capital:0.Fonds 1.Capital:3.Sub_invest_BNR:9.Compte_résultat:1.Equipement
428 1.Capital:0.Fonds:2.SDR 1.Capital:3.Sub_invest_BNR:9.Compte_résultat:1.Equipement:1.État
429 1.Capital:0.Fonds:2.SDR:4.Apport 1.Capital:3.Sub_invest_BNR:9.Compte_résultat:1.Equipement:2.Région
430 1.Capital:0.Fonds:2.SDR:6.Sub_invest_BR 1.Capital:3.Sub_invest_BNR:9.Compte_résultat:1.Equipement:3.Département
431 1.Capital:0.Fonds:3.ADR 1.Capital:3.Sub_invest_BNR:9.Compte_résultat:1.Equipement:4.Commune
432 1.Capital:0.Fonds:3.ADR:4.Apport 1.Capital:3.Sub_invest_BNR:9.Compte_résultat:1.Equipement:5.Collectivité_publique
433 1.Capital:0.Fonds:3.ADR:6.Sub_invest_BR 1.Capital:3.Sub_invest_BNR:9.Compte_résultat:1.Equipement:6.Entreprise_publique
434 1.Capital:0.Fonds:6.Réserve 1.Capital:3.Sub_invest_BNR:9.Compte_résultat:1.Equipement:7.Organisme_privé
435 1.Capital:0.Fonds:6.Réserve:3.Statutaire 1.Capital:3.Sub_invest_BNR:9.Compte_résultat:1.Equipement:8.Autre
436 1.Capital:0.Fonds:6.Réserve:8.Autre 1.Capital:3.Sub_invest_BNR:9.Compte_résultat:2.Autre
437 1.Capital:1.Report 1.Capital:5.Provision_risque&charge
438 1.Capital:1.Report:0.Bénéfice 1.Capital:5.Provision_risque&charge:1.Risque
439 1.Capital:1.Report:5.Financeur 1.Capital:5.Provision_risque&charge:5.Impôt
440 1.Capital:1.Report:9.Déficit 1.Capital:5.Provision_risque&charge:8.Autre
441 1.Capital:2.Résultat 1.Capital:5.Provision_risque&charge:8.Autre:2.Congés_à_payer
442 1.Capital:2.Résultat:0.Bénéfice 1.Capital:6.Emprunt,Dette
443 1.Capital:2.Résultat:9.Déficit 1.Capital:6.Emprunt,Dette:4.Etablissement_crédit
444 1.Capital:3.Sub_invest_BNR 1.Capital:6.Emprunt,Dette:5.Dépôt,Caution
445 1.Capital:3.Sub_invest_BNR:1.Equipement 1.Capital:6.Emprunt,Dette:8.Autre
446 1.Capital:3.Sub_invest_BNR:1.Equipement:1.État 1.Capital:6.Emprunt,Dette:8.Autre:1.Emprunt
447 1.Capital:3.Sub_invest_BNR:1.Equipement:2.Région 1.Capital:6.Emprunt,Dette:8.Autre:1.Emprunt:1.Bénévole
448 1.Capital:3.Sub_invest_BNR:1.Equipement:3.Département 1.Capital:6.Emprunt,Dette:8.Autre:1.Emprunt:2.Salarié-e
449 1.Capital:3.Sub_invest_BNR:1.Equipement:4.Commune 1.Capital:6.Emprunt,Dette:8.Autre:1.Emprunt:3.Cyclofficine
450 1.Capital:3.Sub_invest_BNR:1.Equipement:5.Collectivité_publique 1.Capital:6.Emprunt,Dette:8.Autre:1.Emprunt:4.Autre
451 1.Capital:3.Sub_invest_BNR:1.Equipement:6.Entreprise_publique 1.Capital:6.Emprunt,Dette:8.Autre:7.Dette
452 1.Capital:3.Sub_invest_BNR:1.Equipement:7.Organisme_privé 1.Capital:9.Fonds_dédiés
453 1.Capital:3.Sub_invest_BNR:1.Equipement:8.Autre 1.Capital:9.Fonds_dédiés:4.Sub_exploit
454 1.Capital:3.Sub_invest_BNR:8.Autre 1.Capital:9.Fonds_dédiés:5.Don_affecté
455 1.Capital:3.Sub_invest_BNR:9.Compte_résultat
456 Account 1: 1.Capital:6.Emprunt,Dette
457 1.Capital:6.Emprunt,Dette 1.Capital:6.Emprunt,Dette:8.Autre:1.Emprunt 1.Capital:6.Emprunt,Dette:8.Autre:1.Emprunt:4.Autre
458 1.Capital:6.Emprunt,Dette:4.Etablissement_crédit 1.Capital:6.Emprunt,Dette:8.Autre:1.Emprunt:1.Bénévole 1.Capital:6.Emprunt,Dette:8.Autre:7.Dette
459 1.Capital:6.Emprunt,Dette:5.Dépôt,Caution 1.Capital:6.Emprunt,Dette:8.Autre:1.Emprunt:2.Salarié-e
460 1.Capital:6.Emprunt,Dette:8.Autre 1.Capital:6.Emprunt,Dette:8.Autre:1.Emprunt:3.Cyclofficine
461 Account 1: 1.Capital:6.Emprunt,Dette:4.Etablissement_crédit
462 Amount 1: -666 ; Don’t panic
463 Account 2: 5.Finance:
464 5.Finance:1.Etablissement 5.Finance:1.Etablissement:2.Banque:002.Livret 5.Finance:8.Virement
465 5.Finance:1.Etablissement:1.Valeur 5.Finance:3.Caisse 5.Finance:8.Virement:0.Interne
466 5.Finance:1.Etablissement:1.Valeur:2.Chèque_à_encaisser 5.Finance:3.Caisse:1.Siège 5.Finance:8.Virement:1.Fonds
467 5.Finance:1.Etablissement:2.Banque:001.Courant 5.Finance:3.Caisse:2.Atelier
468 Account 2: 5.Finance:1.Etablissement:2.Banque:001.Courant
470 Account 3 (or . or enter to finish this transaction): .
472 1.Capital:6.Emprunt,Dette:4.Etablissement_crédit -666 ; Don’t panic
473 5.Finance:1.Etablissement:2.Banque:001.Courant 666.0
475 Save this transaction to the journal ? [y]: y
477 Starting the next transaction (. or ctrl-D/ctrl-C to quit)
481 === Filtrer des écritures (`print`)
483 ++hledger++ permet de filtrer les écritures selon leurs données
484 (date, libellé, comptes, montants, tags, ...) ;
485 des expressions rationnelles peuvent être utilisées à cette fin.
487 NOTE: Cf. manuel : http://hledger.org/manual#query-arguments[]
490 .Afficher des « journaux auxiliaires » (exemples approximatifs)
495 hledger print -f $fichier.ledger '^5.Finance:1.Etablissement:2.Banque:'
501 hledger print -f $fichier.ledger '^(2.Immobilisation:1.Corporelle:|6.Charge:(0.Achat|1.Service|2.Autre_service):)'
507 hledger print -f $fichier.ledger '^7.Produit:0.Vente:'
513 hledger print -f $fichier.ledger '^5.Finance:3.Caisse:'
519 hledger print -f $fichier.ledger '6.Charge:(3.Impôt:(1.|3.):|4.Personnel:)'
525 hledger print -f $fichier.ledger tag:ANV
527 **Opération_Diverses**::
531 hledger print -f $fichier.ledger tag:OD
535 === Calculer des soldes (`balance`)
538 |==================================
542 .Balance de toutes les écritures
544 % hledger balance -f data/exemple-syntaxe.ledger
545 sys::[hledger balance -f data/exemple-syntaxe.ledger | sed -e 's/^-/‑/']
548 NOTE: Toutes les écritures devant avoir leur balance nulle,
549 cette balance sur toutes les écritures est également nulle.
552 .Balance sur des comptes filtrés par expression rationnelle
554 % hledger balance 'A' -f data/exemple-syntaxe.ledger
555 sys::[hledger balance 'A' -f data/exemple-syntaxe.ledger | sed -e 's/^[-=]/‑/']
559 .Balance sur un compte racine
561 % hledger balance '^A' -f data/exemple-syntaxe.ledger
562 sys::[hledger balance '^A' -f data/exemple-syntaxe.ledger | sed -e 's/^[-=]/‑/']
566 .Sans accumulation des soldes d’une période à l’autre
568 % hledger balance --daily -f data/exemple-syntaxe.ledger
569 sys::[hledger balance --daily -f data/exemple-syntaxe.ledger | sed -e 's/^[-=]/‑/;s/[|]/\\|/g']
573 .Avec accumulation des soldes d’une période à l’autre
575 % hledger balance --daily --historical -f data/exemple-syntaxe.ledger
576 sys::[hledger balance --daily --historical -f data/exemple-syntaxe.ledger | sed -e 's/^[-=]/‑/;s/[|]/\\|/g']
582 //% hledger balance -b 2012/02/01 -e 2012/04/30 --monthly -f $fichier.ledger >/tmp/bal.flow
583 //% hledger balance -b 2012/02/01 -e 2012/04/30 --cumulative --monthly -f $fichier.ledger >/tmp/bal.cumulative
584 //% hledger balance -b 2012/02/01 -e 2012/04/30 --historical --monthly -f $fichier.ledger >/tmp/bal.historical
585 //% gvimdiff -o /tmp/bal.{cumulative,historical}
587 //image::data/gvimdiff-cumulative-historical.png[]
592 latexmath:[$:\>\mathbb F : \lbrack\textcolor{#D2691E}{\textbf{flux}}\rbrack → ℚ$] +
593 = « __somme des montants des flux__ » +
594 latexmath:[$=\>{(\ m\ \|\ m ← m + (\textbf{montant}\>f)\ \|\ f ← \mathbb F\ \|\ m ← 0\ )$] +
595 **solde_de_compte**::
596 latexmath:[$:\>\mathbb E : \lbrack\textcolor{#D2691E}{\textbf{\acute{e}criture}}\rbrack → c : \textcolor{#D2691E}{\textbf{compte}} → ℚ$] +
597 latexmath:[$=\>{\textbf{balance}\>\lbrack{\ f\ \|\ f ← (\textbf{flux}\>e),\ c\>≼\>(\textbf{compte}\>f)\ \|\ e ← \mathbb E\ }\rbrack$] +
598 // latexmath:[$=\>{\displaystyle{\sum_{e ← \mathbb E}}\left(\sum_{\stackrel{f ← (\textbf{flux}\>e),}{c\ ≼\ (\textbf{compte}\>f)}}(\textbf{montant}\>f})\right)$]
600 latexmath:[$:\>\mathbb E : \lbrack\textcolor{#D2691E}{\textbf{\acute{e}criture}}\rbrack →
601 \lbrack\textcolor{#D2691E}{\textbf{flux}}\rbrack$] +
602 latexmath:[$=\>\displaystyle{\left\lbrack
604 (\textcolor{#083194}{\textbf{compte}}=c´, \textcolor{#083194}{\textbf{montant}}=m) \\
605 \|\ m ← (\mathbf{\mbox{solde_de_compte}}\,\mathbb E\,c´) \\
606 \|\ c´ ← (\mathbf{plan\mbox{_}comptable}\,c) \\
607 \|\ c ← (\mathbf{comptes}\,\mathbb E)
608 \end{array}}\right\rbrack$]
610 |==================================
612 === Suivre un compte (`register`)
615 .Suivi de la somme des crédits du compte `5112`
617 % hledger register -f Paris.2011.hledger 'amt:<0' '^5.Finance:1.Etablissement:1.Valeur:2.Chèque_à_encaisser'
618 2011/05/23 Remise chq 0994029 ..Chèque_à_encaisser -100,00€ -100,00€
619 2011/09/29 Remise chq 1101801 ..Chèque_à_encaisser -20,00€ -120,00€
620 2011/11/18 Remise chq 1101802 ..Chèque_à_encaisser -2000,00€ -2120,00€
624 .Suivi de la somme des débits du compte `5112`
626 % hledger register -f Paris.2011.hledger 'amt:>0' '^5.Finance:1.Etablissement:1.Valeur:2.Chèque_à_encaisser'
627 2011/05/15 Prêt ..Chèque_à_encaisser 100,00€ 100,00€
628 2011/09/20 Cotisations ..Chèque_à_encaisser 20,00€ 120,00€
629 2011/11/10 Prêt ..Chèque_à_encaisser 2000,00€ 2120,00€
632 === Calculer les écritures de clôture et ouverture (`equity`)
633 ++hledger-equity++ calcule une balance de comptes
634 et en fait deux écritures, respectivement :
636 de clôture:: pour les solder à zéro en fin d’exercice ;
637 d’ouverture:: pour les réinitialiser à leur solde du précédent exercice.
640 |==================================
645 % hledger-equity -f data/exemple-syntaxe.ledger
646 sys::[hledger-equity -f data/exemple-syntaxe.ledger]
651 % hledger-equity -f data/exemple-syntaxe.ledger '^A'
652 sys::[hledger-equity -f data/exemple-syntaxe.ledger '^A']
657 % hledger-equity -f data/exemple-syntaxe.ledger '^B'
658 sys::[hledger-equity -f data/exemple-syntaxe.ledger '^B']
664 .Solde des compte de gestion
666 % hledger-equity '^6' '^7' -f Paris.2011.hledger
668 6.Charge:0.Achat:6.Non_stocké:8.Autre_Matière,Fourniture:1.Atelier -248,87€
669 6.Charge:1.Service:3.Location:2.Immobilière -441,46€
670 6.Charge:2.Autre_service:3.Communication:6.Catalogue,Imprimé -24,00€
671 6.Charge:2.Autre_service:7.Service_bancaire -31,25€
672 6.Charge:5.Gestion:8.Divers:6.Cotisation_(vie_statutaire) -25,00€
673 7.Produit:0.Vente:6.Prest'action 700,00€
674 7.Produit:5.Autre_gestion_courante:6.Cotisation 20,00€
675 7.Produit:5.Autre_gestion_courante:8.Divers 6,00€
676 equity:closing balances 44,58€
679 6.Charge:0.Achat:6.Non_stocké:8.Autre_Matière,Fourniture:1.Atelier 248,87€
680 6.Charge:1.Service:3.Location:2.Immobilière 441,46€
681 6.Charge:2.Autre_service:3.Communication:6.Catalogue,Imprimé 24,00€
682 6.Charge:2.Autre_service:7.Service_bancaire 31,25€
683 6.Charge:5.Gestion:8.Divers:6.Cotisation_(vie_statutaire) 25,00€
684 7.Produit:0.Vente:6.Prest'action -700,00€
685 7.Produit:5.Autre_gestion_courante:6.Cotisation -20,00€
686 7.Produit:5.Autre_gestion_courante:8.Divers -6,00€
687 equity:opening balances -44,58€
690 |==================================
693 === Observer des statistiques (`stats`, `activity`)
696 |==================================
700 .Statistiques annuelles
702 % hledger stats --period yearly -f Paris.2012.hledger
703 Main journal file : Paris.2012.hledger
704 Included journal files : Paris.Plan_comptable.hledger
705 Cyclofficine.Plan_comptable.hledger
706 Transactions span : 2012-01-01 to 2013-01-01 (366 days)
707 Last transaction : 2012-12-31 (576 days ago)
708 Transactions : 210 (0.6 per day)
709 Transactions last 30 days: 0 (0.0 per day)
710 Transactions last 7 days : 0 (0.0 per day)
711 Payees/descriptions : 144
712 Accounts : 448 (depth 6)
719 .Jours de l’année avec au moins 5 flux
721 hledger activity --period daily -f Paris.2012.hledger \| grep '\*\{5\}'
722 2012-01-01 ***********
728 2012-05-03 ****************
730 2012-05-14 ****************
731 2012-05-31 **********
732 2012-06-11 ******************
733 2012-06-30 *************
737 2012-07-31 ***********
743 2012-12-31 *************
746 |==================================
749 == Exercice comptable
751 ifdef::backend-slidy2[>>>]
752 === Plan comptable d’une association
754 NOTE: Brouillon de documentation @ https://wiki.cyclocoop.org/Comptabilité/Document/Plan_comptable/[]
758 include::data/Cyclofficine.Plan_comptable.hledger[]
761 === Comptabiliser en partie double
764 |==================================
767 Balance nulle de toute écriture::
768 ++hledger++ n’accepte aucune écriture qui ne respecte
769 pas cette contrainte de la tâche comptable : +
771 « __Pour toute écriture, tout ce qui est [black]_débité_ (+++++) dans ses comptes +
772 est forcément [black]_crédité_ (++-++) dans ses autres comptes, +
773 et réciproquement.__ »
775 * Formellement : latexmath:[$\forall e : \textcolor{#D2691E}{\textbf{\acute{e}criture}},
776 \ \textbf{balance}\>(\textbf{flux}\>{e}) = 0$]
781 Compte:Crédité -1234,56
782 Compte:Débité ; 1234,56 (montant inféré)
787 Relation de Chasles par écritures d’[black]*engagement* et de [black]*paiement*::
788 ++hledger++ laisse l’humain s’occuper de ce principe de la tâche comptable
789 qui traduit la réalité temporelle des mouvements d’argent.
793 01/01 Prestation ; Écriture d’engagement (pièce comptable : facture)
794 7.Produit:0.Vente:6.Prest'action -700,00
795 4.Tiers:1.Client:1.Client:1.Bien,Prestation:007.Mairie_du_XI 700,00
796 01/14 Virement ; Écriture de paiement (pièce comptable : relevé de compte)
797 4.Tiers:1.Client:1.Client:1.Bien,Prestation:007.Mairie_du_XI -700,00
798 5.Finance:1.Etablissement:2.Banque:001.Courant 700,00
803 //01/01 Vélo ; Écriture d’engagement (pièce comptable : facture)
804 // 7.Produit:0.Vente:1.Produit_fini:1.Vélo -80
805 // 5.Finance:1.Etablissement:1.Valeur:2.Chèque_à_encaisser 80
806 //01/02 Chèque ; Écriture de paiement (pièce comptable : relevé de compte)
807 // 5.Finance:1.Etablissement:1.Valeur:2.Chèque_à_encaisser -80
808 // 5.Finance:1.Etablissement:2.Banque:001.Courant 80
811 //NOTE: pour des espèces, transiter par : ++5.Finance:3.Caisse:1.Siège++
813 |==================================
815 ==== Soldes nuls souhaitables
817 - Écritures des recettes
819 1. latexmath:[$\sum{\mbox{ventes}} + \sum{\mbox{dons}} = \sum{\mbox{espèces entrées en caisse}} + \sum{\mbox{Chèques à encaisser}}$] +
820 (Total des ventes + dons == Total d’espèces entrée en caisse + chèques à encaisser (5112))
822 2. Total chèques à encaisser (5112) == Total remises de chèques à la banque (512) (+/- argent non déposé en banque)
824 NOTE: vérifier qu’il ne reste plus de chèque comptabilisés dans le tiroir
826 3. Solde du compte caisse (531) == Total entrées espèces en caisse - Total des sorties
827 (remises d’espèces en banque - sorties d’achats - erreur de caisse)
833 == Import et export avec `hledger`
835 * https://github.com/eval/total_recall[]
836 * https://github.com/quentinsf/icsv2ledger[]
838 === Feuilles de calculs des documents comptables
840 ifdef::backend-slidy2[>>>]
844 ifdef::backend-slidy2[>>>]
845 ==== Comptes de résultats
848 == Installer `hledger`
850 * http://hledger.org/installing[]
855 % sudo apt-get install hledger hledger-web
858 ifdef::backend-slidy2[>>>]
860 * http://www.haskell.org/cabal/[]
865 % echo 'PATH="$HOME/.cabal/bin:$PATH"' >>~/.profile
866 # NOTE: rajoute dans le chemins des exécutables
867 # les exécutables installés par cabal
868 % exit # NOTE: recharge ~/.profile
870 % sudo apt-get install ghc cabal-install \
871 libncurses5-dev libtinfo-dev zlib1g-dev
873 % cabal install cabal # NOTE: met à jour cabal
874 % cabal install happy # NOTE: anticipe une dépendance exécutable
875 % cabal install hledger
876 % cabal install alex # NOTE: anticipe une dépendance exécutable
877 % cabal install warp-2.0.3.4 hledger-web
878 # NOTE: aide cabal à sélectionner un warp qui fonctionne
884 % cabal install --reinstall hledger hledger-web
887 ifdef::backend-slidy2[>>>]
888 ==== Version de développement
892 % git clone http://github.com/simonmichael/hledger.git ~/src/hledger
894 % cabal install --reinstall --force-reinstalls \
895 ./hledger-lib ./hledger ./hledger-web
897 === Utiliser un éditeur de texte structuré (`vim`)
899 Coloration syntaxique sur mesure::
905 autocmd BufNewFile,BufRead *.hledger,*.ledger setfiletype hledger
907 Complètement automatique des comptes (`<Tab>`)::
909 * https://github.com/Shougo/neocomplete.vim[]
910 * https://github.com/Shougo/neocomplcache.vim[]
912 NOTE: Besoin de rajouter ++vim/autoload/neocomplcache/filters/sorter_bytes.vim++.
917 autocmd Filetype hledger set iskeyword+=.,38,39,40,41,44,45,58 "
919 Alignement automatique des montants::
921 * https://github.com/junegunn/vim-easy-align[]
926 let g:easy_align_ignore_groups = ['Comment', 'String', 'hledgerTransaction']
929 ifdef::backend-slidy2[>>>]
930 ==== Suivre les modifications à plusieurs et/ou à distance (`git`)
934 * http://localhost:5000[]
938 == Scripter ++hledger++
941 .Installer un script ++hledger++
943 % echo 'PATH="$HOME/src/hledger/extra:$PATH"' >>~/.profile
944 % exit # NOTE: recharge ~/.profile
945 % ghc ~/src/hledger/extra/hledger-SCRIPT.hs
949 * Vérifier l’ordre des dates.
950 * Chercher des écritures doublonnes.
955 image::data/Luca_Pacioli_(Gemaelde).jpeg[]
957 ifdef::backend-slidy2[]
958 [hledgersplash,position: absolute; left: 50%; top: 10%;]
960 image::data/hledger.splash.png[hledgersplash]
962 endif::backend-slidy2[]