20
20
from osv import osv, fields
22
22
##############################################################################
23
# Parceiro Personalizado
24
##############################################################################
25
class res_partner(osv.osv):
26
_inherit = 'res.partner'
28
'tipo_pessoa': fields.selection([('F', 'Física'), ('J', 'Jurídica')], 'Tipo de pessoa', required=True),
29
'cnpj_cpf': fields.char('CNPJ/CPF', size=18),
30
'inscr_est': fields.char('Inscr. Estadual', size=16),
31
'inscr_mun': fields.char('Inscr. Municipal', size=18),
32
'suframa': fields.char('Suframa', size=18),
33
'legal_name' : fields.char('Razão Social', size=128, help="nome utilizado em documentos fiscais"),
34
'partner_fiscal_type_id': fields.many2one('l10n_br.partner.fiscal.type', 'Tipo Fiscal do Parceiro'),
38
'tipo_pessoa': lambda *a: 'J',
41
def _check_cnpj_cpf(self, cr, uid, ids):
42
partner = self.browse(cr, uid, ids)[0]
43
if not partner.cnpj_cpf:
46
if partner.tipo_pessoa == 'J':
47
return self.validate_cnpj(partner.cnpj_cpf)
48
elif partner.tipo_pessoa == 'F':
49
return self.validate_cpf(partner.cnpj_cpf)
53
def validate_cnpj(self, cnpj):
55
if not cnpj.isdigit():
57
cnpj = re.sub('[^0-9]', '', cnpj)
59
# verificando o tamano do cnpj
63
# Pega apenas os 12 primeiros dígitos do CNPJ e gera os 2 dígitos que faltam
67
prod = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
69
r = sum([x*y for (x, y) in zip(novo, prod)]) % 11
77
# Se o número gerado coincidir com o número original, é válido
83
def validate_cpf(self, cpf):
86
cpf = re.sub('[^0-9]', '', cpf)
91
# Pega apenas os 9 primeiros dígitos do CPF e gera os 2 dígitos que faltam
96
r = sum([(len(novo)+1-i)*v for i,v in enumerate(novo)]) % 11
104
# Se o número gerado coincidir com o número original, é válido
110
_constraints = [(_check_cnpj_cpf, 'CNPJ/CPF invalido!', ['cnpj_cpf'])]
112
def on_change_mask_cnpj_cpf(self, cr, uid, ids, tipo_pessoa, cnpj_cpf):
113
if not cnpj_cpf or not tipo_pessoa:
117
val = re.sub('[^0-9]', '', cnpj_cpf)
119
if tipo_pessoa == 'J' and len(val) == 14:
120
cnpj_cpf = "%s.%s.%s/%s-%s" % (val[0:2], val[2:5], val[5:8], val[8:12], val[12:14])
122
elif tipo_pessoa == 'F' and len(val) == 11:
123
cnpj_cpf = "%s.%s.%s-%s" % (val[0:3], val[3:6], val[6:9], val[9:11])
125
return {'value': {'tipo_pessoa': tipo_pessoa, 'cnpj_cpf': cnpj_cpf}}
127
def zip_search(self, cr, uid, ids, context={}):
132
##############################################################################
133
# Contato do Parceiro Personalizado
134
##############################################################################
135
class res_partner_address(osv.osv):
136
_inherit = 'res.partner.address'
138
'city_id': fields.many2one('l10n_br.city', 'Municipio', domain="[('state_id','=',state_id)]"),
139
'number': fields.char('Número', size=10),
142
def on_change_city_id(self, cr, uid, ids, city_id):
144
result = {'value': {'city': None}}
149
obj_city = self.pool.get('l10n_br.city').read(cr, uid, city_id, ['name'])
152
result['value'] = {'city': obj_city['name']}
156
def on_change_zip(self, cr, uid, ids, zip):
158
result = {'value': {'street': None, 'city_id': None, 'city': None, 'state_id': None, 'country_id': None, 'zip': None }}
163
obj_cep = self.pool.get('l10n_br.cep').browse(cr, uid, zip)
166
result['value']['street'] = obj_cep.street_type + ' ' + obj_cep.street
167
result['value']['city_id'] = obj_cep.city_id.id
168
result['value']['city'] = obj_cep.city_id.name
169
result['value']['state_id'] = obj_cep.state_id.id
170
result['value']['country_id'] = obj_cep.state_id.country_id.id
171
result['value']['zip'] = obj_cep.code
175
res_partner_address()
177
##############################################################################
178
23
# Posição Fiscal Personalizada
179
24
##############################################################################
180
25
class account_fiscal_position(osv.osv):