~omar7r/account-financial-tools/6_1_imp_acccount_admin_tools_importer

« back to all changes in this revision

Viewing changes to account_admin_tools_importer/account_move_importer.py

  • Committer: Omar (Pexego)
  • Date: 2013-11-22 13:30:10 UTC
  • Revision ID: omar@pexego.es-20131122133010-htbmt0hj3i3ydc2d
[IMP] account_admin_tools_importer: Allow import account moves with another column, partner reference, for associating imported move to partner

Show diffs side-by-side

added added

removed removed

Lines of Context:
3
3
#
4
4
#    OpenERP, Open Source Management Solution
5
5
#    Copyright (C) 2004-2009 Pexego Sistemas Informáticos. All Rights Reserved
6
 
#    $Id$
 
6
#    Copyright (c) 2012 Zikzakmedia S.L. (http://zikzakmedia.com)
 
7
#                       All Rights Reserved.
 
8
#                       Jordi Esteve <jesteve@zikzakmedia.com>
 
9
#                       Jesús Martín <jmartin@zikzakmedia.com>
7
10
#
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
74
77
        #
75
78
        # Input file
76
79
        #
77
 
        'input_file': fields.binary('File', filters="*.csv", required=True),
 
80
        'input_file': fields.binary('File', filters="*.csv", 
 
81
                                        required=True),
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,
82
 
                                             required=True),
 
86
                                        required=True),
83
87
        'csv_thousands_separator': fields.char('Thousands sep.', size=1,
84
 
                                               required=True),
 
88
                                        required=True),
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, 
 
91
                                        required=True),
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),
91
96
                                        required=True),
92
97
        'csv_credit_index': fields.integer('Credit field', required=True),
93
98
        'csv_credit_regexp': fields.char('Credit regexp', size=32,
94
 
                                         required=True),
 
99
                                        required=True),
 
100
        'csv_partner_ref_index': fields.integer('Partner Ref field', 
 
101
                                        required=True),
 
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,
 
106
                domain=[
 
107
                    ('model', '=', 'res.partner'),
 
108
                    '|',
 
109
                    ('ttype', '=', 'char'),
 
110
                    ('ttype', '=', 'many2one')
 
111
                ]),
95
112
    }
96
113
 
97
114
    def _get_default_period_id(self, cr, uid, context=None):
100
117
        """
101
118
        period_ids = self.pool.get('account.period').find(cr, uid)
102
119
        return period_ids and period_ids[0] or False
 
120
        
 
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
 
130
        """
 
131
        if context is None:
 
132
            context = {}
 
133
        model_field_obj = self.pool.get('ir.model.fields')
 
134
        model_field_ids = model_field_obj.search(cr,
 
135
                uid, [
 
136
                    ('model', '=', 'res.partner'),
 
137
                    ('name', '=', 'ref')
 
138
                ], context)
 
139
        default_model_field = model_field_obj.browse(cr, uid, 
 
140
                model_field_ids, context)[0].id
 
141
        return default_model_field
103
142
 
104
143
    _defaults = {
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,
123
165
    }
124
166
 
125
167
    def _get_accounts_map(self, cr, uid, context=None):
162
204
        """
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+)?$)'
165
210
        
166
211
        for wiz in self.browse(cr, uid, ids, context=context):
167
212
            if not wiz.input_file:
195
240
 
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
 
253
                    
 
254
                    if len(record) > wiz.csv_partner_ref_index:
 
255
                        record_partner_ref = record[wiz.csv_partner_ref_index]
207
256
 
208
257
                    #
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):
215
264
                        #
216
 
                        # Clean the input amounts
 
265
                        # Clean the input amounts or fail
217
266
                        #
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, '.'))
 
267
                        if record_debit:
 
268
                            record_debit = record_debit.replace(
 
269
                                    wiz.csv_thousands_separator, '').\
 
270
                                    replace(
 
271
                                        wiz.csv_decimal_separator, '.')
 
272
                            if re.match(reFloat, record_debit):
 
273
                                record_debit = float(record_debit)
 
274
                            else:
 
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))
 
279
                        else:
 
280
                            record_debit = 0.0
 
281
                            
 
282
                        if record_credit:
 
283
                            record_credit = record_credit.replace(
 
284
                                wiz.csv_thousands_separator, '').\
 
285
                                replace(
 
286
                                wiz.csv_decimal_separator, '.')
 
287
                            if re.match(reFloat, record_credit):
 
288
                                record_credit = float(record_credit)
 
289
                            else:
 
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))
 
294
                        else:
 
295
                            record_credit = 0.0
220
296
 
221
297
                        #
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)
235
 
 
 
311
                                        
 
312
                        #
 
313
                        # Find the partner searching in the 
 
314
                        # oerp_partner_ref_field
 
315
                        #
 
316
                        partner_id = False
 
317
                        if record_partner_ref and re.match(
 
318
                                wiz.csv_partner_ref_regexp,
 
319
                                record_partner_ref):
 
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)])
 
324
                            if partner_ids:
 
325
                                partner_id = partner_ids[0]
 
326
    
236
327
                        #
237
328
                        # Prepare the line data
238
329
                        #
244
335
                            'ref': False,
245
336
                            'currency_id': False,
246
337
                            'tax_amount': False,
247
 
                            'partner_id': accounts_map.get(account_ids[0])
248
 
                            or False,
 
338
                            'partner_id': partner_id or 
 
339
                                (accounts_map.get(account_ids[0]) or
 
340
                                False),
249
341
                            'tax_code_id': False,
250
342
                            'date_maturity': False,
251
343
                            'amount_currency': False,