2024-07-19 18:48:34 +00:00
|
|
|
const loadCRM = require('./loadCRM')
|
|
|
|
const lookupContactByPhone = require('./lookupCRMContactByPhone')
|
|
|
|
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')
|
2024-10-02 13:06:07 +00:00
|
|
|
const sendEventTicketCreatedToSocket = require('./sendEventTicketCreatedToSocket')
|
2024-10-07 14:25:08 +00:00
|
|
|
const journalingRequest = require('./journalingRequest')
|
2025-04-03 14:37:20 +00:00
|
|
|
const getHubspotTicketStatus = require('./getHubspotTicketStatus')
|
|
|
|
const getHubspotTicket = require('./getHubspotTicket')
|
|
|
|
const getHubspotPipelines = require('./getHubspotPipelines')
|
|
|
|
const mongoose = require('mongoose')
|
2024-07-19 18:48:34 +00:00
|
|
|
|
2025-03-27 13:03:56 +00:00
|
|
|
async function ticketCRM(companyId, crmPhone, crmAgent = "0000", crmFirstName = 'Username') {
|
2024-07-19 18:48:34 +00:00
|
|
|
|
2024-10-03 20:53:55 +00:00
|
|
|
const crmFiles = await loadCRM(companyId)
|
|
|
|
|
2024-11-05 18:37:36 +00:00
|
|
|
// const crmContactIds = []
|
2025-03-11 20:44:47 +00:00
|
|
|
const crmTicketLinks = []
|
2024-10-03 20:53:55 +00:00
|
|
|
|
2024-10-02 13:06:07 +00:00
|
|
|
for (const crmConfig of crmFiles) {
|
2024-07-19 18:48:34 +00:00
|
|
|
|
2024-10-02 13:06:07 +00:00
|
|
|
const { crmRest: rest, authentication } = crmConfig.crm
|
2024-09-24 12:10:18 +00:00
|
|
|
|
2024-10-02 13:06:07 +00:00
|
|
|
// Send the ticket url link to hitphone to open on another browser tab
|
|
|
|
let obj = findProperty(rest, 'lookupTicket')
|
|
|
|
|
2025-03-11 20:44:47 +00:00
|
|
|
let ticket_id = ''
|
|
|
|
let isCreated = false
|
|
|
|
|
2024-10-02 13:06:07 +00:00
|
|
|
if (obj) {
|
|
|
|
|
|
|
|
let { url } = obj.request
|
2025-04-03 14:37:20 +00:00
|
|
|
let contact = await _lookupContact(rest, authentication, crmPhone, companyId, crmFirstName, url)
|
2024-07-19 18:48:34 +00:00
|
|
|
|
|
|
|
const crm = await CRM.findOne({
|
|
|
|
companyId, crmBaseURL: new URL(url.trim()).hostname
|
|
|
|
})
|
|
|
|
|
|
|
|
const obj_contact = await CRM_Contact.findOne({ companyId, crmBaseURL: new URL(url).hostname, phone: crmPhone })
|
|
|
|
|
|
|
|
const obj_ticket = await CRM_Ticket.findOne(
|
|
|
|
{ companyId, crm, contact: obj_contact }
|
|
|
|
).select('ticketId')
|
|
|
|
|
|
|
|
if (obj_ticket) {
|
|
|
|
|
2025-03-11 20:44:47 +00:00
|
|
|
const { ticketId } = obj_ticket
|
|
|
|
|
|
|
|
if (ticketId) {
|
|
|
|
ticket_id = ticketId
|
|
|
|
}
|
|
|
|
|
2024-07-19 18:48:34 +00:00
|
|
|
const obj_ticket_status = await lookupCRMTicket(
|
|
|
|
rest,
|
|
|
|
authentication,
|
|
|
|
crmPhone,
|
|
|
|
companyId,
|
|
|
|
test = { testing: false },
|
|
|
|
obj_ticket.ticketId
|
|
|
|
)
|
|
|
|
|
2025-03-27 13:03:56 +00:00
|
|
|
if (obj_ticket_status)
|
|
|
|
console.log("obj_ticket_status: ", JSON.stringify(obj_ticket_status, null, 6))
|
|
|
|
|
2024-07-19 18:48:34 +00:00
|
|
|
if (obj_ticket_status) {
|
|
|
|
const { auxTicketStatus, error } = obj_ticket_status
|
|
|
|
|
|
|
|
// refactor this for production. For now only working with hubspot where status new is equal 1
|
|
|
|
if ((auxTicketStatus && auxTicketStatus != '1') || (error && error == 404)) {
|
2025-04-03 14:37:20 +00:00
|
|
|
|
2024-07-19 18:48:34 +00:00
|
|
|
await CRM_Ticket.deleteMany({ contact: obj_contact })
|
2025-03-11 20:44:47 +00:00
|
|
|
|
2025-04-03 14:37:20 +00:00
|
|
|
if (url.includes("hubapi")) {
|
|
|
|
|
|
|
|
const result = await findTicketOpenHubspot(authentication, contact)
|
|
|
|
|
|
|
|
if (result) {
|
|
|
|
|
|
|
|
const { ticketId } = result
|
|
|
|
|
|
|
|
// Closed é a label padrão do ticket no hubspot
|
|
|
|
await sincTicket(authentication, contact, companyId, crm, obj_contact, ticketId)
|
|
|
|
|
|
|
|
ticket_id = ticketId
|
|
|
|
isCreated = false
|
|
|
|
|
|
|
|
crmTicketLinks.push({
|
|
|
|
ticketId: `https://app.hubspot.com/contacts/23636141/ticket/${ticket_id}`,
|
|
|
|
created: isCreated,
|
|
|
|
})
|
|
|
|
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2025-03-11 20:44:47 +00:00
|
|
|
const { ticketUrl, ticketId } = await _createTicket(rest, crmPhone, companyId, authentication, crmFirstName, contact, crmAgent)
|
|
|
|
|
|
|
|
ticket_id = ticketId
|
|
|
|
isCreated = true
|
|
|
|
// crmTicketLinks.push({ ticketUrl, ticketId })
|
|
|
|
|
2024-07-19 18:48:34 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
else {
|
2024-11-28 12:17:54 +00:00
|
|
|
|
2025-03-11 20:44:47 +00:00
|
|
|
|
2025-04-03 14:37:20 +00:00
|
|
|
if (url.includes("hubapi")) {
|
|
|
|
|
|
|
|
console.log(`[${new Date()}] ****** IS HUBSPOT CRM LETS TRY FINDING AN OPEN TICKET TO THE CONTACT****** `)
|
|
|
|
|
|
|
|
const result = await findTicketOpenHubspot(authentication, contact)
|
|
|
|
|
|
|
|
if (result) {
|
|
|
|
const { ticketId } = result
|
|
|
|
|
|
|
|
// Closed é a label padrão do ticket no hubspot
|
|
|
|
await sincTicket(authentication, contact, companyId, crm, obj_contact, ticketId)
|
|
|
|
|
|
|
|
ticket_id = ticketId
|
|
|
|
isCreated = false
|
|
|
|
|
|
|
|
crmTicketLinks.push({
|
|
|
|
ticketId: `https://app.hubspot.com/contacts/23636141/ticket/${ticket_id}`,
|
|
|
|
created: isCreated,
|
|
|
|
})
|
|
|
|
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
console.log(`[${new Date()}] ****** CREATE TICKET ****** `)
|
|
|
|
|
|
|
|
|
|
|
|
const { ticketUrl, ticketId } = await _createTicket(rest, crmPhone, companyId, authentication, crmFirstName, contact, crmAgent)
|
2025-03-11 20:44:47 +00:00
|
|
|
ticket_id = ticketId
|
|
|
|
isCreated = true
|
2024-07-19 18:48:34 +00:00
|
|
|
}
|
|
|
|
|
2025-03-11 20:44:47 +00:00
|
|
|
crmTicketLinks.push({
|
|
|
|
ticketId: `https://app.hubspot.com/contacts/23636141/ticket/${ticket_id}`,
|
|
|
|
created: isCreated,
|
|
|
|
})
|
2024-10-03 20:53:55 +00:00
|
|
|
|
|
|
|
|
2024-07-19 18:48:34 +00:00
|
|
|
}
|
2024-10-03 20:53:55 +00:00
|
|
|
//
|
2024-07-19 18:48:34 +00:00
|
|
|
|
2025-03-27 13:03:56 +00:00
|
|
|
}
|
2025-03-11 20:44:47 +00:00
|
|
|
return crmTicketLinks
|
2024-10-03 20:53:55 +00:00
|
|
|
|
2024-07-19 18:48:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = ticketCRM
|
|
|
|
|
|
|
|
|
2025-04-03 14:37:20 +00:00
|
|
|
async function sincTicket(authentication, contact, companyId, crm, obj_contact, ticketId) {
|
|
|
|
const { token } = authentication
|
|
|
|
const data = await getHubspotTicket(token, contact.contactId)
|
|
|
|
|
|
|
|
if (data && data?.results.length > 0) {
|
|
|
|
|
|
|
|
for (const ticket of data.results) {
|
|
|
|
|
|
|
|
const _ticket = await CRM_Ticket.findOne(
|
|
|
|
{ companyId, crm, ticketId: ticket.id }
|
|
|
|
)
|
|
|
|
|
|
|
|
if (_ticket) {
|
|
|
|
await _ticket.deleteOne()
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
await CRM_Ticket.create({
|
|
|
|
companyId,
|
|
|
|
contact: obj_contact,
|
|
|
|
ticketId: ticketId,
|
|
|
|
crm
|
|
|
|
})
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
async function findTicketOpenHubspot(authentication, contact) {
|
|
|
|
const { token } = authentication
|
|
|
|
const data = await getHubspotTicket(token, contact.contactId)
|
|
|
|
|
|
|
|
const pipelines = await getHubspotPipelines(token)
|
|
|
|
|
|
|
|
console.log(`[FUNCTION - ${new Date()}] getHubspotTicket total de tickets do contato: `, data?.results?.length)
|
|
|
|
|
|
|
|
if (data && data?.results.length > 0) {
|
|
|
|
|
|
|
|
for (const ticket of data.results) {
|
|
|
|
|
|
|
|
const { properties } = await getHubspotTicketStatus(token, ticket.id)
|
|
|
|
|
|
|
|
const { hs_pipeline_stage } = properties
|
|
|
|
|
|
|
|
let pipeline
|
|
|
|
|
|
|
|
for (let pip of pipelines.results) {
|
|
|
|
pipeline = pip.stages.find(({ id }) => id == hs_pipeline_stage)
|
|
|
|
|
|
|
|
if (pipeline) {
|
|
|
|
const { ticketState } = pipeline.metadata
|
|
|
|
const { label } = pipeline
|
|
|
|
|
|
|
|
console.log(`[FUNCTION - ${new Date()}] findTicketOpenHubspot: `, { ticketState, label, ticketId: ticket.id, hs_pipeline_stage })
|
|
|
|
|
|
|
|
if (ticketState == "OPEN")
|
|
|
|
return { ticketState, label, ticketId: ticket.id }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
async function _lookupContact(rest, authentication, crmPhone, companyId, crmFirstName, url) {
|
2024-10-03 20:53:55 +00:00
|
|
|
|
2024-10-02 13:06:07 +00:00
|
|
|
let contact = await lookupContactByPhone(rest, authentication, crmPhone, companyId)
|
|
|
|
|
2024-10-03 20:53:55 +00:00
|
|
|
if (contact?.exist) {
|
|
|
|
return { created: false, contactId: contact.contactId }
|
|
|
|
}
|
|
|
|
|
2024-10-02 13:06:07 +00:00
|
|
|
if (!contact?.exist) {
|
2025-04-03 14:37:20 +00:00
|
|
|
const contacts = await CRM_Contact.find({ companyId, crmBaseURL: new URL(url).hostname, phone: crmPhone })
|
|
|
|
|
|
|
|
if (contacts) {
|
|
|
|
for (const contact of contacts) {
|
|
|
|
|
|
|
|
await CRM_Ticket.deleteMany({ companyId, contact: contact })
|
|
|
|
|
|
|
|
await contact.deleteOne()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-10-02 13:06:07 +00:00
|
|
|
contact = await createContact(companyId, rest, authentication, crmPhone, crmFirstName)
|
|
|
|
}
|
2024-10-03 20:53:55 +00:00
|
|
|
|
|
|
|
return { created: true, contactId: contact.contactId }
|
2024-10-02 13:06:07 +00:00
|
|
|
}
|
|
|
|
|
2024-07-19 20:23:25 +00:00
|
|
|
async function _createTicket(rest, crmPhone, companyId, authentication, crmFirstName, contact, crmAgent) {
|
2024-07-19 18:48:34 +00:00
|
|
|
let obj = findProperty(rest, 'createTicketRecord')
|
|
|
|
|
2025-03-11 20:44:47 +00:00
|
|
|
let ticket_url = ''
|
|
|
|
let ticket_id = ''
|
|
|
|
|
2024-07-19 18:48:34 +00:00
|
|
|
if (obj) {
|
|
|
|
let { request, response } = obj
|
|
|
|
|
|
|
|
if (request) {
|
|
|
|
msg = `Tentando criar ticket para o contato ${crmPhone}`
|
2025-04-03 14:37:20 +00:00
|
|
|
// return { exist: true, ticketId: auxTicketId, phone: crmPhone, ticketUrl }
|
2024-07-19 18:48:34 +00:00
|
|
|
|
2025-03-11 20:44:47 +00:00
|
|
|
// return { exist: true, ticketId: auxTicketId, phone: crmPhone, ticketUrl }
|
|
|
|
const { ticketUrl, ticketId, } = await createTicket(companyId,
|
2024-07-19 18:48:34 +00:00
|
|
|
rest,
|
|
|
|
authentication,
|
|
|
|
crmPhone,
|
2024-09-30 13:53:32 +00:00
|
|
|
crmFirstName = 'Username',
|
2024-07-19 18:48:34 +00:00
|
|
|
crmLastName = '',
|
|
|
|
crmEmail = '',
|
|
|
|
test = { testing: false },
|
2024-07-19 20:23:25 +00:00
|
|
|
crmContactId = contact.contactId,
|
|
|
|
crmAgent
|
2024-07-19 18:48:34 +00:00
|
|
|
)
|
2025-03-11 20:44:47 +00:00
|
|
|
|
|
|
|
ticket_id = ticketId
|
|
|
|
ticket_url = ticketUrl
|
2024-07-19 18:48:34 +00:00
|
|
|
}
|
|
|
|
}
|
2025-03-11 20:44:47 +00:00
|
|
|
return { crmFirstName, ticketUrl: ticket_url, ticketId: ticket_id }
|
2024-07-19 18:48:34 +00:00
|
|
|
}
|
|
|
|
|