feat: Propagates contact flow and allows always creating a new ticket

- returns flow when validating contact and uses fallback -1 when not found
- avoids searching for email for company 4953 and passes the flow when creating a contact
- accepts dynamic body and allows forcing a new ticket without saving a reference
master
adriano 2025-10-24 14:28:52 -03:00
parent 9b23e5d721
commit b6fed7e454
5 changed files with 45 additions and 25 deletions

View File

@ -94,11 +94,14 @@ const checkContact = async (req, res) => {
contact = await lookupContactByEmail(rest, authentication, crmEmail, companyId) contact = await lookupContactByEmail(rest, authentication, crmEmail, companyId)
} }
if (contact?.exist) { if (contact?.exist) {
return res.status(StatusCodes.OK).json({ exist: contact.exist })
return res.status(StatusCodes.OK).json({ exist: contact.exist, flow: contact?.flow || 1 })
} }
} }
res.status(StatusCodes.OK).json({ exist: false }) res.status(StatusCodes.OK).json({ exist: false, flow: -1 })
} }
// const contactActivity = async (req, res) => { // const contactActivity = async (req, res) => {
@ -564,11 +567,11 @@ const getCrms = async (req, res) => {
const createTicket = async (req, res) => { const createTicket = async (req, res) => {
let { companyId, crmPhone } = req.body let { companyId, crmPhone, newTicketAllways = false, dynamicBodyRequest = {} } = req.body
mustContainProperties(req, ['companyId', 'crmPhone']) mustContainProperties(req, ['companyId', 'crmPhone'])
const crmTicketLinks = await ticketCRM(companyId, crmPhone) const crmTicketLinks = await ticketCRM(companyId, crmPhone, '0000', 'Username', 1, newTicketAllways, dynamicBodyRequest)
.catch(function (error) { .catch(function (error) {
console.error(`Error on create ticket: companyID ${companyId} | crmPhone: ${crmPhone}`) console.error(`Error on create ticket: companyID ${companyId} | crmPhone: ${crmPhone}`)

View File

@ -15,7 +15,8 @@ async function createCRMContact(companyId, crmFirstName, crmPhone = '', crmEmail
if (crmPhone) { if (crmPhone) {
contact = await lookupContactByPhone(rest, authentication, crmPhone, companyId) contact = await lookupContactByPhone(rest, authentication, crmPhone, companyId)
} }
if (!contact?.exist && crmEmail) { // Por enquanto não esta verificando contato por email para cliente gradezco 4953
if (!contact?.exist && crmEmail && companyId != "4953") {
contact = await lookupContactByEmail(rest, authentication, crmEmail, companyId) contact = await lookupContactByEmail(rest, authentication, crmEmail, companyId)
} }
if (contact?.exist) { if (contact?.exist) {
@ -25,7 +26,10 @@ async function createCRMContact(companyId, crmFirstName, crmPhone = '', crmEmail
// if (contact.exist) continue // if (contact.exist) continue
await createContact(companyId, rest, authentication, crmPhone, crmFirstName, crmLastName, crmEmail, {}, dynamicBodyRequest) console.log("==============> contact: ", JSON.stringify(contact, null, 6))
await createContact(companyId, rest, authentication, crmPhone, crmFirstName, crmLastName, crmEmail, {}, dynamicBodyRequest, contact?.flow || 1)
} }

View File

@ -81,7 +81,7 @@ async function createContact(companyId, rest, authentication, crmPhone = '', crm
console.log('CREATE CONTACT PAYLOAD: ', JSON.stringify(config, null, 6)) console.log('CREATE CONTACT PAYLOAD: ', JSON.stringify(config, null, 6))
console.log('#####################') console.log('#####################')
if (dynamicBodyRequest && Object.keys(dynamicBodyRequest) !== 0) { if (dynamicBodyRequest && Object.keys(dynamicBodyRequest).length !== 0) {
config.data = { ...config.data, ...dynamicBodyRequest } config.data = { ...config.data, ...dynamicBodyRequest }
console.log('#####################') console.log('#####################')
console.log('CREATE CONTACT PAYLOAD UPDATED BY DYNAMIC BODY REQUEST: ', JSON.stringify(config, null, 6)) console.log('CREATE CONTACT PAYLOAD UPDATED BY DYNAMIC BODY REQUEST: ', JSON.stringify(config, null, 6))

View File

@ -11,7 +11,7 @@ const sendEventTicketCreatedToSocket = require('./sendEventTicketCreatedToSocket
const generateC4CServiceRequestDeepLinkBase64 = require('./generateC4CServiceRequestDeepLinkBase64') const generateC4CServiceRequestDeepLinkBase64 = require('./generateC4CServiceRequestDeepLinkBase64')
async function createTicket(companyId, rest, authentication, crmPhone, crmFirstName = 'Username', crmLastName = 'Last name', crmEmail = '', test = {}, contact, crmAgent) { async function createTicket(companyId, rest, authentication, crmPhone, crmFirstName = 'Username', crmLastName = 'Last name', crmEmail = '', test = {}, contact, crmAgent, saveTicket = true, dynamicBodyRequest = {}) {
let ticketUrl = '' let ticketUrl = ''
let crmContactId = contact.contactId let crmContactId = contact.contactId
@ -77,7 +77,7 @@ async function createTicket(companyId, rest, authentication, crmPhone, crmFirstN
const { type, userName, passWord, token, crmClientId, crmAccountId } = authentication const { type, userName, passWord, token, crmClientId, crmAccountId } = authentication
//url, crmPhone, requestType, requestContentType, type, userName, passWord, token, crmClientId, data = '', ticketId = '', companyId //url, crmPhone, requestType, requestContentType, type, userName, passWord, token, crmClientId, data = '', ticketId = '', companyId
const config = await requestConfigHeader(url, crmPhone, requestType, requestContentType, type, userName, passWord, token, crmClientId, body, '', companyId) let config = await requestConfigHeader(url, crmPhone, requestType, requestContentType, type, userName, passWord, token, crmClientId, body, '', companyId)
if (test?.testing) { if (test?.testing) {
msg = `Tentanto criar ticket do numero ${crmPhone} no crm` msg = `Tentanto criar ticket do numero ${crmPhone} no crm`
@ -86,6 +86,15 @@ async function createTicket(companyId, rest, authentication, crmPhone, crmFirstN
console.log('===============> createTicket: ', JSON.stringify(config, null, 6)) console.log('===============> createTicket: ', JSON.stringify(config, null, 6))
console.log('===============> dynamicBodyRequest: ', JSON.stringify(dynamicBodyRequest, null, 6))
if (dynamicBodyRequest && Object.keys(dynamicBodyRequest).length !== 0) {
config.data = { ...config.data, ...dynamicBodyRequest }
console.log('#####################')
console.log('CREATE TICKET PAYLOAD UPDATED BY DYNAMIC BODY REQUEST: ', JSON.stringify(config, null, 6))
console.log('#####################')
}
let resp let resp
try { try {
@ -145,9 +154,10 @@ async function createTicket(companyId, rest, authentication, crmPhone, crmFirstN
contact2 = await CRM_Contact.create({ companyId, crm, crmBaseURL: new URL(url).hostname, contactId: contact.contactId, phone: crmPhone }) contact2 = await CRM_Contact.create({ companyId, crm, crmBaseURL: new URL(url).hostname, contactId: contact.contactId, phone: crmPhone })
} }
const crm = await CRM.findOne({ companyId, crmBaseURL: new URL(url).hostname }) if (saveTicket) {
const crm = await CRM.findOne({ companyId, crmBaseURL: new URL(url).hostname })
await CRM_Ticket.create({ companyId, contact: contact2, ticketId: auxTicketId, ticketId2: auxTicketId2, crm }) await CRM_Ticket.create({ companyId, contact: contact2, ticketId: auxTicketId, ticketId2: auxTicketId2, crm })
}
if (url.includes("hubapi")) { if (url.includes("hubapi")) {
ticketUrl = `https://app.hubspot.com/contacts/${crmAccountId}/ticket/${auxTicketId}` ticketUrl = `https://app.hubspot.com/contacts/${crmAccountId}/ticket/${auxTicketId}`

View File

@ -8,17 +8,11 @@ const CRM = require('../models/CRM')
const createTicket = require('./createTicket') const createTicket = require('./createTicket')
const lookupCRMTicket = require('./lookupCRMTicket') const lookupCRMTicket = require('./lookupCRMTicket')
const sendEventTicketCreatedToSocket = require('./sendEventTicketCreatedToSocket')
const journalingRequest = require('./journalingRequest')
const getHubspotTicketStatus = require('./getHubspotTicketStatus')
const getHubspotTicket = require('./getHubspotTicket') const getHubspotTicket = require('./getHubspotTicket')
const getHubspotPipelines = require('./getHubspotPipelines')
const mongoose = require('mongoose')
const getHubspotTicketStatusByContact = require('./getHubspotTicketStatusByContact')
const findTicketOpenHubspotByContact = require('./findTicketOpenHubspotByContact') const findTicketOpenHubspotByContact = require('./findTicketOpenHubspotByContact')
const generateC4CServiceRequestDeepLinkBase64 = require('./generateC4CServiceRequestDeepLinkBase64') const generateC4CServiceRequestDeepLinkBase64 = require('./generateC4CServiceRequestDeepLinkBase64')
async function ticketCRM(companyId, crmPhone, crmAgent = "0000", crmFirstName = 'Username', flow = 1) { async function ticketCRM(companyId, crmPhone, crmAgent = "0000", crmFirstName = 'Username', flow = 1, newTicketAllways = false, dynamicBodyRequest = {}) {
const crmFiles = await loadCRM(companyId) const crmFiles = await loadCRM(companyId)
@ -76,7 +70,7 @@ async function ticketCRM(companyId, crmPhone, crmAgent = "0000", crmFirstName =
console.log("------------> ticketCRM obj_ticket: ", JSON.stringify(obj_ticket, null, 6)) console.log("------------> ticketCRM obj_ticket: ", JSON.stringify(obj_ticket, null, 6))
if (obj_ticket) { if (obj_ticket && newTicketAllways == false) {
const { ticketId, ticketId2 } = obj_ticket const { ticketId, ticketId2 } = obj_ticket
@ -148,7 +142,7 @@ async function ticketCRM(companyId, crmPhone, crmAgent = "0000", crmFirstName =
} }
else { else {
if (url.includes("hubapi")) { if (url.includes("hubapi") && newTicketAllways == false) {
console.log(`[${new Date()}] ****** IS HUBSPOT CRM LETS TRY FINDING AN OPEN TICKET TO THE CONTACT****** `) console.log(`[${new Date()}] ****** IS HUBSPOT CRM LETS TRY FINDING AN OPEN TICKET TO THE CONTACT****** `)
@ -172,7 +166,7 @@ async function ticketCRM(companyId, crmPhone, crmAgent = "0000", crmFirstName =
} }
} }
// To sap crm try to find ticket open // To sap crm try to find ticket open
else if (url.includes("c4codataapi")) { else if (url.includes("c4codataapi") && newTicketAllways == false) {
const result = await lookupCRMTicket( const result = await lookupCRMTicket(
rest, rest,
authentication, authentication,
@ -217,7 +211,14 @@ async function ticketCRM(companyId, crmPhone, crmAgent = "0000", crmFirstName =
console.log(`[${new Date()}] ****** CREATE TICKET ****** `) console.log(`[${new Date()}] ****** CREATE TICKET ****** `)
const { ticketUrl, ticketId, ticketId2 } = await _createTicket(rest, crmPhone, companyId, authentication, crmFirstName, contact, crmAgent, flow) let saveTicket = true
if (newTicketAllways)
saveTicket = false
console.log("================> ticketCRM saveTicket: ", saveTicket)
const { ticketUrl, ticketId, ticketId2 } = await _createTicket(rest, crmPhone, companyId, authentication, crmFirstName, contact, crmAgent, flow, saveTicket, dynamicBodyRequest)
ticket_id = ticketId ticket_id = ticketId
ticket_id2 = ticketId2 ticket_id2 = ticketId2
// ticket_url = ticketUrl // ticket_url = ticketUrl
@ -321,7 +322,7 @@ async function _lookupContact(rest, authentication, crmPhone, companyId, crmFirs
return { created: true, contactId: contact.contactId, contactId2: contact.contactId2, accountId: contact?.accountId, flow: contact?.flow } return { created: true, contactId: contact.contactId, contactId2: contact.contactId2, accountId: contact?.accountId, flow: contact?.flow }
} }
async function _createTicket(rest, crmPhone, companyId, authentication, crmFirstName, contact, crmAgent, flow = 1) { async function _createTicket(rest, crmPhone, companyId, authentication, crmFirstName, contact, crmAgent, flow = 1, saveTicket = true, dynamicBodyRequest = {}) {
let propertyKey let propertyKey
@ -356,7 +357,9 @@ async function _createTicket(rest, crmPhone, companyId, authentication, crmFirst
crmEmail = '', crmEmail = '',
test = { testing: false }, test = { testing: false },
contact, contact,
crmAgent crmAgent,
saveTicket,
dynamicBodyRequest
) )
ticket_id = ticketId ticket_id = ticketId