Propósito

✔ Programação GLOBAL® - Quaisquer soluções e/ou desenvolvimento de aplicações pessoais, ou da empresa, que não constem neste Blog devem ser tratados como consultoria freelance. Queiram contatar-nos: brazilsalesforceeffectiveness@gmail.com | ESTE BLOG NÃO SE RESPONSABILIZA POR QUAISQUER DANOS PROVENIENTES DO USO DOS CÓDIGOS AQUI POSTADOS EM APLICAÇÕES PESSOAIS OU DE TERCEIROS.

Mostrando postagens com marcador Get. Mostrar todas as postagens
Mostrando postagens com marcador Get. Mostrar todas as postagens

Integrando GPT | Estendendo o Excel usando chamadas de API REST

Estendendo o Excel usando chamadas de API REST#ProgramaçãoGlobal #VBA #PowerBI #Excel

 Compre OS LIVROS DESTA SÉRIE 


Hoje, gostaria de dar uma breve visão sobre como você pode estender a funcionalidade do Excel usando APIs REST específicas. Isso nos permite usar funcionalidades e dados interessantes e complexos que são desenvolvidos e fornecidos na Internet por provedores altamente especializados.


REST API - o que é isso realmente?

APIs REST são serviços web que se comunicam via protocolos HTTP. Eles usam métodos padronizados como GET, POST, PUT e DELETE para transferir e manipular dados entre cliente e servidor. Vários formatos de dados, como JSON e XML, são suportados.


Existem APIs para todos os propósitos imagináveis, por exemplo: para fornecer dados meteorológicos para um determinado local ou para fornecer informações de valores mobiliários. Fornecer tais informações e a infraestrutura associada é complexo, razão pela qual seu uso geralmente está sujeito a uma taxa ou é limitado. A vantagem sobre fontes de informação disponíveis gratuitamente é a baixa barreira de uso e, muitas vezes, a maior qualidade e nível de detalhes dos dados. 


Para demonstrar tudo, estamos desenvolvendo dois casos de uso protótipos com base nos quais nossas próprias funções podem ser desenvolvidas. Para fazer isso, selecionamos APIs que têm uma baixa barreira de entrada (especialmente um nível gratuito ou custos baixos) e ainda oferecem benefícios reconhecíveis. 


Uma pequena dica: a documentação da API fornece não apenas a definição, mas também exemplos de solicitações e respostas para as fontes de dados correspondentes (geralmente chamadas de endpoints) e métodos. Os exemplos são formulados principalmente para as linguagens de programação comuns (Python, Java, C). LLMs como o ChatGPT são capazes de converter esses exemplos diretamente em código VBA correspondente e explicá-lo com alta precisão. Na minha opinião, uma abordagem legítima para aprender e, claro, economizar tempo. 


Caso de uso 1

O requisito é separar o nome de uma determinada pessoa (composto por nome e sobrenome em qualquer ordem) em "sobrenome, nome". Para fazer isso, criamos uma função do Excel no VBA. 


Essa separação é uma tarefa não trivial que ocorre na prática quando, por exemplo, formulários de coleta de dados em sites não fornecem campos separados para nome e sobrenome. 


Exemplos: 

"Max Müller" --> "Müller, Max"

"Stefan Johannes Meier" --> "Meier, Stefan Johannes"


Caso de uso 2

Queremos criar uma função do Excel que retorne uma resposta correspondente como uma string de um prompt fornecido usando um modelo de linguagem OpenAI. Então usamos o ChatGPT na célula do Excel.


Este caso de uso serve para ilustrar a conexão da API. Nesta forma, ele não tem nenhuma relevância prática real, mas pode servir como ponto de partida para seus próprios desenvolvimentos, incluindo complementos complexos de IA para Excel. Claro, tudo isso já existe, mas fazer você mesmo é muito melhor.


Nós dividimos os nomes

Suponha que temos uma lista de nomes e sobrenomes, cada um em uma célula. Para processamento posterior, exigimos a separação mais segura possível entre nome e sobrenome. É claro que as características específicas de cada país devem ser levadas em conta. Programar isso nós mesmos é uma tarefa complexa que não queremos assumir por vários motivos. Uma pesquisa mostra que há vários provedores de serviços web correspondentes que, entre outras coisas, resolvem essa tarefa para nós.


Como exemplo, selecionei o seguinte provedor: Namsor | Verificador de nomes para determinação de gênero, origem e etnia 


Há uma API fácil de usar e bem documentada com uma cota mensal gratuita (ideal para testes).


Uma olhada no site nos mostra que há especialistas trabalhando aqui que não apenas podem separar nomes, mas também oferecem muitos outros serviços relacionados a nomes (por exemplo, derivar gênero ou origem do primeiro nome). Mas queremos focar na divisão. 


O primeiro passo é se registrar para receber uma chave de API para autenticar nossas chamadas. Essa chave é então usada para verificar as cotas e atribuir informações de pagamento. Devemos manter esta chave segura. 


A documentação da API nos fornece todas as informações necessárias sobre a sintaxe das solicitações e o formato das respostas. Há duas variantes: além de simplesmente fornecer o nome, você também pode fornecer informações adicionais sobre a origem da pessoa (por exemplo, o país), o que pode tornar a busca por resultados mais fácil e precisa.


#split-name-batch


#split-name-geo-batch 


Por exemplo, a solicitação e a resposta para a segunda variante se parecem com isto:



curl --request POST \ 

--url https://v2.namsor.com/NamSorAPIv2/api2/json/parseNameGeoBatch \

--header 'X-API-KEY: your-api-key' \

--header 'Accept: application/json'

--header 'Content-Type: application/json' \

--data '{"personalNames":[{"id":"e630dda5-13b3-42c5-8f1d-648aa8a21c42","name":"Ricardo Darín","countryIso2":"AR"}]}' 



{

    "personalNames": [

        {

            "script": "LATIN",

            "id": "e630dda5-13b3-42c5-8f1d-648aa8a21c42",

            "name": "Ricardo Darín",

            "nameParserType": "FN1LN1",

            "nameParserTypeAlt": "FN1LN2",

            "firstLastName": {

                "script": null,

                "id": null,

                "firstName": "Ricardo",

                "lastName": "Darín"

            },

            "score": 3.447624982163207

        }

    ]

}


Construímos uma função VBA que faz o seguinte:


  • Passando uma string contendo nome e sobrenome em qualquer ordem.
  • passando opcionalmente uma string contendo o código do país no formato ISO (por exemplo, DE para Alemanha)
  • O corpo JSON da solicitação é gerado a partir dos parâmetros e da nossa chave de API. O id é irrelevante para nossos propósitos porque passamos apenas um nome por solicitação. 
  • Enviamos uma solicitação POST para a API usando o objeto XMLHTTP. Se bem-sucedido, o resultado será retornado como um objeto JSON na resposta. Nome e sobrenome são fornecidos em campos separados. 
  • Para nossa função, criamos a string de retorno no formato "Sobrenome, Nome". Isso torna possível obter nomes e sobrenomes claramente durante o pós-processamento, separando as strings por vírgulas. Outros formatos de retorno também são concebíveis. 
  • Observação: o Excel não fornece funcionalidade interna para analisar objetos JSON. Há soluções para isso. Para manter nosso caso de uso simples, extraímos os dois campos diretamente por meio de pesquisa de string na string JSON (ExtractSepName).


