~mga/openobject-addons/account_india

« back to all changes in this revision

Viewing changes to l10n_ch/dta/dta_wizard.py

  • Committer: ced
  • Date: 2007-08-10 06:48:31 UTC
  • Revision ID: ced-367003b23874c1f4f623d67f85ecabc3d677ca66
Account chart from terp repo

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- encoding: utf-8 -*-
 
2
##############################################################################
 
3
#
 
4
# Copyright (c) 2005-2006 TINY SPRL. (http://tiny.be) All Rights Reserved.
 
5
#
 
6
# WARNING: This program as such is intended to be used by professional
 
7
# programmers who take the whole responsability of assessing all potential
 
8
# consequences resulting from its eventual inadequacies and bugs
 
9
# End users who are looking for a ready-to-use solution with commercial
 
10
# garantees and support are strongly adviced to contract a Free Software
 
11
# Service Company
 
12
#
 
13
# This program is Free Software; you can redistribute it and/or
 
14
# modify it under the terms of the GNU General Public License
 
15
# as published by the Free Software Foundation; either version 2
 
16
# of the License, or (at your option) any later version.
 
17
#
 
18
# This program is distributed in the hope that it will be useful,
 
19
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
20
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
21
# GNU General Public License for more details.
 
22
#
 
23
# You should have received a copy of the GNU General Public License
 
24
# along with this program; if not, write to the Free Software
 
25
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
26
#
 
27
##############################################################################
 
28
import pooler
 
29
import wizard
 
30
import base64 
 
31
from osv import osv
 
32
import time
 
33
import pooler
 
34
import mx.DateTime
 
35
from mx.DateTime import RelativeDateTime, DateTime
 
36
 
 
37
def _bank_get(self, cr, uid, context={}):
 
38
        pool = pooler.get_pool(cr.dbname)
 
39
        partner_id = pool.get('res.users').browse(cr,uid,[uid])[0].company_id.partner_id
 
40
 
 
41
        obj = pool.get('res.partner.bank')
 
42
        ids = obj.search(cr, uid, [('partner_id','=',partner_id.id)])
 
43
        res = obj.read(cr, uid, ids, ['active', 'name'], context)
 
44
        res = [(r['id'], r['name']) for r in res]
 
45
        return res 
 
46
 
 
47
 
 
48
check_form = """<?xml version="1.0"?>
 
49
<form string="DTA file creation">
 
50
<separator colspan="4" string="DTA Details :" />
 
51
        <field name="bank"/>
 
52
        <field name="journal"/>
 
53
        <field name="dta_line_ids" nolabel="1"  colspan="4" />
 
54
</form>
 
55
"""
 
56
 
 
57
check_fields = {
 
58
        'dta_line_ids' : {
 
59
                'string':'DTA lines',
 
60
                'type':'one2many',
 
61
                'relation':'account.dta.line',
 
62
                },
 
63
        'bank' : {
 
64
                'string':'Bank Account',
 
65
                'type':'selection',
 
66
                'selection':_bank_get,
 
67
                'required': True,
 
68
        },
 
69
 
 
70
        'journal' : {
 
71
                'string':'Journal',
 
72
                'type':'many2one',
 
73
                'relation':'account.journal',
 
74
                'domain':"[('type','=','cash')]",
 
75
                'required': True,
 
76
                'help':'The journal used for the bank statement',
 
77
        },
 
78
}
 
79
 
 
80
 
 
81
res_form = """<?xml version="1.0"?>
 
82
<form string="DTA file creation - Results">
 
83
<separator colspan="4" string="Clic on 'Save as' to save the DTA file :" />
 
84
        <field name="dta"/>
 
85
        <separator string="Logs" colspan="4"/>
 
86
        <field name="note" colspan="4" nolabel="1"/>
 
87
</form>
 
88
"""
 
89
 
 
90
res_fields = {
 
91
        'dta' : {
 
92
                'string':'DTA File',
 
93
                'type':'binary',
 
94
                'required':True,
 
95
                'readonly':True,
 
96
        },
 
97
        'note' : {'string':'Log','type':'text'}
 
98
}
 
