~unifield-team/unifield-wm/us-826

« back to all changes in this revision

Viewing changes to account_hq_entries/wizard/hq_entries_import.py

  • Committer: Matthieu Dietrich
  • Date: 2012-07-10 14:12:40 UTC
  • mfrom: (913 unifield-wm)
  • mto: This revision was merged to the branch mainline in revision 935.
  • Revision ID: mdietrich@chloups211-20120710141240-celi3o016fqz7mj1
UF-881: [MERGE] merged with trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/env python
 
2
# -*- coding: utf-8 -*-
 
3
##############################################################################
 
4
#
 
5
#    OpenERP, Open Source Management Solution
 
6
#    Copyright (C) 2012 TeMPO Consulting, MSF. All Rights Reserved
 
7
#    Developer: Olivier DOSSMANN
 
8
#
 
9
#    This program is free software: you can redistribute it and/or modify
 
10
#    it under the terms of the GNU Affero General Public License as
 
11
#    published by the Free Software Foundation, either version 3 of the
 
12
#    License, or (at your option) any later version.
 
13
#
 
14
#    This program is distributed in the hope that it will be useful,
 
15
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
16
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
17
#    GNU Affero General Public License for more details.
 
18
#
 
19
#    You should have received a copy of the GNU Affero General Public License
 
20
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
21
#
 
22
##############################################################################
 
23
 
 
24
from osv import osv
 
25
from osv import fields
 
26
import os.path
 
27
from base64 import decodestring
 
28
from tempfile import NamedTemporaryFile
 
29
import csv
 
30
from tools.misc import ustr
 
31
from tools.translate import _
 
32
import time
 
33
import locale
 
34
 
 
35
class hq_entries_import_wizard(osv.osv_memory):
 
36
    _name = 'hq.entries.import'
 
37
    _description = 'HQ Entries Import Wizard'
 
38
 
 
39
    _columns = {
 
40
        'file': fields.binary(string="File", filters="*.csv", required=True),
 
41
    }
 
42
 
 
43
    def parse_date(self, date):
 
44
        try:
 
45
            pdate = time.strptime(date, '%d/%m/%y')
 
46
        except ValueError, e:
 
47
            pdate = time.strptime(date, '%d/%m/%Y')
 
48
        return time.strftime('%Y-%m-%d', pdate)
 
49
 
 
50
    def update_hq_entries(self, cr, uid, line):
 
51
        """
 
52
        Import hq entry regarding all elements given in "line"
 
53
        """
 
54
        # Seems that some line could be empty
 
55
        if line.count('') == 12:
 
56
            return False
 
57
        for x in xrange(0,12-len(line)):
 
58
            line.append('')
 
59
        
 
60
        # Prepare some values
 
61
        vals = {
 
62
            'user_validated': False,
 
63
        }
 
64
        try:
 
65
            description, reference, date, document_date, account_description, third_party, booking_amount, booking_currency, \
 
66
                cost_center, funding_pool, free1, free2 = line
 
67
        except ValueError, e:
 
68
            raise osv.except_osv(_('Error'), _('Unknown format.'))
 
69
        ### TO USE IF DATE HAVE some JAN or MAR or OCT instead of 01 ####
 
70
        ### Set locale 'C' because of period
 
71
        ## locale.setlocale(locale.LC_ALL, 'C')
 
72
        # Check period
 
73
        if not date:
 
74
            raise osv.except_osv(_('Warning'), _('A date is missing!'))
 
75
        try:
 
76
            line_date = self.parse_date(date)
 
77
        except ValueError, e:
 
78
            raise osv.except_osv(_('Error'), _('Wrong format for date: %s: %s') % (date, e))
 
79
        period_ids = self.pool.get('account.period').get_period_from_date(cr, uid, line_date)
 
80
        if not period_ids:
 
81
            raise osv.except_osv(_('Warning'), _('No open period found for given date: %s') % (line_date,))
 
82
        if len(period_ids) > 1:
 
83
            raise osv.except_osv(_('Warning'), _('More than one period found for given date: %s') % (line_date,))
 
84
        period_id = period_ids[0]
 
85
        vals.update({'period_id': period_id, 'date': line_date})
 
86
        if document_date:
 
87
            try:
 
88
                dd = self.parse_date(document_date)
 
89
                vals.update({'document_date': dd})
 
90
            except ValueError, e:
 
91
                raise osv.except_osv(_('Error'), _('Wrong format for date: %s: %s') % (document_date, e))
 
92
        # Retrive account
 
93
        if account_description:
 
94
            account_data = account_description.split(' ')
 
95
            account_code = account_data and account_data[0] or False
 
96
            if not account_code:
 
97
                raise osv.except_osv(_('Error'), _('No account code found!'))
 
98
            account_ids = self.pool.get('account.account').search(cr, uid, [('code', '=', account_code)])
 
99
            if not account_ids:
 
100
                raise osv.except_osv(_('Error'), _('Account code %s doesn\'t exist!') % (account_code,))
 
101
            vals.update({'account_id': account_ids[0], 'account_id_first_value': account_ids[0]})
 
102
        # Retrieve Cost Center and Funding Pool
 
103
        if cost_center:
 
104
            cc_id = self.pool.get('account.analytic.account').search(cr, uid, [('code', '=', cost_center)])
 
