From a3be6063c4a64f3278664d7d798fc43c33b41160 Mon Sep 17 00:00:00 2001 From: adriano Date: Thu, 19 May 2022 18:29:38 -0300 Subject: [PATCH] =?UTF-8?q?Codifica=C3=A7ao=20do=20recurso=20opcional=20de?= =?UTF-8?q?=20finaliza=C3=A7=C3=A3o=20de=20atendimento=20e=20inclu=C3=A7?= =?UTF-8?q?=C3=A3o=20do=20status=20de=20encerramento=20de=20atendimento?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/controllers/TicketController.ts | 163 ++-- ...631-add-statusChatEnd-column-to-tickets.ts | 15 + backend/src/models/Ticket.ts | 6 +- .../MessageServices/ShowMessageReport.ts | 2 +- .../ShowStatusChatEndService.ts | 14 + .../TicketServices/ShowTicketReport.ts | 2 +- .../TicketServices/UpdateTicketService.ts | 6 +- .../components/ChatEnd/ModalChatEnd/index.js | 747 +++++++++--------- frontend/src/pages/Report/index.js | 18 +- 9 files changed, 519 insertions(+), 454 deletions(-) create mode 100644 backend/src/database/migrations/20220519160631-add-statusChatEnd-column-to-tickets.ts create mode 100644 backend/src/services/StatusChatEndService/ShowStatusChatEndService.ts diff --git a/backend/src/controllers/TicketController.ts b/backend/src/controllers/TicketController.ts index ec84079..c191413 100644 --- a/backend/src/controllers/TicketController.ts +++ b/backend/src/controllers/TicketController.ts @@ -3,22 +3,23 @@ import { getIO } from "../libs/socket"; import CreateTicketService from "../services/TicketServices/CreateTicketService"; import DeleteTicketService from "../services/TicketServices/DeleteTicketService"; -import ListTicketsService from "../services/TicketServices/ListTicketsService"; +import ListTicketsService from "../services/TicketServices/ListTicketsService"; import ShowTicketService from "../services/TicketServices/ShowTicketService"; import UpdateTicketService from "../services/TicketServices/UpdateTicketService"; import SendWhatsAppMessage from "../services/WbotServices/SendWhatsAppMessage"; import ShowWhatsAppService from "../services/WhatsappService/ShowWhatsAppService"; +import ShowStatusChatEndService from '../services/StatusChatEndService/ShowStatusChatEndService' -import CreateSchedulingNotifyService from "../services/SchedulingNotifyServices/CreateSchedulingNotifyService"; -import ListSchedulingNotifyContactService from "../services/SchedulingNotifyServices/ListSchedulingNotifyContactService"; - -import {isScheduling} from "../helpers/CheckSchedulingReminderNotify" +import CreateSchedulingNotifyService from "../services/SchedulingNotifyServices/CreateSchedulingNotifyService"; +import ListSchedulingNotifyContactService from "../services/SchedulingNotifyServices/ListSchedulingNotifyContactService"; + +import { isScheduling } from "../helpers/CheckSchedulingReminderNotify" import ptBR from 'date-fns/locale/pt-BR'; import { splitDateTime } from "../helpers/SplitDateTime"; import format from 'date-fns/format'; - + type IndexQuery = { searchParam: string; @@ -36,10 +37,10 @@ interface TicketData { status: string; queueId: number; userId: number; -} +} -import ListStatusChatEndService from "../services/StatusChatEndService/ListStatusChatEndService"; +import ListStatusChatEndService from "../services/StatusChatEndService/ListStatusChatEndService"; import Ticket from "../models/Ticket"; import ShowUserServiceReport from "../services/UserServices/ShowUserServiceReport"; import TicketEmiterSumOpenClosedByUser from "../helpers/OnlineReporEmiterInfoByUser"; @@ -56,15 +57,15 @@ export const index = async (req: Request, res: Response): Promise => { unlimited } = req.query as IndexQuery; - - const userId = req.user.id; + + const userId = req.user.id; let queueIds: number[] = []; if (queueIdsStringified) { queueIds = JSON.parse(queueIdsStringified); - } + } const { tickets, count, hasMore } = await ListTicketsService({ searchParam, @@ -77,7 +78,7 @@ export const index = async (req: Request, res: Response): Promise => { withUnreadMessages, unlimited }); - + return res.status(200).json({ tickets, count, hasMore }); }; @@ -88,28 +89,28 @@ export const store = async (req: Request, res: Response): Promise => { // console.log( // `contactId: ${contactId} \n| status: ${status} \n| userId: ${userId}` // ) - - - // test del - let ticket = await Ticket.findOne({where: { contactId, status: 'queueChoice' } }); - - if(ticket){ - await UpdateTicketService({ ticketData: { status: 'open',userId: userId,}, ticketId: ticket.id}); - console.log('TICKET QUEUE CHOICE !!!!!!!') - } - else{ - ticket = await CreateTicketService({ contactId, status, userId }); - } - - const io = getIO(); - io.to(ticket.status).emit("ticket", { - action: "update", - ticket - }); - // -// const ticket = await CreateTicketService({ contactId, status, userId }); + // test del + let ticket = await Ticket.findOne({ where: { contactId, status: 'queueChoice' } }); + + if (ticket) { + await UpdateTicketService({ ticketData: { status: 'open', userId: userId, }, ticketId: ticket.id }); + console.log('TICKET QUEUE CHOICE !!!!!!!') + } + else { + ticket = await CreateTicketService({ contactId, status, userId }); + } + + const io = getIO(); + io.to(ticket.status).emit("ticket", { + action: "update", + ticket + }); + // + + + // const ticket = await CreateTicketService({ contactId, status, userId }); // const io = getIO(); // io.to(ticket.status).emit("ticket", { @@ -119,21 +120,21 @@ export const store = async (req: Request, res: Response): Promise => { return res.status(200).json(ticket); }; - + export const show = async (req: Request, res: Response): Promise => { const { ticketId } = req.params; const contact = await ShowTicketService(ticketId); - const { statusChatEnd, count, hasMore } = await ListStatusChatEndService({ searchParam: "", pageNumber: "1" }); - - ////////////////// - const schedulesContact = await ListSchedulingNotifyContactService(contact.contact.number); - ///////////////// - + const { statusChatEnd, count, hasMore } = await ListStatusChatEndService({ searchParam: "", pageNumber: "1" }); - return res.status(200).json({contact, statusChatEnd, schedulesContact}); + ////////////////// + const schedulesContact = await ListSchedulingNotifyContactService(contact.contact.number); + ///////////////// + + + return res.status(200).json({ contact, statusChatEnd, schedulesContact }); }; @@ -142,68 +143,74 @@ export const show = async (req: Request, res: Response): Promise => { -export const update = async ( req: Request, res: Response ): Promise => { +export const update = async (req: Request, res: Response): Promise => { const { ticketId } = req.params; - const userOldInfo = await Ticket.findByPk(ticketId) + const userOldInfo = await Ticket.findByPk(ticketId) let ticket2 = {} - - if(req.body['status'] === "closed"){ - const {status, userId, schedulingNotifyData} = req.body; + if (req.body['status'] === "closed") { + + const { status, userId, schedulingNotifyData } = req.body; + + // lembrete + const scheduleData = JSON.parse(schedulingNotifyData) + + const statusChatEndName = await ShowStatusChatEndService(scheduleData.statusChatEndId) const { ticket } = await UpdateTicketService({ - ticketData:{'status': status, 'userId': userId}, + ticketData: { 'status': status, 'userId': userId, 'statusChatEnd': statusChatEndName.name }, ticketId }); - - /////////////////////////////// - const whatsapp = await ShowWhatsAppService(ticket.whatsappId); - const { farewellMessage } = whatsapp; + console.log('------- scheduleData.farewellMessage: ', scheduleData.farewellMessage) - if (farewellMessage) { - await SendWhatsAppMessage({ body: farewellMessage, ticket }); - } - /////////////////////////////// + if (scheduleData.farewellMessage) { + const whatsapp = await ShowWhatsAppService(ticket.whatsappId); - + const { farewellMessage } = whatsapp; + + if (farewellMessage) { + await SendWhatsAppMessage({ body: farewellMessage, ticket }); + } + } + + /////////////////////////////// + + + // lembrete // agendamento + if (scheduleData.statusChatEndId === '2' || scheduleData.statusChatEndId === '3') { - // lembrete - const scheduleData = JSON.parse(schedulingNotifyData) - // lembrete // agendamento - if( scheduleData.statusChatEndId === '2' || scheduleData.statusChatEndId === '3'){ - console.log('*** schedulingDate: ', scheduleData.schedulingDate) console.log('*** schedulingTime: ', scheduleData.schedulingTime) - if(isScheduling(scheduleData.schedulingDate, scheduleData.schedulingTime)){ + if (isScheduling(scheduleData.schedulingDate, scheduleData.schedulingTime)) { console.log('*** É AGENDAMENTO!') } - else{ + else { console.log('*** É LEMBRETE!') } const schedulingNotifyCreate = await CreateSchedulingNotifyService( { ticketId: scheduleData.ticketId, - statusChatEndId: scheduleData.statusChatEndId, - schedulingDate: scheduleData.schedulingDate, + statusChatEndId: scheduleData.statusChatEndId, + schedulingDate: scheduleData.schedulingDate, schedulingTime: scheduleData.schedulingTime, - message: scheduleData.message + message: scheduleData.message } - ) + ) } - + ticket2 = ticket } - else{ + else { const ticketData: TicketData = req.body; @@ -216,23 +223,23 @@ export const update = async ( req: Request, res: Response ): Promise = ticket2 = ticket - } + } // test del - if(userOldInfo){ + if (userOldInfo) { - const dateToday = splitDateTime(new Date(format(new Date(), 'yyyy-MM-dd HH:mm:ss', { locale: ptBR }))) + const dateToday = splitDateTime(new Date(format(new Date(), 'yyyy-MM-dd HH:mm:ss', { locale: ptBR }))) - if(userOldInfo.userId){ - - TicketEmiterSumOpenClosedByUser(userOldInfo.userId.toString(), dateToday.fullDate, dateToday.fullDate) - } + if (userOldInfo.userId) { - } + TicketEmiterSumOpenClosedByUser(userOldInfo.userId.toString(), dateToday.fullDate, dateToday.fullDate) + } - // + } + + // return res.status(200).json(ticket2); }; @@ -273,7 +280,7 @@ export const remove = async ( res: Response ): Promise => { const { ticketId } = req.params; - + const ticket = await DeleteTicketService(ticketId); const io = getIO(); diff --git a/backend/src/database/migrations/20220519160631-add-statusChatEnd-column-to-tickets.ts b/backend/src/database/migrations/20220519160631-add-statusChatEnd-column-to-tickets.ts new file mode 100644 index 0000000..415e159 --- /dev/null +++ b/backend/src/database/migrations/20220519160631-add-statusChatEnd-column-to-tickets.ts @@ -0,0 +1,15 @@ +import { QueryInterface, DataTypes } from "sequelize"; + +module.exports = { + up: (queryInterface: QueryInterface) => { + return queryInterface.addColumn("Tickets", "statusChatEnd", { + type: DataTypes.STRING, + allowNull: true, + defaultValue: '' + }); + }, + + down: (queryInterface: QueryInterface) => { + return queryInterface.removeColumn("Tickets", "statusChatEnd"); + } +}; diff --git a/backend/src/models/Ticket.ts b/backend/src/models/Ticket.ts index 72370e5..0cd6888 100644 --- a/backend/src/models/Ticket.ts +++ b/backend/src/models/Ticket.ts @@ -10,7 +10,8 @@ import { HasMany, HasOne, AutoIncrement, - Default + Default, + DataType } from "sequelize-typescript"; import Contact from "./Contact"; @@ -41,6 +42,9 @@ class Ticket extends Model { @Column isGroup: boolean; + @Column + statusChatEnd: string; + @CreatedAt createdAt: Date; diff --git a/backend/src/services/MessageServices/ShowMessageReport.ts b/backend/src/services/MessageServices/ShowMessageReport.ts index 886258d..69f80ed 100644 --- a/backend/src/services/MessageServices/ShowMessageReport.ts +++ b/backend/src/services/MessageServices/ShowMessageReport.ts @@ -60,7 +60,7 @@ const ShowMessageReport = async (id: string | number, startDate: string, endDate where: where_clause_user, required:true, - attributes: ['id', 'status'], + attributes: ['id', 'status', 'statusChatEnd'], include: [ { diff --git a/backend/src/services/StatusChatEndService/ShowStatusChatEndService.ts b/backend/src/services/StatusChatEndService/ShowStatusChatEndService.ts new file mode 100644 index 0000000..12c6aaf --- /dev/null +++ b/backend/src/services/StatusChatEndService/ShowStatusChatEndService.ts @@ -0,0 +1,14 @@ +import StatusChatEnd from "../../models/StatusChatEnd"; +import AppError from "../../errors/AppError"; + +const ShowStatusChatEndService = async (id: string | number): Promise => { + const status = await StatusChatEnd.findByPk(id, { attributes: ['id', 'name'], }); + + if (!status) { + throw new AppError("ERR_NO_STATUS_FOUND", 404); + } + + return status; +}; + +export default ShowStatusChatEndService; \ No newline at end of file diff --git a/backend/src/services/TicketServices/ShowTicketReport.ts b/backend/src/services/TicketServices/ShowTicketReport.ts index 34ba418..835922b 100644 --- a/backend/src/services/TicketServices/ShowTicketReport.ts +++ b/backend/src/services/TicketServices/ShowTicketReport.ts @@ -47,7 +47,7 @@ const ShowTicketReport = async (id: string | number, startDate: string, endDate: where: where_clause , //attributes: ['id', 'status', 'createdAt', 'updatedAt'], - attributes: ['id', 'status', [Sequelize.fn("DATE_FORMAT",Sequelize.col("Ticket.createdAt"),"%d/%m/%Y %H:%i:%s"),"createdAt"], + 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: [ diff --git a/backend/src/services/TicketServices/UpdateTicketService.ts b/backend/src/services/TicketServices/UpdateTicketService.ts index 3efc5db..598b063 100644 --- a/backend/src/services/TicketServices/UpdateTicketService.ts +++ b/backend/src/services/TicketServices/UpdateTicketService.ts @@ -10,6 +10,7 @@ interface TicketData { status?: string; userId?: number; queueId?: number; + statusChatEnd?: string } interface Request { @@ -27,7 +28,7 @@ const UpdateTicketService = async ({ ticketData, ticketId }: Request): Promise => { - const { status, userId, queueId } = ticketData; + const { status, userId, queueId, statusChatEnd } = ticketData; const ticket = await ShowTicketService(ticketId); await SetTicketMessagesAsRead(ticket); @@ -42,7 +43,8 @@ const UpdateTicketService = async ({ await ticket.update({ status, queueId, - userId + userId, + statusChatEnd }); diff --git a/frontend/src/components/ChatEnd/ModalChatEnd/index.js b/frontend/src/components/ChatEnd/ModalChatEnd/index.js index b6edf6d..7f95d6a 100644 --- a/frontend/src/components/ChatEnd/ModalChatEnd/index.js +++ b/frontend/src/components/ChatEnd/ModalChatEnd/index.js @@ -1,34 +1,35 @@ - + import React, { useState, useEffect, useRef, useReducer } from 'react'; import Button from '@mui/material/Button'; import Dialog from '@mui/material/Dialog'; -import DialogActions from '@mui/material/DialogActions'; +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 DialogTitle from '@mui/material/DialogTitle'; import PropTypes from 'prop-types'; -import Box from '@mui/material/Box'; -import SelectField from "../../Report/SelectField"; -import DatePicker from '../../Report/DatePicker' -import TimerPickerSelect from '../TimerPickerSelect' -import TextareaAutosize from '@mui/material/TextareaAutosize'; +import Box from '@mui/material/Box'; +import SelectField from "../../Report/SelectField"; +import DatePicker from '../../Report/DatePicker' +import TimerPickerSelect from '../TimerPickerSelect' +import TextareaAutosize from '@mui/material/TextareaAutosize'; -import { subHours, addDays, subDays} from "date-fns"; +import { subHours, addDays, subDays } from "date-fns"; import TextFieldSelectHourBefore from '@mui/material/TextField'; -import MenuItem from '@mui/material/MenuItem'; - +import MenuItem from '@mui/material/MenuItem'; - - import api from "../../../services/api"; -import toastError from "../../../errors/toastError"; +import Checkbox from '@mui/material/Checkbox'; +import FormControlLabel from "@mui/material/FormControlLabel"; + +import api from "../../../services/api"; +import toastError from "../../../errors/toastError"; -const reducer = (state, action) => { - +const reducer = (state, action) => { + if (action.type === "LOAD_SCHEDULES") { const schedulesContact = action.payload; - const newSchedules= []; + const newSchedules = []; schedulesContact.forEach((schedule) => { const scheduleIndex = state.findIndex((s) => s.id === schedule.id); @@ -56,10 +57,10 @@ const reducer = (state, action) => { } }; - + const Item = (props) => { - + const { sx, ...other } = props; return ( { + + +const Modal = (props) => { // const [clientSchedules, dispatch] = useReducer(reducer, []); // const [selectedSchedule, setSelectedSchedule] = useState(null); const [open, setOpen] = useState(true); const [scroll, /*setScroll*/] = useState('body'); - const [statusChatEndId, setStatusChatEnd] = useState(null) - const [startDate, setDatePicker] = useState(new Date()) - const [timerPicker, setTimerPicker] = useState(new Date()) - const [textArea1, setTextArea1] = useState() - const [schedulesContact, dispatch] = useReducer(reducer, []); + const [statusChatEndId, setStatusChatEnd] = useState(null) + const [startDate, setDatePicker] = useState(new Date()) + const [timerPicker, setTimerPicker] = useState(new Date()) + const [textArea1, setTextArea1] = useState() + const [schedulesContact, dispatch] = useReducer(reducer, []); const [currencyHourBefore, setCurrency] = useState(null); - const [currenciesTimeBefore, setCurrenciesTimeBefore] = useState(null); - - + const [currenciesTimeBefore, setCurrenciesTimeBefore] = useState(null); + + const [checked, setChecked] = useState(false); + + const handleCancel = (event, reason) => { - if (reason && reason === "backdropClick") - return; - + if (reason && reason === "backdropClick") + return; + setOpen(false); }; - - useEffect(() => { - - (async () => { - try { - const { data } = await api.get("/tickets/" + props.ticketId); - + useEffect(() => { + + (async () => { + try { + + const { data } = await api.get("/tickets/" + props.ticketId); + dispatch({ type: "LOAD_SCHEDULES", payload: data.schedulesContact }); - + } catch (err) { - toastError(err); + toastError(err); } })(); - }, [props]); - - - function formatedTimeHour(timer){ - return `${timer.getHours().toString().padStart(2, '0')}:${timer.getMinutes().toString().padStart(2, '0')}` + }, [props]); + + + function formatedTimeHour(timer) { + return `${timer.getHours().toString().padStart(2, '0')}:${timer.getMinutes().toString().padStart(2, '0')}` } - function formatedFullCurrentDate(){ - let dateCurrent = new Date() + function formatedFullCurrentDate() { + let dateCurrent = new Date() let day = dateCurrent.getDate().toString().padStart(2, '0'); - let month = (dateCurrent.getMonth()+1).toString().padStart(2, '0'); - let year = dateCurrent.getFullYear(); - return `${year}-${month}-${day}`; + let month = (dateCurrent.getMonth() + 1).toString().padStart(2, '0'); + let year = dateCurrent.getFullYear(); + return `${year}-${month}-${day}`; } - - - + + + // const handleDeleteSchedule = async (scheduleId) => { // try { @@ -161,217 +164,218 @@ const Modal = (props) => { // }; // Get from child 2 -const datePickerValue = (data) => { - console.log('datePickerValue: ',(data)); - setDatePicker(data) + const datePickerValue = (data) => { + console.log('datePickerValue: ', (data)); + setDatePicker(data) - -} -// Get from child 3 -const timerPickerValue = (data) => { - console.log('timerPickerValue: ',(data)); - setTimerPicker(data) - - -} - - const dateCurrentFormated = (dateF=null) => { - - let date =null - - if(dateF){ - date = new Date(dateF) - } - else{ - date = new Date(); } - let day = date.getDate().toString().padStart(2, '0'); - let month = (date.getMonth()+1).toString().padStart(2, '0'); - let year = date.getFullYear(); - - return `${year}-${month}-${day}` + // Get from child 3 + const timerPickerValue = (data) => { + console.log('timerPickerValue: ', (data)); + setTimerPicker(data) -} - const handleChatEnd = (event, reason) => { - - let dataSendServer = {'statusChatEndId': statusChatEndId} + } - if (reason && reason === "backdropClick") - return; + const dateCurrentFormated = (dateF = null) => { - if (statusChatEndId === '2' || statusChatEndId === '3'){ + let date = null + + if (dateF) { + date = new Date(dateF) + } + else { + date = new Date(); + } + + let day = date.getDate().toString().padStart(2, '0'); + let month = (date.getMonth() + 1).toString().padStart(2, '0'); + let year = date.getFullYear(); + + return `${year}-${month}-${day}` + + } + + const handleChatEnd = (event, reason) => { + + let dataSendServer = { 'statusChatEndId': statusChatEndId, 'farewellMessage':checked } + + if (reason && reason === "backdropClick") + return; + + if (statusChatEndId === '2' || statusChatEndId === '3') { console.log('Entrou! textArea1: ', textArea1) - - if( startDate.trim().length === 0){ + + if (startDate.trim().length === 0) { alert('Selecione uma data atual ou futura!') - - return - } - else if(textArea1 && textArea1.trim().length<5){ - alert('Mensagem muito curta!') return } - else if(!textArea1){ + + else if (textArea1 && textArea1.trim().length < 5) { + alert('Mensagem muito curta!') + return + } + else if (!textArea1) { alert('Defina uma mensagem para enviar para o cliente!') return } - else if(formatedFullCurrentDate()===startDate && + else if (formatedFullCurrentDate() === startDate && ((new Date(timerPicker).getHours() < new Date().getHours() && new Date(timerPicker).getMinutes() <= new Date().getMinutes()) || - (new Date(timerPicker).getHours() === new Date().getHours() && new Date(timerPicker).getMinutes() <= new Date().getMinutes()) || - (new Date(timerPicker).getHours() < new Date().getHours() && new Date(timerPicker).getMinutes() >= new Date().getMinutes()) || - (new Date(timerPicker).getHours() < new Date().getHours))){ - alert('Horário menor ou igual horário atual!') - return + (new Date(timerPicker).getHours() === new Date().getHours() && new Date(timerPicker).getMinutes() <= new Date().getMinutes()) || + (new Date(timerPicker).getHours() < new Date().getHours() && new Date(timerPicker).getMinutes() >= new Date().getMinutes()) || + (new Date(timerPicker).getHours() < new Date().getHours))) { + alert('Horário menor ou igual horário atual!') + return } - else if((new Date(timerPicker).getHours() > 20 && new Date(timerPicker).getMinutes() > 0) || - (new Date(timerPicker).getHours() < 6)){ + else if ((new Date(timerPicker).getHours() > 20 && new Date(timerPicker).getMinutes() > 0) || + (new Date(timerPicker).getHours() < 6)) { alert('Horário comercial inválido!\n Selecione um horário de lembrete válido entre às 06:00 e 20:00') return - } - + } + let dateSendMessage = startDate let timeBefore = formatedTimeHour(new Date(`${startDate} ${timerPicker.getHours()}:${timerPicker.getMinutes()}:00`)) - if(statusChatEndId === '3'){ + if (statusChatEndId === '3') { - if(!currencyHourBefore){ + if (!currencyHourBefore) { alert('Para agendamentos do dia corrente, essa funcionalidade atende a agendeamentos com no mínimo 2 horas adiantado a partir da hora atual!') - return - } + return + } timeBefore = currencyHourBefore let sendMessageDayBefore = currenciesTimeBefore.filter(i => i.label.indexOf('24 HORAS ANTES DO HORÁRIO DO AGENDAMENTO') >= 0); - if(sendMessageDayBefore.length > 0 && timeBefore === formatedTimeHour(timerPicker)) - { + if (sendMessageDayBefore.length > 0 && timeBefore === formatedTimeHour(timerPicker)) { console.log('ENVIAR MENSAGEM UM DIA ANTES!') - console.log('MENSAGEM SERÁ ENVIA NO DIA: ', dateCurrentFormated( new Date(subDays(new Date(startDate+' '+formatedTimeHour(new Date(`${startDate} ${timerPicker.getHours()}:${timerPicker.getMinutes()}:00`))), 1)))) - - dateSendMessage = dateCurrentFormated( new Date(subDays(new Date(startDate+' '+formatedTimeHour(new Date(`${startDate} ${timerPicker.getHours()}:${timerPicker.getMinutes()}:00`))), 1))) - } - + console.log('MENSAGEM SERÁ ENVIA NO DIA: ', dateCurrentFormated(new Date(subDays(new Date(startDate + ' ' + formatedTimeHour(new Date(`${startDate} ${timerPicker.getHours()}:${timerPicker.getMinutes()}:00`))), 1)))) - console.log('AGENDAMENTO ENVIO MENSAGEM1: ', `${dateSendMessage} ${timeBefore}:00` ) + dateSendMessage = dateCurrentFormated(new Date(subDays(new Date(startDate + ' ' + formatedTimeHour(new Date(`${startDate} ${timerPicker.getHours()}:${timerPicker.getMinutes()}:00`))), 1))) + } + + + console.log('AGENDAMENTO ENVIO MENSAGEM1: ', `${dateSendMessage} ${timeBefore}:00`) + + } else if (statusChatEndId === '2') { + + console.log('AGENDAMENTO ENVIO MENSAGEM2: ', startDate + ' ' + formatedTimeHour(new Date(`${startDate} ${timerPicker.getHours()}:${timerPicker.getMinutes()}:00`))) - } else if (statusChatEndId === '2'){ - - console.log('AGENDAMENTO ENVIO MENSAGEM2: ', startDate+' '+formatedTimeHour(new Date(`${startDate} ${timerPicker.getHours()}:${timerPicker.getMinutes()}:00`)) ) - } - dataSendServer = { - 'statusChatEndId': statusChatEndId, - 'schedulingDate': startDate+' '+formatedTimeHour(new Date(`${startDate} ${timerPicker.getHours()}:${timerPicker.getMinutes()}`))+':00', - 'schedulingTime': `${dateSendMessage} ${timeBefore}:00`, - 'message': textArea1 + dataSendServer = { + 'statusChatEndId': statusChatEndId, + 'schedulingDate': startDate + ' ' + formatedTimeHour(new Date(`${startDate} ${timerPicker.getHours()}:${timerPicker.getMinutes()}`)) + ':00', + 'schedulingTime': `${dateSendMessage} ${timeBefore}:00`, + 'message': textArea1 } - - } - - - props.func(dataSendServer) + + } + + + props.func(dataSendServer) setOpen(false); }; - - useEffect(()=>{ - const hoursBeforeAvalible = (timer) =>{ - + useEffect(() => { + + const hoursBeforeAvalible = (timer) => { + let hours = [] - let hour = 1 + let hour = 1 - console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>> startDate: ', startDate ) - console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>> dateCurrentFormated: ', dateCurrentFormated() ) - console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>> startDate: ',typeof(startDate) ) - console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>> startDate: ',(startDate) ) - - if(typeof(startDate)==='string' && startDate.trim().length>0 && startDate === dateCurrentFormated()){ - - console.log('HOJE++++') - - while(subHours(timer, hour).getHours()>=6 && + console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>> startDate: ', startDate) + console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>> dateCurrentFormated: ', dateCurrentFormated()) + console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>> startDate: ', typeof (startDate)) + console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>> startDate: ', (startDate)) - subHours(timer, hour).getHours()>=new Date().getHours() && - subHours(timer, hour).getHours()<=20){ - - console.log('******** TIMER: ', formatedTimeHour(subHours(timer,hour))) - - hours.push({value: formatedTimeHour(subHours(timer,hour)), label: `${hour} HORA ANTES DO HORÁRIO DO AGENDAMENTO`}) - - hour++; - } - - if(hours.length>1){ - console.log('entrou----------------------: ', hours.length) - hours.pop() - setCurrency(hours[0].value) - } - else{ - setCurrency(null) - } - - } - else{ - - while(subHours(timer, hour).getHours()>=6 && subHours(timer, hour).getHours()<=20){ - - console.log('******** another day TIMER: ', formatedTimeHour(subHours(timer,hour))) - - hours.push( - {value: formatedTimeHour(subHours(timer,hour)), - label: `${hour} HORA ANTES DO HORÁRIO DO AGENDAMENTO`}) - - hour++; - } - - if(hours.length>0){ - console.log('entrou----------------------: ', hours.length) - setCurrency(hours[0].value) - } - else{ - setCurrency(null) - } - + if (typeof (startDate) === 'string' && startDate.trim().length > 0 && startDate === dateCurrentFormated()) { + + console.log('HOJE++++') + + while (subHours(timer, hour).getHours() >= 6 && + + subHours(timer, hour).getHours() >= new Date().getHours() && + subHours(timer, hour).getHours() <= 20) { + + console.log('******** TIMER: ', formatedTimeHour(subHours(timer, hour))) + + hours.push({ value: formatedTimeHour(subHours(timer, hour)), label: `${hour} HORA ANTES DO HORÁRIO DO AGENDAMENTO` }) + + hour++; } - - if(new Date(startDate) > addDays(new Date(), 1) ){ - - hours.push({value: formatedTimeHour(timerPicker) , label: `24 HORAS ANTES DO HORÁRIO DO AGENDAMENTO`}) - - console.log('#subDays: ', dateCurrentFormated( new Date(subDays(new Date(startDate+' '+formatedTimeHour(new Date(`${startDate} ${timerPicker.getHours()}:${timerPicker.getMinutes()}:00`))), 1)))) - + if (hours.length > 1) { + console.log('entrou----------------------: ', hours.length) + hours.pop() + setCurrency(hours[0].value) + } + else { + setCurrency(null) } - console.log('hourshourshourshourshourshourshourshourshourshourshourshours ', hours) - - - return {time: hours, hour:hour} - + } + else { + + while (subHours(timer, hour).getHours() >= 6 && subHours(timer, hour).getHours() <= 20) { + + console.log('******** another day TIMER: ', formatedTimeHour(subHours(timer, hour))) + + hours.push( + { + value: formatedTimeHour(subHours(timer, hour)), + label: `${hour} HORA ANTES DO HORÁRIO DO AGENDAMENTO` + }) + + hour++; + } + + if (hours.length > 0) { + console.log('entrou----------------------: ', hours.length) + setCurrency(hours[0].value) + } + else { + setCurrency(null) + } + + } + + + if (new Date(startDate) > addDays(new Date(), 1)) { + + hours.push({ value: formatedTimeHour(timerPicker), label: `24 HORAS ANTES DO HORÁRIO DO AGENDAMENTO` }) + + console.log('#subDays: ', dateCurrentFormated(new Date(subDays(new Date(startDate + ' ' + formatedTimeHour(new Date(`${startDate} ${timerPicker.getHours()}:${timerPicker.getMinutes()}:00`))), 1)))) + + } + + console.log('hourshourshourshourshourshourshourshourshourshourshourshours ', hours) + + + return { time: hours, hour: hour } + } console.log('===================================== addDays: ', addDays(new Date(), 1)) - - - - setCurrenciesTimeBefore(hoursBeforeAvalible(timerPicker).time) - - },[timerPicker, startDate]) + + + + setCurrenciesTimeBefore(hoursBeforeAvalible(timerPicker).time) + + }, [timerPicker, startDate]) @@ -389,193 +393,206 @@ const timerPickerValue = (data) => { // Get from child 1 -const textFieldSelect = (data) => { - console.log('textFieldSelect: ',data); - setStatusChatEnd(data) - -} - + const textFieldSelect = (data) => { + console.log('textFieldSelect: ', data); + setStatusChatEnd(data) -const handleChange = (event) => { - - setTextArea1(event.target.value); - -}; + } -const handleChangeHourBefore = (event) => { + const handleChange = (event) => { - console.log('textFihandleChangeHourBefore: ',event.target.value); - - // var matchedTime = currenciesTimeBefore.filter(i => i.label.indexOf('24 HORAS ANTES DO HORÁRIO DO AGENDAMENTO') >= 0); + setTextArea1(event.target.value); - // console.log('textFihandleChangeHourBefore matchedTime: ',matchedTime); + }; - setCurrency(event.target.value); + const handleCheckBoxChange = (event) => { -}; - + //console.log('event.target.checked: ', event.target.checked) + setChecked(event.target.checked); + }; - return ( - - + const handleChangeHourBefore = (event) => { - {props.modal_header} - + console.log('textFihandleChangeHourBefore: ', event.target.value); - - - + // var matchedTime = currenciesTimeBefore.filter(i => i.label.indexOf('24 HORAS ANTES DO HORÁRIO DO AGENDAMENTO') >= 0); - - + // console.log('textFihandleChangeHourBefore matchedTime: ',matchedTime); - - - Selecione uma opção para encerrar o Atendimento - - { - return {'value': obj.id, 'label': obj.name} - })}/> - + setCurrency(event.target.value); - - - - - {statusChatEndId==='2' && - - - - Lembrete - - - - - - - - + }; - - - - - - - - } + return ( - {statusChatEndId==='3' && - + + scroll={scroll} + aria-labelledby="scroll-dialog-title" + aria-describedby="scroll-dialog-description" + > - Agendamento + {props.modal_header} + - - - - - - - + + + - + - - - {currencyHourBefore && startDate && typeof(startDate)==='string' && startDate.trim().length > 0 && currenciesTimeBefore.length > 0 && - 0 ? false : true} - select - label="Enviar mensagem para o cliente" - value={currencyHourBefore} - size="small" - onChange={handleChangeHourBefore} - > - {currenciesTimeBefore.map((option) => ( - - {option.label} - - ))} - - } - + + + Selecione uma opção para encerrar o Atendimento + + { + return { 'value': obj.id, 'label': obj.name } + })} /> - - - - + - + - - - } + {statusChatEndId === '2' && - {schedulesContact.length>0 && -
- } - - -
-
- - - -
- -
- -
-
+ + + Lembrete + + + + + + + + + + + + + + + + + + + } + + {statusChatEndId === '3' && + + + + + Agendamento + + + + + + + + + + + + + + + {currencyHourBefore && startDate && typeof (startDate) === 'string' && startDate.trim().length > 0 && currenciesTimeBefore.length > 0 && + 0 ? false : true} + select + label="Enviar mensagem para o cliente" + value={currencyHourBefore} + size="small" + onChange={handleChangeHourBefore} + > + {currenciesTimeBefore.map((option) => ( + + {option.label} + + ))} + + } + + + + + + + + + + + + + } + + {schedulesContact.length > 0 && +
+ } + + +
+
+ + + +
+ } + label="Mensagem de encerramento de atendimento" + /> +
+
+ +
+ +
+
); } diff --git a/frontend/src/pages/Report/index.js b/frontend/src/pages/Report/index.js index 7085131..9912cf2 100644 --- a/frontend/src/pages/Report/index.js +++ b/frontend/src/pages/Report/index.js @@ -74,7 +74,13 @@ let columns = [ { key: 'ticket.status', label: 'Status', - }] + }, + { + key: 'ticket.statusChatEnd', + label: 'Status de encerramento', + } + +] // @@ -290,12 +296,12 @@ let columnsData = [ { title: 'Contato', field: 'contact.number' }, { title: 'Nome', field: 'contact.name' }, { title: 'Assunto', field: 'queue.name' }, - { title: 'Status', field: 'status' }, - { title: 'Criado', field: 'createdAt' }, - { - title: 'Atualizado', field: 'updatedAt', - }]; + { title: 'Status', field: 'status' }, + + { title: 'Criado', field: 'createdAt' }, + //{title: 'Atualizado', field: 'updatedAt'}, + {title: 'Status de encerramento', field: 'statusChatEnd'}]; const Report = () => {