Alteração do horário comercial para té às 20
parent
bc79a29f21
commit
d0be6729fe
|
@ -37,7 +37,7 @@
|
||||||
"sequelize-cli": "^5.5.1",
|
"sequelize-cli": "^5.5.1",
|
||||||
"sequelize-typescript": "^1.1.0",
|
"sequelize-typescript": "^1.1.0",
|
||||||
"socket.io": "^3.0.5",
|
"socket.io": "^3.0.5",
|
||||||
"whatsapp-web.js": "^1.15.5",
|
"whatsapp-web.js": "^1.15.6",
|
||||||
"yup": "^0.32.8"
|
"yup": "^0.32.8"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|
|
@ -10,6 +10,7 @@ import SendWhatsAppMessage from "../services/WbotServices/SendWhatsAppMessage";
|
||||||
import ShowWhatsAppService from "../services/WhatsappService/ShowWhatsAppService";
|
import ShowWhatsAppService from "../services/WhatsappService/ShowWhatsAppService";
|
||||||
|
|
||||||
import CreateSchedulingNotifyService from "../services/SchedulingNotifyServices/CreateSchedulingNotifyService";
|
import CreateSchedulingNotifyService from "../services/SchedulingNotifyServices/CreateSchedulingNotifyService";
|
||||||
|
import ListSchedulingNotifyContactService from "../services/SchedulingNotifyServices/ListSchedulingNotifyContactService";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -94,9 +95,16 @@ export const show = async (req: Request, res: Response): Promise<Response> => {
|
||||||
|
|
||||||
const { schedules, count, hasMore } = await ListScheduleService({ searchParam: "", pageNumber: "1" });
|
const { schedules, count, hasMore } = await ListScheduleService({ searchParam: "", pageNumber: "1" });
|
||||||
|
|
||||||
|
//////////////////
|
||||||
|
const schedulesContact = await ListSchedulingNotifyContactService(contact.contact.number);
|
||||||
|
/////////////////
|
||||||
|
|
||||||
|
// console.log('############### schedulesContact: ', schedulesContact)
|
||||||
|
// console.log('############### contact.contact.number: ',contact.contact.number)
|
||||||
|
|
||||||
// return res.status(200).json(contact);
|
// return res.status(200).json(contact);
|
||||||
|
|
||||||
return res.status(200).json({contact, schedules});
|
return res.status(200).json({contact, schedules, schedulesContact});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -78,8 +78,8 @@ class Ticket extends Model<Ticket> {
|
||||||
@HasMany(() => Message)
|
@HasMany(() => Message)
|
||||||
messages: Message[];
|
messages: Message[];
|
||||||
|
|
||||||
@HasOne(() => SchedulingNotify)
|
@HasMany(() => SchedulingNotify)
|
||||||
schedulingNotify: SchedulingNotify
|
schedulingNotify: SchedulingNotify[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Ticket;
|
export default Ticket;
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
import Ticket from "../../models/Ticket";
|
||||||
|
import Contact from "../../models/Contact";
|
||||||
|
import SchedulingNotify from "../../models/SchedulingNotify";
|
||||||
|
import { Op, where, Sequelize } from "sequelize";
|
||||||
|
import AppError from "../../errors/AppError";
|
||||||
|
|
||||||
|
const ListSchedulingNotifyContactService = async (contactNumber: string): Promise<SchedulingNotify[]> => {
|
||||||
|
|
||||||
|
|
||||||
|
const ticket = await SchedulingNotify.findAll({
|
||||||
|
|
||||||
|
attributes:['id', [Sequelize.fn("DATE_FORMAT",Sequelize.col("schedulingDate"),"%d/%m/%Y %H:%i:%s"),"schedulingDate"], 'message'],
|
||||||
|
|
||||||
|
include: [
|
||||||
|
{
|
||||||
|
model: Ticket,
|
||||||
|
required:true,
|
||||||
|
attributes: [],
|
||||||
|
include: [
|
||||||
|
{
|
||||||
|
model: Contact,
|
||||||
|
where:{
|
||||||
|
number: contactNumber,
|
||||||
|
},
|
||||||
|
attributes: ['name', 'number']
|
||||||
|
},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
],
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
if (!ticket) {
|
||||||
|
throw new AppError("ERR_NO_TICKET_FOUND", 404);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ticket;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ListSchedulingNotifyContactService;
|
||||||
|
|
|
@ -6,22 +6,50 @@ import DialogActions from '@mui/material/DialogActions';
|
||||||
|
|
||||||
import DialogContent from '@mui/material/DialogContent';
|
import DialogContent from '@mui/material/DialogContent';
|
||||||
import DialogContentText from '@mui/material/DialogContentText';
|
import DialogContentText from '@mui/material/DialogContentText';
|
||||||
import DialogTitle from '@mui/material/DialogTitle';
|
import DialogTitle from '@mui/material/DialogTitle';
|
||||||
|
|
||||||
|
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import Box from '@mui/material/Box';
|
import Box from '@mui/material/Box';
|
||||||
|
|
||||||
import SelectField from "../../Report/SelectField";
|
import SelectField from "../../Report/SelectField";
|
||||||
import DatePicker from '../../Report/DatePicker'
|
import DatePicker from '../../Report/DatePicker'
|
||||||
|
|
||||||
import TimerPickerSelect from '../TimerPickerSelect'
|
import TimerPickerSelect from '../TimerPickerSelect'
|
||||||
|
|
||||||
|
// import MainHeader from "../../components/MainHeader";
|
||||||
|
// import MainHeaderButtonsWrapper from "../../components/MainHeaderButtonsWrapper";
|
||||||
|
// import TableRowSkeleton from "../../components/TableRowSkeleton";
|
||||||
|
// import Title from "../../components/Title";
|
||||||
|
|
||||||
|
|
||||||
import TextareaAutosize from '@mui/material/TextareaAutosize';
|
import TextareaAutosize from '@mui/material/TextareaAutosize';
|
||||||
|
|
||||||
import { addHours } from "date-fns";
|
import { addHours, subHours } from "date-fns";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import {
|
||||||
|
IconButton,
|
||||||
|
makeStyles,
|
||||||
|
Paper,
|
||||||
|
Table,
|
||||||
|
TableBody,
|
||||||
|
TableCell,
|
||||||
|
TableHead,
|
||||||
|
TableRow,
|
||||||
|
Typography,
|
||||||
|
} from "@material-ui/core";
|
||||||
|
|
||||||
|
const useStyles = makeStyles((theme) => ({
|
||||||
|
mainPaper: {
|
||||||
|
flex: 1,
|
||||||
|
padding: theme.spacing(1),
|
||||||
|
overflowY: "scroll",
|
||||||
|
...theme.scrollbarStyles,
|
||||||
|
},
|
||||||
|
customTableCell: {
|
||||||
|
display: "flex",
|
||||||
|
alignItems: "center",
|
||||||
|
justifyContent: "center",
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
|
||||||
const Item = (props) => {
|
const Item = (props) => {
|
||||||
|
|
||||||
|
@ -59,6 +87,7 @@ Item.propTypes = {
|
||||||
|
|
||||||
const Modal = (props) => {
|
const Modal = (props) => {
|
||||||
|
|
||||||
|
const classes = useStyles();
|
||||||
|
|
||||||
const [open, setOpen] = useState(true);
|
const [open, setOpen] = useState(true);
|
||||||
const [scroll, /*setScroll*/] = useState('body');
|
const [scroll, /*setScroll*/] = useState('body');
|
||||||
|
@ -69,6 +98,7 @@ const Modal = (props) => {
|
||||||
|
|
||||||
|
|
||||||
const [data] = useState(props.schedules)
|
const [data] = useState(props.schedules)
|
||||||
|
const [schedulesContact] = useState(props.schedulesContact)
|
||||||
|
|
||||||
const handleCancel = (event, reason) => {
|
const handleCancel = (event, reason) => {
|
||||||
|
|
||||||
|
@ -123,9 +153,9 @@ const dateCurrentFormated = () => {
|
||||||
alert('Mensagem muito curta!\nMínimo 10 caracteres.')
|
alert('Mensagem muito curta!\nMínimo 10 caracteres.')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
else if((new Date(timerPicker).getHours() > 16 && new Date(timerPicker).getMinutes() > 0) ||
|
else if((new Date(timerPicker).getHours() > 20 && new Date(timerPicker).getMinutes() > 0) ||
|
||||||
(new Date(timerPicker).getHours() < 7)){
|
(new Date(timerPicker).getHours() < 7)){
|
||||||
alert('Horário comercial inválido!\n Selecione um horário de lembrete válido entre às 07:00 e 17:00')
|
alert('Horário comercial inválido!\n Selecione um horário de lembrete válido entre às 07:00 e 20:00')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
else if(startDate === dateCurrentFormated()){
|
else if(startDate === dateCurrentFormated()){
|
||||||
|
@ -138,14 +168,19 @@ const dateCurrentFormated = () => {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// console.log('NEW DATE: ', formatedTimeHour(subHours(new Date(`${startDate} ${timerPicker.getHours()}:${timerPicker.getMinutes()}:${timerPicker.getSeconds()}`), 1))+':00')
|
||||||
|
|
||||||
|
|
||||||
props.func({
|
props.func({
|
||||||
'scheduleId': scheduleId,
|
'scheduleId': scheduleId,
|
||||||
'schedulingDate': `${startDate} ${timerPicker.getHours()}:${timerPicker.getMinutes()}:${timerPicker.getSeconds()}`,
|
// 'schedulingDate': `${startDate} ${timerPicker.getHours()}:${timerPicker.getMinutes()}:${timerPicker.getSeconds()}`,
|
||||||
|
'schedulingDate': startDate+' '+formatedTimeHour(subHours(new Date(`${startDate} ${timerPicker.getHours()}:${timerPicker.getMinutes()}:${timerPicker.getSeconds()}`), 1))+':00',
|
||||||
'message': textArea1
|
'message': textArea1
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
setOpen(false);
|
setOpen(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -177,15 +212,18 @@ const textFieldSelect = (data) => {
|
||||||
|
|
||||||
useEffect(()=>{
|
useEffect(()=>{
|
||||||
|
|
||||||
if (parseInt(timerPicker.getHours()) > 12 && parseInt(timerPicker.getHours()) < 18){
|
if (parseInt(timerPicker.getHours()) > 11 && parseInt(timerPicker.getHours()) < 18){
|
||||||
setTextArea1('Boa tarde, '+greetMessageSchedule( formatedTimeHour(addHours(new Date(timerPicker), 1))))
|
// setTextArea1('Boa tarde, '+greetMessageSchedule( formatedTimeHour(addHours(new Date(timerPicker), 1))))
|
||||||
|
setTextArea1('Boa tarde, '+greetMessageSchedule( formatedTimeHour(new Date(timerPicker), 1)))
|
||||||
}
|
}
|
||||||
else if(parseInt(timerPicker.getHours()) < 12){
|
else if(parseInt(timerPicker.getHours()) < 12){
|
||||||
setTextArea1('Bom dia, '+greetMessageSchedule( formatedTimeHour(addHours(new Date(timerPicker), 1))))
|
// setTextArea1('Bom dia, '+greetMessageSchedule( formatedTimeHour(addHours(new Date(timerPicker), 1))))
|
||||||
|
setTextArea1('Bom dia, '+greetMessageSchedule( formatedTimeHour(new Date(timerPicker), 1)))
|
||||||
}
|
}
|
||||||
else if(parseInt(timerPicker.getHours()) > 18){
|
else if(parseInt(timerPicker.getHours()) > 17){
|
||||||
|
|
||||||
setTextArea1('Boa noite, '+greetMessageSchedule( formatedTimeHour(addHours(new Date(timerPicker), 1))))
|
// setTextArea1('Boa noite, '+greetMessageSchedule( formatedTimeHour(addHours(new Date(timerPicker), 1))))
|
||||||
|
setTextArea1('Boa noite, '+greetMessageSchedule( formatedTimeHour(new Date(timerPicker), 1)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -281,6 +319,93 @@ const handleChange = (event) => {
|
||||||
|
|
||||||
</Item>
|
</Item>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{/* <Item>
|
||||||
|
<MainHeader>
|
||||||
|
<Title>Titulo 1</Title>
|
||||||
|
<MainHeaderButtonsWrapper>
|
||||||
|
<Button
|
||||||
|
variant="contained"
|
||||||
|
color="primary"
|
||||||
|
// onClick={handleOpenQueueModal}
|
||||||
|
>
|
||||||
|
buttons add
|
||||||
|
</Button>
|
||||||
|
</MainHeaderButtonsWrapper>
|
||||||
|
</MainHeader>
|
||||||
|
<Paper variant="outlined">
|
||||||
|
<Table size="small">
|
||||||
|
<TableHead>
|
||||||
|
<TableRow>
|
||||||
|
<TableCell align="center">
|
||||||
|
table name
|
||||||
|
</TableCell>
|
||||||
|
<TableCell align="center">
|
||||||
|
table color
|
||||||
|
</TableCell>
|
||||||
|
<TableCell align="center">
|
||||||
|
table greeting
|
||||||
|
</TableCell>
|
||||||
|
<TableCell align="center">
|
||||||
|
table actions
|
||||||
|
</TableCell>
|
||||||
|
</TableRow>
|
||||||
|
</TableHead>
|
||||||
|
<TableBody>
|
||||||
|
<>
|
||||||
|
{schedulesContact.map((queue) => (
|
||||||
|
<TableRow key={queue.id}>
|
||||||
|
<TableCell align="center">{queue.name}</TableCell>
|
||||||
|
<TableCell align="center">
|
||||||
|
<div className={classes.customTableCell}>
|
||||||
|
<span
|
||||||
|
style={{
|
||||||
|
backgroundColor: queue.color,
|
||||||
|
width: 60,
|
||||||
|
height: 20,
|
||||||
|
alignSelf: "center",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</TableCell>
|
||||||
|
<TableCell align="center">
|
||||||
|
<div className={classes.customTableCell}>
|
||||||
|
<Typography
|
||||||
|
style={{ width: 300, align: "center" }}
|
||||||
|
noWrap
|
||||||
|
variant="body2"
|
||||||
|
>
|
||||||
|
{queue.greetingMessage}
|
||||||
|
</Typography>
|
||||||
|
</div>
|
||||||
|
</TableCell>
|
||||||
|
<TableCell align="center">
|
||||||
|
<IconButton
|
||||||
|
size="small"
|
||||||
|
// onClick={() => handleEditQueue(queue)}
|
||||||
|
>
|
||||||
|
<Edit />
|
||||||
|
</IconButton>
|
||||||
|
|
||||||
|
<IconButton
|
||||||
|
size="small"
|
||||||
|
onClick={() => {
|
||||||
|
setSelectedQueue(queue);
|
||||||
|
setConfirmModalOpen(true);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<DeleteOutline />
|
||||||
|
</IconButton>
|
||||||
|
</TableCell>
|
||||||
|
</TableRow>
|
||||||
|
))}
|
||||||
|
{loading && <TableRowSkeleton columns={4} />}
|
||||||
|
</>
|
||||||
|
</TableBody>
|
||||||
|
</Table>
|
||||||
|
</Paper>
|
||||||
|
|
||||||
|
</Item> */}
|
||||||
|
|
||||||
</Box>
|
</Box>
|
||||||
</DialogContent>
|
</DialogContent>
|
||||||
|
|
|
@ -8,6 +8,9 @@ import {
|
||||||
KeyboardDatePicker,
|
KeyboardDatePicker,
|
||||||
MuiPickersUtilsProvider,
|
MuiPickersUtilsProvider,
|
||||||
} from '@material-ui/pickers';
|
} from '@material-ui/pickers';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
import ptBrLocale from "date-fns/locale/pt-BR";
|
import ptBrLocale from "date-fns/locale/pt-BR";
|
||||||
|
|
||||||
|
|
|
@ -84,6 +84,7 @@ const Ticket = () => {
|
||||||
const [ticket, setTicket] = useState({});
|
const [ticket, setTicket] = useState({});
|
||||||
|
|
||||||
const [schedule, setSchedule] = useState({})
|
const [schedule, setSchedule] = useState({})
|
||||||
|
const [schedulesContact, setSchedulesContact] = useState({})
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
|
@ -98,10 +99,13 @@ const Ticket = () => {
|
||||||
// setContact(data.contact);
|
// setContact(data.contact);
|
||||||
// setTicket(data);
|
// setTicket(data);
|
||||||
|
|
||||||
|
console.log('SCHEDULE CONTACT: ',data.schedulesContact)
|
||||||
|
|
||||||
setContact(data.contact.contact);
|
setContact(data.contact.contact);
|
||||||
setTicket(data.contact);
|
setTicket(data.contact);
|
||||||
|
|
||||||
setSchedule(data.schedules)
|
setSchedule(data.schedules)
|
||||||
|
setSchedulesContact(data.schedulesContact)
|
||||||
|
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
@ -172,7 +176,7 @@ const Ticket = () => {
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className={classes.ticketActionButtons}>
|
<div className={classes.ticketActionButtons}>
|
||||||
<TicketActionButtons ticket={ticket} schedule={schedule}/>
|
<TicketActionButtons ticket={ticket} schedule={schedule} schedulesContact={schedulesContact}/>
|
||||||
</div>
|
</div>
|
||||||
</TicketHeader>
|
</TicketHeader>
|
||||||
<ReplyMessageProvider>
|
<ReplyMessageProvider>
|
||||||
|
|
|
@ -27,7 +27,7 @@ const useStyles = makeStyles(theme => ({
|
||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const TicketActionButtons = ({ ticket, schedule }) => {
|
const TicketActionButtons = ({ ticket, schedule, schedulesContact }) => {
|
||||||
const classes = useStyles();
|
const classes = useStyles();
|
||||||
const history = useHistory();
|
const history = useHistory();
|
||||||
const [anchorEl, setAnchorEl] = useState(null);
|
const [anchorEl, setAnchorEl] = useState(null);
|
||||||
|
@ -65,6 +65,7 @@ const TicketActionButtons = ({ ticket, schedule }) => {
|
||||||
modal_header={'Finalização de Atendimento'}
|
modal_header={'Finalização de Atendimento'}
|
||||||
func={chatEndVal}
|
func={chatEndVal}
|
||||||
schedules={schedule}
|
schedules={schedule}
|
||||||
|
schedulesContact={schedulesContact}
|
||||||
/>)
|
/>)
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue