Merge remote-tracking branch 'origin/dual_session_test' into dialogflow

pull/20/head
adriano 2022-12-27 11:34:16 -03:00
commit e2fc5c267e
8 changed files with 236 additions and 128 deletions

View File

@ -81,6 +81,6 @@
"supertest": "^5.0.0", "supertest": "^5.0.0",
"ts-jest": "^26.4.1", "ts-jest": "^26.4.1",
"ts-node-dev": "^1.0.0-pre.63", "ts-node-dev": "^1.0.0-pre.63",
"typescript": "4.1" "typescript": "4.1.6"
} }
} }

View File

@ -27,6 +27,7 @@ import ShowQueuesByUser from "../services/UserServices/ShowQueuesByUser";
// import { filter } from "bluebird"; // import { filter } from "bluebird";
import { getIO } from "../libs/socket"; import { getIO } from "../libs/socket";
import { Json } from "sequelize/types/lib/utils";
type IndexQuery = { type IndexQuery = {
userId: string; userId: string;
@ -87,6 +88,10 @@ export const reportUserService = async (req: Request, res: Response): Promise<Re
let openCloseOnQueue = openByUserOnQueue.concat(closedByUserOnQueue) let openCloseOnQueue = openByUserOnQueue.concat(closedByUserOnQueue)
let openCloseOutQueue = openByUserOutQueue.concat(closedUserOutQueue) let openCloseOutQueue = openByUserOutQueue.concat(closedUserOutQueue)
// console.log('onlineUsers: ',JSON.parse(JSON.stringify(onlineUsers)))
// console.log('sumUserOlineTime: ', JSON.parse(JSON.stringify(sumUserOlineTime)))
for (let i = 0; i < queuesByUser.length; i++) { for (let i = 0; i < queuesByUser.length; i++) {
queuesByUser[i].countOpen = 0 queuesByUser[i].countOpen = 0
@ -113,6 +118,8 @@ export const reportUserService = async (req: Request, res: Response): Promise<Re
if (index != -1) { if (index != -1) {
user.sumOnlineTime = sumUserOlineTime[index]; user.sumOnlineTime = sumUserOlineTime[index];
// console.log('user.sumOlineTime: 'user.sumOnlineTime)
} }
index = closedByUser.findIndex((e: any) => e.userId == user.id) index = closedByUser.findIndex((e: any) => e.userId == user.id)
@ -169,7 +176,7 @@ export const reportUserService = async (req: Request, res: Response): Promise<Re
}) })
return res.status(200).json(usersProfile); return res.status(200).json({usersProfile: usersProfile});
}; };

View File

