2022-03-23 02:59:01 +00:00
|
|
|
import { subHours, subMinutes, subSeconds } from "date-fns";
|
2022-01-06 01:26:15 +00:00
|
|
|
import { Op } from "sequelize";
|
2022-04-28 20:57:57 +00:00
|
|
|
import BotIsOnQueue from "../../helpers/BotIsOnQueue";
|
2022-01-06 01:26:15 +00:00
|
|
|
import Contact from "../../models/Contact";
|
|
|
|
import Ticket from "../../models/Ticket";
|
2022-04-28 20:57:57 +00:00
|
|
|
import ShowWhatsAppService from "../WhatsappService/ShowWhatsAppService";
|
2023-04-20 18:48:42 +00:00
|
|
|
import ShowTicketService from "./ShowTicketService";
|
|
|
|
import AppError from "../../errors/AppError";
|
2023-07-26 20:24:10 +00:00
|
|
|
import ListWhatsAppsNumber from "../WhatsappService/ListWhatsAppsNumber";
|
2023-07-28 12:25:13 +00:00
|
|
|
import { getSettingValue } from "../../helpers/WhaticketSettings";
|
2022-01-18 13:47:19 +00:00
|
|
|
|
2022-01-06 01:26:15 +00:00
|
|
|
const FindOrCreateTicketService = async (
|
|
|
|
contact: Contact,
|
|
|
|
whatsappId: number,
|
|
|
|
unreadMessages: number,
|
2024-02-21 20:47:23 +00:00
|
|
|
groupContact?: Contact,
|
2024-04-15 11:12:29 +00:00
|
|
|
queueId?: number | string,
|
|
|
|
isRemote?: boolean
|
2022-01-06 01:26:15 +00:00
|
|
|
): Promise<Ticket> => {
|
2023-04-20 18:48:42 +00:00
|
|
|
try {
|
2023-07-26 20:24:10 +00:00
|
|
|
let ticket;
|
2022-10-25 14:16:36 +00:00
|
|
|
|
2023-07-28 12:25:13 +00:00
|
|
|
if (getSettingValue("oneContactChatWithManyWhats")?.value == "enabled") {
|
|
|
|
let whats = await ListWhatsAppsNumber(whatsappId);
|
|
|
|
|
2023-07-26 20:24:10 +00:00
|
|
|
ticket = await Ticket.findOne({
|
|
|
|
where: {
|
|
|
|
status: {
|
|
|
|
[Op.or]: ["open", "pending", "queueChoice"]
|
|
|
|
},
|
2023-07-28 12:25:13 +00:00
|
|
|
contactId: groupContact ? groupContact.id : contact.id,
|
|
|
|
whatsappId: { [Op.in]: whats.whatsapps.map((w: any) => w.id) }
|
2023-07-26 20:24:10 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
ticket = await Ticket.findOne({
|
|
|
|
where: {
|
|
|
|
status: {
|
|
|
|
[Op.or]: ["open", "pending", "queueChoice"]
|
|
|
|
},
|
2023-07-28 12:25:13 +00:00
|
|
|
contactId: groupContact ? groupContact.id : contact.id
|
2023-07-26 20:24:10 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2022-10-25 14:16:36 +00:00
|
|
|
|
2024-02-21 20:47:23 +00:00
|
|
|
const { queues, greetingMessage, phoneNumberId } =
|
|
|
|
await ShowWhatsAppService(whatsappId);
|
2022-04-28 20:57:57 +00:00
|
|
|
|
2023-07-26 20:24:10 +00:00
|
|
|
const botInfo = { isOnQueue: false };
|
2022-04-28 20:57:57 +00:00
|
|
|
|
2022-10-25 14:16:36 +00:00
|
|
|
if (ticket) {
|
2023-04-20 18:48:42 +00:00
|
|
|
await ticket.update({ unreadMessages });
|
|
|
|
}
|
2022-04-28 20:57:57 +00:00
|
|
|
|
2023-04-20 18:48:42 +00:00
|
|
|
if (!ticket && groupContact) {
|
|
|
|
ticket = await Ticket.findOne({
|
|
|
|
where: {
|
|
|
|
contactId: groupContact.id
|
|
|
|
},
|
|
|
|
order: [["updatedAt", "DESC"]]
|
2022-01-06 01:26:15 +00:00
|
|
|
});
|
2023-04-20 18:48:42 +00:00
|
|
|
|
2024-06-13 20:50:30 +00:00
|
|
|
if (ticket) {
|
2023-04-20 18:48:42 +00:00
|
|
|
await ticket.update({
|
|
|
|
status: "pending",
|
|
|
|
userId: null,
|
2024-06-13 20:50:30 +00:00
|
|
|
queueId: null,
|
2023-04-20 18:48:42 +00:00
|
|
|
unreadMessages
|
|
|
|
});
|
|
|
|
}
|
2022-01-06 01:26:15 +00:00
|
|
|
}
|
|
|
|
|
2023-04-20 18:48:42 +00:00
|
|
|
if (!ticket && !groupContact) {
|
|
|
|
ticket = await Ticket.findOne({
|
|
|
|
where: {
|
|
|
|
updatedAt: {
|
|
|
|
// Tempo osioso para a ura responder thuanny
|
|
|
|
//[Op.between]: [+subMinutes(new Date(), 30), +new Date()]
|
2022-04-20 19:01:58 +00:00
|
|
|
|
2023-04-20 18:48:42 +00:00
|
|
|
// Sub seconds
|
|
|
|
[Op.between]: [+subSeconds(new Date(), 0), +new Date()]
|
|
|
|
},
|
|
|
|
contactId: contact.id
|
2022-01-06 01:26:15 +00:00
|
|
|
},
|
2023-04-20 18:48:42 +00:00
|
|
|
order: [["updatedAt", "DESC"]]
|
|
|
|
});
|
2022-01-06 01:26:15 +00:00
|
|
|
|
2023-04-20 18:48:42 +00:00
|
|
|
if (ticket) {
|
|
|
|
await ticket.update({
|
|
|
|
status: "pending",
|
|
|
|
userId: null,
|
|
|
|
unreadMessages
|
|
|
|
});
|
|
|
|
}
|
2022-01-06 01:26:15 +00:00
|
|
|
}
|
|
|
|
|
2023-04-20 18:48:42 +00:00
|
|
|
if (!ticket) {
|
2023-07-26 20:24:10 +00:00
|
|
|
let status = "pending";
|
2022-04-28 20:57:57 +00:00
|
|
|
|
2024-06-13 20:50:30 +00:00
|
|
|
if (
|
|
|
|
queues.length > 1 &&
|
|
|
|
!botInfo.isOnQueue &&
|
|
|
|
!queueId &&
|
|
|
|
!groupContact
|
|
|
|
) {
|
2023-07-26 20:24:10 +00:00
|
|
|
status = "queueChoice";
|
2023-04-20 18:48:42 +00:00
|
|
|
}
|
2022-10-25 14:16:36 +00:00
|
|
|
|
2023-04-20 18:48:42 +00:00
|
|
|
ticket = await Ticket.create({
|
|
|
|
contactId: groupContact ? groupContact.id : contact.id,
|
|
|
|
status: status,
|
|
|
|
isGroup: !!groupContact,
|
2024-02-21 20:47:23 +00:00
|
|
|
queueId,
|
2023-04-20 18:48:42 +00:00
|
|
|
unreadMessages,
|
2023-09-08 19:50:51 +00:00
|
|
|
whatsappId,
|
2024-04-15 11:12:29 +00:00
|
|
|
phoneNumberId,
|
|
|
|
isRemote
|
2023-04-20 18:48:42 +00:00
|
|
|
});
|
|
|
|
}
|
2022-01-06 01:26:15 +00:00
|
|
|
|
2023-04-20 18:48:42 +00:00
|
|
|
ticket = await ShowTicketService(ticket.id);
|
2022-01-06 01:26:15 +00:00
|
|
|
|
2023-04-20 18:48:42 +00:00
|
|
|
return ticket;
|
|
|
|
} catch (error: any) {
|
2023-07-26 20:24:10 +00:00
|
|
|
console.error("===> Error on FindOrCreateTicketService.ts file: \n", error);
|
2023-04-20 18:48:42 +00:00
|
|
|
throw new AppError(error.message);
|
|
|
|
}
|
2022-01-06 01:26:15 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
export default FindOrCreateTicketService;
|