domingo, 27 de dezembro de 2015

Caputurando novos clientes em potencial com o Web-to-lead

Hoje conheci uma ferramenta bem interessante, da Salesforce, para capturar Leads, chamada "Web-to-lead". E é sobre ela que falaremos nesse post.

Para quem não está familiarizado com o termo, lead é o famoso "prospect", novo contato, cliente em prospecção ou cliente em potencial... Dentro da Salesforce, mesmo com a linguagem em português brasileiro, o termo não é traduzido. Sinal que o termo lead é conhecido e usado no meio do marketing e venda.

A ferramenta "Web-to-lead" da salesforce, permite integrar seu website com a plataforma SFDC, de forma simples e rápida. Através dela, além de capturar os leads diretamente para dentro da sua Org, é possível facilmente configurar respostas automáticas para o "cliente" e definir os campos que serão inseridos através do website. Tudo isso independente se seu site foi desenvolvimento em HTML, ASP.NET, JAVA, PHP, etc.

Iniciando os trabalhos, vamos criar um Modelo de e-mail para que, sempre que um lead, entre em contato comigo, pelo meu site, ele receba um e-mail automático. 



Agora que já temos o nosso e-mail padrão de auto-resposta, vamos configurar o Web-to-lead. Acesse Setup / Criar / Personalização / Leads / Web-to-lead



Caso a opção "Web-to-lead ativado" não esteja marcada, marque-a. Além disso, defina no campo "Modelo de resposta padrão", para definir o modelo de e-mail que criamos anteriormente para enviar uma resposta automática para o lead. Se não desejar enviar um e-mail automático para seu "cliente", basta não preencher o campo "Modelo de resposta padrão".

Vamos então criar o nosso formulário que será integrado ao nosso website. Ainda em Setup / Criar / Personalização / Leads / Web-to-lead acesse a opção "Criar formulário Web-to-lead". 



Nessa opção vamos definir quais campos (do objeto Lead) estarão disponíveis para o usuário preencher. Adicione os campos desejados na caixa "Campos selecionados". Você poderá também alterar a ordem desse campos através dos botões "Para cima" e "Para baixo". E por final, será necessário definir a "URL de retorno". Isto é, para qual página do seu site, o usuário será redirecionado após preencher e submeter o formulário. Creio ser importante criar uma página (pode ser HTML mesmo) no seu website, dizendo que o formulário de contato foi enviado com sucesso e setar nesse campo "URL de retorno". Mas caso não tenha interesse, coloque a página inicial do seu site ou outra que achar relevante.

Após realizar configurar o formulário, clique em "Gerar", para gerar um formulário HTML. Veja o resultado da geração:



Esses código gerados (HTML) deverá ser salvo em uma página HTML, PHP, ASPX, JSP ou qualquer outro formato web. E posteriormente enviado para o servidor que hospeda seu website. Importante ressaltar que o código gerado, não possui nenhuma formatação especial com CSS. Dessa forma, creio ser importante seu webdesigner trabalhar nesse código, caso você não tenha know-how para formatar.

Após a implantação da página no seu site, é só acessar o endereço, preencher os campos e clicar em "Enviar". E os dados, como mágica, irão aparecer entre seus Leads, no Salesforce. Simples, não acha?!

Regras de auto-resposta

As regras para resposta automática (ou auto-resposta) são importantes para enviar e-mails automáticos, diferenciados, de acordo com o preenchimento dos campos do formulário. Um exemplo seria enviar um e-mail específico, caso o usuário queira informações sobre um produto X. Porém se ele quiser mais detalhes sobre o produto Y, você poderá enviar automaticamente outro e-mail.

No nosso modelo de e-mail, que criamos no início desse post, se tratava de uma mensagem totalmente em português, certo? Mas se alguém acessar o formulário de contato do nosso site e disser que mora fora do Brasil? Ele irá receber uma resposta automática em português, certo? Errado... porque vamos criar uma regra para enviar um e-mail em inglês para o lead!

Primeiramente, vamos criar novamente um novo modelo de e-mail, porém com o texto em inglês. O segundo passo, será definir (caso não tenha feito isso ainda em sua Org), um e-mail padrão para envio da mensagem automática. Isso será possível através de: Setup / Administrar / Administração de email / Endereços de toda a organização. Nessa opção, clique em "Adicionar".


Preencha os campos "Exibir nome" e "Endereço de email". Posteriormente, marque uma das opções de utilização do e-mail (nesse caso, optei pela opção que permite todos os perfis utilizarem o endereço) e por fim, clique em salvar. É importante destacar que você receberá uma mensagem no e-mail cadastrado, para que você possa confirmar a autenticidade dessa conta.

Até então, estavamos apenas pré-configurando alguns itens para criar a a regra de resposta automática. Agora vamos de fato, criar a regra. Acesse: Setup / Criar / Personalização / Leads /Regras de resposta automática de lead. Em seguida, clique em "Novo". Digite um nome para regra e marque a opção "Ativado":