99
 
 
100
 
 
101
def _get_bank(self,cr,uid,data,context):
 
102
        pool = pooler.get_pool(cr.dbname)
 
103
        user = pool.get('res.users').browse(cr,uid,[uid])[0]
 
104
        company= user.company_id
 
105
        
 
106
        if company.partner_id.bank_ids:
 
107
                bank = company.partner_id.bank_ids[0]
 
108
                return {'bank':bank.bank_name,'bank_code':bank.bank_code or ''} # 'city':'',
 
109
 
 
110
        return {}
 
111
 
 
112
 
 
113
def _get_dta_lines(self,cr,uid,data,context):
 
114
        pool = pooler.get_pool(cr.dbname)
 
115
 
 
116
        res= {}
 
117
 
 
118
        user = pool.get('res.users').browse(cr,uid,[uid])[0]
 
119
        company= user.company_id
 
120
        
 
121
        if company.partner_id.bank_ids:
 
122
                bank = company.partner_id.bank_ids[0]
 
123
                res.update({'bank':bank.bank_name,'bank_code':bank.bank_code or ''}) # 'city':'',
 
124
 
 
125
 
 
126
        dta_line_obj = pool.get('account.dta.line')
 
127
        lines=[]
 
128
 
 
129
        id_dta= pool.get('account.dta').create(cr,uid,{
 
130
                'date':time.strftime('%Y-%m-%d'),
 
131
                'user_id':uid,
 
132
                })
 
133
 
 
134
 
 
135
        for i in pool.get('account.invoice').browse(cr,uid,data['ids']):
 
136
                if i.dta_state in ['none','paid'] or i.state in ['draft','cancel','paid']:
 
137
                        continue
 
138
 
 
139
                cash_disc_date=""
 
140
                discount=""
 
141
                if i.payment_term :
 
142
                        disc_list= pool.get('account.payment.term').get_discounts(cr,uid,i.payment_term.id, i.date_invoice)
 
143
 
 
144
                        for (cash_disc_date,discount) in disc_list:
 
145
                                if cash_disc_date >= time.strftime('%Y-%m-%d'):
 
146
                                        break
 
147
 
 
148
                
 
149
                lines.append(dta_line_obj.create(cr,uid,{
 
150
                        'name': i.id,
 
151
                        'partner_id': i.partner_id.id,
 
152
                        'due_date': i.date_due,
 
153
                        'invoice_date': i.date_invoice,
 
154
                        'cashdisc_date': cash_disc_date and cash_disc_date or None,
 
155
                        'amount_to_pay': discount and i.amount_total*(1-discount) or i.amount_total,
 
156
                        'amount_invoice': i.amount_total,
 
157
                        'amount_cashdisc': discount and i.amount_total*(1-discount),
 
158
                        'dta_id': id_dta,
 
159
                        }))
 
160
                
 
161
        res.update({'dta_line_ids': lines,'dta_id': id_dta})
 
162
        return res
 
163
 
 
164
 
 
165
 
 
166
trans=[(u'é','e'),
 
167
           (u'è','e'),
 
168
           (u'à','a'),
 
169
           (u'ê','e'),
 
170
           (u'î','i'),
 
171
           (u'ï','i'),
 
172
           (u'â','a'),
 
173
           (u'ä','a')]
 
174
def tr(s):
 
175
        s= s.decode('utf-8')
 
176
 
 
177
        for k in trans:
 
178
                s = s.replace(k[0],k[1])
 
179
 
 
180
        try:
 
181
                res= s.encode('ascii','replace')
 
182
        except:
 
183
                res = s
 
184
        return res
 
185
                
 
186
class record:
 
187
        def __init__(self,global_context_dict):
 
188
 
 
189
                for i in global_context_dict:
 
190
                        global_context_dict[i]= global_context_dict[i] and tr(global_context_dict[i])
 
191
                self.fields = []
 
