atualização: nas buscas, atribuir chat a uma fila quando iniciada pelo atendente. Controle para evitar loop infinito de bot
parent
a1c9c42287
commit
470ae86353
|
@ -14,6 +14,8 @@ import SendWhatsAppMessage from "../services/WbotServices/SendWhatsAppMessage";
|
||||||
import { Op, where, Sequelize } from "sequelize";
|
import { Op, where, Sequelize } from "sequelize";
|
||||||
import ShowTicketServiceByContactId from "../services/TicketServices/ShowTicketServiceByContactId";
|
import ShowTicketServiceByContactId from "../services/TicketServices/ShowTicketServiceByContactId";
|
||||||
import hitPortalMonitoring from "../helpers/HitPortalMonitoring";
|
import hitPortalMonitoring from "../helpers/HitPortalMonitoring";
|
||||||
|
import FindOrCreateTicketServiceBot from "../services/TicketServices/FindOrCreateTicketServiceBot";
|
||||||
|
import Contact from "../models/Contact";
|
||||||
|
|
||||||
|
|
||||||
// type IndexQuery = {
|
// type IndexQuery = {
|
||||||
|
@ -22,13 +24,8 @@ import hitPortalMonitoring from "../helpers/HitPortalMonitoring";
|
||||||
|
|
||||||
export const hit = async (req: Request, res: Response): Promise<Response> => {
|
export const hit = async (req: Request, res: Response): Promise<Response> => {
|
||||||
|
|
||||||
// const {
|
|
||||||
// centro_custo,
|
|
||||||
// } = req.body as IndexQuery;
|
|
||||||
|
|
||||||
console.log('req.boy: ', req.body)
|
console.log('req.body: ', req.body)
|
||||||
console.log('req.boy: ', req.body['centro_custo'])
|
|
||||||
console.log('ACTION: ', req.body['action'])
|
|
||||||
|
|
||||||
if (req.headers["auth"] === '0424bd59b807674191e7d77572075f33') {
|
if (req.headers["auth"] === '0424bd59b807674191e7d77572075f33') {
|
||||||
|
|
||||||
|
@ -44,6 +41,10 @@ export const hit = async (req: Request, res: Response): Promise<Response> => {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!contact) {
|
||||||
|
return res.status(200).json({ "message": "Ok" });
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (req.body['action'] === 'atdfechou') {
|
if (req.body['action'] === 'atdfechou') {
|
||||||
|
|
||||||
|
@ -53,24 +54,11 @@ export const hit = async (req: Request, res: Response): Promise<Response> => {
|
||||||
|
|
||||||
console.log('atdfechou ----------> THE CONTACT: ', contact)
|
console.log('atdfechou ----------> THE CONTACT: ', contact)
|
||||||
|
|
||||||
if (contact) {
|
|
||||||
|
|
||||||
let data = req.body
|
let data = req.body
|
||||||
let str = ''
|
let str = ''
|
||||||
let str2 = ''
|
let str2 = ''
|
||||||
|
|
||||||
// const exclude = ["action", "centro_custo", "n_chamado_web", "historico"];
|
|
||||||
|
|
||||||
// for (const key in data) {
|
|
||||||
|
|
||||||
// if (exclude.includes(`${key}`)) {
|
|
||||||
// continue
|
|
||||||
// }
|
|
||||||
|
|
||||||
// str += `${key.replace('hostname', 'cliente')}: ${data[key]}\n`
|
|
||||||
|
|
||||||
// }
|
|
||||||
|
|
||||||
str = `*Cliente*: ${contact['contact.name']}`
|
str = `*Cliente*: ${contact['contact.name']}`
|
||||||
|
|
||||||
let historico = data['historico']
|
let historico = data['historico']
|
||||||
|
@ -89,129 +77,26 @@ export const hit = async (req: Request, res: Response): Promise<Response> => {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('--------------> str: ', str)
|
await statuschange(req, res, contact, `*Olá. Somos a TI Espaçolaser.*\nO chamado da sua loja ${contact['contact.name']} foi fechado pela operadora. Abaixo seguem informações sobre o incidente.\n\n*Situação do chamado na Operadora*\n\n*Incidente:*\n\n ${str}\n\n*Atualizações*:\n\n${str2}`, false)
|
||||||
console.log('--------------> str2: ', str2)
|
|
||||||
|
|
||||||
const botInfo = await BotIsOnQueue('botqueue')
|
|
||||||
|
|
||||||
let ticket = await ShowTicketServiceByContactId(contact['contact.id'])
|
|
||||||
|
|
||||||
if (ticket.id && ticket.status == 'pending') {
|
|
||||||
|
|
||||||
await sendMessageHitMonitoring(`*Olá. Somos a TI Espaçolaser.*\nO chamado da sua loja ${contact['contact.name']} foi fechado pela operadora. Abaixo seguem informações sobre o incidente.\n\n*Situação do chamado na Operadora*\n\n*Incidente:*\n\n ${str}\n\n*Atualizações*:\n\n${str2}`, ticket);
|
|
||||||
|
|
||||||
}
|
|
||||||
else if (!ticket.id) {
|
|
||||||
|
|
||||||
ticket = await CreateTicketService({ contactId: contact['contact.id'], status: 'open', userId: botInfo.userIdBot });
|
|
||||||
|
|
||||||
console.log('botInfo.botQueueId: ', botInfo.botQueueId)
|
|
||||||
|
|
||||||
await UpdateTicketService({ ticketData: { queueId: botInfo.botQueueId }, ticketId: ticket.id });
|
|
||||||
|
|
||||||
await sendMessageHitMonitoring(`*Olá. Somos a TI Espaçolaser.*\nO chamado da sua loja ${contact['contact.name']} foi fechado pela operadora. Abaixo seguem informações sobre o incidente.\n\n*Situação do chamado na Operadora*\n\n*Incidente:*\n\n ${str}\n\n*Atualizações*:\n\n${str2}`, ticket);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|
||||||
console.log(`Error on try sending the monitor message closed: `, error)
|
console.log(`Error on try sending the monitor message closed: `, error)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (req.body['action'] === 'atdatualizou') {
|
else if (req.body['action'] === 'atdatualizou') {
|
||||||
|
|
||||||
console.log('status: atdatualizou --------------> contact: ', contact)
|
console.log('status: atdatualizou --------------> contact: ', contact)
|
||||||
|
|
||||||
if (contact) {
|
await statuschange(req, res, contact, `*Olá. Somos a TI Espaçolaser.*\nAtualização do chamado para sua loja ${contact['contact.name']}. Abaixo seguem informações sobre o incidente para que possam acompanhar.\n\n`)
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
let response = await hitPortalMonitoring(req.body['centro_custo'])
|
|
||||||
|
|
||||||
if (!response || response.length == 0) {
|
|
||||||
console.log('Empty result from hit portal monitoring. Centro_de_custo: ', req.body['centro_custo'])
|
|
||||||
return res.status(200).json({ "message": "Ok" });
|
|
||||||
}
|
|
||||||
|
|
||||||
const botInfo = await BotIsOnQueue('botqueue')
|
|
||||||
|
|
||||||
let ticket = await ShowTicketServiceByContactId(contact['contact.id'])
|
|
||||||
|
|
||||||
if (ticket.id && ticket.status == 'pending') {
|
|
||||||
|
|
||||||
await sendMessageHitMonitoring(`*Olá. Somos a TI Espaçolaser.*\nAtualização do chamado para sua loja ${contact['contact.name']}. Abaixo seguem informações sobre o incidente para que possam acompanhar.\n\n*Situação do chamado na Operadora*\n\n*Incidente*:\n\n ${response[0].header}\n${response[0].body}`, ticket);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (!ticket.id) {
|
else if (req.body['action'] === 'atdabriu') {
|
||||||
|
|
||||||
ticket = await CreateTicketService({ contactId: contact['contact.id'], status: 'open', userId: botInfo.userIdBot });
|
await statuschange(req, res, contact, `*Olá. Somos a TI Espaçolaser.*\nIdentificamos em nossos monitoramentos que há um problema na internet da sua loja ${contact['contact.name']} e já estamos resolvendo. Abaixo seguem informações sobre o incidente para que possam acompanhar.\n\n`)
|
||||||
|
|
||||||
console.log('botInfo.botQueueId: ', botInfo.botQueueId)
|
|
||||||
|
|
||||||
await UpdateTicketService({ ticketData: { queueId: botInfo.botQueueId }, ticketId: ticket.id });
|
|
||||||
|
|
||||||
await sendMessageHitMonitoring(`*Olá. Somos a TI Espaçolaser.*\nAtualização do chamado para sua loja ${contact['contact.name']}. Abaixo seguem informações sobre o incidente para que possam acompanhar.\n\n*Situação do chamado na Operadora*\n\n*Incidente*:\n\n ${response[0].header}\n${response[0].body}`, ticket);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} catch (error) {
|
|
||||||
|
|
||||||
console.log(`Error on try sending the message monitor: `, error)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
console.log('status: atdatabriu --------------> contact: ', contact)
|
|
||||||
|
|
||||||
if (contact) {
|
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
let response = await hitPortalMonitoring(req.body['centro_custo'])
|
|
||||||
|
|
||||||
if (!response || response.length == 0) {
|
|
||||||
console.log('Empty result from hit portal monitoring. Centro_de_custo: ', req.body['centro_custo'])
|
|
||||||
return res.status(200).json({ "message": "Ok" });
|
|
||||||
}
|
|
||||||
|
|
||||||
const botInfo = await BotIsOnQueue('botqueue')
|
|
||||||
|
|
||||||
let ticket = await ShowTicketServiceByContactId(contact['contact.id'])
|
|
||||||
|
|
||||||
if (ticket.id && ticket.status == 'pending') {
|
|
||||||
|
|
||||||
await sendMessageHitMonitoring(`*Olá. Somos a TI Espaçolaser.*\nIdentificamos em nossos monitoramentos que há um problema na internet da sua loja ${contact['contact.name']} e já estamos resolvendo. Abaixo seguem informações sobre o incidente para que possam acompanhar.\n\n*Situação do chamado na Operadora*\n\n*Incidente*:\n\n ${response[0].header}\n${response[0].body}`, ticket);
|
|
||||||
|
|
||||||
}
|
|
||||||
else if (!ticket.id) {
|
|
||||||
|
|
||||||
ticket = await CreateTicketService({ contactId: contact['contact.id'], status: 'open', userId: botInfo.userIdBot });
|
|
||||||
|
|
||||||
console.log('botInfo.botQueueId: ', botInfo.botQueueId)
|
|
||||||
|
|
||||||
await UpdateTicketService({ ticketData: { queueId: botInfo.botQueueId }, ticketId: ticket.id });
|
|
||||||
|
|
||||||
await sendMessageHitMonitoring(`*Olá. Somos a TI Espaçolaser.*\nIdentificamos em nossos monitoramentos que há um problema na internet da sua loja ${contact['contact.name']} e já estamos resolvendo. Abaixo seguem informações sobre o incidente para que possam acompanhar.\n\n*Situação do chamado na Operadora*\n\n*Incidente*:\n\n ${response[0].header}\n${response[0].body}`, ticket);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} catch (error) {
|
|
||||||
|
|
||||||
console.log(`Error on try sending the message monitor: `, error)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -235,3 +120,64 @@ async function sendMessageHitMonitoring(msg: string, ticket: Ticket) {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function statuschange(req: Request, res: Response, contact: any, header_msg: string, request: boolean = true) {
|
||||||
|
try {
|
||||||
|
|
||||||
|
const botInfo = await BotIsOnQueue('botqueue')
|
||||||
|
|
||||||
|
let ticket: any = await ShowTicketServiceByContactId(contact.contactId)
|
||||||
|
|
||||||
|
if (!ticket.dataValues.id) {
|
||||||
|
|
||||||
|
const defaultWhatsapp = await GetDefaultWhatsApp();
|
||||||
|
|
||||||
|
let _contact: any = await Contact.findByPk(contact.contactId)
|
||||||
|
|
||||||
|
let ticket_obj: any = await FindOrCreateTicketServiceBot(
|
||||||
|
_contact,
|
||||||
|
defaultWhatsapp.id!,
|
||||||
|
0,
|
||||||
|
);
|
||||||
|
|
||||||
|
ticket = ticket_obj.ticket
|
||||||
|
}
|
||||||
|
|
||||||
|
let _response: string
|
||||||
|
|
||||||
|
if (request) {
|
||||||
|
let response = await hitPortalMonitoring(req.body['centro_custo'])
|
||||||
|
|
||||||
|
if (!response || response.length == 0) {
|
||||||
|
console.log('Empty result from hit portal monitoring. Centro_de_custo: ', req.body['centro_custo'])
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
_response = `${header_msg} *Situação do chamado na Operadora*\n\n*Incidente*:\n\n ${response[0].header}\n${response[0].body}`
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
_response = header_msg
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ticket.id && ticket.status == 'pending') {
|
||||||
|
|
||||||
|
await sendMessageHitMonitoring(_response, ticket);
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (ticket.id && ticket.userId == botInfo.userIdBot) {
|
||||||
|
|
||||||
|
let queue = await ShowQueueService(botInfo.botQueueId);
|
||||||
|
|
||||||
|
await UpdateTicketService({ ticketData: { queueId: queue.id }, ticketId: ticket.id });
|
||||||
|
|
||||||
|
ticket = await ShowTicketService(ticket.id);
|
||||||
|
|
||||||
|
await sendMessageHitMonitoring(_response, ticket);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
|
||||||
|
console.log(`Error on try sending the message monitor: `, error)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,237 @@
|
||||||
|
import { Request, Response } from "express";
|
||||||
|
import BotIsOnQueue from "../helpers/BotIsOnQueue";
|
||||||
|
import GetDefaultWhatsApp from "../helpers/GetDefaultWhatsApp";
|
||||||
|
import { getIO } from "../libs/socket";
|
||||||
|
import { getWbot } from "../libs/wbot";
|
||||||
|
import Ticket from "../models/Ticket";
|
||||||
|
import ContactByCustomField from "../services/HitServices/ShowContactByCustomFieldValueService";
|
||||||
|
import ShowQueueService from "../services/QueueService/ShowQueueService";
|
||||||
|
import CreateTicketService from "../services/TicketServices/CreateTicketService";
|
||||||
|
import ShowTicketService from "../services/TicketServices/ShowTicketService";
|
||||||
|
import UpdateTicketService from "../services/TicketServices/UpdateTicketService";
|
||||||
|
import SendWhatsAppMessage from "../services/WbotServices/SendWhatsAppMessage";
|
||||||
|
|
||||||
|
import { Op, where, Sequelize } from "sequelize";
|
||||||
|
import ShowTicketServiceByContactId from "../services/TicketServices/ShowTicketServiceByContactId";
|
||||||
|
import hitPortalMonitoring from "../helpers/HitPortalMonitoring";
|
||||||
|
|
||||||
|
|
||||||
|
// type IndexQuery = {
|
||||||
|
// centro_custo: string;
|
||||||
|
// };
|
||||||
|
|
||||||
|
export const hit = async (req: Request, res: Response): Promise<Response> => {
|
||||||
|
|
||||||
|
// const {
|
||||||
|
// centro_custo,
|
||||||
|
// } = req.body as IndexQuery;
|
||||||
|
|
||||||
|
console.log('req.boy: ', req.body)
|
||||||
|
console.log('req.boy: ', req.body['centro_custo'])
|
||||||
|
console.log('ACTION: ', req.body['action'])
|
||||||
|
|
||||||
|
if (req.headers["auth"] === '0424bd59b807674191e7d77572075f33') {
|
||||||
|
|
||||||
|
let contact = null
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
contact = await ContactByCustomField(req.body['centro_custo'])
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
|
||||||
|
console.log('There was an error on try get centro_custo info: ', error)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (req.body['action'] === 'atdfechou') {
|
||||||
|
|
||||||
|
console.log('FECHOU')
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
console.log('atdfechou ----------> THE CONTACT: ', contact)
|
||||||
|
|
||||||
|
if (contact) {
|
||||||
|
|
||||||
|
let data = req.body
|
||||||
|
let str = ''
|
||||||
|
let str2 = ''
|
||||||
|
|
||||||
|
// const exclude = ["action", "centro_custo", "n_chamado_web", "historico"];
|
||||||
|
|
||||||
|
// for (const key in data) {
|
||||||
|
|
||||||
|
// if (exclude.includes(`${key}`)) {
|
||||||
|
// continue
|
||||||
|
// }
|
||||||
|
|
||||||
|
// str += `${key.replace('hostname', 'cliente')}: ${data[key]}\n`
|
||||||
|
|
||||||
|
// }
|
||||||
|
|
||||||
|
str = `*Cliente*: ${contact['contact.name']}`
|
||||||
|
|
||||||
|
let historico = data['historico']
|
||||||
|
|
||||||
|
for (const key in historico) {
|
||||||
|
|
||||||
|
const hist = Object.keys(historico[key]);
|
||||||
|
|
||||||
|
hist.forEach((keys, index) => {
|
||||||
|
|
||||||
|
str2 += `*${keys}*: ${historico[key][keys]}\n`
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
str2 += '\n'
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('--------------> str: ', str)
|
||||||
|
console.log('--------------> str2: ', str2)
|
||||||
|
|
||||||
|
const botInfo = await BotIsOnQueue('botqueue')
|
||||||
|
|
||||||
|
let ticket = await ShowTicketServiceByContactId(contact['contact.id'])
|
||||||
|
|
||||||
|
if (ticket.id && ticket.status == 'pending') {
|
||||||
|
|
||||||
|
await sendMessageHitMonitoring(`*Olá. Somos a TI Espaçolaser.*\nO chamado da sua loja ${contact['contact.name']} foi fechado pela operadora. Abaixo seguem informações sobre o incidente.\n\n*Situação do chamado na Operadora*\n\n*Incidente:*\n\n ${str}\n\n*Atualizações*:\n\n${str2}`, ticket);
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (!ticket.id) {
|
||||||
|
|
||||||
|
ticket = await CreateTicketService({ contactId: contact['contact.id'], status: 'open', userId: botInfo.userIdBot });
|
||||||
|
|
||||||
|
console.log('botInfo.botQueueId: ', botInfo.botQueueId)
|
||||||
|
|
||||||
|
await UpdateTicketService({ ticketData: { queueId: botInfo.botQueueId }, ticketId: ticket.id });
|
||||||
|
|
||||||
|
await sendMessageHitMonitoring(`*Olá. Somos a TI Espaçolaser.*\nO chamado da sua loja ${contact['contact.name']} foi fechado pela operadora. Abaixo seguem informações sobre o incidente.\n\n*Situação do chamado na Operadora*\n\n*Incidente:*\n\n ${str}\n\n*Atualizações*:\n\n${str2}`, ticket);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
|
||||||
|
console.log(`Error on try sending the monitor message closed: `, error)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (req.body['action'] === 'atdatualizou') {
|
||||||
|
|
||||||
|
console.log('status: atdatualizou --------------> contact: ', contact)
|
||||||
|
|
||||||
|
if (contact) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
let response = await hitPortalMonitoring(req.body['centro_custo'])
|
||||||
|
|
||||||
|
if (!response || response.length == 0) {
|
||||||
|
console.log('Empty result from hit portal monitoring. Centro_de_custo: ', req.body['centro_custo'])
|
||||||
|
return res.status(200).json({ "message": "Ok" });
|
||||||
|
}
|
||||||
|
|
||||||
|
const botInfo = await BotIsOnQueue('botqueue')
|
||||||
|
|
||||||
|
let ticket = await ShowTicketServiceByContactId(contact['contact.id'])
|
||||||
|
|
||||||
|
if (ticket.id && ticket.status == 'pending') {
|
||||||
|
|
||||||
|
await sendMessageHitMonitoring(`*Olá. Somos a TI Espaçolaser.*\nAtualização do chamado para sua loja ${contact['contact.name']}. Abaixo seguem informações sobre o incidente para que possam acompanhar.\n\n*Situação do chamado na Operadora*\n\n*Incidente*:\n\n ${response[0].header}\n${response[0].body}`, ticket);
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (!ticket.id) {
|
||||||
|
|
||||||
|
ticket = await CreateTicketService({ contactId: contact['contact.id'], status: 'open', userId: botInfo.userIdBot });
|
||||||
|
|
||||||
|
console.log('botInfo.botQueueId: ', botInfo.botQueueId)
|
||||||
|
|
||||||
|
await UpdateTicketService({ ticketData: { queueId: botInfo.botQueueId }, ticketId: ticket.id });
|
||||||
|
|
||||||
|
await sendMessageHitMonitoring(`*Olá. Somos a TI Espaçolaser.*\nAtualização do chamado para sua loja ${contact['contact.name']}. Abaixo seguem informações sobre o incidente para que possam acompanhar.\n\n*Situação do chamado na Operadora*\n\n*Incidente*:\n\n ${response[0].header}\n${response[0].body}`, ticket);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
|
||||||
|
console.log(`Error on try sending the message monitor: `, error)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
console.log('status: atdatabriu --------------> contact: ', contact)
|
||||||
|
|
||||||
|
if (contact) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
let response = await hitPortalMonitoring(req.body['centro_custo'])
|
||||||
|
|
||||||
|
if (!response || response.length == 0) {
|
||||||
|
console.log('Empty result from hit portal monitoring. Centro_de_custo: ', req.body['centro_custo'])
|
||||||
|
return res.status(200).json({ "message": "Ok" });
|
||||||
|
}
|
||||||
|
|
||||||
|
const botInfo = await BotIsOnQueue('botqueue')
|
||||||
|
|
||||||
|
let ticket = await ShowTicketServiceByContactId(contact['contact.id'])
|
||||||
|
|
||||||
|
if (ticket.id && ticket.status == 'pending') {
|
||||||
|
|
||||||
|
await sendMessageHitMonitoring(`*Olá. Somos a TI Espaçolaser.*\nIdentificamos em nossos monitoramentos que há um problema na internet da sua loja ${contact['contact.name']} e já estamos resolvendo. Abaixo seguem informações sobre o incidente para que possam acompanhar.\n\n*Situação do chamado na Operadora*\n\n*Incidente*:\n\n ${response[0].header}\n${response[0].body}`, ticket);
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (!ticket.id) {
|
||||||
|
|
||||||
|
ticket = await CreateTicketService({ contactId: contact['contact.id'], status: 'open', userId: botInfo.userIdBot });
|
||||||
|
|
||||||
|
console.log('botInfo.botQueueId: ', botInfo.botQueueId)
|
||||||
|
|
||||||
|
await UpdateTicketService({ ticketData: { queueId: botInfo.botQueueId }, ticketId: ticket.id });
|
||||||
|
|
||||||
|
await sendMessageHitMonitoring(`*Olá. Somos a TI Espaçolaser.*\nIdentificamos em nossos monitoramentos que há um problema na internet da sua loja ${contact['contact.name']} e já estamos resolvendo. Abaixo seguem informações sobre o incidente para que possam acompanhar.\n\n*Situação do chamado na Operadora*\n\n*Incidente*:\n\n ${response[0].header}\n${response[0].body}`, ticket);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
|
||||||
|
console.log(`Error on try sending the message monitor: `, error)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
res.status(401).json({ "message": "Token Inválido!" });
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return res.status(200).json({ "message": "Ok" });
|
||||||
|
};
|
||||||
|
|
||||||
|
async function sendMessageHitMonitoring(msg: string, ticket: Ticket) {
|
||||||
|
|
||||||
|
if (msg && msg.length > 0) {
|
||||||
|
|
||||||
|
console.log('MESSAGE WILL BE SENT!')
|
||||||
|
|
||||||
|
await SendWhatsAppMessage({ body: msg, ticket });
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
import { subSeconds } from "date-fns";
|
||||||
|
import Message from "../models/Message";
|
||||||
|
|
||||||
|
import { Op, Sequelize } from "sequelize";
|
||||||
|
|
||||||
|
const mostRepeatedPhrase = async (ticketId: number | string, fromMe: boolean = false) => {
|
||||||
|
|
||||||
|
let res: any = { body: '', occurrences: 0 }
|
||||||
|
|
||||||
|
try {
|
||||||
|
const mostRepeatedPhrase: any = await Message.findOne({
|
||||||
|
where: {
|
||||||
|
ticketId: ticketId,
|
||||||
|
fromMe: fromMe ? fromMe : 0,
|
||||||
|
body: {
|
||||||
|
[Op.notRegexp]: '^[0-9]+$',
|
||||||
|
},
|
||||||
|
updatedAt: {
|
||||||
|
[Op.between]: [+subSeconds(new Date(), 150), +new Date()],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
attributes: [
|
||||||
|
'body',
|
||||||
|
[Sequelize.fn('COUNT', Sequelize.col('body')), 'occurrences'],
|
||||||
|
],
|
||||||
|
|
||||||
|
group: ['body'],
|
||||||
|
order: [[Sequelize.literal('occurrences'), 'DESC']],
|
||||||
|
limit: 1,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (mostRepeatedPhrase) {
|
||||||
|
|
||||||
|
const { body, occurrences } = mostRepeatedPhrase.get();
|
||||||
|
|
||||||
|
console.log(`The most repeated phrase is "${body}" with ${occurrences} occurrences.`);
|
||||||
|
|
||||||
|
const isNumber = /^\d+$/.test(body.trim());
|
||||||
|
|
||||||
|
if (!isNumber) {
|
||||||
|
|
||||||
|
return { body, occurrences }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} else {
|
||||||
|
console.log('No phrases found.');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log('error on MostRepeatedPhrase: ', error)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return { body: '', occurrences: 0 }
|
||||||
|
}
|
||||||
|
|
||||||
|
export default mostRepeatedPhrase;
|
|
@ -0,0 +1,26 @@
|
||||||
|
import Whatsapp from "../models/Whatsapp";
|
||||||
|
import ShowQueuesByUser from "../services/UserServices/ShowQueuesByUser";
|
||||||
|
import ShowWhatsAppService from "../services/WhatsappService/ShowWhatsAppService";
|
||||||
|
|
||||||
|
async function whatsappQueueMatchingUserQueue(userId: number, whatsapp: Whatsapp, userProfile: string = 'user') {
|
||||||
|
|
||||||
|
const userQueues = await ShowQueuesByUser({ profile: userProfile, userId: userId });
|
||||||
|
|
||||||
|
if (!userQueues || userQueues && userQueues.length == 0) return
|
||||||
|
|
||||||
|
// console.log('-----> userQueues: ', userQueues);
|
||||||
|
|
||||||
|
let whats: any = await ShowWhatsAppService(whatsapp.id);
|
||||||
|
|
||||||
|
if (!whats.queues || whats.queues && whats.queues.length == 0) return
|
||||||
|
|
||||||
|
const whatsappQueues = whats.queues.map((e: any) => e.dataValues.name);
|
||||||
|
|
||||||
|
// console.log('-----> whatsappQueues: ', whatsappQueues);
|
||||||
|
|
||||||
|
const matchingQueue = userQueues.find(queue => whatsappQueues.includes(queue.name));
|
||||||
|
|
||||||
|
return matchingQueue
|
||||||
|
}
|
||||||
|
|
||||||
|
export default whatsappQueueMatchingUserQueue
|
|
@ -1,6 +1,6 @@
|
||||||
import express from "express";
|
import express from "express";
|
||||||
|
|
||||||
import * as HitController from "../controllers/HitController";
|
import * as HitController from "../controllers/HitController"
|
||||||
|
|
||||||
const hitRoutes = express.Router();
|
const hitRoutes = express.Router();
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,8 @@ import { splitDateTime } from "../../helpers/SplitDateTime";
|
||||||
import TicketEmiterSumOpenClosedByUser from "../../helpers/OnlineReporEmiterInfoByUser";
|
import TicketEmiterSumOpenClosedByUser from "../../helpers/OnlineReporEmiterInfoByUser";
|
||||||
|
|
||||||
import { createOrUpdateTicketCache } from '../../helpers/TicketCache'
|
import { createOrUpdateTicketCache } from '../../helpers/TicketCache'
|
||||||
|
import User from "../../models/User";
|
||||||
|
import whatsappQueueMatchingUserQueue from "../../helpers/whatsappQueueMatchingUserQueue";
|
||||||
let flatten = require('flat')
|
let flatten = require('flat')
|
||||||
|
|
||||||
|
|
||||||
|
@ -39,6 +41,12 @@ const CreateTicketService = async ({
|
||||||
|
|
||||||
const defaultWhatsapp = await GetDefaultWhatsApp(userId);
|
const defaultWhatsapp = await GetDefaultWhatsApp(userId);
|
||||||
|
|
||||||
|
if (!queueId) {
|
||||||
|
const user = await User.findByPk(userId, { raw: true, })
|
||||||
|
const matchingQueue = await whatsappQueueMatchingUserQueue(userId, defaultWhatsapp, user?.profile);
|
||||||
|
queueId = matchingQueue ? matchingQueue.queueId : undefined
|
||||||
|
}
|
||||||
|
|
||||||
await CheckContactOpenTickets(contactId);
|
await CheckContactOpenTickets(contactId);
|
||||||
|
|
||||||
const { isGroup } = await ShowContactService(contactId);
|
const { isGroup } = await ShowContactService(contactId);
|
||||||
|
|
|
@ -0,0 +1,145 @@
|
||||||
|
import { subHours, subMinutes, subSeconds } from "date-fns";
|
||||||
|
import { Op } from "sequelize";
|
||||||
|
import BotIsOnQueue from "../../helpers/BotIsOnQueue";
|
||||||
|
import Contact from "../../models/Contact";
|
||||||
|
import Ticket from "../../models/Ticket";
|
||||||
|
import ShowWhatsAppService from "../WhatsappService/ShowWhatsAppService";
|
||||||
|
import ShowTicketService from "./ShowTicketService";
|
||||||
|
import AppError from "../../errors/AppError";
|
||||||
|
import { userInfo } from "os";
|
||||||
|
import ShowQueueService from "../QueueService/ShowQueueService";
|
||||||
|
import UpdateTicketService from "./UpdateTicketService";
|
||||||
|
|
||||||
|
|
||||||
|
const FindOrCreateTicketServiceBot = async (
|
||||||
|
contact: Contact,
|
||||||
|
whatsappId: number,
|
||||||
|
unreadMessages: number,
|
||||||
|
groupContact?: Contact
|
||||||
|
): Promise<any> => {
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
let ticket = await Ticket.findOne({
|
||||||
|
where: {
|
||||||
|
status: {
|
||||||
|
[Op.or]: ["open", "pending", "queueChoice"]
|
||||||
|
},
|
||||||
|
contactId: groupContact ? groupContact.id : contact.id
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const { queues, greetingMessage } = await ShowWhatsAppService(whatsappId);
|
||||||
|
|
||||||
|
|
||||||
|
//Habilitar esse caso queira usar o bot
|
||||||
|
const botInfo = await BotIsOnQueue('botqueue')
|
||||||
|
// const botInfo = { isOnQueue: false }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (ticket) {
|
||||||
|
await ticket.update({ unreadMessages });
|
||||||
|
}
|
||||||
|
|
||||||
|
// if (!ticket && groupContact) {
|
||||||
|
// ticket = await Ticket.findOne({
|
||||||
|
// where: {
|
||||||
|
// contactId: groupContact.id
|
||||||
|
// },
|
||||||
|
// order: [["updatedAt", "DESC"]]
|
||||||
|
// });
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// if (ticket) {
|
||||||
|
|
||||||
|
// await ticket.update({
|
||||||
|
// status: "pending",
|
||||||
|
// userId: null,
|
||||||
|
// unreadMessages
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
if (!ticket && !groupContact) {
|
||||||
|
|
||||||
|
console.log('BOT CREATING OR REOPENING THE TICKET')
|
||||||
|
|
||||||
|
ticket = await Ticket.findOne({
|
||||||
|
where: {
|
||||||
|
contactId: contact.id,
|
||||||
|
userId: botInfo.userIdBot
|
||||||
|
},
|
||||||
|
order: [["updatedAt", "DESC"]]
|
||||||
|
});
|
||||||
|
|
||||||
|
if (ticket) {
|
||||||
|
|
||||||
|
await ticket.update({
|
||||||
|
status: "open",
|
||||||
|
userId: botInfo.userIdBot,
|
||||||
|
unreadMessages
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('lxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
|
||||||
|
|
||||||
|
await dialogFlowStartContext(contact, ticket, botInfo);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let created = false
|
||||||
|
|
||||||
|
if (!ticket) {
|
||||||
|
|
||||||
|
created = true
|
||||||
|
|
||||||
|
let status = "open"
|
||||||
|
|
||||||
|
if (queues.length > 1 && !botInfo.isOnQueue) {
|
||||||
|
status = "queueChoice"
|
||||||
|
}
|
||||||
|
|
||||||
|
ticket = await Ticket.create({
|
||||||
|
contactId: groupContact ? groupContact.id : contact.id,
|
||||||
|
status: status,
|
||||||
|
userId: botInfo.userIdBot,
|
||||||
|
isGroup: !!groupContact,
|
||||||
|
unreadMessages,
|
||||||
|
whatsappId
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy')
|
||||||
|
|
||||||
|
await dialogFlowStartContext(contact, ticket, botInfo);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ticket = await ShowTicketService(ticket.id);
|
||||||
|
|
||||||
|
return { ticket, created };
|
||||||
|
|
||||||
|
} catch (error: any) {
|
||||||
|
console.error('===> Error on FindOrCreateTicketServiceBot.ts file: \n', error)
|
||||||
|
throw new AppError(error.message);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default FindOrCreateTicketServiceBot;
|
||||||
|
|
||||||
|
async function dialogFlowStartContext(contact: Contact, ticket: Ticket, botInfo: any) {
|
||||||
|
|
||||||
|
let msg: any = { type: 'chat', from: `${contact.number}@c.us`, body: '0' };
|
||||||
|
|
||||||
|
let queue = await ShowQueueService(botInfo.botQueueId);
|
||||||
|
|
||||||
|
await UpdateTicketService({
|
||||||
|
ticketData: { queueId: queue.id },
|
||||||
|
ticketId: ticket.id
|
||||||
|
});
|
||||||
|
|
||||||
|
ticket = await ShowTicketService(ticket.id);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ const ShowTicketServiceByContactId = async (contactId: string | number): Promise
|
||||||
|
|
||||||
const ticket = await Ticket.findOne({
|
const ticket = await Ticket.findOne({
|
||||||
|
|
||||||
where:{ contactId: contactId, [Op.or]: [ { status: 'open' }, { status: 'pending' }] },
|
where: { contactId, [Op.or]: [{ status: 'open' }, { status: 'pending' }] },
|
||||||
|
|
||||||
include: [
|
include: [
|
||||||
{
|
{
|
||||||
|
|
|
@ -72,6 +72,8 @@ import { getWhatsappIds, setWhatsappId } from "../../helpers/WhatsappIdMultiSess
|
||||||
import SendWhatsAppMedia from "./SendWhatsAppMedia";
|
import SendWhatsAppMedia from "./SendWhatsAppMedia";
|
||||||
import AppError from "../../errors/AppError";
|
import AppError from "../../errors/AppError";
|
||||||
import { setMessageAsRead } from "../../helpers/SetMessageAsRead";
|
import { setMessageAsRead } from "../../helpers/SetMessageAsRead";
|
||||||
|
import FindOrCreateTicketServiceBot from "../TicketServices/FindOrCreateTicketServiceBot";
|
||||||
|
import mostRepeatedPhrase from "../../helpers/MostRepeatedPhrase";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -748,14 +750,15 @@ const verifyQueue = async (
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
|
const repet: any = await mostRepeatedPhrase(ticket.id)
|
||||||
|
|
||||||
|
if (repet.occurrences > 4) {
|
||||||
//test del transfere o atendimento se entrar na ura infinita
|
//test del transfere o atendimento se entrar na ura infinita
|
||||||
let ticket_message = await ShowTicketMessage(ticket.id, false);
|
|
||||||
if (ticket_message.length > 10) {
|
|
||||||
|
|
||||||
await UpdateTicketService({ ticketData: { status: 'pending', queueId: queues[0].id }, ticketId: ticket.id });
|
await UpdateTicketService({ ticketData: { status: 'pending', queueId: queues[0].id }, ticketId: ticket.id });
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else {
|
else {
|
||||||
|
|
||||||
let options = "";
|
let options = "";
|
||||||
|
@ -1056,13 +1059,44 @@ const handleMessage = async (
|
||||||
|
|
||||||
if (unreadMessages === 0 && whatsapp.farewellMessage && whatsapp.farewellMessage === msg.body) return;
|
if (unreadMessages === 0 && whatsapp.farewellMessage && whatsapp.farewellMessage === msg.body) return;
|
||||||
|
|
||||||
const ticket = await FindOrCreateTicketService(
|
let ticket
|
||||||
|
|
||||||
|
const _botInfo = await BotIsOnQueue('botqueue')
|
||||||
|
|
||||||
|
if (_botInfo.isOnQueue) {
|
||||||
|
|
||||||
|
let ticket_obj: any = await FindOrCreateTicketServiceBot(
|
||||||
contact,
|
contact,
|
||||||
wbot.id!,
|
wbot.id!,
|
||||||
unreadMessages,
|
unreadMessages,
|
||||||
// groupContact
|
// groupContact
|
||||||
);
|
);
|
||||||
|
|
||||||
|
ticket = ticket_obj.ticket
|
||||||
|
|
||||||
|
if (ticket_obj.created) {
|
||||||
|
|
||||||
|
let queue = await ShowQueueService(_botInfo.botQueueId);
|
||||||
|
|
||||||
|
await UpdateTicketService({
|
||||||
|
ticketData: { queueId: queue.id },
|
||||||
|
ticketId: ticket.id
|
||||||
|
});
|
||||||
|
|
||||||
|
ticket = await ShowTicketService(ticket.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ticket = await FindOrCreateTicketService(
|
||||||
|
contact,
|
||||||
|
wbot.id!,
|
||||||
|
unreadMessages,
|
||||||
|
// groupContact
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
console.log('okkkkkkkkkkkkkkkkkk 1')
|
console.log('okkkkkkkkkkkkkkkkkk 1')
|
||||||
|
|
||||||
|
|
||||||
|
@ -1124,6 +1158,21 @@ const handleMessage = async (
|
||||||
|
|
||||||
console.log('okkkkkkkkkkkkkkkkkk 4')
|
console.log('okkkkkkkkkkkkkkkkkk 4')
|
||||||
|
|
||||||
|
const repet: any = await mostRepeatedPhrase(ticket.id)
|
||||||
|
|
||||||
|
console.log('repet.occurrences: ', repet.occurrences)
|
||||||
|
|
||||||
|
if (repet.occurrences > 4) {
|
||||||
|
|
||||||
|
await transferTicket(0, wbot, ticket, contact)
|
||||||
|
|
||||||
|
await SendWhatsAppMessage({
|
||||||
|
body: `Seu atendimento foi transferido para um agente!\n\nPara voltar ao menu principal digite *0*
|
||||||
|
`, ticket, number: `${contact.number}@c.us`
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
// TEST DEL
|
// TEST DEL
|
||||||
let test: any = await ShowTicketMessage(ticket.id, false, true, 5);
|
let test: any = await ShowTicketMessage(ticket.id, false, true, 5);
|
||||||
|
|
||||||
|
@ -1161,6 +1210,7 @@ const handleMessage = async (
|
||||||
console.log('okkkkkkkkkkkkkkkkkk 6')
|
console.log('okkkkkkkkkkkkkkkkkk 6')
|
||||||
|
|
||||||
await sendDialogflowAwswer(wbot, ticket, msg, contact, chat);
|
await sendDialogflowAwswer(wbot, ticket, msg, contact, chat);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (botInfo.isOnQueue && !msg.fromMe && msg.body == '0' && ticket.status == 'pending' && ticket.queueId) {
|
else if (botInfo.isOnQueue && !msg.fromMe && msg.body == '0' && ticket.status == 'pending' && ticket.queueId) {
|
||||||
|
|
Loading…
Reference in New Issue