4
4
# OpenERP, Open Source Management Solution
5
5
# Copyright (C) 2004-2009 Pexego Sistemas Informáticos. All Rights Reserved
6
# Copyright (c) 2012 Zikzakmedia S.L. (http://zikzakmedia.com)
8
# Jordi Esteve <jesteve@zikzakmedia.com>
9
# Jesús Martín <jmartin@zikzakmedia.com>
8
11
# This program is free software: you can redistribute it and/or modify
9
12
# it under the terms of the GNU Affero General Public License as published
77
'input_file': fields.binary('File', filters="*.csv", required=True),
80
'input_file': fields.binary('File', filters="*.csv",
78
82
'input_file_name': fields.char('File name', size=256),
79
83
'csv_delimiter': fields.char('Delimiter', size=1, required=True),
80
84
'csv_quotechar': fields.char('Quote', size=1, required=True),
81
85
'csv_decimal_separator': fields.char('Decimal sep.', size=1,
83
87
'csv_thousands_separator': fields.char('Thousands sep.', size=1,
85
89
'csv_code_index': fields.integer('Code field', required=True),
86
'csv_code_regexp': fields.char('Code regexp', size=32, required=True),
90
'csv_code_regexp': fields.char('Code regexp', size=32,
87
92
'csv_ref_index': fields.integer('Ref field', required=True),
88
93
'csv_ref_regexp': fields.char('Ref regexp', size=32, required=True),
89
94
'csv_debit_index': fields.integer('Debit field', required=True),
92
97
'csv_credit_index': fields.integer('Credit field', required=True),
93
98
'csv_credit_regexp': fields.char('Credit regexp', size=32,
100
'csv_partner_ref_index': fields.integer('Partner Ref field',
102
'csv_partner_ref_regexp': fields.char('Partner Ref regexp',
103
size=32, required=True),
104
'oerp_partner_ref_field': fields.many2one('ir.model.fields',
105
'OpenERP Partner field', required=True,
107
('model', '=', 'res.partner'),
109
('ttype', '=', 'char'),
110
('ttype', '=', 'many2one')
97
114
def _get_default_period_id(self, cr, uid, context=None):
101
118
period_ids = self.pool.get('account.period').find(cr, uid)
102
119
return period_ids and period_ids[0] or False
121
def _get_default_ref_field(self, cr, uid, ids, context=None):
122
""" This method set the default value to ref field in
123
res.partner model for the oerp_partner_ref_field field
124
@param self: The object pointer
125
@param cr: The current row, from the database cursor,
126
@param uid: The current user’s ID for security checks,
127
@param ids: List of registers’ IDs
128
@param context: A standard dictionary for contextual values
129
@return: return default value
133
model_field_obj = self.pool.get('ir.model.fields')
134
model_field_ids = model_field_obj.search(cr,
136
('model', '=', 'res.partner'),
139
default_model_field = model_field_obj.browse(cr, uid,
140
model_field_ids, context)[0].id
141
return default_model_field
105
144
'company_id': lambda self, cr, uid, context:
116
155
'csv_ref_index': lambda *a: 1,
117
156
'csv_debit_index': lambda *a: 2,
118
157
'csv_credit_index': lambda *a: 3,
158
'csv_partner_ref_index': lambda * a: 4,
119
159
'csv_code_regexp': lambda *a: r'^[0-9]+$',
120
160
'csv_ref_regexp': lambda *a: r'^.*$',
121
161
'csv_debit_regexp': lambda *a: r'^[0-9\-\.\,]*$',
122
162
'csv_credit_regexp': lambda *a: r'^[0-9\-\.\,]*$',
163
'csv_partner_ref_regexp': lambda * a: r'^.*$',
164
'oerp_partner_ref_field': _get_default_ref_field,
125
167
def _get_accounts_map(self, cr, uid, context=None):
163
205
accounts_map = self._get_accounts_map(cr, uid, context=context)
164
206
logger = logging.getLogger("account_move_importer")
207
field_obj = self.pool.get('ir.model.fields')
208
partner_obj = self.pool.get('res.partner')
209
reFloat = r'(^[+-]?\d+(?:\.\d+)?(?:[eE][+-]\d+)?$)'
166
211
for wiz in self.browse(cr, uid, ids, context=context):
167
212
if not wiz.input_file:
196
241
for record in reader:
197
242
# Ignore short records
198
if len(record) > wiz.csv_code_index \
243
if wiz.csv_partner_ref_index and len(record) > wiz.csv_code_index \
199
244
and len(record) > wiz.csv_ref_index \
200
245
and len(record) > wiz.csv_debit_index \
201
246
and len(record) > wiz.csv_credit_index:
204
249
record_ref = record[wiz.csv_ref_index]
205
250
record_debit = record[wiz.csv_debit_index]
206
251
record_credit = record[wiz.csv_credit_index]
252
record_partner_ref = False
254
if len(record) > wiz.csv_partner_ref_index:
255
record_partner_ref = record[wiz.csv_partner_ref_index]
209
258
# Ignore invalid records
213
262
and re.match(wiz.csv_debit_regexp, record_debit) \
214
263
and re.match(wiz.csv_credit_regexp, record_credit):
216
# Clean the input amounts
265
# Clean the input amounts or fail
218
record_debit = float(record_debit.replace(wiz.csv_thousands_separator, '').replace(wiz.csv_decimal_separator, '.'))
219
record_credit = float(record_credit.replace(wiz.csv_thousands_separator, '').replace(wiz.csv_decimal_separator, '.'))
268
record_debit = record_debit.replace(
269
wiz.csv_thousands_separator, '').\
271
wiz.csv_decimal_separator, '.')
272
if re.match(reFloat, record_debit):
273
record_debit = float(record_debit)
275
raise osv.except_osv(_('Error'),
276
_("The debit quantity %s doesn't match with"\
277
" a regex float value in account %s") %
278
(record_debit, record_code))
283
record_credit = record_credit.replace(
284
wiz.csv_thousands_separator, '').\
286
wiz.csv_decimal_separator, '.')
287
if re.match(reFloat, record_credit):
288
record_credit = float(record_credit)
290
raise osv.except_osv(_('Error'),
291
_("The credit quantity %s doesn't match with"\
292
" a regex float value in account %s") %
293
(record_credit, record_code))
222
298
# Find the account (or fail!)
232
308
if not account_ids:
233
309
raise osv.except_osv(_('Error'), _("Account\
234
310
not found: %s!") % record_code)
313
# Find the partner searching in the
314
# oerp_partner_ref_field
317
if record_partner_ref and re.match(
318
wiz.csv_partner_ref_regexp,
320
field = field_obj.browse(cr, uid,
321
wiz.oerp_partner_ref_field.id, context).name
322
partner_ids = partner_obj.search(cr, uid,
323
[(field, '=', record_partner_ref)])
325
partner_id = partner_ids[0]
237
328
# Prepare the line data
245
336
'currency_id': False,
246
337
'tax_amount': False,
247
'partner_id': accounts_map.get(account_ids[0])
338
'partner_id': partner_id or
339
(accounts_map.get(account_ids[0]) or
249
341
'tax_code_id': False,
250
342
'date_maturity': False,
251
343
'amount_currency': False,