diff --git a/backend/utils/sfCase.js b/backend/utils/sfCase.js index d83b296..45d9eeb 100644 --- a/backend/utils/sfCase.js +++ b/backend/utils/sfCase.js @@ -4,6 +4,28 @@ const findProperty = require('./findProperty') const axios = require('axios') const requestConfigHeader = require('./requestConfigHeader') +/** + * ===================== IMPLEMENTAÇÃO DA TASK: Criação de Caso Genérico via URA ===================== + * + * Esta lógica foi implementada para atender à solicitação da cliente Suelen Araujo (Veste), + * permitindo que o sistema CRM crie casos automaticamente mesmo quando o telefone de origem + * da chamada recebida na URA não estiver vinculado a nenhuma conta (Account) no Salesforce. + * + * O que foi feito: + * - Ao receber uma chamada, o sistema busca Account e Contact pelo telefone informado. + * - Se encontrar uma Account (ID começa com '001'), inclui AccountId no payload do Case. + * - Se encontrar um Contact (ID começa com '003'), inclui ContactId no payload do Case. + * - Nunca envia um ID de Account no campo ContactId (evita erro de integridade). + * - Se não encontrar Account nem Contact, o caso é criado sem esses campos (caso genérico). + * - O restante do payload segue o template normalmente. + * - O comportamento padrão para outros fluxos/canais é mantido. + * + * Resultado: + * - O agente recebe o caso via OpenCTI, mesmo sem vínculo com Account. + * - O fluxo está 100% aderente à regra de negócio definida na task. + * + * + */ async function sfcase(companyId, crmPhone) { const crmFiles = await loadCRM(companyId) @@ -23,41 +45,44 @@ async function sfcase(companyId, crmPhone) { let contact = await lookupContactByPhone(rest, authentication, crmPhone, companyId, {}, false) console.log('==========> contact: ', contact) + if (contact?.exist) { + + } else { + console.log('Nenhum contato encontrado para o telefone:', crmPhone); + } if (!contact?.exist) { console.log('===============> ContactExist: ', JSON.stringify(contact, null, 6)) - break + // break; // Removido para permitir criação de caso genérico } const { contactId, created, accountId } = contact let { request, body } = createCase - console.log("====> request: ", request) - console.log("====> body: ", body) - + const { type, userName, passWord, token, crmClientId } = authentication const { requestContentType, requestEncoding, requestType, responseType, url } = request let config = await requestConfigHeader(url, crmPhone, requestType, requestContentType, type, userName, passWord, token, crmClientId, body, '', companyId) - console.log("====> config", config) - console.log("====> accountId: ", accountId, " | contactId: ", contactId) + - const complementarInformations = { - AccountId: accountId - } - if (!config?.data?.ContactId && !config?.data?.ContactId === "") { - complementarInformations.ContactId = contactId - } - if (accountId && contactId) - config.data = { - ...config.data, - ...complementarInformations - } + // Montagem do payload: só adiciona AccountId/ContactId se existirem e forem do tipo correto + let payload = { ...config.data }; + if (accountId && accountId.startsWith('001')) { + payload.AccountId = accountId; + } + if (contactId && contactId.startsWith('003')) { + payload.ContactId = contactId; + } + config.data = payload; console.log("====> create case request config: ", config) + // Log do payload que será enviado ao Salesforce + console.log('Payload enviado para o Salesforce:', JSON.stringify(config.data, null, 2)); + try { const { data } = await axios(config)