const loadCRM = require('./loadCRM') const lookupContactByPhone = require('./lookupCRMContactByPhone') const lookupContactByEmail = require('./lookupCRMContactByEmail') const createContact = require('./createContact') const findProperty = require('./findProperty') const CRM_Contact = require('../models/CRM_Contact') const CRM_Ticket = require('../models/CRM_Ticket') const CRM = require('../models/CRM') const createTicket = require('./createTicket') const lookupCRMTicket = require('./lookupCRMTicket') const sendEventTicketCreatedToSocket = require('./sendEventTicketCreatedToSocket') const journalingRequest = require('./journalingRequest') const getIntegrationsConfig = require('../utils/getIntegrationsConfig') const updateLeadStatus = require('./updateLeadStatus') const extractLeadStatusChange = require('./extractLeadStatusChange') async function whatsappJournalingCRM(companyId, crmPhone = '', crmAgent, crmFirstName = 'Username', ticketId = null, crmEmail = '', dynamicBodyRequest = {}) { // async function whatsappJournalingCRM(companyId, crmPhone, crmAgent, crmFirstName = 'Username', ticketId = null) { const crmFiles = await loadCRM(companyId) const crmContactIds = [] for (const crmConfig of crmFiles) { const { crmRest: rest, authentication } = crmConfig.crm // Record whatsapp conversation that happened in omnihit v2 let chatJournaling = findProperty(rest, 'chatJournaling') console.log('===============> chatJournaling: ', chatJournaling) if (chatJournaling) { let contact = await _lookupContact(rest, authentication, crmPhone, crmEmail, companyId, crmFirstName) let { request, chats, response } = chatJournaling let body = findProperty(chats, 'chatDone') let config = await getIntegrationsConfig(companyId, 'omnihit') if (ticketId && config) { const { accountId, api: { url, urlHttps, token } = {}, createConversation: { inbox_id, status, team_id } = {} = {} } = config console.log('===============> body1: ', body) body = JSON.stringify(body) if (body.includes('chatLink')) { body = body.replace('chatLink', `${urlHttps}/app/accounts/${accountId}/conversations/${ticketId}`) } console.log('===============> body2: ', body) body = JSON.parse(body) console.log('===============> body3: ', body) } await journalingRequest(request, body, crmCallDuration = 0, contact, crmAgent, crmPhone, authentication, rest, companyId, dynamicBodyRequest) // Se vier um novo status (__newLeadStatus), executa PATCH aproveitando as validações do fluxo de Activity try { const { shouldUpdate, newStatus, leadId: leadIdFromBody } = extractLeadStatusChange(dynamicBodyRequest) const leadId = leadIdFromBody || contact?.contactId if (shouldUpdate && leadId) { console.log('whatsappJournalingCRM: Atualizando Status do Lead', { leadId, newStatus }) await updateLeadStatus(rest, authentication, leadId, newStatus, companyId) } } catch (err) { console.error('whatsappJournalingCRM: falha ao atualizar Status do Lead', err?.message || err) } } // } return crmContactIds } module.exports = whatsappJournalingCRM // async function _lookupContact(rest, authentication, crmPhone, companyId, crmFirstName) { // let contact = await lookupContactByPhone(rest, authentication, crmPhone, companyId) // if (contact?.exist) { // return { created: false, contactId: contact.contactId } // } // if (!contact?.exist) { // contact = await createContact(companyId, rest, authentication, crmPhone, crmFirstName) // } // return { created: true, contactId: contact.contactId } // } async function _lookupContact(rest, authentication, crmPhone, crmEmail, companyId, crmFirstName) { let contact = null; // 1. Tenta buscar o contato por telefone se o crmPhone for fornecido if (crmPhone) { console.log(`Buscando contato por telefone: ${crmPhone}`); contact = await lookupContactByPhone(rest, authentication, crmPhone, companyId); } // 2. Se não encontrou por telefone, tenta buscar por e-mail se o crmEmail for fornecido if (!contact?.exist && crmEmail) { console.log(`Contato não encontrado por telefone. Tentando por e-mail: ${crmEmail}`); contact = await lookupContactByEmail(rest, authentication, crmEmail, companyId); } // 3. Se o contato já existe (seja por telefone ou e-mail), retorna as informações if (contact?.exist) { console.log(`Contato encontrado! ID: ${contact.contactId}`); return { created: false, contactId: contact.contactId }; } // 4. Se o contato não foi encontrado por nenhuma das formas, cria um novo console.log(`Contato não encontrado. Criando um novo com base no ${crmPhone ? 'telefone' : 'e-mail'}.`); // AQUI ESTÁ A ÚNICA MUDANÇA NECESSÁRIA: // Chamamos createContact passando os valores de telefone e e-mail separadamente. // A função createContact agora sabe como lidar com ambos, mesmo que um deles seja vazio. contact = await createContact(companyId, rest, authentication, crmPhone, crmFirstName, 'Last name', crmEmail); // Se o contato for criado, retorna suas informações if (contact?.contactId) { console.log(`Novo contato criado com ID: ${contact.contactId}`); return { created: true, contactId: contact.contactId }; } // Caso não tenha nem telefone nem e-mail, retorna um erro ou um valor nulo console.error("Erro: Não foi possível encontrar ou criar um contato. Telefone e e-mail não fornecidos."); return null; }