281 lines
9.4 KiB
TypeScript
281 lines
9.4 KiB
TypeScript
|
import { Sequelize } from "sequelize";
|
||
|
|
||
|
const dbConfig = require("../../config/database");
|
||
|
const sequelize = new Sequelize(dbConfig);
|
||
|
const { QueryTypes } = require("sequelize");
|
||
|
|
||
|
import { splitDateTime } from "../../helpers/SplitDateTime";
|
||
|
import format from "date-fns/format";
|
||
|
import ptBR from "date-fns/locale/pt-BR";
|
||
|
import Whatsapp from "../../models/Whatsapp";
|
||
|
import { number } from "yup";
|
||
|
import ShowWhatsAppService from "../WhatsappService/ShowWhatsAppService";
|
||
|
|
||
|
interface Request {
|
||
|
startDate: string | number;
|
||
|
endDate: string;
|
||
|
queue?: boolean;
|
||
|
}
|
||
|
|
||
|
const ReportByNumberQueueService = async ({
|
||
|
startDate,
|
||
|
endDate,
|
||
|
queue = false
|
||
|
}: Request): Promise<any[]> => {
|
||
|
let reportServiceData: any[] = [];
|
||
|
|
||
|
const whatsapps = await Whatsapp.findAll();
|
||
|
|
||
|
if (!queue) {
|
||
|
for (const whatsapp of whatsapps) {
|
||
|
const { id, name, number } = whatsapp;
|
||
|
|
||
|
if (
|
||
|
!number ||
|
||
|
reportServiceData.findIndex((w: any) => w?.number == number) != -1
|
||
|
)
|
||
|
continue;
|
||
|
|
||
|
console.log("NUMBER: ", number);
|
||
|
|
||
|
// CHAT STARTED BY AGENT
|
||
|
const startedByAgent: any = await sequelize.query(
|
||
|
`SELECT COUNT(DISTINCT t.id) AS ticket_count
|
||
|
FROM Tickets t
|
||
|
JOIN Messages m ON t.id = m.ticketId
|
||
|
JOIN Whatsapps w ON t.whatsappId = w.id
|
||
|
JOIN Queues q ON q.id = t.queueId
|
||
|
WHERE DATE(m.createdAt) BETWEEN '${startDate} 00:00:00.000000' AND '${endDate} 23:59:59.999999'
|
||
|
AND m.createdAt = (SELECT MIN(createdAt) FROM Messages WHERE ticketId = t.id)
|
||
|
AND m.fromAgent = 1
|
||
|
AND w.number = ${number};`,
|
||
|
{ type: QueryTypes.SELECT }
|
||
|
);
|
||
|
|
||
|
// CHAT STARTED BY CLIENT
|
||
|
const startedByClient: any = await sequelize.query(
|
||
|
`SELECT COUNT(DISTINCT t.id) AS ticket_count
|
||
|
FROM Tickets t
|
||
|
JOIN Messages m ON t.id = m.ticketId
|
||
|
JOIN Whatsapps w ON t.whatsappId = w.id
|
||
|
JOIN Queues q ON q.id = t.queueId
|
||
|
WHERE DATE(m.createdAt) BETWEEN '${startDate} 00:00:00.000000' AND '${endDate} 23:59:59.999999'
|
||
|
AND m.createdAt = (SELECT MIN(createdAt) FROM Messages WHERE ticketId = t.id)
|
||
|
AND m.fromMe = 0
|
||
|
AND w.number = ${number};`,
|
||
|
{ type: QueryTypes.SELECT }
|
||
|
);
|
||
|
|
||
|
// CHAT CLOSED
|
||
|
const closedChat: any = await sequelize.query(
|
||
|
`SELECT COUNT(DISTINCT t.id) AS ticket_count
|
||
|
FROM Tickets t
|
||
|
JOIN Messages m ON t.id = m.ticketId
|
||
|
JOIN Whatsapps w ON t.whatsappId = w.id
|
||
|
JOIN Queues q ON q.id = t.queueId
|
||
|
WHERE DATE(m.createdAt) BETWEEN '${startDate} 00:00:00.000000' AND '${endDate} 23:59:59.999999'
|
||
|
AND t.status = 'closed'
|
||
|
AND w.number = ${number};`,
|
||
|
{ type: QueryTypes.SELECT }
|
||
|
);
|
||
|
|
||
|
// CHAT AVG WAINTING TIME
|
||
|
const avgChatWaitingTime: any = await sequelize.query(
|
||
|
`SELECT SEC_TO_TIME(
|
||
|
AVG(
|
||
|
TIMESTAMPDIFF(
|
||
|
SECOND,
|
||
|
(
|
||
|
SELECT createdAt
|
||
|
FROM Messages
|
||
|
WHERE ticketId = m.ticketId
|
||
|
AND fromMe = 0
|
||
|
ORDER BY createdAt ASC
|
||
|
LIMIT 1
|
||
|
),
|
||
|
(
|
||
|
SELECT createdAt
|
||
|
FROM Messages
|
||
|
WHERE ticketId = m.ticketId
|
||
|
AND fromAgent = 1
|
||
|
ORDER BY createdAt ASC
|
||
|
LIMIT 1
|
||
|
)
|
||
|
)
|
||
|
)
|
||
|
) AS AVG_AWAITING_TIME
|
||
|
FROM Tickets t
|
||
|
JOIN Messages m ON t.id = m.ticketId
|
||
|
JOIN Whatsapps w ON t.whatsappId = w.id
|
||
|
JOIN Queues q ON q.id = t.queueId
|
||
|
WHERE DATE(m.createdAt) BETWEEN '${startDate} 00:00:00.000000' AND '${endDate} 23:59:59.999999'
|
||
|
AND m.createdAt = (SELECT MIN(createdAt) FROM Messages WHERE ticketId = t.id)
|
||
|
AND m.fromMe = 0
|
||
|
-- AND q.id = 2
|
||
|
AND w.number = ${number}
|
||
|
AND (t.status = 'open' OR t.status = 'closed');`,
|
||
|
{ type: QueryTypes.SELECT }
|
||
|
);
|
||
|
|
||
|
// CHAT PENDING
|
||
|
const pendingChat: any = await sequelize.query(
|
||
|
`SELECT COUNT(DISTINCT t.id) AS ticket_count
|
||
|
FROM Tickets t
|
||
|
JOIN Messages m ON t.id = m.ticketId
|
||
|
JOIN Whatsapps w ON t.whatsappId = w.id
|
||
|
JOIN Queues q ON q.id = t.queueId
|
||
|
WHERE DATE(m.createdAt) BETWEEN '${startDate} 00:00:00.000000' AND '${endDate} 23:59:59.999999'
|
||
|
AND t.status = 'pending'
|
||
|
AND w.number = ${number};`,
|
||
|
|
||
|
{ type: QueryTypes.SELECT }
|
||
|
);
|
||
|
|
||
|
reportServiceData.push({
|
||
|
id,
|
||
|
name,
|
||
|
number,
|
||
|
startedByAgent: startedByAgent[0]?.ticket_count,
|
||
|
startedByClient: startedByClient[0]?.ticket_count,
|
||
|
closedChat: closedChat[0]?.ticket_count,
|
||
|
avgChatWaitingTime: avgChatWaitingTime[0]?.AVG_AWAITING_TIME
|
||
|
? avgChatWaitingTime[0]?.AVG_AWAITING_TIME
|
||
|
: 0,
|
||
|
pendingChat: pendingChat[0]?.ticket_count
|
||
|
});
|
||
|
}
|
||
|
} else {
|
||
|
for (const whatsapp of whatsapps) {
|
||
|
const { id, name, number } = whatsapp;
|
||
|
|
||
|
if (
|
||
|
!number ||
|
||
|
reportServiceData.findIndex((w: any) => w?.number == number) != -1
|
||
|
)
|
||
|
continue;
|
||
|
|
||
|
const data = await ShowWhatsAppService(id);
|
||
|
|
||
|
const queues: any = data.queues.map((q: any) => {
|
||
|
const { id, name, color } = q;
|
||
|
return { id, name, color };
|
||
|
});
|
||
|
|
||
|
console.log("NUMBER 2: ", number);
|
||
|
|
||
|
for (const q of queues) {
|
||
|
// CHAT STARTED BY AGENT
|
||
|
const startedByAgent: any = await sequelize.query(
|
||
|
`SELECT COUNT(DISTINCT t.id) AS ticket_count
|
||
|
FROM Tickets t
|
||
|
JOIN Messages m ON t.id = m.ticketId
|
||
|
JOIN Whatsapps w ON t.whatsappId = w.id
|
||
|
JOIN Queues q ON q.id = t.queueId
|
||
|
WHERE DATE(m.createdAt) BETWEEN '${startDate} 00:00:00.000000' AND '${endDate} 23:59:59.999999'
|
||
|
AND m.createdAt = (SELECT MIN(createdAt) FROM Messages WHERE ticketId = t.id)
|
||
|
AND m.fromAgent = 1
|
||
|
AND q.id = ${q.id};`,
|
||
|
{ type: QueryTypes.SELECT }
|
||
|
);
|
||
|
|
||
|
// CHAT STARTED BY CLIENT
|
||
|
const startedByClient: any = await sequelize.query(
|
||
|
`SELECT COUNT(DISTINCT t.id) AS ticket_count
|
||
|
FROM Tickets t
|
||
|
JOIN Messages m ON t.id = m.ticketId
|
||
|
JOIN Whatsapps w ON t.whatsappId = w.id
|
||
|
JOIN Queues q ON q.id = t.queueId
|
||
|
WHERE DATE(m.createdAt) BETWEEN '${startDate} 00:00:00.000000' AND '${endDate} 23:59:59.999999'
|
||
|
AND m.createdAt = (SELECT MIN(createdAt) FROM Messages WHERE ticketId = t.id)
|
||
|
AND m.fromMe = 0
|
||
|
AND q.id = ${q.id};`,
|
||
|
{ type: QueryTypes.SELECT }
|
||
|
);
|
||
|
|
||
|
// CHAT CLOSED
|
||
|
const closedChat: any = await sequelize.query(
|
||
|
`SELECT COUNT(DISTINCT t.id) AS ticket_count
|
||
|
FROM Tickets t
|
||
|
JOIN Messages m ON t.id = m.ticketId
|
||
|
JOIN Whatsapps w ON t.whatsappId = w.id
|
||
|
JOIN Queues q ON q.id = t.queueId
|
||
|
WHERE DATE(m.createdAt) BETWEEN '${startDate} 00:00:00.000000' AND '${endDate} 23:59:59.999999'
|
||
|
AND t.status = 'closed'
|
||
|
AND q.id = ${q.id};`,
|
||
|
{ type: QueryTypes.SELECT }
|
||
|
);
|
||
|
|
||
|
// CHAT AVG WAINTING TIME
|
||
|
const avgChatWaitingTime: any = await sequelize.query(
|
||
|
`SELECT SEC_TO_TIME(
|
||
|
AVG(
|
||
|
TIMESTAMPDIFF(
|
||
|
SECOND,
|
||
|
(
|
||
|
SELECT createdAt
|
||
|
FROM Messages
|
||
|
WHERE ticketId = m.ticketId
|
||
|
AND fromMe = 0
|
||
|
ORDER BY createdAt ASC
|
||
|
LIMIT 1
|
||
|
),
|
||
|
(
|
||
|
SELECT createdAt
|
||
|
FROM Messages
|
||
|
WHERE ticketId = m.ticketId
|
||
|
AND fromAgent = 1
|
||
|
ORDER BY createdAt ASC
|
||
|
LIMIT 1
|
||
|
)
|
||
|
)
|
||
|
)
|
||
|
) AS AVG_AWAITING_TIME
|
||
|
FROM Tickets t
|
||
|
JOIN Messages m ON t.id = m.ticketId
|
||
|
JOIN Whatsapps w ON t.whatsappId = w.id
|
||
|
JOIN Queues q ON q.id = t.queueId
|
||
|
WHERE DATE(m.createdAt) BETWEEN '${startDate} 00:00:00.000000' AND '${endDate} 23:59:59.999999'
|
||
|
AND m.createdAt = (SELECT MIN(createdAt) FROM Messages WHERE ticketId = t.id)
|
||
|
AND m.fromMe = 0
|
||
|
AND q.id = ${q.id}
|
||
|
AND (t.status = 'open' OR t.status = 'closed');`,
|
||
|
{ type: QueryTypes.SELECT }
|
||
|
);
|
||
|
|
||
|
// CHAT PENDING
|
||
|
const pendingChat: any = await sequelize.query(
|
||
|
`SELECT COUNT(DISTINCT t.id) AS ticket_count
|
||
|
FROM Tickets t
|
||
|
JOIN Messages m ON t.id = m.ticketId
|
||
|
JOIN Whatsapps w ON t.whatsappId = w.id
|
||
|
JOIN Queues q ON q.id = t.queueId
|
||
|
WHERE DATE(m.createdAt) BETWEEN '${startDate} 00:00:00.000000' AND '${endDate} 23:59:59.999999'
|
||
|
AND t.status = 'pending'
|
||
|
AND q.id = ${q.id};`,
|
||
|
|
||
|
{ type: QueryTypes.SELECT }
|
||
|
);
|
||
|
|
||
|
reportServiceData.push({
|
||
|
id,
|
||
|
name,
|
||
|
number,
|
||
|
queueName: q.name,
|
||
|
queueColor: q.color,
|
||
|
startedByAgent: startedByAgent[0]?.ticket_count,
|
||
|
startedByClient: startedByClient[0]?.ticket_count,
|
||
|
closedChat: closedChat[0]?.ticket_count,
|
||
|
avgChatWaitingTime: avgChatWaitingTime[0]?.AVG_AWAITING_TIME
|
||
|
? avgChatWaitingTime[0]?.AVG_AWAITING_TIME
|
||
|
: 0,
|
||
|
pendingChat: pendingChat[0]?.ticket_count
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return reportServiceData;
|
||
|
};
|
||
|
|
||
|
export default ReportByNumberQueueService;
|