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 } }