1 # -*- coding: utf-8 -*-
2 ##############################################################################
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/>)
9 # This file is a part of etudesetchantiersidf
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.
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.
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/>.
24 ##############################################################################
35 import openerp
.exceptions
36 from openerp
.osv
import osv
37 from openerp
.tools
.translate
import _
38 from openerp
.addons
.account_export_csv
.wizard
.account_export_csv
import AccountUnicodeWriter
41 class AccountUnicodeWriter(AccountUnicodeWriter
):
43 def __init__(self
, f
, dialect
=csv
.excel
, encoding
="utf-8", **kwds
):
44 # Redirect output to a queue
45 self
.queue
= cStringIO
.StringIO()
46 # created a writer with Excel formating settings
48 self
.writer
= csv
.writer(self
.queue
, dialect
=dialect
,
49 quoting
=csv
.QUOTE_NONE
, **kwds
)
51 self
.encoder
= codecs
.getincrementalencoder(encoding
)()
54 class AccountCSVExport(osv
.osv_memory
):
55 _inherit
= "account.csv.export"
57 def action_manual_export_sage(self
, cr
, uid
, ids
, context
=None):
58 this
= self
.browse(cr
, uid
, ids
)[0]
59 rows
= self
.get_data(cr
, uid
, ids
, "sage", context
)
60 file_data
= StringIO
.StringIO()
62 writer
= AccountUnicodeWriter(file_data
)
63 writer
.writerows(rows
)
64 file_value
= file_data
.getvalue()
65 self
.write(cr
, uid
, ids
,
66 {'data': base64
.encodestring(file_value
)},
71 'type': 'ir.actions.act_window',
72 'res_model': 'account.csv.export',
76 'views': [(False, 'form')],
80 def _get_header_sage(self
, cr
, uid
, ids
, context
=None):
81 """Return header for SAGE export"""
82 return [_(u
'Code du journal'),
87 _(u
'Général/analytique'),
88 _(u
'Compte Analytique'),
94 def format_row_sage(self
, dico
, numero_piece
, side
):
95 """Return a formatted row for SAGE export"""
101 credit
= dico
['credit']
103 dico
['journal_code'],
106 dico
['account_code'],
107 dico
['compte_tiers'],
108 dico
['general_analytic'],
109 dico
['analytic_account'],
115 def _get_rows_sage(self
, cr
, uid
, ids
,
121 fiscalyear_obj
= self
.pool
.get('account.fiscalyear')
122 fiscalyear_code
= fiscalyear_obj
.browse(cr
, uid
, fiscalyear_id
, context
=context
)
123 fiscalyear_code
= fiscalyear_obj
.browse(cr
, uid
, fiscalyear_id
, context
=context
).code
125 period_obj
= self
.pool
.get('account.period')
126 journal_obj
= self
.pool
.get('account.journal')
127 account_obj
= self
.pool
.get('account.account')
134 aml.journal_id as journal_id,
135 aml.account_id as account_id,
136 sum(aml.debit) as sum_debit,
137 sum(aml.credit) as sum_credit
139 account_move_line as aml
141 aml.period_id in %(period_ids)s and
142 aml.journal_id in %(journal_ids)s and
143 aml.account_id in %(account_ids)s
154 'period_ids': tuple(period_range_ids
),
155 'journal_ids': tuple(journal_ids
),
156 'account_ids': tuple(account_ids
),
163 journal
= journal_obj
.browse(cr
, uid
, line
[1], context
=context
)
164 dico
['journal_code'] = journal
.code
[0:2]
165 period
= period_obj
.browse(cr
, uid
, line
[0], context
=context
)
166 if prev_journal
!= journal
or prev_period
!= period
:
168 year
= int(period
.code
[3:7])
169 month
= int(period
.code
[0:2])
170 day
= calendar
.monthrange(year
, month
)[1]
171 dico
['date'] = datetime
.datetime(year
, month
, day
).strftime("%d/%m/%Y")
172 account
= account_obj
.browse(cr
, uid
, line
[2], context
=context
)
173 dico
['account_code'] = account
.code
174 preformatted_client_name
= journal
.name
.split(" - ", 1)[1].upper().replace(' ','')
175 for char
in string
.punctuation
:
176 preformatted_client_name
= preformatted_client_name
.replace(char
,'')
177 dico
['client_name'] = preformatted_client_name
178 if account
.type in ("receivable", "payable"):
179 dico
['compte_tiers'] = dico
['client_name']
181 dico
['compte_tiers'] = ""
182 dico
['general_analytic'] = "G"
183 dico
['analytic_account'] = ""
184 dico
['debit'] = line
[3]
185 dico
['credit'] = line
[4]
186 if dico
['debit'] == dico
['credit']:
190 row
= self
.format_row_sage(dico
, numero_piece
, "D")
193 row
= self
.format_row_sage(dico
, numero_piece
, "C")
195 if account
.type == "other":
196 dico
['general_analytic'] = "A"
197 dico
['analytic_account'] = journal
.code
[3:]
199 row
= self
.format_row_sage(dico
, numero_piece
, "D")
202 row
= self
.format_row_sage(dico
, numero_piece
, "C")
205 prev_journal
= journal
209 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: