69 lines
2.6 KiB
Python
69 lines
2.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
import logging
|
|
from odoo import http, _, fields
|
|
from odoo.http import request
|
|
from odoo.exceptions import ValidationError, UserError
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class NifValidatorController(http.Controller):
|
|
_ROUTE = '/web/nif/validate'
|
|
|
|
@http.route(_ROUTE, type='json', auth='user', methods=['POST'], csrf=True)
|
|
def validate_nif(self, nif=None, partner_id=None, **kwargs):
|
|
if not nif:
|
|
return self._error(_('O campo NIF é obrigatório.'))
|
|
|
|
nif = str(nif).strip()
|
|
_logger.info('NIF Validator: requisição recebida | nif=%s | partner_id=%s', nif, partner_id)
|
|
|
|
try:
|
|
partner = self._resolve_partner(partner_id)
|
|
result = self._run_validation(partner, nif)
|
|
return result
|
|
except (ValidationError, UserError) as exc:
|
|
return self._error(str(exc.args[0]))
|
|
except Exception as exc:
|
|
_logger.exception('NIF Validator: erro inesperado')
|
|
return self._error(_('Ocorreu um erro interno. Contacte o administrador.'))
|
|
|
|
def _resolve_partner(self, partner_id):
|
|
Partner = request.env['res.partner']
|
|
if not partner_id:
|
|
return Partner.browse([])
|
|
try:
|
|
partner_id = int(partner_id)
|
|
except (TypeError, ValueError):
|
|
raise UserError(_('ID de contacto inválido.'))
|
|
|
|
partner = Partner.browse(partner_id)
|
|
if not partner.exists():
|
|
raise UserError(_('O contacto com ID %d não foi encontrado.') % partner_id)
|
|
return partner
|
|
|
|
# ESTA É A FUNÇÃO QUE DEVES SUBSTITUIR
|
|
def _run_validation(self, partner, nif):
|
|
if partner:
|
|
# Atualiza o NIF e chama a lógica do modelo Python (res_partner.py)
|
|
partner.sudo().write({'nif_ao': nif})
|
|
partner.action_validate_nif()
|
|
|
|
if partner.nif_ao_validated:
|
|
return self._success({
|
|
'nif': partner.nif_ao,
|
|
'nome': partner.name,
|
|
'estado': partner.nif_ao_state or '',
|
|
'tipo_contribuinte': partner.nif_ao_contributor_type or '',
|
|
'ultima_validacao': fields.Datetime.to_string(partner.nif_ao_last_validation),
|
|
})
|
|
else:
|
|
return self._error(_('Não foi possível validar o NIF %s na AGT.') % nif)
|
|
else:
|
|
return self._error(_('Para validar o NIF, o contacto deve estar previamente criado.'))
|
|
|
|
def _success(self, data):
|
|
return {'success': True, 'data': data}
|
|
|
|
def _error(self, message):
|
|
return {'success': False, 'error': str(message)} |