const axios = require('axios') const flatten = require('flat') const CustomError = require('../errors') const CRM_Contact = require('../models/CRM_Contact') const CRM = require('../models/CRM') const { URL } = require('url') const { getAccessToken } = require('./oauth2') const findProperty = require('./findProperty') const requestConfigHeader = require('./requestConfigHeader') const sendMessageSocket = require('./sendMessageSocket') const CRM_Ticket = require('../models/CRM_Ticket') const getHubspotPipelines = require('./getHubspotPipelines') const { pipeline } = require('stream') const findTicketOpenHubspotByContact = require('./findTicketOpenHubspotByContact') const lookupContactByPhone = require('./lookupCRMContactByPhone') async function lookupCrmTicket(rest, authentication, crmPhone, companyId, test = {}, ticketId, contact = null) { let flow = contact?.flow let propertyKey switch (flow) { case 2: propertyKey = 'lookupTicket2' break default: propertyKey = 'lookupTicket' break } let { request, body, response } = findProperty(rest, propertyKey) let { requestContentType, requestEncoding, requestType, responseType, url } = request const { type, userName, passWord, token, crmClientId } = authentication const config = await requestConfigHeader(url, crmPhone, requestType, requestContentType, type, userName, passWord, token, crmClientId, '', ticketId, companyId) if (test?.testing) { let msg = `Tentanto checar o status do ticket para o numer ${crmPhone} no crm` sendMessageSocket({ companyId, status: 'processing', data: { request: config, msg } }) } // Para crm sap if (url.includes("crmContactId") && contact && url.includes("c4codataapi")) { // Valor do contato const contactId = contact.contactId // Ex: "1112048" console.log("============> entrou no if crmContactId: ", contactId) // 1. O valor OData correto, com aspas simples, DEVE SER: '1112048' const odataValueWithQuotes = `'${contactId}'` // 2. Codificação URL do valor OData: '%271112048%27' const correctEncodedValue = encodeURIComponent(odataValueWithQuotes) // 3. Substitua a string incorreta (que contém o '%' extra e as aspas incorretas) pela correta. // O template parece ser: ...eq%20%crmContactId%27 const templateToReplace = `%${'crmContactId'}%27` // A string FINAL no URL deve ser: ...eq%20%271112048%27 // Tentativa de correção: Substitua a string inteira que contém o placeholder errado pela correta // ATENÇÃO: Se o contactId for '1112048', o template incorreto que está no config.url é: // `%1112048%27` (depois de rodar a primeira substituição) // OU `%crmContactId%27` (se a substituição ainda não ocorreu) // Vamos substituir a string do template ANTES de qualquer coisa. // Usaremos 'crmContactId' como marcador de substituição: config.url = config.url.replace( // String que está incorreta no seu template (que gera o erro): "%crmContactId%27" `%${'crmContactId'}%27`, // String correta que o servidor OData espera (Aspas codificadas corretamente): "%27" + + "%27" correctEncodedValue ) } if (url.includes("crmContactId") && contact && url.includes("c4codataapi")) { config.url = config.url.replace('crmContactId', contact.contactId) } console.log("============ journaling contact: ", JSON.stringify(contact, null, 6)) console.log("PAYLOAD CONFIG LOOKUP TICKET BY PHONE: ", JSON.stringify(config, null, 6)) let resp try { resp = await axios(config) console.log(`====> CompanyId: ${companyId} Request config para consultar status do ticket\n: `, JSON.stringify(config, null, 6)) console.log(`====> CompanyId: ${companyId} Response consultar status do ticket\n: `, JSON.stringify(resp.data, null, 6)) } catch (error) { if (error.response) { console.error('==================> lookupCrmTicket Erro na resposta da API:', { status: error.response.status, data: JSON.stringify(error.response.data, null, 6), }) } else if (error.request) { console.error('==================> lookupCrmTicket Nenhuma resposta recebida da API:', error?.request) } else { console.error('==================> lookupCrmTicket Erro ao configurar a request:', error?.message) } if (error?.response?.status == 404) return { error: 404 } } let { data } = resp data = flatten(data) let auxTicketStatus let auxTicketId let auxTicketId2 for (const prop in data) { const _prop = prop.replace(/^\d+\./, '').replace(/(?:^|\.)\d+\b/g, '') if (_prop == response?.status?.trim()) { auxTicketStatus = data[prop].replace('+', '') } if (_prop == response?.id?.trim()) { auxTicketId = data[prop] } if (_prop == response?.objectId?.trim()) { auxTicketId2 = data[prop] } // if (auxTicketStatus && auxTicketId) break } if (!auxTicketStatus && !auxTicketId) { for (const prop in data) { let _prop = prop.replace(/\.(\d+)(\.|$)/g, '[$1]$2') if (_prop == response?.status?.trim()) { auxTicketStatus = data[prop].replace('+', '') } if (_prop == response?.id?.trim()) { auxTicketId = data[prop] } if (_prop == response?.objectId?.trim()) { auxTicketId2 = data[prop] } // if (auxTicketStatus && auxTicketId) break } } console.log(`[${new Date()}] auxTicketStatus: ${auxTicketStatus} | auxTicketId: ${auxTicketId} | auxTicketId2: ${auxTicketId2}`) if (url.includes('api.hubapi.com')) { const contact = await lookupContactByPhone(rest, authentication, crmPhone, companyId) if (contact) { const ticket = await findTicketOpenHubspotByContact(authentication, contact) console.log('=========> OPEN TICKET 1: ', JSON.stringify(ticket, null, 6)) if (ticket && Object.keys(ticket).length != 0) { console.log('**** TICKET ESTA ABERTO 1 ****') return { auxTicketId: ticket.id, auxTicketStatus: 1 } } } return { auxTicketId, auxTicketStatus } } // To sap crm, consdering status open == 1 else if (url.includes("c4codataapi")) { if (auxTicketStatus && auxTicketStatus.toLowerCase() == "open") auxTicketStatus = 1 else auxTicketStatus = 0 } return { auxTicketId, auxTicketStatus, auxTicketId2 } } module.exports = lookupCrmTicket