[PYTHON][VIEW] ~wip
[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
34 import openerp.exceptions
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 """docstring for _get_header_sage"""
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 _get_rows_sage(self, cr, uid, ids,
94 fiscalyear_id,
95 period_range_ids,
96 journal_ids,
97 account_ids=None,
98 context=None):
99 fiscalyear_obj = self.pool.get('account.fiscalyear')
100 fiscalyear_code = fiscalyear_obj.browse(cr, uid, fiscalyear_id, context=context)
101 fiscalyear_code = fiscalyear_obj.browse(cr, uid, fiscalyear_id, context=context).code
102
103 period_obj = self.pool.get('account.period')
104 journal_obj = self.pool.get('account.journal')
105 account_obj = self.pool.get('account.account')
106 numero_piece = 0
107 prev_period = 0
108 prev_journal = 0
109 req = """
110 select
111 aml.period_id,
112 aml.journal_id as journal_id,
113 aml.account_id as account_id,
114 sum(aml.debit) as sum_debit,
115 sum(aml.credit) as sum_credit
116 from
117 account_move_line as aml
118 where
119 aml.period_id in %(period_ids)s and
120 aml.journal_id in %(journal_ids)s and
121 aml.account_id in %(account_ids)s
122 group by
123 period_id,
124 journal_id,
125 account_id
126 order by
127 period_id,
128 journal_id,
129 account_id
130 """ % {
131 'period_ids': tuple(period_range_ids),
132 'journal_ids': tuple(journal_ids),
133 'account_ids': tuple(account_ids),
134 }
135 cr.execute(req)
136 res = cr.fetchall()
137 rows = []
138 for line in res:
139 journal = journal_obj.browse(cr, uid, line[1], context=context)
140 journal_code = journal.code[0:2]
141 period = period_obj.browse(cr, uid, line[0], context=context)
142 if prev_journal != journal or prev_period != period:
143 numero_piece += 1
144 year = int(period.code[3:7])
145 month = int(period.code[0:2])
146 day = calendar.monthrange(year, month)[1]
147 date = datetime.datetime(year, month, day).strftime("%d/%m/%Y")
148 account = account_obj.browse(cr, uid, line[2], context=context)
149 account_code = account.code
150 client_name = journal.name.split(" - ", 1)[1].upper()
151 if account.type in ("receivable", "payable"):
152 compte_tiers = client_name
153 else:
154 compte_tiers = ""
155 general_analytic = "G"
156 analytic_account = ""
157 debit = line[3]
158 credit = line[4]
159 if debit == credit:
160 pass
161 else:
162 if debit:
163 rows.append([
164 journal_code,
165 numero_piece,
166 date,
167 account_code,
168 compte_tiers,
169 general_analytic,
170 analytic_account,
171 client_name,
172 debit,
173 0,
174 ])
175 if credit:
176 rows.append([
177 journal_code,
178 numero_piece,
179 date,
180 account_code,
181 compte_tiers,
182 general_analytic,
183 analytic_account,
184 client_name,
185 0,
186 credit,
187 ])
188 if account.type == "other":
189 general_analytic = "A"
190 analytic_account = journal.code[3:]
191 if debit:
192 rows.append([
193 journal_code,
194 numero_piece,
195 date,
196 account_code,
197 compte_tiers,
198 general_analytic,
199 analytic_account,
200 client_name,
201 debit,
202 0,
203 ])
204 if credit:
205 rows.append([
206 journal_code,
207 numero_piece,
208 date,
209 account_code,
210 compte_tiers,
211 general_analytic,
212 analytic_account,
213 client_name,
214 0,
215 credit,
216 ])
217
218
219
220 prev_journal = journal
221 prev_period = period
222 return rows
223
224 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: