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

370 lines
13 KiB
JavaScript

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')
const sendEventTicketCreatedToSocket = require('./sendEventTicketCreatedToSocket')
const journalingRequest = require('./journalingRequest')
const getHubspotTicketStatus = require('./getHubspotTicketStatus')
const getHubspotTicket = require('./getHubspotTicket')
const getHubspotPipelines = require('./getHubspotPipelines')
const mongoose = require('mongoose')
const getHubspotTicketStatusByContact = require('./getHubspotTicketStatusByContact')
const findTicketOpenHubspotByContact = require('./findTicketOpenHubspotByContact')
const generateC4CServiceRequestDeepLinkBase64 = require('./generateC4CServiceRequestDeepLinkBase64')
async function ticketCRM(companyId, crmPhone, crmAgent = "0000", crmFirstName = 'Username', flow = 1) {
const crmFiles = await loadCRM(companyId)
// const crmContactIds = []
const crmTicketLinks = []
for (const crmConfig of crmFiles) {
const { crmRest: rest, authentication } = crmConfig.crm
let propertyKey
switch (flow) {
case 2:
propertyKey = 'lookupTicket2'
break
default:
propertyKey = 'lookupTicket'
break
}
// find ticket
let obj = findProperty(rest, propertyKey)
let ticket_id = ''
let ticket_id2 = ''
let ticket_url = ''
let isCreated = false
console.log("===========> ticketCRM obj: ", obj)
if (obj) {
const { crmAccountId } = authentication
console.log("------------> ticketCRM crmAccountId: ", crmAccountId)
let { url } = obj.request
console.log("------------> ticketCRM url: ", url)
let contact = await _lookupContact(rest, authentication, crmPhone, companyId, crmFirstName, url)
console.log("------------> ticketCRM contact: ", JSON.stringify(contact, null, 6))
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 })
console.log("------------> ticketCRM obj_contact: ", JSON.stringify(obj_contact, null, 6))
const obj_ticket = await CRM_Ticket.findOne(
{ companyId, crm, contact: obj_contact }
).select('ticketId ticketId2')
console.log("------------> ticketCRM obj_ticket: ", JSON.stringify(obj_ticket, null, 6))
if (obj_ticket) {
const { ticketId, ticketId2 } = obj_ticket
if (ticketId) {
ticket_id = ticketId
}
if (ticketId2) {
ticket_id2 = ticketId2
}
const obj_ticket_status = await lookupCRMTicket(
rest,
authentication,
crmPhone,
companyId,
test = { testing: false },
obj_ticket.ticketId,
contact
)
if (obj_ticket_status)
console.log("obj_ticket_status: ", JSON.stringify(obj_ticket_status, null, 6))
if (obj_ticket_status) {
const { auxTicketStatus, error } = obj_ticket_status
console.log("===============> ticketCRM url: ", url, " | error: ", error, " | auxTicketStatus: ", auxTicketStatus)
// refactor this for production. For now only working with hubspot where status new is equal 1
if ((auxTicketStatus && auxTicketStatus != '1') || (error && error == 404)) {
await CRM_Ticket.deleteMany({ contact: obj_contact })
if (url.includes("hubapi")) {
const result = await findTicketOpenHubspot(authentication, contact)
if (result) {
const { ticketId } = result
await sincTicket(authentication, contact, companyId, crm, obj_contact, ticketId)
ticket_id = ticketId
isCreated = false
crmTicketLinks.push({
ticketId: `https://app.hubspot.com/contacts/${crmAccountId}/ticket/${ticket_id}`,
created: isCreated,
})
continue
}
}
const { ticketUrl, ticketId, ticketId2 } = await _createTicket(rest, crmPhone, companyId, authentication, crmFirstName, contact, crmAgent, flow)
ticket_id = ticketId
ticket_id2 = ticketId2
isCreated = true
// crmTicketLinks.push({ ticketUrl, ticketId })
}
}
}
else {
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/${crmAccountId}/ticket/${ticket_id}`,
created: isCreated,
})
continue
}
}
// To sap crm try to find ticket open
else if (url.includes("c4codataapi")) {
const result = await lookupCRMTicket(
rest,
authentication,
crmPhone,
companyId,
test = { testing: false },
obj_ticket?.ticketId,
contact
)
// elefante
const { auxTicketId, auxTicketStatus, auxTicketId2 } = result
console.log("============> TICKET STATUS: ", auxTicketStatus, " | auxTicketId: ", auxTicketId)
if (auxTicketStatus == 1 && auxTicketId2) {
ticket_id = auxTicketId
ticket_id2 = auxTicketId2
isCreated = false
const _ticketUrl = `https://my365398.crm.ondemand.com/sap/ap/ui/clogin?saml2=disabled&app.component=%2fSAP_UI_CT%2fMain%2froot.uiccwoc&rootWindow=X&redirectUrl=%2fsap%2fpublic%2fbyd%2fruntime&supressAutoLogon=true&sap-ui-language=en_us#Nav/1/${generateC4CServiceRequestDeepLinkBase64(auxTicketId2)}`
crmTicketLinks.push({
ticketId: auxTicketId2,
ticketUrl: _ticketUrl,
created: isCreated,
})
// sinc ticket
let __contact = await CRM_Contact.findOne({ companyId, crmBaseURL: new URL(url).hostname, phone: crmPhone })
await CRM_Ticket.deleteMany({ companyId, contact: __contact })
const crm = await CRM.findOne({ companyId, crmBaseURL: new URL(url).hostname })
await CRM_Ticket.create({ companyId, contact: __contact, ticketId: auxTicketId, ticketId2: auxTicketId2, crm })
continue
}
}
console.log(`[${new Date()}] ****** CREATE TICKET ****** `)
const { ticketUrl, ticketId, ticketId2 } = await _createTicket(rest, crmPhone, companyId, authentication, crmFirstName, contact, crmAgent, flow)
ticket_id = ticketId
ticket_id2 = ticketId2
// ticket_url = ticketUrl
isCreated = true
}
if (url.includes("hubapi")) {
crmTicketLinks.push({
ticketId: `https://app.hubspot.com/contacts/${crmAccountId}/ticket/${ticket_id}`,
created: isCreated,
})
}
// To sap crm
else if (url.includes("c4codataapi")) {
console.log("=================> c4codataapi ticket_id2: ", ticket_id2)
crmTicketLinks.push({
ticketId: ticket_id2,
ticketUrl: `https://my365398.crm.ondemand.com/sap/ap/ui/clogin?saml2=disabled&app.component=%2fSAP_UI_CT%2fMain%2froot.uiccwoc&rootWindow=X&redirectUrl=%2fsap%2fpublic%2fbyd%2fruntime&supressAutoLogon=true&sap-ui-language=en_us#Nav/1/${generateC4CServiceRequestDeepLinkBase64(ticket_id2)}`,
created: isCreated,
})
}
}
//
}
return crmTicketLinks
}
module.exports = ticketCRM
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 ticket = await findTicketOpenHubspotByContact(authentication, contact)
console.log('=========> OPEN TICKET 2: ', JSON.stringify(ticket, null, 6))
if (ticket && Object.keys(ticket).length != 0) {
console.log('**** TICKET ESTA ABERTO 2 ****')
return { ticketId: ticket.id, auxTicketStatus: 1 }
}
}
async function _lookupContact(rest, authentication, crmPhone, companyId, crmFirstName, url) {
let contact = await lookupContactByPhone(rest, authentication, crmPhone, companyId)
if (contact?.exist) {
return { created: false, contactId: contact.contactId, contactId2: contact.contactId2, accountId: contact?.accountId, flow: contact?.flow }
}
if (!contact?.exist) {
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()
}
}
contact = await createContact(companyId, rest, authentication, crmPhone, crmFirstName)
}
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) {
let propertyKey
switch (flow) {
case 2:
propertyKey = 'createTicketRecord2'
break
default:
propertyKey = 'createTicketRecord'
break
}
let obj = findProperty(rest, propertyKey)
let ticket_url = ''
let ticket_id = ''
if (obj) {
let { request, response } = obj
if (request) {
msg = `Tentando criar ticket para o contato ${crmPhone}`
// return { exist: true, ticketId: auxTicketId, phone: crmPhone, ticketUrl }
// return { exist: true, ticketId: auxTicketId, phone: crmPhone, ticketUrl }
const { ticketUrl, ticketId, ticketId2 } = await createTicket(companyId,
rest,
authentication,
crmPhone,
crmFirstName = 'Username',
crmLastName = '',
crmEmail = '',
test = { testing: false },
contact,
crmAgent
)
ticket_id = ticketId
ticket_id2 = ticketId2
ticket_url = ticketUrl
}
}
return { crmFirstName, ticketUrl: ticket_url, ticketId: ticket_id, ticketId2: ticket_id2 }
}