1 # -*- coding: utf-8 -*-
2 ##############################################################################
4 # etudesetchantiersidf module for OpenERP, Custom module for Étude et
5 # Chantiers île-de-France
6 # Copyright (C) 2014-2023 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 from openerp
.osv
import osv
36 from openerp
.tools
.translate
import _
37 from openerp
.addons
.account_export_csv
.wizard
.account_export_csv
import AccountUnicodeWriter
40 class AccountUnicodeWriter(AccountUnicodeWriter
):
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
47 self
.writer
= csv
.writer(self
.queue
, dialect
=dialect
,
48 quoting
=csv
.QUOTE_NONE
, **kwds
)
50 self
.encoder
= codecs
.getincrementalencoder(encoding
)()
53 class AccountCSVExport(osv
.osv_memory
):
54 _inherit
= "account.csv.export"
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()
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
)},
70 'type': 'ir.actions.act_window',
71 'res_model': 'account.csv.export',
75 'views': [(False, 'form')],
79 def _get_header_sage(self
, cr
, uid
, ids
, context
=None):
80 """Return header for SAGE export"""
81 return [_(u
'Code du journal'),
86 _(u
'Général/analytique'),
87 _(u
'Compte Analytique'),
93 def format_row_sage(self
, dico
, numero_piece
, side
):
94 """Return a formatted row for SAGE export"""
100 credit
= dico
['credit']
102 dico
['journal_code'],
105 dico
['account_code'],
106 dico
['compte_tiers'],
107 dico
['general_analytic'],
108 dico
['analytic_account'],
114 def _get_rows_sage(self
, cr
, uid
, ids
,
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')
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
135 account_move_line as aml
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
150 'period_ids': tuple(period_range_ids
),
151 'journal_ids': tuple(journal_ids
),
152 'account_ids': tuple(account_ids
),
159 journal
= journal_obj
.browse(cr
, uid
, line
[1], context
=context
)
160 dico
['journal_code'] = journal
.code
[0:2]
161 if dico
['journal_code'] in ('BQ', 'CB'):
162 dico
['journal_code'] = 'OD'
163 period
= period_obj
.browse(cr
, uid
, line
[0], context
=context
)
164 if prev_journal
!= journal
or prev_period
!= period
:
166 year
= int(period
.code
[3:7])
167 month
= int(period
.code
[0:2])
168 day
= calendar
.monthrange(year
, month
)[1]
169 dico
['date'] = datetime
.datetime(year
, month
, day
).strftime(
171 account
= account_obj
.browse(cr
, uid
, line
[2], context
=context
)
172 dico
['account_code'] = account
.code
173 preformatted_client_name
= journal
.name
.split(" - ", 1)[1].upper().replace(' ', '')
174 for char
in string
.punctuation
:
175 preformatted_client_name
= preformatted_client_name
.replace(
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]
187 row
= self
.format_row_sage(dico
, numero_piece
, "D")
190 row
= self
.format_row_sage(dico
, numero_piece
, "C")
192 account_type
= account_type_obj
.browse(
193 cr
, uid
, account
.user_type
.id, context
=context
)
194 if account_type
.code
in ("expense", "income"):
195 dico
['general_analytic'] = "A"
196 dico
['analytic_account'] = journal
.code
[2:]
198 row
= self
.format_row_sage(dico
, numero_piece
, "D")
201 row
= self
.format_row_sage(dico
, numero_piece
, "C")
204 prev_journal
= journal
208 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: