{ "info": { "author": "Stanislas Guerra", "author_email": "stanislas.guerra@gmail.com", "bugtrack_url": null, "classifiers": [ "Environment :: Console", "Intended Audience :: End Users/Desktop", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Topic :: Office/Business :: Financial :: Accounting" ], "description": "=======\nColbert\n=======\n\n\n.. image:: https://coveralls.io/repos/Starou/Colbert/badge.png\n :target: https://coveralls.io/r/Starou/Colbert\n\n.. image:: https://pypip.in/v/Colbert/badge.png\n :target: https://pypi.python.org/pypi/Colbert\n\n.. image:: https://pypip.in/py_versions/Colbert/badge.svg\n :target: https://pypi.python.org/pypi/Colbert/\n :alt: Supported Python versions\n\n.. image:: https://pypip.in/license/Colbert/badge.svg\n :target: https://pypi.python.org/pypi/Colbert/\n :alt: License\n\n*Colbert* is not about `Stephen Colbert `_. It is serious matter.\n\nThe name is a tribute to `Jean-Baptiste Colbert `_, the Minister of Finances\nof France in the 17th century also known for being the father of the modern accountancy.\n\n\nInstallation\n============\n\n.. code-block:: bash\n\n pip install Colbert\n\n\nFunctionalities\n===============\n\nColbert helps you to manage your accountancy with a unique constraint: get your *Livre Journal* (the book where you are supposed\nto daily register the financial operations) up-to-date. That's it.\n\nFrom that file it produce the annual reports (*Bilan*, *Compte de r\u00e9sultat* etc). There are also some utilities to check\nyour Livre-journal against the bank reports, to generate invoices, activity report from *iCalendar* etc.\n\n\nDisclaimer(s)\n=============\n\nThis software has **not** been written by and /or with the help of an accountant (and no accountant has been hurt during the process).\n\n\nThe concepts\n============\n\nBackground\n----------\n\nI am running a small business since 2011 and from the start I decided to not outsource the accountancy nor to use a commercial software.\n\nMaybe I should have given `Gnucash `_ but I decided to be cheap on the technology side and to build a collection\nof utilities on the fly as I was facing formalities.\n\n*Colbert* is that very collection of tools working over organized and formated text files (*reStructuredText* and *JSON*).\nThese tools produce other text files. Combined with LaTex (inside Makefile for automation) you can produce beautiful documents.\n\n::\n\n\n colbert-scripts\n file-A.txt, -----------------> file-C.txt\n file-B.json -\n - |\n | |\n | LaTex, etc. | LaTeX, etc.\n | |\n v v \n file-A.tex file-C.tex\n file-A.pdf\n file-A.ps\n \n\n\n\n\nThe core of accountancy is *le livre-journal*. This is our database where every single operation occuring in your business\nis recorded. Each operation must be balanced: the sum of the entries must be balanced by one or more output of the same amount.\n\nIn large compagnies, this book is usualy splitted in several ones to regroup operations by type.\n\nThe scaffold I use is the following::\n\n\n + MyBusiness/ +-- accountancy/ +-- livre-journal/ +-- livre-journal.txt \n | | \n | +-- Makefile \n |\n +-- 2011/ +-- grand-livre/\n | |\n | +-- releves-bancaires/ \n | |\n | +-- factures/ \n | |\n | +-- balance-des-comptes/\n | |\n | +-- bilan/\n | |\n | +-- compte-de-resultat/ \n | |\n | +-- TVA/ \n | |\n | +-- ecritures-de-cloture/\n |\n +-- 2012/ +-- grand-livre/\n | |\n | +-- releves-bancaires/ \n ...\n\n\n*Le livre-journal* is a never-ending story, this is the reason for keeping it at the root level. In accountancy, a main concept is\n*l'ind\u00e9pendance des exercices comptables* which is why I have broken down my organization by year (I am opening my accounts on Junary the 1st\nand closing them on December, 31th, every year).\n\nIn each year directory reside sub-directories named with the tasks, books or documents you have to deal with and produce all along the financial/fiscal year.\n\nAlmost every sub-directory should contain a Makefile to automatically call some Colbert or LaTeX routines to update your files from the source \n(which may be the *livre-journal*, the *Grand-livre* or the *Balance des comptes*).\n\n\nIn a nutshell, a typical usage at the end of a fiscal year is:\n\n1. having a *Livre-journal* up-to-date and accurate ;\n2. check your *relev\u00e9s bancaires* (bank statement) against the Livre-journal. Go back to (1) if it is not the case ;\n3. generate the *Grand-livre* as JSON from the Livre-journal ;\n4. generate the *Balance des comptes* from the *grand_livre.json* file ;\n5. compute the *Bilan* from the *balance_des_comptes.json* file ;\n6. compute the *Compte de r\u00e9sultat* from the *balance_des_comptes.json* file ;\n7. compute the *\u00e9critures de cl\u00f4ture* from the *balance_des_comptes.json* file and write them back to the Livre-journal ;\n\n\n\n**Note** : each *JSON* file can be converted in a *reStructuredText* format with a *colbert_\\*_to_rst* script. \n\n\nLe Livre-journal\n----------------\n\nThe Livre-journal is a diary or a book where every flow of money is logged. There is a tight legislation concerning those books in general and\nyou must refer yourself to the legislation of your country or juridiction.\n\nIn Colbert, this is a reStructuredText file meeting the french administration requirements (the columns' width had been reduced to fit properly in this document):\n\n.. code-block:: rst\n\n ==================\n MyBusiness S.A.R.L\n ==================\n\n -------------\n Livre-Journal\n -------------\n\n +-------------+-----------------+-----------------+-------------------------------------------------+-----------+-----------+\n | Date | N\u00b0compte d\u00e9bit | N\u00b0compte cr\u00e9dit | Intitul\u00e9 / nom du compte | D\u00e9bit en \u20ac| Cr\u00e9dit en |\n +=============+=================+=================+=================================================+===========+===========+\n | *Mars 2011* |\n +-------------+-----------------+-----------------+-------------------------------------------------+-----------+-----------+\n || 18/03/2011 || || || Frais de constitution de la soci\u00e9t\u00e9 CFE Paris. || || |\n || || 6227 || || Achats - Frais d'actes et de contentieux || 80.00 || |\n || || 44566 || || T.V.A. d\u00e9ductible sur autres biens et services || 10.45 || |\n || || || 455 || Associ\u00e9s - Comptes courants || || 90.45 |\n +-------------+-----------------+-----------------+-------------------------------------------------+-----------+-----------+\n || 18/03/2011 || || || Frais de constitution de la soci\u00e9t\u00e9 - Annonce || || |\n || || 6227 || || Achats - Frais d'actes et de contentieux || 80.00 || |\n || || 44566 || || T.V.A. d\u00e9ductible sur autres biens et services || 19.00 || |\n || || || 455 || Associ\u00e9s - Comptes courants || || 99.00 |\n +-------------+-----------------+-----------------+-------------------------------------------------+-----------+-----------+\n || 31/03/2011 || || || Facture 2011-01 MyClient1 || || |\n || || || || Prestation MyClient1 mars 2011 || || |\n || || 4111-CL1 || || Clients - ventes de biens ou prestations || 980.00 || |\n || || || 706 || Produits - prestations de services || || 5 000.00|\n || || || 44587 || Taxes sur le CA sur factures \u00e0 \u00e9tablir || || 980.00 |\n +-------------+-----------------+-----------------+-------------------------------------------------+-----------+-----------+\n | *Avril 2011* |\n +-------------+-----------------+-----------------+-------------------------------------------------+-----------+-----------+\n || 01/04/2011 || || || R\u00e9sultat arr\u00eat\u00e9 compte || || |\n || || 6278-LCL || || Autres frais de commission sur prestations || 48.00 || |\n || || || 512 || Banques || || 48.00 |\n +-------------+-----------------+-----------------+-------------------------------------------------+-----------+-----------+\n\n\n\nEach entry is a multiline row in the table. \n\nI use *Line Blocks* to get a descent formatting in the multiline cells. Trying to right-align the content of the two last columns was a failure.\nIn fact for a reason I don't get, if those values are not left-aligned, the LaTeX conversion sucks.\n\nThe optional *thousand separator* cannot be anything else than a space character at the moment. This is on the TODO list.\n\nAdding entries\n''''''''''''''\n\nEditing the file can became cumbersome. To speed up this task you can use the ``colbert_livre_journal.py`` script\nto duplicate an entry:\n\n.. code-block:: bash\n\n $ python colbert_livre_journal.py search cojean -l path/to/livre-journal.txt\n $ python colbert_livre_journal.py add -l path/to/livre-journal.txt -f cojean -d 14/09/2014 -a 13.50\n\n\nChecking the Livre-journal\n''''''''''''''''''''''''''\n\nA first script allows you to check the entries balance of the book:\n\n.. code-block:: bash\n\n $ colbert_check_livre_journal.py my_livre_journal.txt\n\n\nMy Makefile in the Livre-journal directory being:\n\n.. code-block:: make\n \n FILENAME=\"livre-journal\"\n\n all:\tpdf\n\n pdf:\ttex\n @pdflatex $(FILENAME).tex\n @pdflatex $(FILENAME).tex\n @colbert_check_livre_journal.py $(FILENAME).txt\n\n tex:\n @rst2latex.py $(FILENAME).txt > $(FILENAME).tex\n\n purge:\tclean\n @for ext in \".pdf\" \".tex\" \".txt\"; do\\\n [ -e $(FILENAME)$${ext} ] && rm $(FILENAME)$${ext} || [ 1 ] ;\\\n done\n\n clean:\n @for ext in \".out\" \".aux\" \".log\" \".tex.tmp\"; do\\\n [ -e $(FILENAME)$${ext} ] && rm $(FILENAME)$${ext} || [ 1 ] ;\\\n done\n\n\nComputing VAT\n'''''''''''''\n\nThe *colbert_solder_tva.py* script compute the flow of money on the VAT-related accounts for a period of time and produce an JSON-entry\nto counter-balance these entries. Then you (manually) copy/paste this entry in the Livre-journal.\nObviously, the JSON-entry need to be converted first in the reStructuredText format of the Livre-journal with the *colbert_ecritures_to_livre_journal.py*\nutility.\n\nThis is something you have to do every month or every quarter in France.\n\nIn the *TVA* directory:\n\n.. code-block:: bash\n\n $ colbert_solder_tva ../../livre-journal/livre-journal.txt -d 01/03/2011 -f 30/9/2011 > solde-tva-sept-2011.json\n $ colbert_ecritures_to_livre_journal solde-tva-sept-2011.json > solde-tva-sept-2011.txt\n\n\nLe Grand-livre\n--------------\n\nIn that book are gathered the entries of the Livre-journal by account number for a period of time (a fiscal year). One table for every single account.\n\nEvery account should start with the *report \u00e0 nouveau* (the balance) of the previous fiscal year.\n\nTo generate the Grand-livre, run the following:\n\n.. code-block:: bash\n\n $ @colbert_grand_livre.py ../../livre-journal/livre-journal.txt --label=\"MyBusiness - Grand-Livre 2011\" -d 1/1/2011 -f 31/12/2011 > grand-livre_2011.json\n\nAnd then in reStructuredText:\n\n.. code-block:: bash\n\n $ colbert_grand_livre_to_rst.py grand-livre_2011.json > grand-livre_2011.txt\n\n\nOr in a Makefile:\n\n.. code-block:: make\n\n FILENAME=\"grand_livre-2011\"\n DATE_DEBUT=\"18/03/2011\"\n DATE_FIN=\"31/12/2011\"\n\n all:\tpdf\n\n pdf:\ttex\n @pdflatex $(FILENAME).tex\n @pdflatex $(FILENAME).tex\n @pdflatex $(FILENAME).tex\n\n tex:\trst\n @rst2latex.py --table-style=booktabs $(FILENAME).txt > $(FILENAME).tex.tmp\n @sed -E -f fix_table.sed < $(FILENAME).tex.tmp > $(FILENAME).tex\n\n rst:\tjson\n @echo \"Conversion du grand livre au format reStructuredText...\"\n @colbert_grand_livre_to_rst.py $(FILENAME).json > $(FILENAME).txt\n\n json:\n @echo \"calcul du Grand-Livre...\"\n @colbert_grand_livre.py ../../livre-journal/livre-journal.txt --label=\"MyBusiness - Grand-Livre 2011\" -d $(DATE_DEBUT) -f $(DATE_FIN) > $(FILENAME).json\n\n purge:\tclean\n @for ext in \".pdf\" \".tex\" \".txt\"; do\\\n [ -e $(FILENAME)$${ext} ] && rm $(FILENAME)$${ext} || [ 1 ] ;\\\n done\n\n clean:\n @for ext in \".out\" \".aux\" \".log\" \".tex.tmp\"; do\\\n [ -e $(FILENAME)$${ext} ] && rm $(FILENAME)$${ext} || [ 1 ] ;\\\n done\n\nThe *fix_table.sed* in the TeX conversion rule is a Sed script managing the right-alignment of the money columns::\n\n s/\\\\begin{longtable\\*}.*/\\\\newcolumntype{x}[1]{% \\\n >{\\\\raggedleft\\\\hspace{0pt}}p{#1}}% \\\n \\\\newcolumntype{y}[1]{% \\\n >{\\\\raggedright\\\\hspace{0pt}}p{#1}}% \\\n \\\\begin{longtable*}[c]{y{2cm}y{7.5cm}x{2cm}|y{2cm}y{7.5cm}x{2cm}}/\n s/&[[:space:]]+\\\\\\\\/\\& \\\\tabularnewline/\n s/[[:space:]]+\\\\\\\\$/\\\\tabularnewline/\n\nHere an example of the reStructuredText output:\n\n.. code-block:: rst\n\n ================\n Grand-Livre 2011\n ================\n\n\n -----------------------------------\n P\u00e9riode du 01/03/2011 au 31/12/2011\n -----------------------------------\n\n\n\n 100 - *Capital et compte de l'exploitant*\n '''''''''''''''''''''''''''''''''''''''''\n\n\n +------------+---------------------------------+-------------+------------+---------------------------------------+---------+\n | Date | Libell\u00e9 | D\u00e9bit | Date | Libell\u00e9 | Cr\u00e9dit |\n +============+=================================+=============+============+=======================================+=========+\n | | | | 02/04/2011 | Capital initial D\u00e9p\u00f4t de 1500 \u20ac par...| 1500.00 |\n +------------+---------------------------------+-------------+------------+---------------------------------------+---------+\n | | *Solde cr\u00e9diteur au 31/12/2011* | **1500.00** | | | |\n +------------+---------------------------------+-------------+------------+---------------------------------------+---------+\n\n .. raw:: latex\n\n \\newpage\n\n\n 4111-CL1 - *Clients - ventes de biens ou prestations de services*\n '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''\n\n\n +------------+---------------------------------+----------+------------+-----------------------------------------+----------+\n | Date | Libell\u00e9 | D\u00e9bit | Date | Libell\u00e9 | Cr\u00e9dit |\n +============+=================================+==========+============+=========================================+==========+\n | 31/03/2011 | Facture 2011-01 MyClient1 ... | 5980.00 | 02/09/2011 | Virement MyClient1 ZZZZZZZZZZZ Facture..| 5980.00 |\n +------------+---------------------------------+----------+------------+-----------------------------------------+----------+\n | 28/09/2011 | Facture 2011-04 MyClient1 ... | 13156.00 | 01/12/2011 | Virement MyClient1 WWWWWWWWWW Facture...| 18538.00 |\n +------------+---------------------------------+----------+------------+-----------------------------------------+----------+\n | 01/11/2011 | Facture 2011-05 MyClient1 ... | 5382.00 | | | |\n +------------+---------------------------------+----------+------------+-----------------------------------------+----------+\n | | *Compte sold\u00e9 au 31/12/2011.* | | | *Compte sold\u00e9 au 31/12/2011.* | |\n +------------+---------------------------------+----------+------------+-----------------------------------------+----------+\n\n .. raw:: latex\n\n\nN+1 years\n'''''''''\n\nWhen you start a new year there are two things to keep in mind for the Grand-Livre:\n\n- to start with the *Report \u00e0 nouveau* of the account of the previous year ;\n- to include the entries of the previous year that have not been included in the Grand-Livre.\n\n\n*Colbert* does it for you. All you have to do is to provide the path of the previous one (as JSON):\n\n.. code-block:: bash\n\n $ @colbert_grand_livre.py ../../livre-journal/livre-journal.txt --label=\"MyBusiness - Grand-Livre 2012\" \\\n -d 1/1/2012 -f 31/12/2012 -p ../../2011/grand-livre/grand-livre_2011.json > grand-livre_2012.json\n\n\nLa balance des comptes\n----------------------\n\nThe next financial piece is a single table regrouping the balance of the accounts. It is computed from the Grand-livre for\nthe sake of simplicity. \n\nAgain, you first generate a JSON file and then a reStructuredText file:\n\n.. code-block:: bash\n\n $ colbert_balance_des_comptes.py ../grand-livre/grand_livre-2011.json \\\n --label=\"MyBusiness - Balance des comptes 2011 en \u20ac\" > $balance-des-comptes.json\n $ colbert_balance_des_comptes_to_rst.py balance-des-comptes.json > balance-des-comptes.txt\n\n\nAnd again, you should use this Makefile:\n\n.. code-block:: make\n\n FILENAME=\"balance_des_comptes-2011\"\n\n all:\tpdf\n\n pdf:\ttex\n @pdflatex $(FILENAME).tex\n @pdflatex $(FILENAME).tex\n @pdflatex $(FILENAME).tex\n\n tex:\trst\n @rst2latex.py --table-style=booktabs $(FILENAME).txt > $(FILENAME).tex.tmp\n @sed -E -f fix_table.sed < $(FILENAME).tex.tmp > $(FILENAME).tex\n\n rst:\tjson\n @echo \"Conversion de la balance des comptes au format reStructuredText...\"\n @colbert_balance_des_comptes_to_rst.py $(FILENAME).json > $(FILENAME).txt\n\n json:\n @echo \"calcul de la balance des comptes...\"\n @colbert_balance_des_comptes.py ../grand-livre/grand_livre-2011.json --label=\"MyBusiness - Balance des comptes 2011 en \u20ac\" > $(FILENAME).json\n\n purge:\tclean\n @for ext in \".pdf\" \".tex\" \".txt\"; do\\\n [ -e $(FILENAME)$${ext} ] && rm $(FILENAME)$${ext} || [ 1 ] ;\\\n done\n\n clean:\n @for ext in \".out\" \".aux\" \".log\" \".tex.tmp\"; do\\\n [ -e $(FILENAME)$${ext} ] && rm $(FILENAME)$${ext} || [ 1 ] ;\\\n done\n\n\nWith the Sed fix::\n\n s/\\\\begin{longtable\\*}.*/\\\\newcolumntype{x}[1]{% \\\n >{\\\\raggedleft\\\\hspace{0pt}}p{#1}}% \\\n \\\\newcolumntype{y}[1]{% \\\n >{\\\\raggedright\\\\hspace{0pt}}p{#1}}% \\\n \\\\begin{longtable*}[c]{y{2cm}y{8.5cm}x{2.2cm}x{2.2cm}x{2.2cm}x{2.2cm}}/\n s/} \\\\\\\\/} \\\\tabularnewline/\n s/&[[:space:]]+\\\\\\\\/\\& \\\\tabularnewline/\n s/[[:space:]]+\\\\\\\\$/\\\\tabularnewline/\n\n\nAnd here a example of the reStructuredText output (again, the table width had been reduced here to fit well):\n\n.. code-block:: rst\n\n =====================================\n Balance des comptes 2011 - MyBusiness\n =====================================\n\n\n -----------------------------------\n P\u00e9riode du 01/03/2011 au 31/12/2011\n -----------------------------------\n\n\n +--------------+---------------------------------------------------+-------------+--------------+-------------+-------------+\n | N\u00b0 | Libell\u00e9 | Total d\u00e9bit | Total cr\u00e9dit | Solde d\u00e9bit | Solde cr\u00e9dit|\n +==============+===================================================+=============+==============+=============+=============+\n | 100 | Capital et compte de l'exploitant | | 1500.00 | | 1500.00 |\n +--------------+---------------------------------------------------+-------------+--------------+-------------+-------------+\n | 4111-CL1 | Clients - ventes de biens ou prestations de ser...| 24518.00 | 24518.00 | | |\n +--------------+---------------------------------------------------+-------------+--------------+-------------+-------------+\n | 4111-CL2 | Clients - ventes de biens ou prestations de ser...| 1794.00 | 1794.00 | | |\n +--------------+---------------------------------------------------+-------------+--------------+-------------+-------------+\n | 4111-CL3 | Clients - ventes de biens ou prestations de ser...| 8372.00 | | 8372.00 | |\n +--------------+---------------------------------------------------+-------------+--------------+-------------+-------------+\n | 4181 | Clients - Factures \u00e0 \u00e9tablir | 13156.00 | | 13156.00 | |\n +--------------+---------------------------------------------------+-------------+--------------+-------------+-------------+\n | 44551 | TVA \u00e0 d\u00e9caisser | 1240.00 | 4278.00 | | 3038.00 |\n +--------------+---------------------------------------------------+-------------+--------------+-------------+-------------+\n | 44566 | T.V.A. d\u00e9ductible sur autres biens et services | 33.66 | 33.66 | | |\n +--------------+---------------------------------------------------+-------------+--------------+-------------+-------------+\n | 44571 | T.V.A. Collect\u00e9e | 4312.00 | 4312.00 | | |\n +--------------+---------------------------------------------------+-------------+--------------+-------------+-------------+\n | 44587 | Taxes sur le CA sur factures \u00e0 \u00e9tablir | 4312.00 | 7840.00 | | 3528.00 |\n +--------------+---------------------------------------------------+-------------+--------------+-------------+-------------+\n | 455 | Associ\u00e9s - Comptes courants | | 189.45 | | 189.45 |\n +--------------+---------------------------------------------------+-------------+--------------+-------------+-------------+\n | 512 | Banques | 27812.00 | 5132.65 | 22679.35 | |\n +--------------+---------------------------------------------------+-------------+--------------+-------------+-------------+\n | 60225 | Achats - Fournitures de bureau | 21.44 | | 21.44 | |\n +--------------+---------------------------------------------------+-------------+--------------+-------------+-------------+\n | 6227 | Achats - Frais d'actes et de contentieux | 160.00 | | 160.00 | |\n +--------------+---------------------------------------------------+-------------+--------------+-------------+-------------+\n | 6278-LCL | Autres frais de commission sur prestations de s...| 72.00 | | 72.00 | |\n +--------------+---------------------------------------------------+-------------+--------------+-------------+-------------+\n | 6411 | Charges - Salaires et appointements | 3000.00 | | 3000.00 | |\n +--------------+---------------------------------------------------+-------------+--------------+-------------+-------------+\n | 6411-RSI | Charges - cotisations RSI | 393.00 | | 393.00 | |\n +--------------+---------------------------------------------------+-------------+--------------+-------------+-------------+\n | 6411-URSF1 | Charges - cotisations URSSAF - Allocations famil..| 161.80 | | 161.80 | |\n +--------------+---------------------------------------------------+-------------+--------------+-------------+-------------+\n | 6411-URSF2 | Charges - cotisations URSSAF - CSG/RDS d\u00e9ducti... | 153.31 | | 153.31 | |\n +--------------+---------------------------------------------------+-------------+--------------+-------------+-------------+\n | 6411-URSF3 | Charges - cotisations URSSAF - CSG/RDS non-d\u00e9du...| 86.89 | | 86.89 | |\n +--------------+---------------------------------------------------+-------------+--------------+-------------+-------------+\n | 706 | Produits - prestations de services | | 40000.00 | | 40000.00 |\n +--------------+---------------------------------------------------+-------------+--------------+-------------+-------------+\n | 758 | Produits divers de gestion courante | | 0.34 | | 0.34 |\n +--------------+---------------------------------------------------+-------------+--------------+-------------+-------------+\n | | **Totaux** | **89598.10**| **89598.10** | **48255.79**| **48255.79**|\n +--------------+---------------------------------------------------+-------------+--------------+-------------+-------------+\n\n\nLe Bilan\n--------\n\nThis document is a *r\u00e9sum\u00e9* or a \u00abpicture\u00bb of your business. It is generated from the *Balance des comptes*:\n\n.. code-block:: bash\n\n $ colbert_bilan.py ../balance-des-comptes/balance_des_comptes-2011.json \\\n --label=\"MyBusiness - Bilan 2011 en \u20ac\" > bilan.json\n $ colbert_bilan_to_rst.py bilan.json > bilan.txt\n\n\nA Makefile to automatically do all the work:\n\n.. code-block:: make\n\n FILENAME=\"bilan-2011\"\n\n all:\tpdf\n\n pdf:\ttex\n @pdflatex $(FILENAME).tex\n @pdflatex $(FILENAME).tex\n @pdflatex $(FILENAME).tex\n\n tex:\trst\n @rst2latex.py --table-style=booktabs --output-encoding=utf-8 $(FILENAME).txt > $(FILENAME).tex.tmp\n @sed -E -f fix_table.sed < $(FILENAME).tex.tmp > $(FILENAME).tex\n\n rst:\tjson\n @echo \"Conversion du bilan au format reStructuredText...\"\n @colbert_bilan_to_rst.py $(FILENAME).json > $(FILENAME).txt\n\n json:\n @echo \"calcul de la bilan...\"\n @colbert_bilan.py ../balance-des-comptes/balance_des_comptes-2011.json \\\n --label=\"MyBusiness - Bilan 2011 en \u20ac\" > $(FILENAME).json\n\n purge:\tclean\n @for ext in \".pdf\" \".tex\" \".txt\"; do\\\n [ -e $(FILENAME)$${ext} ] && rm $(FILENAME)$${ext} || [ 1 ] ;\\\n done\n\n clean:\n @for ext in \".out\" \".aux\" \".log\" \".tex.tmp\"; do\\\n [ -e $(FILENAME)$${ext} ] && rm $(FILENAME)$${ext} || [ 1 ] ;\\\n done\n\nAnd the Sed script::\n\n s/\\\\setlength{\\\\DUtablewidth}{\\\\linewidth}/\\\\setlength{\\\\tabcolsep}{25pt} \\\\setlength{\\\\extrarowheight}{4.5pt}/\n s/\\\\begin{longtable\\*}.*/\\\\begin{longtable*}[c]{lrrr|lr}/\n \n\nThe reStructuredText output:\n\n.. code-block:: rst\n\n =======================\n Bilan 2011 - MyBusiness\n =======================\n\n\n -----------------------------------\n P\u00e9riode du 01/04/2011 au 31/12/2011\n -----------------------------------\n\n\n +------------------------------+------------------+----------------+---------------+-----------------------+---------------+\n | Actif | Brut | Amortissement | Net | Passif | Montant |\n +==============================+==================+================+===============+=======================+===============+\n | **Actif_circulant** | | | | **Capitaux_propres** | |\n +------------------------------+------------------+----------------+---------------+-----------------------+---------------+\n | Client_et_comptes_rattaches | 11960.00 | | 11960.00 | Resultat | 9922.65 |\n +------------------------------+------------------+----------------+---------------+-----------------------+---------------+\n | Autres_creances | 4.21 | | 4.21 | **Dettes** | |\n +------------------------------+------------------+----------------+---------------+-----------------------+---------------+\n | | | | | Autres_dettes | 2041.56 |\n +------------------------------+------------------+----------------+---------------+-----------------------+---------------+\n | *Total* | *11964.21* | *0.00* | **11964.21** | *Total* | **11964.21** |\n +------------------------------+------------------+----------------+---------------+-----------------------+---------------+\n\n\nLe compte de r\u00e9sultat\n---------------------\n\nThe purpose of this last document is to give an idea of your activity during the fiscal year:\n\n.. code-block:: bash\n\n $ colbert_compte_de_resultat.py ../balance-des-comptes/balance_des_comptes-2011.json \\\n --label=\"MyBusiness - Compte de r\u00e9sultat 2011 en \u20ac\" > compte-de-resultat.json\n $ colbert_compte_de_resultat_to_rst.py compte-de-resultat.json > compte-de-resultat.txt\n\n\nIn a Makefile:\n\n.. code-block:: make\n\n FILENAME=\"compte_de_resultat-2011\"\n\n all:\tpdf\n\n pdf:\ttex\n @pdflatex $(FILENAME).tex\n @pdflatex $(FILENAME).tex\n @pdflatex $(FILENAME).tex\n\n tex:\trst\n @rst2latex.py --table-style=booktabs --output-encoding=utf-8 $(FILENAME).txt > $(FILENAME).tex.tmp\n @sed -E -f fix_table.sed < $(FILENAME).tex.tmp > $(FILENAME).tex\n\n rst:\tjson\n @echo \"Conversion du compte de r\u00e9sultat au format reStructuredText...\"\n @colbert_compte_de_resultat_to_rst.py $(FILENAME).json > $(FILENAME).txt\n\n json:\n @echo \"calcul du compte de r\u00e9sultat...\"\n @colbert_compte_de_resultat.py ../balance-des-comptes/balance_des_comptes-2011.json \\\n --label=\"MyBusiness - Compte de r\u00e9sultat 2011 en \u20ac\" > $(FILENAME).json\n\n purge:\tclean\n @for ext in \".pdf\" \".tex\" \".txt\"; do\\\n [ -e $(FILENAME)$${ext} ] && rm $(FILENAME)$${ext} || [ 1 ] ;\\\n done\n\n clean:\n @for ext in \".out\" \".aux\" \".log\" \".tex.tmp\"; do\\\n [ -e $(FILENAME)$${ext} ] && rm $(FILENAME)$${ext} || [ 1 ] ;\\\n done\n\n\nThe Sed script::\n\n s/\\\\begin{longtable\\*}.*/\\\\newcolumntype{x}[1]{% \\\n >{\\\\raggedleft\\\\hspace{0pt}}p{#1}}% \\\n \\\\newcolumntype{y}[1]{% \\\n >{\\\\raggedright\\\\hspace{0pt}}p{#1}}% \\\n \\\\begin{longtable*}[c]{y{8.5cm}x{2.2cm}|y{8.5cm}x{2.2cm}}/\n s/} \\\\\\\\/} \\\\tabularnewline/\n s/&[[:space:]]+\\\\\\\\/\\& \\\\tabularnewline/\n s/[[:space:]]+\\\\\\\\$/\\\\tabularnewline/\n\n\nThe reStructuredText output:\n\n.. code-block:: rst\n\n ====================================\n Compte de r\u00e9sultat 2011 - MyBusiness\n ====================================\n\n\n -----------------------------------\n P\u00e9riode du 01/03/2011 au 31/12/2011\n -----------------------------------\n\n\n +---------------------------------+-----------+--------------------------------------------------+------------------+\n | Charges | Montant | Produits | Montant |\n +=================================+===========+==================================================+==================+\n | *Charges d'exploitation* | | *Produits d'exploitation* | |\n +---------------------------------+-----------+--------------------------------------------------+------------------+\n | R\u00e9mun\u00e9rations du personnel | 3795.00 | Prestations de services | 40000.00 |\n +---------------------------------+-----------+--------------------------------------------------+------------------+\n | Fournitures non stockables | 21.44 | Autres produits de gestion courante | 0.34 |\n +---------------------------------+-----------+--------------------------------------------------+------------------+\n | | | | |\n +---------------------------------+-----------+--------------------------------------------------+------------------+\n | Autres services ext\u00e9rieurs | 232.00 | | |\n +---------------------------------+-----------+--------------------------------------------------+------------------+\n | | | | |\n +---------------------------------+-----------+--------------------------------------------------+------------------+\n | | | | |\n +---------------------------------+-----------+--------------------------------------------------+------------------+\n | | | | |\n +---------------------------------+-----------+--------------------------------------------------+------------------+\n | *Charges financi\u00e8res* | | *Produits financiers* | |\n +---------------------------------+-----------+--------------------------------------------------+------------------+\n | | | | |\n +---------------------------------+-----------+--------------------------------------------------+------------------+\n | | | | |\n +---------------------------------+-----------+--------------------------------------------------+------------------+\n | *Charges exceptionnelles* | | *Produits exceptionnels* | |\n +---------------------------------+-----------+--------------------------------------------------+------------------+\n | | | | |\n +---------------------------------+-----------+--------------------------------------------------+------------------+\n | | | | |\n +---------------------------------+-----------+--------------------------------------------------+------------------+\n | **Sous-total charges** | 4048.44 | **Sous-total produits** | 40000.34 |\n +---------------------------------+-----------+--------------------------------------------------+------------------+\n | **R\u00e9sultat (b\u00e9n\u00e9fice)** | 35951.90 | | |\n +---------------------------------+-----------+--------------------------------------------------+------------------+\n\n\nManaging the transition between 2 fiscal years\n==============================================\n\nWhen you have closed your fiscal year (say 2011) you have to create a new one (2012). In Colbert, you create a new directory,\n*2012*, aside *2011*. You can simply make a *cp 2011 2012*, then run the *make purge* rules in each subdirectories and \nreplace the dates and the filenames at the top of each Makefile.\n\nThis may looks a bit awkward but this occurs only once a year!\n\n\nLes \u00e9critures de cl\u00f4ture\n------------------------\n\nWhen a fiscal year is closed and when your documents and books are up-to-date (*Grand-livre*, *Balance des comptes*,\n*Bilan* and *Compte de r\u00e9sultat*) you have to insert in the Livre-journal the *\u00e9critures de cl\u00f4ture* (accounts closing entries).\nThe purpose of these entries is:\n\n1. to reset the *comptes de r\u00e9sultat* (in France, it is those having a number in *6xx* and *7xx*) ;\n2. transfert the gain or the lost registred at the end of the fiscal year on the *comptes de bilan*.\n\nColbert comes with a script to compute such entries:\n\n.. code-block:: bash\n\n $ colbert_ecritures_de_cloture.py ../balance-des-comptes/balance_des_comptes-2011.json > ecritures-de-cloture.json\n $ colbert_ecritures_to_livre_journal.py --label=\"Ecriture de cloture a reporter au Livre-journal\" \\\n ecritures-de-cloture.json > ecritures-de-cloture.txt\n\n\nAnd copy/paste the body of *ecritures-de-cloture.txt* into the Livre-journal at the right place.\n\n\nChecking your account statements against the Livre-journal\n==========================================================\n\nThere must be reciprocity between your account statements from your bank and the entries in your Livre-journal.\n\nColbert is able to generate account statements for a bank account (say *512*) and to check the balance against \na JSON file representing the balances of each account statement received from the bank establishment. Write such \na file with your text editor:\n\n.. code-block:: json\n\n [\n {\n 'numero_compte': \"512\",\n 'journaux': [\n {\n 'label': \"Avril 2011\",\n 'date_debut': \"01/04/2011\",\n 'date_fin': \"02/05/2011\",\n 'debit_initial': \"0.00\",\n 'credit_initial': \"0.00\",\n 'debit_final': \"1485.93\",\n 'credit_final': \"0.00\",\n },\n {\n 'label': \"Mai 2011\",\n 'date_debut': \"03/05/2011\",\n 'date_fin': \"01/06/2011\",\n 'debit_initial': \"1485.93\",\n 'credit_initial': \"0.00\",\n 'debit_final': \"1461.94\",\n 'credit_final': \"0.00\",\n },\n ]\n }\n ]\n\n\nAnd run *colbert_solde_de_compte.py ../../../livre-journal/livre-journal.txt solde.json* which outputs:\n\n.. code-block:: rst\n\n =====================\n Compte n\u00b0512 en Euros\n =====================\n\n\n Avril 2011\n ''''''''''\n +------------+-------------------------------------------------------+--------+------------+---------------+----------------+\n | Date | Libell\u00e9 | D\u00e9bit | Cr\u00e9dit | Solde d\u00e9biteur| Solde cr\u00e9diteur|\n +============+=======================================================+========+============+===============+================+\n | 01/04/2011 | Report \u00e0 nouveau | | | | |\n +------------+-------------------------------------------------------+--------+------------+---------------+----------------+\n | 01/04/2011 | R\u00e9sultat arr\u00eat\u00e9 compte | | 48.00 | | 48.00 |\n +------------+-------------------------------------------------------+--------+------------+---------------+----------------+\n | 02/04/2011 | Capital initial D\u00e9p\u00f4t de 1500 \u20ac par Stanislas Guerra a| 1500.00| | 1452.00 | |\n +------------+-------------------------------------------------------+--------+------------+---------------+----------------+\n | 28/04/2011 | Cotisation Option PRO LCL | | 15.00 | 1437.00 | |\n +------------+-------------------------------------------------------+--------+------------+---------------+----------------+\n | 02/05/2011 | Abonnement LCL Access | | 3.00 | 1434.00 | |\n +------------+-------------------------------------------------------+--------+------------+---------------+----------------+\n +---------------------------------------------------------------------------------------------------------------------------+\n | Solde final calcul\u00e9 (*1434.00*, d\u00e9biteur) *diff\u00e9rent* du solde final attendu (*1485.93*, d\u00e9biteur) |\n +---------------------------------------------------------------------------------------------------------------------------+\n\n .. raw:: latex\n\n \\newpage\n\n Mai 2011\n ''''''''\n +------------+-------------------------------------------------------+------+------------+----------------+-----------------+\n | Date | Libell\u00e9 | D\u00e9bit| Cr\u00e9dit | Solde d\u00e9biteur | Solde cr\u00e9diteur |\n +============+=======================================================+======+============+================+=================+\n | 03/05/2011 | Report \u00e0 nouveau | | | 1485.93 | |\n +============+=======================================================+======+============+================+=================+\n +---------------------------------------------------------------------------------------------------------------------------+\n | Solde final calcul\u00e9 (*1485.93*, d\u00e9biteur) *diff\u00e9rent* du solde final attendu (*1461.94*, d\u00e9biteur) |\n +---------------------------------------------------------------------------------------------------------------------------+\n\n .. raw:: latex\n\n \\newpage\n\n\nMaking invoices\n===============\n\nColbert can assist you to compute invoices, generate TeX/PDF outputs and the Livre-journal entries from them.\nYou start with a JSON file like the one below and use the script *colbert_calculer_facture.py* to fill it out:\n\n.. code-block:: json\n\n {\n \"client\": {\n \"nom\": \"MyClient#1\",\n \"adresse\": \"1, Infinite Loop\",\n \"code_postal\": \"11222\",\n \"ville\": \"Cupertino\",\n \"numero_compte\": \"4111-CL1\",\n \"nom_compte\": \"Clients - ventes de biens ou prestations de services\",\n \"reference_commande\": \"XXXXX\"\n },\n \"numero_facture\": \"YYYYYYY\",\n \"date_facture\": \"10/05/2011\",\n \"nb_jours_payable_fin_de_mois\": \"60\",\n \"taux_penalites\": \"11\",\n \"date_debut_execution\": \"10/04/2011\",\n \"date_fin_execution\": \"30/04/2011\",\n \"devise\": \"Euro\",\n \"symbole_devise\": \"\u20ac\",\n \"nom_compte\": \"Produits - prestations de services\", \n \"numero_compte\": \"706\", \n \"detail\": [\n {\n \"reference\": \"ref-A\",\n \"description\": \"Prestation A.\",\n \"prix_unitaire_ht\": \"100.00\",\n \"unite\": \"jours\",\n \"taux_tva\": \"19.6\",\n \"quantite\": \"4\"\n },\n {\n \"reference\": \"ref-B\",\n \"description\": \"Prestation B.\",\n \"prix_unitaire_ht\": \"450.99\",\n \"unite\": \"jours\",\n \"taux_tva\": \"19.6\",\n \"quantite\": \"11\"\n }\n ],\n \"deja_paye\": \"0.00\"\n }\n\n.. code-block:: bash\n\n $ colbert_calculer_facture.py my_invoice.json\n\nProduce the following:\n\n.. code-block:: json\n\n {\n \"date_facture\": \"10/05/2011\", \n \"symbole_devise\": \"\\u20ac\", \n \"deja_paye\": \"0.00\", \n \"taux_penalites\": \"11\", \n \"montant_ht\": \"5360.89\", \n \"date_fin_execution\": \"30/04/2011\", \n \"detail\": [\n {\n \"quantite\": \"4\", \n \"description\": \"Prestation A.\", \n \"reference\": \"ref-A\", \n \"montant_ht\": \"400.00\", \n \"prix_unitaire_ht\": \"100.00\", \n \"unite\": \"jours\", \n \"taux_tva\": \"19.6\"\n }, \n {\n \"quantite\": \"11\", \n \"description\": \"Prestation B.\", \n \"reference\": \"ref-B\", \n \"montant_ht\": \"4960.89\", \n \"prix_unitaire_ht\": \"450.99\", \n \"unite\": \"jours\", \n \"taux_tva\": \"19.6\"\n }\n ], \n \"numero_facture\": \"YYYYYYY\", \n \"devise\": \"Euro\", \n \"nom_compte\": \"Produits - prestations de services\", \n \"numero_compte\": \"706\", \n \"client\": {\n \"ville\": \"Cupertino\", \n \"code_postal\": \"11222\", \n \"nom\": \"MyClient#1\", \n \"adresse\": \"1, Infinite Loop\", \n \"reference_commande\": \"XXXXX\", \n \"nom_compte\": \"Clients - ventes de biens ou prestations de services\",\n \"numero_compte\": \"4111-CL1\"\n }, \n \"montant_ttc\": \"6411.62\", \n \"date_debut_execution\": \"10/04/2011\", \n \"reste_a_payer\": \"6411.62\", \n \"nb_jours_payable_fin_de_mois\": \"60\", \n \"date_debut_penalites\": \"01/08/2011\", \n \"tva\": {\n \"19.6\": \"1050.73\"\n }, \n \"date_reglement\": \"31/07/2011\"\n }\n\n\nYou should redirect the output to a new file, say *my_invoice_ok.json* and use it to generate a LaTeX output:\n\n.. code-block:: bash\n\n $ colbert_facture_to_tex.py my_invoice_ok.json my_invoice_template.tex > my_invoice.tex\n $ xelatex my_invoice.tex\n\nThe parameter *my_invoice_template.tex* is a TeX file having placeholder for Python string formatting with keyword arguments.\nThere is an example of such template in the *tests/regressiontests/* folder.\n\n\nLivre-journal entry\n-------------------\n\nHaving an invoice filled-in you can now generate the entry for the Livre-journal:\n\n.. code-block:: bash\n\n $ colbert_ecriture_facture.py my_invoice_ok.json > my_invoice_entry.json\n $ colbert_ecritures_to_livre_journal.py --label=\"Entry to report\" my_invoice_entry.json > my_invoice_entry.txt\n\n\nWorkflow\n--------\n\nMy method is to use a directory for each invoice with the following Makefile in it:\n\n.. code-block:: make\n\n filename = facture-2012-003\n filename_calcule = $(filename)_calculee\n filename_ecriture = $(filename)_ecriture\n\n pdf:\ttex\n @xelatex --papersize=a4 $(filename).tex\n @xelatex --papersize=a4 $(filename).tex\n @xelatex --papersize=a4 $(filename).tex\n\n tex:\tjson\n @export LC_ALL=\"fr_FR.UTF-8\" ; export LC_LANG=\"fr_FR.UTF-8\" ; \\\n colbert_facture_to_tex.py $(filename_calcule).json ../../modele_facture.tex > $(filename).tex\n\n json:\n @colbert_calculer_facture.py $(filename).json > $(filename_calcule).json\n @colbert_ecriture_facture.py $(filename_calcule).json > $(filename_ecriture).json\n @colbert_ecritures_to_livre_journal.py --label=\"Ecriture a reporter au Livre-journal\" \\\n $(filename_ecriture).json > $(filename_ecriture).txt\n\n clean:\n @for ext in \".out\" \".aux\" \".log\" \".tns\"; do\\\n [ -e $(filename)$${ext} ] && rm $(filename)$${ext} || [ 1 ] ;\\\n done\n\n\nActivity report from iCal\n-------------------------\n\nThere is a template of LaTeX class in the *tex* directory. Again, I use a Makefile (the same to generate\nthe invoice associated with):\n\n.. code-block:: make\n\n month = Juin\n month_index = 007\n year = 2012\n date_debut = 01/06/2012 \n date_fin = 30/06/2012 \n\n ref_facture = $(year)-$(month_index)\n\n filename = facture-$(ref_facture)\n filename_calcule = $(filename)_calculee\n filename_ecriture = $(filename)_ecriture\n\n rac_template = \"rapport_activite-template.tex\"\n rac_filename = rac-$(ref_facture)\n rac_label = \"Rapport d'activit\u00e9 - $(month) $(year)\"\n calendar = MyCalendar.ics\n\n all:\trac_pdf\tfacture_pdf\n\n facture_pdf:\tfacture_tex\n @xelatex --papersize=a4 $(filename).tex\n @xelatex --papersize=a4 $(filename).tex\n @xelatex --papersize=a4 $(filename).tex\n\n facture_tex:\tfacture_json\n @export LC_ALL=\"fr_FR.UTF-8\" ; export LC_LANG=\"fr_FR.UTF-8\" ; \\\n colbert_facture_to_tex.py $(filename_calcule).json ../../modele_facture.tex > $(filename).tex\n\n facture_json:\n @colbert_calculer_facture.py $(filename).json > $(filename_calcule).json\n @colbert_ecriture_facture.py $(filename_calcule).json > $(filename_ecriture).json\n @colbert_ecritures_to_livre_journal.py --label=\"Ecriture a reporter au Livre-journal\" \\\n $(filename_ecriture).json > $(filename_ecriture).txt\n\n rac_pdf:\trac_tex\n @xelatex --papersize=a4 $(rac_filename).tex\n @xelatex --papersize=a4 $(rac_filename).tex\n @xelatex --papersize=a4 $(rac_filename).tex\n\n rac_tex:\trac_json\n @colbert_rapport_activite_to_tex.py $(rac_filename).json $(rac_template) > $(rac_filename).tex\n\n rac_json:\n @colbert_rapport_activite.py $(calendar) -d $(date_debut) -f $(date_fin) \\\n -l $(rac_label) -r \"$(ref_facture)\" > $(rac_filename).json\n\n purge:\tclean\n @for ext in \".tex\" \".pdf\" ; do\\\n [ -e $(filename)$${ext} ] && rm $(filename)$${ext} || [ 1 ] ;\\\n [ -e $(rac_filename)$${ext} ] && rm $(rac_filename)$${ext} || [ 1 ] ;\\\n done\n\n clean:\n @for ext in \".out\" \".aux\" \".log\" \".tns\"; do\\\n [ -e $(filename)$${ext} ] && rm $(filename)$${ext} || [ 1 ] ;\\\n [ -e $(rac_filename)$${ext} ] && rm $(rac_filename)$${ext} || [ 1 ] ;\\\n done\n\n\nYou should take a look in the *tests/regressiontests* directory to grab the LaTeX template.\n\nWorking with LaTeX\n==================\n\nI convert my reStructuredText files using docutils' *rst2latex.py* with the *--table-style=booktabs* option except for the\nLivre-journal.\n\nAside each Makefile in each directory (like *TVA* or *grand-livre*) there is a docutils configuration file *docutils.conf* and \na LaTeX stylesheet *docutils.tex*.\n\nBecause I want to right-align some columns and because docutils does not handle that, I process the LaTeX outputs with a \nbit of *Sed* before the PDF conversion.\n\n\nThe docutils.conf file\n----------------------\n\nAlways the same::\n\n [latex2e writer]\n documentclass: article\n documentoptions: 11pt,a4paper,landscape\n output-encoding: utf-8\n stylesheet: docutils.tex\n\nThe docutils.tex stylesheet\n---------------------------\n\nAlmost always::\n\n \\usepackage{fullpage}\n \\usepackage[french]{babel}\n \\usepackage{array}\n\nIf the LaTeX compiler complains about utf-8 you may add the *ucs* package.\n\nYou may want to precisely control the header and the footer with *fancyhdr* package::\n\n \\usepackage{fancyhdr}\n \\fancyhf{}\n \\pagestyle{fancy}\n \\lhead{\\large{MyBusiness S.A.R.L.}\\\\\n \\normalsize my address\\\\\n zipcode City}\n \\cfoot{Soci\u00e9t\u00e9 \u00e0 responsabilit\u00e9 limit\u00e9 au capital de XXXX Euros - YYY YYY YYY R.C.S. Paris}\n \\renewcommand{\\headrulewidth}{0pt}\n \\renewcommand{\\footrulewidth}{0.4pt}\n\n\n\nThe Sed script\n--------------\n\nThe idea is to change the table(s) declaration(s) to get columns with managed width and alignment.\n\n\nIn the Makefile it looks like that:\n\n.. code-block:: make\n\n tex:\trst\n \t@rst2latex.py --table-style=booktabs $(FILENAME).txt > $(FILENAME).tex.tmp\n \t@sed -E -f fix_table.sed < $(FILENAME).tex.tmp > $(FILENAME).tex\n\n\nThe Sed script depends of the TeX file. Here an example::\n\n\n s/\\\\begin{longtable\\*}.*/\\\\newcolumntype{x}[1]{% \\\n >{\\\\raggedleft\\\\hspace{0pt}}p{#1}}% \\\n \\\\newcolumntype{y}[1]{% \\\n >{\\\\raggedright\\\\hspace{0pt}}p{#1}}% \\\n \\\\begin{longtable*}[c]{y{2cm}y{7.5cm}x{2cm}|y{2cm}y{7.5cm}x{2cm}}/\n s/\\\\\\\\/\\\\tabularnewline/\n\nAnd to force the *pagestyle* for the first one I sometimes add::\n\n s/\\\\maketitle/\\\\maketitle\\\n \\\\thispagestyle{fancy}/\n\n\nTests\n=====\n\nThere are some regression tests in the *test* directory.\n\n\nRequirements\n============\n\n- Python 2.7+\n- pytz\n- Python Icalendar (https://github.com/collective/icalendar)\n- Docutils (SVN)\n- a *LaTex* suite if you want to render the reStructuredText in PDF\n- Make\n- Sed", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "UNKNOWN", "keywords": null, "license": "BSD Licence", "maintainer": null, "maintainer_email": null, "name": "Colbert", "package_url": "https://pypi.org/project/Colbert/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/Colbert/", "project_urls": { "Download": "UNKNOWN", "Homepage": "UNKNOWN" }, "release_url": "https://pypi.org/project/Colbert/0.24/", "requires_dist": null, "requires_python": null, "summary": "Accountancy utilities for your small (french) business", "version": "0.24" }, "last_serial": 2043695, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "ee39b261b13b0c12aa5c15801992dd9a", "sha256": "4678bd7d5e2da37da1dc3a62538004294b91f7d94e82365defb52cea242eedfb" }, "downloads": -1, "filename": "Colbert-0.1.tar.gz", "has_sig": false, "md5_digest": "ee39b261b13b0c12aa5c15801992dd9a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 72405, "upload_time": "2013-11-15T15:12:34", "url": "https://files.pythonhosted.org/packages/25/12/d1922adb782495b40f19452aea7201aa0c321ade36b4081047546613fe79/Colbert-0.1.tar.gz" } ], "0.11": [ { "comment_text": "", "digests": { "md5": "fc6757afac33714b71bb24462b29f6f2", "sha256": "1a9bffac0e4c870cbf3c093cc00285ca8c1c455b7e8403f779d1c7cfe4b9151b" }, "downloads": -1, "filename": "Colbert-0.11.tar.gz", "has_sig": false, "md5_digest": "fc6757afac33714b71bb24462b29f6f2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 72445, "upload_time": "2014-01-14T18:20:41", "url": "https://files.pythonhosted.org/packages/56/f8/ac44da815c2451e1542173949ffc13711156873a0519097cd421ea9728a7/Colbert-0.11.tar.gz" } ], "0.12": [ { "comment_text": "", "digests": { "md5": "d65d985d5d9f0a920cd5a23f81f6d105", "sha256": "e2c01166c8b596b1cb15faa21baee40e127104ad7a960a36fa86955080da4dae" }, "downloads": -1, "filename": "Colbert-0.12.tar.gz", "has_sig": false, "md5_digest": "d65d985d5d9f0a920cd5a23f81f6d105", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 63660, "upload_time": "2014-11-07T11:21:25", "url": "https://files.pythonhosted.org/packages/52/ea/8fb2cfdb21cee8d143b658c795ba4997c2e3634d8583223db4e00a615bb3/Colbert-0.12.tar.gz" } ], "0.13": [ { "comment_text": "", "digests": { "md5": "6dcc305a1b69eacaad759ceca1b880ab", "sha256": "5e411b5ef52aa49d7b5cb0b217e87859b13ffdbe2bf84b34e7a6d60de97e7eab" }, "downloads": -1, "filename": "Colbert-0.13.tar.gz", "has_sig": false, "md5_digest": "6dcc305a1b69eacaad759ceca1b880ab", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 73505, "upload_time": "2014-11-07T11:40:59", "url": "https://files.pythonhosted.org/packages/f0/8d/b66a4667c9881a10afd053512bfcf62d43e7315a570c5351ad48c91bafe8/Colbert-0.13.tar.gz" } ], "0.14": [ { "comment_text": "", "digests": { "md5": "884346b20d7257a07ecb0de631fb61bc", "sha256": "f7891c6dcbda62a653dfc8643fbe1728bd2f2ca96a9046567d30fcd6fc63c5b8" }, "downloads": -1, "filename": "Colbert-0.14.tar.gz", "has_sig": false, "md5_digest": "884346b20d7257a07ecb0de631fb61bc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 73499, "upload_time": "2014-11-07T11:48:59", "url": "https://files.pythonhosted.org/packages/6f/99/982288a54bfe1b642f59c802eea496236099c2a958ddb0f00b1a405c366a/Colbert-0.14.tar.gz" } ], "0.15": [ { "comment_text": "", "digests": { "md5": "9726fb23be6bfb78d08a0ac756f46c09", "sha256": "055bb2507709332ea9d1c71fe78bdbb59230f8193310a84390c5b98e5d4a6bed" }, "downloads": -1, "filename": "Colbert-0.15.tar.gz", "has_sig": false, "md5_digest": "9726fb23be6bfb78d08a0ac756f46c09", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 73493, "upload_time": "2014-11-07T11:54:34", "url": "https://files.pythonhosted.org/packages/7d/53/149d77f946cf5062aff9af0f5b77a9352a5eaf97d35da2df7b01da99e276/Colbert-0.15.tar.gz" } ], "0.16": [ { "comment_text": "", "digests": { "md5": "84f9232b6a1c88e40c4079c87e0fc3d8", "sha256": "c7d04e163c64edac3db6d209d43a97b9085ac38089f934a81cd09456735645ca" }, "downloads": -1, "filename": "Colbert-0.16.tar.gz", "has_sig": false, "md5_digest": "84f9232b6a1c88e40c4079c87e0fc3d8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 73953, "upload_time": "2014-11-19T08:53:23", "url": "https://files.pythonhosted.org/packages/fb/e4/c5482dc4ee99b08b7333102f23bbe5c4094d30d7932532933619763fcbd3/Colbert-0.16.tar.gz" } ], "0.17": [ { "comment_text": "", "digests": { "md5": "3234951fe3a02e3a8aa8283ef111b058", "sha256": "6fa9fe3e25f9ae488061d166c309e698b5318b8de5098c271bc9b6ce1a3c6e51" }, "downloads": -1, "filename": "Colbert-0.17.tar.gz", "has_sig": false, "md5_digest": "3234951fe3a02e3a8aa8283ef111b058", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 73591, "upload_time": "2014-12-18T16:18:59", "url": "https://files.pythonhosted.org/packages/b7/e3/0eae57ef3326158eac89fc537188bb1a7a2f554ef6904b8c30e114b9644c/Colbert-0.17.tar.gz" } ], "0.18": [ { "comment_text": "", "digests": { "md5": "e483df9d94a2eaff0af5f3cfc93cef4c", "sha256": "a26d166e3a585b3d85692103fa6fb2b5f32cd491d0e2ad0a8fa7626d3de52bdc" }, "downloads": -1, "filename": "Colbert-0.18.tar.gz", "has_sig": false, "md5_digest": "e483df9d94a2eaff0af5f3cfc93cef4c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 74264, "upload_time": "2015-01-22T09:19:15", "url": "https://files.pythonhosted.org/packages/07/d0/8b464e73b487bd19736f29147cc902b928216c741cb5877da8710ebbc991/Colbert-0.18.tar.gz" } ], "0.19": [ { "comment_text": "", "digests": { "md5": "6472874d1320c80bcb4a7ed768ff3577", "sha256": "e9ebc4fa8c8d020d6bf7d2a0bfb43dae30f0d2e56d89c1a96892b3d5e6a4f603" }, "downloads": -1, "filename": "Colbert-0.19.tar.gz", "has_sig": false, "md5_digest": "6472874d1320c80bcb4a7ed768ff3577", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 74733, "upload_time": "2015-01-23T15:44:27", "url": "https://files.pythonhosted.org/packages/c0/0f/fcde93efe0ae1b4b721d6284e550fcccf3dcde09a15ae5e980f5b30d873c/Colbert-0.19.tar.gz" } ], "0.20": [ { "comment_text": "", "digests": { "md5": "75d47a327b489bb11a5b5451f9094622", "sha256": "26fcb6276b5cf32e09e06e41674860146ccb3bf536cd82c1522f5342d278ae61" }, "downloads": -1, "filename": "Colbert-0.20.tar.gz", "has_sig": false, "md5_digest": "75d47a327b489bb11a5b5451f9094622", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 74735, "upload_time": "2015-03-04T08:49:33", "url": "https://files.pythonhosted.org/packages/53/16/6bcf3178a14d4eb8a5311b7da2f4a6afed62d122d3bd857d815ee306d6a7/Colbert-0.20.tar.gz" } ], "0.21": [ { "comment_text": "", "digests": { "md5": "c9238285916260a19ba9feefc55bc525", "sha256": "1e1de4eda6b2710789b0c6d005e1b05773eb781578b506c7eeb4ca853d9c3678" }, "downloads": -1, "filename": "Colbert-0.21.tar.gz", "has_sig": false, "md5_digest": "c9238285916260a19ba9feefc55bc525", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 74736, "upload_time": "2015-03-04T08:55:01", "url": "https://files.pythonhosted.org/packages/ae/22/e329dac3f7b4344b988faa0bc9c058b40b4c4b8db47f81d1fe57b760e95c/Colbert-0.21.tar.gz" } ], "0.22": [ { "comment_text": "", "digests": { "md5": "d6ba95410f5a521511d9edbfe6aef098", "sha256": "e17914bbbe1be0e9fbd9f79037570527c1d7bb92b22e680ebed73ddd2c14d9af" }, "downloads": -1, "filename": "Colbert-0.22.tar.gz", "has_sig": false, "md5_digest": "d6ba95410f5a521511d9edbfe6aef098", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 74755, "upload_time": "2015-03-05T11:10:44", "url": "https://files.pythonhosted.org/packages/01/47/3175f16de3e5f1f21a7c8283de647df4480c15800bdfe238715da1788249/Colbert-0.22.tar.gz" } ], "0.23": [ { "comment_text": "", "digests": { "md5": "3e12750c9cedb2958ea6983489eca71b", "sha256": "61cf94325e85d76ae7e1b7224cdca6d76845b588752a91efd79cfb396a16b259" }, "downloads": -1, "filename": "Colbert-0.23.tar.gz", "has_sig": false, "md5_digest": "3e12750c9cedb2958ea6983489eca71b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 74832, "upload_time": "2015-05-21T11:53:00", "url": "https://files.pythonhosted.org/packages/2e/36/7193868128149f0fee60db694941e9174241da44638b5ba145f3314ce3f2/Colbert-0.23.tar.gz" } ], "0.24": [ { "comment_text": "", "digests": { "md5": "6fdd5f002444c915b762912fbd166126", "sha256": "2bd9c1a84fe8a63f14dc7d9d26bd6f2f4ad0bd0c36a3b7b2afd9bde2c3495567" }, "downloads": -1, "filename": "Colbert-0.24.tar.gz", "has_sig": false, "md5_digest": "6fdd5f002444c915b762912fbd166126", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 74891, "upload_time": "2016-04-03T20:03:00", "url": "https://files.pythonhosted.org/packages/94/b1/eda542f7cfa6edd58615d831ec503add617ce68e8b967e9eceb7c7a2141b/Colbert-0.24.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "6fdd5f002444c915b762912fbd166126", "sha256": "2bd9c1a84fe8a63f14dc7d9d26bd6f2f4ad0bd0c36a3b7b2afd9bde2c3495567" }, "downloads": -1, "filename": "Colbert-0.24.tar.gz", "has_sig": false, "md5_digest": "6fdd5f002444c915b762912fbd166126", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 74891, "upload_time": "2016-04-03T20:03:00", "url": "https://files.pythonhosted.org/packages/94/b1/eda542f7cfa6edd58615d831ec503add617ce68e8b967e9eceb7c7a2141b/Colbert-0.24.tar.gz" } ] }