feat: Implement querying of synthetic and analytical reports on tickets
parent
5366f9943b
commit
5bcfc1bdcc
|
@ -40,8 +40,7 @@ const ShowTicketReport = async ({
|
||||||
createdOrUpdated = "created",
|
createdOrUpdated = "created",
|
||||||
queueId
|
queueId
|
||||||
}: Request): Promise<Response> => {
|
}: Request): Promise<Response> => {
|
||||||
let where_clause: any = {};
|
let where_clause: any = {};
|
||||||
// let where_clause_msg: any = {};
|
|
||||||
|
|
||||||
if (userId !== "0") {
|
if (userId !== "0") {
|
||||||
where_clause.userid = userId;
|
where_clause.userid = userId;
|
||||||
|
@ -71,7 +70,7 @@ const ShowTicketReport = async ({
|
||||||
|
|
||||||
if (queueId) {
|
if (queueId) {
|
||||||
where_clause.queueId = queueId;
|
where_clause.queueId = queueId;
|
||||||
}
|
}
|
||||||
|
|
||||||
const limit = 40;
|
const limit = 40;
|
||||||
const offset = limit * (+pageNumber - 1);
|
const offset = limit * (+pageNumber - 1);
|
||||||
|
@ -108,7 +107,7 @@ const ShowTicketReport = async ({
|
||||||
model: Message,
|
model: Message,
|
||||||
required: true,
|
required: true,
|
||||||
separate: true,
|
separate: true,
|
||||||
where: where_clause_msg ,
|
// where: where_clause_msg ,
|
||||||
|
|
||||||
attributes: [
|
attributes: [
|
||||||
"body",
|
"body",
|
||||||
|
@ -151,7 +150,7 @@ const ShowTicketReport = async ({
|
||||||
|
|
||||||
if (!tickets) {
|
if (!tickets) {
|
||||||
throw new AppError("ERR_NO_TICKET_FOUND", 404);
|
throw new AppError("ERR_NO_TICKET_FOUND", 404);
|
||||||
}
|
}
|
||||||
|
|
||||||
return { tickets, count, hasMore };
|
return { tickets, count, hasMore };
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,135 @@
|
||||||
|
import React, { useState, useEffect } from "react"
|
||||||
|
import Box from '@mui/material/Box'
|
||||||
|
import Button from '@mui/material/Button'
|
||||||
|
import Dialog from '@mui/material/Dialog'
|
||||||
|
import DialogActions from '@mui/material/DialogActions'
|
||||||
|
import DialogContent from '@mui/material/DialogContent'
|
||||||
|
import DialogContentText from '@mui/material/DialogContentText'
|
||||||
|
import DialogTitle from '@mui/material/DialogTitle'
|
||||||
|
import FormControl from '@mui/material/FormControl'
|
||||||
|
|
||||||
|
import InputLabel from '@mui/material/InputLabel'
|
||||||
|
import MenuItem from '@mui/material/MenuItem'
|
||||||
|
import Select from '@mui/material/Select'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export default function MaxWidthDialog(props) {
|
||||||
|
const [open, setOpen] = useState(false)
|
||||||
|
const [fullWidth,] = useState(true)
|
||||||
|
const [currency, setCurrency] = useState(props.reportOption)
|
||||||
|
const [textOption, setTextOption] = useState('')
|
||||||
|
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
|
||||||
|
// props.func(currency)
|
||||||
|
|
||||||
|
if(currency === '2' || currency === '3'){
|
||||||
|
setTextOption('Retorna apenas tickets com status: fechado')
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
setTextOption('Retorna todos os tickets com status: aberto, fechado, pendente')
|
||||||
|
}
|
||||||
|
|
||||||
|
}, [currency, props])
|
||||||
|
|
||||||
|
|
||||||
|
const handleClickOpen = () => {
|
||||||
|
setOpen(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleClose = () => {
|
||||||
|
|
||||||
|
props.func(currency)
|
||||||
|
|
||||||
|
setOpen(false)
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleMaxWidthChange = (event) => {
|
||||||
|
|
||||||
|
setCurrency(event.target.value)
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return (
|
||||||
|
<React.Fragment>
|
||||||
|
<Button variant="outlined" onClick={handleClickOpen}>
|
||||||
|
CSV ALL
|
||||||
|
</Button>
|
||||||
|
<Dialog
|
||||||
|
fullWidth={fullWidth}
|
||||||
|
maxWidth={'sm'}
|
||||||
|
open={open}
|
||||||
|
onClose={null}
|
||||||
|
>
|
||||||
|
<DialogTitle>Relatórios</DialogTitle>
|
||||||
|
|
||||||
|
<DialogContent>
|
||||||
|
<DialogContentText>
|
||||||
|
Escolha uma opção do tipo de relatório abaixo
|
||||||
|
</DialogContentText>
|
||||||
|
|
||||||
|
<Box
|
||||||
|
noValidate
|
||||||
|
component="form"
|
||||||
|
sx={{
|
||||||
|
display: 'flex',
|
||||||
|
flexDirection: 'column',
|
||||||
|
m: 'auto',
|
||||||
|
width: 'fit-content',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<FormControl sx={{ mt: 2, minWidth: 420 }}>
|
||||||
|
|
||||||
|
<InputLabel htmlFor="opcoes">opcoes</InputLabel>
|
||||||
|
|
||||||
|
<Select
|
||||||
|
autoFocus
|
||||||
|
value={currency}
|
||||||
|
onChange={handleMaxWidthChange}
|
||||||
|
label="opcoes"
|
||||||
|
inputProps={{
|
||||||
|
name: 'opcoes',
|
||||||
|
id: 'opcoes',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
|
||||||
|
|
||||||
|
{props.currencies.map((option, index) => (
|
||||||
|
<MenuItem key={index} value={option.value}> {option.label} </MenuItem>
|
||||||
|
))}
|
||||||
|
|
||||||
|
|
||||||
|
</Select>
|
||||||
|
|
||||||
|
</FormControl>
|
||||||
|
|
||||||
|
{/* <FormControlLabel
|
||||||
|
sx={{ mt: 1 }}
|
||||||
|
control={
|
||||||
|
<Switch checked={fullWidth} onChange={handleFullWidthChange} />
|
||||||
|
}
|
||||||
|
label="Full width"
|
||||||
|
/> */}
|
||||||
|
</Box>
|
||||||
|
</DialogContent>
|
||||||
|
<div style={{ display: 'flex', justifyContent: "center" }}>{textOption}</div>
|
||||||
|
|
||||||
|
<div style={{ display: 'flex', justifyContent: "right" }}>
|
||||||
|
<DialogActions>
|
||||||
|
<Button onClick={() => setOpen(false)}>Cancelar</Button>
|
||||||
|
</DialogActions>
|
||||||
|
<DialogActions>
|
||||||
|
<Button onClick={handleClose}>Ok</Button>
|
||||||
|
</DialogActions>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</Dialog>
|
||||||
|
</React.Fragment>
|
||||||
|
)
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
import React, { useState, useEffect, useReducer, useContext } from "react"
|
import React, { useState, useEffect, useReducer, useContext, useCallback } from "react"
|
||||||
import MainContainer from "../../components/MainContainer"
|
import MainContainer from "../../components/MainContainer"
|
||||||
import api from "../../services/api"
|
import api from "../../services/api"
|
||||||
import SelectField from "../../components/Report/SelectField"
|
import SelectField from "../../components/Report/SelectField"
|
||||||
|
@ -17,6 +17,8 @@ import Checkbox from '@mui/material/Checkbox'
|
||||||
import { Button } from "@material-ui/core"
|
import { Button } from "@material-ui/core"
|
||||||
|
|
||||||
import ReportModal from "../../components/ReportModal"
|
import ReportModal from "../../components/ReportModal"
|
||||||
|
import ReportModalType from "../../components/ReportModalType"
|
||||||
|
|
||||||
import MaterialTable from 'material-table'
|
import MaterialTable from 'material-table'
|
||||||
|
|
||||||
import LogoutIcon from '@material-ui/icons/CancelOutlined'
|
import LogoutIcon from '@material-ui/icons/CancelOutlined'
|
||||||
|
@ -34,6 +36,9 @@ import Switch from '@mui/material/Switch'
|
||||||
const label = { inputProps: { 'aria-label': 'Size switch demo' } }
|
const label = { inputProps: { 'aria-label': 'Size switch demo' } }
|
||||||
|
|
||||||
const report = [{ 'value': '1', 'label': 'Atendimento por atendentes' }, { 'value': '2', 'label': 'Usuários online/offline' }]
|
const report = [{ 'value': '1', 'label': 'Atendimento por atendentes' }, { 'value': '2', 'label': 'Usuários online/offline' }]
|
||||||
|
const reportOptType = [{ 'value': '1', 'label': 'Padrão' }, { 'value': '2', 'label': 'Sintético' }, { 'value': '3', 'label': 'Analítico' }]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const reducerQ = (state, action) => {
|
const reducerQ = (state, action) => {
|
||||||
|
@ -276,21 +281,16 @@ const Report = () => {
|
||||||
const [hasMore, setHasMore] = useState(false)
|
const [hasMore, setHasMore] = useState(false)
|
||||||
const [pageNumberTickets, setTicketsPageNumber] = useState(1)
|
const [pageNumberTickets, setTicketsPageNumber] = useState(1)
|
||||||
const [totalCountTickets, setTotalCountTickets] = useState(0)
|
const [totalCountTickets, setTotalCountTickets] = useState(0)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const [pageNumber, setPageNumber] = useState(1)
|
const [pageNumber, setPageNumber] = useState(1)
|
||||||
const [users, dispatch] = useReducer(reducer, [])
|
const [users, dispatch] = useReducer(reducer, [])
|
||||||
const [startDate, setDatePicker1] = useState(new Date())
|
const [startDate, setDatePicker1] = useState(new Date())
|
||||||
const [endDate, setDatePicker2] = useState(new Date())
|
const [endDate, setDatePicker2] = useState(new Date())
|
||||||
const [userId, setUser] = useState(null)
|
const [userId, setUser] = useState(null)
|
||||||
const [query, dispatchQ] = useReducer(reducerQ, [])
|
const [query, dispatchQ] = useReducer(reducerQ, [])
|
||||||
|
|
||||||
const [reportOption, setReport] = useState('1')
|
const [reportOption, setReport] = useState('1')
|
||||||
const [reporList,] = useState(report)
|
const [reporList,] = useState(report)
|
||||||
const [profile, setProfile] = useState('')
|
const [profile, setProfile] = useState('')
|
||||||
const [dataRows, setData] = useState([])
|
const [dataRows, setData] = useState([])
|
||||||
|
|
||||||
const [onQueueStatus, setOnQueueProcessStatus] = useState(undefined)
|
const [onQueueStatus, setOnQueueProcessStatus] = useState(undefined)
|
||||||
const [csvFile, setCsvFile] = useState()
|
const [csvFile, setCsvFile] = useState()
|
||||||
const [selectedValue, setSelectedValue] = useState('created')
|
const [selectedValue, setSelectedValue] = useState('created')
|
||||||
|
@ -298,6 +298,9 @@ const Report = () => {
|
||||||
const [queues, setQueues] = useState([])
|
const [queues, setQueues] = useState([])
|
||||||
const [queueId, setQueue] = useState(null)
|
const [queueId, setQueue] = useState(null)
|
||||||
|
|
||||||
|
const [reportTypeList,] = useState(reportOptType)
|
||||||
|
const [reportType, setReportType] = useState('1')
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
dispatch({ type: "RESET" })
|
dispatch({ type: "RESET" })
|
||||||
dispatchQ({ type: "RESET" })
|
dispatchQ({ type: "RESET" })
|
||||||
|
@ -424,8 +427,21 @@ const Report = () => {
|
||||||
setChecked(true)
|
setChecked(true)
|
||||||
}
|
}
|
||||||
setReport(data)
|
setReport(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get from report type option
|
||||||
|
const reportTypeValue = (data) => {
|
||||||
|
console.log('DATA: ', data)
|
||||||
|
let type = '1'
|
||||||
|
if (data === '1') type = 'default'
|
||||||
|
if (data === '2') type = 'synthetic'
|
||||||
|
if (data === '3') type = 'analytic'
|
||||||
|
|
||||||
|
handleCSVMessages(type)
|
||||||
|
|
||||||
|
setReportType(data)
|
||||||
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|
||||||
if (reportOption === '1') {
|
if (reportOption === '1') {
|
||||||
|
@ -500,7 +516,7 @@ const Report = () => {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const handleCSVMessages = () => {
|
const handleCSVMessages = (type = 'default') => {
|
||||||
|
|
||||||
const fetchQueries = async () => {
|
const fetchQueries = async () => {
|
||||||
|
|
||||||
|
@ -519,7 +535,8 @@ const Report = () => {
|
||||||
userId: userId,
|
userId: userId,
|
||||||
startDate: startDate,
|
startDate: startDate,
|
||||||
endDate: endDate
|
endDate: endDate
|
||||||
}
|
},
|
||||||
|
query_type: type
|
||||||
})
|
})
|
||||||
|
|
||||||
const onQueueStatus = querySavedOnQueue.data.queueStatus
|
const onQueueStatus = querySavedOnQueue.data.queueStatus
|
||||||
|
@ -639,7 +656,10 @@ const Report = () => {
|
||||||
case 'empty':
|
case 'empty':
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Button
|
{query && query.length > 0 &&
|
||||||
|
<ReportModalType currencies={reportTypeList} func={reportTypeValue} reportOption={reportType} />
|
||||||
|
}
|
||||||
|
{/* <Button
|
||||||
disabled={query && query.length > 0 ? false : true}
|
disabled={query && query.length > 0 ? false : true}
|
||||||
variant="contained"
|
variant="contained"
|
||||||
color="primary"
|
color="primary"
|
||||||
|
@ -648,7 +668,8 @@ const Report = () => {
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{"CSV ALL"}
|
{"CSV ALL"}
|
||||||
</Button>
|
|
||||||
|
</Button> */}
|
||||||
</>)
|
</>)
|
||||||
|
|
||||||
case 'pending' || 'processing':
|
case 'pending' || 'processing':
|
||||||
|
|
Loading…
Reference in New Issue