import Ticket from "../../models/Ticket"; import AppError from "../../errors/AppError"; import Contact from "../../models/Contact"; import User from "../../models/User"; import Queue from "../../models/Queue"; import Message from "../../models/Message"; import { userInfo } from "os"; import { Op, QueryTypes, where } from "sequelize"; import { Sequelize } from "sequelize"; import moment from "moment"; const dbConfig = require("../../config/database"); const sequelize = new Sequelize(dbConfig); import { startOfDay, endOfDay, parseISO, getDate } from "date-fns"; import { string } from "yup/lib/locale"; import Whatsapp from "../../models/Whatsapp"; import Query from "mysql2/typings/mysql/lib/protocol/sequences/Query" interface Request { userId: string | number; startDate: string; endDate: string; createdOrUpdated?: string; queueId?: string; pageNumber?: string; } interface Response { tickets: Ticket[]; count: number; hasMore: boolean; } //Report by user, startDate, endDate const ShowTicketReport = async ({ userId, startDate, endDate, pageNumber = "1", createdOrUpdated = "created", queueId }: Request): Promise => { let where_clause: any = {}; let query = ""; if (userId !== "0") { where_clause.userid = userId; query = `AND t.userId = ${userId}`; } if (queueId) { where_clause.queueId = queueId; query = `AND t.queueId = ${queueId}`; } const limit = 40; const offset = limit * (+pageNumber - 1); const createdAtOrUpdatedAt = createdOrUpdated == "created" ? "createdAt" : "updatedAt"; const _ticketsId = await sequelize.query( `SELECT t.id FROM Tickets t INNER JOIN ( SELECT DISTINCT ticketId FROM Messages WHERE ${createdAtOrUpdatedAt} >= '${startDate} 00:00:00' AND ${createdAtOrUpdatedAt} <= '${endDate} 23:59:59' ) AS m ON m.ticketId = t.id ${query};`, { type: QueryTypes.SELECT } ); console.log('QUERY: ', query) const { count, rows: tickets } = await Ticket.findAndCountAll({ where: { id: { [Op.in]: _ticketsId.map((t: any) => t.id) } }, limit, offset, attributes: [ "id", "status", "statusChatEnd", [ Sequelize.fn( "DATE_FORMAT", Sequelize.col("Ticket.createdAt"), "%d/%m/%Y %H:%i:%s" ), "createdAt" ], [ Sequelize.fn( "DATE_FORMAT", Sequelize.col("Ticket.updatedAt"), "%d/%m/%Y %H:%i:%s" ), "updatedAt" ] ], include: [ { model: Message, required: true, separate: true, attributes: [ "body", "read", "mediaType", "fromMe", "mediaUrl", [ Sequelize.fn( "DATE_FORMAT", Sequelize.col("createdAt"), "%d/%m/%Y %H:%i:%s" ), "createdAt" ] ], order: [["createdAt", "ASC"]] }, { model: Contact, attributes: ["name", "number"] }, { model: User, attributes: ["name", "email"] }, { model: Queue, attributes: ["name"] }, { model: Whatsapp, attributes: ["name"] } ], order: [["updatedAt", "DESC"]] }); const hasMore = count > offset + tickets.length; if (!tickets) { throw new AppError("ERR_NO_TICKET_FOUND", 404); } return { tickets, count, hasMore }; }; export default ShowTicketReport;