Mulesoft - Salesforce Analytics Cloud Connector -
Part 1
Por ser relativamente novo, atualmente temos pouco conteúdo em
português sobre o conector Salesforce Analytics Cloud para Mulesoft.
Bom tive a oportunidade de trabalhar com ambas as tecnologias
Salesforce e Mulesoft, e fiz algumas integrações utilizando esse
conector que tem algumas diferenças interessantes em relação a
outros, que podem dar um pouco de dor de cabeça, e fazer perder
algum tempo, então vamos a um tutorial separado em algumas partes
com algumas observações:
 Configuração: Temos algumas opções de autenticação, Basic e três
variedades de OAuth 2.0, como até agora nunca tive a necessidade
de usar o OAuth, vamos de Basic mesmo. É bem simples configurar a
autenticação Basic, ele pede :
1. Username e password: que são o login e senha da Org
Salesforce que você deseja acessar via mule.
2. Securitytoken: que é gerado pela Org Salesforce caso a
mesma não possua faixa de IP fixa, já que no caso de Orgs
com faixas de IP controladas, não é necessário o token para
acessar o salesforce com sucesso, mas como o campo do
conector é obrigatório, se não tiver valor ele fica dando erro,
então podemos substituir o token por uma $variavel contendo
um Space, ou Space direto no campo.
3. Authorization Url seria um endpoint, basicamente seria seu Url
de login + “/services/Soap/u/31.0”, essa Url geralmente muda
entre “login.salesforce.com” para Org Production e
“test.salesforce.com” para Org Sandbox, mas esses Urls vão
depender do domínio definido na org, apesar de funcionar
esses dois citados mesmo se a Org tiver um domínio próprio.
4. Metadata File Name, que seria o mapeamento das variáveis
recebidas na Entrada, esse metadata é um arquivo .Json que
contém todas as variáveis que serão recebidas por inbound,
para que o conector encontre o arquivo de metadata ele deve
estar na pasta “src/main/resources”, alguns detalhes em relação
ao metadata são importantes, por exemplo após definidos os
campos a serem integrados, executado o fluxo e criado com
sucesso um dataset no Wave analytics, o Metadata não poderá
ser modificado pra esse mesmo dataset, no caso pra mudar o
metadata tem que sobrescrever o dataset criado, perdendo os
dashboards criados a partir dele.
Abaixo segue um exemplo da configuração do conector:
Aqui um exemplo de Metadata.Json que será usado pra mapear os
campos que serão recebidos via .Csv e inseridos em um dataset no
Wave Analytics:
{
"fileFormat":{
"charsetName":"UTF-8",
"fieldsEnclosedBy":",",
"fieldsDelimitedBy":",",
"linesTerminatedBy":"n",
"numberOfLinesToIgnore":1
},
"objects": [{
"connector": "Salesforce connector",
"fullyQualifiedName":
"OrderInvoice_Teste_Performance_csv",
"label": "OrderInvoice_Teste_Performance.csv",
"name": "OrderInvoice_Teste_Performance_csv",
"fields": [{
"fullyQualifiedName": "cdOrder",
"name": "cdOrder",
"type": "Text",
"label": "cdOrder",
},
{
"fullyQualifiedName": "cdInvoice",
"name": "cdInvoice",
"type": "Text",
"label": "cdInvoice"
},
{
"fullyQualifiedName": "dtInvoice",
"name": "dtInvoice",
"type": "Date",
"label": "dtInvoice",
"format": "yyyy-MM-dd"
},
{
"fullyQualifiedName": "vlTotalInvoice",
"name": "vlTotalInvoice",
"type": "Numeric",
"label": "vlTotalInvoice",
"precision": 18,
"defaultValue": "0",
"scale": 4
},
{
"fullyQualifiedName": "cdStatusInvoice",
"name": "cdStatusInvoice",
"type": "Text",
"label": "cdStatusInvoice"
},
{
"fullyQualifiedName": "dsDistributorCountry",
"name": "dsDistributorCountry",
"type": "Text",
"label": "dsDistributorCountry"
},
{
"fullyQualifiedName": "cdDistributorCode",
"name": "cdDistributorCode",
"type": "Text",
"label": "cdDistributorCode"
},
{
"fullyQualifiedName": "dsDistributorName",
"name": "dsDistributorName",
"type": "Text",
"label": "dsDistributorName"
},
{
"fullyQualifiedName": "cdStore",
"name": "cdStore",
"type": "Text",
"label": "cdStore"
},
{
"fullyQualifiedName": "cdStatus",
"name": "cdStatus",
"type": "Text",
"label": "cdStatus"
},
{
"fullyQualifiedName": "dsStoreName",
"name": "dsStoreName",
"type": "Text",
"label": "dsStoreName"
},
{
"fullyQualifiedName": "cdSalesChannel",
"name": "cdSalesChannel",
"type": "Text",
"label": "cdSalesChannel"
},
{
"fullyQualifiedName": "dsSalesRep",
"name": "dsSalesRep",
"type": "Text",
"label": "dsSalesRep"
},
{
"fullyQualifiedName": "cdSalesRep",
"name": "cdSalesRep",
"type": "Text",
"label": "cdSalesRep"
},
{
"fullyQualifiedName": "cdSubChannel",
"name": "cdSubChannel",
"type": "Text",
"label": "cdSubChannel"
},
{
"fullyQualifiedName": "cdInternalID",
"name": "cdInternalID",
"type": "Text",
"label": "cdInternalID"
}]
}]
}
Agora mais um exemplo da configuração de execução do conector,
nesse caso usaremos o Upload external data into new data set Start
processing, que serve para atualizar e criar um novo dataset no Wave
analytics, posteriormente vou explicar cada campo a ser configurado:
Continuaremos na parte 2.

Mulesoft - Salesforce Analytics Cloud Connector - Part 1

  • 1.
    Mulesoft - SalesforceAnalytics Cloud Connector - Part 1 Por ser relativamente novo, atualmente temos pouco conteúdo em português sobre o conector Salesforce Analytics Cloud para Mulesoft. Bom tive a oportunidade de trabalhar com ambas as tecnologias Salesforce e Mulesoft, e fiz algumas integrações utilizando esse conector que tem algumas diferenças interessantes em relação a outros, que podem dar um pouco de dor de cabeça, e fazer perder algum tempo, então vamos a um tutorial separado em algumas partes com algumas observações:  Configuração: Temos algumas opções de autenticação, Basic e três variedades de OAuth 2.0, como até agora nunca tive a necessidade de usar o OAuth, vamos de Basic mesmo. É bem simples configurar a autenticação Basic, ele pede : 1. Username e password: que são o login e senha da Org Salesforce que você deseja acessar via mule. 2. Securitytoken: que é gerado pela Org Salesforce caso a mesma não possua faixa de IP fixa, já que no caso de Orgs com faixas de IP controladas, não é necessário o token para acessar o salesforce com sucesso, mas como o campo do conector é obrigatório, se não tiver valor ele fica dando erro, então podemos substituir o token por uma $variavel contendo um Space, ou Space direto no campo. 3. Authorization Url seria um endpoint, basicamente seria seu Url de login + “/services/Soap/u/31.0”, essa Url geralmente muda entre “login.salesforce.com” para Org Production e
  • 2.
    “test.salesforce.com” para OrgSandbox, mas esses Urls vão depender do domínio definido na org, apesar de funcionar esses dois citados mesmo se a Org tiver um domínio próprio. 4. Metadata File Name, que seria o mapeamento das variáveis recebidas na Entrada, esse metadata é um arquivo .Json que contém todas as variáveis que serão recebidas por inbound, para que o conector encontre o arquivo de metadata ele deve estar na pasta “src/main/resources”, alguns detalhes em relação ao metadata são importantes, por exemplo após definidos os campos a serem integrados, executado o fluxo e criado com sucesso um dataset no Wave analytics, o Metadata não poderá ser modificado pra esse mesmo dataset, no caso pra mudar o metadata tem que sobrescrever o dataset criado, perdendo os dashboards criados a partir dele. Abaixo segue um exemplo da configuração do conector:
  • 3.
    Aqui um exemplode Metadata.Json que será usado pra mapear os campos que serão recebidos via .Csv e inseridos em um dataset no Wave Analytics: { "fileFormat":{ "charsetName":"UTF-8", "fieldsEnclosedBy":",", "fieldsDelimitedBy":",", "linesTerminatedBy":"n", "numberOfLinesToIgnore":1 }, "objects": [{ "connector": "Salesforce connector", "fullyQualifiedName": "OrderInvoice_Teste_Performance_csv", "label": "OrderInvoice_Teste_Performance.csv", "name": "OrderInvoice_Teste_Performance_csv", "fields": [{ "fullyQualifiedName": "cdOrder", "name": "cdOrder", "type": "Text", "label": "cdOrder", }, { "fullyQualifiedName": "cdInvoice", "name": "cdInvoice", "type": "Text", "label": "cdInvoice" }, { "fullyQualifiedName": "dtInvoice", "name": "dtInvoice", "type": "Date", "label": "dtInvoice", "format": "yyyy-MM-dd" },
  • 4.
    { "fullyQualifiedName": "vlTotalInvoice", "name": "vlTotalInvoice", "type":"Numeric", "label": "vlTotalInvoice", "precision": 18, "defaultValue": "0", "scale": 4 }, { "fullyQualifiedName": "cdStatusInvoice", "name": "cdStatusInvoice", "type": "Text", "label": "cdStatusInvoice" }, { "fullyQualifiedName": "dsDistributorCountry", "name": "dsDistributorCountry", "type": "Text", "label": "dsDistributorCountry" }, { "fullyQualifiedName": "cdDistributorCode", "name": "cdDistributorCode", "type": "Text", "label": "cdDistributorCode" }, { "fullyQualifiedName": "dsDistributorName", "name": "dsDistributorName", "type": "Text", "label": "dsDistributorName" }, { "fullyQualifiedName": "cdStore", "name": "cdStore", "type": "Text", "label": "cdStore" }, { "fullyQualifiedName": "cdStatus",
  • 5.
    "name": "cdStatus", "type": "Text", "label":"cdStatus" }, { "fullyQualifiedName": "dsStoreName", "name": "dsStoreName", "type": "Text", "label": "dsStoreName" }, { "fullyQualifiedName": "cdSalesChannel", "name": "cdSalesChannel", "type": "Text", "label": "cdSalesChannel" }, { "fullyQualifiedName": "dsSalesRep", "name": "dsSalesRep", "type": "Text", "label": "dsSalesRep" }, { "fullyQualifiedName": "cdSalesRep", "name": "cdSalesRep", "type": "Text", "label": "cdSalesRep" }, { "fullyQualifiedName": "cdSubChannel", "name": "cdSubChannel", "type": "Text", "label": "cdSubChannel" }, { "fullyQualifiedName": "cdInternalID", "name": "cdInternalID", "type": "Text", "label": "cdInternalID" }] }]
  • 6.
    } Agora mais umexemplo da configuração de execução do conector, nesse caso usaremos o Upload external data into new data set Start processing, que serve para atualizar e criar um novo dataset no Wave analytics, posteriormente vou explicar cada campo a ser configurado: Continuaremos na parte 2.