Pular para o conteúdo principal

Gatilho para consultar CNPJ no Protheus

· Leitura de 5 minutos
Carlos Tirabassi

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.

/src/getcnpj.prw
#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:

/src/getcnpj.prw
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 A1_CGC

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:

Gatilho A2_CGC

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:

Gatilho CNPJ.ws

Você pode consultar os fontes desse projeto no GitHub, a classe mencionada está nesse repositório também.

Até mais!