@ -8,11 +8,11 @@ import { redisConn } from './TicketCache'
import Whatsapp from "../models/Whatsapp"; import Whatsapp from "../models/Whatsapp";
import { response } from 'express' import { response } from 'express'
const deleteWhatsappCache = async (hash:any) => { const deleteWhatsappCache = async (hash: any) => {
const redis: any = await redisConn(); const redis: any = await redisConn();
if(!redis) return if (!redis) return
if (redis.status !== 'connect') return if (redis.status !== 'connect') return
@ -39,7 +39,7 @@ const updateWhatsappCache = async (hash: any, json_object: any) => {
const redis: any = await redisConn(); const redis: any = await redisConn();
if(!redis) return if (!redis) return
if (redis.status !== 'connect') return if (redis.status !== 'connect') return
@ -57,18 +57,18 @@ const updateWhatsappCache = async (hash: any, json_object: any) => {
} }
const updateWhatsappCacheById = async (hash:any, update_fields: object | any) => { const updateWhatsappCacheById = async (hash: any, update_fields: object | any) => {
const redis: any = await redisConn(); const redis: any = await redisConn();
if(!redis) return if (!redis) return
if (redis.status !== 'connect') return if (redis.status !== 'connect') return
const whatsapp_cache: any = await redis.hgetall(hash) const whatsapp_cache: any = await redis.hgetall(hash)
try { try {
if (whatsapp_cache && Object.keys(whatsapp_cache).length > 0) { if (whatsapp_cache && Object.keys(whatsapp_cache).length > 0) {
// update_fields.escaped_name = escapeCharCache(update_fields.name) // update_fields.escaped_name = escapeCharCache(update_fields.name)
@ -109,15 +109,15 @@ async function searchWhatsappCache(id: string, status: string) {
const redis: any = await redisConn(); const redis: any = await redisConn();
if(!redis) return if (!redis) return
if (redis.status !== 'connect') return null if (redis.status !== 'connect') return null
const number_cache: any = await redis.hgetall(`whatsapp:${id}`) const number_cache: any = await redis.hgetall(`whatsapp:${id}`)
if(Object.entries(number_cache).length == 0){ if (Object.entries(number_cache).length == 0) {
await redis.quit() await await redis.quit()
return [] return []
} }
@ -126,9 +126,9 @@ async function searchWhatsappCache(id: string, status: string) {
// @x:foo @y:bar // @x:foo @y:bar
const response: any = await redis.call('FT.SEARCH', 'idx_whatsapp', `(@status:*${status}*) (@number:*${number_cache.number}*)`, 'SORTBY', 'status', 'ASC') const response: any = await redis.call('FT.SEARCH', 'idx_whatsapp', `(@status:*${status}*) (@number:*${number_cache.number}*)`, 'SORTBY', 'status', 'ASC')
await redis.quit() await redis.quit()
if (response.length === 1) { if (response.length === 1) {
@ -153,30 +153,30 @@ async function searchWhatsappCache(id: string, status: string) {
return results return results
} }
const insertOrUpeateWhatsCache = async (hash:any, whatsapp: any) => {
const insertOrUpeateWhatsCache = async (hash: any, whatsapp: any) => {
const redis: any = await redisConn(); const redis: any = await redisConn();
if(!redis) return if (!redis) return
if (redis.status !== 'connect') return if (redis.status !== 'connect') return
if(Array.isArray(whatsapp)){ if (Array.isArray(whatsapp)) {
const pipeline = redis.pipeline() const pipeline = redis.pipeline()
for (let i = 0; i < whatsapp.length; i++) { for (let i = 0; i < whatsapp.length; i++) {
pipeline.hmset(hash, whatsapp[i]); pipeline.hmset(hash, whatsapp[i]);
} }
await pipeline.exec(() => { console.log(`${whatsapp.length} WHATSAPP INSERTED IN CACHE!`) }); await pipeline.exec(() => { console.log(`${whatsapp.length} WHATSAPP INSERTED IN CACHE!`) });
} }
else{ else {
await redis.hmset(hash,JSON.parse(JSON.stringify(whatsapp))); await redis.hmset(hash, JSON.parse(JSON.stringify(whatsapp)));
console.log(`WHATSAPP ID ${whatsapp.id} INSERTED OR UPADTED IN CACHE!`) console.log(`WHATSAPP ID ${whatsapp.id} INSERTED OR UPADTED IN CACHE!`)
@ -195,11 +195,11 @@ const loadWhatsappCache = async () => {
const redis: any = await redisConn(); const redis: any = await redisConn();
if(!redis) return if (!redis) return
if (redis.status !== 'connect') return if (redis.status !== 'connect') return
let whatsapps:any = await Whatsapp.findAll({raw: true}) let whatsapps: any = await Whatsapp.findAll({ raw: true })
const pipeline = redis.pipeline() const pipeline = redis.pipeline()
@ -222,7 +222,7 @@ const createWhatsappIndexCache = async (hashIndex: string) => {
const redis: any = await redisConn(); const redis: any = await redisConn();
if(!redis) return if (!redis) return
if (redis.status !== 'connect') return if (redis.status !== 'connect') return
@ -235,7 +235,7 @@ const createWhatsappIndexCache = async (hashIndex: string) => {
await redis.call('FT.DROPINDEX', hashIndex) await redis.call('FT.DROPINDEX', hashIndex)
} }
const response = await redis.call('FT.CREATE', hashIndex, 'ON', 'HASH', 'PREFIX', '1', 'whatsapp:', 'SCHEMA','id', 'NUMERIC', 'status', 'TEXT', 'SORTABLE', 'number', 'TEXT', 'SORTABLE') const response = await redis.call('FT.CREATE', hashIndex, 'ON', 'HASH', 'PREFIX', '1', 'whatsapp:', 'SCHEMA', 'id', 'NUMERIC', 'status', 'TEXT', 'SORTABLE', 'number', 'TEXT', 'SORTABLE')
console.log('Whatsapp index created: ', response) console.log('Whatsapp index created: ', response)
@ -248,8 +248,8 @@ const createWhatsappIndexCache = async (hashIndex: string) => {
export { export {
loadWhatsappCache, loadWhatsappCache,
searchWhatsappCache, searchWhatsappCache,
updateWhatsappCacheById, updateWhatsappCacheById,
insertOrUpeateWhatsCache, insertOrUpeateWhatsCache,
deleteWhatsappCache deleteWhatsappCache
} }

View File

@ -23,7 +23,7 @@ let whoIsOnline_monitor: any;
// const listUserId:any[] = [{'id':8, status: 'offline'},{'id':3, status: 'offline'},{'id':5, status: 'offline'}] // const listUserId:any[] = [{'id':8, status: 'offline'},{'id':3, status: 'offline'},{'id':5, status: 'offline'}]
let listUserId: any[] = [] let listUserId: any[] = []
let count = 0 let count = 0
let countTest = 0 // let countTest = 0
let uuid: any = 0 let uuid: any = 0
let dateTime = splitDateTime(new Date(format(new Date(), 'yyyy-MM-dd HH:mm:ss', { locale: ptBR }))) let dateTime = splitDateTime(new Date(format(new Date(), 'yyyy-MM-dd HH:mm:ss', { locale: ptBR })))
let timeInterval = 5 let timeInterval = 5
@ -51,6 +51,10 @@ const emitterOnline = (user: any, status: string, showOnlineTime: boolean = true
} }
} }
console.log('ENTROU NO EMMITER ONLINE: ', user.id)
// console.log('-------------> onlineTime: ', onlineTime)
const io = getIO(); const io = getIO();
io.emit("onlineStatus", { io.emit("onlineStatus", {
action: "update", action: "update",
@ -113,12 +117,14 @@ const monitor = async () => {
} }
// console.log('el: ', el)
if (el.status == 'waiting...') { if (el.status == 'waiting...') {
emitterOnline(el, el.status, false) emitterOnline(el, el.status, false)
} }
else { // else {
emitterOnline(el, el.status) // emitterOnline(el, el.status)
} // }
@ -147,39 +153,15 @@ const monitor = async () => {
} }
count++ count++
} }
if (countTest > 5) {
countTest = 0
}
if (countTest == 0) {
try {
console.log(' Carregando usuarios no listUserId...')
listUserId = await ListUserParamiterService({ profile: 'user' })
} catch (error) {
console.log('There was an erro on ListUserParamiterService: ', error)
return
}
}
countTest = 1
listUserId.forEach((u) => {
const io = getIO();
io.emit("isOnline", { action: "online", userId: u.id });
});
} catch (error) { } catch (error) {
console.log('>>> There was an error no WhoIsOnlineMonitor.ts: ', error) console.log('>>> There was an error no WhoIsOnlineMonitor.ts: ', error)
listUserId = [] listUserId = []
count = 0 count = 0
countTest = 0 // countTest = 0
uuid = 0 uuid = 0
} }
@ -211,7 +193,7 @@ const startWhoIsOnlineMonitor = async (mileseconds?: number) => {
listUserId = [] listUserId = []
count = 0 count = 0
countTest = 0 // countTest = 0
uuid = 0 uuid = 0
clearInterval(_fifo); clearInterval(_fifo);

View File

@ -47,6 +47,8 @@ export const initIO = (httpServer: Server): SocketIO => {
socket.on("online", (userId: any) => { socket.on("online", (userId: any) => {
// console.log('userId: ', userId)
obj.uuid = uuidv4() obj.uuid = uuidv4()

View File

@ -40,6 +40,29 @@ const useStyles = makeStyles(theme => ({
}, },
})); }));
let _fifo
// const onlineEmitter = async (socket, user) => {
// try {
// clearInterval(_fifo);
// socket.emit("online", user.id)
// } catch (error) {
// console.log('error on onlineEmitter: ', error)
// }
// finally {
// _fifo = setInterval(onlineEmitter, 3000);
// }
// }
// _fifo = setInterval(onlineEmitter, 3000);
const NotificationsPopOver = () => { const NotificationsPopOver = () => {
const classes = useStyles(); const classes = useStyles();
@ -57,20 +80,20 @@ const NotificationsPopOver = () => {
const [play] = useSound(alertSound); const [play] = useSound(alertSound);
const soundAlertRef = useRef(); const soundAlertRef = useRef();
const historyRef = useRef(history); const historyRef = useRef(history);
const { handleLogout } = useContext(AuthContext); const { handleLogout } = useContext(AuthContext);
// const [lastRef] = useState(+history.location.pathname.split("/")[2]) // const [lastRef] = useState(+history.location.pathname.split("/")[2])
useEffect(() => { useEffect(() => {
soundAlertRef.current = play; soundAlertRef.current = play;
if (!("Notification" in window)) { if (!("Notification" in window)) {
} else { } else {
Notification.requestPermission(); Notification.requestPermission();
} }
@ -82,53 +105,70 @@ const NotificationsPopOver = () => {
useEffect(() => { useEffect(() => {
ticketIdRef.current = ticketIdUrl;
ticketIdRef.current = ticketIdUrl;
}, [ticketIdUrl]); }, [ticketIdUrl]);
useEffect(() => { useEffect(() => {
const socket = openSocket(process.env.REACT_APP_BACKEND_URL); const socket = openSocket(process.env.REACT_APP_BACKEND_URL);
socket.on("onlineStatus", (data) => { socket.on("onlineStatus", (data) => {
if(data.action === "logout"){
if (data.action === "logout") {
if(`${user.id}` === data.userOnlineTime['userId']){
socket.emit("online", {logoutUserId: user.id})
if (`${user.id}` === data.userOnlineTime['userId']) {
socket.emit("online", { logoutUserId: user.id })
handleLogout(); handleLogout();
} }
} }
}); });
// socket.on("isOnline", (data) => {
// if (data.action === "online") {
// if (data.userId === user.id) {
// socket.emit("online", user.id)
// }
// }
// });
if(user.profile === 'user'){
if(_fifo){
clearInterval(_fifo);
}
socket.on("isOnline", (data) => { _fifo = setInterval(()=>{
console.log('user.id: ', user.id)
if(data.action === "online"){
if(data.userId === user.id){
socket.emit("online", user.id) socket.emit("online", user.id)
} }, 3000);
}
}
});
return () => { return () => {
socket.disconnect(); socket.disconnect();
}; };
}, [user.id, handleLogout]); }, [user.id, handleLogout]);
@ -136,13 +176,13 @@ const NotificationsPopOver = () => {
useEffect(() => { useEffect(() => {
const socket = openSocket(process.env.REACT_APP_BACKEND_URL); const socket = openSocket(process.env.REACT_APP_BACKEND_URL);
socket.on("connect", () => socket.emit("joinNotification")); socket.on("connect", () => socket.emit("joinNotification"));
socket.on("ticket", data => { socket.on("ticket", data => {
if (data.action === "updateUnread" || data.action === "delete") { if (data.action === "updateUnread" || data.action === "delete") {
setNotifications(prevState => { setNotifications(prevState => {
const ticketIndex = prevState.findIndex(t => t.id === data.ticketId); const ticketIndex = prevState.findIndex(t => t.id === data.ticketId);
@ -169,7 +209,7 @@ const NotificationsPopOver = () => {
socket.on("appMessage", data => { socket.on("appMessage", data => {
if ( if (
data.action === "create" && data.action === "create" &&
@ -177,12 +217,12 @@ const NotificationsPopOver = () => {
(data.ticket.userId === user?.id || !data.ticket.userId) (data.ticket.userId === user?.id || !data.ticket.userId)
) { ) {
setNotifications(prevState => { setNotifications(prevState => {
// prevState.forEach((e)=>{ // prevState.forEach((e)=>{
// //
@ -190,23 +230,23 @@ const NotificationsPopOver = () => {
const ticketIndex = prevState.findIndex(t => t.id === data.ticket.id); const ticketIndex = prevState.findIndex(t => t.id === data.ticket.id);
if (ticketIndex !== -1) { if (ticketIndex !== -1) {
prevState[ticketIndex] = data.ticket; prevState[ticketIndex] = data.ticket;
return [...prevState]; return [...prevState];
} }
return [data.ticket, ...prevState]; return [data.ticket, ...prevState];
}); });
const shouldNotNotificate = (data.message.ticketId === ticketIdRef.current && document.visibilityState === "visible") || const shouldNotNotificate = (data.message.ticketId === ticketIdRef.current && document.visibilityState === "visible") ||
(data.ticket.userId && data.ticket.userId !== user?.id) || (data.ticket.userId && data.ticket.userId !== user?.id) ||
data.ticket.isGroup || !data.ticket.userId; data.ticket.isGroup || !data.ticket.userId;
if (shouldNotNotificate) return; if (shouldNotNotificate) return;
handleNotifications(data); handleNotifications(data);
} }
@ -219,7 +259,7 @@ const NotificationsPopOver = () => {
const handleNotifications = data => { const handleNotifications = data => {
const { message, contact, ticket } = data; const { message, contact, ticket } = data;
const options = { const options = {
body: `${message.body} - ${format(new Date(), "HH:mm")}`, body: `${message.body} - ${format(new Date(), "HH:mm")}`,
icon: contact.profilePicUrl, icon: contact.profilePicUrl,
@ -293,13 +333,13 @@ const NotificationsPopOver = () => {
onClose={handleClickAway} onClose={handleClickAway}
> >
<List dense className={classes.tabContainer}> <List dense className={classes.tabContainer}>
{notifications.length === 0 ? ( {notifications.length === 0 ? (
<ListItem> <ListItem>
<ListItemText>{i18n.t("notifications.noTickets")}</ListItemText> <ListItemText>{i18n.t("notifications.noTickets")}</ListItemText>
</ListItem> </ListItem>
) : ( ) : (
notifications.map(ticket => ( notifications.map(ticket => (
<NotificationTicket key={ticket.id}> <NotificationTicket key={ticket.id}>
<TicketListItem ticket={ticket} /> <TicketListItem ticket={ticket} />
</NotificationTicket> </NotificationTicket>

View File

@ -1,5 +1,7 @@
import React, { useContext, useReducer, useEffect, useState } from "react"; import React, { useContext, useReducer, useEffect, useState } from "react";
import { addHours, addMinutes, addSeconds, intervalToDuration, add } from "date-fns";
import Paper from "@material-ui/core/Paper"; import Paper from "@material-ui/core/Paper";
import Container from "@material-ui/core/Container"; import Container from "@material-ui/core/Container";
import Grid from "@material-ui/core/Grid"; import Grid from "@material-ui/core/Grid";
@ -104,6 +106,36 @@ const useStyles = makeStyles((theme) => ({
}, },
})); }));
var _fifo
const sumOnlineTimeNow = (oldOnlineTimeSum) => {
let onlineTime = new Date()
onlineTime.setUTCHours(new Date(oldOnlineTimeSum.onlineTime).getHours())
onlineTime.setUTCMinutes(new Date(oldOnlineTimeSum.onlineTime).getMinutes())
onlineTime.setUTCSeconds(new Date(oldOnlineTimeSum.onlineTime).getSeconds())
let newtTime = intervalToDuration({ start: new Date(oldOnlineTimeSum.updatedAt), end: new Date() })
if (newtTime.hours && +newtTime.hours > 0) {
onlineTime = addHours(onlineTime, newtTime.hours)
}
if (newtTime.minutes && +newtTime.minutes > 0) {
onlineTime = addMinutes(onlineTime, newtTime.minutes)
}
if (newtTime.seconds && +newtTime.seconds > 0) {
onlineTime = addSeconds(onlineTime, newtTime.seconds)
}
const isoDate = new Date(onlineTime);
const newOnlinetime = isoDate.toJSON().slice(0, 19).replace('T', ' ');
return newOnlinetime
}
const reducer = (state, action) => { const reducer = (state, action) => {
if (action.type === "DELETE_USER_STATUS") { if (action.type === "DELETE_USER_STATUS") {
const userId = action.payload; const userId = action.payload;
@ -138,6 +170,8 @@ const reducer = (state, action) => {
let onlineUser = action.payload; let onlineUser = action.payload;
let index = -1; let index = -1;
// console.log('UPDATE_STATUS_ONLINE: ', onlineUser)
let onlySumOpenClosed = false; let onlySumOpenClosed = false;
if (onlineUser.sumOpen || onlineUser.sumClosed) { if (onlineUser.sumOpen || onlineUser.sumClosed) {
@ -157,18 +191,27 @@ const reducer = (state, action) => {
if (!("statusOnline" in state[index])) { if (!("statusOnline" in state[index])) {
state[index].statusOnline = onlineUser; state[index].statusOnline = onlineUser;
} else if ("statusOnline" in state[index]) { } else if ("statusOnline" in state[index]) {
state[index].statusOnline["status"] = onlineUser.status; state[index].statusOnline["status"] = onlineUser.status;
} }
} }
if ("onlineTime" in onlineUser) { if ("onlineTime" in onlineUser) {
if ("sumOnlineTime" in state[index]) { if ("sumOnlineTime" in state[index]) {
state[index].sumOnlineTime["sum"] = onlineUser.onlineTime.split(" ")[1];
} else if (!("sumOnlineTime" in state[index])) { // console.log(' ffffffffffffffffffffffffffff ')
state[index].sumOnlineTime.sum = onlineUser.onlineTime.split(" ")[1]
} else if (!("sumOnlineTime" in state[index])) {
state[index].sumOnlineTime = { state[index].sumOnlineTime = {
userId: onlineUser.userId, userId: onlineUser.userId,
sum: onlineUser.onlineTime.split(" ")[1], sum: onlineUser.onlineTime.split(" ")[1],
}; };
} }
} }
@ -235,13 +278,16 @@ const Dashboard = () => {
let date = new Date().toLocaleDateString("pt-BR").split("/"); let date = new Date().toLocaleDateString("pt-BR").split("/");
let dateToday = `${date[2]}-${date[1]}-${date[0]}`; let dateToday = `${date[2]}-${date[1]}-${date[0]}`;
const dataQuery = await api.get("/reports/user/services", { const { data } = await api.get("/reports/user/services", {
params: { userId: null, startDate: dateToday, endDate: dateToday }, params: { userId: null, startDate: dateToday, endDate: dateToday },
}); });
// console.log('data.data: ', data.usersProfile)
dispatch({ type: "RESET" }); dispatch({ type: "RESET" });
dispatch({ type: "LOAD_QUERY", payload: dataQuery.data }); dispatch({ type: "LOAD_QUERY", payload: data.usersProfile });
} catch (err) { } catch (err) {
} }
}; };
@ -250,6 +296,37 @@ const Dashboard = () => {
return () => clearTimeout(delayDebounceFn); return () => clearTimeout(delayDebounceFn);
}, []); }, []);
useEffect(() => {
if (!usersOnlineInfo || usersOnlineInfo.length == 0) return
if (_fifo) {
clearInterval(_fifo);
}
_fifo = setInterval(() => {
usersOnlineInfo.map((e) => {
if (e.statusOnline && e.statusOnline.status === 'online') {
let onlineTimeCurrent = sumOnlineTimeNow({onlineTime: e.statusOnline.onlineTime, updatedAt: e.statusOnline.updatedAt})
dispatch({ type: "UPDATE_STATUS_ONLINE", payload: { userId: e.id, status: e.statusOnline.status, onlineTime: onlineTimeCurrent } });
}
})
}, 3000);
}, [usersOnlineInfo])
useEffect(() => { useEffect(() => {
const socket = openSocket(process.env.REACT_APP_BACKEND_URL); const socket = openSocket(process.env.REACT_APP_BACKEND_URL);
@ -280,7 +357,7 @@ const Dashboard = () => {
}, []); }, []);
useEffect(() => { useEffect(() => {
if (ticketStatusChange === "") return if (ticketStatusChange === "") return
const delayDebounceFn = setTimeout(() => { const delayDebounceFn = setTimeout(() => {
const fetchQueries = async () => { const fetchQueries = async () => {
try { try {
@ -372,10 +449,10 @@ const Dashboard = () => {
style={{ overflow: "hidden" }} style={{ overflow: "hidden" }}
variant="outlined" variant="outlined"
> >
<Typography component="h3" variant="h6" color="primary" style={{marginBottom:"0"}} paragraph> <Typography component="h3" variant="h6" color="primary" style={{ marginBottom: "0" }} paragraph>
Em Atendimento Em Atendimento
</Typography> </Typography>
<Typography paragraph style={{fontSize: "12px", margin:"0px"}}>Hoje/Todo Periodo</Typography> <Typography paragraph style={{ fontSize: "12px", margin: "0px" }}>Hoje/Todo Periodo</Typography>
<Grid item> <Grid item>
<Typography component="h1" variant="h4"> <Typography component="h1" variant="h4">

View File

@ -728,7 +728,7 @@ const Report = () => {
{ title: 'Tempo online', field: 'sumOnlineTime.sum' }, { title: 'Tempo online', field: 'sumOnlineTime.sum' },
{ title: `${i18n.t("reports.dateStart")}`, field: 'startDate' }, { title: `${i18n.t("reports.dateStart")}`, field: 'startDate' },
{ title: `${i18n.t("reports.dateStart")}`, field: 'endDate' }, { title: `${i18n.t("reports.dateEnd")}`, field: 'endDate' },
{ title: 'Em atendimento', field: 'sumOpen.count' }, { title: 'Em atendimento', field: 'sumOpen.count' },
{ title: 'Finalizado', field: 'sumClosed.count' }, { title: 'Finalizado', field: 'sumClosed.count' },