192
                self.global_values = global_context_dict
 
193
                self.pre={'padding':'','seg_num1':'01','seg_num2':'02',
 
194
                                  'seg_num3':'03','seg_num4':'04','seg_num5':'05',
 
195
                                   'flag':'0', 'zero5':'00000'
 
196
                                                   }
 
197
                self.post={'date_value_hdr':'000000','type_paiement':'0'}
 
198
                self.init_local_context()
 
199
 
 
200
        def init_local_context(self):
 
201
                """
 
202
                Must instanciate a fields list, field = (name,size)
 
203
                and update a local_values dict.
 
204
                """
 
205
                raise Exception, "not implemented"
 
206
 
 
207
        def generate(self):
 
208
                res=''
 
209
                for field in self.fields :
 
210
                        if self.pre.has_key(field[0]):
 
211
                                value = self.pre[field[0]]
 
212
                        elif self.global_values.has_key(field[0]):
 
213
                                value = self.global_values[field[0]]
 
214
                        elif self.post.has_key(field[0]):
 
215
                                value = self.post[field[0]]
 
216
                        else :
 
217
                                pass
 
218
                                #raise Exception(field[0]+' not found !')
 
219
 
 
220
                        try:
 
221
                                res = res + c_ljust(value, field[1])
 
222
                        except :
 
223
                                pass
 
224
                        
 
225
                return res
 
226
 
 
227
class record_gt826(record):
 
228
        # -> bvr
 
229
        def init_local_context(self):
 
230
                self.fields=[
 
231
                        ('seg_num1',2),
 
232
                        #header
 
233
                        ('date_value_hdr',6),('partner_bank_clearing',12),('zero5',5),('creation_date',6),
 
234
                        ('comp_bank_clearing',7), ('uid',5), 
 
235
                        ('sequence',5),
 
236
                        ('genre_trans',3),
 
237
                        ('type_paiement',1),('flag',1),
 
238
                        #seg1
 
239
                        ('comp_dta',5),('invoice_number',11),('comp_bank_iban',24),('date_value',6),
 
240
                        ('invoice_currency',3),('amount_to_pay',12),('padding',14),
 
241
                        #seg2
 
242
                        ('seg_num2',2),('comp_name',20),('comp_street',20),('comp_zip',10),
 
243
                        ('comp_city',10),('comp_country',20),('padding',46),
 
244
                        #seg3
 
245
                        ('seg_num3',2),('partner_bvr',12),#numero d'adherent bvr
 
246
                        ('partner_name',20),('partner_street',20),('partner_zip',10),
 
247
                        ('partner_city',10),('partner_country',20),
 
248
                        ('invoice_bvr_num',27),#communication structuree
 
249
                        ('padding',2),#cle de controle
 
250
                        ('padding',5)
 
251
                        ]
 
252
 
 
253
                self.pre.update({'date_value_hdr': self.global_values['date_value'],
 
254
                                                 'date_value':'',
 
255
                                                 'partner_bank_clearing':'','partner_cpt_benef':'',
 
256
                                                 'genre_trans':'826',
 
257
                                                 'conv_cours':'', 'option_id_bank':'D',
 
258
                                                 'partner_bvr' : '/C/'+ self.global_values['partner_bvr'],
 
259
                                                 'ref2':'','ref3':'', 
 
260
                                                 'format':'0'})
 
261
 
 
262
class record_gt827(record):
 
263
        # -> interne suisse
 
264
        def init_local_context(self):
 
