21
24
##############################################################################
22
25
from osv import osv
23
26
from osv import fields
24
from tools.translate import _
27
Enter the pattern of the accounts, for example:
31
Sub-Accounts: 122333444,
32
Accounts Aux.: 1223334445555
33
Then type: 1, 122, 122333, 122333444, 122333444555
36
__RES_PARTNER_ACCOUNT_HELP__ = _('''
37
This account is used to establish the father of the partners
38
that have the classification this group, together with the sequence,
39
so that if this account has a structure, 107003, then the partner,
40
you have this classification, will have an account as which is 1070030005,
41
if the pattern of accounts in the company is:
30
Escriba el Patron de las cuentas, su estructura, por ejemplo:
34
Subcuentas: 122333444,
35
Cuentas Aux.: 1223334445555
36
Entonces escriba: 1, 122, 122333, 122333444, 122333444555
41
('receivable','Cuenta x Cobrar'),
42
('payable','Cuenta x Pagar'),
45
__res_partner_account_help__ = '''
46
Esta cuenta se usará para establecer el padre
47
de los partners que tengan como clasificacion
48
este Grupo, en conjunto con la secuencia, de
49
tal manera que si esta cuenta tiene una estruc-
50
tura, 107003, entonces el partner, que tenga
51
esta clasificacion, tendra una cuenta como la
52
que sigue 1070030005, si el patron de cuentas
42
54
1, 122, 122333, 1223334444
44
It is noteworthy that the account that is selected here must be of the last in the pattern,
45
which for this example is:
46
107003 and 122333 square with the provisions
49
__RES_PARTNER_ACCOUNT_HELP_DEFAULT__ =_('''
50
This account will be established as the account book to use in case the company
51
does not perform operations such as supplier or customer, depending on the case
55
('receivable','Receivable'),
56
('payable','Payable'),
55
Es de notarse que la cuenta que aqui se sele-
56
cciona debe ser del tipo del ultimo en el pa-
57
tron, que para este ejemplo es:
58
107003 y cuadra con lo establecido 122333
60
__res_partner_account_help_default__ = '''
61
Esta cuenta se establecera como la cuenta con-
62
table a usar en el caso de que la empresa no -
63
realice operaciones como proveedor o como cliente,
68
'customer': ('property_account_receivable', 'account_kind_rec', 'Cuenta x Cobrar'),
69
'supplier': ('property_account_payable', 'account_kind_pay', 'Cuenta x Pagar'),
59
72
class res_partner_account(osv.osv):
61
OpenERP Model : res_partner_account
73
_name = 'res.partner.account'
74
_description = 'Partner Accounting Classification'
81
'property_account_partner': fields.property(
84
relation='account.account',
85
string="Cuenta Anfitriona",
88
domain="[('type', '=', 'view')]",
89
help=__res_partner_account_help__,
92
'property_account_partner_default': fields.property(
95
relation='account.account',
96
string="Cuenta Contable por Defecto",
99
domain="[('type', '!=', 'view'),('parent_id', '=', property_account_partner), ('company_id', '=', company_id), ('reconcile', '=', True), ('user_type', '=', user_type), ('type', '=', type),('auto', '=', True), ]",
100
help=__res_partner_account_help_default__,
103
'company_id':fields.many2one(
107
'user_type': fields.many2one(
108
'account.account.type',
111
'type': fields.selection(
118
('name_uniq','unique(name)', 'Otro registro ya tiene este nombre!'),
119
('account_uniq','unique(property_account_partner)', 'Otro registro ya esta usando esta Cuenta!'),
64
122
def _check(self, cr, uid, vals):
65
accounts=[vals['property_account_partner']]
123
cuentas=[vals['property_account_partner']]
66
124
pattern = self.pool.get('res.company').browse(cr, uid, vals['company_id']).pattern
67
self.pool.get('res.company')._check_accounts(cr, uid, pattern, accounts)
125
self.pool.get('res.company')._check_accounts(cr, uid, pattern, cuentas)
126
#~ vals['name'] = self._get_name(cr, uid, cuentas)
71
def _get_name(self, cr, uid, accounts):
129
def _get_name(self, cr, uid, cuentas):
72
130
obj = self.pool.get('account.account')
73
code = obj.browse(cr,uid,accounts[0]).code
74
name = obj.browse(cr,uid,accounts[0]).name
75
print "-...................-GETTING THE NAME"
76
print u'%s %s'%(code, name)
131
code = obj.browse(cr,uid,cuentas[0]).code
132
name = obj.browse(cr,uid,cuentas[0]).name
78
133
return u'%s %s'%(code, name)
80
135
def create(self, cr, uid, vals, context=None):
81
136
self._check(cr, uid, vals)
83
137
return super(res_partner_account, self).create(cr, uid, vals, context)
85
139
def write(self, cr, uid, ids, vals, context=None):
140
if not vals.get('company_id',False):
141
vals.update({'company_id':self.browse(cr, uid, ids[0],context=context).company_id.id})
86
142
self._check(cr, uid, vals)
88
143
return super(res_partner_account, self).write(cr, uid, ids, vals, context)
90
145
def _get_account(self, cr, uid, kind_id, account_name, do_account=False, account_id=None, do_write=False, context=None):
96
151
company_id = obj.company_id.id
97
152
user_type = obj.user_type.id
99
155
aa_obj = self.pool.get('account.account')
100
156
if do_write == False:
101
account_id = aa_obj.create(cr, uid,{
102
'auto': True,'name': u'%s - %s'%(parent_name.decode('utf-8').upper(), account_name.decode('utf-8').upper()),
103
'user_type': user_type,'type': type,'company_id':company_id,'currency_mode':'current','active':True,
104
'reconcile': True, 'parent_id':parent_id,
157
account_id = aa_obj.create(cr, uid, {
159
'name': u'%s - %s'%(parent_name.decode('utf-8').upper(), account_name.decode('utf-8').upper()),
160
'user_type': user_type,
162
'company_id':company_id,
163
'currency_mode':'current',
166
'parent_id':parent_id,
107
169
return account_id
111
'code': codigo,'name': u'%s - %s'%(parent_name.decode('utf-8').upper(), account_name.decode('utf-8').upper()),
112
'user_type': user_type,'company_id':company_id,'currency_mode':'current','active': True,'reconcile': True,'parent_id':parent_id,
173
'name': u'%s - %s'%(parent_name.decode('utf-8').upper(), account_name.decode('utf-8').upper()),
174
'user_type': user_type,
175
'company_id':company_id,
176
'currency_mode':'current',
179
'parent_id':parent_id,
118
_name = 'res.partner.account'
119
_description = 'Partner Accounting Classification'
123
'name':fields.char('Name',size = 128,required = True,readonly = False,),
124
'property_account_partner': fields.property('account.account',type='many2one',relation='account.account',string="Host account",method=True,view_load=True,domain="[('type','=','view')]",help=__RES_PARTNER_ACCOUNT_HELP__,required=True,readonly=False),
125
'property_account_partner_default': fields.property('account.account',type='many2one',relation='account.account',
126
string="Accounting Default Account",method=True,view_load=True,domain="[('type','<>','view'),('parent_id','=',property_account_partner),('company_id','=',company_id),('reconcile','=',True),('user_type','=',user_type),('type','=',type),]",help=__RES_PARTNER_ACCOUNT_HELP_DEFAULT__,required=True,readonly=False),
127
'company_id':fields.many2one('res.company','Company',required = True),
128
'user_type': fields.many2one('account.account.type','Account type',required=True),
129
'type': fields.selection(__TYPE__,'Type',readonly=False,required=True),
134
('name_uniq','unique(name)', 'Another record already has this name!'),
135
('account_uniq','unique(property_account_partner)', 'Another record already used this Account!'),
138
182
res_partner_account()
140
184
class res_partner(osv.osv):
185
_inherit = 'res.partner'
188
'property_account_payable': fields.property(
191
relation='account.account',
192
string="Account Payable",
195
domain="[('type', '=', 'payable')]",
196
help="This account will be used instead of the default one as the payable account for the current partner",
200
'property_account_receivable': fields.property(
203
relation='account.account',
204
string="Account Receivable",
207
domain="[('type', '=', 'receivable')]",
208
help="This account will be used instead of the default one as the receivable account for the current partner",
212
'account_kind_rec':fields.property(
213
'res.partner.account',
215
relation='res.partner.account',
216
string='Tipo de CxC',
219
domain="[('type', '=', 'receivable')]",
220
help="Este Concepto le permite generar las CxC para\nla empresa de acuerdo a la cuenta contable\ndel grupo en el cual se clasifica",
223
'account_kind_pay':fields.property(
224
'res.partner.account',
226
relation='res.partner.account',
227
string='Tipo de CxP',
230
domain="[('type', '=', 'payable')]",
231
help="Este Concepto le permite generar las CxP para\nla empresa de acuerdo a la cuenta contable\ndel grupo en el cual se clasifica",
142
236
def create(self, cr, uid, vals, context=None):
143
rpa = self.pool.get('res.partner.account')
144
vals['property_account_payable'] = rpa._get_account(cr, uid, vals['account_kind_pay'], vals['name'], vals['supplier'])
145
vals['property_account_receivable'] = rpa._get_account(cr, uid, vals['account_kind_rec'], vals['name'], vals['customer'])
239
attributes = ['customer','supplier','name']
240
previous_accounts = {}
244
if not previous_accounts.has_key(attr):
245
previous_accounts.update({attr:False})
249
if not previous_accounts.has_key(attr):
250
previous_accounts.update({attr:False})
252
for attr in attributes:
253
if not previous_accounts.has_key(attr):
254
previous_accounts.update({attr:False})
257
context.update({'previous_accounts':previous_accounts})
260
#~ OBTENIENDO LAS CUENTAS CONTABLES QUE NO SE ACTUALIZARON
263
if not vals.has_key(attr):
264
vals.update({attr:False})
268
if not vals.has_key(attr):
269
vals.update({attr:False})
271
for attr in attributes:
272
if not vals.has_key(attr):
273
vals.update({attr:False})
274
vals.update(self._update_code(cr, uid, None, vals, context=context))
147
275
return super(res_partner, self).create(cr, uid, vals, context)
149
def _do_refresh(self, cr, uid, ids, vals, ctxt=None):
150
def _check_default(kind, account, type):
151
if kind and kind.property_account_partner_default and kind.property_account_partner_default.id == account.id:
277
def _switch_accounts(self, cr, uid, ids, k,vals, context=None):
282
aml_obj = self.pool.get('account.move.line')
283
ai_obj = self.pool.get('account.invoice')
284
avl_obj = self.pool.get('account.voucher.line')
288
if context.get('previous_accounts',False):
289
previous_accounts = context['previous_accounts']
291
aml_ids = aml_obj.search(cr, uid, [('account_id','=',previous_accounts[__ACC__[k][0]]),('partner_id','in',ids)],context=context)
292
ai_ids = ai_obj.search(cr, uid, [('account_id','=',previous_accounts[__ACC__[k][0]]),('partner_id','in',ids)],context=context)
293
avl_ids = avl_obj.search(cr, uid, [('account_id','=',previous_accounts[__ACC__[k][0]]),('partner_id','in',ids)],context=context)
296
cr.execute('UPDATE account_move_line SET account_id = %s WHERE id in (%s)'%(vals[__ACC__[k][0]],', '.join([str(i) for i in aml_ids])))
299
cr.execute('UPDATE account_invoice SET account_id = %s WHERE id in (%s)'%(vals[__ACC__[k][0]],', '.join([str(i) for i in ai_ids])))
302
cr.execute('UPDATE account_voucher_line SET account_id = %s WHERE id in (%s)'%(vals[__ACC__[k][0]],', '.join([str(i) for i in avl_ids])))
306
def _check_unique(self,cr,uid,ids,k,vals,context=None):
311
if context.get('previous_accounts',False):
312
previous_accounts=context['previous_accounts']
314
pro_obj=self.pool.get('ir.property')
316
part_ids=pro_obj.search(cr,uid,[('name','=',__ACC__[k][0]),('value_reference','=','account.account,%s'%previous_accounts[__ACC__[k][0]]),('res_id','like','res.partner,')])
323
def _drop_properties(self, cr, uid, ids, k, context=None):
324
ir_prop_obj = self.pool.get('ir.property')
327
if context.get('previous_accounts',False):
328
previous_accounts = context['previous_accounts']
330
res_id = '%s,%s'%('res.partner',ids[0])
331
value_reference = '%s,%s'%('account.account',previous_accounts[__ACC__[k][0]])
332
ir_prop_ids = ir_prop_obj.search(cr, uid, [('res_id','=',res_id),('value_reference','=',value_reference),('name','=',__ACC__[k][0])], context=context)
333
ir_prop_obj.unlink(cr, uid, ir_prop_ids, context=context)
335
return ir_prop_obj.search(cr, uid, [('value_reference','=',value_reference)])
337
def _search_model(self, cr, uid, ids, model, acc, context=None):
340
account_ids = self.pool.get('account.account').search(cr, uid, [('id', 'child_of', acc)])
341
return self.pool.get(model).search(cr, uid, [('account_id', 'in', account_ids)]) and True or False
343
def _unlink_account(self, cr, uid, ids, k, vals, context=None):
346
if context.get('previous_accounts',False):
347
previous_accounts = context['previous_accounts']
351
if previous_accounts.get(__ACC__[k][0],False):
352
model= 'account.move.line'
353
aml= self._search_model(cr,uid,ids,model,[previous_accounts[__ACC__[k][0]]],context=context)
354
model= 'account.invoice'
355
ai= self._search_model(cr,uid,ids,model,[previous_accounts[__ACC__[k][0]]],context=context)
356
model= 'account.voucher.line'
357
avl= self._search_model(cr,uid,ids,model,[previous_accounts[__ACC__[k][0]]],context=context)
358
properties = self._drop_properties(cr,uid,ids,k,context=context)
359
if not any([aml,ai,avl,properties]):
360
self.pool.get('account.account').unlink(cr,uid,[previous_accounts[__ACC__[k][0]]], context)
364
def _assign_account(self,cr,uid,ids,k,vals, context=None):
369
if context.get('previous_accounts',False):
370
previous_accounts=context['previous_accounts']
372
rpa = self.pool.get('res.partner.account')
374
if self._check_unique(cr,uid,ids,k,vals,context=context):
375
rpa_brw = rpa.browse(cr,uid,vals[__ACC__[k][1]])
376
parent_id = getattr(rpa_brw,'property_account_partner').id
377
parent_name = getattr(rpa_brw,'property_account_partner').name
378
name = str(u'%s - %s'%(parent_name.decode('utf-8').upper(), vals['name'].decode('utf-8').upper())).encode('utf-8')
379
self.pool.get('account.account').write(cr,uid,[previous_accounts[__ACC__[k][0]]],{'parent_id':parent_id,'auto':True,'name':name})
380
vals[__ACC__[k][0]]=previous_accounts[__ACC__[k][0]]
382
vals[__ACC__[k][0]] = rpa._get_account(cr, uid, vals.get(__ACC__[k][1],False), vals['name'], vals[k])
383
self._switch_accounts(cr,uid,ids,k,vals,context=context)
384
self._unlink_account(cr,uid,ids,k,vals,context=context)
388
def _comparison(self,cr,uid,ids,k,vals, context=None):
392
if context.get('previous_accounts',False):
393
previous_accounts=context['previous_accounts']
395
rpa = self.pool.get('res.partner.account')
396
#~ This condition indicates if supplier/customer or not
397
if vals.get(k,False):
399
#~ This condition indicates accounting account was or not assigned
400
if vals.get(__ACC__[k][1],False):
401
if previous_accounts.get(__ACC__[k][1],False) == vals.get(__ACC__[k][1],False):
403
if not previous_accounts.get(__ACC__[k][0],False) and not vals.get(__ACC__[k][0],False):
404
vals[__ACC__[k][0]] = rpa._get_account(cr, uid, vals.get(__ACC__[k][1],False), vals['name'], vals[k])
406
elif not previous_accounts.get(__ACC__[k][0],False) and vals.get(__ACC__[k][0],False):
407
vals[__ACC__[k][0]] = rpa._get_account(cr, uid, vals.get(__ACC__[k][1],False), vals['name'], vals[k])
409
elif previous_accounts.get(__ACC__[k][0],False) != vals.get(__ACC__[k][0],False):
411
if self._check_unique(cr,uid,ids,k,vals,context=context):
412
vals[__ACC__[k][0]]=previous_accounts[__ACC__[k][0]]
414
vals[__ACC__[k][0]] = rpa._get_account(cr, uid, vals.get(__ACC__[k][1],False), vals['name'], vals[k])
415
self._switch_accounts(cr,uid,ids,k,vals,context=context)
416
self._unlink_account(cr,uid,ids,k,vals,context=context)
418
elif previous_accounts.get(__ACC__[k][0],False) and not vals.get(__ACC__[k][0],False):
419
if self._check_unique(cr,uid,ids,k,vals,context=context):
420
vals[__ACC__[k][0]]=previous_accounts[__ACC__[k][0]]
422
vals[__ACC__[k][0]] = rpa._get_account(cr, uid, vals.get(__ACC__[k][1],False), vals['name'], vals[k])
423
self._switch_accounts(cr,uid,ids,k,vals,context=context)
424
self._unlink_account(cr,uid,ids,k,vals,context=context)
426
elif previous_accounts.get(__ACC__[k][0],False) == vals.get(__ACC__[k][0],False):
427
vals = self._assign_account(cr,uid,ids,k,vals,context=context)
431
if not previous_accounts.get(__ACC__[k][0],False) and not vals.get(__ACC__[k][0],False):
432
vals[__ACC__[k][0]] = rpa._get_account(cr, uid, vals.get(__ACC__[k][1],False), vals['name'], vals[k])
434
elif not previous_accounts.get(__ACC__[k][0],False) and vals.get(__ACC__[k][0],False):
435
vals[__ACC__[k][0]] = rpa._get_account(cr, uid, vals.get(__ACC__[k][1],False), vals['name'], vals[k])
437
elif previous_accounts.get(__ACC__[k][0],False) != vals.get(__ACC__[k][0],False):
438
vals = self._assign_account(cr,uid,ids,k,vals,context=context)
440
elif previous_accounts.get(__ACC__[k][0],False) and not vals.get(__ACC__[k][0],False):
441
vals = self._assign_account(cr,uid,ids,k,vals,context=context)
443
elif previous_accounts.get(__ACC__[k][0],False) == vals.get(__ACC__[k][0],False):
444
vals = self._assign_account(cr,uid,ids,k,vals,context=context)
155
obj = self.browse(cr, uid, ids[0])
156
aa_obj_pay = obj.property_account_payable
157
aa_obj_rec = obj.property_account_receivable
158
rpa = self.pool.get('res.partner.account')
159
vals['name'] = vals['name'] if vals.has_key('name') else obj.name
161
# FOR ACCOUNTS RECEIVABLE
163
if not aa_obj_pay: # Check if the account does not exist to create
164
vals['account_kind_pay'] = vals['account_kind_pay'] if vals.has_key('account_kind_pay') else obj.account_kind_pay.id
165
vals['supplier'] = vals['supplier'] if vals.has_key('supplier') else obj.supplier
167
vals['property_account_payable'] = rpa._get_account(cr, uid, vals['account_kind_pay'], vals['name'], vals['supplier'])
168
else: #Check to see if there has been any change in status that implies a need to assign their own
169
#or reassign the generic account to another account, or reassign the account to another account group
170
if vals.has_key('supplier') and vals['supplier']:
172
#verify if the CxP has been assigned a partner that corresponds to the generic account of their initial classification
173
if _check_default(obj.account_kind_pay, aa_obj_pay, 'property_account_payable'):
175
# The partner had a generic account in the CXP do not know if this update will change the type vals ['account_kind_pay']
177
# In this assignment we emerge from this doubt, which have been changed that there equal, we will have the appropriate value for vals ['account_kind_pay']
179
vals['account_kind_pay'] = vals['account_kind_pay'] if vals.has_key('account_kind_pay') else obj.account_kind_pay.id
180
vals['property_account_payable'] = rpa._get_account(cr, uid, vals['account_kind_pay'], vals['name'], vals['supplier'])
183
vals['account_kind_rec'] = vals['account_kind_rec'] if vals.has_key('account_kind_rec') else obj.account_kind_rec.id
184
vals['customer'] = vals['customer'] if vals.has_key('customer') else obj.customer
185
vals['property_account_receivable'] = rpa._get_account(cr, uid, vals['account_kind_rec'], vals['name'], vals['customer'])
447
if not previous_accounts.get(__ACC__[k][0],False) and not vals.get(__ACC__[k][0],False):
448
raise osv.except_osv(('Atencion !'), ('La %s para este partner no puede ser nula')%(__ACC__[k][2]))
449
elif not previous_accounts.get(__ACC__[k][0],False) and vals.get(__ACC__[k][0],False):
451
elif previous_accounts.get(__ACC__[k][0],False) != vals.get(__ACC__[k][0],False):
452
self._switch_accounts(cr,uid,ids,k,vals,context=context)
453
self._unlink_account(cr,uid,ids,k,vals,context=context)
455
elif previous_accounts.get(__ACC__[k][0],False) and not vals.get(__ACC__[k][0],False):
456
vals[__ACC__[k][0]]=previous_accounts[__ACC__[k][0]]
458
elif previous_accounts.get(__ACC__[k][0],False) == vals.get(__ACC__[k][0],False):
188
if vals.has_key('customer') and vals['customer']:
189
if _check_default(obj.account_kind_rec, aa_obj_rec, 'property_account_receivable'):
190
vals['account_kind_rec'] = vals['account_kind_rec'] if vals.has_key('account_kind_rec') else obj.account_kind_rec.id
191
vals['property_account_receivable'] = rpa._get_account(cr, uid, vals['account_kind_rec'], vals['name'], vals['customer'])
462
if vals.get(__ACC__[k][1],False):
463
if previous_accounts.get(__ACC__[k][1],False) == vals.get(__ACC__[k][1],False):
464
if not previous_accounts.get(__ACC__[k][0],False) and not vals.get(__ACC__[k][0],False):
465
vals[__ACC__[k][0]] = getattr(rpa.browse(cr,uid,vals[__ACC__[k][1]]),'property_account_partner_default').id
466
elif not previous_accounts.get(__ACC__[k][0],False) and vals.get(__ACC__[k][0],False):
467
vals[__ACC__[k][0]] = getattr(rpa.browse(cr,uid,vals[__ACC__[k][1]]),'property_account_partner_default').id
468
elif previous_accounts.get(__ACC__[k][0],False) != vals.get(__ACC__[k][0],False):
469
vals[__ACC__[k][0]] = getattr(rpa.browse(cr,uid,vals[__ACC__[k][1]]),'property_account_partner_default').id
470
self._switch_accounts(cr,uid,ids,k,vals,context=context)
471
self._unlink_account(cr,uid,ids,k,vals,context=context)
473
elif previous_accounts.get(__ACC__[k][0],False) and not vals.get(__ACC__[k][0],False):
474
vals[__ACC__[k][0]]=previous_accounts[__ACC__[k][0]]
476
elif previous_accounts.get(__ACC__[k][0],False) == vals.get(__ACC__[k][0],False):
478
vals[__ACC__[k][0]] = getattr(rpa.browse(cr,uid,vals[__ACC__[k][1]]),'property_account_partner_default').id
479
self._switch_accounts(cr,uid,ids,k,vals,context=context)
480
self._unlink_account(cr,uid,ids,k,vals,context=context)
483
if not previous_accounts.get(__ACC__[k][0],False) and not vals.get(__ACC__[k][0],False):
484
vals[__ACC__[k][0]] = getattr(rpa.browse(cr,uid,vals[__ACC__[k][1]]),'property_account_partner_default').id
486
elif not previous_accounts.get(__ACC__[k][0],False) and vals.get(__ACC__[k][0],False):
487
vals[__ACC__[k][0]] = getattr(rpa.browse(cr,uid,vals[__ACC__[k][1]]),'property_account_partner_default').id
489
elif previous_accounts.get(__ACC__[k][0],False) != vals.get(__ACC__[k][0],False):
490
vals[__ACC__[k][0]] = getattr(rpa.browse(cr,uid,vals[__ACC__[k][1]]),'property_account_partner_default').id
491
self._switch_accounts(cr,uid,ids,k,vals,context=context)
492
self._unlink_account(cr,uid,ids,k,vals,context=context)
494
elif previous_accounts.get(__ACC__[k][0],False) and not vals.get(__ACC__[k][0],False):
495
vals[__ACC__[k][0]] = getattr(rpa.browse(cr,uid,vals[__ACC__[k][1]]),'property_account_partner_default').id
496
self._switch_accounts(cr,uid,ids,k,vals,context=context)
497
self._unlink_account(cr,uid,ids,k,vals,context=context)
499
elif previous_accounts.get(__ACC__[k][0],False) == vals.get(__ACC__[k][0],False):
500
vals[__ACC__[k][0]] = getattr(rpa.browse(cr,uid,vals[__ACC__[k][1]]),'property_account_partner_default').id
501
self._switch_accounts(cr,uid,ids,k,vals,context=context)
502
self._unlink_account(cr,uid,ids,k,vals,context=context)
505
if not previous_accounts.get(__ACC__[k][0],False) and not vals.get(__ACC__[k][0],False):
506
raise osv.except_osv(('Atencion !'), ('La %s para este partner no puede ser nula')%(__ACC__[k][2]))
508
elif not previous_accounts.get(__ACC__[k][0],False) and vals.get(__ACC__[k][0],False):
511
elif previous_accounts.get(__ACC__[k][0],False) != vals.get(__ACC__[k][0],False):
512
self._switch_accounts(cr,uid,ids,k,vals,context=context)
513
self._unlink_account(cr,uid,ids,k,vals,context=context)
515
elif previous_accounts.get(__ACC__[k][0],False) and not vals.get(__ACC__[k][0],False):
516
raise osv.except_osv(('Atencion !'), ('La %s para este partner no puede ser nula')%(__ACC__[k][2]))
518
elif previous_accounts.get(__ACC__[k][0],False) == vals.get(__ACC__[k][0],False):
522
def _update_code(self, cr, uid,ids,vals, context=None):
527
vals = self._comparison(cr, uid,ids,k,vals,context=context)
195
530
def write(self, cr, uid, ids, vals, context=None):
196
print 'account_partner write method, vals: ', vals
197
if 'customer' in vals.keys() or 'supplier' in vals.keys() or 'account_kind_rec' in vals.keys() or 'account_kind_pay' in vals.keys():
198
vals = self._do_refresh(cr, uid, ids, vals, context)
200
return super(res_partner, self).write(cr, uid, ids, vals, context)
202
_inherit = 'res.partner'
205
'property_account_payable': fields.property('account.account',type='many2one',relation='account.account',string="Account Payable",method=True,view_load=True,domain="[('type', '=', 'payable')]",help="This account will be used instead of the default one as the payable account for the current partner",required=False,readonly=True),
207
'property_account_receivable': fields.property('account.account',type='many2one',relation='account.account', string="Account Receivable",method=True,view_load=True,domain="[('type', '=', 'receivable')]",help="This account will be used instead of the default one as the receivable account for the current partner",required=False,readonly=True),
209
'account_kind_rec':fields.property('res.partner.account',type='many2one',relation='res.partner.account',string='Type of CxC',method=True,view_load=True,domain="[('type', '=', 'receivable')]",help="This concept allows you to generate CxC for\nthe company according to the accounting account\nof the group which is classified",required=True,readonly=False),
211
'account_kind_pay':fields.property('res.partner.account',type='many2one',relation='res.partner.account',string='Type of CxP',method=True,view_load=True,domain="[('type', '=', 'payable')]",help="This concept allows you to generate CxP for\nthe company according to the accounting account\nof the group which is classified",required=True,readonly=False),
531
print 'vals en el write', vals
536
if not set(vals.keys()) & set(['customer','supplier' ,'property_account_receivable', 'property_account_payable' ,'account_kind_rec', 'account_kind_pay']):
537
return super(res_partner, self).write(cr, uid, ids, vals, context)
539
attributes = ['customer','supplier','name']
540
self_brw = self.browse(cr,uid,ids[0],context)
541
previous_accounts = {}
546
if not previous_accounts.has_key(attr):
547
previous_accounts.update({attr:getattr(self_brw,attr) and getattr(self_brw,attr).id})
551
if not previous_accounts.has_key(attr):
552
previous_accounts.update({attr:getattr(self_brw,attr) and getattr(self_brw,attr).id})
554
for attr in attributes:
555
if not previous_accounts.has_key(attr):
556
previous_accounts.update({attr:getattr(self_brw, attr)})
559
context.update({'previous_accounts':previous_accounts})
562
#~ OBTENIENDO LAS CUENTAS CONTABLES QUE NO SE ACTUALIZARON
565
if not vals.has_key(attr):
566
vals.update({attr:getattr(self_brw, attr) and getattr(self_brw, attr).id})
570
if not vals.has_key(attr):
571
vals.update({attr:getattr(self_brw, attr) and getattr(self_brw, attr).id})
573
for attr in attributes:
574
if not vals.has_key(attr):
575
vals.update({attr:getattr(self_brw, attr)})
579
keys_in_vals = vals.keys()
580
vals.update(self._update_code(cr, uid, ids, vals, context=context))
583
for i in keys_in_vals:
585
#~ res = super(product_template, self).write(cr, uid, ids, valuex, context)
586
return super(res_partner, self).write(cr, uid, ids, valuex, context)
588
def search_aml(self, cr, uid, id, context=None):
591
aml_obj = self.pool.get('account.move.line')
592
return aml_obj.search(cr, uid, [('partner_id','=',id)],context=context)
595
def search_ai(self, cr, uid, id, context=None):
598
ai_obj = self.pool.get('account.invoice')
599
return ai_obj.search(cr, uid, [('partner_id','=',id)],context=context)
602
def search_so(self, cr, uid, id, context=None):
605
so_obj = self.pool.get('sale.order')
606
return so_obj.search(cr, uid, [('partner_id','=',id)],context=context)
608
def search_po(self, cr, uid, id, context=None):
611
po_obj = self.pool.get('purchase.order')
612
return po_obj.search(cr, uid, [('partner_id','=',id)],context=context)
614
def search_avl(self, cr, uid, id, context=None):
617
avl_obj = self.pool.get('account.voucher.line')
618
return avl_obj.search(cr, uid, [('partner_id','=',id)],context=context)
620
def _test_unlink(self, cr, uid, id, context=None):
623
# TODO OR COMPLETE THE REMAINING FUNCTIONS SO IT COULD BE
624
# POSIBLE TO CHECK ALL THE POSSIBILITIES.
626
test.append(all([self.search_aml(cr, uid, id, context=context) and True]))
627
test.append(all([self.search_ai(cr, uid, id, context=context) and True]))
628
test.append(all([self.search_so(cr, uid, id, context=context) and True]))
629
test.append(all([self.search_po(cr, uid, id, context=context) and True]))
630
test.append(all([self.search_avl(cr, uid, id, context=context) and True]))
633
def _try_unlink(self, cr, uid, id, context=None):
636
attributes = ['customer','supplier']
637
self_brw = self.browse(cr,uid,id,context)
638
previous_accounts = {}
643
previous_accounts.update({attr:getattr(self_brw,attr) and getattr(self_brw,attr).id})
647
previous_accounts.update({attr:getattr(self_brw,attr) and getattr(self_brw,attr).id})
649
for attr in attributes:
650
previous_accounts.update({attr:getattr(self_brw, attr)})
653
context.update({'previous_accounts':previous_accounts})
656
#~ OBTENIENDO LAS CUENTAS CONTABLES QUE NO SE ACTUALIZARON
659
vals.update({attr:False})
663
vals.update({attr:False})
665
for attr in attributes:
666
vals.update({attr:False})
668
if not any(self._test_unlink(cr, uid, id, context=context)):
671
if self._check_unique(cr,uid,id,k,vals,context=context):
672
test.append(self._unlink_account(cr,uid,[id],k,vals,context=context))
678
def unlink(self, cr, uid, ids,context=None):
682
res = [id for id in ids if self._try_unlink(cr, uid, id, context=context)]
684
return super(res_partner,self).unlink(cr, uid, res, context=context)