Após salvar, você será direcionado para a lista de regras de auto-resposta. Clique sobre o nome da regra para configurá-la. 
Na lista "Entrada de regras" clique em "Novo".



Nessa tela, é necessário preencher a ordem de classificação da regra. Isso significa que você poderá ter várias "entradas" para essa regra. 
Em seguida, preencher o critério para que seja enviado o modelo de e-mail que selecionaremos a seguir (e não o padrão). Nesse caso, colocamos que o campo "País" do objeto Lead, não pode ser (não igual) a "Brasil". Isto é, se o usuário, preencher no formulário, algo diferente de "Brasil", ele irá receber o e-mail do modelo que selecionaremos a seguir. 
Logo após, precisamos preencher os campos "Nome" e "Endereço de e-mail". É importante destacar que o endereço de e-mail preenchido deve ser um e-mail válido, cadastrado na opção "Endereços de toda organização", que vimos acima.
E por fim o modelo de e-mail em inglês, que criamos anteriormente. 
Agora é somente Salvar e testar. 

Veja que, caso preencha no formulário do site, o campo País: Brasil, receberá um e-mail em português. Caso não preencha, receberá em inglês.

Para finalizar, é importante fazer as seguintes ressalvas:

- Você não poderá selecionar campos de relacionamento do objeto lead, para serem inseridos no formulário, exceto Campanha.
- Você somente poderá receber 500 leads por dia. Caso precise receber mais, entre em contato com a Salesforce.
- Caso deseje validar os campos do formulário gerado para seu site, você deverá fazer por conta própria usando javascript. Regras de validação criadas no SFDC serão inválidas para o formulário web do seu site.

Bem, acho que já me alonguei demais. Até mais e bons leads :)

quarta-feira, 23 de dezembro de 2015

Problemas com Update em Custom Settings, no Salesforce.com

Estava trabalhando recentemente em uma demanda, em que eu deveria alterar, via código Apex, o valor de alguns campos de uma Custom Settings. Como já havia feito a operação de consulta de dados de uma Custom Settings com certa facilidade anteriormente, imaginei ser bem tranquila também a atualização. E realmente é! A questão é que tive alguns problemas para realizar essa operação de Update.

Caso tenha chegado até aqui, sem muito conhecimento do que são as Custom Settings, acesse o link abaixo para maiores informações:
https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_methods_system_custom_settings.htm

Inicialmente, antes de resolver o problema, precisamos de ter ciência da hierarquia das Custom Settings:
- Geral de toda Org;
- Específica de um Perfil de Usuário;
- Específica de um Usuário;

Bem, conhecendo a hierarquia, realizei alguns teste e verifiquei as formas de buscar os dados das Custom Settings:

MinhaCustomSetting__c settings = MinhaCustomSetting__c.getInstance();
Dessa forma eu buscava o valor padrão para o meu usuário, sempre respeitando a hierarquia. Isto é, se houvesse um valor para meu usuário, este seria retornado. Caso não, retornaria do perfil do meu usuário. Caso não, retornaria o valor geral da Org.


MinhaCustomSetting__c settings = MinhaCustomSetting__c.getInstance('IdDoUsuario');
Dessa forma eu recebia o valor padrão de Custom Setting para o usuário indicado, sempre respeitando a hierarquia.

MinhaCustomSetting__c settings = MinhaCustomSetting__c.getInstance('IdDoPerfil');
Busca os valores padrões para o perfil, se existir, caso não, retornará os valores padrões da Org;

MinhaCustomSetting__c settings = MinhaCustomSetting__c.getOrgDefaults();
Busca os valores padrões da Org, independente de usuário ou perfil;

MinhaCustomSetting__c settings = MinhaCustomSetting__c.getValues('IdDoUsuario');
Busca os valores do usuário como um todo. A diferença para o getInstance('IdDoUsuario') é que se houver (no getInstance) 2 campos, 1 preenchido e o outro não, será feita uma busca, para cima na hierarquia até encontrar um valor para a variável não preenchida. Já para o getValues('IdDoUsuario') irá retornar os valores do usuário, independente do preenchimento;

MinhaCustomSetting__c settings = MinhaCustomSetting__c.getValues('IdDoPerfil');
Busca os valores do por perfil, com a mesma lógica do getValues('IdDoUsuario');

Com essas informações, comecei a escrever o código para buscar os dados relacionados ao meu usuário, na Custom Settings:


           MinhaCustomSetting__c settings = MinhaCustomSetting__c.getInstance();  
           settings.Campo__c = 'Novo valor';  
           update settings;  

