crm-api-template-generator/backend/utils/whatsappJournalingCRM.js

151 lines
6.3 KiB
JavaScript

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 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: ', JSON.stringify(chatJournaling, null, 6))
if (chatJournaling) {
let contact = await _lookupContact(rest, authentication, crmPhone, crmEmail, companyId, crmFirstName)
console.log("================> whatsappJournalingCRM contact: ", JSON.stringify(contact, null, 6))
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: ', JSON.stringify(body, null, 6))
}
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, contactId2: contact?.contactId2 }
}
// 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.
// createContact(companyId, rest, authentication, crmPhone = '', crmFirstName = 'Username', crmLastName = 'Last name', crmEmail = '', test = {}, dynamicBodyRequest = {}, flow = 1)
console.log("=================> whatsappJournalingCRM contact?.flow: ", contact?.flow)
contact = await createContact(companyId, rest, authentication, crmPhone, crmFirstName, 'Last name', crmEmail, test = {}, dynamicBodyRequest = {}, flow = contact?.flow)
// 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, contactId2: contact?.contactId2 }
}
// 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
}