1
1
# -*- encoding: utf-8 -*-
2
2
###############################################################################
4
# Copyright (C) 2009 Renato Lima - Akretion, Gabriel C. Stabel #
4
# Copyright (C) 2009 Gabriel C. Stabel #
5
# Copyright (C) 2009-2012 Renato Lima (Akretion) #
6
# Copyright (C) 2012 Raphaël Valyi (Akretion) #
6
8
#This program is free software: you can redistribute it and/or modify #
7
9
#it under the terms of the GNU Affero General Public License as published by #
47
class res_partner(osv.osv):
49
class res_partner(osv.Model):
48
50
_inherit = 'res.partner'
50
52
def _get_partner(self, cr, uid, ids, context=None):
64
66
#TODO shouldn't we get the default one if no invoice one is found?
67
partner_addr_default = self.pool.get('res.partner').browse(cr, uid, [partner_addr['invoice']])[0]
68
addr_fs_code = partner_addr_default.state_id and partner_addr_default.state_id.code or ''
69
partner_addr_default = self.pool.get('res.partner')\
70
.browse(cr, uid, [partner_addr['invoice']])[0]
71
addr_fs_code = partner_addr_default.state_id\
72
and partner_addr_default.state_id.code or ''
69
73
res[partner.id]['addr_fs_code'] = addr_fs_code.lower()
74
'tipo_pessoa': fields.selection([('F', 'Física'),
76
'Tipo de pessoa', required=True),
77
78
'cnpj_cpf': fields.char('CNPJ/CPF', size=18),
78
79
'inscr_est': fields.char('Inscr. Estadual/RG', size=16),
79
80
'inscr_mun': fields.char('Inscr. Municipal', size=18),
92
_get_partner, ['country_id',
94
['country_id', 'state_id'], 20), }),
96
'l10n_br_city_id': fields.many2one('l10n_br_base.city',
98
domain="[('state_id','=',state_id)]"),
98
fields.many2one('l10n_br_base.city', 'Municipio',\
99
domain="[('state_id','=',state_id)]"),
99
100
'district': fields.char('Bairro', size=32),
100
101
'number': fields.char('Número', size=10)
104
'tipo_pessoa': lambda *a: 'J'}
106
104
def _check_cnpj_cpf(self, cr, uid, ids):
108
106
for partner in self.browse(cr, uid, ids):
109
107
if not partner.cnpj_cpf:
112
if partner.tipo_pessoa == 'J':
110
if partner.is_company:
113
111
if not self._validate_cnpj(partner.cnpj_cpf):
115
elif partner.tipo_pessoa == 'F':
116
if not self._validate_cpf(partner.cnpj_cpf):
113
elif not self._validate_cpf(partner.cnpj_cpf):
220
217
prod = PARAMETERS[uf].get('prod', [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2])
221
218
prod = prod[-val_tam:]
222
219
while len(nova_ie) < tam:
223
r = sum([x * y for (x, y) in zip(nova_ie, prod)]) % PARAMETERS[uf].get('div', 11)
220
r = sum([x * y for (x, y) in zip(nova_ie, prod)]) % PARAMETERS[uf]\
250
248
for partner in self.browse(cr, uid, ids):
251
249
if not partner.inscr_est \
252
250
or partner.inscr_est == 'ISENTO' \
253
or partner.tipo_pessoa == 'F':
251
or not partner.is_company:
256
254
uf = partner.addr_fs_code
585
583
(_check_cnpj_cpf, u'CNPJ/CPF invalido!', ['cnpj_cpf']),
586
(_check_ie, u'Inscrição Estadual inválida!', ['inscr_est'])]
584
(_check_ie, u'Inscrição Estadual inválida!',
588
587
_sql_constraints = [
589
588
('res_partner_cnpj_cpf_uniq', 'unique (cnpj_cpf)',
591
590
('res_partner_inscr_est_uniq', 'unique (inscr_est)',
592
591
u'Já existe um parceiro cadastrado com esta Inscrição Estadual/RG !')]
594
def onchange_mask_cnpj_cpf(self, cr, uid, ids, tipo_pessoa, cnpj_cpf):
595
if not cnpj_cpf or not tipo_pessoa:
593
#TODO signature changed for v7, migrate view!
594
def onchange_mask_cnpj_cpf(self, cr, uid, ids, is_company, cnpj_cpf):
596
val = re.sub('[^0-9]', '', cnpj_cpf)
597
if is_company and len(val) == 14:
598
cnpj_cpf = "%s.%s.%s/%s-%s"\
599
% (val[0:2], val[2:5], val[5:8], val[8:12], val[12:14])
600
elif not is_company and len(val) == 11:
601
cnpj_cpf = "%s.%s.%s-%s"\
602
% (val[0:3], val[3:6], val[6:9], val[9:11])
603
return {'value': {'cnpj_cpf': cnpj_cpf}}
597
val = re.sub('[^0-9]', '', cnpj_cpf)
599
if tipo_pessoa == 'J' and len(val) == 14:
600
cnpj_cpf = "%s.%s.%s/%s-%s" % (val[0:2], val[2:5], val[5:8], val[8:12], val[12:14])
602
elif tipo_pessoa == 'F' and len(val) == 11:
603
cnpj_cpf = "%s.%s.%s-%s" % (val[0:3], val[3:6], val[6:9], val[9:11])
605
return {'value': {'tipo_pessoa': tipo_pessoa, 'cnpj_cpf': cnpj_cpf}}
608
608
def onchange_l10n_br_city_id(self, cr, uid, ids, l10n_br_city_id):
669
669
domain.append(('street', '=', res_partner_address.street))
670
670
domain.append(('district', '=', res_partner_address.district))
671
domain.append(('country_id', '=', res_partner_address.country_id.id))
672
domain.append(('state_id', '=', res_partner_address.state_id.id))
673
domain.append(('l10n_br_city_id', '=', res_partner_address.l10n_br_city_id.id))
671
domain.append(('country_id', '=', \
672
res_partner_address.country_id.id))
673
domain.append(('state_id', '=', \
674
res_partner_address.state_id.id))
675
domain.append(('l10n_br_city_id', '=', \
676
res_partner_address.l10n_br_city_id.id))
675
678
zip_id = obj_zip.search(cr, uid, domain)
680
683
'zip': res_partner_address.zip,
681
684
'street': res_partner_address.street,
682
685
'district': res_partner_address.district,
683
'country_id': res_partner_address.country_id.id,
687
res_partner_address.country_id.id,
684
688
'state_id': res_partner_address.state_id.id,
685
'l10n_br_city_id': res_partner_address.l10n_br_city_id.id,
690
res_partner_address.l10n_br_city_id.id,
686
691
'address_id': ids,
687
692
'object_name': self._name,
707
712
'l10n_br_city_id',
708
713
'city', 'state_id',
709
'country_id'], context=context)[0]
711
718
zip = re.sub('[^0-9]', '', zip_read['code'] or '')
712
719
if len(zip) == 8:
713
720
zip = '%s-%s' % (zip[0:5], zip[5:8])
715
result['street'] = ((zip_read['street_type'] or '') + ' ' + (zip_read['street'] or ''))
722
result['street'] = ((zip_read['street_type'] or '') + ' ' \
723
+ (zip_read['street'] or ''))
716
724
result['district'] = zip_read['district']
717
725
result['zip'] = zip
718
result['l10n_br_city_id'] = zip_read['l10n_br_city_id'] and zip_read['l10n_br_city_id'][0] or False
719
result['city'] = zip_read['l10n_br_city_id'] and zip_read['l10n_br_city_id'][1] or ''
720
result['state_id'] = zip_read['state_id'] and zip_read['state_id'][0] or False
721
result['country_id'] = zip_read['country_id'] and zip_read['country_id'][0] or False
726
result['l10n_br_city_id'] = zip_read['l10n_br_city_id'] \
727
and zip_read['l10n_br_city_id'][0] or False
728
result['city'] = zip_read['l10n_br_city_id'] \
729
and zip_read['l10n_br_city_id'][1] or ''
730
result['state_id'] = zip_read['state_id'] \
731
and zip_read['state_id'][0] or False
732
result['country_id'] = zip_read['country_id'] \
733
and zip_read['country_id'][0] or False
722
734
self.write(cr, uid, res_partner_address.id, result)
726
class res_partner_bank(osv.osv):
738
class res_partner_bank(osv.Model):
727
739
""" Adiciona campos necessários para o cadastramentos de contas
728
740
bancárias na brasil.