105
            if not cc_id:
 
106
                raise osv.except_osv(_('Error'), _('Cost Center %s doesn\'t exist!') % (cost_center,))
 
107
            cc_id = cc_id[0]
 
108
        else:
 
109
            try:
 
110
                cc_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'analytic_distribution', 'analytic_account_project_dummy')[1]
 
111
            except ValueError:
 
112
                cc_id = 0
 
113
        try:
 
114
            fp_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'analytic_distribution', 'analytic_account_msf_private_funds')[1]
 
115
        except ValueError:
 
116
            fp_id = 0
 
117
        vals.update({'cost_center_id': cc_id, 'analytic_id': fp_id, 'cost_center_id_first_value': cc_id, 'analytic_id_first_value': fp_id,})
 
118
        # Fetch description
 
119
        if description:
 
120
            vals.update({'name': description})
 
121
        # Fetch reference
 
122
        if reference:
 
123
            vals.update({'ref': reference})
 
124
        # Fetch 3rd party
 
125
        if third_party:
 
126
            vals.update({'partner_txt': third_party})
 
127
        # Fetch currency
 
128
        if booking_currency:
 
129
            currency_ids = self.pool.get('res.currency').search(cr, uid, [('name', '=', booking_currency), ('active', 'in', [False, True])])
 
130
            if not currency_ids:
 
131
                raise osv.except_osv(_('Error'), _('This currency was not found or is not active: %s') % (booking_currency,))
 
132
            if currency_ids and currency_ids[0]:
 
133
                vals.update({'currency_id': currency_ids[0],})
 
134
        # Fetch amount
 
135
        if booking_amount:
 
136
            vals.update({'amount': booking_amount,})
 
137
        # Line creation
 
138
        res = self.pool.get('hq.entries').create(cr, uid, vals)
 
139
        if res:
 
140
            return True
 
141
        return False
 
142
 
 
143
    def button_validate(self, cr, uid, ids, context=None):
 
144
        """
 
145
        Take a CSV file and fetch some informations for HQ Entries
 
146
        """
 
147
        # Do verifications
 
148
        if not context:
 
149
            context = {}
 
150
        
 
151
        # Verify that an HQ journal exists
 
152
        journal_ids = self.pool.get('account.journal').search(cr, uid, [('type', '=', 'hq')])
 
153
        if not journal_ids:
 
154
            raise osv.except_osv(_('Error'), _('You cannot import HQ entries because no HQ Journal exists.'))
 
155
        
 
156
        # Prepare some values
 
157
        file_ext_separator = '.'
 
158
        file_ext = "csv"
 
159
        message = _("HQ Entries import failed.")
 
160
        res = False
 
161
        created = 0
 
162
        processed = 0
 
163
        errors = []
 
164
        
 
165
        # Browse all given wizard
 
166
        for wiz in self.browse(cr, uid, ids):
 
167
            # Decode file string
 
168
            fileobj = NamedTemporaryFile('w+')
 
169
            fileobj.write(decodestring(wiz.file))
 
170
            # now we determine the file format
 
171
            fileobj.seek(0)
 
172
            # Read CSV file
 
173
            try:
 
174
                reader = csv.reader(fileobj, delimiter=',', quotechar='"')
 
175
            except:
 
176
                fileobj.close()
 
177
                raise osv.except_osv(_('Error'), _('Problem to read given file.'))
 
178
            res = True
 
179
            res_amount = 0.0
 
180
            amount = 0.0
 
181
            # Omit first line that contains columns ' name
 
182
            reader.next()
 
183
            nbline = 1
 
184
            for line in reader:
 
185
                nbline += 1
 
186
                processed += 1
 
187
                try:
 
188
                    update = self.update_hq_entries(cr, uid, line)
 
189
                    created += 1
 
190
                except osv.except_osv, e:
 
191
                    errors.append('Line %s, %s'%(nbline, e.value))
 
192
            fileobj.close()
 
193
        
 
194
        if res:
 
195
            message = _("HQ Entries import successful")
 
196
        context.update({'message': message})
 
197
        
 
198
        if errors:
 
199
            cr.rollback()
 
200
            view_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'msf_homere_interface', 'payroll_import_error')
 
201
        else:
 
202
            view_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'msf_homere_interface', 'payroll_import_confirmation')
 
203
        view_id = view_id and view_id[1] or False
 
204
        
 
205
        # This is to redirect to HQ Entries Tree View
 
206
        context.update({'from': 'hq_entries_import'})
 
207
        
 
208
 
 
209
        res_id = self.pool.get('hr.payroll.import.confirmation').create(cr, uid, {'created': created, 'total': processed, 'state': 'hq', 'errors':"\n".join(errors), 'nberrors': len(errors)})
 
210
        
 
211
        return {
 
212
            'name': 'HQ Entries Import Confirmation',
 
213
            'type': 'ir.actions.act_window',
 
214
            'res_model': 'hr.payroll.import.confirmation',
 
215
            'view_mode': 'form',
 
216
            'view_type': 'form',
 
217
            'view_id': [view_id],
 
218
            'res_id': res_id,
 
219
            'target': 'new',
 
220
            'context': context,
 
221
        }
 
222
 
 
223
hq_entries_import_wizard()
 
224
 
 
225
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: