Cadastrar clientes ou fornecedores no Protheus pode ficar mais fácil se consultarmos o CNPJ na API do CNPJ.ws
Com a integração podemos usar a API para consultar o endereço, inscrição estadual, situação cadastral, CNAE e muitas outras informações que podem ser importantes no momento do cadastro do cliente ou fornecedor.
Já criamos uma classe em ADVPL para integramos o Protheus ao CNPJ.ws no post: Consultar CNPJ com ADVPL (Protheus).
Nesse post vamos usar essa classe ADVPL para desenvolvermos um gatilho que utilizaremos tanto no cadastro de clientes quanto no cadastro de fornecedores. Lembrando que você pode usar nossa API gratuita para consultar CNPJ, mas com uma limitação de 3 consultas por minuto ou pode adquirir um dos nossos planos comerciais.
Função getCNPJ
Vamos começar criando uma user function que iremos chamar nos nossos gatilhos. Veja que ela recebe dois parâmetros:
- cTab: SA1 ou SA2, indicando se estamos trabalhando com clientes ou fornecedores
- cCNPJ: o número do CNPJ
Também fizemos um tratamento usando a função isBlind
para caso o gatilho seja chamado via execauto, sem a
interface do usuário. E usamos a função FWMsgRun
para que o usuário tenha um retorno visual e não apenas uma
tela "travada" enquanto o processo é executado.
#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 criar uma static function que será a responsável pela comunicação com o CNPJ.ws . Você deve revisar bem esse código para atender as suas necessidades aí na sua empresa, aqui eu preenchi todos os campos que me vieram a cabeça, mas sinta-se à vontade para fazer alterações:
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
Abaixo o preenchimento do gatilho do campo A1_CGC, nele chamamos user function u_getcnpj
passando como
parâmetros a SA1 além do CNPJ:
Gatilho A2_CGC
Abaixo o preenchimento do gatilho do campo A2_CGC, nele chamamos user function u_getcnpj
passando como
parâmetros a SA2 além do CNPJ:
Conclusão
O resultado deve ser como o gif abaixo, ao digitar o CNPJ o Protheus irá consultar o CNPJ.ws e preencher os campos automaticamente:
Você pode consultar os fontes desse projeto no GitHub, a classe mencionada está nesse repositório também.
Para saber mais sobre nossos planos e formas de pagamento acesse CNPJ.ws.
Até mais!