Modificação para callcenter da hit enviar abertura, atualização e finalização de chamado.

pull/20/head
adriano 2023-06-19 20:35:48 -03:00
parent be12d318fd
commit ac15c97861
6 changed files with 118 additions and 229 deletions

View File

@ -14,44 +14,84 @@ import SendWhatsAppMessage from "../services/WbotServices/SendWhatsAppMessage";
import { Op, where, Sequelize } from "sequelize";
import ShowTicketServiceByContactId from "../services/TicketServices/ShowTicketServiceByContactId";
import hitPortalMonitoring from "../helpers/HitPortalMonitoring";
import { verifyContact } from "../services/WbotServices/wbotMessageListener";
import CheckIsValidContact from "../services/WbotServices/CheckIsValidContact";
import Contact from "../models/Contact";
import GetProfilePicUrl from "../services/WbotServices/GetProfilePicUrl";
import CreateContactService from "../services/ContactServices/CreateContactService";
// type IndexQuery = {
// centro_custo: string;
// cod_web: string;
// };
export const hit = async (req: Request, res: Response): Promise<Response> => {
// const {
// centro_custo,
// cod_web,
// } = req.body as IndexQuery;
console.log('req.boy: ', req.body)
console.log('req.boy: ', req.body['centro_custo'])
console.log('ACTION: ', req.body['action'])
console.log("req.body['cod_web']: ", req.body['cod_web'])
console.log("req.body['action']: ", req.body['action'])
console.log("req.body['phone']: ", req.body['phone'])
console.log("req.body['name']: ", req.body['name'])
if (req.headers["auth"] === '0424bd59b807674191e7d77572075f33') {
let contact = null
let phone = req.body['phone']
let name = req.body['name']
try {
if (!phone) return res.status(200).json({ "message": "Ok" });
contact = await ContactByCustomField(req.body['centro_custo'])
const regex = /^55/;
} catch (error) {
phone = phone.match(/\d+/g).join('');
console.log('There was an error on try get centro_custo info: ', error)
if (!regex.test(phone)) {
phone = '55' + phone;
}
if (phone.length < 7) return res.status(200).json({ "message": "Ok" });
const validNumber = await CheckIsValidContact(phone);
if (!validNumber) {
return res.status(200).json({ "message": "Ok" });
}
// let contact = await Contact.findOne({ where: { number: validNumber } });
let contact = await Contact.findOne({ where: { number: '5517988325936' } });
if (!contact) {
const profilePicUrl = await GetProfilePicUrl(validNumber);
contact = await CreateContactService({
name: name || phone,
number: validNumber,
profilePicUrl: profilePicUrl,
});
const io = getIO();
io.emit("contact", {
action: "create",
contact
});
}
if (req.body['action'] === 'atdfechou') {
console.log('FECHOU')
try {
console.log('atdfechou ----------> THE CONTACT: ', contact)
// console.log('atdfechou ----------> THE CONTACT: ', contact)
if (contact) {
@ -59,19 +99,7 @@ export const hit = async (req: Request, res: Response): Promise<Response> => {
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']}`
str = `*Cliente*: ${contact.name}`
let historico = data['historico']
@ -94,22 +122,22 @@ export const hit = async (req: Request, res: Response): Promise<Response> => {
const botInfo = await BotIsOnQueue('botqueue')
let ticket = await ShowTicketServiceByContactId(contact['contact.id'])
let ticket = await ShowTicketServiceByContactId(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);
await sendMessageHitMonitoring(`*Olá. Somos o grupo HIT.*\nO chamado da sua loja ${contact.name} foi fechado. Abaixo seguem informações sobre o incidente.\n\n*Situação do chamado*\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 });
ticket = await CreateTicketService({ contactId: 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);
await sendMessageHitMonitoring(`*Olá. Somos o grupo HIT.*\nO chamado da sua loja ${contact.name} foi fechado pela operadora. Abaixo seguem informações sobre o incidente.\n\n*Situação do chamado*\n\n*Incidente:*\n\n ${str}\n\n*Atualizações*:\n\n${str2}`, ticket);
}
@ -124,37 +152,37 @@ export const hit = async (req: Request, res: Response): Promise<Response> => {
}
else if (req.body['action'] === 'atdatualizou') {
console.log('status: atdatualizou --------------> contact: ', contact)
// console.log('status: atdatualizou --------------> contact: ', contact)
if (contact) {
try {
let response = await hitPortalMonitoring(req.body['centro_custo'])
let response = await hitPortalMonitoring(req.body['cod_web'])
if (!response || response.length == 0) {
console.log('Empty result from hit portal monitoring. Centro_de_custo: ', req.body['centro_custo'])
console.log('Empty result from hit portal monitoring. Centro_de_custo: ', req.body['cod_web'])
return res.status(200).json({ "message": "Ok" });
}
const botInfo = await BotIsOnQueue('botqueue')
let ticket = await ShowTicketServiceByContactId(contact['contact.id'])
let ticket = await ShowTicketServiceByContactId(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);
await sendMessageHitMonitoring(`*Olá. Somos o grupo HIT.*\nAtualização do chamado para sua loja ${contact.name}. Abaixo seguem informações sobre o incidente para que possam acompanhar.\n\n*Situação do chamado*\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 });
ticket = await CreateTicketService({ contactId: 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);
await sendMessageHitMonitoring(`*Olá. Somos o grupo HIT.*\nAtualização do chamado para sua loja ${contact.name}. Abaixo seguem informações sobre o incidente para que possam acompanhar.\n\n*Situação do chamado*\n\n*Incidente*:\n\n ${response[0].header}\n${response[0].body}`, ticket);
}
@ -176,31 +204,31 @@ export const hit = async (req: Request, res: Response): Promise<Response> => {
try {
let response = await hitPortalMonitoring(req.body['centro_custo'])
let response = await hitPortalMonitoring(req.body['cod_web'])
if (!response || response.length == 0) {
console.log('Empty result from hit portal monitoring. Centro_de_custo: ', req.body['centro_custo'])
console.log('Empty result from hit portal monitoring. Centro_de_custo: ', req.body['cod_web'])
return res.status(200).json({ "message": "Ok" });
}
const botInfo = await BotIsOnQueue('botqueue')
let ticket = await ShowTicketServiceByContactId(contact['contact.id'])
let ticket = await ShowTicketServiceByContactId(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);
await sendMessageHitMonitoring(`*Olá. Somos o grupo HIT.*\nIdentificamos em nossos monitoramentos que há um problema na internet da sua loja ${contact.name} e já estamos resolvendo. Abaixo seguem informações sobre o incidente para que possam acompanhar.\n\n*Situação do chamado*\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 });
ticket = await CreateTicketService({ contactId: 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);
await sendMessageHitMonitoring(`*Olá. Somos o grupo HIT.*\nIdentificamos em nossos monitoramentos que há um problema na internet da sua loja ${contact.name} e já estamos resolvendo. Abaixo seguem informações sobre o incidente para que possam acompanhar.\n\n*Situação do chamado*\n\n*Incidente*:\n\n ${response[0].header}\n${response[0].body}`, ticket);
}
@ -217,11 +245,12 @@ export const hit = async (req: Request, res: Response): Promise<Response> => {
}
else {
res.status(401).json({ "message": "Token Inválido!" });
return res.status(401).json({ "message": "Token Inválido!" });
}
return res.status(200).json({ "message": "Ok" });
};
async function sendMessageHitMonitoring(msg: string, ticket: Ticket) {

View File

@ -51,6 +51,7 @@ import TicketEmiterSumOpenClosedByUser from "../helpers/OnlineReporEmiterInfoByU
import CountTicketService from "../services/TicketServices/CountTicketService";
import CountTicketsByUserQueue from "../services/UserServices/CountTicketsByUserQueue";
import ShowUserService from "../services/UserServices/ShowUserService";
import BotIsOnQueue from "../helpers/BotIsOnQueue";
export const index = async (req: Request, res: Response): Promise<Response> => {
@ -93,8 +94,16 @@ export const store = async (req: Request, res: Response): Promise<Response> => {
const { contactId, status, userId }: TicketData = req.body;
// test del
let ticket = await Ticket.findOne({ where: { contactId, status: 'queueChoice' } });
let ticket
const botInfo = await BotIsOnQueue('botqueue')
if (botInfo) {
ticket = await Ticket.findOne({ where: { contactId, status: 'open', userId: botInfo.userIdBot } });
}
else {
ticket = await Ticket.findOne({ where: { contactId, status: 'queueChoice' } });
}
if (ticket) {
await UpdateTicketService({ ticketData: { status: 'open', userId: userId, }, ticketId: ticket.id });

View File

@ -31,7 +31,7 @@ const endPointQuery = async (url: string, method: string, param: string = '') =>
'auth': '0424bd59b807674191e7d77572075f33',
'jsonrpc': '2.0',
'method': 'chamado.ematendimento',
'params[ccusto]': param,
'params[codweb]': param,
id: '101'
}, {
httpsAgent,

View File

@ -4,6 +4,6 @@ import * as HitController from "../controllers/HitController";
const hitRoutes = express.Router();
hitRoutes.post("/espacolaser/incidente", HitController.hit);
hitRoutes.post("/omnihit/incidente", HitController.hit);
export default hitRoutes;

View File

@ -341,181 +341,32 @@ async function sendDelayedMessages(wbot: Session, ticket: Ticket, contact: Conta
// NEW
await SendWhatsAppMessage({ body: msgAction.msgBody, ticket, number: `${contact.number}@c.us` })
// const url = 'http://177.107.193.124:8095/labs/zabbix-frontend/api/api.php/99383'
// const url = 'https://sos.espacolaser.com.br/api/whatsapps/ticket/R32656'
let endPointResponse = await endPointQuery(msgAction.actions[1], 'get')
let aux = msgAction.actions[1].split('/')
console.log('Object.entries(endPointResponse.data).length: ', Object.entries(endPointResponse.data).length)
// console.log('endPointResonse.status: ',typeof(endPointResponse.status))
if (endPointResponse && endPointResponse.status == 200 && Object.entries(endPointResponse.data).length > 0) {
// endPointResponse.data.categoria = 'ELOS'
// endPointResponse.data.categoria = 'INFRAESTRUTURA'
// endPointResponse.data.subcategoria = 'INTERNET'
// endPointResponse.data.terceiro_nivel = 'QUEDA TOTAL'
console.log('-------------> endPointResponse.data.categoria: ', endPointResponse.data.categoria)
if (endPointResponse.data.categoria != 'INFRAESTRUTURA' && endPointResponse.data.categoria != 'ELOS') {
botSendMessage(ticket, contact, wbot, `A categorização desse chamado não se enquadra no atendimento deste canal!\n\n _Digite *0* para voltar ao menu principal._`)
return
}
const response = Object.entries(endPointResponse.data);
let msg_endpoint_response = ''
let msg_endpoint2: any = []
let centro_de_custo = ''
for (let i = 0; i < response.length; i++) {
if (['id_solicitante', 'centro_custo_departamento', 'departamento_do_formulario', 'centro_de_custo_do_departamento_do_formulario'].includes(response[i][0]))
continue
msg_endpoint_response += `*${response[i][0]}*: ${String(response[i][1]).replace(/(<([^>]+)>)/gi, "")}\n`
}
if (endPointResponse.data.centro_custo_departamento && endPointResponse.data.centro_custo_departamento.trim().length > 0 && (endPointResponse.data.categoria == 'INFRAESTRUTURA' && endPointResponse.data.subcategoria == 'INTERNET')) {
centro_de_custo = endPointResponse.data.centro_custo_departamento
msg_endpoint2 = await queryEndPointHit(centro_de_custo)
}
const itsm_response = async (message1: string = '', message2: string = '') => {
// OLD
// const msg = await wbot.sendMessage(`${contact.number}@c.us`, `*Situação do chamado ${extractCallCode(msgAction.msgBody)}:*${message1}${msg_endpoint_response}${message2}\n_Digite *0* para voltar ao menu principal._`);
// await verifyMessage(msg, ticket, contact);
// await new Promise(f => setTimeout(f, 1000));
// NEW
await SendWhatsAppMessage({ body: `*Situação do chamado ${extractCallCode(msgAction.msgBody)}:*${message1}${msg_endpoint_response}${message2}\n_Digite *0* para voltar ao menu principal._`, ticket, number: `${contact.number}@c.us` })
}
const sendMessageBot = async (message1: string = '', message2: string = '') => {
// OLD
// const msg = await wbot.sendMessage(`${contact.number}@c.us`, `${message1}${message2}`);
// await verifyMessage(msg, ticket, contact);
// await new Promise(f => setTimeout(f, 1000));
// NEW
await SendWhatsAppMessage({ body: `${message1}${message2}`, ticket, number: `${contact.number}@c.us` })
}
if (body.search('dialog_options') != -1) {
let msgAction = botMsgActions(body)
let index = msgAction.actions.findIndex((i) => i == 'dialog_options')
if (index != -1) {
let dialog_options = msgAction.actions[index + 1]
if (dialog_options == '3' && endPointResponse.data.categoria == 'ELOS') {
index = msgAction.actions.findIndex((i) => i == 'queue_transfer')
if (index != -1) {
await itsm_response('\n\n')
await monitoramento_response2(msg_endpoint2, wbot, contact, ticket, centro_de_custo, '\n\n', false)
botSendMessage(ticket, contact, wbot, `Estamos direcionando seu atendimento para o Suporte. Em breve você será atendido por um de nossos atendentes!\n\nPara voltar ao atendimento *automatizado* e sair da fila de atendimento *humano* digite *0*`)
await transferTicket(+msgAction.actions[index + 1], wbot, ticket, contact)
}
}
}
}
else if (
(endPointResponse.data.categoria == 'INFRAESTRUTURA' && endPointResponse.data.subcategoria == 'INTERNET' &&
endPointResponse.data.terceiro_nivel == 'QUEDA TOTAL') ||
(endPointResponse.data.categoria == 'INFRAESTRUTURA' && endPointResponse.data.subcategoria == 'INTERNET' &&
endPointResponse.data.terceiro_nivel == 'PROBLEMA DE LENTIDÃO') ||
(endPointResponse.data.categoria == 'ELOS' && endPointResponse.data.subcategoria == 'VENDAS') ||
(endPointResponse.data.categoria == 'ELOS' && endPointResponse.data.subcategoria == 'INDISPONIBILIDADE')
) {
await itsm_response('\n\n')
if (endPointResponse.data.categoria == 'INFRAESTRUTURA' && endPointResponse.data.subcategoria == 'INTERNET' && centro_de_custo) {
await monitoramento_response2(msg_endpoint2, wbot, contact, ticket, centro_de_custo, '\n\n _Digite *0* para voltar ao menu principal._', true)
}
await sendMessageBot('Se deseja solicitar atendimento de urgência, digite *1*!', '\n\n _Digite *0* para voltar ao menu principal._')
return
}
else {
//await sendMessageBot('A categorização desse chamado não se enquadra no atendimento deste canal!', '\n\n _Digite *0* para voltar ao menu principal._')
await itsm_response('\n\n')
if (endPointResponse.data.categoria == 'INFRAESTRUTURA' && endPointResponse.data.subcategoria == 'INTERNET' && centro_de_custo) {
await monitoramento_response2(msg_endpoint2, wbot, contact, ticket, centro_de_custo, '\n\n _Digite *0* para voltar ao menu principal._', true)
}
await sendMessageBot('Acompanhe a evolução do atendimento através do SOS')
return
}
// else if ((endPointResponse.data.categoria == 'INFRAESTRUTURA' || endPointResponse.data.subcategoria == 'INTERNET' ||
// endPointResponse.data.terceiro_nivel == 'QUEDA TOTAL' || endPointResponse.data.terceiro_nivel == 'PROBLEMA DE LENTIDÃO') ||
// (endPointResponse.data.terceiro_nivel == 'PROBLEMA DE LENTIDÃO' || endPointResponse.data.terceiro_nivel == 'ABERTO')) {
// await itsm_response('', `\n Estamos direcionando seu atendimento para o Suporte. Em breve você será atendido por um de nossos atendentes!`)
// await monitoramento_response(msg_endpoint2)
// await transferTicket(0, wbot, ticket, contact)
// }
// else {
// await itsm_response('', `\n Por favor, aguarde atendimento e acompanhe sua solicitação no SOS.`)
// await monitoramento_response(msg_endpoint2)
// }
let cod_web
if (aux && aux.length > 0) {
cod_web = aux[aux.length - 1]
}
else if (endPointResponse && endPointResponse.status == 200 && Object.entries(endPointResponse.data).length == 0) {
botSendMessage(ticket, contact, wbot, `Não existe nenhum chamado para consulta com esse número!\n _Digite *0* para voltar ao menu principal._`)
return
// let url = msgAction.actions[1].replace(/\.php.*/, '.php')
let msg_endpoint2 = await queryEndPointHit(String(cod_web))
if (msg_endpoint2 && msg_endpoint2.length == 0) {
botSendMessage(ticket, contact, wbot, `Não existe nenhum chamado para essa consulta!\n _Digite *0* para voltar ao menu principal._`)
}
else if (endPointResponse && endPointResponse.status == 500) {
botSendMessage(ticket, contact, wbot, `Houve um erro ao realizar a consulta no sos espacolaser!\n _Digite *0* para voltar ao menu principal._`)
return
else if (msg_endpoint2 && msg_endpoint2.length > 0) {
await monitoramento_response2(msg_endpoint2, wbot, contact, ticket, cod_web, '\n\n', false)
}
else {
botSendMessage(ticket, contact, wbot, `Desculpe, nao foi possível realizar a consulta!\n _Digite *0* para voltar ao menu principal._`)
return
botSendMessage(ticket, contact, wbot, `Houve um erro ao realizar a consulta!\n _Digite *0* para voltar ao menu principal._`)
}
} else if (msgAction.actions[0] == 'queue_transfer') {
console.log('>>>>>>>>>>>>>>> msgAction: ', msgAction, ' | msgAction.actions[1]: ', msgAction.actions[1])
@ -551,7 +402,7 @@ async function sendDelayedMessages(wbot: Session, ticket: Ticket, contact: Conta
// await new Promise(f => setTimeout(f, 1000));
// // NEW
await SendWhatsAppMessage({ body: msgAction.msgBody, ticket, number: `${contact.number}@c.us` })
await SendWhatsAppMessage({ body: msgAction.msgBody, ticket, number: `${contact.number}@c.us` })
await botSendMedia(ticket, contact, wbot, sourcePath, msgAction.actions[1])
@ -796,7 +647,7 @@ const transferTicket = async (queueIndex: number, wbot: Session, ticket: Ticket,
const queues = queuesWhatsGreetingMessage.queues
// console.log('queues ---> ', queues)
console.log('queues ---> ', queues)
await botTransferTicket(queues[queueIndex], ticket, contact, wbot)
@ -1215,7 +1066,7 @@ const handleMsgAck = async (msg_id: any, ack: any) => {
}
await messageToUpdate.update({ ack });
console.log('ACK messageToUpdate: ', JSON.parse(JSON.stringify(messageToUpdate)))
// console.log('ACK messageToUpdate: ', JSON.parse(JSON.stringify(messageToUpdate)))
io.to(messageToUpdate.ticketId.toString()).emit("appMessage", {
action: "update",
@ -1243,4 +1094,4 @@ const wbotMessageListener = (wbot: Session): void => {
});
};
export { wbotMessageListener, handleMessage, handleMsgAck, lst };
export { wbotMessageListener, handleMessage, handleMsgAck, lst, verifyContact };