265
                self.fields=[
 
266
                        ('seg_num1',2),
 
267
                        #header
 
268
                        ('date_value_hdr',6),('partner_bank_clearing',12),('zero5',5),('creation_date',6),
 
269
                        ('comp_bank_clearing',7), ('uid',5), 
 
270
                        ('sequence',5),
 
271
                        ('genre_trans',3),
 
272
                        ('type_paiement',1),('flag',1),
 
273
                        #seg1
 
274
                        ('comp_dta',5),('invoice_number',11),('comp_bank_iban',24),('date_value',6),
 
275
                        ('invoice_currency',3),('amount_to_pay',12),('padding',14),
 
276
                        #seg2
 
277
                        ('seg_num2',2),('comp_name',20),('comp_street',20),('comp_zip',10), 
 
278
                        ('comp_city',10),('comp_country',20),('padding',46),
 
279
                        #seg3
 
280
                        ('seg_num3',2),('partner_bank_number',30),
 
281
                        ('partner_name',24),('partner_street',24),('partner_zip',12),
 
282
                        ('partner_city',12),('partner_country',24),
 
283
                        #seg4
 
284
                        ('seg_num4',2),('partner_comment',112),('padding',14),
 
285
                        #seg5
 
286
                        #('padding',128)
 
287
                        ]
 
288
 
 
289
                self.pre.update({'date_value_hdr': self.global_values['date_value'],
 
290
                                                 'date_value':'',                                                
 
291
                                                 'partner_cpt_benef':'',
 
292
                                                 'type_paiement':'0', 'genre_trans':'827',
 
293
                                                 'conv_cours':'', 'option_id_bank':'D',
 
294
                                                 'ref2':'','ref3':'', 
 
295
                                                 'format':'0'})
 
296
 
 
297
 
 
298
 
 
299
 
 
300
class record_gt836(record):
 
301
        # -> iban
 
302
        def init_local_context(self):
 
303
                self.fields=[
 
304
                        ('seg_num1',2),
 
305
                        #header
 
306
                        ('date_value_hdr',6),('partner_bank_clearing',12),('zero5',5),('creation_date',6),
 
307
                        ('comp_bank_clearing',7), ('uid',5), 
 
308
                        ('sequence',5),
 
309
                        ('genre_trans',3),
 
310
                        ('type_paiement',1),('flag',1),
 
311
                        #seg1
 
312
                        ('comp_dta',5),('invoice_number',11),('comp_bank_iban',24),('date_value',6),
 
313
                        ('invoice_currency',3),('amount_to_pay',15),('padding',11),
 
314
                        #seg2
 
315
                        ('seg_num2',2),('conv_cours',12),('comp_name',35),('comp_street',35),('comp_country',3),('comp_zip',10),
 
316
                        ('comp_city',22),('padding',9),
 
317
                        #seg3
 
318
                        ('seg_num3',2),('option_id_bank',1),('partner_bank_ident',70),
 
319
                        ('partner_bank_iban',34),('padding',21),
 
320
                        #seg4
 
321
                        ('seg_num4',2),('partner_name',35),('partner_street',35),('partner_country',3),('partner_zip',10),('partner_city',22),
 
322
                        ('padding',21),
 
323
                        #seg5
 
324
                        ('seg_num5',2),('option_motif',1),('invoice_reference',105),('format',1),('padding',19)
 
325
                ]
 
326
 
 
327
                self.pre.update( {
 
328
                        'partner_bank_clearing':'','partner_cpt_benef':'',
 
329
                        'type_paiement':'0','genre_trans':'836',
 
330
                        'conv_cours':'',
 
331
                        'invoice_reference': self.global_values['invoice_reference'] or self.global_values['partner_comment'],
 
332
                        'ref2':'','ref3':'',
 
333
                        'format':'0'
 
334
                })
 
335
                self.post.update({'comp_dta':'','option_motif':'U'})
 
336
 
 
337
 
 
338
class record_gt890(record):
 
339
        # -> total
 
340
        def init_local_context(self):
 
341
                self.fields=[
 
342
                        ('seg_num1',2),
 
343
                        #header
 
344
                        ('date_value_hdr',6),('partner_bank_clearing',12),('zero5',5),('creation_date',6),
 
345
                        ('comp_bank_clearing',7), ('uid',5), 
 
346
                        ('sequence',5),
 
347
                        ('genre_trans',3),
 
348
                        ('type_paiement',1),('flag',1),
 
349
                        #total
 
350
                        ('amount_total',16),('padding',59)]
 
351
 
 
352
                self.pre.update({'partner_bank_clearing':'','partner_cpt_benef':'',
 
353
                                                          'company_bank_clearing':'','genre_trans':'890'})
 
354
                        
 
355
def c_ljust(s, size):
 
356
        """
 
357
        check before calling ljust
 
358
        """
 
359
        s= s or ''
 
360
        if len(s) > size:
 
361
                s= s[:size]
 
362
        s = s.decode('utf-8').encode('latin1','replace').ljust(size)
 
363
        return s
 
364
 
 
365
 
 
366
 
 
367
def _create_dta(self,cr,uid,data,context):
 
368
 
 
369
        # cree des gt836
 
370
        v={}
 
371
        v['uid'] = str(uid)
 
372
        v['creation_date']= time.strftime('%y%m%d')
 
373
        log=''
 
374
        dta=''
 
375
 
 
376
        pool = pooler.get_pool(cr.dbname)
 
377
        bank= pool.get('res.partner.bank').browse(cr,uid,[data['form']['bank']])[0]
 
378
 
 
379
        if not bank:
 
380
                return {'note':'No bank account for the company.'}
 
381
        
 
382
 
 
383
        v['comp_bank_name']= bank.name or False
 
384
        v['comp_bank_clearing'] = bank.bank_clearing or False # clearing 
 
385
        v['comp_bank_code'] = bank.bank_code or False # swift or BIC
 
386
 
 
387
        if not v['comp_bank_clearing']:
 
388
                return {'note':'You must provide a Clearing Number for your bank account.'}
 
389
        
 
390
        user = pool.get('res.users').browse(cr,uid,[uid])[0]
 
391
        company= user.company_id
 
392
        co_addr= company.partner_id.address[0]
 
393
        v['comp_country'] = co_addr.country_id and co_addr.country_id.name or ''
 
394
        v['comp_street'] = co_addr.street or ''
 
395
        v['comp_zip'] = co_addr.zip
 
396
        v['comp_city'] = co_addr.city
 
397
        v['comp_name'] = co_addr.name
 
398
        
 
399
        v['comp_dta'] = ''#FIXME
 
400
 
 
401
 
 
402
        v['comp_bank_number'] = bank.number or ''
 
403
 
 
404
        v['comp_bank_iban'] = bank.iban or ''
 
405
        if not v['comp_bank_iban'] : 
 
406
                return {'note':'No iban number for the company bank account.'}
 
407
 
 
408
        
 
409
        inv_obj = pool.get('account.invoice')
 
410
        dta_line_obj = pool.get('account.dta.line')
 
411
 
 
412
        seq= 1
 
413
        amount_tot = 0
 
414
        th_amount_tot= 0
 
415
        dta_id=data['form']['dta_id']
 
416
 
 
417
        if not dta_id :
 
418
                return {'note':'No dta line'}
 
419
 
 
420
        # write the bank account for the dta object
 
421
        pool.get('account.dta').write(cr,uid,[dta_id],{'bank':data['form']['bank']})
 
422
 
 
423
        dta_line_ids= []
 
424
 
 
425
        for line in data['form']['dta_line_ids']:
 
426
                if  line[1]!=0 and line[2] and line[2]['partner_id']:
 
427
                        dta_line_ids.append(line[1])
 
428
                        th_amount_tot += line[2]['amount_to_pay']
 
429
                        dta_line_obj.write(cr, uid, [line[1]] , line[2] )
 
430
 
 
431
 
 
432
        # creation of a bank statement : TODO ajouter le partner 
 
433
        bk_st_id = pool.get('account.bank.statement').create(cr,uid,{
 
434
                'journal_id':data['form']['journal'],
 
435
                'balance_start':0,
 
436
                'balance_end_real':0, 
 
437
                'state':'draft',
 
438
                })
 
439
 
 
440
        for dtal in dta_line_obj.browse(cr,uid,dta_line_ids):
 
441
 
 
442
                i = dtal.name #dta_line.name is the invoice id
 
