Gatilho para consultar CNPJ en el registro de clientes o proveedores en Protheus en ADVPL utilizando la API de CNPJ.ws con datos de la Receita Federal, Sintegra y Suframa.
Registrar clientes o proveedores en Protheus puede ser más fácil si consultamos el CNPJ en la API del CNPJ.ws
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.
En este post vamos a usar esta clase ADVPL para desarrollar un gatillo que utilizaremos tanto en el registro de clientes como en el registro de proveedores. 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.
Función getCNPJ
Vamos a comenzar creando una user function que llamaremos en nuestros gatillos. Observa que recibe dos parámetros:
cTab: SA1 o SA2, indicando si estamos trabajando con clientes o proveedores
cCNPJ: el número del CNPJ
También hicimos un tratamiento usando la función isBlind para el caso de que el gatillo sea llamado vía execauto, sin la interfaz del usuario. Y usamos la función FWMsgRun para que el usuario tenga un retorno visual y no solo una pantalla "congelada" mientras se ejecuta el proceso.
#include 'totvs.ch'
user function getCNPJ(cTab,cCNPJ)
local aArea:= getArea()
local cRet := ''
default cTab := 'SA1'
default cCNPJ:= ''
cCNPJ:= allTrim(cCNPJ)
if !empty(cTab) .and. len(cCNPJ) == 14
if isBlind()
cRet:= consulta(cTab,cCNPJ)
else
FWMsgRun(,{||cRet:= consulta(cTab,cCNPJ)},'CNPJ.ws','Consultando...')
endif
endif
restArea(aArea)
return cRet
Vamos a crear una función estática que será la responsable de la comunicación con el CNPJ.ws.
Debes revisar bien este código para que se ajuste a tus necesidades en tu empresa, aquí he llenado todos los campos que se me ocurrieron, pero siéntete libre de hacer modificaciones:
static function consulta(cTab,cCNPJ)
local oCNPJws:= CNPJws():new()
local oJSON := nil
local nX := 1
local cRet := ''
local lJob := isBlind()
local oModel := nil
default cTab := 'SA1'
default cCNPJ:= ''
if oCNPJws:consultarCNPJ(cCNPJ)
oJSON:= oCNPJws:getResponse()
cRet:= oJSON['razao_social']
if oJSON['estabelecimento']['situacao_cadastral'] <> 'Ativa'
if lJob
conout(cCNPJ + ': A situação cadastral da empresa junto a SEFAZ é ' + oJSON['estabelecimento']['situacao_cadastral'])
else
alert('A situação cadastral da empresa junto a SEFAZ é ' + oJSON['estabelecimento']['situacao_cadastral'])
endif
endif
if cTab == 'SA1'
M->A1_MSBLQL:= if(oJSON['estabelecimento']['situacao_cadastral'] == 'Ativa','2','1')
If ExistTrigger('A1_MSBLQL')
RunTrigger(1,Nil,Nil,,'A1_MSBLQL')
Endif
M->A1_CNAE:= oJSON['estabelecimento']['atividade_principal']['id']
CC3->(dbSetOrder(1))
if !CC3->(dbSeek(xFilial('CC3')+M->A1_CNAE))
reclock('CC3',.t.)
CC3->CC3_FILIAL := xFilial('CC3')
CC3->CC3_COD := oJSON['estabelecimento']['atividade_principal']['id']
CC3->CC3_DESC := upper(oJSON['estabelecimento']['atividade_principal']['descricao'])
CC3->CC3_CSECAO := oJSON['estabelecimento']['atividade_principal']['secao']
CC3->CC3_CDIVIS := oJSON['estabelecimento']['atividade_principal']['divisao']
CC3->CC3_CGRUPO := strTran(oJSON['estabelecimento']['atividade_principal']['grupo'],'.')
CC3->CC3_CCLASS := strTran(strTran(oJSON['estabelecimento']['atividade_principal']['classe'],'.'),'-')
CC3->(msUnlock())
endif
If ExistTrigger('A1_CNAE')
RunTrigger(1,Nil,Nil,,'A1_CNAE')
Endif
M->A1_PESSOA := 'J'
If ExistTrigger('A1_PESSOA')
RunTrigger(1,Nil,Nil,,'A1_CNAE')
Endif
if !empty(oJSON['estabelecimento']['pais']['id'])
CCH->(dbSetOrder(1))
if CCH->(dbSeek(xFilial('CCH')+ '0' + oJSON['estabelecimento']['pais']['id'] ))
M->A1_CODPAIS := CCH->CCH_CODIGO
If ExistTrigger('A1_CODPAIS')
RunTrigger(1,Nil,Nil,,'A1_CODPAIS')
Endif
endif
SYA->(dbSetOrder(2))
if SYA->(dbSeek(xFilial('SYA')+ upper(oJSON['estabelecimento']['pais']['nome'])))
M->A1_PAIS := SYA->YA_CODGI
If ExistTrigger('A1_PAIS')
RunTrigger(1,Nil,Nil,,'A1_PAIS')
Endif
endif
endif
M->A1_NREDUZ := oJSON['estabelecimento']['nome_fantasia']
if empty(M->A1_NREDUZ) //Caso nao possua nome fantasia
M->A1_NREDUZ := avKey(cRet, 'A1_NREDUZ')
endif
If ExistTrigger('A1_NREDUZ')
RunTrigger(1,Nil,Nil,,'A1_NREDUZ')
Endif
M->A1_CEP := oJSON['estabelecimento']['cep']
If ExistTrigger('A1_CEP')
RunTrigger(1,Nil,Nil,,'A1_CEP')
Endif
M->A1_EST := oJSON['estabelecimento']['estado']['sigla']
If ExistTrigger('A1_EST')
RunTrigger(1,Nil,Nil,,'A1_EST')
Endif
M->A1_COD_MUN:= substring(cValToChar(oJSON['estabelecimento']['cidade']['ibge_id']),3,5)
If ExistTrigger('A1_COD_MUN')
RunTrigger(1,Nil,Nil,,'A1_COD_MUN')
Endif
M->A1_BAIRRO := oJSON['estabelecimento']['bairro']
If ExistTrigger('A1_BAIRRO')
RunTrigger(1,Nil,Nil,,'A1_BAIRRO')
Endif
M->A1_END := oJSON['estabelecimento']['logradouro'] + ', ' + oJSON['estabelecimento']['numero']
If ExistTrigger('A1_END')
RunTrigger(1,Nil,Nil,,'A1_END')
Endif
M->A1_COMPLEM:= oJSON['estabelecimento']['complemento']
If ExistTrigger('A1_COMPLEM')
RunTrigger(1,Nil,Nil,,'A1_COMPLEM')
Endif
M->A1_DDD := oJSON['estabelecimento']['ddd1']
If ExistTrigger('A1_DDD')
RunTrigger(1,Nil,Nil,,'A1_DDD')
Endif
M->A1_TEL := oJSON['estabelecimento']['telefone1']
If ExistTrigger('A1_TEL')
RunTrigger(1,Nil,Nil,,'A1_TEL')
Endif
M->A1_FAX := oJSON['estabelecimento']['ddd_fax']+oJSON['estabelecimento']['fax']
If ExistTrigger('A1_FAX')
RunTrigger(1,Nil,Nil,,'A1_FAX')
Endif
M->A1_EMAIL := oJSON['estabelecimento']['email']
If ExistTrigger('A1_EMAIL')
RunTrigger(1,Nil,Nil,,'A1_EMAIL')
Endif
if valType(oJSON['simples']) == 'J'
M->A1_SIMPNAC:= if(oJSON['simples']['simples'] == 'Sim', '1', '2')
else
M->A1_SIMPNAC:= '2'
endif
If ExistTrigger('A1_SIMPNAC')
RunTrigger(1,Nil,Nil,,'A1_SIMPNAC')
Endif
for nX:=1 to len(oJSON['estabelecimento']['inscricoes_estaduais'])
if oJSON['estabelecimento']['estado']['id'] == oJSON['estabelecimento']['inscricoes_estaduais'][nX]['estado']['id']
M->A1_INSCR:= oJSON['estabelecimento']['inscricoes_estaduais'][nX]['inscricao_estadual']
If ExistTrigger('A1_INSCR')
RunTrigger(1,Nil,Nil,,'A1_INSCR')
Endif
EXIT
endif
next
elseIf cTab == 'SA2'
//MATA020 está em MVC
oModel := FWModelActive()
oModel:SetValue('SA2MASTER','A2_MSBLQL' ,if(oJSON['estabelecimento']['situacao_cadastral'] == 'Ativa','2','1'))
CC3->(dbSetOrder(1))
if !CC3->(dbSeek(xFilial('CC3')+oJSON['estabelecimento']['atividade_principal']['id']))
reclock('CC3',.t.)
CC3->CC3_FILIAL := xFilial('CC3')
CC3->CC3_COD := oJSON['estabelecimento']['atividade_principal']['id']
CC3->CC3_DESC := upper(oJSON['estabelecimento']['atividade_principal']['descricao'])
CC3->CC3_CSECAO := oJSON['estabelecimento']['atividade_principal']['secao']
CC3->CC3_CDIVIS := oJSON['estabelecimento']['atividade_principal']['divisao']
CC3->CC3_CGRUPO := strTran(oJSON['estabelecimento']['atividade_principal']['grupo'],'.')
CC3->CC3_CCLASS := strTran(strTran(oJSON['estabelecimento']['atividade_principal']['classe'],'.'),'-')
CC3->(msUnlock())
endif
oModel:SetValue('SA2MASTER','A2_CNAE',oJSON['estabelecimento']['atividade_principal']['id'])
oModel:SetValue('SA2MASTER','A2_TIPO', 'J')
if !empty(oJSON['estabelecimento']['pais']['id'])
CCH->(dbSetOrder(1))
if CCH->(dbSeek(xFilial('CCH') + '0' + oJSON['estabelecimento']['pais']['id']))
oModel:SetValue('SA2MASTER','A2_CODPAIS', allTrim(CCH->CCH_CODIGO))
endif
SYA->(dbSetOrder(2))
if SYA->(dbSeek(xFilial('SYA')+ upper(oJSON['estabelecimento']['pais']['nome'])))
oModel:SetValue('SA2MASTER','A2_PAIS', allTrim(SYA->YA_CODGI))
endif
endif
if !empty(oJSON['estabelecimento']['nome_fantasia'])
oModel:SetValue('SA2MASTER','A2_NREDUZ',oJSON['estabelecimento']['nome_fantasia'])
else
oModel:SetValue('SA2MASTER','A2_NREDUZ',avKey(cRet, 'A2_NREDUZ'))
endif
oModel:SetValue('SA2MASTER','A2_CEP', oJSON['estabelecimento']['cep'])
oModel:SetValue('SA2MASTER','A2_EST', oJSON['estabelecimento']['estado']['sigla'])
oModel:SetValue('SA2MASTER','A2_COD_MUN', substring(cValToChar(oJSON['estabelecimento']['cidade']['ibge_id']),3,5))
oModel:SetValue('SA2MASTER','A2_BAIRRO', oJSON['estabelecimento']['bairro'])
oModel:SetValue('SA2MASTER','A2_END',oJSON['estabelecimento']['logradouro'] + ', ' + oJSON['estabelecimento']['numero'])
oModel:SetValue('SA2MASTER','A2_COMPLEM', oJSON['estabelecimento']['complemento'])
oModel:SetValue('SA2MASTER','A2_DDD', oJSON['estabelecimento']['ddd1'])
oModel:SetValue('SA2MASTER','A2_TEL', oJSON['estabelecimento']['telefone1'])
oModel:SetValue('SA2MASTER','A2_FAX', oJSON['estabelecimento']['ddd_fax']+oJSON['estabelecimento']['fax'])
oModel:SetValue('SA2MASTER','A2_EMAIL', oJSON['estabelecimento']['email'])
if valType(oJSON['simples']) == 'J'
oModel:SetValue('SA2MASTER','A2_SIMPNAC', if(oJSON['simples']['simples'] == 'Sim', '1', '2'))
else
oModel:SetValue('SA2MASTER','A2_SIMPNAC', '2')
endif
for nX:=1 to len(oJSON['estabelecimento']['inscricoes_estaduais'])
if oJSON['estabelecimento']['estado']['id'] == oJSON['estabelecimento']['inscricoes_estaduais'][nX]['estado']['id']
oModel:SetValue('SA2MASTER','A2_INSCR', oJSON['estabelecimento']['inscricoes_estaduais'][nX]['inscricao_estadual'])
EXIT
endif
next
endif
else
if lJob
conout('Erro ao consultar CNPJ: ' + oCNPJws:getError())
else
alert('Erro ao consultar CNPJ: ' + oCNPJws:getError())
endif
endif
return cRet
Gatilho A1_CGC
Abajo el llenado del gatilho del campo A1_CGC, en él llamamos a la user function u_getcnpj pasando como parámetros a SA1 además del CNPJ:
Gatilho A2_CGC
Abajo el llenado del gatilho del campo A2_CGC, en él llamamos a la user function u_getcnpj pasando como parámetros a SA2 además del CNPJ:
Conclusión
El resultado debe ser como el gif abajo, al digitar el CNPJ el Protheus irá consultar el CNPJ.ws y llenar los campos automáticamente:
Puedes consultar los fuentes de este proyecto en GitHub, la clase mencionada está en este repositorio también.
Para saber más sobre nuestros planes y formas de pago accede a CNPJ.ws.