<reponame>Starou/Colbert<gh_stars>1-10
# -*- coding: utf-8 -*-

import os
import unittest
import codecs
import io
import datetime
import json
from colbert.utils import decode_as_ecriture as as_ecriture

from decimal import Decimal

CURRENT_DIR = os.path.dirname(__file__)


class GrandLivreTestCase(unittest.TestCase):
    def test_grand_livre(self):
        from colbert.grand_livre import grand_livre
        livre_journal = codecs.open(os.path.join(CURRENT_DIR, "livre-journal.txt"),
                                    mode="r", encoding="utf-8")
        gl = grand_livre(livre_journal, "Grand-Livre 2011",
                         date_debut=datetime.date(2011, 3, 1),
                         date_fin=datetime.date(2011, 12, 31),
                         grand_livre_precedent=None)

        # Uncomment to generate the JSON test file.
        # from colbert.utils import json_encoder
        # output = codecs.open(os.path.join(CURRENT_DIR, "grand_livre-2011.json"),
        #                               mode="w+", encoding="utf-8")
        # output.write(json.dumps(gl, default=json_encoder, indent=4))
        # output.close
        # pprint(gl)
        self.maxDiff = None
        self.assertEqual(gl, {
            'comptes': {
                '100': {'ecritures': [{'credit': Decimal('1500.00'),
                                        'date': datetime.date(2011, 4, 2),
                                        'intitule': 'Capital initial Dépôt de 1500 € par <NAME>erra au LCL <NAME>'}],
                         'nom': "Capital et compte de l'exploitant",
                         'solde_crediteur': Decimal('1500.00'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('1500.00'),
                         'total_debit': Decimal('0.00')},
                '4111-CL1': {'ecritures': [{'date': datetime.date(2011, 3, 31),
                                             'debit': Decimal('5980.00'),
                                             'intitule': 'Facture 2011-01 MyClient1 Prestation MyClient1 mars 2011'},
                                            {'credit': Decimal('5980.00'),
                                             'date': datetime.date(2011, 9, 2),
                                             'intitule': 'Virement MyClient1 ZZZZZZZZZZZ Facture 2011-01'},
                                            {'date': datetime.date(2011, 9, 28),
                                             'debit': Decimal('13156.00'),
                                             'intitule': 'Facture 2011-04 MyClient1 Prestation aout 2011'},
                                            {'date': datetime.date(2011, 11, 1),
                                             'debit': Decimal('5382.00'),
                                             'intitule': 'Facture 2011-05 MyClient1 Prestation septembre 2011'},
                                            {'credit': Decimal('18538.00'),
                                             'date': datetime.date(2011, 12, 1),
                                             'intitule': 'Virement MyClient1 WWWWWWWWWW Facture 2011-04, 2011-05'}],
                              'nom': 'Clients - ventes de biens ou prestations de services',
                              'solde_crediteur': Decimal('0.00'),
                              'solde_debiteur': Decimal('0.00'),
                              'total_credit': Decimal('24518.00'),
                              'total_debit': Decimal('24518.00')},
                '4111-CL2': {'ecritures': [{'date': datetime.date(2011, 4, 4),
                                             'debit': Decimal('1794.00'),
                                             'intitule': 'Facture 2011-02 MyClient2 Prestation MyClient2'},
                                            {'credit': Decimal('1794.00'),
                                             'date': datetime.date(2011, 6, 15),
                                             'intitule': 'Remise chèque XXXXXXX règlement facture 2011-02'}],
                              'nom': 'Clients - ventes de biens ou prestations de services',
                              'solde_crediteur': Decimal('0.00'),
                              'solde_debiteur': Decimal('0.00'),
                              'total_credit': Decimal('1794.00'),
                              'total_debit': Decimal('1794.00')},
                '4111-CL3': {'ecritures': [{'date': datetime.date(2011, 12, 1),
                                             'debit': Decimal('8372.00'),
                                             'intitule': 'Facture 2011-06 MyClient3'}],
                              'nom': 'Clients - ventes de biens ou prestations de services',
                              'solde_crediteur': Decimal('0.00'),
                              'solde_debiteur': Decimal('8372.00'),
                              'total_credit': Decimal('0.00'),
                              'total_debit': Decimal('8372.00')},
                '4181': {'ecritures': [{'date': datetime.date(2011, 12, 31),
                                         'debit': Decimal('13156.00'),
                                         'intitule': 'Prestation MyClient1 décembre 2011'}],
                          'nom': 'Clients - Factures à établir',
                          'solde_crediteur': Decimal('0.00'),
                          'solde_debiteur': Decimal('13156.00'),
                          'total_credit': Decimal('0.00'),
                          'total_debit': Decimal('13156.00')},
                '44551': {'ecritures': [{'credit': Decimal('1240.00'),
                                          'date': datetime.date(2011, 9, 30),
                                          'intitule': 'Solde des comptes de TVA du 01/03/2011 au 30/09/2011'},
                                         {'date': datetime.date(2011, 10, 6),
                                          'debit': Decimal('1240.00'),
                                          'intitule': 'Chèque WWWWWWW Règlement de la TVA trimestrielle'},
                                         {'credit': Decimal('3038.00'),
                                          'date': datetime.date(2011, 12, 31),
                                          'intitule': 'Solde des comptes de TVA du 01/10/2011 au 31/12/2011'}],
                           'nom': 'TVA à décaisser',
                           'solde_crediteur': Decimal('3038.00'),
                           'solde_debiteur': Decimal('0.00'),
                           'total_credit': Decimal('4278.00'),
                           'total_debit': Decimal('1240.00')},
                '44566': {'ecritures': [{'date': datetime.date(2011, 3, 18),
                                          'debit': Decimal('10.45'),
                                          'intitule': 'Frais de constitution de la société CFE Paris.'},
                                         {'date': datetime.date(2011, 3, 18),
                                          'debit': Decimal('19.00'),
                                          'intitule': 'Frais de constitution de la société - Annonce légale.'},
                                         {'date': datetime.date(2011, 6, 11),
                                          'debit': Decimal('4.21'),
                                          'intitule': 'BHV - Fournitures des bureau (Livres comptables).'},
                                         {'credit': Decimal('33.66'),
                                          'date': datetime.date(2011, 9, 30),
                                          'intitule': 'Solde des comptes de TVA du 01/03/2011 au 30/09/2011'}],
                           'nom': 'T.V.A. déductible sur autres biens et services',
                           'solde_crediteur': Decimal('0.00'),
                           'solde_debiteur': Decimal('0.00'),
                           'total_credit': Decimal('33.66'),
                           'total_debit': Decimal('33.66')},
                '44571': {'ecritures': [{'credit': Decimal('294.00'),
                                          'date': datetime.date(2011, 6, 15),
                                          'intitule': 'Remise chèque XXXXXXX règlement facture 2011-02'},
                                         {'credit': Decimal('980.00'),
                                          'date': datetime.date(2011, 9, 2),
                                          'intitule': 'Virement MyClient1 ZZZZZZZZZZZ Facture 2011-01'},
                                         {'date': datetime.date(2011, 9, 30),
                                          'debit': Decimal('1274.00'),
                                          'intitule': 'Solde des comptes de TVA du 01/03/2011 au 30/09/2011'},
                                         {'credit': Decimal('2156.00'),
                                          'date': datetime.date(2011, 12, 1),
                                          'intitule': 'Virement MyClient1 WWWWWWWWWW Facture 2011-04, 2011-05'},
                                         {'credit': Decimal('882.00'),
                                          'date': datetime.date(2011, 12, 1),
                                          'intitule': 'Virement MyClient1 WWWWWWWWWW Facture 2011-04, 2011-05'},
                                         {'date': datetime.date(2011, 12, 31),
                                          'debit': Decimal('3038.00'),
                                          'intitule': 'Solde des comptes de TVA du 01/10/2011 au 31/12/2011'}],
                           'nom': '<NAME>',
                           'solde_crediteur': Decimal('0.00'),
                           'solde_debiteur': Decimal('0.00'),
                           'total_credit': Decimal('4312.00'),
                           'total_debit': Decimal('4312.00')},
                '44587': {'ecritures': [{'credit': Decimal('980.00'),
                                          'date': datetime.date(2011, 3, 31),
                                          'intitule': 'Facture 2011-01 MyClient1 Prestation MyClient1 mars 2011'},
                                         {'credit': Decimal('294.00'),
                                          'date': datetime.date(2011, 4, 4),
                                          'intitule': 'Facture 2011-02 MyClient2 Prestation MyClient2'},
                                         {'date': datetime.date(2011, 6, 15),
                                          'debit': Decimal('294.00'),
                                          'intitule': 'Remise chèque XXXXXXX règlement facture 2011-02'},
                                         {'date': datetime.date(2011, 9, 2),
                                          'debit': Decimal('980.00'),
                                          'intitule': 'Virement MyClient1 ZZZZZZZZZZZ Facture 2011-01'},
                                         {'credit': Decimal('2156.00'),
                                          'date': datetime.date(2011, 9, 28),
                                          'intitule': 'Facture 2011-04 MyClient1 Prestation aout 2011'},
                                         {'credit': Decimal('882.00'),
                                          'date': datetime.date(2011, 11, 1),
                                          'intitule': 'Facture 2011-05 MyClient1 Prestation septembre 2011'},
                                         {'date': datetime.date(2011, 12, 1),
                                          'debit': Decimal('2156.00'),
                                          'intitule': 'Virement MyClient1 WWWWWWWWWW Facture 2011-04, 2011-05'},
                                         {'date': datetime.date(2011, 12, 1),
                                          'debit': Decimal('882.00'),
                                          'intitule': 'Virement MyClient1 WWWWWWWWWW Facture 2011-04, 2011-05'},
                                         {'credit': Decimal('1372.00'),
                                          'date': datetime.date(2011, 12, 1),
                                          'intitule': 'Facture 2011-06 MyClient3'},
                                         {'credit': Decimal('2156.00'),
                                          'date': datetime.date(2011, 12, 31),
                                          'intitule': 'Prestation MyClient1 décembre 2011'}],
                           'nom': 'Taxes sur le CA sur factures à établir',
                           'solde_crediteur': Decimal('3528.00'),
                           'solde_debiteur': Decimal('0.00'),
                           'total_credit': Decimal('7840.00'),
                           'total_debit': Decimal('4312.00')},
                '455': {'ecritures': [{'credit': Decimal('90.45'),
                                        'date': datetime.date(2011, 3, 18),
                                        'intitule': 'Frais de constitution de la société CFE Paris.'},
                                       {'credit': Decimal('99.00'),
                                        'date': datetime.date(2011, 3, 18),
                                        'intitule': 'Frais de constitution de la société - Annonce légale.'}],
                         'nom': 'Associés - Comptes courants',
                         'solde_crediteur': Decimal('189.45'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('189.45'),
                         'total_debit': Decimal('0.00')},
                '512': {'ecritures': [{'credit': Decimal('48.00'),
                                        'date': datetime.date(2011, 4, 1),
                                        'intitule': 'Résultat arr\xeaté compte'},
                                       {'date': datetime.date(2011, 4, 2),
                                        'debit': Decimal('1500.00'),
                                        'intitule': 'Capital initial Dépôt de 1500 € par <NAME> au LCL <NAME>'},
                                       {'credit': Decimal('15.00'),
                                        'date': datetime.date(2011, 4, 28),
                                        'intitule': 'Cotisation Option PRO  LCL'},
                                       {'credit': Decimal('3.00'),
                                        'date': datetime.date(2011, 5, 2),
                                        'intitule': 'Abonnement LCL Access'},
                                       {'credit': Decimal('25.65'),
                                        'date': datetime.date(2011, 6, 11),
                                        'intitule': 'BHV - Fournitures des bureau (Livres comptables).'},
                                       {'date': datetime.date(2011, 6, 15),
                                        'debit': Decimal('1794.00'),
                                        'intitule': 'Remise chèque XXXXXXX règlement facture 2011-02'},
                                       {'credit': Decimal('3000.00'),
                                        'date': datetime.date(2011, 7, 5),
                                        'intitule': 'Traitement mois de juin gérant.'},
                                       {'credit': Decimal('393.00'),
                                        'date': datetime.date(2011, 8, 8),
                                        'intitule': 'Chèque XXXXXXY Cotisation trimestrielle RSI/Prévadiès.'},
                                       {'date': datetime.date(2011, 9, 2),
                                        'debit': Decimal('5980.00'),
                                        'intitule': 'Virement MyClient1 ZZZZZZZZZZZ Facture 2011-01'},
                                       {'credit': Decimal('3.00'),
                                        'date': datetime.date(2011, 9, 3),
                                        'intitule': 'Abonnement LCL Access'},
                                       {'credit': Decimal('1240.00'),
                                        'date': datetime.date(2011, 10, 6),
                                        'intitule': 'Chèque WWWWWWW Règlement de la TVA trimestrielle'},
                                       {'credit': Decimal('402.00'),
                                        'date': datetime.date(2011, 11, 17),
                                        'intitule': 'Chèque ZZZZZZZ Cotisation sociales Urssaf 4ème trimestre.'},
                                       {'credit': Decimal('3.00'),
                                        'date': datetime.date(2011, 12, 1),
                                        'intitule': 'Abonnement LCL Access'},
                                       {'date': datetime.date(2011, 12, 1),
                                        'debit': Decimal('18538.00'),
                                        'intitule': 'Virement MyClient1 WWWWWWWWWW Facture 2011-04, 2011-05'}],
                         'nom': 'Banques',
                         'solde_crediteur': Decimal('0.00'),
                         'solde_debiteur': Decimal('22679.35'),
                         'total_credit': Decimal('5132.65'),
                         'total_debit': Decimal('27812.00')},
                '60225': {'ecritures': [{'date': datetime.date(2011, 6, 11),
                                          'debit': Decimal('21.44'),
                                          'intitule': 'BHV - Fournitures des bureau (Livres comptables).'}],
                           'nom': 'Achats - Fournitures de bureau',
                           'solde_crediteur': Decimal('0.00'),
                           'solde_debiteur': Decimal('21.44'),
                           'total_credit': Decimal('0.00'),
                           'total_debit': Decimal('21.44')},
                '6227': {'ecritures': [{'date': datetime.date(2011, 3, 18),
                                         'debit': Decimal('80.00'),
                                         'intitule': 'Frais de constitution de la société CFE Paris.'},
                                        {'date': datetime.date(2011, 3, 18),
                                         'debit': Decimal('80.00'),
                                         'intitule': 'Frais de constitution de la société - Annonce légale.'}],
                          'nom': "Achats - Frais d'actes et de contentieux",
                          'solde_crediteur': Decimal('0.00'),
                          'solde_debiteur': Decimal('160.00'),
                          'total_credit': Decimal('0.00'),
                          'total_debit': Decimal('160.00')},
                '6278-LCL': {'ecritures': [{'date': datetime.date(2011, 4, 1),
                                             'debit': Decimal('48.00'),
                                             'intitule': 'Résultat arr\xeaté compte'},
                                            {'date': datetime.date(2011, 4, 28),
                                             'debit': Decimal('15.00'),
                                             'intitule': 'Cotisation Option PRO  LCL'},
                                            {'date': datetime.date(2011, 5, 2),
                                             'debit': Decimal('3.00'),
                                             'intitule': 'Abonnement LCL Access'},
                                            {'date': datetime.date(2011, 9, 3),
                                             'debit': Decimal('3.00'),
                                             'intitule': 'Abonnement LCL Access'},
                                            {'date': datetime.date(2011, 12, 1),
                                             'debit': Decimal('3.00'),
                                             'intitule': 'Abonnement LCL Access'}],
                              'nom': 'Autres frais de commission sur prestations de services',
                              'solde_crediteur': Decimal('0.00'),
                              'solde_debiteur': Decimal('72.00'),
                              'total_credit': Decimal('0.00'),
                              'total_debit': Decimal('72.00')},
                '6411': {'ecritures': [{'date': datetime.date(2011, 7, 5),
                                         'debit': Decimal('3000.00'),
                                         'intitule': 'Traitement mois de juin gérant.'}],
                          'nom': 'Charges - Salaires et appointements',
                          'solde_crediteur': Decimal('0.00'),
                          'solde_debiteur': Decimal('3000.00'),
                          'total_credit': Decimal('0.00'),
                          'total_debit': Decimal('3000.00')},
                '6411-RSI': {'ecritures': [{'date': datetime.date(2011, 8, 8),
                                             'debit': Decimal('393.00'),
                                             'intitule': 'Chèque XXXXXXY Cotisation trimestrielle RSI/Prévadiès.'}],
                              'nom': 'Charges - cotisations RSI',
                              'solde_crediteur': Decimal('0.00'),
                              'solde_debiteur': Decimal('393.00'),
                              'total_credit': Decimal('0.00'),
                              'total_debit': Decimal('393.00')},
                '6411-URSF1': {'ecritures': [{'date': datetime.date(2011, 11, 17),
                                               'debit': Decimal('161.80'),
                                               'intitule': 'Chèque ZZZZZZZ Cotisation sociales Urssaf 4ème trimestre.'}],
                                'nom': 'Charges - cotisations URSSAF - Allocations familliales',
                                'solde_crediteur': Decimal('0.00'),
                                'solde_debiteur': Decimal('161.80'),
                                'total_credit': Decimal('0.00'),
                                'total_debit': Decimal('161.80')},
                '6411-URSF2': {'ecritures': [{'date': datetime.date(2011, 11, 17),
                                               'debit': Decimal('153.31'),
                                               'intitule': 'Chèque ZZZZZZZ Cotisation sociales Urssaf 4ème trimestre.'}],
                                'nom': 'Charges - cotisations URSSAF - CSG/RDS déductible',
                                'solde_crediteur': Decimal('0.00'),
                                'solde_debiteur': Decimal('153.31'),
                                'total_credit': Decimal('0.00'),
                                'total_debit': Decimal('153.31')},
                '6411-URSF3': {'ecritures': [{'date': datetime.date(2011, 11, 17),
                                               'debit': Decimal('86.89'),
                                               'intitule': 'Chèque ZZZZZZZ Cotisation sociales Urssaf 4ème trimestre.'}],
                                'nom': 'Charges - cotisations URSSAF - CSG/RDS non-déductible',
                                'solde_crediteur': Decimal('0.00'),
                                'solde_debiteur': Decimal('86.89'),
                                'total_credit': Decimal('0.00'),
                                'total_debit': Decimal('86.89')},
                '706': {'ecritures': [{'credit': Decimal('5000.00'),
                                        'date': datetime.date(2011, 3, 31),
                                        'intitule': 'Facture 2011-01 MyClient1 Prestation MyClient1 mars 2011'},
                                       {'credit': Decimal('1500.00'),
                                        'date': datetime.date(2011, 4, 4),
                                        'intitule': 'Facture 2011-02 MyClient2 Prestation MyClient2'},
                                       {'credit': Decimal('11000.00'),
                                        'date': datetime.date(2011, 9, 28),
                                        'intitule': 'Facture 2011-04 MyClient1 Prestation aout 2011'},
                                       {'credit': Decimal('4500.00'),
                                        'date': datetime.date(2011, 11, 1),
                                        'intitule': 'Facture 2011-05 MyClient1 Prestation septembre 2011'},
                                       {'credit': Decimal('7000.00'),
                                        'date': datetime.date(2011, 12, 1),
                                        'intitule': 'Facture 2011-06 MyClient3'},
                                       {'credit': Decimal('11000.00'),
                                        'date': datetime.date(2011, 12, 31),
                                        'intitule': 'Prestation MyClient1 décembre 2011'}],
                         'nom': 'Produits - prestations de services',
                         'solde_crediteur': Decimal('40000.00'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('40000.00'),
                         'total_debit': Decimal('0.00')},
                '758': {'ecritures': [{'credit': Decimal('0.34'),
                                        'date': datetime.date(2011, 9, 30),
                                        'intitule': 'Solde des comptes de TVA du 01/03/2011 au 30/09/2011'}],
                         'nom': 'Produits divers de gestion courante',
                         'solde_crediteur': Decimal('0.34'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('0.34'),
                         'total_debit': Decimal('0.00')}
            },
            'date_debut': datetime.date(2011, 3, 1),
            'date_fin': datetime.date(2011, 12, 31),
            'label': 'Grand-Livre 2011'
        })

    def test_grand_livre_N_plus_1(self):
        from colbert.grand_livre import grand_livre
        livre_journal = codecs.open(os.path.join(CURRENT_DIR, "livre-journal-N+1.txt"),
                                    mode="r", encoding="utf-8")
        grand_livre_precedent = codecs.open(os.path.join(CURRENT_DIR, "grand_livre-2011.json"),
                                            mode="r", encoding="utf-8")
        grand_livre_precedent = json.loads(grand_livre_precedent.read(), object_hook=as_ecriture)

        gl = grand_livre(livre_journal, "Grand-Livre 2012",
                         date_debut=datetime.date(2012, 1, 1),
                         date_fin=datetime.date(2012, 12, 31),
                         grand_livre_precedent=grand_livre_precedent)

        # Uncomment to generate the JSON test file.
        # output = codecs.open(os.path.join(CURRENT_DIR, "grand_livre-2012.json"),
        #                               mode="w+", encoding="utf-8")
        # output.write(json.dumps(gl, default=json_encoder, indent=4))
        # output.close
        # pprint(gl)
        self.maxDiff = None
        self.assertEqual(gl, {
            'comptes': {
                '100': {'ecritures': [{'credit': Decimal('1500.00'),
                                         'date': datetime.date(2012, 1, 1),
                                         'intitule': 'Report à nouveau'}],
                         'nom': "Capital et compte de l'exploitant",
                         'solde_crediteur': Decimal('1500.00'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('1500.00'),
                         'total_debit': Decimal('0.00')},
                '1061': {'ecritures': [{'credit': Decimal('150.00'),
                                          'date': datetime.date(2011, 12, 31),
                                          'intitule': 'Affectation du résultat'}],
                          'nom': 'Réserve légale',
                          'solde_crediteur': Decimal('150.00'),
                          'solde_debiteur': Decimal('0.00'),
                          'total_credit': Decimal('150.00'),
                          'total_debit': Decimal('0.00')},
                '110': {'ecritures': [{'credit': Decimal('10801.90'),
                                         'date': datetime.date(2011, 12, 31),
                                         'intitule': 'Affectation du résultat'}],
                         'nom': 'Report à nouveau - Solde créditeur',
                         'solde_crediteur': Decimal('10801.90'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('10801.90'),
                         'total_debit': Decimal('0.00')},
                '120': {'ecritures': [{'credit': Decimal('35951.90'),
                                         'date': datetime.date(2011, 12, 31),
                                         'intitule': "Enregistrement du résultat net de l'exercice"},
                                        {'date': datetime.date(2011, 12, 31),
                                         'debit': Decimal('35951.90'),
                                         'intitule': 'Affectation du résultat'}],
                         'nom': "résultat de l'exercice (bénéfice)",
                         'solde_crediteur': Decimal('0.00'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('35951.90'),
                         'total_debit': Decimal('35951.90')},
                '126': {'ecritures': [{'date': datetime.date(2011, 12, 31),
                                         'debit': Decimal('4048.44'),
                                         'intitule': 'Ecritures de clôture des comptes.'},
                                        {'credit': Decimal('4048.44'),
                                         'date': datetime.date(2011, 12, 31),
                                         'intitule': "Enregistrement du résultat net de l'exercice"}],
                         'nom': 'Regroupement des comptes de charges',
                         'solde_crediteur': Decimal('0.00'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('4048.44'),
                         'total_debit': Decimal('4048.44')},
                '127': {'ecritures': [{'credit': Decimal('40000.34'),
                                         'date': datetime.date(2011, 12, 31),
                                         'intitule': 'Ecritures de clôture des comptes.'},
                                        {'date': datetime.date(2011, 12, 31),
                                         'debit': Decimal('40000.34'),
                                         'intitule': "Enregistrement du résultat net de l'exercice"}],
                         'nom': 'Regroupement des comptes de produits',
                         'solde_crediteur': Decimal('0.00'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('40000.34'),
                         'total_debit': Decimal('40000.34')},
                '4111-CL1': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                              'debit': Decimal('0.00'),
                                              'intitule': 'Report à nouveau'},
                                             {'date': datetime.date(2012, 1, 3),
                                              'debit': Decimal('13156.00'),
                                              'intitule': 'Facture 2012-01 MyClient1 Prestation décembre 2011'}],
                              'nom': 'Clients - ventes de biens ou prestations de services',
                              'solde_crediteur': Decimal('0.00'),
                              'solde_debiteur': Decimal('13156.00'),
                              'total_credit': Decimal('0.00'),
                              'total_debit': Decimal('13156.00')},
                '4111-CL2': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                              'debit': Decimal('0.00'),
                                              'intitule': 'Report à nouveau'},
                                             {'date': datetime.date(2012, 3, 20),
                                              'debit': Decimal('13156.00'),
                                              'intitule': 'Facture 2012-03 MyClient2 Prestation février 2012'}],
                              'nom': 'Clients - ventes de biens ou prestations de services',
                              'solde_crediteur': Decimal('0.00'),
                              'solde_debiteur': Decimal('13156.00'),
                              'total_credit': Decimal('0.00'),
                              'total_debit': Decimal('13156.00')},
                '4111-CL3': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                              'debit': Decimal('8372.00'),
                                              'intitule': 'Report à nouveau'}],
                              'nom': 'Clients - ventes de biens ou prestations de services',
                              'solde_crediteur': Decimal('0.00'),
                              'solde_debiteur': Decimal('8372.00'),
                              'total_credit': Decimal('0.00'),
                              'total_debit': Decimal('8372.00')},
                '4181': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                          'debit': Decimal('13156.00'),
                                          'intitule': 'Report à nouveau'},
                                         {'credit': Decimal('13156.00'),
                                          'date': datetime.date(2012, 1, 1),
                                          'intitule': 'Prestation MyClient1 décembre 2011'}],
                          'nom': 'Clients - Factures à établir',
                          'solde_crediteur': Decimal('0.00'),
                          'solde_debiteur': Decimal('0.00'),
                          'total_credit': Decimal('13156.00'),
                          'total_debit': Decimal('13156.00')},
                '444': {'ecritures': [{'credit': Decimal('9800.00'),
                                         'date': datetime.date(2011, 12, 31),
                                         'intitule': 'Impôts sur les bénéfices.'}],
                         'nom': 'État-Impôts sur les bénéfices',
                         'solde_crediteur': Decimal('9800.00'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('9800.00'),
                         'total_debit': Decimal('0.00')},
                '44551': {'ecritures': [{'credit': Decimal('3038.00'),
                                           'date': datetime.date(2012, 1, 1),
                                           'intitule': 'Report à nouveau'}],
                           'nom': 'TVA à décaisser',
                           'solde_crediteur': Decimal('3038.00'),
                           'solde_debiteur': Decimal('0.00'),
                           'total_credit': Decimal('3038.00'),
                           'total_debit': Decimal('0.00')},
                '44566': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                           'debit': Decimal('0.00'),
                                           'intitule': 'Report à nouveau'},
                                          {'date': datetime.date(2012, 2, 1),
                                           'debit': Decimal('3.78'),
                                           'intitule': "Restaurant La Tour d'argent Déjeuner d'affaire avec <NAME> 0.88€ TVA 19.6% ; 2.90€ TVA 7.0%"}],
                           'nom': 'T.V.A. déductible sur autres biens et services',
                           'solde_crediteur': Decimal('0.00'),
                           'solde_debiteur': Decimal('3.78'),
                           'total_credit': Decimal('0.00'),
                           'total_debit': Decimal('3.78')},
                '44571': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                           'debit': Decimal('0.00'),
                                           'intitule': 'Report à nouveau'}],
                           'nom': '<NAME>',
                           'solde_crediteur': Decimal('0.00'),
                           'solde_debiteur': Decimal('0.00'),
                           'total_credit': Decimal('0.00'),
                           'total_debit': Decimal('0.00')},
                '44587': {'ecritures': [{'credit': Decimal('3528.00'),
                                           'date': datetime.date(2012, 1, 1),
                                           'intitule': 'Report à nouveau'},
                                          {'date': datetime.date(2012, 1, 1),
                                           'debit': Decimal('2156.00'),
                                           'intitule': 'Prestation MyClient1 décembre 2011'},
                                          {'credit': Decimal('2156.00'),
                                           'date': datetime.date(2012, 1, 3),
                                           'intitule': 'Facture 2012-01 MyClient1 Prestation décembre 2011'},
                                          {'credit': Decimal('2156.00'),
                                           'date': datetime.date(2012, 3, 20),
                                           'intitule': 'Facture 2012-03 MyClient2 Prestation février 2012'}],
                           'nom': 'Taxes sur le CA sur factures à établir',
                           'solde_crediteur': Decimal('5684.00'),
                           'solde_debiteur': Decimal('0.00'),
                           'total_credit': Decimal('7840.00'),
                           'total_debit': Decimal('2156.00')},
                '455': {'ecritures': [{'credit': Decimal('189.45'),
                                         'date': datetime.date(2012, 1, 1),
                                         'intitule': 'Report à nouveau'}],
                         'nom': 'Associés - Comptes courants',
                         'solde_crediteur': Decimal('189.45'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('189.45'),
                         'total_debit': Decimal('0.00')},
                '457': {'ecritures': [{'credit': Decimal('25000.00'),
                                         'date': datetime.date(2011, 12, 31),
                                         'intitule': 'Affectation du résultat'}],
                         'nom': 'Associés - Dividendes à payer',
                         'solde_crediteur': Decimal('25000.00'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('25000.00'),
                         'total_debit': Decimal('0.00')},
                '512': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                         'debit': Decimal('22679.35'),
                                         'intitule': 'Report à nouveau'},
                                        {'credit': Decimal('49.80'),
                                         'date': datetime.date(2012, 2, 1),
                                         'intitule': "Restaurant La Tour d'argent Déjeuner d'affaire avec <NAME> 0.88€ TVA 19.6% ; 2.90€ TVA 7.0%"}],
                         'nom': 'Banques',
                         'solde_crediteur': Decimal('0.00'),
                         'solde_debiteur': Decimal('22629.55'),
                         'total_credit': Decimal('49.80'),
                         'total_debit': Decimal('22679.35')},
                '60225': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                           'debit': Decimal('21.44'),
                                           'intitule': 'Report à nouveau'},
                                          {'credit': Decimal('21.44'),
                                           'date': datetime.date(2011, 12, 31),
                                           'intitule': 'Ecritures de clôture des comptes.'}],
                           'nom': 'Achats - Fournitures de bureau',
                           'solde_crediteur': Decimal('0.00'),
                           'solde_debiteur': Decimal('0.00'),
                           'total_credit': Decimal('21.44'),
                           'total_debit': Decimal('21.44')},
                '6227': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                          'debit': Decimal('160.00'),
                                          'intitule': 'Report à nouveau'},
                                         {'credit': Decimal('160.00'),
                                          'date': datetime.date(2011, 12, 31),
                                          'intitule': 'Ecritures de clôture des comptes.'}],
                          'nom': "Achats - Frais d'actes et de contentieux",
                          'solde_crediteur': Decimal('0.00'),
                          'solde_debiteur': Decimal('0.00'),
                          'total_credit': Decimal('160.00'),
                          'total_debit': Decimal('160.00')},
                '6257': {'ecritures': [{'date': datetime.date(2012, 2, 1),
                                          'debit': Decimal('46.02'),
                                          'intitule': "Restaurant La Tour d'argent Déjeuner d'affaire avec <NAME> 0.88€ TVA 19.6% ; 2.90€ TVA 7.0%"}],
                          'nom': 'Charges - Réceptions',
                          'solde_crediteur': Decimal('0.00'),
                          'solde_debiteur': Decimal('46.02'),
                          'total_credit': Decimal('0.00'),
                          'total_debit': Decimal('46.02')},
                '6278-LCL': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                              'debit': Decimal('72.00'),
                                              'intitule': 'Report à nouveau'},
                                             {'credit': Decimal('72.00'),
                                              'date': datetime.date(2011, 12, 31),
                                              'intitule': 'Ecritures de clôture des comptes.'}],
                              'nom': 'Autres frais de commission sur prestations de services',
                              'solde_crediteur': Decimal('0.00'),
                              'solde_debiteur': Decimal('0.00'),
                              'total_credit': Decimal('72.00'),
                              'total_debit': Decimal('72.00')},
                '6411': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                          'debit': Decimal('3000.00'),
                                          'intitule': 'Report à nouveau'},
                                         {'credit': Decimal('3000.00'),
                                          'date': datetime.date(2011, 12, 31),
                                          'intitule': 'Ecritures de clôture des comptes.'}],
                          'nom': 'Charges - Salaires et appointements',
                          'solde_crediteur': Decimal('0.00'),
                          'solde_debiteur': Decimal('0.00'),
                          'total_credit': Decimal('3000.00'),
                          'total_debit': Decimal('3000.00')},
                '6411-RSI': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                              'debit': Decimal('393.00'),
                                              'intitule': 'Report à nouveau'},
                                             {'credit': Decimal('393.00'),
                                              'date': datetime.date(2011, 12, 31),
                                              'intitule': 'Ecritures de clôture des comptes.'}],
                              'nom': 'Charges - cotisations RSI',
                              'solde_crediteur': Decimal('0.00'),
                              'solde_debiteur': Decimal('0.00'),
                              'total_credit': Decimal('393.00'),
                              'total_debit': Decimal('393.00')},
                '6411-URSF1': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                                'debit': Decimal('161.80'),
                                                'intitule': 'Report à nouveau'},
                                               {'credit': Decimal('161.80'),
                                                'date': datetime.date(2011, 12, 31),
                                                'intitule': 'Ecritures de clôture des comptes.'}],
                                'nom': 'Charges - cotisations URSSAF - Allocations familliales',
                                'solde_crediteur': Decimal('0.00'),
                                'solde_debiteur': Decimal('0.00'),
                                'total_credit': Decimal('161.80'),
                                'total_debit': Decimal('161.80')},
                '6411-URSF2': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                                'debit': Decimal('153.31'),
                                                'intitule': 'Report à nouveau'},
                                               {'credit': Decimal('153.31'),
                                                'date': datetime.date(2011, 12, 31),
                                                'intitule': 'Ecritures de clôture des comptes.'}],
                                'nom': 'Charges - cotisations URSSAF - CSG/RDS déductible',
                                'solde_crediteur': Decimal('0.00'),
                                'solde_debiteur': Decimal('0.00'),
                                'total_credit': Decimal('153.31'),
                                'total_debit': Decimal('153.31')},
                '6411-URSF3': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                                'debit': Decimal('86.89'),
                                                'intitule': 'Report à nouveau'},
                                               {'credit': Decimal('86.89'),
                                                'date': datetime.date(2011, 12, 31),
                                                'intitule': 'Ecritures de clôture des comptes.'}],
                                'nom': 'Charges - cotisations URSSAF - CSG/RDS non-déductible',
                                'solde_crediteur': Decimal('0.00'),
                                'solde_debiteur': Decimal('0.00'),
                                'total_credit': Decimal('86.89'),
                                'total_debit': Decimal('86.89')},
                '695': {'ecritures': [{'date': datetime.date(2011, 12, 31),
                                         'debit': Decimal('9800.00'),
                                         'intitule': 'Impôts sur les bénéfices.'}],
                         'nom': 'Impôts sur les bénéfices',
                         'solde_crediteur': Decimal('0.00'),
                         'solde_debiteur': Decimal('9800.00'),
                         'total_credit': Decimal('0.00'),
                         'total_debit': Decimal('9800.00')},
                '706': {'ecritures': [{'credit': Decimal('40000.00'),
                                         'date': datetime.date(2012, 1, 1),
                                         'intitule': 'Report à nouveau'},
                                        {'date': datetime.date(2011, 12, 31),
                                         'debit': Decimal('40000.00'),
                                         'intitule': 'Ecritures de clôture des comptes.'},
                                        {'date': datetime.date(2012, 1, 1),
                                         'debit': Decimal('11000.00'),
                                         'intitule': 'Prestation MyClient1 décembre 2011'},
                                        {'credit': Decimal('11000.00'),
                                         'date': datetime.date(2012, 1, 3),
                                         'intitule': 'Facture 2012-01 MyClient1 Prestation décembre 2011'},
                                        {'credit': Decimal('11000.00'),
                                         'date': datetime.date(2012, 3, 20),
                                         'intitule': 'Facture 2012-03 MyClient2 Prestation février 2012'}],
                         'nom': 'Produits - prestations de services',
                         'solde_crediteur': Decimal('11000.00'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('62000.00'),
                         'total_debit': Decimal('51000.00')},
                '758': {'ecritures': [{'credit': Decimal('0.34'),
                                         'date': datetime.date(2012, 1, 1),
                                         'intitule': 'Report à nouveau'},
                                        {'date': datetime.date(2011, 12, 31),
                                         'debit': Decimal('0.34'),
                                         'intitule': 'Ecritures de clôture des comptes.'}],
                         'nom': 'Produits divers de gestion courante',
                         'solde_crediteur': Decimal('0.00'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('0.34'),
                         'total_debit': Decimal('0.34')}
            },
            'date_debut': datetime.date(2012, 1, 1),
            'date_fin': datetime.date(2012, 12, 31),
            'label': 'Grand-Livre 2012'
        })

    def test_init_comptes_grand_livre_avec_precedent(self):
        from colbert.grand_livre import init_comptes_grand_livre_avec_precedent
        grand_livre_precedent = codecs.open(os.path.join(CURRENT_DIR, "grand_livre-2011.json"),
                                            mode="r", encoding="utf-8")
        comptes = init_comptes_grand_livre_avec_precedent(json.loads(grand_livre_precedent.read()),
                                                          datetime.date(2012, 1, 1))
        self.maxDiff = None
        self.assertEqual(
            comptes, {
                '100': {'ecritures': [{'credit': Decimal('1500.00'),
                                         'date': datetime.date(2012, 1, 1),
                                         'intitule': 'Report à nouveau'}],
                         'nom': "Capital et compte de l'exploitant"},
                '4111-CL1': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                              'debit': Decimal('0.00'),
                                              'intitule': 'Report à nouveau'}],
                              'nom': 'Clients - ventes de biens ou prestations de services'},
                '4111-CL2': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                              'debit': Decimal('0.00'),
                                              'intitule': 'Report à nouveau'}],
                              'nom': 'Clients - ventes de biens ou prestations de services'},
                '4111-CL3': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                              'debit': Decimal('8372.00'),
                                              'intitule': 'Report à nouveau'}],
                              'nom': 'Clients - ventes de biens ou prestations de services'},
                '4181': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                          'debit': Decimal('13156.00'),
                                          'intitule': 'Report à nouveau'}],
                          'nom': 'Clients - Factures à établir'},
                '44551': {'ecritures': [{'credit': Decimal('3038.00'),
                                           'date': datetime.date(2012, 1, 1),
                                           'intitule': 'Report à nouveau'}],
                           'nom': 'TVA à décaisser'},
                '44566': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                           'debit': Decimal('0.00'),
                                           'intitule': 'Report à nouveau'}],
                           'nom': 'T.V.A. déductible sur autres biens et services'},
                '44571': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                           'debit': Decimal('0.00'),
                                           'intitule': 'Report à nouveau'}],
                           'nom': '<NAME>'},
                '44587': {'ecritures': [{'credit': Decimal('3528.00'),
                                           'date': datetime.date(2012, 1, 1),
                                           'intitule': 'Report à nouveau'}],
                           'nom': 'Taxes sur le CA sur factures à établir'},
                '455': {'ecritures': [{'credit': Decimal('189.45'),
                                         'date': datetime.date(2012, 1, 1),
                                         'intitule': 'Report à nouveau'}],
                         'nom': 'Associés - Comptes courants'},
                '512': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                         'debit': Decimal('22679.35'),
                                         'intitule': 'Report à nouveau'}],
                         'nom': 'Banques'},
                '60225': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                           'debit': Decimal('21.44'),
                                           'intitule': 'Report à nouveau'}],
                           'nom': 'Achats - Fournitures de bureau'},
                '6227': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                          'debit': Decimal('160.00'),
                                          'intitule': 'Report à nouveau'}],
                          'nom': "Achats - Frais d'actes et de contentieux"},
                '6278-LCL': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                              'debit': Decimal('72.00'),
                                              'intitule': 'Report à nouveau'}],
                              'nom': 'Autres frais de commission sur prestations de services'},
                '6411': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                          'debit': Decimal('3000.00'),
                                          'intitule': 'Report à nouveau'}],
                          'nom': 'Charges - Salaires et appointements'},
                '6411-RSI': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                              'debit': Decimal('393.00'),
                                              'intitule': 'Report à nouveau'}],
                              'nom': 'Charges - cotisations RSI'},
                '6411-URSF1': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                                'debit': Decimal('161.80'),
                                                'intitule': 'Report à nouveau'}],
                                'nom': 'Charges - cotisations URSSAF - Allocations familliales'},
                '6411-URSF2': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                                'debit': Decimal('153.31'),
                                                'intitule': 'Report à nouveau'}],
                                'nom': 'Charges - cotisations URSSAF - CSG/RDS déductible'},
                '6411-URSF3': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                                'debit': Decimal('86.89'),
                                                'intitule': 'Report à nouveau'}],
                                'nom': 'Charges - cotisations URSSAF - CSG/RDS non-déductible'},
                '706': {'ecritures': [{'credit': Decimal('40000.00'),
                                         'date': datetime.date(2012, 1, 1),
                                         'intitule': 'Report à nouveau'}],
                         'nom': 'Produits - prestations de services'},
                '758': {'ecritures': [{'credit': Decimal('0.34'),
                                         'date': datetime.date(2012, 1, 1),
                                         'intitule': 'Report à nouveau'}],
                         'nom': 'Produits divers de gestion courante'}
            }
        )

    def test_ecriture_journal_in_grand_livre(self):
        from colbert.grand_livre import ecriture_journal_in_grand_livre
        grand_livre = codecs.open(os.path.join(CURRENT_DIR, "grand_livre-2011.json"),
                                  mode="r", encoding="utf-8")
        grand_livre = json.loads(grand_livre.read(), object_hook=as_ecriture)

        ecriture = {'credit': Decimal('11000'),
                    'debit': Decimal('0.00'),
                    'nom_compte': 'Produits - prestations de services',
                    'numero_compte_credit': '706',
                    'numero_compte_debit': ''}
        intitule = 'Prestation MyClient1 décembre 2011'
        date = datetime.date(2011, 12, 31)
        self.assertTrue(ecriture_journal_in_grand_livre(ecriture, date, intitule, grand_livre))

        ecriture['credit'] = Decimal('9000')
        self.assertFalse(ecriture_journal_in_grand_livre(ecriture, date, intitule, grand_livre))

    def test_grand_livre_to_rst(self):
        from colbert.grand_livre import grand_livre_to_rst
        grand_livre = codecs.open(os.path.join(CURRENT_DIR, "grand_livre-2011.json"),
                                  mode="r", encoding="utf-8")
        output = io.StringIO()
        # Uncomment to generate the file.
        # output = codecs.open(os.path.join(CURRENT_DIR, "grand_livre-2011.txt"),
        #                               mode="w+", encoding="utf-8")
        grand_livre_to_rst(json.loads(grand_livre.read()), output)
        grand_livre_txt = codecs.open(os.path.join(CURRENT_DIR, "grand_livre-2011.txt"),
                                      mode="r", encoding="utf-8")
        self.maxDiff = None
        self.assertEqual(output.getvalue(), grand_livre_txt.read())