443
                invoice_number = i.number or '??'
 
444
                if not i.partner_bank_id:
 
445
                        log= log +'\nNo partner bank defined. (invoice '+ invoice_number +')' 
 
446
                        continue
 
447
                                
 
448
                
 
449
                v['sequence'] = str(seq).rjust(5).replace(' ','0')
 
450
                v['amount_to_pay']= str(dtal.amount_to_pay).replace('.',',')
 
451
                v['invoice_number'] = invoice_number or ''
 
452
                v['invoice_currency'] = i.currency_id.code or ''
 
453
                if not v['invoice_currency'] :
 
454
                        log= log +'\nInvoice currency code undefined. (invoice '+ invoice_number +')' 
 
455
                        continue
 
456
 
 
457
                
 
458
                v['partner_bank_name'] =  i.partner_bank_id.bank_name or False
 
459
                v['partner_bank_clearing'] =  i.partner_bank_id.bank_clearing or False
 
460
                if not v['partner_bank_name'] :
 
461
                        log= log +'\nPartner bank account not well defined. (invoice '+ invoice_number +')' 
 
462
                        continue
 
463
 
 
464
                v['partner_bank_iban']=  i.partner_bank_id.iban or False
 
465
                v['partner_bank_number']=  i.partner_bank_id.number  and i.partner_bank_id.number.replace('.','').replace('-','') or  False
 
466
                
 
467
                v['partner_bvr']= i.partner_bank_id.bvr_number or ''
 
468
                
 
469
                if v['partner_bvr']:
 
470
                        v['partner_bvr']= v['partner_bvr'].replace('-','')
 
471
                        if len(v['partner_bvr']) < 9:
 
472
                                v['partner_bvr']= v['partner_bvr'][:2]+ '0'*(9-len(v['partner_bvr'])) +v['partner_bvr'][2:]
 
473
 
 
474
 
 
475
 
 
476
                v['partner_bank_city']= i.partner_bank_id.city or False
 
477
                v['partner_bank_street']= i.partner_bank_id.street or ''
 
478
                v['partner_bank_zip']= i.partner_bank_id.zip or ''
 
479
                v['partner_bank_country']= i.partner_bank_id.country_id  and i.partner_bank_id.country_id.name or ''
 
480
                v['partner_bank_code']= i.partner_bank_id.bank_code or False
 
481
                v['invoice_reference']= i.reference
 
482
                v['invoice_bvr_num']= i.bvr_ref_num
 
483
                if v['invoice_bvr_num']:
 
484
                        v['invoice_bvr_num'] = v['invoice_bvr_num'].replace(' ', '').rjust(27).replace(' ','0')
 
485
                        
 
486
                v['partner_comment']= i.partner_comment
 
487
                
 
488
                v['partner_name'] = i.partner_id and i.partner_id.name or ''
 
489
                if i.partner_id and i.partner_id.address and i.partner_id.address[0]:
 
490
                        v['partner_street'] = i.partner_id.address[0].street
 
491
                        v['partner_city']= i.partner_id.address[0].city
 
492
                        v['partner_zip']= i.partner_id.address[0].zip
 
493
                        # If iban => country=country code for space reason
 
494
                        elec_pay = i.partner_bank_id.type_id.elec_pay
 
495
                        if elec_pay == 'iban':
 
496
                                v['partner_country']= i.partner_id.address[0].country_id and i.partner_id.address[0].country_id.code+'-' or ''
 
497
                        else:
 
498
                                v['partner_country']= i.partner_id.address[0].country_id and i.partner_id.address[0].country_id.name or ''
 
499
                else:
 
500
                        v['partner_street'] =''
 
501
                        v['partner_city']= ''
 
502
                        v['partner_zip']= ''
 
503
                        v['partner_country']= ''
 
504
                        log= log +'\nNo address for the invoice partner. (invoice '+ invoice_number+')' 
 
505
 
 
506
                
 
507
                date_value = dtal.cashdisc_date or dtal.due_date
 
508
                if date_value :
 
