Codificação para quando houver mais de uma fila na conexão. O atendente só vai interagir com o usuário quando o mesmo escolher uma fila

pull/1/head
adriano 2022-04-28 17:57:57 -03:00
parent ab7464f776
commit 02b36b6bf7
7 changed files with 104 additions and 35 deletions

View File

@ -0,0 +1,24 @@
const fsPromises = require("fs/promises");
const fs = require('fs')
import ShowWhatsAppService from "../services/WhatsappService/ShowWhatsAppService";
import { Client } from "whatsapp-web.js";
interface Session extends Client { id?: number;}
const _queuesOutBot =async (wbot:Session, botId: string | number) => {
const { queues, greetingMessage } = await ShowWhatsAppService(wbot.id!);
const indexQueue = queues.findIndex((q) => q.id == botId)
if(indexQueue != -1){
queues.splice(indexQueue, 1)
}
return {queues, greetingMessage}
}
export default _queuesOutBot;

View File

@ -41,16 +41,28 @@ const CreateMessageService = async ({messageData}: Request): Promise<Message> =>
//console.log('SERVER SIDE MESSAGE: ', message) //console.log('SERVER SIDE MESSAGE: ', message)
const io = getIO(); // console.log('>>>>>>>>>>>>>>>>>>>>>> TICKET STATUS: ',message.ticket.status)
io.to(message.ticketId.toString())
.to(message.ticket.status) //test del
.to("notification") // const ticketInfo = await Ticket.findByPk(message.ticket.id)
.emit("appMessage", { // console.log('&&&&&&&&&&&&&&&&& TICKET INFO queueId: ', ticketInfo?.queueId)
action: "create", //
message,
ticket: message.ticket, if(message.ticket.status!='queueChoice'){
contact: message.ticket.contact
}); const io = getIO();
io.to(message.ticketId.toString())
.to(message.ticket.status)
.to("notification")
.emit("appMessage", {
action: "create",
message,
ticket: message.ticket,
contact: message.ticket.contact
});
}
return message; return message;
}; };

View File

