syncra_addons/i18n_ao_nif_validator/controllers/main.py

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)}