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, where } from "sequelize"; import { Sequelize } from "sequelize"; import moment from "moment"; import { startOfDay, endOfDay, parseISO, getDate } from "date-fns"; import { string } from "yup/lib/locale"; import Whatsapp from "../../models/Whatsapp"; 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 = {}; if (userId == "0") { if (createdOrUpdated == "updated") { where_clause = { updatedAt: { [Op.gte]: startDate + " 00:00:00.000000", [Op.lte]: endDate + " 23:59:59.999999" } }; } else if (createdOrUpdated == "created") { where_clause = { createdAt: { [Op.gte]: startDate + " 00:00:00.000000", [Op.lte]: endDate + " 23:59:59.999999" } }; } if (queueId) { where_clause = { ...where_clause, queueId }; } } else { if (createdOrUpdated == "updated") { where_clause = { userid: userId, updatedAt: { [Op.gte]: startDate + " 00:00:00.000000", [Op.lte]: endDate + " 23:59:59.999999" } }; } else if (createdOrUpdated == "created") { where_clause = { userid: userId, createdAt: { [Op.gte]: startDate + " 00:00:00.000000", [Op.lte]: endDate + " 23:59:59.999999" } }; } } const limit = 40; const offset = limit * (+pageNumber - 1); const { count, rows: tickets } = await Ticket.findAndCountAll({ where: where_clause, limit, offset, //attributes: ['id', 'status', 'createdAt', 'updatedAt'], 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','createdAt'], 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;