153 lines
5.9 KiB
JavaScript
153 lines
5.9 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 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;
|
|
}
|
|
|