[PYTHON] ~csv account export: code tunning
[burette/etudesetchantiersidf.git] / wizard / account_export_csv.py
1 # -*- coding: utf-8 -*-
2 ##############################################################################
3 #
4 # etudesetchantiersidf module for OpenERP, Custom module for Étude et
5 # Chantiers île-de-France
6 # Copyright (C) 2014-2022 etudesetchantiersidf
7 # (<http://etudesetchantiersiledefrance.unarec.org/>)
8 #
9 # This file is a part of etudesetchantiersidf
10 #
11 # etudesetchantiersidf is free software: you can redistribute it and/or
12 # modify it under the terms of the GNU General Public License as published
13 # by the Free Software Foundation, either version 3 of the License, or (at
14 # your option) any later version.
15 #
16 # etudesetchantiersidf is distributed in the hope that it will be useful,
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 # GNU General Public License for more details.
20 #
21 # You should have received a copy of the GNU General Public License
22 # along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #
24 ##############################################################################
25
26 import StringIO
27 import cStringIO
28 import base64
29 import csv
30 import codecs
31 import calendar
32 import datetime
33 import string
34
35 from openerp.osv import osv
36 from openerp.tools.translate import _
37 from openerp.addons.account_export_csv.wizard.account_export_csv import AccountUnicodeWriter
38
39
40 class AccountUnicodeWriter(AccountUnicodeWriter):
41
42 def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
43 # Redirect output to a queue
44 self.queue = cStringIO.StringIO()
45 # created a writer with Excel formating settings
46
47 self.writer = csv.writer(self.queue, dialect=dialect,
48 quoting=csv.QUOTE_NONE, **kwds)
49 self.stream = f
50 self.encoder = codecs.getincrementalencoder(encoding)()
51
52
53 class AccountCSVExport(osv.osv_memory):
54 _inherit = "account.csv.export"
55
56 def action_manual_export_sage(self, cr, uid, ids, context=None):
57 this = self.browse(cr, uid, ids)[0]
58 rows = self.get_data(cr, uid, ids, "sage", context)
59 file_data = StringIO.StringIO()
60 try:
61 writer = AccountUnicodeWriter(file_data)
62 writer.writerows(rows)
63 file_value = file_data.getvalue()
64 self.write(cr, uid, ids,
65 {'data': base64.encodestring(file_value)},
66 context=context)
67 finally:
68 file_data.close()
69 return {
70 'type': 'ir.actions.act_window',
71 'res_model': 'account.csv.export',
72 'view_mode': 'form',
73 'view_type': 'form',
74 'res_id': this.id,
75 'views': [(False, 'form')],
76 'target': 'new',
77 }
78
79 def _get_header_sage(self, cr, uid, ids, context=None):
80 """Return header for SAGE export"""
81 return [_(u'Code du journal'),
82 _(u'N° de pièce'),
83 _(u'Date'),
84 _(u'Compte Général'),
85 _(u'Compte Tiers'),
86 _(u'Général/analytique'),
87 _(u'Compte Analytique'),
88 _(u'Nom du client'),
89 _(u'Débit'),
90 _(u'Crédit'),
91 ]
92
93 def format_row_sage(self, dico, numero_piece, side):
94 """Return a formatted row for SAGE export"""
95 if side == "D":
96 debit = dico['debit']
97 credit = 0
98 if side == "C":
99 debit = 0
100 credit = dico['credit']
101 return [
102 dico['journal_code'],
103 numero_piece,
104 dico['date'],
105 dico['account_code'],
106 dico['compte_tiers'],
107 dico['general_analytic'],
108 dico['analytic_account'],
109 dico['client_name'],
110 debit,
111 credit,
112 ]
113
114 def _get_rows_sage(self, cr, uid, ids,
115 fiscalyear_id,
116 period_range_ids,
117 journal_ids,
118 account_ids=None,
119 context=None):
120 period_obj = self.pool.get('account.period')
121 journal_obj = self.pool.get('account.journal')
122 account_obj = self.pool.get('account.account')
123 account_type_obj = self.pool.get('account.account.type')
124 numero_piece = 0
125 prev_period = 0
126 prev_journal = 0
127 cr.execute("""
128 select
129 aml.period_id,
130 aml.journal_id as journal_id,
131 aml.account_id as account_id,
132 sum(aml.debit) as sum_debit,
133 sum(aml.credit) as sum_credit
134 from
135 account_move_line as aml
136 where
137 aml.period_id in %(period_ids)s and
138 aml.journal_id in %(journal_ids)s and
139 aml.account_id in %(account_ids)s
140 group by
141 period_id,
142 journal_id,
143 account_id
144 order by
145 period_id,
146 journal_id,
147 account_id
148 """,
149 {
150 'period_ids': tuple(period_range_ids),
151 'journal_ids': tuple(journal_ids),
152 'account_ids': tuple(account_ids),
153 }
154 )
155 res = cr.fetchall()
156 rows = []
157 for line in res:
158 dico = {}
159 journal = journal_obj.browse(cr, uid, line[1], context=context)
160 dico['journal_code'] = journal.code[0:2]
161 period = period_obj.browse(cr, uid, line[0], context=context)
162 if prev_journal != journal or prev_period != period:
163 numero_piece += 1
164 year = int(period.code[3:7])
165 month = int(period.code[0:2])
166 day = calendar.monthrange(year, month)[1]
167 dico['date'] = datetime.datetime(year, month, day).strftime(
168 "%d/%m/%Y")
169 account = account_obj.browse(cr, uid, line[2], context=context)
170 dico['account_code'] = account.code
171 preformatted_client_name = journal.name.split(" - ", 1)[1].upper().replace(' ', '')
172 for char in string.punctuation:
173 preformatted_client_name = preformatted_client_name.replace(
174 char, '')
175 dico['client_name'] = preformatted_client_name
176 if account.type in ("receivable", "payable"):
177 dico['compte_tiers'] = dico['client_name']
178 else:
179 dico['compte_tiers'] = ""
180 dico['general_analytic'] = "G"
181 dico['analytic_account'] = ""
182 dico['debit'] = line[3]
183 dico['credit'] = line[4]
184 if dico['debit']:
185 row = self.format_row_sage(dico, numero_piece, "D")
186 rows.append(row)
187 if dico['credit']:
188 row = self.format_row_sage(dico, numero_piece, "C")
189 rows.append(row)
190 account_type = account_type_obj.browse(
191 cr, uid, account.user_type.id, context=context)
192 if account_type.code in ("expense", "income"):
193 dico['general_analytic'] = "A"
194 dico['analytic_account'] = journal.code[3:]
195 if dico['debit']:
196 row = self.format_row_sage(dico, numero_piece, "D")
197 rows.append(row)
198 if dico['credit']:
199 row = self.format_row_sage(dico, numero_piece, "C")
200 rows.append(row)
201
202 prev_journal = journal
203 prev_period = period
204 return rows
205
206 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: