script runat="server">
Platform.Load("core", "1.1.1");
HTTPHeader.SetValue("Content-Type", "application/json");
HTTPHeader.SetValue("Access-Control-Allow-Origin", "*");
HTTPHeader.SetValue("Access-Control-Allow-Methods", "POST, OPTIONS");
HTTPHeader.SetValue("Access-Control-Allow-Headers", "Content-Type"); // Mantido para não dar erro de CORS
var method = Platform.Request.Method;
if (method == "OPTIONS") {
// Retorna OK para a checagem de preflight do CORS
Write(Stringify({ status: "ok" }));
} else {
try {
var postData = Platform.Request.GetPostData("utf-8");
var leadInput = Platform.Function.ParseJSON(postData);
// ===================================
// Registrar na Data Extension (tb_recebimento_de_dados_LP)
// Grava TODOS os envios, sem chave primária
// ===================================
try {
Platform.Function.InsertDE(
"tb_recebimento_de_dados_LP",
[
"firstname",
"email",
"magnet",
"phone",
"utm_source",
"utm_medium",
"utm_campaign",
"utm_content",
"utm_term",
"ppp",
"new_ppp",
"popup",
"idade",
"idade_em_que_planeja_se_aposentar",
"seu_patrimnio_investido",
"qual_o_patrimonio_disponivel_para_investimentos_",
"em_qual_modalidade_de_profissional_voce_se_encaixa_",
"patrimonio_investido___grupo",
"lastname",
"hs_whatsapp_phone_number",
"status_invest_account_id",
"status_invest_create_account_date",
"corretora",
"aporte_mensal___grupo",
"cpf",
"patrimonio_nnm___grupo",
"city",
"magnet_nome_comercial",
"state",
"integracao_b3__binario_",
"renda_mensal",
"qual_o_valor_mdio_de_seus_aportes_mensais",
"OptinAtendimento",
"OptinComercial",
"OptinMarketingPush",
"OptinRelacionamentoCliente",
"OptinSemanaAssinante",
"OptinSunoAgro",
"OptinSunoNoticias",
"optinmarketingemail",
"Business_unit",
"Funil__c",
"Estrategia__c",
"ReuniaoQualificaoAgendada__c",
"ComplementoEstrategia__c"
],
[
leadInput.FirstName || "",
leadInput.Email || "",
leadInput.Magnet__c || "",
leadInput.Phone || "",
leadInput.UtmSource__c || "",
leadInput.UtmMedium__c || "",
leadInput.UtmCampaign__c || "",
leadInput.UtmContent__c || "",
leadInput.UtmTerm__c || "",
leadInput.PPP__c || "",
leadInput.NewPPP__c || "",
leadInput.Popup__c || "",
leadInput.Idade__c || "",
leadInput.PrevisaoAposentadoria__c || "",
leadInput.PatrimonioDeclarado__c || "",
leadInput.PatrimonioParaInvestimento__c || "",
leadInput.ModalidadeProfissional || "",
leadInput.PatrimonioInvestidoGrupo || "",
leadInput.LastName || "",
leadInput.NumeroDoWhatsApp__c || "",
leadInput.StatusInvestAccountId__c || "",
leadInput.StatusInvestCreateAccountDate__c || "",
leadInput.Corretora || "",
leadInput.AporteMensalGrupo || "",
leadInput.CPF__c || "",
leadInput.PatrimonioNnmGrupo || "",
leadInput.Cidade__c || "",
leadInput.MagnetNomeComercial__c || "",
leadInput.EstadoRegiao__c || "",
leadInput.IntegracaoB3__c || "",
leadInput.SalarioMensal__c || "",
leadInput.AporteDeclarado__c || "",
leadInput.OptinAtendimento !== undefined ? String(leadInput.OptinAtendimento) : "",
leadInput.OptinComercial !== undefined ? String(leadInput.OptinComercial) : "",
leadInput.OptinMarketingPush !== undefined ? String(leadInput.OptinMarketingPush) : "",
leadInput.OptinRelacionamentoCliente !== undefined ? String(leadInput.OptinRelacionamentoCliente) : "",
leadInput.OptinSemanaAssinante !== undefined ? String(leadInput.OptinSemanaAssinante) : "",
leadInput.OptinSunoAgro !== undefined ? String(leadInput.OptinSunoAgro) : "",
leadInput.OptinSunoNoticias !== undefined ? String(leadInput.OptinSunoNoticias) : "",
leadInput.optinmarketingemail !== undefined ? String(leadInput.optinmarketingemail) : "", //
leadInput.Business_unit || "",
leadInput.Funil__c || "", // ← NOVO
leadInput.Estrategia__c || "", // ← NOVO
leadInput.ReuniaoQualificaoAgendada__c !== undefined ? String(leadInput.ReuniaoQualificaoAgendada__c) : "", // ← NOVO
leadInput.ComplementoEstrategia__c || "" // ← NOVO
]
);
}
catch(deErr){ // Erro no InsertDE não deve impedir a criação do Lead
// O erro será silenciado para não bloquear o fluxo principal
}
// ===================================
// Autenticação OAuth2 no Salesforce (Suno)
// ===================================
var tokenUrl = "https://suno.my.salesforce.com/services/oauth2/token";
var tokenPayload = "grant_type=client_credentials"
+ "&client_id=3MVG9dqyJqDc8eKRTI4VX82pfCLuyw1RNT64PNqyFP3giplfD0c.nABv6aALcG6DdsWvUEpbFuape6k1Wdh47"
+ "&client_secret=7401787E74CCF994628E1BBD7D1F40468A0892EAAE34C8050DCE9A8A55C329AF";
// Usando request imune a crash (Script.Util.HttpRequest) pois o HTTP.Post causa Erro 500 fatal se as credenciais derem erro.
var reqToken = new Script.Util.HttpRequest(tokenUrl);
reqToken.emptyContentHandling = 0;
reqToken.retries = 0;
reqToken.continueOnError = true;
reqToken.contentType = "application/x-www-form-urlencoded";
reqToken.method = "POST";
reqToken.postData = tokenPayload;
var tokenResponse = reqToken.send();
var tokenResult = Platform.Function.ParseJSON(String(tokenResponse.content));
var accessToken = tokenResult.access_token;
// Verificar se o token foi obtido
if (!accessToken || tokenResponse.statusCode >= 400) {
Write(Stringify({
success: false,
error: "Token nao obtido",
http_status: tokenResponse.statusCode,
tokenRaw: String(tokenResponse.content)
}));
} else {
// ===================================
// Montar objeto do Lead (Suno)
// Campos dinâmicos — só adiciona se veio no payload
// ===================================
var leadObj = {};
// Lógica de Formatação do Telefone (⚠️ OBRIGATÓRIO)
// Transforma o número em 13 caracteres (55 + DDD + 9 números), preenchendo o 55 e o 9º dígito caso faltem
function formatarTelefone(tel) {
if (!tel) return "";
var d = tel.replace(/\D/g, "");
if (d.length === 0) return "";
if (d.indexOf("0") === 0) d = d.substring(1);
if (d.substring(0, 2) !== "55") d = "55" + d;
if (d.length === 12) d = d.substring(0, 4) + "9" + d.substring(4);
return d;
}
// =======================================================
// ⚠️ CAMPOS OBRIGATÓRIOS (REGRA DEFINIDA)
// 1. FirstName
// 2. LastName
// 3. Email
// 4. Phone
// 5. LeadSource = Formulário
// 6. DetalhamentoOrigem__c = Nome da landing page
// =======================================================
leadObj.LeadSource = "Formulário"; // ⚠️ OBRIGATÓRIO
leadObj.FonteAquisicao__c = leadInput.nome_da_campanha || "Landing Page"; // ⚠️ OBRIGATÓRIO
if (leadInput.FirstName && leadInput.LastName) {
leadObj.FirstName = leadInput.FirstName; // ⚠️ OBRIGATÓRIO
leadObj.LastName = leadInput.LastName; // ⚠️ OBRIGATÓRIO
} else {
var nomeCompleto = leadInput.FirstName || leadInput.LastName || "";
nomeCompleto = nomeCompleto.replace(/^\s+|\s+$/g, ""); // Remove espaços no início e fim
if (nomeCompleto) {
var espacoIndex = nomeCompleto.indexOf(" ");
if (espacoIndex > 0) {
leadObj.FirstName = nomeCompleto.substring(0, espacoIndex); // ⚠️ OBRIGATÓRIO
leadObj.LastName = nomeCompleto.substring(espacoIndex + 1).replace(/^\s+/, ""); // ⚠️ OBRIGATÓRIO
} else {
leadObj.FirstName = "Não informado"; // ⚠️ Garante envio obrigatório
leadObj.LastName = nomeCompleto; // ⚠️ OBRIGATÓRIO
}
} else {
leadObj.FirstName = "Não informado"; // ⚠️ OBRIGATÓRIO
leadObj.LastName = "Não informado"; // ⚠️ OBRIGATÓRIO
}
}
if (leadInput.Email) leadObj.Email = leadInput.Email; // ⚠️ OBRIGATÓRIO
var rawPhone = leadInput.Phone || leadInput.NumeroDoWhatsApp__c || "";
var telefoneFormatado = formatarTelefone(rawPhone);
if (telefoneFormatado) leadObj.Phone = telefoneFormatado; // ⚠️ OBRIGATÓRIO
// --- Campos customizados (Custom Fields __c) ---
if (leadInput.Magnet__c) leadObj.Magnet__c = leadInput.Magnet__c;
if (leadInput.UtmSource__c) leadObj.UtmSource__c = leadInput.UtmSource__c;
if (leadInput.UtmMedium__c) leadObj.UtmMedium__c = leadInput.UtmMedium__c;
if (leadInput.UtmCampaign__c) leadObj.UtmCampaign__c = leadInput.UtmCampaign__c;
if (leadInput.UtmContent__c) leadObj.UtmContent__c = leadInput.UtmContent__c;
if (leadInput.UtmTerm__c) leadObj.UtmTerm__c = leadInput.UtmTerm__c;
if (leadInput.PPP__c) leadObj.PPP__c = leadInput.PPP__c;
if (leadInput.NewPPP__c) leadObj.NewPPP__c = leadInput.NewPPP__c;
if (leadInput.Popup__c) leadObj.Popup__c = leadInput.Popup__c;
if (leadInput.Idade__c) leadObj.Idade__c = leadInput.Idade__c;
if (leadInput.PrevisaoAposentadoria__c) leadObj.PrevisaoAposentadoria__c = leadInput.PrevisaoAposentadoria__c;
if (leadInput.PatrimonioDeclarado__c) leadObj.PatrimonioDeclarado__c = leadInput.PatrimonioDeclarado__c;
if (leadInput.PatrimonioParaInvestimento__c ) leadObj.PatrimonioParaInvestimento__c = leadInput.PatrimonioParaInvestimento__c ;
if (leadInput.NumeroDoWhatsApp__c) leadObj.NumeroDoWhatsApp__c = leadInput.NumeroDoWhatsApp__c;
if (leadInput.StatusInvestAccountId__c) leadObj.StatusInvestAccountId__c = leadInput.StatusInvestAccountId__c;
if (leadInput.StatusInvestCreateAccountDate__c) leadObj.StatusInvestCreateAccountDate__c = leadInput.StatusInvestCreateAccountDate__c;
if (leadInput.CPF__c) leadObj.CPF__c = leadInput.CPF__c;
if (leadInput.Cidade__c) leadObj.Cidade__c = leadInput.Cidade__c;
if (leadInput.MagnetNomeComercial__c) leadObj.MagnetNomeComercial__c = leadInput.MagnetNomeComercial__c;
if (leadInput.EstadoRegiao__c) leadObj.EstadoRegiao__c = leadInput.EstadoRegiao__c;
if (leadInput.IntegracaoB3__c) leadObj.IntegracaoB3__c = leadInput.IntegracaoB3__c;
if (leadInput.SalarioMensal__c) leadObj.SalarioMensal__c = leadInput.SalarioMensal__c;
if (leadInput.AporteDeclarado__c) leadObj.AporteDeclarado__c = leadInput.AporteDeclarado__c;
if (leadInput.Business_unit) leadObj.BusinessUnit__c = leadInput.Business_unit;
if (leadInput.Business_unit) leadObj.BUOrigem__c = leadInput.Business_unit;
if (leadInput.Funil__c) leadObj.Funil__c = leadInput.Funil__c;
if (leadInput.Estrategia__c) leadObj.Estrategia__c = leadInput.Estrategia__c;
if (leadInput.ReuniaoQualificaoAgendada__c !== undefined) leadObj.ReuniaoQualificaoAgendada__c = leadInput.ReuniaoQualificaoAgendada__c;
if (leadInput.ComplementoEstrategia__c) leadObj.ComplementoEstrategia__c = leadInput.ComplementoEstrategia__c;
if (leadInput.OptinAtendimento) leadObj.OptinAtendimento__c = leadInput.OptinAtendimento;
if (leadInput.OptinComercial) leadObj.OptinComercial__c = leadInput.OptinComercial;
if (leadInput.OptinMarketingPush) leadObj.OptinMarketingPush__c = leadInput.OptinMarketingPush;
if (leadInput.OptinRelacionamentoCliente) leadObj.OptinRelacionamentoCliente__c = leadInput.OptinRelacionamentoCliente;
if (leadInput.OptinSemanaAssinante) leadObj.OptinSemanaAssinante__c = leadInput.OptinSemanaAssinante;
if (leadInput.OptinSunoAgro) leadObj.OptinSunoAgro__c = leadInput.OptinSunoAgro;
if (leadInput.OptinSunoNoticias) leadObj.OptinSunoNoticias__c = leadInput.OptinSunoNoticias;
if (leadInput.optinmarketingemail) leadObj.optinmarketingemail__c = leadInput.optinmarketingemail;
// --- Campos obrigatórios da Trigger exigidos pelo Salesforce (Validação em cascata) ---
leadObj.MobilePhone = leadObj.Phone || "(11) 99999-9999"; // Obrigatório
leadObj.Necessidade__c = "Outros assuntos"; // Obrigatório — Valor fixo tirado da Picklist do SF
leadObj.NecessidadeDetalhamento__c = "Outro"; // Obrigatório — Valor fixo tirado da Picklist do SF
// Disparo Lead consultoria
leadObj.RecordTypeId = "012Np00000gVEhdIAG";
leadObj.OwnerId = "005Np00000EUo8zIAD";
leadObj.ProprietarioOrigem__c = "005Np00000EUo8zIAD";
leadObj.DisparoAtivo__c = true;
leadObj.TemplatesMeta__c = "wpp_disparo_ativo_aplicacao";
var leadData = Stringify(leadObj);
// ===================================
// 🔑 CHAVES PRIMÁRIAS DE PESQUISA (UPSERT)
// 1. CPF
// 2. Email
// 3. Telefone
// ===================================
var queryBaseUrl = "https://suno.my.salesforce.com/services/data/v60.0/query/?q=";
var existingLeadId = null;
function searchLead(soql) {
var reqQuery = new Script.Util.HttpRequest(queryBaseUrl + Platform.Function.UrlEncode(soql));
reqQuery.emptyContentHandling = 0;
reqQuery.retries = 0;
reqQuery.continueOnError = true;
reqQuery.method = "GET";
reqQuery.setHeader("Authorization", "Bearer " + accessToken);
var resQuery = reqQuery.send();
if (resQuery.statusCode >= 200 && resQuery.statusCode < 300) {
var parsed = Platform.Function.ParseJSON(String(resQuery.content));
if (parsed && parsed.records && parsed.records.length > 0) {
return parsed.records[0].Id;
}
}
return null;
}
// Busca 1: CPF
if (leadInput.CPF__c) {
existingLeadId = searchLead("SELECT Id FROM Lead WHERE CPF__c = '" + leadInput.CPF__c + "' AND IsConverted = false LIMIT 1");
}
// Busca 2: Email
if (!existingLeadId && leadObj.Email) {
existingLeadId = searchLead("SELECT Id FROM Lead WHERE Email = '" + leadObj.Email + "' AND IsConverted = false LIMIT 1");
}
// Busca 3: Telefone (usando o recém formatado)
if (!existingLeadId && leadObj.Phone) {
existingLeadId = searchLead("SELECT Id FROM Lead WHERE (Phone = '" + leadObj.Phone + "' OR MobilePhone = '" + leadObj.Phone + "') AND IsConverted = false LIMIT 1");
}
// ===================================
// Criar ou Atualizar Lead no Salesforce (Suno)
// ===================================
var leadUrl = "https://suno.my.salesforce.com/services/data/v60.0/sobjects/Lead/";
var httpMethod = "POST";
if (existingLeadId) {
leadUrl = leadUrl + existingLeadId;
httpMethod = "PATCH"; // Atualiza em vez de Criar
}
var reqLead = new Script.Util.HttpRequest(leadUrl);
reqLead.emptyContentHandling = 0;
reqLead.retries = 0;
reqLead.continueOnError = true;
reqLead.contentType = "application/json; charset=utf-8";
reqLead.method = httpMethod;
reqLead.postData = leadData;
reqLead.setHeader("Authorization", "Bearer " + accessToken);
var leadResponse = reqLead.send();
var leadResult = Platform.Function.ParseJSON(String(leadResponse.content)) || String(leadResponse.content);
if (leadResponse.statusCode >= 200 && leadResponse.statusCode < 300) {
Write(Stringify({
success: true,
action_performed: httpMethod === "PATCH" ? "update" : "create",
lead_id: existingLeadId || (leadResult && leadResult.id ? leadResult.id : "Desconhecido"),
result: leadResult
}));
} else {
Write(Stringify({
success: false,
error: httpMethod === "PATCH" ? "Erro ao atualizar Lead no Salesforce" : "Erro ao criar Lead no Salesforce",
http_status: leadResponse.statusCode,
salesforce_error: leadResult,
payload_enviado: Platform.Function.ParseJSON(leadData)
}));
}
}
} catch (err) {
Write(Stringify({
success: false,
error: "Erro de compilação ou parse SSJS",
details: String(err)
}));
}
}