@ -1,11 +1,14 @@
import { subHours, subMinutes, subSeconds } from "date-fns"; import { subHours, subMinutes, subSeconds } from "date-fns";
import { Op } from "sequelize"; import { Op } from "sequelize";
import BotIsOnQueue from "../../helpers/BotIsOnQueue";
import Contact from "../../models/Contact"; import Contact from "../../models/Contact";
import Ticket from "../../models/Ticket"; import Ticket from "../../models/Ticket";
import ShowWhatsAppService from "../WhatsappService/ShowWhatsAppService";
import ShowTicketService from "./ShowTicketService"; import ShowTicketService from "./ShowTicketService";
const FindOrCreateTicketService = async ( const FindOrCreateTicketService = async (
contact: Contact, contact: Contact,
whatsappId: number, whatsappId: number,
@ -15,12 +18,20 @@ const FindOrCreateTicketService = async (
let ticket = await Ticket.findOne({ let ticket = await Ticket.findOne({
where: { where: {
status: { status: {
[Op.or]: ["open", "pending"] [Op.or]: ["open", "pending", "queueChoice"]
}, },
contactId: groupContact ? groupContact.id : contact.id contactId: groupContact ? groupContact.id : contact.id
} }
}); });
const { queues, greetingMessage } = await ShowWhatsAppService(whatsappId);
const botInfo = await BotIsOnQueue('botqueue')
if (ticket) { if (ticket) {
await ticket.update({ unreadMessages }); await ticket.update({ unreadMessages });
} }
@ -33,7 +44,10 @@ const FindOrCreateTicketService = async (
order: [["updatedAt", "DESC"]] order: [["updatedAt", "DESC"]]
}); });
if (ticket) { if (ticket) {
await ticket.update({ await ticket.update({
status: "pending", status: "pending",
userId: null, userId: null,
@ -61,6 +75,7 @@ const FindOrCreateTicketService = async (
}); });
if (ticket) { if (ticket) {
await ticket.update({ await ticket.update({
status: "pending", status: "pending",
userId: null, userId: null,
@ -71,9 +86,15 @@ const FindOrCreateTicketService = async (
if (!ticket) { if (!ticket) {
let status = "pending"
if(queues.length > 1 && !botInfo.isOnQueue){
status = "queueChoice"
}
ticket = await Ticket.create({ ticket = await Ticket.create({
contactId: groupContact ? groupContact.id : contact.id, contactId: groupContact ? groupContact.id : contact.id,
status: "pending", status: status,
isGroup: !!groupContact, isGroup: !!groupContact,
unreadMessages, unreadMessages,
whatsappId whatsappId

View File

@ -201,6 +201,14 @@ const verifyQueue = async (
if (choosenQueue) { if (choosenQueue) {
// Atualizando o status do ticket para mostrar notificação para o atendente da fila escolhida pelo usuário. De queueChoice para pending
if(queues.length > 1 && !botInfo.isOnQueue){
await ticket.update({status: "pending" });
}
//
await UpdateTicketService({ await UpdateTicketService({
ticketData: { queueId: choosenQueue.id }, ticketData: { queueId: choosenQueue.id },
ticketId: ticket.id ticketId: ticket.id
@ -230,8 +238,6 @@ const verifyQueue = async (
body = `\u200e${choosenQueue.greetingMessage}`; body = `\u200e${choosenQueue.greetingMessage}`;
} }
// const body = `\u200e${choosenQueue.greetingMessage}`;
const sentMessage = await wbot.sendMessage(`${contact.number}@c.us`, body); const sentMessage = await wbot.sendMessage(`${contact.number}@c.us`, body);
await verifyMessage(sentMessage, ticket, contact); await verifyMessage(sentMessage, ticket, contact);

View File

@ -11,7 +11,7 @@ const ShowWhatsAppService = async (id: string | number): Promise<Whatsapp> => {
attributes: ["id", "name", "color", "greetingMessage"] attributes: ["id", "name", "color", "greetingMessage"]
} }
], ],
order: [["queues", "name", "ASC"]] order: [["queues", "id", "ASC"]]
}); });
if (!whatsapp) { if (!whatsapp) {

View File

@ -6,13 +6,13 @@ import openSocket from "socket.io-client";
import useSound from "use-sound"; import useSound from "use-sound";
import Popover from "@material-ui/core/Popover"; import Popover from "@material-ui/core/Popover";
import IconButton from "@material-ui/core/IconButton"; //import IconButton from "@material-ui/core/IconButton";
import List from "@material-ui/core/List"; import List from "@material-ui/core/List";
import ListItem from "@material-ui/core/ListItem"; import ListItem from "@material-ui/core/ListItem";
import ListItemText from "@material-ui/core/ListItemText"; import ListItemText from "@material-ui/core/ListItemText";
import { makeStyles } from "@material-ui/core/styles"; import { makeStyles } from "@material-ui/core/styles";
import Badge from "@material-ui/core/Badge"; //import Badge from "@material-ui/core/Badge";
import ChatIcon from "@material-ui/icons/Chat"; //import ChatIcon from "@material-ui/icons/Chat";
import TicketListItem from "../TicketListItem"; import TicketListItem from "../TicketListItem";
import { i18n } from "../../translate/i18n"; import { i18n } from "../../translate/i18n";
@ -113,6 +113,11 @@ const NotificationsPopOver = () => {
!data.message.read && !data.message.read &&
(data.ticket.userId === user?.id || !data.ticket.userId) (data.ticket.userId === user?.id || !data.ticket.userId)
) { ) {
console.log(`data.ticket.userId: ${data.ticket.userId }\n
data.ticket.status: ${data.ticket.status}\n
data.ticket.userId: ${data.ticket.userId }`)
setNotifications(prevState => { setNotifications(prevState => {
const ticketIndex = prevState.findIndex(t => t.id === data.ticket.id); const ticketIndex = prevState.findIndex(t => t.id === data.ticket.id);
if (ticketIndex !== -1) { if (ticketIndex !== -1) {
@ -126,9 +131,10 @@ const NotificationsPopOver = () => {
(data.message.ticketId === ticketIdRef.current && (data.message.ticketId === ticketIdRef.current &&
document.visibilityState === "visible") || document.visibilityState === "visible") ||
(data.ticket.userId && data.ticket.userId !== user?.id) || (data.ticket.userId && data.ticket.userId !== user?.id) ||
data.ticket.isGroup; data.ticket.isGroup || !data.ticket.userId;
if (shouldNotNotificate) return;
if (shouldNotNotificate) return;
handleNotifications(data); handleNotifications(data);
} }
@ -174,9 +180,9 @@ const NotificationsPopOver = () => {
soundAlertRef.current(); soundAlertRef.current();
}; };
const handleClick = () => { // const handleClick = () => {
setIsOpen(prevState => !prevState); // setIsOpen(prevState => !prevState);
}; // };
const handleClickAway = () => { const handleClickAway = () => {
setIsOpen(false); setIsOpen(false);
@ -188,7 +194,7 @@ const NotificationsPopOver = () => {
return ( return (
<> <>
<IconButton {/* <IconButton
onClick={handleClick} onClick={handleClick}
// buttonRef={anchorEl} // buttonRef={anchorEl}
ref={anchorEl} ref={anchorEl}
@ -198,7 +204,7 @@ const NotificationsPopOver = () => {
<Badge badgeContent={notifications.length} color="secondary"> <Badge badgeContent={notifications.length} color="secondary">
<ChatIcon /> <ChatIcon />
</Badge> </Badge>
</IconButton> </IconButton> */}
<Popover <Popover
disableScrollLock disableScrollLock
open={isOpen} open={isOpen}