X-Git-Url: http://git.cyclocoop.org/?p=tool%2Fhledger.git;a=blobdiff_plain;f=doc%2Fhledger.fr.slidy.ad;h=b66680e6ba9ff6362ac69471e68e9ea494f3fadd;hp=27d0628fc9f45d9d9f5eaf48cbf7bd14ba13e62e;hb=1a2d1e992bd973ce34e0951ababc071298117242;hpb=61f2b02106365640f1fed2d4c3e8a1a7236bdb4e diff --git a/doc/hledger.fr.slidy.ad b/doc/hledger.fr.slidy.ad index 27d0628..b66680e 100644 --- a/doc/hledger.fr.slidy.ad +++ b/doc/hledger.fr.slidy.ad @@ -20,7 +20,7 @@ ifdef::backend-slidy2[:slidebackground!:] // :source-highlighter: vim -== Le ++.ledger++ : un format de __Grand Livre__ ouvert.. et simple +== Le ++.ledger++ : un format de journal comptable ouvert.. et simple [source,hledger] ---- @@ -30,64 +30,72 @@ ifdef::backend-slidy2[:slidebackground!:] 2014/05/08 Propagande Caisse:Grève -7 - Achat:Impression:Tracts 7 + Achat:Impression:Tracts 7 ; Répéter ad nauseam ---- -ifdef::backend-slidy2[>>>] -=== Les plus +[cols="a,a"] +|================================== +| +[float] +Les plus +~~~~~~~~ + [horizontal] -Transparent:: Visibilité de _toutes_ les informations. -Pérenne:: Compréhensible sans peine. -Modifiable:: Pas d’interface protectrice. +Transparent:: Visibilité de *toutes* les informations. +Pérenne:: Compréhensible sans logiciel particulier pour l’exploiter. +Modifiable:: Pas de verrou de validation (plus ou moins illusoire). Accès:: Pas de changement d’interface non-consenti. -Versionnable:: Suivi et fusion simples des modifications. -Écrit:: Langage pour s’exprimer clairement, par exemple pour discuter dans un courriel. +Versionnable:: Suivi des modifications, fusion des contributions, et sauvegarde simples. +Écrit:: Langage pour s’exprimer clairement (par ex. dans un courriel ou une présentation). Hors-ligne:: Pas besoin de réseau. Interopérable:: Pas spécifique à un éditeur logiciel particulier (sauf fonctionnalité expérimentale). -* http://ledger-cli.org/[] -* http://hledger.org/[] -* http://furius.ca/beancount/[] -* https://massysett.github.io/penny/[] -* https://github.com/hrj/abandon/[] +[horizontal] +ledger;; http://ledger-cli.org/[] +hledger;; http://hledger.org/[] +beancount;; http://furius.ca/beancount/[] +penny;; https://massysett.github.io/penny/[] +abandon;; https://github.com/hrj/abandon/[] + +| +[float] +Les moins +~~~~~~~~~ -=== Les moins [horizontal] Modifiable:: -Mais pas moins que les autres logiciels -et à nuancer si couplé à un gestionnaires de versions, -et/ou avec signature cryptographiques. +Mais, comme c'est un fichier, un verrou-validant + +peut être mis par une **signature cryptographique**. + [source,sh] ---- -% git tag --sign v2011 -m "Clôture de la comptabilité 2011" -% git tag --verify v2011 ----- -+ -[source,sh] ----- -% gpg --sign $fichier.hledger -% gpg --verify-files $fichier.hledger.gpg +% gpg --detach-sign $fichier.ledger +% gpg --verify $fichier.ledger.sig ---- -Textuel:: Préférable de bien savoir utiliser -un éditeur de texte structuré. -Peu contraint:: +Textuel:: Préférable de ne pas avoir peur des caractères, +voire de bien savoir utiliser un éditeur de texte structuré. + +Contrainte minimale:: +« __N'a pas été conçu pour empêcher ses utilisateurs de commettre des actes stupides, +car cela les empêcherait aussi de réaliser des actes ingénieux.__ » + [source,hledger] ---- -2102/03/21 Remise chq (1101804) +2102/03/21 Chèque ; Erreur de date 5.Finance:1.Etablissement:1.Valeur:2.Chèque_à_encaisser -145,00 5.Finance:1.Etablissement:2.Banque:001.Courant 145,00 ---- ++ +NOTE: Mais possibilité de vérifications d’invariants conventionnels avec des scripts. -NOTE: KISS - +|================================== == ++hledger++ : un outil libre.. et convivial + [source,sh] ---- % hledger balance '^6' '^7' --depth 2 -f Paris.2011.hledger @@ -103,160 +111,135 @@ NOTE: KISS 44,58€ ---- -ifdef::backend-slidy2[>>>] -=== Les plus +[cols="a,a"] +|================================== +| +[float] +Les plus +~~~~~~~~ + +Philosophie Unix:: ++ +* « __Écrivez des programmes qui effectuent une seule chose et qui le font bien.__ » +* « __Écrivez des programmes qui collaborent.__ » +* « __Écrivez des programmes pour gérer des flux de texte, + + car c'est une interface universelle.__ » -Utilisation:: -Étude:: -Modification:: -Duplication:: +Utilisation, Étude, Modification, Duplication:: Permises techniquement et légalement + -(« logiciel libre » sous ++GNU/GPLv3++) +(« logiciel libre » sous ++GNU/GPLv3++) -Certification:: +Rigueur:: Programmé en http://fr.wikipedia.org/wiki/Haskell[Haskell] [horizontal] -Fonctionnel pur;; Aucune mutation de données externes à une fonction (effet de bord). -Typage statique;; Vérification des erreurs de type avant l’exécution du programme. +Fonctionnel pur;; Aucune mutation de données externes à une fonction (sans effet de bord). +Typage statique;; Vérification des erreurs de type avant l’exécution du programme. Typage fort;; Aucune conversion implicite de types de données. -Portable:: GNU/Linux, Apple/MacOS, Microsoft/Windows - -Support:: ~1 développeur à mi-temps +Relisible:: ≈13 000 lignes de Haskell (ou 160 écrans de 80 lignes) + +(plus ≈1 800 lignes pour ++hledger-web++). + -* Simon Michael +NOTE: À équivalence fonctionnelle, +OpenERPv7 ≈80 000 lignes de Python (≈1 000 écrans). + +Ancienneté:: Depuis 2007 (≈7 ans). +Portable:: GNU/Linux, Apple/MacOS, Microsoft/Windows [horizontal] Ligne de commande:: +Contrôle l’ordinateur avec le langage. + [source,sh] ---- - % hledger balance -f $fichier.hledger +% hledger add -f $fichier.hledger +% hledger balance -f $fichier.hledger ---- + Interface Web:: + [source,sh] ---- - % hledger-web --server -f $fichier.hledger - % firefox "http://localhost:5000" ----- -Extensible:: -+ -[source,sh] ----- - % ghc hledger-fait-ce-que-je-veux.hs - % ./hledger-fait-ce-que-je-veux -f $fichier.hledger +% hledger-web --server -f $fichier.hledger +% firefox "http://localhost:5000" ---- -ifdef::backend-slidy2[>>>] -=== Les moins -Ligne de commande:: +Support:: ≈1 développeur à mi-temps-libéré + -... - -== Installer `hledger` - -* http://hledger.org/installing[] +* Simon Michael (sm) ++ +NOTE: Dons @ https://www.gittip.com/simonmichael/[] ++ +[horizontal] +Messagerie instantanée;; +Liste de discussion;; +Extensible:: ++ [source,sh] -.Debian/jessie ---- -% sudo apt-get install hledger hledger-web +% ghc hledger-fait-ce-que-je-veux.hs +% ./hledger-fait-ce-que-je-veux -f $fichier.hledger ---- -ifdef::backend-slidy2[>>>] -=== Via `cabal` -* http://www.haskell.org/cabal/[] - -[source,sh] -.Debian/wheezy ----- -% echo 'PATH="$HOME/.cabal/bin:$PATH"' >>~/.profile - # NOTE: rajoute dans le chemins des exécutables - # les exécutables installés par cabal -% exit # NOTE: recharge ~/.profile - -% sudo apt-get install ghc cabal-install \ - libncurses5-dev libtinfo-dev zlib1g-dev -% cabal update -% cabal install cabal # NOTE: met à jour cabal -% cabal install happy # NOTE: anticipe une dépendance exécutable -% cabal install hledger -% cabal install alex # NOTE: anticipe une dépendance exécutable -% cabal install warp-2.0.3.4 hledger-web - # NOTE: aide cabal à sélectionner un warp qui fonctionne ----- - -[source,sh] -.Mise-à-jour ----- -% cabal install --reinstall hledger hledger-web ----- +| +[float] +Les moins +~~~~~~~~~ + +Pas tout en un:: +Fait de la comptabilité, **et juste** de la comptabilité ; +pas un logiciel intégré type ERP (Enterprise Resource Planning) +du genre type https://www.odoo.com/[Odoo] (ancien OpenERP) : +Comptabilité + Point de vente + Facturation + Paye + Gestion de stock + Adhésion + Calendrier + Wiki + ... + +En ligne de commande:: +Peur **irrationnelle** mais fréquente, +d’être libre et d’avoir le pouvoir sur la machine, +au lieu d’être captif d’une interface. ++ +NOTE: L’interface Web est simple, et s’améliore. -ifdef::backend-slidy2[>>>] -==== Version de développement +Read The Fucking Manual:: +De même que maîtriser un plan comptable néçessite +en plus de le parcourir de **s’informer** sur son utilisation, + +de même maîtriser un langage et un logiciel en ligne de commande nécessite +de **s’informer** sur sa syntaxe, sa sémantique et son utilisation. ++ +NOTE: http://hledger.org/manual/[]. -[source,sh] ----- -% git clone http://github.com/simonmichael/hledger.git ~/src/hledger -% cd ~/src/hledger -% cabal install --reinstall --force-reinstalls \ - ./hledger-lib ./hledger ./hledger-web ----- +|================================== -== Écrire en +.ledger+ +== Langage d’un fichier +.ledger+ Un +.ledger+ est un fichier de texte brut respectant une syntaxe préçise -qui forme une succession d’écritures comptables, ordonnées librement. +qui forme une succession d’écritures comptables, classées librement. ifdef::backend-slidy2[>>>] -=== Exemple +=== Définition informelle [source,hledger] +.Fichier ++data/exemple-syntaxe.ledger++ ---- -; Ceci est un exemple de livre comptable « ledger » -; NOTE: fantaisiste comptablement parlant, mais syntaxiquement correct - -2014/01/01 Libellé de l’écriture ; UN_TAG:, Autre_tag:Avec_Valeur - Compte:Sous-Compte -42 ; flux créditant - Autre_Compte:Sous-Compte:Sous-Sous-Compte 42 ; flux débitant - -2014/01/01 Deuxième écriture le même jour - Vente:Âme -666 ; (tag de flux) Arnaque: - Kapital 666 - -2014/01/02 Troisième écriture le jour suivant avec ventilation des flux - Compte:Crédité:A -1 - Compte:Crédité:B -2 - Compte:Débité:Z 1 - Compte:Débité:Y 1 - Compte:Débité:X:x 1 - -2014/04/12 - Compte:Crédité -1234,56 - Compte:Débité ; 1234,56 (montant inféré) - -2014/02/01 Écriture non ordonnée par date ; Ok, mais déconseillé - Compte:Débité 1 - Compte:Crédité -1 ; Flux non ordonné par crédit/débit - ; c'est juste moins lisible... - -; Répéter ad nauseam +include::data/exemple-syntaxe.ledger[] ---- -=== Langage +.Conventions usuelles +* Classement des écritures par date +* Classement des flux par signe, puis compte + +=== Définition formelle [cols="a,a",options="header"] |================================== ^|Syntaxe (grammaire https://fr.wikipedia.org/wiki/Forme_de_Backus-Naur[BNF]) -^|Structure (signatures fonctionnelles) +^|Informations (signatures fonctionnelles) | [source,conf] ----------------------------------- -livre ::= (écriture \| commentaire \| "⏎" \| "␣")* +journal ::= (écriture \| commentaire \| "⏎" \| "␣")* ----------------------------------- | [horizontal] :role: math -**livre**:: latexmath:[$ +**journal**:: latexmath:[$ :\>f:\textcolor{#D2691E}{\textbf{fichier}} → \lbrack\textcolor{#D2691E}{\textbf{\acute{e}criture}}\rbrack$] | @@ -330,162 +313,181 @@ commentaire ::= ( ";" (tag ":" valeur? \| ·)* ) ~\textcolor{#083194}{\textbf{valeur}}:\textcolor{#D2691E}{\textbf{\mbox{texte}}\>?})$] |================================== -NOTE: RTFM @ http://hledger.org/manual/[]. - - -=== Calculs - -[horizontal] -**compte_parent**:: - latexmath:[$:\>c : \textcolor{#D2691E}{\textbf{compte}} → \textcolor{#D2691E}{\textbf{compte}}\>?$] + - latexmath:[$=\>c_{\lbrack0,\cdots,|c|-2\rbrack}\ \mbox{si}\ |c| \ge 2$] -**hiérarchie_de_compte**:: - latexmath:[$:\>\mathbb c : \textcolor{#D2691E}{\textbf{compte}} → \lbrack\textcolor{#D2691E}{\textbf{compte}}\rbrack$] + - latexmath:[$=\>\lbrack{\ c\ :\ \lbrack{\ c\ |\ c ← (\mathbf{compte\mbox{_}parent}\>{c})}\ \rbrack}\ \rbrack$] -**comptes**:: - latexmath:[$:\>\mathbb E : \lbrack\textcolor{#D2691E}{\textbf{\acute{e}criture}}\rbrack → \{\textcolor{#D2691E}{\textbf{compte}}\}$] + - latexmath:[$\{\ (\textbf{compte}\>f)\ |\ f ← (\textbf{flux}\>e)\ |\ e ← \mathbb E\ \}$] -**balance**:: - latexmath:[$:\>\mathbb F : \lbrack\textcolor{#D2691E}{\textbf{flux}}\rbrack → ℚ$] + - latexmath:[$=\>{(\ m\ |\ m ← m + (\textbf{montant}\>f)\ |\ f ← \mathbb F\ |\ m ← 0\ )$] + -**solde_de_compte**:: - latexmath:[$:\>\mathbb E : \lbrack\textcolor{#D2691E}{\textbf{\acute{e}criture}}\rbrack → c : \textcolor{#D2691E}{\textbf{compte}} → ℚ$] + - latexmath:[$=\>{\textbf{balance}\>\lbrack{\ f\ |\ f ← (\textbf{flux}\>e),\ c\>≼\>(\textbf{compte}\>f)\ |\ e ← \mathbb E\ }\rbrack$] + -// latexmath:[$=\>{\displaystyle{\sum_{e ← \mathbb E}}\left(\sum_{\stackrel{f ← (\textbf{flux}\>e),}{c\ ≼\ (\textbf{compte}\>f)}}(\textbf{montant}\>f})\right)$] -**solde**:: - latexmath:[$:\>\mathbb E : \lbrack\textcolor{#D2691E}{\textbf{\acute{e}criture}}\rbrack → - \lbrack\textcolor{#D2691E}{\textbf{flux}}\rbrack$] + - latexmath:[$=\>\displaystyle{\left\lbrack - \begin{array}{l} - (\textcolor{#083194}{\textbf{compte}}=c´, \textcolor{#083194}{\textbf{montant}}=m) \\ - |\ m ← (\mathbf{\mbox{solde_de_compte}}\,\mathbb E\,c´) \\ - |\ c´ ← (\mathbf{hi\acute{e}rarchie\mbox{_}de\mbox{_}compte}\,c) \\ - |\ c ← (\mathbf{comptes}\,\mathbb E) - \end{array}}\right\rbrack$] - - -=== Utiliser un éditeur de texte structuré (`vim`) +== Commandes `hledger` -Coloration syntaxique sur mesure:: -* ++hledger.vim++ -+ -[source,vim] -.~/.vimrc ----- -autocmd BufNewFile,BufRead *.hledger,*.ledger setfiletype hledger ----- -Complètement automatique des comptes (``):: -+ -* https://github.com/Shougo/neocomplete.vim[] -* https://github.com/Shougo/neocomplcache.vim[] -+ -[source,vim] -.~/.vimrc ----- -autocmd Filetype hledger set iskeyword+=.,38,39,40,41,44,45,58 " ----- -Alignement automatique des montants:: -+ -* https://github.com/junegunn/vim-easy-align[] -+ -[source,vim] -.~/.vimrc +[source,sh] +.Syntaxe quasiment commune à toutes les commandes ++hledger++ ---- - let g:easy_align_ignore_groups = ['Comment', 'String', 'hledgerTransaction'] +% hledger $commande $options $filtre -f $fichier.ledger ---- ifdef::backend-slidy2[>>>] -==== Suivre les modifications à plusieurs et/ou à distance (`git`) -TODO +=== Afficher le plan comptable (`accounts`) -== Commandes `hledger` - -ifdef::backend-slidy2[>>>] -=== Calculer des soldes (`balance`) +[cols="a,a"] +|================================== +| +[float] [source,sh] ---- -% hledger balance -f $fichier.ledger $filtre +% hledger accounts --tree -f data/exemple-syntaxe.ledger +sys::[hledger accounts --tree -f data/exemple-syntaxe.ledger] ---- [source,sh] -.Suivi des comptes ----- -% hledger balance -b 2012/02/01 -e 2012/04/30 --monthly -f $fichier.ledger >/tmp/bal.flow -% hledger balance -b 2012/02/01 -e 2012/04/30 --cumulative --monthly -f $fichier.ledger >/tmp/bal.cumulative -% hledger balance -b 2012/02/01 -e 2012/04/30 --historical --monthly -f $fichier.ledger >/tmp/bal.historical -% gvimdiff -o /tmp/bal.{cumulative,historical} ----- -image::data/gvimdiff-cumulative-historical.png[] - -ifdef::backend-slidy2[>>>] -=== Filtrer des écritures (`print`) -TODO - -ifdef::backend-slidy2[>>>] -=== Suivre un compte (`register`) -TODO - -ifdef::backend-slidy2[>>>] -=== Observer des statistiques (`stats`, `activity`) -TODO - - -== Exercice comptable - -ifdef::backend-slidy2[>>>] -=== Plan comptable d’une association - -* DOC : https://wiki.cyclocoop.org/Comptabilité/Document/Plan_comptable/[] - -[source,hledger] ---- -#include::data/Cyclofficine.Plan_comptable.hledger[] +% hledger accounts --flat -f data/exemple-syntaxe.ledger +sys::[hledger accounts --flat -f data/exemple-syntaxe.ledger] ---- +| +[float] +**comptes**:: + latexmath:[$:\>\mathbb E : \lbrack\textcolor{#D2691E}{\textbf{\acute{e}criture}}\rbrack → \{\textcolor{#D2691E}{\textbf{compte}}\}$] + + = « __ensemble des comptes vers lesquels fluent les écritures__ » + + latexmath:[$=\{\ (\textbf{compte}\>f)\ \|\ f ← (\textbf{flux}\>e)\ \|\ e ← \mathbb E\ \}$] +**compte_parent**:: + latexmath:[$:\>c : \textcolor{#D2691E}{\textbf{compte}} → \textcolor{#D2691E}{\textbf{compte}}\>?$] + + latexmath:[$=\>c_{\lbrack0,\cdots,\|c\|-2\rbrack}\ \mbox{si}\ \|c\| \ge 2$] +**hiérachie_de_compte**:: + latexmath:[$:\>\mathbb c : \textcolor{#D2691E}{\textbf{compte}} → \lbrack\textcolor{#D2691E}{\textbf{compte}}\rbrack$] + +// = « __ensemble des comptes vers lesquels fluent les écritures et leur comptes parents__ » + + latexmath:[$=\>\lbrack{\ c\ :\ \lbrack{\ c\ \|\ c ← (\mathbf{compte\mbox{_}parent}\>{c})}\ \rbrack}\ \rbrack$] -=== Comptabiliser en partie double +|================================== -Solde nul de toute écriture:: -+ -Pour toute écriture;; -Tout ce qui est _débité_ (+++++) dans ses comptes + -est forcément _crédité_ (++-++) dans ses autres comptes. -+ -* latexmath:[$\forall e : \textcolor{#D2691E}{\textbf{\acute{e}criture}}, - \ \textbf{balance}\>(\textbf{flux}\>{e}) = 0$] +=== Écrire des écritures (`add`) -Relation de Chasles par écritures d’engagement et de paiement:: -+ -[source,hledger] +[source,sh] +.Sélection d’un modèle selon le libellé +---- +% hledger add -f /tmp/test.ledger +Adding transactions to journal file /tmp/test.ledger +Any command line arguments will be used as defaults. +Use tab key to complete, readline keys to edit, enter to accept defaults. +An optional (CODE) may follow transaction dates. +An optional ; COMMENT may follow descriptions or amounts. +If you make a mistake, enter < at any prompt to restart the transaction. +To end a transaction, enter . when prompted. +To quit, enter . at a date prompt or press control-d or control-c. +Date [2014/07/30]: 2014/01/01 +Description: Libellé de l’écriture ; UN_TAG:, Autre_tag:Avec_Valeur +Account 1: A:AA +Amount 1: -42 +Account 2: B:BB:BBB +Amount 2 [42.0]: 40 +Account 3: B:A +Amount 3 [2.0]: +Account 4 (or . or enter to finish this transaction): . +2014/01/01 Libellé de l’écriture ; UN_TAG:, Autre_tag:Avec_Valeur + A:AA -42 + B:BB:BBB 40 + B:A 2.0 + +Save this transaction to the journal ? [y]: y +Saved. +Starting the next transaction (. or ctrl-D/ctrl-C to quit) +Date [2014/01/01]: +Description: Libellé d’une autre écriture +Using this similar transaction for defaults: +2014/01/01 Libellé de l’écriture ; UN_TAG:, Autre_tag:Avec_Valeur + A:AA -42 + B:BB:BBB 40 + B:A 2.0 + +Account 1 [A:AA]: +Amount 1 [-42.0]: 100 +Account 2 [B:BB:BBB]: B +Amount 2 [-100.0]: +Account 3 (or . to finish this transaction) [B:A]: . +2014/01/01 Libellé d’une autre écriture + A:AA 100 + B -100.0 + +Save this transaction to the journal ? [y]: y +Saved. +Starting the next transaction (. or ctrl-D/ctrl-C to quit) +Date [2014/01/01]: . ---- -01/01 Écriture d’engagement - 7.Produit:0.Vente:1.Produit_fini:1.Vélo -80 - 5.Finance:1.Etablissement:1.Valeur:2.Chèque_à_encaisser 80 -01/02 Écriture de paiement - 5.Finance:1.Etablissement:1.Valeur:2.Chèque_à_encaisser -80 - 5.Finance:1.Etablissement:2.Banque:001.Courant 80 +[source,sh] +.Complètement automatique des comptes +---- +% hledger add -f data/exemple-plan-comptable.ledger +Adding transactions to journal file /home/julm/admin/cyber.coop/src/tool/hledger/doc/data/exemple-plan-comptable.ledger +Any command line arguments will be used as defaults. +Use tab key to complete, readline keys to edit, enter to accept defaults. +An optional (CODE) may follow transaction dates. +An optional ; COMMENT may follow descriptions or amounts. +If you make a mistake, enter < at any prompt to restart the transaction. +To end a transaction, enter . when prompted. +To quit, enter . at a date prompt or press control-d or control-c. +Date [2014/07/30]: yesterday +Description: Trololo +Account 1: 1.Capital: +1.Capital:0.Fonds 1.Capital:3.Sub_invest_BNR:9.Compte_résultat:1.Equipement +1.Capital:0.Fonds:2.SDR 1.Capital:3.Sub_invest_BNR:9.Compte_résultat:1.Equipement:1.État +1.Capital:0.Fonds:2.SDR:4.Apport 1.Capital:3.Sub_invest_BNR:9.Compte_résultat:1.Equipement:2.Région +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 +1.Capital:0.Fonds:3.ADR 1.Capital:3.Sub_invest_BNR:9.Compte_résultat:1.Equipement:4.Commune +1.Capital:0.Fonds:3.ADR:4.Apport 1.Capital:3.Sub_invest_BNR:9.Compte_résultat:1.Equipement:5.Collectivité_publique +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 +1.Capital:0.Fonds:6.Réserve 1.Capital:3.Sub_invest_BNR:9.Compte_résultat:1.Equipement:7.Organisme_privé +1.Capital:0.Fonds:6.Réserve:3.Statutaire 1.Capital:3.Sub_invest_BNR:9.Compte_résultat:1.Equipement:8.Autre +1.Capital:0.Fonds:6.Réserve:8.Autre 1.Capital:3.Sub_invest_BNR:9.Compte_résultat:2.Autre +1.Capital:1.Report 1.Capital:5.Provision_risque&charge +1.Capital:1.Report:0.Bénéfice 1.Capital:5.Provision_risque&charge:1.Risque +1.Capital:1.Report:5.Financeur 1.Capital:5.Provision_risque&charge:5.Impôt +1.Capital:1.Report:9.Déficit 1.Capital:5.Provision_risque&charge:8.Autre +1.Capital:2.Résultat 1.Capital:5.Provision_risque&charge:8.Autre:2.Congés_à_payer +1.Capital:2.Résultat:0.Bénéfice 1.Capital:6.Emprunt,Dette +1.Capital:2.Résultat:9.Déficit 1.Capital:6.Emprunt,Dette:4.Etablissement_crédit +1.Capital:3.Sub_invest_BNR 1.Capital:6.Emprunt,Dette:5.Dépôt,Caution +1.Capital:3.Sub_invest_BNR:1.Equipement 1.Capital:6.Emprunt,Dette:8.Autre +1.Capital:3.Sub_invest_BNR:1.Equipement:1.État 1.Capital:6.Emprunt,Dette:8.Autre:1.Emprunt +1.Capital:3.Sub_invest_BNR:1.Equipement:2.Région 1.Capital:6.Emprunt,Dette:8.Autre:1.Emprunt:1.Bénévole +1.Capital:3.Sub_invest_BNR:1.Equipement:3.Département 1.Capital:6.Emprunt,Dette:8.Autre:1.Emprunt:2.Salarié-e +1.Capital:3.Sub_invest_BNR:1.Equipement:4.Commune 1.Capital:6.Emprunt,Dette:8.Autre:1.Emprunt:3.Cyclofficine +1.Capital:3.Sub_invest_BNR:1.Equipement:5.Collectivité_publique 1.Capital:6.Emprunt,Dette:8.Autre:1.Emprunt:4.Autre +1.Capital:3.Sub_invest_BNR:1.Equipement:6.Entreprise_publique 1.Capital:6.Emprunt,Dette:8.Autre:7.Dette +1.Capital:3.Sub_invest_BNR:1.Equipement:7.Organisme_privé 1.Capital:9.Fonds_dédiés +1.Capital:3.Sub_invest_BNR:1.Equipement:8.Autre 1.Capital:9.Fonds_dédiés:4.Sub_exploit +1.Capital:3.Sub_invest_BNR:8.Autre 1.Capital:9.Fonds_dédiés:5.Don_affecté +1.Capital:3.Sub_invest_BNR:9.Compte_résultat +Account 1: 1.Capital:6.Emprunt,Dette +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 +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 +1.Capital:6.Emprunt,Dette:5.Dépôt,Caution 1.Capital:6.Emprunt,Dette:8.Autre:1.Emprunt:2.Salarié-e +1.Capital:6.Emprunt,Dette:8.Autre 1.Capital:6.Emprunt,Dette:8.Autre:1.Emprunt:3.Cyclofficine +Account 1: 1.Capital:6.Emprunt,Dette:4.Etablissement_crédit +Amount 1: -666 ; Don’t panic +Account 2: 5.Finance: +5.Finance:1.Etablissement 5.Finance:1.Etablissement:2.Banque:002.Livret 5.Finance:8.Virement +5.Finance:1.Etablissement:1.Valeur 5.Finance:3.Caisse 5.Finance:8.Virement:0.Interne +5.Finance:1.Etablissement:1.Valeur:2.Chèque_à_encaisser 5.Finance:3.Caisse:1.Siège 5.Finance:8.Virement:1.Fonds +5.Finance:1.Etablissement:2.Banque:001.Courant 5.Finance:3.Caisse:2.Atelier +Account 2: 5.Finance:1.Etablissement:2.Banque:001.Courant +Amount 2 [666.0]: +Account 3 (or . or enter to finish this transaction): . +2014/07/29 Trololo + 1.Capital:6.Emprunt,Dette:4.Etablissement_crédit -666 ; Don’t panic + 5.Finance:1.Etablissement:2.Banque:001.Courant 666.0 + +Save this transaction to the journal ? [y]: y +Saved. +Starting the next transaction (. or ctrl-D/ctrl-C to quit) +Date [2014/07/29]: . ---- -+ -NOTE: pour des espèces, transiter par : ++5.Finance:3.Caisse:1.Siège++ - -==== Soldes nuls souhaitables - -- Écritures des recettes -+ -1. latexmath:[$\sum{\mbox{ventes}} + \sum{\mbox{dons}} = \sum{\mbox{espèces entrées en caisse}} + \sum{\mbox{Chèques à encaisser}}$] + -(Total des ventes + dons == Total d’espèces entrée en caisse + Chèques à encaisser (5112)) -2. Total chèques à encaisser (5112) == Total remises de chèques à la banque (512) (+/- argent non déposé en banque) -3. Solde du compte caisse (531) == Total entrées espèces en caisse - Total des sorties (remises d’espèces en banque - sorties d’achats - erreur de caisse) -4. Solde compte caisse (531) == Total entrées en caisse - Dépôt espèce en banque - Achat en espèce +=== Filtrer des écritures (`print`) -- Écritures de paye -+ -TODO +++hledger++ permet de filtrer les écritures selon leurs données +(date, libellé, comptes, montants, tags, ...) ; +des expressions rationnelles peuvent être utilisées à cette fin. +NOTE: Cf. manuel : http://hledger.org/manual#query-arguments[] -=== Journaux (filtres) [horizontal] +.Afficher des « journaux auxiliaires » (exemples approximatifs) **Banque**:: + [source,sh] @@ -516,7 +518,7 @@ hledger print -f $fichier.ledger '^5.Finance:3.Caisse:' ---- hledger print -f $fichier.ledger '6.Charge:(3.Impôt:(1.|3.):|4.Personnel:)' ---- -**À NouVeaux**:: +**À NouVeau**:: + [source,sh] ---- @@ -529,18 +531,135 @@ hledger print -f $fichier.ledger tag:ANV hledger print -f $fichier.ledger tag:OD ---- -=== Clôture / Ouverture (`equity`) + +=== Calculer des soldes (`balance`) + +[cols="a,a"] +|================================== +| +[float] +[source,sh] +.Balance de toutes les écritures +---- +% hledger balance -f data/exemple-syntaxe.ledger +sys::[hledger balance -f data/exemple-syntaxe.ledger | sed -e 's/^-/‑/'] +---- + +NOTE: Toutes les écritures devant avoir leur balance nulle, +cette balance sur toutes les écritures est également nulle. + +[source,sh] +.Balance sur des comptes filtrés par expression rationnelle +---- +% hledger balance 'A' -f data/exemple-syntaxe.ledger +sys::[hledger balance 'A' -f data/exemple-syntaxe.ledger | sed -e 's/^[-=]/‑/'] +---- + +[source,sh] +.Balance sur un compte racine +---- +% hledger balance '^A' -f data/exemple-syntaxe.ledger +sys::[hledger balance '^A' -f data/exemple-syntaxe.ledger | sed -e 's/^[-=]/‑/'] +---- + +[source,sh] +.Sans accumulation des soldes d’une période à l’autre +---- +% hledger balance --daily -f data/exemple-syntaxe.ledger +sys::[hledger balance --daily -f data/exemple-syntaxe.ledger | sed -e 's/^[-=]/‑/;s/[|]/\\|/g'] +---- + +[source,sh] +.Avec accumulation des soldes d’une période à l’autre +---- +% hledger balance --daily --historical -f data/exemple-syntaxe.ledger +sys::[hledger balance --daily --historical -f data/exemple-syntaxe.ledger | sed -e 's/^[-=]/‑/;s/[|]/\\|/g'] +---- + +//[source,sh] +//.Suivi des comptes +//---- +//% hledger balance -b 2012/02/01 -e 2012/04/30 --monthly -f $fichier.ledger >/tmp/bal.flow +//% hledger balance -b 2012/02/01 -e 2012/04/30 --cumulative --monthly -f $fichier.ledger >/tmp/bal.cumulative +//% hledger balance -b 2012/02/01 -e 2012/04/30 --historical --monthly -f $fichier.ledger >/tmp/bal.historical +//% gvimdiff -o /tmp/bal.{cumulative,historical} +//---- +//image::data/gvimdiff-cumulative-historical.png[] +| +[float] +[horizontal] +**balance**:: + latexmath:[$:\>\mathbb F : \lbrack\textcolor{#D2691E}{\textbf{flux}}\rbrack → ℚ$] + + = « __somme des montants des flux__ » + + latexmath:[$=\>{(\ m\ \|\ m ← m + (\textbf{montant}\>f)\ \|\ f ← \mathbb F\ \|\ m ← 0\ )$] + +**solde_de_compte**:: + latexmath:[$:\>\mathbb E : \lbrack\textcolor{#D2691E}{\textbf{\acute{e}criture}}\rbrack → c : \textcolor{#D2691E}{\textbf{compte}} → ℚ$] + + latexmath:[$=\>{\textbf{balance}\>\lbrack{\ f\ \|\ f ← (\textbf{flux}\>e),\ c\>≼\>(\textbf{compte}\>f)\ \|\ e ← \mathbb E\ }\rbrack$] + +// latexmath:[$=\>{\displaystyle{\sum_{e ← \mathbb E}}\left(\sum_{\stackrel{f ← (\textbf{flux}\>e),}{c\ ≼\ (\textbf{compte}\>f)}}(\textbf{montant}\>f})\right)$] +**solde**:: + latexmath:[$:\>\mathbb E : \lbrack\textcolor{#D2691E}{\textbf{\acute{e}criture}}\rbrack → + \lbrack\textcolor{#D2691E}{\textbf{flux}}\rbrack$] + + latexmath:[$=\>\displaystyle{\left\lbrack + \begin{array}{l} + (\textcolor{#083194}{\textbf{compte}}=c´, \textcolor{#083194}{\textbf{montant}}=m) \\ + \|\ m ← (\mathbf{\mbox{solde_de_compte}}\,\mathbb E\,c´) \\ + \|\ c´ ← (\mathbf{plan\mbox{_}comptable}\,c) \\ + \|\ c ← (\mathbf{comptes}\,\mathbb E) + \end{array}}\right\rbrack$] + +|================================== + +=== Suivre un compte (`register`) + +[source,sh] +.Suivi de la somme des crédits du compte `5112` +---- +% hledger register -f Paris.2011.hledger 'amt:<0' '^5.Finance:1.Etablissement:1.Valeur:2.Chèque_à_encaisser' +2011/05/23 Remise chq 0994029 ..Chèque_à_encaisser -100,00€ -100,00€ +2011/09/29 Remise chq 1101801 ..Chèque_à_encaisser -20,00€ -120,00€ +2011/11/18 Remise chq 1101802 ..Chèque_à_encaisser -2000,00€ -2120,00€ +---- + +[source,sh] +.Suivi de la somme des débits du compte `5112` +---- +% hledger register -f Paris.2011.hledger 'amt:>0' '^5.Finance:1.Etablissement:1.Valeur:2.Chèque_à_encaisser' +2011/05/15 Prêt ..Chèque_à_encaisser 100,00€ 100,00€ +2011/09/20 Cotisations ..Chèque_à_encaisser 20,00€ 120,00€ +2011/11/10 Prêt ..Chèque_à_encaisser 2000,00€ 2120,00€ +---- + +=== Calculer les écritures de clôture et ouverture (`equity`) ++hledger-equity++ calcule une balance de comptes et en fait deux écritures, respectivement : [horizontal] de clôture:: pour les solder à zéro en fin d’exercice ; d’ouverture:: pour les réinitialiser à leur solde du précédent exercice. +[cols="a,a"] +|================================== +| +[float] +[source,sh] +---- +% hledger-equity -f data/exemple-syntaxe.ledger +sys::[hledger-equity -f data/exemple-syntaxe.ledger] +---- + [source,sh] ---- -% hledger-equity -f $fichier.ledger $filtre +% hledger-equity -f data/exemple-syntaxe.ledger '^A' +sys::[hledger-equity -f data/exemple-syntaxe.ledger '^A'] ---- +[source,sh] +---- +% hledger-equity -f data/exemple-syntaxe.ledger '^B' +sys::[hledger-equity -f data/exemple-syntaxe.ledger '^B'] +---- + +| +[float] [source,hledger] .Solde des compte de gestion ---- @@ -568,6 +687,149 @@ d’ouverture:: pour les réinitialiser à leur solde du précédent exercice. equity:opening balances -44,58€ ---- +|================================== + + +=== Observer des statistiques (`stats`, `activity`) + +[cols="a,a"] +|================================== +| +[float] +[source,sh] +.Statistiques annuelles +---- +% hledger stats --period yearly -f Paris.2012.hledger +Main journal file : Paris.2012.hledger +Included journal files : Paris.Plan_comptable.hledger + Cyclofficine.Plan_comptable.hledger +Transactions span : 2012-01-01 to 2013-01-01 (366 days) +Last transaction : 2012-12-31 (576 days ago) +Transactions : 210 (0.6 per day) +Transactions last 30 days: 0 (0.0 per day) +Transactions last 7 days : 0 (0.0 per day) +Payees/descriptions : 144 +Accounts : 448 (depth 6) +Commodities : 1 (€) +---- + +| +[float] +[source,sh] +.Jours de l’année avec au moins 5 flux +---- +hledger activity --period daily -f Paris.2012.hledger \| grep '\*\{5\}' +2012-01-01 *********** +2012-02-29 ****** +2012-03-23 ****** +2012-03-31 ********* +2012-04-03 ****** +2012-04-30 ******** +2012-05-03 **************** +2012-05-11 ******** +2012-05-14 **************** +2012-05-31 ********** +2012-06-11 ****************** +2012-06-30 ************* +2012-07-13 ********* +2012-07-17 ****** +2012-07-30 ****** +2012-07-31 *********** +2012-08-31 ****** +2012-09-26 ******** +2012-09-30 ****** +2012-11-13 ******** +2012-11-30 ***** +2012-12-31 ************* +---- + +|================================== + + +== Exercice comptable + +ifdef::backend-slidy2[>>>] +=== Plan comptable d’une association + +NOTE: Brouillon de documentation @ https://wiki.cyclocoop.org/Comptabilité/Document/Plan_comptable/[] + +[source,hledger] +---- +include::data/Cyclofficine.Plan_comptable.hledger[] +---- + +=== Comptabiliser en partie double + +[cols="a,a"] +|================================== +| +[float] +Balance nulle de toute écriture:: +++hledger++ n’accepte aucune écriture qui ne respecte +pas cette contrainte de la tâche comptable : + ++ +« __Pour toute écriture, tout ce qui est [black]_débité_ (+++++) dans ses comptes + +est forcément [black]_crédité_ (++-++) dans ses autres comptes, + +et réciproquement.__ » ++ +* Formellement : latexmath:[$\forall e : \textcolor{#D2691E}{\textbf{\acute{e}criture}}, + \ \textbf{balance}\>(\textbf{flux}\>{e}) = 0$] ++ +[source,hledger] +---- +2014/04/12 + Compte:Crédité -1234,56 + Compte:Débité ; 1234,56 (montant inféré) +---- + +| +[float] +Relation de Chasles par écritures d’[black]*engagement* et de [black]*paiement*:: +++hledger++ laisse l’humain s’occuper de ce principe de la tâche comptable +qui traduit la réalité temporelle des mouvements d’argent. ++ +[source,hledger] +---- +01/01 Prestation ; Écriture d’engagement (pièce comptable : facture) + 7.Produit:0.Vente:6.Prest'action -700,00 + 4.Tiers:1.Client:1.Client:1.Bien,Prestation:007.Mairie_du_XI 700,00 +01/14 Virement ; Écriture de paiement (pièce comptable : relevé de compte) + 4.Tiers:1.Client:1.Client:1.Bien,Prestation:007.Mairie_du_XI -700,00 + 5.Finance:1.Etablissement:2.Banque:001.Courant 700,00 +---- +//+ +//[source,hledger] +//---- +//01/01 Vélo ; Écriture d’engagement (pièce comptable : facture) +// 7.Produit:0.Vente:1.Produit_fini:1.Vélo -80 +// 5.Finance:1.Etablissement:1.Valeur:2.Chèque_à_encaisser 80 +//01/02 Chèque ; Écriture de paiement (pièce comptable : relevé de compte) +// 5.Finance:1.Etablissement:1.Valeur:2.Chèque_à_encaisser -80 +// 5.Finance:1.Etablissement:2.Banque:001.Courant 80 +//---- +//+ +//NOTE: pour des espèces, transiter par : ++5.Finance:3.Caisse:1.Siège++ + +|================================== + +==== Soldes nuls souhaitables + +- Écritures des recettes ++ +1. latexmath:[$\sum{\mbox{ventes}} + \sum{\mbox{dons}} = \sum{\mbox{espèces entrées en caisse}} + \sum{\mbox{Chèques à encaisser}}$] + +(Total des ventes + dons == Total d’espèces entrée en caisse + chèques à encaisser (5112)) + +2. Total chèques à encaisser (5112) == Total remises de chèques à la banque (512) (+/- argent non déposé en banque) ++ +NOTE: vérifier qu’il ne reste plus de chèque comptabilisés dans le tiroir + +3. Solde du compte caisse (531) == Total entrées espèces en caisse - Total des sorties +(remises d’espèces en banque - sorties d’achats - erreur de caisse) + +- Écritures de paye ++ +TODO + == Import et export avec `hledger` * https://github.com/eval/total_recall[] @@ -583,28 +845,114 @@ ifdef::backend-slidy2[>>>] ==== Comptes de résultats TODO -== `hledger-web` +== Installer `hledger` + +* http://hledger.org/installing[] + +[source,sh] +.Debian/jessie +---- +% sudo apt-get install hledger hledger-web +---- + +ifdef::backend-slidy2[>>>] +=== Via `cabal` +* http://www.haskell.org/cabal/[] + +[source,sh] +.Debian/wheezy +---- +% echo 'PATH="$HOME/.cabal/bin:$PATH"' >>~/.profile + # NOTE: rajoute dans le chemins des exécutables + # les exécutables installés par cabal +% exit # NOTE: recharge ~/.profile + +% sudo apt-get install ghc cabal-install \ + libncurses5-dev libtinfo-dev zlib1g-dev +% cabal update +% cabal install cabal # NOTE: met à jour cabal +% cabal install happy # NOTE: anticipe une dépendance exécutable +% cabal install hledger +% cabal install alex # NOTE: anticipe une dépendance exécutable +% cabal install warp-2.0.3.4 hledger-web + # NOTE: aide cabal à sélectionner un warp qui fonctionne +---- + +[source,sh] +.Mise-à-jour +---- +% cabal install --reinstall hledger hledger-web +---- + +ifdef::backend-slidy2[>>>] +==== Version de développement + +[source,sh] +---- +% git clone http://github.com/simonmichael/hledger.git ~/src/hledger +% cd ~/src/hledger +% cabal install --reinstall --force-reinstalls \ + ./hledger-lib ./hledger ./hledger-web +---- +=== Utiliser un éditeur de texte structuré (`vim`) + +Coloration syntaxique sur mesure:: +* ++hledger.vim++ ++ +[source,vim] +.~/.vimrc +---- +autocmd BufNewFile,BufRead *.hledger,*.ledger setfiletype hledger +---- +Complètement automatique des comptes (``):: ++ +* https://github.com/Shougo/neocomplete.vim[] +* https://github.com/Shougo/neocomplcache.vim[] ++ +NOTE: Besoin de rajouter ++vim/autoload/neocomplcache/filters/sorter_bytes.vim++. ++ +[source,vim] +.~/.vimrc +---- +autocmd Filetype hledger set iskeyword+=.,38,39,40,41,44,45,58 " +---- +Alignement automatique des montants:: ++ +* https://github.com/junegunn/vim-easy-align[] ++ +[source,vim] +.~/.vimrc +---- +let g:easy_align_ignore_groups = ['Comment', 'String', 'hledgerTransaction'] +---- + +ifdef::backend-slidy2[>>>] +==== Suivre les modifications à plusieurs et/ou à distance (`git`) TODO -== (bonus) Scripter ++hledger++ +== +++hledger-web+++ +* http://localhost:5000[] ++ TODO -ifdef::backend-slidy2[>>>] -=== Installer un script ++hledger++ +== Scripter ++hledger++ + [source,sh] +.Installer un script ++hledger++ ---- % echo 'PATH="$HOME/src/hledger/extra:$PATH"' >>~/.profile % exit # NOTE: recharge ~/.profile % ghc ~/src/hledger/extra/hledger-SCRIPT.hs ---- -== Communauté - -[horizontal] -Chat:: -Liste:: +.Idées de scripts +* Vérifier l’ordre des dates. +* Chercher des écritures doublonnes. +== Merci +.Luca Pacioli +image::data/Luca_Pacioli_(Gemaelde).jpeg[] ifdef::backend-slidy2[] [hledgersplash,position: absolute; left: 50%; top: 10%;]