CNPJws
Español
Español
  • Visión General
  • Modelos de datos
    • Países
    • Estados
    • Ciudades
    • Naturalezas Jurídicas
    • Tamaños
    • Actividades Económicas
    • Calificaciones Societarias
    • Socios
    • Simples Nacional y MEI
    • Establecimientos
    • Inscripciones Estatales
    • Suframa
    • Regímenes Tributarios
    • Situaciones Cadastrales
    • Mensajes de Error
  • Changelog
  • Referencia de API
    • API - Comercial
      • Consultando CNPJ en la API Comercial
      • Consultando por la Raíz del CNPJ
      • Búsqueda de Empresas
      • Consultando el Consumo de Solicitudes Mensuales
      • Validando Inscripción en Suframa
    • API - Pública
      • Consultando CNPJ en la API Pública
      • Validando Inscripción en Suframa en la API Pública
      • Limitaciones
  • BLOG
    • Qué es el CNPJ
    • Consultar CNPJ con Java
    • Consultar CNPJ Gratuitamente con Excel
    • Consultar CNPJ con PHP
    • Gatillo para consultar CNPJ en Protheus
    • Mantener el registro de clientes y proveedores actualizado
    • Consultar CNPJ con Javascript y Node.JS
    • Consultar CNPJ con ADVPL (Protheus)
    • Proyecto CNPJ.ws
Con tecnología de GitBook
En esta página

¿Te fue útil?

  1. BLOG

Consultar CNPJ con ADVPL (Protheus)

Consultar CNPJ en Protheus utilizando la API de CNPJ.ws con ADVPL

AnteriorConsultar CNPJ con Javascript y Node.JSSiguienteProyecto CNPJ.ws

Última actualización hace 4 meses

¿Te fue útil?

El sistema Protheus de Totvs es el ERP líder del mercado brasileño y puede ser integrado con la API de CNPJ.ws de manera fácil y simple para consultar clientes o proveedores a través del CNPJ.

El Protheus utiliza el lenguaje propietario de Totvs, el ADVPL (Advanced Protheus Language), que es un lenguaje de programación estándar xBase (Clipper, Visual Objects y después Fivewin).

Para esta integración vamos a construir una clase genérica de comunicación que podrá ser usada en diversos tipos de proyecto. También puedes encontrar este proyecto en .

Recordando que puedes usar nuestra API gratuita para consultar CNPJ, pero con una limitación de 3 consultas por minuto o puedes adquirir uno de nuestros planes comerciales.

Con la integración podemos usar la API para consultar la dirección, inscripción estatal, situación cadastral, CNAE y muchas otras informaciones que pueden ser importantes en el momento del registro del cliente o proveedor, persona jurídica, a través del CNPJ.

Integración CNPJ.ws con el ERP Totvs Protheus

Vamos a comenzar, abajo la declaración de la clase:

#include 'totvs.ch'
#include 'protheus.ch'

class CNPJws
	data lVerb	  as Logical
	data cURL     as String
	data cToken   as String
	data cErro    as String
	data cRet     as String
	data oRet     as String
	data aHeaders as Array
	data lRet     as Logical

  method new() CONSTRUCTOR
	method consoleLog(cMsg,lErro)
	method setError(oRest)
	method consultarCNPJ(cCNPJ)
	method getResponse()
	method getError()
endClass

Tendremos 6 métodos en nuestra clase:

  • new: Responsable de instanciar la clase;

  • setError: Método interno para generación de errores;

  • consultarCNPJ: Responsable de hacer la consulta del CNPJ junto a la API del CNPJ.ws;

  • getResponse: Retorna la respuesta de la API en formato JSON;

  • getError: Retorna el mensaje de error;

Ahora vamos a desarrollar el método new, que es nuestro método constructor. Observa que este método recibe el parámetro lTest (el valor predeterminado es falso) y sí, vamos a hacer pruebas con nuestra clase de integración.

Observa también que tenemos un parámetro CN_TOKEN, debemos crearlo en caso de que estemos usando la API Comercial (sin restricciones) y llenarlo con el Token que fue enviado a tu correo electrónico.

method new(lTest) class CNPJws

	default lTest:= .f.

	::cToken  := if(lTest, '', superGetMV('CN_TOKEN',.f.,''))
	::cURL    := if(empty(::cToken),'https://publica.cnpj.ws','https://comercial.cnpj.ws')
	::lVerb   := if(lTest, .t., superGetMV('CN_VERBO',.f.,.t.)) //Indica se ira imprimir todas as msgs no console
	::cErro   := ''
	::cRet    := ''
	::oRet    := nil
	::lRet    := .t.
	::aHeaders:= {"Content-Type: application/json; charset=utf-8"}

	if !empty(::cToken)
		aAdd(::aHeaders,'x_api_token: ' + allTrim(::cToken))
	endif

	::consoleLog('Classe instanciada com sucesso!')

return Self

