Introduction des rapports configurables

authorNicolas Chauvat <nicolas.chauvat@logilab.fr>
changeset5ccbc393260a
branchdefault
phasedraft
hiddenyes
parent revision#0f10ed86ec5d Export du grand livre au format CSV (closes #256948)
child revision#fae5547c762c pycompta-render to html or json
files modified by this revision
lib/comptas.py
lib/config.py
lib/definitions.py
lib/entities.py
lib/render.py
lib/visitors.py
main.py
# HG changeset patch
# User Nicolas Chauvat <nicolas.chauvat@logilab.fr>
# Date 1348769066 -7200
# Thu Sep 27 20:04:26 2012 +0200
# Node ID 5ccbc393260a8a863010c4caadaa79b97b520c4e
# Parent 0f10ed86ec5dea4e34b407bdc67c5bbc3484a65d
Introduction des rapports configurables

diff --git a/lib/comptas.py b/lib/comptas.py
@@ -93,19 +93,20 @@
1  class Comptabilite(AbstractCompta) :
2      """
3      Regroupe les différents livres
4      """
5 
6 -    def __init__(self, debut, fin, ecritures, immobilisations, sous_compta=None) :
7 +    def __init__(self, debut, fin, ecritures, immobilisations, rapports, sous_compta=None) :
8          """
9          --pre:
10          type(debut) is DateTimeType
11          type(fin) is DateTimeType
12          """
13          self.debut = debut
14          self.fin = fin
15          self.ecritures = ecritures
16 +        self.rapports = rapports
17 
18          self.paye = sous_compta
19          if self.paye :
20              report_paye = self.paye.get_reports()
21          else:
@@ -114,12 +115,12 @@
22          self.livrimmo = LivreImmobilisations(immobilisations)
23          amort = self.livrimmo.get_amortissements(debut, fin)
24          self.journal = Journal(ecritures+amort+report_paye)
25          self.glivre = GrandLivre(self.journal)
26          self.balance = Balance(self.glivre)
27 -        self.resultat = CompteResultat(self.glivre)
28 -        self.bilan = Bilan(self.resultat)
29 +        self.resultat = CompteResultat(self.glivre, rapports)
30 +        self.bilan = Bilan(self.resultat, rapports)
31 
32          if self.paye :
33              toutes_ecritures = ecritures + self.paye.journal.ecritures
34          else :
35              toutes_ecritures = ecritures
diff --git a/lib/config.py b/lib/config.py
@@ -21,19 +21,21 @@
36                       'repertoire_ecritures_paye_prev':'./paye/ecritures_prev',
37                       'immobilisations':'livre-immo.xml',
38                       'immobilisations_prev':'livre-immo.prev.xml',
39                       'comptes.png':'comptes.png',
40                       'tresorerie.png':'tresorerie.png',
41 +                     'rapports': 'rapports.py',
42                       }
43 
44      def normalize_paths(self) :
45          """normalise tous les chemins supposés relatifs à répertoire
46          du fichier de config
47          """
48          source = os.path.dirname(self.config_path)
49          self.data['exercice'] = source
50 -        for key in ['societe', 'immobilisations', 'immobilisations_prev'] :
51 +        for key in ['societe', 'immobilisations', 'immobilisations_prev',
52 +                    'rapports'] :
53              self.data[key] = absjoin(source, self.data[key])
54          for key in ['repertoire_ecritures', 'repertoire_ecritures_prev',
55                      'repertoire_ecritures_paye', 'repertoire_ecritures_paye_prev'] :
56              self.data[key] = absjoin(source, self.data[key])
57          dest = self.data['repertoire_cible']
diff --git a/lib/definitions.py b/lib/definitions.py
@@ -318,11 +318,14 @@
58            (u'416', None),
59            (u'418', None)],
60           [(u'491', None)],
61           []),
62          (u'3.2.3.2', u'Autres',
63 -         [(u'4096', None),
64 +         [(u'4093', None),
65 +          (u'4094', None),
66 +          (u'4095', None),
67 +          (u'4096', None),
68            (u'4097', None),
69            (u'4098', None),
70            (u'425', None),
71            (u'428', 'D'),
72            (u'438', 'D')],
diff --git a/lib/entities.py b/lib/entities.py
@@ -13,11 +13,10 @@
73  import types
74  import logging
75 
76  from pycompta import L1, DEBUT #, FIN
77  from pycompta import RelativeDateTime, DateTimeType
78 -from pycompta.lib import definitions
79 
80  # ECRITURES ####################################################################
81 
82  class ExceptionEcriture(Exception):
83      """Ecriture a un probleme: est pas equilibree"""
@@ -520,12 +519,13 @@
84  class CompteResultat(object):
85      """
86      Compte de résultat qui regroupe par postes les charges et les produits
87      """
88 
89 -    def __init__(self, glivre) :
90 +    def __init__(self, glivre, rapports) :
91          self.glivre = glivre
92 +        self.rapports = rapports
93 
94      def get_total(self, debut, fin, poste) :
95          """
96          renvoie le total d'un poste pour la période
97          """
@@ -546,19 +546,19 @@
98 
99      def get_resultat(self, debut, fin) :
100          """
101          renvoie le couple (total chargs, total produits)
102          """
103 -        charges = self.get_total(debut, fin, ('','',[],definitions.CHARGES))
104 -        produits = self.get_total(debut, fin, ('','',[],definitions.PRODUITS))
105 +        charges = self.get_total(debut, fin, ('','',[], self.rapports['CHARGES']))
106 +        produits = self.get_total(debut, fin, ('','',[],self.rapports['PRODUITS']))
107          # assert charges <= 0, "Charges %d, Produits %d" % (charges,produits)
108          return -charges, produits
109 
110      def check(self): # XXX FIXME
111          errors = []
112          comptes = set()
113 -        for poste in definitions.CHARGES + definitions.PRODUITS:
114 +        for poste in self.rapports['CHARGES'] + self.rapports['PRODUITS']:
115              for c_num, c in flatten_desc(poste):
116                  comptes.add(c_num)
117          for c_num in comptes:
118              for num, c in self.glivre.get_comptes(c_num):
119                  c.tag_resultat = True
@@ -573,12 +573,13 @@
120  class Bilan(object):
121      """
122      Bilan comptable qui regroupe par postes actif et passif
123      """
124 
125 -    def __init__(self, resultat) :
126 +    def __init__(self, resultat, rapports) :
127          self.resultat = resultat
128 +        self.rapports = rapports
129 
130      def _get_solde_compte(self, debut, fin, cnum, condition) :
131          """
132          renvoie le solde d'un compte si condition est satisfaite
133          """
@@ -632,12 +633,12 @@
134 
135      def get_bilan(self, debut, fin) :
136          """
137          renvoie couple des montants (actif, passif)
138          """
139 -        p_actif = ('', '', [], [], definitions.ACTIF)
140 -        p_passif = ('', '', [], definitions.PASSIF)
141 +        p_actif = ('', '', [], [], self.rapports['ACTIF'])
142 +        p_passif = ('', '', [], self.rapports['PASSIF'])
143 
144          brut, amort = self.get_solde_compte_diff(debut, fin, p_actif)
145          actif = brut + amort
146          passif = self.get_solde_poste(debut, fin, p_passif)
147 
@@ -653,14 +654,14 @@
148          return actif == passif
149 
150      def check(self):
151          errors = []
152          comptes = set()
153 -        for poste in definitions.ACTIF:
154 +        for poste in self.rapports['ACTIF']:
155              for c_num, c in flatten_desc(poste, True):
156                  comptes.add(c_num)
157 -        for poste in definitions.PASSIF:
158 +        for poste in self.rapports['PASSIF']:
159              for c_num, c in flatten_desc(poste):
160                  comptes.add(c_num)
161          for c_num in comptes:
162              for num, c in self.resultat.glivre.get_comptes(c_num):
163                  c.tag_bilan = True
diff --git a/lib/render.py b/lib/render.py
@@ -78,14 +78,14 @@
164      visitors.write_journal(file(JO+'xml','w'), compta.journal, debut, fin)
165      visitors.write_grand_livre(file(GL+'xml','w'), compta.glivre, debut, fin)
166      visitors.write_balance(file(BA+'xml','w'), compta.balance, debut, fin)
167      if not isinstance(compta, Comptabilite):
168          return
169 -    visitors.write_compte_resultat(file(CR+'xml','w'), compta.resultat, compta.debut, fin)
170 -    visitors.write_bilan(file(BI+'xml','w'), compta.bilan, compta.debut, fin, debug)
171 +    visitors.write_compte_resultat(file(CR+'xml','w'), compta.resultat, compta.debut, fin, compta.rapports)
172 +    visitors.write_bilan(file(BI+'xml','w'), compta.bilan, compta.debut, fin, compta.rapports)
173      visitors.write_livre_immo(file(IM+'xml','w'), compta.livrimmo, debut, fin)
174 -    visitors.write_bilan_immo(file(IB+'xml','w'), compta.resultat, debut, fin)
175 +    visitors.write_bilan_immo(file(IB+'xml','w'), compta.resultat, debut, fin, compta.rapports)
176      if compta.paye:
177          visitors.write_journal(file(JP+'xml','w'), compta.paye.journal, debut, fin)
178          visitors.write_grand_livre(file(GP+'xml','w'), compta.paye.glivre, debut, fin)
179          visitors.write_balance(file(BP+'xml','w'), compta.paye.balance, debut, fin)
180      visitors.write_journal(file(BJ+'xml','w'), compta.banque_journal, debut, fin)
diff --git a/lib/visitors.py b/lib/visitors.py
@@ -8,11 +8,11 @@
181  """
182 
183  __revision__ = "$Id: visitors.py,v 1.34 2005-10-31 18:10:57 nico Exp $"
184 
185  from pycompta import L1, version, DEBUT
186 -from pycompta.lib import entities, definitions
187 +from pycompta.lib import entities
188  from pycompta import DateTimeDelta, DateTimeType
189 
190  def toxml(s) :
191      """
192      Transforme objet en chaîne prête à être écrite dans un fichier XML.
@@ -100,24 +100,24 @@
193              _w_i(out, glivre, n, debut, fin, mul)
194      else:
195          write_vue_comptes(out, glivre, vc)
196      out.write('</poste>\n')
197 
198 -def write_bilan_immo(out, bimmo, debut, fin, debug=False) :
199 +def write_bilan_immo(out, bimmo, debut, fin, rapports, debug=False) :
200      """
201      Ecrit le bilan des immobilisations en XML.
202      """
203      out.write(ENTETE)
204      out.write('<bilan-immo debut="%s" fin="%s" ' % (debut.date, fin.date))
205      comptes = []
206 -    for poste in definitions.IMMO_AMORT:
207 +    for poste in rapports['IMMO_AMORT']:
208          comptes += list(all_comptes(poste))
209      vc = bimmo.glivre.get_vue_comptes(debut, fin, comptes)
210      out.write(' report-solde="%i" solde="%i"' % (-1*vc.total_debut, -1*vc.total_fin))
211      out.write(' var-credit="%i" var-debit="%i"' % (vc.variations))
212      out.write('>\n')
213 -    for p in definitions.IMMO_AMORT :
214 +    for p in rapports['IMMO_AMORT']:
215          _w_i(out, bimmo.glivre, p, debut, fin, 1)
216      out.write('</bilan-immo>\n')
217 
218  # JOURNAL ######################################################################
219 
@@ -236,23 +236,23 @@
220  	for cnum, cond in liste_comptes :
221  	    out.write('<compte num="%s" credit="%s" debit="%s" />\n' \
222  		      % ((cnum,) + resultat.glivre.get_solde_comptes(debut, fin, cnum)))
223      out.write('</poste>\n')
224 
225 -def write_compte_resultat(out, resultat, debut, fin, debug=False) :
226 +def write_compte_resultat(out, resultat, debut, fin, rapports, debug=False) :
227      """
228      Ecrit le compte de résultat en XML.
229      """
230      out.write(ENTETE)
231      out.write('<compte-resultat debut="%s" fin="%s">\n' % (debut.date, fin.date))
232      charges, produits = resultat.get_resultat(debut, fin)
233      out.write('  <charges id="charges" montant="%s">\n' % charges)
234 -    for p in definitions.CHARGES :
235 +    for p in rapports['CHARGES']:
236          _w_c_r(out, resultat, p, debut, fin, -1)
237      out.write('  </charges>\n')
238      out.write('  <produits id="produits" montant="%s">\n' % produits)
239 -    for p in definitions.PRODUITS :
240 +    for p in rapports['PRODUITS']:
241          _w_c_r(out, resultat, p, debut, fin, 1)
242      out.write('  </produits>\n')
243      out.write('</compte-resultat>\n')
244 
245  # BILAN ########################################################################
@@ -294,23 +294,23 @@
246  		      % ((cnum,) + bilan.resultat.glivre.get_solde_comptes(debut, fin, cnum) +
247                           (cond or '',)))
248      out.write('</poste>\n')
249 
250 
251 -def write_bilan(out, bilan, debut, fin, debug=False) :
252 +def write_bilan(out, bilan, debut, fin, rapports, debug=False) :
253      """
254      Ecrit le bilan en XML.
255      """
256      out.write(ENTETE)
257      out.write('<bilan debut="%s" fin="%s">\n' % (debut.date, fin.date))
258      actif, passif = bilan.get_bilan(DEBUT, fin) # XXX was debut
259      out.write('  <actif montant="%s">\n' % actif)
260 -    for n in definitions.ACTIF :
261 +    for n in rapports['ACTIF'] :
262          _w_b_actif(out, bilan, n, DEBUT, fin, -1) # XXX
263      out.write('  </actif>\n')
264      out.write('  <passif montant="%s">\n' % passif)
265 -    for n in definitions.PASSIF :
266 +    for n in rapports['PASSIF'] :
267          _w_b_passif(out, bilan, n, DEBUT, fin, 1, debug)
268      out.write('  </passif>\n')
269      out.write('</bilan>\n')
270 
271  # PILOTE #######################################################################
diff --git a/main.py b/main.py
@@ -93,15 +93,17 @@
272      else:
273          ecritures_paye = None
274      immo = xmlreader.get_immobilisations(file(config['immobilisations']))
275      log(" OK (%s ecritures lues)\n" % (len(ecritures)+len(immo)))
276      log("   calcul...")
277 +    rapports = dict()
278 +    execfile(config.data['rapports'], rapports)
279      if ecritures_paye:
280          compta_paye = SousComptabilite(debut, fin, ecritures_paye, 'Paye')
281 -        compta = Comptabilite(debut, fin, ecritures, immo, compta_paye)
282 +        compta = Comptabilite(debut, fin, ecritures, immo, rapports, compta_paye)
283      else:
284 -        compta = Comptabilite(debut, fin, ecritures, immo)
285 +        compta = Comptabilite(debut, fin, ecritures, immo, rapports)
286      log(" OK\n")
287 
288      # vérifie cohérence
289      errors = compta.check()
290      if errors:
@@ -134,15 +136,17 @@
291              compta_paye_prev = SousComptabilite(debut, prev,
292                                                  ecritures_paye+ecritures_paye_prev)
293              compta_prev = Comptabilite(debut, prev,
294                                         ecritures+ecritures_prev,
295                                         immo+immo_prev,
296 +                                       rapports,
297                                         compta_paye_prev)
298          else:
299              compta_prev = Comptabilite(debut, prev,
300                                         ecritures+ecritures_prev,
301 -                                       immo+immo_prev)
302 +                                       immo+immo_prev,
303 +                                       rapports)
304          log(" OK\n")
305          errors = compta_prev.check()
306          if errors:
307              logging.error('\n'.join(errors))
308      else :