def suite():
    suite = unittest.TestLoader().loadTestsFromTestCase(GrandLivreTestCase)
    return suite

# -*- coding: utf-8 -*-

import os
import unittest
import codecs
import io
import datetime
import json
from colbert.utils import decode_as_ecriture as as_ecriture

from decimal import Decimal

CURRENT_DIR = os.path.dirname(__file__)


class GrandLivreTestCase(unittest.TestCase):
    def test_grand_livre(self):
        from colbert.grand_livre import grand_livre
        livre_journal = codecs.open(os.path.join(CURRENT_DIR, "livre-journal.txt"),
                                    mode="r", encoding="utf-8")
        gl = grand_livre(livre_journal, "Grand-Livre 2011",
                         date_debut=datetime.date(2011, 3, 1),
                         date_fin=datetime.date(2011, 12, 31),
                         grand_livre_precedent=None)

        # Uncomment to generate the JSON test file.
        # from colbert.utils import json_encoder
        # output = codecs.open(os.path.join(CURRENT_DIR, "grand_livre-2011.json"),
        #                               mode="w+", encoding="utf-8")
        # output.write(json.dumps(gl, default=json_encoder, indent=4))
        # output.close
        # pprint(gl)
        self.maxDiff = None
        self.assertEqual(gl, {
            'comptes': {
                '100': {'ecritures': [{'credit': Decimal('1500.00'),
                                        'date': datetime.date(2011, 4, 2),
                                        'intitule': 'Capital initial Dépôt de 1500 € par <NAME>erra au LCL <NAME>'}],
                         'nom': "Capital et compte de l'exploitant",
                         'solde_crediteur': Decimal('1500.00'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('1500.00'),
                         'total_debit': Decimal('0.00')},
                '4111-CL1': {'ecritures': [{'date': datetime.date(2011, 3, 31),
                                             'debit': Decimal('5980.00'),
                                             'intitule': 'Facture 2011-01 MyClient1 Prestation MyClient1 mars 2011'},
                                            {'credit': Decimal('5980.00'),
                                             'date': datetime.date(2011, 9, 2),
                                             'intitule': 'Virement MyClient1 ZZZZZZZZZZZ Facture 2011-01'},
                                            {'date': datetime.date(2011, 9, 28),
                                             'debit': Decimal('13156.00'),
                                             'intitule': 'Facture 2011-04 MyClient1 Prestation aout 2011'},
                                            {'date': datetime.date(2011, 11, 1),
                                             'debit': Decimal('5382.00'),
                                             'intitule': 'Facture 2011-05 MyClient1 Prestation septembre 2011'},
                                            {'credit': Decimal('18538.00'),
                                             'date': datetime.date(2011, 12, 1),
                                             'intitule': 'Virement MyClient1 WWWWWWWWWW Facture 2011-04, 2011-05'}],
                              'nom': 'Clients - ventes de biens ou prestations de services',
                              'solde_crediteur': Decimal('0.00'),
                              'solde_debiteur': Decimal('0.00'),
                              'total_credit': Decimal('24518.00'),
                              'total_debit': Decimal('24518.00')},
                '4111-CL2': {'ecritures': [{'date': datetime.date(2011, 4, 4),
                                             'debit': Decimal('1794.00'),
                                             'intitule': 'Facture 2011-02 MyClient2 Prestation MyClient2'},
                                            {'credit': Decimal('1794.00'),
                                             'date': datetime.date(2011, 6, 15),
                                             'intitule': 'Remise chèque XXXXXXX règlement facture 2011-02'}],
                              'nom': 'Clients - ventes de biens ou prestations de services',
                              'solde_crediteur': Decimal('0.00'),
                              'solde_debiteur': Decimal('0.00'),
                              'total_credit': Decimal('1794.00'),
                              'total_debit': Decimal('1794.00')},
                '4111-CL3': {'ecritures': [{'date': datetime.date(2011, 12, 1),
                                             'debit': Decimal('8372.00'),
                                             'intitule': 'Facture 2011-06 MyClient3'}],
                              'nom': 'Clients - ventes de biens ou prestations de services',
                              'solde_crediteur': Decimal('0.00'),
                              'solde_debiteur': Decimal('8372.00'),
                              'total_credit': Decimal('0.00'),
                              'total_debit': Decimal('8372.00')},
                '4181': {'ecritures': [{'date': datetime.date(2011, 12, 31),
                                         'debit': Decimal('13156.00'),
                                         'intitule': 'Prestation MyClient1 décembre 2011'}],
                          'nom': 'Clients - Factures à établir',
                          'solde_crediteur': Decimal('0.00'),
                          'solde_debiteur': Decimal('13156.00'),
                          'total_credit': Decimal('0.00'),
                          'total_debit': Decimal('13156.00')},
                '44551': {'ecritures': [{'credit': Decimal('1240.00'),
                                          'date': datetime.date(2011, 9, 30),
                                          'intitule': 'Solde des comptes de TVA du 01/03/2011 au 30/09/2011'},
                                         {'date': datetime.date(2011, 10, 6),
                                          'debit': Decimal('1240.00'),
                                          'intitule': 'Chèque WWWWWWW Règlement de la TVA trimestrielle'},
                                         {'credit': Decimal('3038.00'),
                                          'date': datetime.date(2011, 12, 31),
                                          'intitule': 'Solde des comptes de TVA du 01/10/2011 au 31/12/2011'}],
                           'nom': 'TVA à décaisser',
                           'solde_crediteur': Decimal('3038.00'),
                           'solde_debiteur': Decimal('0.00'),
                           'total_credit': Decimal('4278.00'),
                           'total_debit': Decimal('1240.00')},
                '44566': {'ecritures': [{'date': datetime.date(2011, 3, 18),
                                          'debit': Decimal('10.45'),
                                          'intitule': 'Frais de constitution de la société CFE Paris.'},
                                         {'date': datetime.date(2011, 3, 18),
                                          'debit': Decimal('19.00'),
                                          'intitule': 'Frais de constitution de la société - Annonce légale.'},
                                         {'date': datetime.date(2011, 6, 11),
                                          'debit': Decimal('4.21'),
                                          'intitule': 'BHV - Fournitures des bureau (Livres comptables).'},
                                         {'credit': Decimal('33.66'),
                                          'date': datetime.date(2011, 9, 30),
                                          'intitule': 'Solde des comptes de TVA du 01/03/2011 au 30/09/2011'}],
                           'nom': 'T.V.A. déductible sur autres biens et services',
                           'solde_crediteur': Decimal('0.00'),
                           'solde_debiteur': Decimal('0.00'),
                           'total_credit': Decimal('33.66'),
                           'total_debit': Decimal('33.66')},
                '44571': {'ecritures': [{'credit': Decimal('294.00'),
                                          'date': datetime.date(2011, 6, 15),
                                          'intitule': 'Remise chèque XXXXXXX règlement facture 2011-02'},
                                         {'credit': Decimal('980.00'),
                                          'date': datetime.date(2011, 9, 2),
                                          'intitule': 'Virement MyClient1 ZZZZZZZZZZZ Facture 2011-01'},
                                         {'date': datetime.date(2011, 9, 30),
                                          'debit': Decimal('1274.00'),
                                          'intitule': 'Solde des comptes de TVA du 01/03/2011 au 30/09/2011'},
                                         {'credit': Decimal('2156.00'),
                                          'date': datetime.date(2011, 12, 1),
                                          'intitule': 'Virement MyClient1 WWWWWWWWWW Facture 2011-04, 2011-05'},
                                         {'credit': Decimal('882.00'),
                                          'date': datetime.date(2011, 12, 1),
                                          'intitule': 'Virement MyClient1 WWWWWWWWWW Facture 2011-04, 2011-05'},
                                         {'date': datetime.date(2011, 12, 31),
                                          'debit': Decimal('3038.00'),
                                          'intitule': 'Solde des comptes de TVA du 01/10/2011 au 31/12/2011'}],
                           'nom': '<NAME>',
                           'solde_crediteur': Decimal('0.00'),
                           'solde_debiteur': Decimal('0.00'),
                           'total_credit': Decimal('4312.00'),
                           'total_debit': Decimal('4312.00')},
                '44587': {'ecritures': [{'credit': Decimal('980.00'),
                                          'date': datetime.date(2011, 3, 31),
                                          'intitule': 'Facture 2011-01 MyClient1 Prestation MyClient1 mars 2011'},
                                         {'credit': Decimal('294.00'),
                                          'date': datetime.date(2011, 4, 4),
                                          'intitule': 'Facture 2011-02 MyClient2 Prestation MyClient2'},
                                         {'date': datetime.date(2011, 6, 15),
                                          'debit': Decimal('294.00'),
                                          'intitule': 'Remise chèque XXXXXXX règlement facture 2011-02'},
                                         {'date': datetime.date(2011, 9, 2),
                                          'debit': Decimal('980.00'),
                                          'intitule': 'Virement MyClient1 ZZZZZZZZZZZ Facture 2011-01'},
                                         {'credit': Decimal('2156.00'),
                                          'date': datetime.date(2011, 9, 28),
                                          'intitule': 'Facture 2011-04 MyClient1 Prestation aout 2011'},
                                         {'credit': Decimal('882.00'),
                                          'date': datetime.date(2011, 11, 1),
                                          'intitule': 'Facture 2011-05 MyClient1 Prestation septembre 2011'},
                                         {'date': datetime.date(2011, 12, 1),
                                          'debit': Decimal('2156.00'),
                                          'intitule': 'Virement MyClient1 WWWWWWWWWW Facture 2011-04, 2011-05'},
                                         {'date': datetime.date(2011, 12, 1),
                                          'debit': Decimal('882.00'),
                                          'intitule': 'Virement MyClient1 WWWWWWWWWW Facture 2011-04, 2011-05'},
                                         {'credit': Decimal('1372.00'),
                                          'date': datetime.date(2011, 12, 1),
                                          'intitule': 'Facture 2011-06 MyClient3'},
                                         {'credit': Decimal('2156.00'),
                                          'date': datetime.date(2011, 12, 31),
                                          'intitule': 'Prestation MyClient1 décembre 2011'}],
                           'nom': 'Taxes sur le CA sur factures à établir',
                           'solde_crediteur': Decimal('3528.00'),
                           'solde_debiteur': Decimal('0.00'),
                           'total_credit': Decimal('7840.00'),
                           'total_debit': Decimal('4312.00')},
                '455': {'ecritures': [{'credit': Decimal('90.45'),
                                        'date': datetime.date(2011, 3, 18),
                                        'intitule': 'Frais de constitution de la société CFE Paris.'},
                                       {'credit': Decimal('99.00'),
                                        'date': datetime.date(2011, 3, 18),
                                        'intitule': 'Frais de constitution de la société - Annonce légale.'}],
                         'nom': 'Associés - Comptes courants',
                         'solde_crediteur': Decimal('189.45'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('189.45'),
                         'total_debit': Decimal('0.00')},
                '512': {'ecritures': [{'credit': Decimal('48.00'),
                                        'date': datetime.date(2011, 4, 1),
                                        'intitule': 'Résultat arr\xeaté compte'},
                                       {'date': datetime.date(2011, 4, 2),
                                        'debit': Decimal('1500.00'),
                                        'intitule': 'Capital initial Dépôt de 1500 € par <NAME> au LCL <NAME>'},
                                       {'credit': Decimal('15.00'),
                                        'date': datetime.date(2011, 4, 28),
                                        'intitule': 'Cotisation Option PRO  LCL'},
                                       {'credit': Decimal('3.00'),
                                        'date': datetime.date(2011, 5, 2),
                                        'intitule': 'Abonnement LCL Access'},
                                       {'credit': Decimal('25.65'),
                                        'date': datetime.date(2011, 6, 11),
                                        'intitule': 'BHV - Fournitures des bureau (Livres comptables).'},
                                       {'date': datetime.date(2011, 6, 15),
                                        'debit': Decimal('1794.00'),
                                        'intitule': 'Remise chèque XXXXXXX règlement facture 2011-02'},
                                       {'credit': Decimal('3000.00'),
                                        'date': datetime.date(2011, 7, 5),
                                        'intitule': 'Traitement mois de juin gérant.'},
                                       {'credit': Decimal('393.00'),
                                        'date': datetime.date(2011, 8, 8),
                                        'intitule': 'Chèque XXXXXXY Cotisation trimestrielle RSI/Prévadiès.'},
                                       {'date': datetime.date(2011, 9, 2),
                                        'debit': Decimal('5980.00'),
                                        'intitule': 'Virement MyClient1 ZZZZZZZZZZZ Facture 2011-01'},
                                       {'credit': Decimal('3.00'),
                                        'date': datetime.date(2011, 9, 3),
                                        'intitule': 'Abonnement LCL Access'},
                                       {'credit': Decimal('1240.00'),
                                        'date': datetime.date(2011, 10, 6),
                                        'intitule': 'Chèque WWWWWWW Règlement de la TVA trimestrielle'},
                                       {'credit': Decimal('402.00'),
                                        'date': datetime.date(2011, 11, 17),
                                        'intitule': 'Chèque ZZZZZZZ Cotisation sociales Urssaf 4ème trimestre.'},
                                       {'credit': Decimal('3.00'),
                                        'date': datetime.date(2011, 12, 1),
                                        'intitule': 'Abonnement LCL Access'},
                                       {'date': datetime.date(2011, 12, 1),
                                        'debit': Decimal('18538.00'),
                                        'intitule': 'Virement MyClient1 WWWWWWWWWW Facture 2011-04, 2011-05'}],
                         'nom': 'Banques',
                         'solde_crediteur': Decimal('0.00'),
                         'solde_debiteur': Decimal('22679.35'),
                         'total_credit': Decimal('5132.65'),
                         'total_debit': Decimal('27812.00')},
                '60225': {'ecritures': [{'date': datetime.date(2011, 6, 11),
                                          'debit': Decimal('21.44'),
                                          'intitule': 'BHV - Fournitures des bureau (Livres comptables).'}],
                           'nom': 'Achats - Fournitures de bureau',
                           'solde_crediteur': Decimal('0.00'),
                           'solde_debiteur': Decimal('21.44'),
                           'total_credit': Decimal('0.00'),
                           'total_debit': Decimal('21.44')},
                '6227': {'ecritures': [{'date': datetime.date(2011, 3, 18),
                                         'debit': Decimal('80.00'),
                                         'intitule': 'Frais de constitution de la société CFE Paris.'},
                                        {'date': datetime.date(2011, 3, 18),
                                         'debit': Decimal('80.00'),
                                         'intitule': 'Frais de constitution de la société - Annonce légale.'}],
                          'nom': "Achats - Frais d'actes et de contentieux",
                          'solde_crediteur': Decimal('0.00'),
                          'solde_debiteur': Decimal('160.00'),
                          'total_credit': Decimal('0.00'),
                          'total_debit': Decimal('160.00')},
                '6278-LCL': {'ecritures': [{'date': datetime.date(2011, 4, 1),
                                             'debit': Decimal('48.00'),
                                             'intitule': 'Résultat arr\xeaté compte'},
                                            {'date': datetime.date(2011, 4, 28),
                                             'debit': Decimal('15.00'),
                                             'intitule': 'Cotisation Option PRO  LCL'},
                                            {'date': datetime.date(2011, 5, 2),
                                             'debit': Decimal('3.00'),
                                             'intitule': 'Abonnement LCL Access'},
                                            {'date': datetime.date(2011, 9, 3),
                                             'debit': Decimal('3.00'),
                                             'intitule': 'Abonnement LCL Access'},
                                            {'date': datetime.date(2011, 12, 1),
                                             'debit': Decimal('3.00'),
                                             'intitule': 'Abonnement LCL Access'}],
                              'nom': 'Autres frais de commission sur prestations de services',
                              'solde_crediteur': Decimal('0.00'),
                              'solde_debiteur': Decimal('72.00'),
                              'total_credit': Decimal('0.00'),
                              'total_debit': Decimal('72.00')},
                '6411': {'ecritures': [{'date': datetime.date(2011, 7, 5),
                                         'debit': Decimal('3000.00'),
                                         'intitule': 'Traitement mois de juin gérant.'}],
                          'nom': 'Charges - Salaires et appointements',
                          'solde_crediteur': Decimal('0.00'),
                          'solde_debiteur': Decimal('3000.00'),
                          'total_credit': Decimal('0.00'),
                          'total_debit': Decimal('3000.00')},
                '6411-RSI': {'ecritures': [{'date': datetime.date(2011, 8, 8),
                                             'debit': Decimal('393.00'),
                                             'intitule': 'Chèque XXXXXXY Cotisation trimestrielle RSI/Prévadiès.'}],
                              'nom': 'Charges - cotisations RSI',
                              'solde_crediteur': Decimal('0.00'),
                              'solde_debiteur': Decimal('393.00'),
                              'total_credit': Decimal('0.00'),
                              'total_debit': Decimal('393.00')},
                '6411-URSF1': {'ecritures': [{'date': datetime.date(2011, 11, 17),
                                               'debit': Decimal('161.80'),
                                               'intitule': 'Chèque ZZZZZZZ Cotisation sociales Urssaf 4ème trimestre.'}],
                                'nom': 'Charges - cotisations URSSAF - Allocations familliales',
                                'solde_crediteur': Decimal('0.00'),
                                'solde_debiteur': Decimal('161.80'),
                                'total_credit': Decimal('0.00'),
                                'total_debit': Decimal('161.80')},
                '6411-URSF2': {'ecritures': [{'date': datetime.date(2011, 11, 17),
                                               'debit': Decimal('153.31'),
                                               'intitule': 'Chèque ZZZZZZZ Cotisation sociales Urssaf 4ème trimestre.'}],
                                'nom': 'Charges - cotisations URSSAF - CSG/RDS déductible',
                                'solde_crediteur': Decimal('0.00'),
                                'solde_debiteur': Decimal('153.31'),
                                'total_credit': Decimal('0.00'),
                                'total_debit': Decimal('153.31')},
                '6411-URSF3': {'ecritures': [{'date': datetime.date(2011, 11, 17),
                                               'debit': Decimal('86.89'),
                                               'intitule': 'Chèque ZZZZZZZ Cotisation sociales Urssaf 4ème trimestre.'}],
                                'nom': 'Charges - cotisations URSSAF - CSG/RDS non-déductible',
                                'solde_crediteur': Decimal('0.00'),
                                'solde_debiteur': Decimal('86.89'),
                                'total_credit': Decimal('0.00'),
                                'total_debit': Decimal('86.89')},
                '706': {'ecritures': [{'credit': Decimal('5000.00'),
                                        'date': datetime.date(2011, 3, 31),
                                        'intitule': 'Facture 2011-01 MyClient1 Prestation MyClient1 mars 2011'},
                                       {'credit': Decimal('1500.00'),
                                        'date': datetime.date(2011, 4, 4),
                                        'intitule': 'Facture 2011-02 MyClient2 Prestation MyClient2'},
                                       {'credit': Decimal('11000.00'),
                                        'date': datetime.date(2011, 9, 28),
                                        'intitule': 'Facture 2011-04 MyClient1 Prestation aout 2011'},
                                       {'credit': Decimal('4500.00'),
                                        'date': datetime.date(2011, 11, 1),
                                        'intitule': 'Facture 2011-05 MyClient1 Prestation septembre 2011'},
                                       {'credit': Decimal('7000.00'),
                                        'date': datetime.date(2011, 12, 1),
                                        'intitule': 'Facture 2011-06 MyClient3'},
                                       {'credit': Decimal('11000.00'),
                                        'date': datetime.date(2011, 12, 31),
                                        'intitule': 'Prestation MyClient1 décembre 2011'}],
                         'nom': 'Produits - prestations de services',
                         'solde_crediteur': Decimal('40000.00'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('40000.00'),
                         'total_debit': Decimal('0.00')},
                '758': {'ecritures': [{'credit': Decimal('0.34'),
                                        'date': datetime.date(2011, 9, 30),
                                        'intitule': 'Solde des comptes de TVA du 01/03/2011 au 30/09/2011'}],
                         'nom': 'Produits divers de gestion courante',
                         'solde_crediteur': Decimal('0.34'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('0.34'),
                         'total_debit': Decimal('0.00')}
            },
            'date_debut': datetime.date(2011, 3, 1),
            'date_fin': datetime.date(2011, 12, 31),
            'label': 'Grand-Livre 2011'
        })

    def test_grand_livre_N_plus_1(self):
        from colbert.grand_livre import grand_livre
        livre_journal = codecs.open(os.path.join(CURRENT_DIR, "livre-journal-N+1.txt"),
                                    mode="r", encoding="utf-8")
        grand_livre_precedent = codecs.open(os.path.join(CURRENT_DIR, "grand_livre-2011.json"),
                                            mode="r", encoding="utf-8")
        grand_livre_precedent = json.loads(grand_livre_precedent.read(), object_hook=as_ecriture)

        gl = grand_livre(livre_journal, "Grand-Livre 2012",
                         date_debut=datetime.date(2012, 1, 1),
                         date_fin=datetime.date(2012, 12, 31),
                         grand_livre_precedent=grand_livre_precedent)

        # Uncomment to generate the JSON test file.
        # output = codecs.open(os.path.join(CURRENT_DIR, "grand_livre-2012.json"),
        #                               mode="w+", encoding="utf-8")
        # output.write(json.dumps(gl, default=json_encoder, indent=4))
        # output.close
        # pprint(gl)
        self.maxDiff = None
        self.assertEqual(gl, {
            'comptes': {
                '100': {'ecritures': [{'credit': Decimal('1500.00'),
                                         'date': datetime.date(2012, 1, 1),
                                         'intitule': 'Report à nouveau'}],
                         'nom': "Capital et compte de l'exploitant",
                         'solde_crediteur': Decimal('1500.00'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('1500.00'),
                         'total_debit': Decimal('0.00')},
                '1061': {'ecritures': [{'credit': Decimal('150.00'),
                                          'date': datetime.date(2011, 12, 31),
                                          'intitule': 'Affectation du résultat'}],
                          'nom': 'Réserve légale',
                          'solde_crediteur': Decimal('150.00'),
                          'solde_debiteur': Decimal('0.00'),
                          'total_credit': Decimal('150.00'),
                          'total_debit': Decimal('0.00')},
                '110': {'ecritures': [{'credit': Decimal('10801.90'),
                                         'date': datetime.date(2011, 12, 31),
                                         'intitule': 'Affectation du résultat'}],
                         'nom': 'Report à nouveau - Solde créditeur',
                         'solde_crediteur': Decimal('10801.90'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('10801.90'),
                         'total_debit': Decimal('0.00')},
                '120': {'ecritures': [{'credit': Decimal('35951.90'),
                                         'date': datetime.date(2011, 12, 31),
                                         'intitule': "Enregistrement du résultat net de l'exercice"},
                                        {'date': datetime.date(2011, 12, 31),
                                         'debit': Decimal('35951.90'),
                                         'intitule': 'Affectation du résultat'}],
                         'nom': "résultat de l'exercice (bénéfice)",
                         'solde_crediteur': Decimal('0.00'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('35951.90'),
                         'total_debit': Decimal('35951.90')},
                '126': {'ecritures': [{'date': datetime.date(2011, 12, 31),
                                         'debit': Decimal('4048.44'),
                                         'intitule': 'Ecritures de clôture des comptes.'},
                                        {'credit': Decimal('4048.44'),
                                         'date': datetime.date(2011, 12, 31),
                                         'intitule': "Enregistrement du résultat net de l'exercice"}],
                         'nom': 'Regroupement des comptes de charges',
                         'solde_crediteur': Decimal('0.00'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('4048.44'),
                         'total_debit': Decimal('4048.44')},
                '127': {'ecritures': [{'credit': Decimal('40000.34'),
                                         'date': datetime.date(2011, 12, 31),
                                         'intitule': 'Ecritures de clôture des comptes.'},
                                        {'date': datetime.date(2011, 12, 31),
                                         'debit': Decimal('40000.34'),
                                         'intitule': "Enregistrement du résultat net de l'exercice"}],
                         'nom': 'Regroupement des comptes de produits',
                         'solde_crediteur': Decimal('0.00'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('40000.34'),
                         'total_debit': Decimal('40000.34')},
                '4111-CL1': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                              'debit': Decimal('0.00'),
                                              'intitule': 'Report à nouveau'},
                                             {'date': datetime.date(2012, 1, 3),
                                              'debit': Decimal('13156.00'),
                                              'intitule': 'Facture 2012-01 MyClient1 Prestation décembre 2011'}],
                              'nom': 'Clients - ventes de biens ou prestations de services',
                              'solde_crediteur': Decimal('0.00'),
                              'solde_debiteur': Decimal('13156.00'),
                              'total_credit': Decimal('0.00'),
                              'total_debit': Decimal('13156.00')},
                '4111-CL2': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                              'debit': Decimal('0.00'),
                                              'intitule': 'Report à nouveau'},
                                             {'date': datetime.date(2012, 3, 20),
                                              'debit': Decimal('13156.00'),
                                              'intitule': 'Facture 2012-03 MyClient2 Prestation février 2012'}],
                              'nom': 'Clients - ventes de biens ou prestations de services',
                              'solde_crediteur': Decimal('0.00'),
                              'solde_debiteur': Decimal('13156.00'),
                              'total_credit': Decimal('0.00'),
                              'total_debit': Decimal('13156.00')},
                '4111-CL3': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                              'debit': Decimal('8372.00'),
                                              'intitule': 'Report à nouveau'}],
                              'nom': 'Clients - ventes de biens ou prestations de services',
                              'solde_crediteur': Decimal('0.00'),
                              'solde_debiteur': Decimal('8372.00'),
                              'total_credit': Decimal('0.00'),
                              'total_debit': Decimal('8372.00')},
                '4181': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                          'debit': Decimal('13156.00'),
                                          'intitule': 'Report à nouveau'},
                                         {'credit': Decimal('13156.00'),
                                          'date': datetime.date(2012, 1, 1),
                                          'intitule': 'Prestation MyClient1 décembre 2011'}],
                          'nom': 'Clients - Factures à établir',
                          'solde_crediteur': Decimal('0.00'),
                          'solde_debiteur': Decimal('0.00'),
                          'total_credit': Decimal('13156.00'),
                          'total_debit': Decimal('13156.00')},
                '444': {'ecritures': [{'credit': Decimal('9800.00'),
                                         'date': datetime.date(2011, 12, 31),
                                         'intitule': 'Impôts sur les bénéfices.'}],
                         'nom': 'État-Impôts sur les bénéfices',
                         'solde_crediteur': Decimal('9800.00'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('9800.00'),
                         'total_debit': Decimal('0.00')},
                '44551': {'ecritures': [{'credit': Decimal('3038.00'),
                                           'date': datetime.date(2012, 1, 1),
                                           'intitule': 'Report à nouveau'}],
                           'nom': 'TVA à décaisser',
                           'solde_crediteur': Decimal('3038.00'),
                           'solde_debiteur': Decimal('0.00'),
                           'total_credit': Decimal('3038.00'),
                           'total_debit': Decimal('0.00')},
                '44566': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                           'debit': Decimal('0.00'),
                                           'intitule': 'Report à nouveau'},
                                          {'date': datetime.date(2012, 2, 1),
                                           'debit': Decimal('3.78'),
                                           'intitule': "Restaurant La Tour d'argent Déjeuner d'affaire avec <NAME> 0.88€ TVA 19.6% ; 2.90€ TVA 7.0%"}],
                           'nom': 'T.V.A. déductible sur autres biens et services',
                           'solde_crediteur': Decimal('0.00'),
                           'solde_debiteur': Decimal('3.78'),
                           'total_credit': Decimal('0.00'),
                           'total_debit': Decimal('3.78')},
                '44571': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                           'debit': Decimal('0.00'),
                                           'intitule': 'Report à nouveau'}],
                           'nom': '<NAME>',
                           'solde_crediteur': Decimal('0.00'),
                           'solde_debiteur': Decimal('0.00'),
                           'total_credit': Decimal('0.00'),
                           'total_debit': Decimal('0.00')},
                '44587': {'ecritures': [{'credit': Decimal('3528.00'),
                                           'date': datetime.date(2012, 1, 1),
                                           'intitule': 'Report à nouveau'},
                                          {'date': datetime.date(2012, 1, 1),
                                           'debit': Decimal('2156.00'),
                                           'intitule': 'Prestation MyClient1 décembre 2011'},
                                          {'credit': Decimal('2156.00'),
                                           'date': datetime.date(2012, 1, 3),
                                           'intitule': 'Facture 2012-01 MyClient1 Prestation décembre 2011'},
                                          {'credit': Decimal('2156.00'),
                                           'date': datetime.date(2012, 3, 20),
                                           'intitule': 'Facture 2012-03 MyClient2 Prestation février 2012'}],
                           'nom': 'Taxes sur le CA sur factures à établir',
                           'solde_crediteur': Decimal('5684.00'),
                           'solde_debiteur': Decimal('0.00'),
                           'total_credit': Decimal('7840.00'),
                           'total_debit': Decimal('2156.00')},
                '455': {'ecritures': [{'credit': Decimal('189.45'),
                                         'date': datetime.date(2012, 1, 1),
                                         'intitule': 'Report à nouveau'}],
                         'nom': 'Associés - Comptes courants',
                         'solde_crediteur': Decimal('189.45'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('189.45'),
                         'total_debit': Decimal('0.00')},
                '457': {'ecritures': [{'credit': Decimal('25000.00'),
                                         'date': datetime.date(2011, 12, 31),
                                         'intitule': 'Affectation du résultat'}],
                         'nom': 'Associés - Dividendes à payer',
                         'solde_crediteur': Decimal('25000.00'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('25000.00'),
                         'total_debit': Decimal('0.00')},
                '512': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                         'debit': Decimal('22679.35'),
                                         'intitule': 'Report à nouveau'},
                                        {'credit': Decimal('49.80'),
                                         'date': datetime.date(2012, 2, 1),
                                         'intitule': "Restaurant La Tour d'argent Déjeuner d'affaire avec <NAME> 0.88€ TVA 19.6% ; 2.90€ TVA 7.0%"}],
                         'nom': 'Banques',
                         'solde_crediteur': Decimal('0.00'),
                         'solde_debiteur': Decimal('22629.55'),
                         'total_credit': Decimal('49.80'),
                         'total_debit': Decimal('22679.35')},
                '60225': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                           'debit': Decimal('21.44'),
                                           'intitule': 'Report à nouveau'},
                                          {'credit': Decimal('21.44'),
                                           'date': datetime.date(2011, 12, 31),
                                           'intitule': 'Ecritures de clôture des comptes.'}],
                           'nom': 'Achats - Fournitures de bureau',
                           'solde_crediteur': Decimal('0.00'),
                           'solde_debiteur': Decimal('0.00'),
                           'total_credit': Decimal('21.44'),
                           'total_debit': Decimal('21.44')},
                '6227': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                          'debit': Decimal('160.00'),
                                          'intitule': 'Report à nouveau'},
                                         {'credit': Decimal('160.00'),
                                          'date': datetime.date(2011, 12, 31),
                                          'intitule': 'Ecritures de clôture des comptes.'}],
                          'nom': "Achats - Frais d'actes et de contentieux",
                          'solde_crediteur': Decimal('0.00'),
                          'solde_debiteur': Decimal('0.00'),
                          'total_credit': Decimal('160.00'),
                          'total_debit': Decimal('160.00')},
                '6257': {'ecritures': [{'date': datetime.date(2012, 2, 1),
                                          'debit': Decimal('46.02'),
                                          'intitule': "Restaurant La Tour d'argent Déjeuner d'affaire avec <NAME> 0.88€ TVA 19.6% ; 2.90€ TVA 7.0%"}],
                          'nom': 'Charges - Réceptions',
                          'solde_crediteur': Decimal('0.00'),
                          'solde_debiteur': Decimal('46.02'),
                          'total_credit': Decimal('0.00'),
                          'total_debit': Decimal('46.02')},
                '6278-LCL': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                              'debit': Decimal('72.00'),
                                              'intitule': 'Report à nouveau'},
                                             {'credit': Decimal('72.00'),
                                              'date': datetime.date(2011, 12, 31),
                                              'intitule': 'Ecritures de clôture des comptes.'}],
                              'nom': 'Autres frais de commission sur prestations de services',
                              'solde_crediteur': Decimal('0.00'),
                              'solde_debiteur': Decimal('0.00'),
                              'total_credit': Decimal('72.00'),
                              'total_debit': Decimal('72.00')},
                '6411': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                          'debit': Decimal('3000.00'),
                                          'intitule': 'Report à nouveau'},
                                         {'credit': Decimal('3000.00'),
                                          'date': datetime.date(2011, 12, 31),
                                          'intitule': 'Ecritures de clôture des comptes.'}],
                          'nom': 'Charges - Salaires et appointements',
                          'solde_crediteur': Decimal('0.00'),
                          'solde_debiteur': Decimal('0.00'),
                          'total_credit': Decimal('3000.00'),
                          'total_debit': Decimal('3000.00')},
                '6411-RSI': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                              'debit': Decimal('393.00'),
                                              'intitule': 'Report à nouveau'},
                                             {'credit': Decimal('393.00'),
                                              'date': datetime.date(2011, 12, 31),
                                              'intitule': 'Ecritures de clôture des comptes.'}],
                              'nom': 'Charges - cotisations RSI',
                              'solde_crediteur': Decimal('0.00'),
                              'solde_debiteur': Decimal('0.00'),
                              'total_credit': Decimal('393.00'),
                              'total_debit': Decimal('393.00')},
                '6411-URSF1': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                                'debit': Decimal('161.80'),
                                                'intitule': 'Report à nouveau'},
                                               {'credit': Decimal('161.80'),
                                                'date': datetime.date(2011, 12, 31),
                                                'intitule': 'Ecritures de clôture des comptes.'}],
                                'nom': 'Charges - cotisations URSSAF - Allocations familliales',
                                'solde_crediteur': Decimal('0.00'),
                                'solde_debiteur': Decimal('0.00'),
                                'total_credit': Decimal('161.80'),
                                'total_debit': Decimal('161.80')},
                '6411-URSF2': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                                'debit': Decimal('153.31'),
                                                'intitule': 'Report à nouveau'},
                                               {'credit': Decimal('153.31'),
                                                'date': datetime.date(2011, 12, 31),
                                                'intitule': 'Ecritures de clôture des comptes.'}],
                                'nom': 'Charges - cotisations URSSAF - CSG/RDS déductible',
                                'solde_crediteur': Decimal('0.00'),
                                'solde_debiteur': Decimal('0.00'),
                                'total_credit': Decimal('153.31'),
                                'total_debit': Decimal('153.31')},
                '6411-URSF3': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                                'debit': Decimal('86.89'),
                                                'intitule': 'Report à nouveau'},
                                               {'credit': Decimal('86.89'),
                                                'date': datetime.date(2011, 12, 31),
                                                'intitule': 'Ecritures de clôture des comptes.'}],
                                'nom': 'Charges - cotisations URSSAF - CSG/RDS non-déductible',
                                'solde_crediteur': Decimal('0.00'),
                                'solde_debiteur': Decimal('0.00'),
                                'total_credit': Decimal('86.89'),
                                'total_debit': Decimal('86.89')},
                '695': {'ecritures': [{'date': datetime.date(2011, 12, 31),
                                         'debit': Decimal('9800.00'),
                                         'intitule': 'Impôts sur les bénéfices.'}],
                         'nom': 'Impôts sur les bénéfices',
                         'solde_crediteur': Decimal('0.00'),
                         'solde_debiteur': Decimal('9800.00'),
                         'total_credit': Decimal('0.00'),
                         'total_debit': Decimal('9800.00')},
                '706': {'ecritures': [{'credit': Decimal('40000.00'),
                                         'date': datetime.date(2012, 1, 1),
                                         'intitule': 'Report à nouveau'},
                                        {'date': datetime.date(2011, 12, 31),
                                         'debit': Decimal('40000.00'),
                                         'intitule': 'Ecritures de clôture des comptes.'},
                                        {'date': datetime.date(2012, 1, 1),
                                         'debit': Decimal('11000.00'),
                                         'intitule': 'Prestation MyClient1 décembre 2011'},
                                        {'credit': Decimal('11000.00'),
                                         'date': datetime.date(2012, 1, 3),
                                         'intitule': 'Facture 2012-01 MyClient1 Prestation décembre 2011'},
                                        {'credit': Decimal('11000.00'),
                                         'date': datetime.date(2012, 3, 20),
                                         'intitule': 'Facture 2012-03 MyClient2 Prestation février 2012'}],
                         'nom': 'Produits - prestations de services',
                         'solde_crediteur': Decimal('11000.00'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('62000.00'),
                         'total_debit': Decimal('51000.00')},
                '758': {'ecritures': [{'credit': Decimal('0.34'),
                                         'date': datetime.date(2012, 1, 1),
                                         'intitule': 'Report à nouveau'},
                                        {'date': datetime.date(2011, 12, 31),
                                         'debit': Decimal('0.34'),
                                         'intitule': 'Ecritures de clôture des comptes.'}],
                         'nom': 'Produits divers de gestion courante',
                         'solde_crediteur': Decimal('0.00'),
                         'solde_debiteur': Decimal('0.00'),
                         'total_credit': Decimal('0.34'),
                         'total_debit': Decimal('0.34')}
            },
            'date_debut': datetime.date(2012, 1, 1),
            'date_fin': datetime.date(2012, 12, 31),
            'label': 'Grand-Livre 2012'
        })

    def test_init_comptes_grand_livre_avec_precedent(self):
        from colbert.grand_livre import init_comptes_grand_livre_avec_precedent
        grand_livre_precedent = codecs.open(os.path.join(CURRENT_DIR, "grand_livre-2011.json"),
                                            mode="r", encoding="utf-8")
        comptes = init_comptes_grand_livre_avec_precedent(json.loads(grand_livre_precedent.read()),
                                                          datetime.date(2012, 1, 1))
        self.maxDiff = None
        self.assertEqual(
            comptes, {
                '100': {'ecritures': [{'credit': Decimal('1500.00'),
                                         'date': datetime.date(2012, 1, 1),
                                         'intitule': 'Report à nouveau'}],
                         'nom': "Capital et compte de l'exploitant"},
                '4111-CL1': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                              'debit': Decimal('0.00'),
                                              'intitule': 'Report à nouveau'}],
                              'nom': 'Clients - ventes de biens ou prestations de services'},
                '4111-CL2': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                              'debit': Decimal('0.00'),
                                              'intitule': 'Report à nouveau'}],
                              'nom': 'Clients - ventes de biens ou prestations de services'},
                '4111-CL3': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                              'debit': Decimal('8372.00'),
                                              'intitule': 'Report à nouveau'}],
                              'nom': 'Clients - ventes de biens ou prestations de services'},
                '4181': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                          'debit': Decimal('13156.00'),
                                          'intitule': 'Report à nouveau'}],
                          'nom': 'Clients - Factures à établir'},
                '44551': {'ecritures': [{'credit': Decimal('3038.00'),
                                           'date': datetime.date(2012, 1, 1),
                                           'intitule': 'Report à nouveau'}],
                           'nom': 'TVA à décaisser'},
                '44566': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                           'debit': Decimal('0.00'),
                                           'intitule': 'Report à nouveau'}],
                           'nom': 'T.V.A. déductible sur autres biens et services'},
                '44571': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                           'debit': Decimal('0.00'),
                                           'intitule': 'Report à nouveau'}],
                           'nom': '<NAME>'},
                '44587': {'ecritures': [{'credit': Decimal('3528.00'),
                                           'date': datetime.date(2012, 1, 1),
                                           'intitule': 'Report à nouveau'}],
                           'nom': 'Taxes sur le CA sur factures à établir'},
                '455': {'ecritures': [{'credit': Decimal('189.45'),
                                         'date': datetime.date(2012, 1, 1),
                                         'intitule': 'Report à nouveau'}],
                         'nom': 'Associés - Comptes courants'},
                '512': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                         'debit': Decimal('22679.35'),
                                         'intitule': 'Report à nouveau'}],
                         'nom': 'Banques'},
                '60225': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                           'debit': Decimal('21.44'),
                                           'intitule': 'Report à nouveau'}],
                           'nom': 'Achats - Fournitures de bureau'},
                '6227': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                          'debit': Decimal('160.00'),
                                          'intitule': 'Report à nouveau'}],
                          'nom': "Achats - Frais d'actes et de contentieux"},
                '6278-LCL': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                              'debit': Decimal('72.00'),
                                              'intitule': 'Report à nouveau'}],
                              'nom': 'Autres frais de commission sur prestations de services'},
                '6411': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                          'debit': Decimal('3000.00'),
                                          'intitule': 'Report à nouveau'}],
                          'nom': 'Charges - Salaires et appointements'},
                '6411-RSI': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                              'debit': Decimal('393.00'),
                                              'intitule': 'Report à nouveau'}],
                              'nom': 'Charges - cotisations RSI'},
                '6411-URSF1': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                                'debit': Decimal('161.80'),
                                                'intitule': 'Report à nouveau'}],
                                'nom': 'Charges - cotisations URSSAF - Allocations familliales'},
                '6411-URSF2': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                                'debit': Decimal('153.31'),
                                                'intitule': 'Report à nouveau'}],
                                'nom': 'Charges - cotisations URSSAF - CSG/RDS déductible'},
                '6411-URSF3': {'ecritures': [{'date': datetime.date(2012, 1, 1),
                                                'debit': Decimal('86.89'),
                                                'intitule': 'Report à nouveau'}],
                                'nom': 'Charges - cotisations URSSAF - CSG/RDS non-déductible'},
                '706': {'ecritures': [{'credit': Decimal('40000.00'),
                                         'date': datetime.date(2012, 1, 1),
                                         'intitule': 'Report à nouveau'}],
                         'nom': 'Produits - prestations de services'},
                '758': {'ecritures': [{'credit': Decimal('0.34'),
                                         'date': datetime.date(2012, 1, 1),
                                         'intitule': 'Report à nouveau'}],
                         'nom': 'Produits divers de gestion courante'}
            }
        )

    def test_ecriture_journal_in_grand_livre(self):
        from colbert.grand_livre import ecriture_journal_in_grand_livre
        grand_livre = codecs.open(os.path.join(CURRENT_DIR, "grand_livre-2011.json"),
                                  mode="r", encoding="utf-8")
        grand_livre = json.loads(grand_livre.read(), object_hook=as_ecriture)

        ecriture = {'credit': Decimal('11000'),
                    'debit': Decimal('0.00'),
                    'nom_compte': 'Produits - prestations de services',
                    'numero_compte_credit': '706',
                    'numero_compte_debit': ''}
        intitule = 'Prestation MyClient1 décembre 2011'
        date = datetime.date(2011, 12, 31)
        self.assertTrue(ecriture_journal_in_grand_livre(ecriture, date, intitule, grand_livre))

        ecriture['credit'] = Decimal('9000')
        self.assertFalse(ecriture_journal_in_grand_livre(ecriture, date, intitule, grand_livre))

    def test_grand_livre_to_rst(self):
        from colbert.grand_livre import grand_livre_to_rst
        grand_livre = codecs.open(os.path.join(CURRENT_DIR, "grand_livre-2011.json"),
                                  mode="r", encoding="utf-8")
        output = io.StringIO()
        # Uncomment to generate the file.
        # output = codecs.open(os.path.join(CURRENT_DIR, "grand_livre-2011.txt"),
        #                               mode="w+", encoding="utf-8")
        grand_livre_to_rst(json.loads(grand_livre.read()), output)
        grand_livre_txt = codecs.open(os.path.join(CURRENT_DIR, "grand_livre-2011.txt"),
                                      mode="r", encoding="utf-8")
        self.maxDiff = None
        self.assertEqual(output.getvalue(), grand_livre_txt.read())


def suite():
    suite = unittest.TestLoader().loadTestsFromTestCase(GrandLivreTestCase)
    return suite
# -*- coding: utf-8 -*- # Uncomment to generate the JSON test file. # from colbert.utils import json_encoder # output = codecs.open(os.path.join(CURRENT_DIR, "grand_livre-2011.json"), #                               mode="w+", encoding="utf-8") # output.write(json.dumps(gl, default=json_encoder, indent=4)) # output.close # pprint(gl) # Uncomment to generate the JSON test file. # output = codecs.open(os.path.join(CURRENT_DIR, "grand_livre-2012.json"), #                               mode="w+", encoding="utf-8") # output.write(json.dumps(gl, default=json_encoder, indent=4)) # output.close # pprint(gl) # Uncomment to generate the file. # output = codecs.open(os.path.join(CURRENT_DIR, "grand_livre-2011.txt"), #                               mode="w+", encoding="utf-8")