diff --git a/backend/src/controllers/TicketController.ts b/backend/src/controllers/TicketController.ts index 57d62d3..da1399d 100644 --- a/backend/src/controllers/TicketController.ts +++ b/backend/src/controllers/TicketController.ts @@ -303,7 +303,8 @@ export const remoteTicketCreation = async ( id: ticket.id, createdAt: ticket.createdAt, updatedAt: ticket.updatedAt, - whatsappId: ticket.whatsappId + whatsappId: ticket.whatsappId, + status: ticket.status }) ); @@ -624,6 +625,26 @@ export const update = async ( await setMessageAsRead(ticket); } + if (ticketData.status == "open" || ticketData.status == "pending") { + let ticketRemote = await get({ + key: `remote:ticketId:${ticketId}` + }); + + if (ticketRemote) { + ticketRemote = JSON.parse(ticketRemote); + + ticketRemote = { + ...ticketRemote, + ...{ + status: ticketData.status == "open" ? "open" : "pending", + updatedAt: ticket.updatedAt + } + }; + + set(`remote:ticketId:${ticketId}`, JSON.stringify(ticketRemote)); + } + } + if (ticketData.userId) { const dateToday = splitDateTime( new Date(format(new Date(), "yyyy-MM-dd HH:mm:ss", { locale: ptBR })) diff --git a/backend/src/database/migrations/20240507184134-add-identifier-to-users.ts b/backend/src/database/migrations/20240507184134-add-identifier-to-users.ts new file mode 100644 index 0000000..7a783dc --- /dev/null +++ b/backend/src/database/migrations/20240507184134-add-identifier-to-users.ts @@ -0,0 +1,14 @@ +import { QueryInterface, DataTypes } from "sequelize"; + +module.exports = { + up: (queryInterface: QueryInterface) => { + return queryInterface.addColumn("Users", "identifier", { + type: DataTypes.STRING, + allowNull: true + }); + }, + + down: (queryInterface: QueryInterface) => { + return queryInterface.removeColumn("Users", "identifier"); + } +}; \ No newline at end of file diff --git a/backend/src/helpers/AutoRemoteTickets.ts b/backend/src/helpers/AutoRemoteTickets.ts index 965e76b..8d3d1e4 100644 --- a/backend/src/helpers/AutoRemoteTickets.ts +++ b/backend/src/helpers/AutoRemoteTickets.ts @@ -2,6 +2,7 @@ import { intervalToDuration } from "date-fns"; import { del, get, set } from "./RedisClient"; import { getIO } from "../libs/socket"; import controllByNumber from "./controllByNumber"; +import UpdateTicketService from "../services/TicketServices/UpdateTicketService"; let timer: any; @@ -11,6 +12,64 @@ const AutoRemoteTickets = async () => { if (!obj?.tickets) return; + // console.log("remote tickets: ", obj?.tickets); + + for (const ticket of obj.tickets) { + if (!ticket.includes("open") || ticket.includes("messageDateTime")) + continue; + + const regex = /"updatedAt":"([^"]+)"/; + let match = ticket.match(regex); + + const updatedAt = match ? match[1] : null; + + console.log("updatedAt: ", updatedAt); + + let timeDiff: any = intervalToDuration({ + start: new Date(updatedAt), + end: new Date() + }); + + console.log("----------> idle time timeDiff: ", timeDiff); + + if (timeDiff.minutes > 2) { + match = ticket.match(/"id":(\d+)/); + let ticketId = match ? match[1] : null; + console.log("ticketId: ", ticketId); + + ticketId = JSON.parse(ticketId); + + let ticketRemote = await get({ + key: `remote:ticketId:${ticketId}` + }); + + if (ticketRemote) { + ticketRemote = JSON.parse(ticketRemote); + + ticketRemote = { + ...ticketRemote, + ...{ status: "pending" } + }; + + set(`remote:ticketId:${ticketId}`, JSON.stringify(ticketRemote)); + + await UpdateTicketService({ + ticketData: { + status: "pending", + userId: null + }, + ticketId + }); + + const io = getIO(); + io.emit("remoteTickesControllIdleOpen", { + action: "update", + ticketId + }); + } + } + } + for (const ticket of obj.tickets) { if (!ticket.includes("messageDateTime")) continue; diff --git a/backend/src/models/User.ts b/backend/src/models/User.ts index a7e3d47..1be891d 100644 --- a/backend/src/models/User.ts +++ b/backend/src/models/User.ts @@ -51,6 +51,9 @@ class User extends Model { @Column transferToOtherQueues: boolean; + @Column + identifier: string; + @Default("admin") @Column profile: string; diff --git a/backend/src/services/TicketServices/UpdateTicketService.ts b/backend/src/services/TicketServices/UpdateTicketService.ts index f744270..8745737 100644 --- a/backend/src/services/TicketServices/UpdateTicketService.ts +++ b/backend/src/services/TicketServices/UpdateTicketService.ts @@ -15,7 +15,7 @@ var flatten = require("flat"); interface TicketData { status?: string; - userId?: number; + userId?: number | null; queueId?: number; statusChatEnd?: string; statusChatEndId?: number; diff --git a/frontend/src/components/NewTicketModal/index.js b/frontend/src/components/NewTicketModal/index.js index 4ff67f7..0851294 100644 --- a/frontend/src/components/NewTicketModal/index.js +++ b/frontend/src/components/NewTicketModal/index.js @@ -45,7 +45,7 @@ const NewTicketModal = ({ modalOpen, onClose }) => { const fetchContacts = async () => { try { const { data } = await api.get("contacts", { - params: { searchParam }, + params: { searchParam, userId: user.id }, }); setOptions(data.contacts); setLoading(false); diff --git a/frontend/src/components/Ticket/index.js b/frontend/src/components/Ticket/index.js index 9eab965..dbf78bf 100644 --- a/frontend/src/components/Ticket/index.js +++ b/frontend/src/components/Ticket/index.js @@ -158,6 +158,25 @@ const Ticket = () => { } }) + socket.on("remoteTickesControllIdleOpen", (data) => { + if (data.action === "update") { + let url_ticketId + try { + + let url_split = window.location.href.split('tickets') + + url_ticketId = url_split[url_split.length - 1].match(/\d+/)[0] + + if (url_ticketId && +url_ticketId === data.ticketId) { + history.push("/tickets") + } + + } catch (error) { + console.log('error on try do the send seen: ', error) + } + } + }) + return () => { socket.disconnect() }