domingo, 11 de novembro de 2018

Marketing Cloud - Exibindo o primeiro nome com Ampscript

O Ampscript é a linguagem de Script utilizada na plataforma Marketing Cloud (Exacttarget). Através dela é possível criar personalizações em emails e páginas, acessar dados de outras data extensions, fazer customizações dinâmicas nas mensagens, entre outros.

Esse post foi motivado por uma pergunta que recebi de um colega aqui na empresa: "Como uso o ampscript para pegar apenas o primeiro nome de um campo que possui o nome completo?"

Para responder essa pergunta, fiz o seguinte (Nome é a coluna de nome completo da Data Extension):


%%[
  VAR @TamanhoFirstName
  SET @FirstName = Nome
  IF IndexOf(@FirstName, ' ') > 0 THEN
    SET @TamanhoFirstName = IndexOf(@FirstName, ' ')
  ELSE
    SET @TamanhoFirstName = Length(@FirstName)
  ENDIF
]%%

Olá %%=ProperCase(Trim(Substring(@FirstName, 0, @TamanhoFirstName)))=%%,


Inicialmente fiz um IF/ELSE para pegar o tamanho do Primeiro Nome e posteriormente usei algumas funções para buscar o primeiro nome e normalizá-lo. Uma função bem útil é o ProperCase que deixa a 1ª letra maiúscula e as outras minusculas.


* Precisa de um suporte ou consultoria com o Marketing Cloud? Entre em contato conosco - CbCloud: http://www.cbcloud.com.br/ - Somos parceiros Gold Salesforce.

sexta-feira, 9 de novembro de 2018

Testando métodos com anotação @future no Salesforce

Ao chamar um método com a anotação @future uma nova thread é criada e enfileirada para ser executada de forma assíncrona à chamada original. Dessa forma, não há qualquer garantia que o conteúdo do método futuro será executado antes ou depois do contexto que o chamou. 

No cenário de método assíncrono surge um "problema": Como criar um método de teste unitário para esse método? Bem, a solução é mais simples do que se imagina: Basta utilizar o Test.StartTest() e o Test.StopTest() e o método assíncrono entre eles. 

A princípio mostro o método que desejo testar (coloquei uma método de espera ocupada só para comprovar a eficácia):


public class ClasseComMetodoFuturo {
    @future
    public static void metodoAssincrono(id idCaso){
        ClasseComMetodoFuturo.sleep(5000);
        
        Case caso = new Case(id = idCaso);
        Caso.Origin = 'Web';
        update caso;
    }
    
    private static void sleep(integer milliseconds){
        Long timeDiff = 0;
        DateTime firstTime = System.now();
        do{
            timeDiff = System.now().getTime() - firstTime.getTime();
        }while(timeDiff <= milliseconds);
    }
}


Agora minha classe de teste:


@isTest
public class ClasseComMetodoFuturoTest {
 public static testmethod void testandoFuture(){
        Case c = new Case();
        insert c;
        
        Test.startTest();
        ClasseComMetodoFuturo.metodoAssincrono(c.id);
        Test.stopTest();
        
        c = [SELECT id, Origin FROM Case WHERE id = :c.id];
        System.assertEquals('Web', c.Origin);
    } 
}



Faça um teste agora, removendo Test.StartTest() e o Test.StopTest(). O Resultado será:


System.AssertException: Assertion Failed: Expected: Web, Actual: null


Isso acontence pois, ao executar o Test.StopTest(), o Salesforce aguarda todas as execuções assíncronas que estão na fila de execução, pendentes para execução. Isto é, o StopTest faz com que seu método de teste aguarde do método @future, podendo assim esperar o resultado.



* Precisa de um suporte ou consultoria com seus códigos Apex na plataforma Salesforce? Entre em contato conosco - CbCloud: http://www.cbcloud.com.br/ - Somos parceiros Gold Salesforce.

segunda-feira, 17 de setembro de 2018

Bearer token para conexões REST para Salesforce

Quem nunca precisou de se conectar ao Salesforce, usando rest, através do Postman ou Insomnia, para criar, editar ou excluir registros? Pois bem, o objetivo dessa nota mental é exatamente gerar, de forma simples o Bearer Token (do OAuth 2.0) para utilizar a conexão já realizada através do navegador no seu Postman ou Insomnia.

Bem para reutilizar a autenticação já realizada no navegador, acesse o console do desenvolvedor e abra a janela de execução anônima através do menu Debug -> Open Execute Anonymous Window. Execute o seguinte código:


String orgId = UserInfo.getOrganizationId().substring(0, 15);
String sessionToken = UserInfo.getSessionId().substring(15);

System.debug(orgId + ' ' + sessionToken);


Bem, agora é só verificar o log gerado e pegar o token.
Veja que foi colocado um espaço entre o orgId e o sessionToken. Isso foi necessário pois se você gerar o token certinho, o Salesforce remove a informação do log por motivos de segurança. Então, remova manualmente o espaço em branco e use no seu Postman ou Insomnia:





Agora é só gerar seu JSON e fazer os posts, gets, puts, deletes, etc no Salesforce.

Essa dica, aprendi com o grande Renato Oliveira... Valeu cara!!!


* Precisa de um suporte ou consultoria com a plataforma Salesforce? Entre em contato conosco - CbCloud: http://www.cbcloud.com.br/ - Somos parceiros Gold Salesforce.

segunda-feira, 2 de julho de 2018

Ampscript para personalizar SMS no Marketing Cloud

Diferente da criação de e-mails no Content Builder do Salesforce Marketing Cloud, onde é possível definir a Data Extension (Extensão de dados) que será utilizada para a mesclagem das informações para personalização do e-mail, no MobileConnect, não é possível selecionar uma Data Extension para personalização dos SMS. Para esse fim, caso queira mandar um SMS personalizado, usando o nome do Assinante ou mesmo algum texto customizado por Assinante, é necessário a utilização da linguagem de Script do Salesforce Marketing Cloud, chamada Ampscript.

A única informação (que eu considero) relevante que teremos para a criação do script de personalização, para buscar dados de uma Data Extension é a variável do número de telefone do Assinante: MOBILE_NUMBER.

Dessa forma, é necessário usar a função Lookup para pesquisar informações na Data Extension desejada, passando como parâmetro MOBILE_NUMBER. Mas primeiro, veja os parâmetros da função Lookup:

Lookup(NomeDaDataExtension, NomeDaColunaQueSeDesejaRetornarValor, NomeDaColunaQueSeDesejaFiltrar, ValorQueSeDesejaFiltrar)

No exemplo a seguir vamos pesquisar na DataExtension GrupoAprovacao e desejamos retornar a informação da coluna Nome. O filtro será pela coluna Telefone e vamos usar como valor de filtro o MOBILE_NUMBER:


%%[
var @nomeAssinante
set @nomeAssinante = Lookup('GrupoAprovacao','Nome','Telefone',MOBILE_NUMBER)
]%%
Ola %%=v(@nomeAssinante)=%%, informamos que seu pedido acaba de ser enviado.

É possível realizar mais de uma consulta usando o Lookup para buscar mais de uma informação, veja:


%%[
var @nomeAssinante, @produto
set @nomeAssinante = Lookup('GrupoAprovacao','Nome','Telefone',MOBILE_NUMBER)
set @produto = Lookup('GrupoAprovacao','Produto','Telefone',MOBILE_NUMBER)
]%%
Ola %%=v(@nomeAssinante)=%%, informamos que o produto %%=v(@produto)=%% acaba de ser enviado.


Por hoje é isso... até a próxima!

* Precisa de um suporte ou consultoria nas configurações ou implantação do Salesforce Marketing Cloud? Entre em contato conosco - CbCloud: http://www.cbcloud.com.br/ - Somos parceiros Gold Salesforce.

quarta-feira, 27 de junho de 2018

Transformando ID 15 caracteres para 18 caracteres - SFDC

Sabemos que os IDs de registros no Salesforce possuem 15 caracteres (ou dígitos). Porém você já deve ter percebido em algumas situações um ID com 18 caracteres entra em cena. 
Bem, o padrão da Salesforce são registros com 15 caracteres entre Números e Letras Maiúsculas e Minúsculas. Isto é, o ID dos registros no Salesforce é Case Sensitive.
Exemplo de ID de uma Conta com 15 caracteres:


001f100001Q5RgL

Porém, caso seja necessário integrar o Salesforce com outra ferramenta que não diferencie as letras maiúsculas e minúsculas na comparação, a Salesforce criou mais 3 dígitos verificadores no ID original que transforma o ID em Case Insensitive. Isto é, ignora letras maiúsculas e minusculas. Dessa forma, o exemplo acima, seria com 18 caracteres:


001f100001Q5RgLAAV

Dentro da plataforma Salesforce, as 2 versões (com 15 ou 18 caracteres) continuam Case Sensitive, porém esses 3 dígitos a mais diferenciam os IDs que poderiam vir a se repetir caso a comparação seja feita ignorando letras maiúsculas e minusculas, facilitando assim a integração com outras ferramentas. 

DICA:

  • Não tente usar os IDs (mesmo de 18) alterando o que for maiúsculo para minúsculo e vice-versa dentro do Salesforce. Não vai funcionar!
  • Não tente usar os IDs de 15 caracteres fora do Salesforce. Pode have duplicados (se for uma comparação Case Insensitive).


Agora que você já a diferença, veja como é simples criar um campo fórmula para transformar um ID de 15 para ID de 18:

Crie um campo fórmula com o tipo de retorno texto e adicione a função CaseSafeId:


CASESAFEID(Conta__r.id)


Agora é só salvar a fórmula e Voilà! Você tem o ID de 18 caracteres!



* Precisa de um suporte ou consultoria na criação de fórmulas no Salesforce? Entre em contato conosco - CbCloud: http://www.cbcloud.com.br/ - Somos parceiros Gold Salesforce. 


quinta-feira, 1 de março de 2018

Removendo espaços em branco de Strings

Normalmente, quando se deseja remover espaços em branco das extremidadas de uma String no Apex, da Salesforce, usamos o método .trim() no objeto string. Porém, caso deseje remover TODOS os espaços em branco da sua String, o trim não resolve. Essa nota metal é exatamente para resolver essa situação e ela é bem simples: Basta usar o replaceAll, substituindo a string \\s+ por vazio. Veja:


String strSemEspaco = 'a b    c d  e'.replaceAll('\\s+', '');



Agora veja um método de teste, como se comportaria:


String strComEspaco = 'a b    c d  e';
String strSemEspaco = 'abcde';
System.assert(strComEspaco != strSemEspaco);
strComEspaco = strComEspaco.replaceAll('\\s+', '');
strSemEspaco = strComEspaco.replaceAll('\\s+', '');
System.assert(strComEspaco == strSemEspaco);



Por hoje é isso!




* Precisa de um suporte ou consultoria nos códigos APEX da Salesforce? Entre em contato conosco - CbCloud: http://www.cbcloud.com.br/ - Somos parceiros gerenciado Salesforce. 

Filtrando Query SOQL com Data

O conteúdo desse post é simples... é mais um "mental note". 

Várias vezes, quando preciso abrir o Console do Desenvolvedor no Salesforce, para fazer um Query e filtrar por uma Data (ou Data/Hora) específica (nada dinâmico) não sei como é o formato de data na Query. Sempre procuro e perco alguns minutos até encontrar. Bem, com essa nota mental, não irei esquecer mais! :)

Basicamente, é necessário colocar a data no seguinte formado: YYYY-MM-DD. Exemplo:


SELECT Id, Name, StageName, CloseDate FROM Opportunity WHERE CloseDate > 2018-01-01


Já para utilizar data e hora use o seguinte formato: YYYY-MM-DDTHH:mm:SSZ. Exemplo:
 

SELECT Id, Name, StageName, CreatedDate FROM Opportunity WHERE CreatedDate > 2018-01-01T10:00:00Z





Bem rápida essa...




* Precisa de um suporte ou consultoria em Queries no Salesforce? Entre em contato conosco - CbCloud: http://www.cbcloud.com.br/ - Somos parceiros gerenciado Salesforce.