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