En el método new usamos el método consoleLog, entonces vamos a desarrollarlo ahora. Este método busca padronizar los mensajes emitidos por la clase.

En caso de que el parámetro CN_VERBO esté como .T., la clase imprimirá todos los mensajes en el console.log del Protheus.

method consoleLog(cMsg,lErro) class CNPJws
	local cLog:= ''
	default cMsg := ''
	default lErro:= .f.

	if ::lVerb .or. lErro
		cLog:= '[' + dtoc(date()) + ']'
		cLog+= '[' + time() + ']'
		cLog+= '[' + ProcName(1) + ']'
		cLog+= '[' + cValToChar(ProcLine(1)) + ']'
		cLog+= '['+allTrim(cMsg)+']'
		if lErro
			::cErro:= cLog
			::lRet := .f.
		endif
		if ::lVerb .or. lErro
			conout(cLog)
		endif
	endif

return

Abajo el método setError usado por la clase para generar los mensajes de error:

method setError(oRest,cPath) class CNPJws
	local cLog		:= ''
	local cAux  	:= ''
	local cStatus	:= ''

	default cPath := ''

	::oRet := nil
	::cRet:= oRest:GetResult()

	if valType(::cRet) <> 'C'
		::cRet:= ''
	endif

	if !empty(::cRet)
		::cRet:= FWNoAccent(DecodeUtf8(::cRet))
		if empty(::cRet)
			::cRet:= FWNoAccent(oRest:GetResult())
		endif
	endif

	cAux:= FWNoAccent(DecodeUtf8(oRest:GetLastError()))
	if empty(cAux)
		cAux:= FWNoAccent(oRest:GetLastError())
	endif

	cStatus:= oRest:GetHTTPCode()
	cLog+= 'Host: ' + ::cURL + CRLF
	cLog+= 'Operacao: ' + ProcName(1) + ' ' + cPath + CRLF
	cLog+= 'HTTP Code: ' + cStatus + CRLF
	cLog+= 'Erro: ' + cAux + CRLF
	cLog+= 'Resultado: ' + ::cRet + CRLF

	::consoleLog(cLog,.T.)

return

El método retorna un booleano, en caso de que todo salga bien, retornará true, en caso de error, retornará false, vea abajo:

method consultarCNPJ(cCNPJ) class CNPJws
	local oRest	:= FWRest():New(::cURL)
	local cPath := ''

	::cRet := ''
	::oRet := nil
	::lRet := .t.
	::cErro:= ''

	cPath+=  allTrim(cCNPJ)
	oRest:setPath(cPath)

	if oRest:Get(::aHeaders)
		if !empty(oRest:GetResult())
			::cRet:= FWNoAccent(DecodeUtf8(oRest:GetResult()))
			if empty(::cRet)
				::cRet:= FWNoAccent(oRest:GetResult())
			endif
			::cRet:= strTran(::cRet,'\/','/')
			::cRet:= strtran(::cRet,":null",': " "')
			::cRet:= strtran(::cRet,'"self"','"_self"')
			::oRet:= JsonObject():new()
			::oRet:fromJson(::cRet)
			::lRet := .t.
			::cErro:= ''
		else
			::oRet := nil
			::cErro:= ''
			::lRet := .t.
		endif
		::consoleLog('Sucesso! ' + cPath)
	else
		::setError(oRest,cPath)
	endif

	FreeObj(oRest)

return ::lRet
method getResponse() class CNPJws
return ::oRet

Abajo tenemos el método responsable por retornar el mensaje de error en caso de que la consulta no tenga éxito:

method getError() class CNPJws
return ::cErro

Legal, construimos nuestra clase, ahora es un buen momento para desarrollar una rutina para utilizar nuestra clase:

user function tstCNPJ()
	local oCNPJ:= nil
	local oJSON:= nil

	RpcSetType(3)
	if !RpcSetEnv('99','01')
		return
	endif

	oCNPJ:= CNPJws():new()//Instancia a classe

	if oCNPJ:consultarCNPJ('40154884000153')
		oJSON:= oCNPJ:getResponse()
	endif

	RPCClearEnv()

return

¡Hasta luego!

Ahora sí, vamos desarrollar el método responsable de comunicarse con la API del CNPJ.ws, el método consultarCNPJ. Aquí vamos a utilizar la clase para hacer la comunicación con la API, este método recibe el CNPJ como parámetro y hace la consulta en la API.

Abajo tenemos el método responsable por retornar el JSON que la API del retornó en la consulta:

Caso necesites apoyo para implementar esta integración en tu base, te recomendamos , nuestra socia, que cuenta con consultores especializados en la integración entre sistemas.

Este post quedó largo, ¿verdad? Entonces voy a dejar para hacer una parte 2 utilizando TL++ para crear una prueba para la clase de integración, pero los fuentes ya están en por si quieres echar un vistazo.

Para saber más sobre nuestros planes y formas de pago accede a .

GitHub
FWREST
CNPJ.ws
Apply System
GitHub
CNPJ.ws