Porém, ao executar esse código, percebi que o valor do campo "Campo__c" não era atualizado. Após realizar diversos testes, percebi que ao fazer acessar os dados com o getInstance() sem parâmetro, o objeto settings, instancia o MinhaCustomSetting__c com o campo ID nulo. E por esse motivo o Update não funcionava. Afinal, é impossível atualizar algo, sem seu respectivo ID. 
Diante dessa situação, resolvi realizar outros testes e ficou claro que somente seria instanciado o objeto com o ID, quando houvesse a referência hierárquica criada. Por exemplo: 

- Geral de toda Org: Referenciado;
- Específica de um Perfil de Usuário: Referenciado;

- Específica de um Usuário: Não referenciado;

Com o cenário acima, qual dos abaixo, retornaria o ID?


 MinhaCustomSetting__c setting1 = MinhaCustomSetting__c.getInstance();  
 System.debug('setting1: ' + setting1.id);  
 //Não retorna ID pois pega os valores pela hierarquia  
   
 MinhaCustomSetting__c setting2 = MinhaCustomSetting__c.getInstance(UserInfo.getUserId());  
 System.debug('setting2: ' + setting2.id);  
 //Não retorna ID pois não criei uma referencia direta por usuário  
   
 MinhaCustomSetting__c setting3 = MinhaCustomSetting__c.getInstance(UserInfo.getProfileId());  
 System.debug('setting3: ' + setting3.id);  
 //Retorna o ID pois criei uma referência para o perfil  
   
 MinhaCustomSetting__c setting4 = MinhaCustomSetting__c.getOrgDefaults();  
 System.debug('setting4: ' + setting4.id);  
 //Retorna o ID, pois há uma referência para toda ORG  
   
 MinhaCustomSetting__c setting5 = MinhaCustomSetting__c.getValues(UserInfo.getUserId());  
 System.debug('setting5: ' + setting5.id);  
 //Exceção é levantada, pois não há referência para o usuário e o settings5 é null;  
   
 MinhaCustomSetting__c setting6 = MinhaCustomSetting__c.getValues(UserInfo.getProfileId());  
 System.debug('setting6: ' + setting6.id);  
 //Retorna o ID, pois criei uma referência por perfil  


Isto é, quando há uma referência completa, o ID é retornado e é possível realizar o Update. No meu exemplo inicial, alterei a utilização do getInstance() para getOrgDefaults(), pois me atenderia melhor.
Para finalizar, é importante ressaltar que são coisas diferentes o fato de retornar o ID e o procedimento de retornar os valores hierarquicamente. 

Caso ainda tenha dúvidas, é só postar nos comentários que tentarei responder.

Links para páginas Visualforce em pacote gerenciado

Hoje recebi de um dos nossos analistas de teste, um bug relacionado ao link para uma página visualforce. A demanda que levou a esse bug se resume em criar um link para uma página visualforce customizada e postar esse link no Chatter. Realizei o respectivo trabalho e testei. Estava tudo ok. Porém, após essa funcionalidade ser empacotada e enviada para a Org de testes, esse link para a página visualforce, quando postada no Chatter do Salesforce, parou de funcionar.

Na versão inicial, antes do bug ser percebido, eu utilizava o seguinte código para gerar o link:
 String url = System.Url.getSalesforceBaseURL().toExternalForm();  
Ou: 
 String url = System.Url.getSalesforceBaseUrl().getHost();  
Porém, após o bug ser percebido, acessei a Org em que o pacote gerenciado foi implantado. Em seguida fui à listagem de páginas Visualforce do Salesforce, acessei a página, em que o link apresentava problema. Ao clicar em "Preview" para a página ser carregada no meu navegador, vi que o link era diferente do que eu gerava com os código acima descritos. O link gerado com os códigos acima eram:
 https://na16.salesforce.com/apex/MinhaPaginaVisualForce  
Já o link que o Salesforce me gerava, na Org com o pacote gerenciado era:

 https://MeuNamespace.na16.visual.force.com/apex/MinhaPaginaVisualForce  
Veja que no segundo caso há o namespace do pacote gerenciado no link. 

Diante disso, pesquisei algumas soluções para o problema com o namespace, e descobri que se eu usar o mesmo código que usei inicialmente para gerar a URL, concatenar com o namespace da Org do pacote gerenciado, concatenar com o underline (2x) e por fim concatenar com o nome da página, obteria exito. Dessa forma fiz:
 String url = System.Url.getSalesforceBaseURL().toExternalForm();  
 String complemento = '/apex/' + 'MeuNamespace__' + 'MinhaPaginaVisualForce';  
 String urlFinal = url + complemento;  
A variável urlFinal gerou o link:
 https://na16.salesforce.com/apex/MeuNamespace__MinhaPaginaVisualForce   
Ao acessar o link supracitado, sou redirecionado para o link real:
 https://MeuNamespace.na16.visual.force.com/apex/MinhaPaginaVisualForce  

Bem, por hoje é só! Abraços.