Função para consultar dados de um CNPJ via AdvPL

No artigo de hoje vamos demonstrar em como consultar informações de um CNPJ via WebService.

Pessoal, antes de começarmos apenas 2 observações. A primeira é que a TOTVS já possui configurações para preencher no cadastro de Fornecedor e CNPJ, se quiser ver como, segue o link do TDN: https://tdn.totvs.com/pages/releaseview.action?pageId=581873683

 

A segunda é que essa consulta é oficial do link https://www.receitaws.com.br/v1/cnpj/00000000000000 , onde os zeros no fim é o número do CNPJ, por exemplo 00.000.000/0000-00 . Porém se você quiser ver dados de pessoa física ou o score e inadimplências ai seria interessante fazer uma integração com a SERASA ou SOPHUS (nós já fizemos com a SOPHUS, segue o link com tutorial – https://terminaldeinformacao.com/2020/12/10/como-integrar-protheus-com-a-sophus/ ).

 

Agora que as observações já foram feitas, abaixo um descritivo da lógica feita no programa:

  1. Recebe o CNPJ por parâmetro
  2. Via FWRest é feito a comunicação com a URL do receitaws.com.br
  3. A string JSON, nós transformamos em um objeto com JSONObject
  4. Definimos um Array como Retorno os dados desse objeto (esse array tem 16 posições que estão documentadas no Protheus.DOC da função zBusCNPJ)

 

Abaixo como ficou a função:

//Bibliotecas
#Include "TOTVS.ch"

/*/{Protheus.doc} User Function zBusCNPJ
(long_description)
@type  Function
@author Atilio
@since 18/12/2022
@version version
@param cCNPJ, Caractere, Número do CNPJ a ser consultado
@return aDados, Array, Retorna um array com dados do cnpj consultado (veja as posições na observação abaixo)
@example
    aDados := u_zBusCNPJ("00.000.000/0000-00")
    If aDados[01]
        // Deu certo a consulta
    EndIf
@obs As posições do aDados são:
    [01] Se deu certo a consulta (.T.) ou (.F.)
    [02] Data de Abertura
    [03] Situação
    [04] Razão Social
    [05] Nome Fantasia
    [06] Porte
    [07] Natureza Juridica
    [08] Endereço
    [09] Número
    [10] Cidade
    [11] Estado
    [12] CEP
    [13] eMail
    [14] Telefone
    [15] CNPJ
    [16] Última Atualização


    A consulta é feita no site: https://www.receitaws.com.br/v1/cnpj/00000000000000
/*/

User Function zBusCNPJ(cCNPJ)
    Local aArea         := FWGetArea()
    Local aDados        := Array(16)
    Local aHeader       := {}    
    Local oRestClient   := FWRest():New("https://www.receitaws.com.br/v1")
    Local cResultado    := ""
    Local jResultado    := Nil
    Local cError        := ""
    Default cCNPJ       := ""

    //Define a primeira posição como .F. default
    aDados[01] := .F.

    //Retira caracteres especiais
    cCNPJ := StrTran(cCNPJ, ".", "")
    cCNPJ := StrTran(cCNPJ, "/", "")
    cCNPJ := StrTran(cCNPJ, "-", "")

    //Se veio CNPJ e tem 14 caracteres
    If ! Empty(cCNPJ) .And. Len(cCNPJ) == 14

        //Adiciona os headers que serão enviados via WS
        aAdd(aHeader,'User-Agent: Mozilla/4.0 (compatible; Protheus '+GetBuild()+')')
        aAdd(aHeader,'Content-Type: application/json; charset=utf-8')
    
        //Define a url e aciona o método GET
        oRestClient:setPath("/cnpj/" + cCNPJ)
        If oRestClient:Get(aHeader)

            //Pega o resultado
            cResultado := DecodeUTF8(oRestClient:cResult, "cp1252")
            jResultado := JsonObject():New()
            cError     := jResultado:FromJson(cResultado)

            //Se não houve erros
            If Empty(cError) .And. jResultado:GetJsonObject('status') != "ERROR"
                aDados[01] := .T.
                aDados[02] := jResultado:GetJsonObject('abertura')
                aDados[03] := jResultado:GetJsonObject('situacao')
                aDados[04] := jResultado:GetJsonObject('nome')
                aDados[05] := jResultado:GetJsonObject('fantasia')
                aDados[06] := jResultado:GetJsonObject('porte')
                aDados[07] := jResultado:GetJsonObject('natureza_juridica')
                aDados[08] := jResultado:GetJsonObject('logradouro')
                aDados[09] := jResultado:GetJsonObject('numero')
                aDados[10] := jResultado:GetJsonObject('municipio')
                aDados[11] := jResultado:GetJsonObject('uf')
                aDados[12] := jResultado:GetJsonObject('cep')
                aDados[13] := jResultado:GetJsonObject('email')
                aDados[14] := jResultado:GetJsonObject('telefone')
                aDados[15] := jResultado:GetJsonObject('cnpj')
                aDados[16] := jResultado:GetJsonObject('ultima_atualizacao')
            EndIf
        EndIf
    EndIf

    FWRestArea(aArea)
Return aDados

Ai para fazermos o teste é bem simples, por exemplo:

User Function zTstCNPJ()
    Local aDados    := {}
    Local cMensagem := ""

    aDados := u_zBusCNPJ("28.671.016/0001-45")

    If aDados[1]
        cMensagem += "Data de Abertura: "   + aDados[02] + " " + CRLF
        cMensagem += "Situação: "           + aDados[03] + " " + CRLF
        cMensagem += "Nome Fantasia: "      + aDados[05] + " " + CRLF
        cMensagem += "Porte: "              + aDados[06] + " " + CRLF
        cMensagem += "Natureza Juridica: "  + aDados[07] + " " + CRLF
        cMensagem += "Cidade: "             + aDados[10] + " " + CRLF
        cMensagem += "Estado: "             + aDados[11] + " " + CRLF
        cMensagem += "Última Atualização: " + aDados[16] + " " + CRLF

        FWAlertInfo(cMensagem, "Dados do CNPJ")
    EndIf
Return

No teste acima, é exibido uma mensagem de teste, conforme abaixo:

Mensagem de Exemplo

 

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

4 Responses

  1. Damião C. Duxe disse:

    Pena que o site receitaws não possui a informação de Inscrição Estadual.
    Estou desenvolvendo meu pelo cnpjws.com.br

  2. Tiago Fonseca disse:

    Bom dia, função top. Vai me ajudar no cadastro de novos clientes, você é fera Dan

Deixe uma resposta

Terminal de Informação