Function SeparateName(name As String, Optional countryIso2 As String) As String

    Dim http As Object

    Dim apiKey As String

    Dim url As String

    Dim postData As String

    Dim response As String

    Dim parsedJson As Object

    Dim firstName As String

    Dim lastName As String

    

    ' Set your API key here

    apiKey = "YOUR API KEY COMES HERE"

    

    ' Set the URL for the API

    If countryIso2 = "" Then

        url = "https://v2.namsor.com/NamSorAPIv2/api2/json/parseNameBatch"

    Else

        url = "https://v2.namsor.com/NamSorAPIv2/api2/json/parseNameGeoBatch"

    End If

    

    ' Create the JSON data for the POST request

    If countryIso2 = "" Then

        postData = "{""personalNames"":[{""name"":""" & name & """}]}"

    Else

        postData = "{""personalNames"":[{""name"":""" & name & """,""countryIso2"":""" & countryIso2 & """}]}"

    End If

    

    ' Create the HTTP object

    Set http = CreateObject("MSXML2.XMLHTTP")

    

    ' Open the connection

    http.Open "POST", url, False

    

    ' Set the required headers

    http.setRequestHeader "X-API-KEY", apiKey

    http.setRequestHeader "Accept", "application/json"

    http.setRequestHeader "Content-Type", "application/json"

    

    ' Send the request with the JSON data

    http.send postData

    

    ' Get the response text

    response = http.responseText

    

    If http.Status < 400 Then

        SeparateName = ExtractSepName(response)

    Else

        SeparateName = "???"

    End If

    

End Function


Private Function ExtractSepName(response As String) As String

    Dim ipos1 As Integer, ipos2 As Integer

    Dim string1 As String, string2 As String

    

    string1 = """lastName"":"""

    string2 = """firstName"":"""

    

    ipos1 = InStr(1, response, string1) + Len(string1)

    ipos2 = InStr(ipos1 + 1, response, """")

    

    ExtractSepName = Mid(response, ipos1, ipos2 - ipos1)

    

    ipos1 = InStr(1, response, string2) + Len(string2)

    ipos2 = InStr(ipos1 + 1, response, """")

    

    ExtractSepName = ExtractSepName & ", " & Mid(response, ipos1, ipos2 - ipos1)


End Function 


No Excel agora você pode usar facilmente esta função:




Isso nos dá uma base para outras soluções.


ChatGPT na célula do Excel

Abaixo, aplicamos o mesmo princípio para chamar serviços da API OpenAI. O caso de uso é de natureza bastante teórica, mas pode servir de base para aplicações úteis.


Preparação :


Precisamos de uma chave de API para a API. Sempre há uma taxa para usar o software, mas os custos são administráveis ​​(especialmente para aplicativos de teste) e um bom investimento para seus próprios experimentos. O faturamento é essencialmente baseado no número de tokens gerados. O modelo LLM utilizado também desempenha um papel na precificação. O site oferece boas informações sobre os custos habituais para visualizações típicas. 

O processo é explicado muito bem no site da OpenAI . Depois de inserir suas informações de pagamento, você pode gerar uma chave de API (e mantê-la segura). 


Queremos usar o endpoint text-generation , que (semelhante ao ChatGPT) gera uma resposta a partir de um prompt. Incorporamos isso em uma função VBA para que o prompt possa ser passado e recebamos a resposta do LLM como resultado da função. Para o nosso caso usamos o modelo gpt-4o-mini .   


Observação: neste caso de uso, analisamos o objeto JSON retornado com o conversor JSON gratuito ( link ). 


O código para nossa função VBA se parece com isso. Não entrarei em detalhes sobre a conversão do objeto JSON no final; o conversor mencionado acima cuida disso.


Function CallOpenAI(prompt As String) As String

    Dim http As Object

    Dim url As String

    Dim apiKey As String

    Dim response As String

    Dim jsonResponse As Object

    Dim jsonRequest As Object

    Dim messages As Object

    

    ' Set your API key here

    apiKey = "YOUR API KEY GOES HERE"


    ' Initialize the request

    Set http = CreateObject("MSXML2.XMLHTTP")

    url = "https://api.openai.com/v1/chat/completions"

    

    ' Create the JSON request body

    Set jsonRequest = CreateObject("Scripting.Dictionary")

    jsonRequest.Add "model", "gpt-4o-mini"

    

    ' Create the messages array

    Set messages = CreateObject("Scripting.Dictionary")

    messages.Add "role", "user"

    messages.Add "content", prompt

    

    Dim messagesArray As Object

    Set messagesArray = CreateObject("Scripting.Dictionary")

    messagesArray.Add "messages", Array(messages)

    

    jsonRequest.Add "messages", messagesArray("messages")

    

    ' Convert the JSON request to a string

    Dim jsonRequestString As String

    jsonRequestString = ConvertToJson(jsonRequest)

    

    ' Send the HTTP POST request

    With http

        .Open "POST", url, False

        .setRequestHeader "Content-Type", "application/json"

        .setRequestHeader "Authorization", "Bearer " & apiKey

        .send jsonRequestString

        response = .responseText

    End With

    

    ' Parse the JSON response

    Set jsonResponse = JsonConverter.ParseJson(response)

    

    ' Output the result

    CallOpenAI = jsonResponse("choices")(1)("message")("content")

End Function 


É isso. Isso nos permite recuperar uma resposta do modelo no Excel simplesmente especificando um prompt.


Sim, a API, é claro, oferece muito mais possibilidades, diferentes modelos, parâmetros de ajuste, etc. 



APIs REST comuns também podem ser usadas no VBA por meio de chamadas simples. A sintaxe da chamada e, especialmente, a estrutura dos dados de solicitação e resposta estão incluídas na documentação da API e podem ser facilmente transferidas para a lógica do VBA.


Ao se deparar com tarefas que parecem complexas, é sempre uma boa ideia verificar se há um serviço web que pode ser chamado via API e executar a tarefa.


Por favor, avise-me se você tiver alguma sugestão ou acréscimo.



👉 Siga André Bernardes no LinkedinClique aqui e contate-me via What's App.

Comente e compartilhe este artigo!

brazilsalesforceeffectiveness@gmail.com


 Série de Livros nut Project 

DONUT PROJECT: VBA - Projetos e Códigos de Visual Basic for Applications (Visual Basic For Apllication)eBook - DONUT PROJECT 2024 - Volume 03 - Funções Financeiras - André Luiz Bernardes eBook - DONUT PROJECT 2024 - Volume 02 - Conectando Banco de Dados - André Luiz Bernardes eBook - DONUT PROJECT 2024 - Volume 01 - André Luiz Bernardes

DONUT PROJECT 2014 - VBA - Excel - Obtendo o Nome da Planilha sem a Extensão - Get name of workbook without extension



Suponha que deseje saber o nome da Planilha (workbook) que está usando no momento, mas que este venha sem a sua respectiva extensão, poderia obtê-lo assim:

Function NameOfWorkbook as String

Let NameOfWorkbook = Left(ThisWorkbook.Name, (InStrRev(ThisWorkbook.Name, ".", -1, vbTextCompare) - 1))

End Function

A forma de resolver isso foi usando a função InStrRev para encontrar a última ocorrência de "." E a função Left() é usada para designar todos os caracteres a esquerda desta posição para a função NameOfWorkbook.


 Série de Livros nut Project 

DONUT PROJECT: VBA - Projetos e Códigos de Visual Basic for Applications (Visual Basic For Apllication)eBook - DONUT PROJECT 2024 - Volume 03 - Funções Financeiras - André Luiz Bernardes eBook - DONUT PROJECT 2024 - Volume 02 - Conectando Banco de Dados - André Luiz Bernardes eBook - DONUT PROJECT 2024 - Volume 01 - André Luiz Bernardes




 Série VBA Outlook: 

VBA Outlook - Usando o VBA no Outlook - Using Visual Basic for Applications in Outlook - Usando o DAO em vez do ADO (Using DAO instead of ADO) VBA Outlook - Usando o VBA no Outlook - Using Visual Basic for Applications in Outlook - Usando um Recordset Desconectado (Using a Disconnected Recordset) VBA Outlook - Usando o VBA no Outlook - Using Visual Basic for Applications in Outlook - Usando Transações (Using Transactions)


VBA Outlook - Usando o VBA no Outlook - Using Visual Basic for Applications in Outlook - Usando Parâmetros em Consultas SQL (Using Parameters in SQL Queries) VBA Outlook - Usando o VBA no Outlook - Using Visual Basic for Applications in Outlook - Tratando Erros (Handling Errors) VBA Outlook - Usando o VBA no Outlook - Using Visual Basic for Applications in Outlook - Fechando a Conexão (Closing the Connection)


VBA Outlook - Usando o VBA no Outlook - Using Visual Basic for Applications in Outlook - Enviando um e-Mail para cada Cliente (Sending an email to each Customer) VBA Outlook - Usando o VBA no Outlook - Using Visual Basic for Applications in Outlook - Lendo Dados do Conjunto de Registros (Reading Recordset Data) VBA Outlook - Usando o VBA no Outlook - Using Visual Basic for Applications in Outlook - Executando uma Consulta SQL (Executing an SQL Query)


VBA Outlook - Usando o VBA no Outlook - Using Visual Basic for Applications in Outlook - Conectando ao Banco de Dados usando ADO (Connecting to the Database using ADO)


 Série DONUT PROJECT 2024 

DONUT PROJECT 2024 - VBA - Retorna o Valor do Conteúdo da Área de Transferência do Sistema DONUT PROJECT 2024 - VBA - Retorna a Versão do Sistema Operacional em que o Excel está sendo Executado DONUT PROJECT 2024 - VBA - Desenvolvimento de Ferramentas de Análise de Riscos

DONUT PROJECT 2024 - VBA - Desenvolvimento Obter Informações sobre a Versão do Sistema Operacional DONUT PROJECT 2024 - VBA - Automatizando Tarefas de Engenharia e Design DONUT PROJECT 2024 - VBA - Automatização de Processos de Medir Distâncias no Google Maps

DONUT PROJECT 2024 - VBA - Automatização de Processos de Marketing Mail com o GMail DONUT PROJECT 2024 - VBA - Automatização de Processos de Marketing Mail DONUT PROJECT 2024 - VBA - Como proteger e ocultar fórmulas em uma planilha do Excel usando VBA

DONUT PROJECT 2024 - VBA - Código Exporta os dados e Atualiza as Quantidades em Estoque de um Determinado Produto na Planilha "Estoque" Crie Funções Personalizadas com Visual Basic for Applications (VBA) para Análise de Dados nos Negócios Saber programar em Visual Basic for Applications (VBA)



 Série DONUT PROJECT 2021 


DONUT PROJECT 2021 - VBA Function: Sabe como enviar dados para o Google Sheet, através do MS Excel, usando VBA, no MacBook?

DONUT PROJECT 2021 - VBA Function:  Como Rastrear o Google Maps (Coordenadas Geográficas) no VBA Excel? DONUT PROJECT 2021 - VBA Function:  Crie Acrônimos a partir de Strings de Texto DONUT PROJECT 2021 - VBA Function:  Convertendo uma Matrix num Vetor - Convert Matrix to a Vector

DONUT PROJECT 2021 - VBA Function:  Como tornar o Formulário Transparente no MS Excel? DONUT PROJECT 2021 - VBA Function:  Faça Buscas no Google a Partir da Célula do MS Excel - Search Google From a Cell DONUT PROJECT 2021 - VBA Function:  Decompondo um Nome nas Dimensões de uma Matriz


DONUT PROJECT 2021 - VBA Function: Extraindo o Último Sobrenome de um Nome Completo ou a Última Palavra de uma Frase DONUT PROJECT 2021 - VBA Function:  Extraindo o Segundo Nome de um Nome Completo ou a Segunda Palavra de uma Frase DONUT PROJECT 2021 - VBA Function: Extraindo o Primeiro Nome ou  a Primeira Palavra de uma Frase



 Série DONUT PROJECT 2018 

DONUT PROJECT 2018 - VBA - 12 - Aumente sua Produtividade DONUT PROJECT 2018 - VBA - 10 - Loop For-Each DONUT PROJECT 2018 - VBA - 08 - Referenciando Ranges


DONUT PROJECT 2018 - VBA - 07 - Amostra de Macro  DONUT PROJECT 2018 - VBA - 06 - Recursos Adicionais DONUT PROJECT 2018 - VBA - 05 - Gravando a Primeira Macro

DONUT PROJECT 2018 - VBA - 04 - Opções de Solução DONUT PROJECT 2018 - VBA - 03 - Requisitos e Preparação DONUT PROJECT 2018 - VBA - 02 - Continua Cético

DONUT PROJECT 2018 - VBA - 01 - Maximizando Sua Eficiência DONUT PROJECT 2018 - Excel - Ao Gravar Macro Altere o Método SELECT por RANGE 


 DONUT PROJECT 2018 - Excel - Acelerando as Macros - Desativando os Recursos de Atualização



 Série DONUT PROJECT 2015 

DONUT PROJECT 2015 - Excel - Formatting A Pivot Field's Data - Formatando os Campos de uma Tabela Dinâmica DONUT PROJECT 2015 - Excel - Formatting A Pivot Table's Data - Formatando os Dados de um Tabela Dinâmica DONUT PROJECT 2015 - Excel - Expand/Collapse Entire Field Detail - Ampliando Detalhadamente os Campos da Tabela Dinâmica

DONUT PROJECT 2015 - Extraindo e-Mails - Extracting An Email Address From Text   DONUT PROJECT 2015 - Função - Extraindo Quaisquer Elementos de uma String a Partir do Limitador DONUT PROJECT 2015 - Função - Retorna o número de ocorrências de um caracter numa string

DONUT PROJECT 2015 - Função - Retorna Qualquer Conteúdo Delimitado por 2 Caracteres  DONUT PROJECT 2015 - Função - Retorna Apenas o Conteúdo Entre Parênteses DONUT PROJECT 2015 - Função - Extrai Conteúdo entre Parênteses

DONUT PROJECT 2015 - Excel - Report Layout DONUT PROJECT 2015 - Excel - Grand Totals - Inserindo Totais para todas as Colunas e Linhas na Tabela Dinâmica DONUT PROJECT 2015 - Excel - Change Pivot Table Data Source Range - Mudando a Fonte de Dados da Tabela Dinâmica

DONUT PROJECT 2015 - Excel - Refresh Pivot Tables - Aplicando Refresh em Tabelas Dinâmicas DONUT PROJECT 2015 - How To Create Partially Anonymous Data - Como Manter Informações parcialmente Anônimas  DONUT PROJECT 2015 - Excel - Clear Report Filter - Limpando o Filtro da Tabela Dinâmica

DONUT PROJECT 2015 - Excel - Report Filter On Multiple Items - Criando Filtros Múltiplos na Tabela Dinâmica DONUT PROJECT 2015 - Excel - Report Filter On A Single Item - Criando Filtro de Relatório na Tabela Dinâmica DONUT PROJECT 2015 - Excel - Remove Calculated Pivot Fields - Removendo Campos Calculados da Tabela Dinâmica

DONUT PROJECT 2015 - Excel - Remove Pivot Fields - Removendo Campos da Tabela Dinâmica  DONUT PROJECT 2015 - Excel - Add A Values Field - Adicionando Campos Calculados na Tabela Dinâmica DONUT PROJECT 2015 - Excel - Add Calculated Pivot Fields - Adicionando Campos Calculados na Tabela Dinâmica

DONUT PROJECT 2015 - Excel - Add Pivot Fields - Adicionado Campos na Tabela Dinâmica DONUT PROJECT 2015 - Excel - Delete All Pivot Tables - Apagando todas as Tabelas Dinâmicas DONUT PROJECT 2015 - Excel - Delete A Specific Pivot Table - Apague um Tabela Dinâmica Específica


DONUT PROJECT 2015 - VBA To Add A Confidentiality Footer Statement In Excel, Word, or PowerPoint - Adicionando um Rodapé com Status de Confidencialidade no Excel, Word ou PowerPoint DONUT PROJECT 2015 - Excel - Create A Pivot Table - Criando uma Tabela Dinâmica


 Série DONUT PROJECT 2014 

DONUT PROJECT 2014 - Use os add-ins do MS Excel e dê um salto em sua performance DONUT PROJECT 2014 - VBA - Automatizando o Outlook para enviar um e-mail com anexo  DONUT PROJECT 2014 - VBA - Outlook - Salvando todos os arquivos anexados nos e-mails


DONUT PROJECT 2014 - VBA - Criando uma Matriz de Datas MAT - Moving Annual Total  DONUT PROJECT 2014 - VBA - Excel - Atualizando Tabelas Dinâmicas - Refresh Pivot Table via VBA DONUT PROJECT 2014 - VBA - Excel - Removendo os Caracteres Alfabéticos e Especiais


DONUT PROJECT 2014 - VBA - Access - Criando uma Query com Parâmetros DONUT PROJECT 2014 - VBA - Access - Atualizando o conteúdo de uma Query DONUT PROJECT 2014 - VBA - Access - Saiba o Número de Registro de cada tabela


DONUT PROJECT 2014 - VBA - Access - Extraia Blocos de Dados do Banco de Dados - Sem Problemas de TIMEOUT DONUT PROJECT 2014 - VBA - Access - Lista o Tamanho de Todas as Tabelas DONUT PROJECT 2014 - VBA - Excel - Populando um ListBox no seu Formulário

DONUT PROJECT 2014 - VBA - Excel - Importando arquivos CSV  DONUT PROJECT 2014 - VBA - Excel - Deletando Conexões de Dados  DONUT PROJECT 2014 - VBA - Excel - Obtendo o Nome da Planilha sem a Extensão - Get name of workbook without extension


DONUT PROJECT 2014 - VBA - WORD - Exportação Automatizada - De *.docx Para *.pdf - Otimizando o tamanho


  Clique aqui e nos contate via What's App para avaliarmos seus projetos 

Envie seus comentários e sugestões e compartilhe este artigo!
brazilsalesforceeffectiveness@gmail.com

Inline image 1

diHITT - Notícias