509
                        date_value = mx.DateTime.strptime( date_value,'%Y-%m-%d') or  mx.DateTime.now()
 
510
                        v['date_value'] = date_value.strftime("%y%m%d")
 
511
                else:
 
512
                        v['date_value'] = "000000"
 
513
 
 
514
                # si compte iban -> iban (836)
 
515
                # si payment structure  -> bvr (826)
 
516
                # si non -> (827) 
 
517
 
 
518
                elec_pay = i.partner_bank_id.type_id.elec_pay
 
519
                if not elec_pay :
 
520
                        log= log +'\nBank type does not support DTA. (invoice '+ invoice_number +')' 
 
521
                        continue
 
522
 
 
523
                if elec_pay == 'iban':
 
524
                        # If iban => country=country code for space reason
 
525
                        v['comp_country'] = co_addr.country_id and co_addr.country_id.code+'-' or ''
 
526
                        record_type = record_gt836
 
527
                        if not v['partner_bank_iban']:
 
528
                                log= log +'\nNo iban number for the partner bank. (invoice '+ invoice_number +')' 
 
529
                                continue
 
530
 
 
531
                        if v['partner_bank_code'] :
 
532
                                v['option_id_bank']= 'A'
 
533
                                v['partner_bank_ident']= v['partner_bank_code']
 
534
                        elif v['partner_bank_city']:
 
535
                                #
 
536
                                # added by fabien
 
537
                                #
 
538
                                log= log +'\nCode IBAN or Swift code doesn t exist. (invoice '+ invoice_number +')' 
 
539
                                continue
 
540
 
 
541
                                v['option_id_bank']= 'D'
 
542
                                v['partner_bank_ident']= v['partner_bank_name'] +' '+v['partner_bank_street']\
 
543
                                        +' '+v['partner_bank_zip']+' '+v['partner_bank_city']\
 
544
                                        +' '+v['partner_bank_country']
 
545
                        else:
 
546
                                log= log +'\nYou must provide the bank city or the bank code. (invoice '+ invoice_number +')' 
 
547
                                continue
 
548
 
 
549
                        
 
550
                elif elec_pay == 'bvrbank' or elec_pay == 'bvrpost':
 
551
                        if not v['invoice_bvr_num']:
 
552
                                log= log +'\nYou must provide an Bvr reference number. (invoice '+ invoice_number +')' 
 
553
                                continue
 
554
                        if not v['partner_bvr']:
 
555
                                log= log +'\nYou must provide a BVR reference number in the partner bank. (invoice '+ invoice_number +')' 
 
556
                                continue
 
557
                        record_type = record_gt826
 
558
                        
 
559
                        
 
560
                        
 
561
                elif elec_pay == 'bvbank':
 
562
                        if not v['partner_bank_number'] :
 
563
                                if  v['partner_bank_iban'] :
 
564
                                        v['partner_bank_number']= v['partner_bank_iban'] 
 
565
                                else:
 
566
                                        log= log +'\nYou must provide a bank number in the partner bank. (invoice '+ invoice_number +')' 
 
567
                                        continue
 
568
 
 
569
                        if not  v['partner_bank_clearing']:
 
570
                                log= log +'\nPartner bank must have a Clearing Number for a BV Bank operation. (invoice '+ invoice_number +')' 
 
571
                                continue
 
572
                        v['partner_bank_number'] = '/C/'+v['partner_bank_number']
 
573
                        record_type = record_gt827
 
574
 
 
575
                        
 
576
                elif elec_pay == 'bvpost':
 
577
                        if not v['partner_bank_number']:
 
578
                                log= log +'\nYou must provide a post number in the partner bank. (invoice '+ invoice_number +')' 
 
579
                                continue
 
580
                        v['partner_bank_clearing']= ''
 
581
                        v['partner_bank_number'] = '/C/'+v['partner_bank_number']
 
582
                        record_type = record_gt827
 
583
                        
 
584
                else:
 
585
                        log= log +'\nBank type not supported. (invoice '+ invoice_number +')' 
 
586
                        continue
 
587
 
 
588
 
 
589
                try:
 
590
                        dta_line = record_type(v).generate()
 
591
                except Exception,e :
 
592
                        log= log +'\nERROR:'+ str(e)+'(invoice '+ invoice_number+')' 
 
593
                        dta_line_obj.write(cr,uid,[dtal.id],{'state':'cancel'})                 
 
594
                        raise
 
595
                        continue
 
596
 
 
597
                #logging
 
598
                log = log + "Invoice : %s, Amount paid : %d %s, Value date : %s, State : Paid."%\
 
599
                          (invoice_number,dtal.amount_to_pay,v['invoice_currency'],date_value and date_value.strftime("%Y-%m-%d") or 'Empty date')
 
600
 
 
601
                reconcile_id = pool.get('account.bank.statement.reconcile').create(cr, uid, {
 
602
                        'name': time.strftime('%Y-%m-%d'),
 
603
                        'line_ids': [(6, 0, i.move_line_id_payment_get(cr, uid, [i.id]))],
 
604
                        })
 
605
 
 
606
                pool.get('account.bank.statement.line').create(cr,uid,{
 
607
                        'name':i.number,
 
608
                        'date': time.strftime('%Y-%m-%d'),
 
609
                        'amount': -dtal.amount_to_pay,
 
610
                        'type':{'out_invoice':'customer','in_invoice':'supplier','out_refund':'customer','in_refund':'supplier'}[i.type],
 
611
                        'partner_id':i.partner_id.id,
 
612
                        'account_id':i.account_id.id,
 
613
                        'statement_id': bk_st_id,
 
614
                        'reconcile_id': reconcile_id,
 
615
                        })
 
616
 
 
617
                dta = dta + dta_line
 
618
                amount_tot += dtal.amount_to_pay
 
619
                inv_obj.write(cr,uid,[i.id],{'dta_state':'paid'})
 
620
                dta_line_obj.write(cr,uid,[dtal.id],{'state':'done'})
 
621
                seq += 1
 
622
                
 
623
        # bank statement updated with the total amount :
 
624
        pool.get('account.bank.statement').write(cr,uid,[bk_st_id],{'balance_end_real': -amount_tot})
 
625
        
 
626
        # segment total
 
627
        v['amount_total'] = str(amount_tot).replace('.',',')
 
628
        v['sequence'] = str(seq).rjust(5).replace(' ','0')      
 
629
        try:
 
630
                if dta :
 
631
                        dta = dta + record_gt890(v).generate()
 
632
        except Exception,e :
 
633
                log= log +'\n'+ str(e) + 'CORRUPTED FILE !\n'
 
634
                raise
 
635
                
 
636
 
 
637
        log = log + "\n--\nSummary :\nTotal amount paid : %.2f\nTotal amount expected : %.2f"%(amount_tot,th_amount_tot) 
 
638
        pool.get('account.dta').write(cr,uid,[dta_id],{'note':log,'name':base64.encodestring(dta or "")})
 
639
        
 
640
        return {'note':log, 'dta': base64.encodestring(dta)}
 
641
 
 
642
 
 
643
 
 
644
class wizard_dta_create(wizard.interface):
 
645
        states = {
 
646
                
 
647
                'init':{
 
648
                'actions' : [_get_dta_lines],
 
649
                'result' : {'type' : 'form',
 
650
                                    'arch' : check_form,
 
651
                                    'fields' : check_fields,
 
652
                                    'state' : [('end', 'Cancel'),('creation', 'Yes') ]}
 
653
                },
 
654
 
 
655
                'creation' : {
 
656
                        'actions' : [_create_dta],
 
657
                        'result' : {'type' : 'form',
 
658
                                                'arch' : res_form,
 
659
                                                'fields' : res_fields,
 
660
                                                'state' : [('end', 'Quit') ]}
 
661
                },
 
662
 
 
663
        }
 
664
 
 
665
wizard_dta_create('account.dta_create')