segunda-feira, 22 de maio de 2017

Envio de e-mail no botão da página de detalhes

Hoje vamos de uma dica rápida no Salesforce. Como enviar um email, usando um modelo de email (email template), através de um botão personalizado (custom button) na página de detalhes.

Então o primeiro passo é a criação de um modelo de email, que será o conteúdo do e-mail enviado pelo botão. Ele pode ser feito através do menu de configuração do Salesforce, pesquisando na caixa de texto por Modelos de email. Salve o ID (pode ser pego na URL após a criação do modelo)!

Após a criação do modelo, vamos criar o botão no objeto desejado. Acesse o objeto e clique em Novo Botão ou Link, na opção Botões, Links e Ações. Preencha os campos do botão: 




Atente-se em marcar o Tipo de exibição como Botão da página de detalhes. Para nosso exemplo o Comportamento deve ser Executar JavaScript.

Agora vamos colocar o nosso simplório JavaScript:


window.location.href = '/email/author/emailauthor.jsp?retURL=/{!Case.Id}&p3_lkid={!Case.Id}&rtype=003&p2_lkid={!Case.ContactId}&template_id=00X0P000000FI7c';

Veja que meu botão está no Caso e passo alguns parâmetros como p3_lkid, p2_lkid e template_id. Esses são parâmetros que utilizo para que alguns campos do envio de e-mail já venha preenchida. Veja a relação:

  • p2_lkid – O Contato/Conta pessoal/Lead que se deseja enviar o e-mail
  • p3_lkid – O registro relacionado
  • p4 – Emails em cópia
  • p5 – Emails em cópia oculta
  • p6 – Assunto (poderá vir do modelo de email)
  • p23- Corpo do email (poderá vir do modelo de email)
  • p24 – Outros destinatários
  • retURL – A URL de retorno quando for pressionado Cancelar
  • template_id – ID do modelo de email do Salesforce


Ao adicionar o botão no Layout da página e clicar nele, veja o resultado:





Agora é só disparar o e-mail que ele irá para o cliente e também será anexado ao histórico de atividades.

Bem, é possível chamar essa página de envio de e-mail, sem o uso do JavaScript. Na configuração do botão, altere o Comportamento, a Origem do conteúdo e deixe apenas a URL na ação:




Por hoje é isso!



* Precisa de um suporte ou consultoria para configuração de botões ou envio de e-mails sua Org Salesforce? Entre em contato conosco - CbCloud: http://www.cbcloud.com.br/ - Somos parceiros gerenciado Salesforce.

quarta-feira, 17 de maio de 2017

Pesquisando por todos os campos de um Objeto

O post de hoje é uma dica rápida sobre como habilitar uma pesquisa avançada em objetos do Salesforce. 

Em um projeto em que atuo, tínhamos um objeto que se relacionava (relacionamento de pesquisa) com o objeto Conta (Account). No layout da página, quando eu clicava no ícone da Lupa para realizar a pesquisa na Conta, eu conseguia pesquisar apenas pelo Nome da Conta. Outros campos, como o CPF, eu não conseguia pesquisar.




Para permitir pesquisar por outros campos em um relacionamento de pesquisa, além do nome, habilite a pesquisa avançada, através do caminho:

Personalização | Pesquisar | Configurações de pesquisa

Ou simplesmente digite na caixa de busca rápida: Configurações de pesquisa.

Ao acessar a tela de configurações de pesquisa, desça ao final da página e habilite a pesquisa avançada para o objeto que desejar (no meu caso Contas):




Após marcar a opção de pesquisa avançada, percebemos que, ao realizar uma pesquisa em um campo de relacionamento, aparece a opção "Todos os campos". Com essa opção é possível pesquisar pelo CPF ou qualquer outro campo no objeto relacionado (Conta, no meu caso):



Antes de finalizar, ainda na tela de Configurações de pesquisa, podemos definir a quantidade de registros serão retornados. Podendo variar de 5 a 50:




O resultado na pesquisa é uma nova quantidade de registros por página:





Por hoje é só... Até a próxima!


* Está precisando de um suporte ou uma consultoria na configuração da sua ORG Salesforce? Entre em contato conosco - CbCloud: http://www.cbcloud.com.br/ | Somos parceiros gerenciados pela Salesforce! 


quinta-feira, 11 de maio de 2017

Regras de atribuição de Caso/Lead não funcionam corretamente

Apesar do título, elas funcionam sim e muito bem :) Bem, o que aconteceu recentemente foi que um colega da empresa implementou algumas regras de atribuição de Casos e elas não estavam funcionando. Simplesmente, quando o Caso era criado e atendia as condições da regra, esse não era atribuído à fila que havíamos determinado na regra de atribuição. Fui analisar as regras e elas estava configuradas perfeitamente. Qual seria o problema então?

Após algumas pesquisas descobri que, para as regras de atribuição "rodarem", é necessário que a opção "Atribuir utilizando regras de atribuição" esteja marcada na abertura do caso.




Porém, no meu caso, esse campo nem estava visível. Mas é possível deixá-lo visível (ou não) e deixá-lo marcado (ou não) por padrão. Para tal, é necessário acessar o Layout de tela do Caso/Lead, acionar as propriedades de Layout e configurar os campos da seção "Caixa de seleção Atribuição do caso":


  

No meu caso específico, deixei o "Mostrar na página de edição" desmarcado, para evitar que o usuário desmarque a opção e deixei o "Padrão" marcado. Após salvar o Layout, Casos começaram a ser atribuídos corretamente para as filas definidas nas regras de atribuição. É importante ressaltar que essas mesmas opções estão disponíveis para o Lead.

Apesar dessas facilidades de configuração, caso a criação do caso seja via código, integração ou qualquer outra forma, que não seja o Layout de tela, as regras de compartilhamento não serão executadas. Dessa forma, é necessário fazer uma trigger para forçar a execução das regras de atribuição:



trigger CaseTrigger on Case (after insert) {
    List<Case> casos = new List<Case>();
    Database.DMLOptions dmo = new Database.DMLOptions();
    dmo.AssignmentRuleHeader.useDefaultRule = true;
 
    for(Case c : trigger.new) {
        Case casoAtualiza = new Case(Id = c.id);
        casoAtualiza.setOptions(dmo);
        casos.add(casoAtualiza);
    }
    
    update casos;    
}


É... realmente tem que ser uma trigger AFTER INSERT. Procurei uma explicação simples para tal e confesso que ainda não encontrei. Se souber e quiser postar nos comentários, eu agradeceria!


* Precisa de um suporte ou consultoria para configuração ou desenvolvimento de regras de atribuição sua Org Salesforce? Entre em contato conosco - CbCloud: http://www.cbcloud.com.br/ - Somos parceiros gerenciado Salesforce.

terça-feira, 2 de maio de 2017

Desabilitando/Habilitando campo apex:InputField em páginas Visualforce

Há algum tempo esbarrei em uma situação inusitada. Estava utilizando um campo <apex:InputField /> no Visualforce da Salesforce e queria desabilitar esse campo, de acordo com uma situação vinda da minha classe Apex controller. Fui procurar a propriedade Disabled ou Enabled e não encontrei! Afinal, esse atributo não existe no apex:InputField.

Então resolvi essa situação de uma forma diferente. Comecei a trabalhar com dois componentes na tela: O apex:InputField quando eu necessitava do dele Habilitado e o apex:OutputField quando precisava dele desabilitado.

Dessa forma, veja um exemplo simples da minha classe controller:


 public class DesabilitandoInputFieldController {  
   public boolean habilitado { get; set; }  
   public Account conta { get; set; }  
   public DesabilitandoInputFieldController(){  
     this.habilitado = true;  
     this.conta = new Account();  
     this.conta.Industry = 'Technology';  
   }  
   public PageReference AlteraHabilitado() {  
     this.habilitado = !this.habilitado;  
     return null;  
   }  
 }  

Veja que foi criado uma propriedade na classe controller, chamado "habilitado" que é usado para dizer se o apex:InputField estará Habilitado ou Desabilitado. Foi construído também um método para realizar a habilitação/desabilitação do campo.

Agora veja minha página Visualforce:


 <apex:page controller="DesabilitandoInputFieldController">  
   <apex:form >  
   <apex:PageBlock >  
     <apex:pageBlockButtons >  
       <apex:commandButton action="{!AlteraHabilitado}" value="Alterar visibilidade!"/>  
     </apex:pageBlockButtons>  
     <apex:PageBlockSection >  
       <apex:PageBlockSectionItem>  
         <apex:OutputLabel value="Conta"></apex:OutputLabel>  
         <apex:outputPanel>  
           <apex:InputField value="{!conta.Industry}" rendered="{!habilitado}"/>  
           <apex:OutputField value="{!conta.Industry}" rendered="{!NOT(habilitado)}"/>  
         </apex:outputPanel>          
       </apex:PageBlockSectionItem>  
     </apex:PageBlockSection>  
   </apex:PageBlock>  
   </apex:form>  
 </apex:page>  


Perceba que foi colocado dentro do Apex:OutputPanel um apex:InputField e apex:OutputField. Com o rendered nesses componentes, consigo exibir um ao mesmo tempo que oculto outro. Para isso, uso o NOT, para inverter a exibição. Veja como ficou a página Visualforce, com o campo Habilitado:




Já com o campo "desabilitado", que na verdade é um OutputField:




Bem, por hoje é isso!


* Está precisando de um suporte ou uma consultoria no desenvolvimento de páginas Visualforce e classes Apex na sua ORG Salesforce? Entre em contato conosco - CbCloud: http://www.cbcloud.com.br/