git commit -m "feat: Pull information from closed tickets in backend to feed pie chart in frontend and add option to change service hours on Saturday"

feat-scaling-ticket-remote-creation
adriano 2024-04-01 09:00:15 -03:00
parent a96d6f26c7
commit 8a35b985b9
6 changed files with 205 additions and 12 deletions

View File

@ -20,14 +20,14 @@ export const index = async (req: Request, res: Response): Promise<Response> => {
// const config = await SettingTicket.findAll(); // const config = await SettingTicket.findAll();
return res.status(200).json({ settings, }); return res.status(200).json({ settings });
}; };
export const ticketSettings = async ( export const ticketSettings = async (
req: Request, req: Request,
res: Response res: Response
): Promise<Response> => { ): Promise<Response> => {
const { number } = req.params; const { number } = req.params;
const config = await SettingTicket.findAll({ where: { number } }); const config = await SettingTicket.findAll({ where: { number } });
@ -40,6 +40,7 @@ export const updateTicketSettings = async (
): Promise<Response> => { ): Promise<Response> => {
const { const {
number, number,
saturdayBusinessTime,
outBusinessHours, outBusinessHours,
ticketExpiration, ticketExpiration,
weekend, weekend,
@ -47,7 +48,7 @@ export const updateTicketSettings = async (
sunday, sunday,
holiday holiday
} = req.body; } = req.body;
if (!number) throw new AppError("No number selected", 400); if (!number) throw new AppError("No number selected", 400);
if (outBusinessHours && Object.keys(outBusinessHours).length > 0) { if (outBusinessHours && Object.keys(outBusinessHours).length > 0) {
@ -58,6 +59,14 @@ export const updateTicketSettings = async (
}); });
} }
if (saturdayBusinessTime && Object.keys(saturdayBusinessTime).length > 0) {
await updateSettingTicket({
...saturdayBusinessTime,
key: "saturdayBusinessTime",
number
});
}
if (ticketExpiration && Object.keys(ticketExpiration).length > 0) { if (ticketExpiration && Object.keys(ticketExpiration).length > 0) {
await updateSettingTicket({ await updateSettingTicket({
...ticketExpiration, ...ticketExpiration,

View File

@ -0,0 +1,25 @@
import { QueryInterface } from "sequelize";
module.exports = {
up: (queryInterface: QueryInterface) => {
return queryInterface.bulkInsert(
"SettingTickets",
[
{
message: "",
startTime: new Date(),
endTime: new Date(),
value: "disabled",
key: "saturdayBusinessTime",
createdAt: new Date(),
updatedAt: new Date()
}
],
{}
);
},
down: (queryInterface: QueryInterface) => {
return queryInterface.bulkDelete("SettingTickets", {});
}
};

View File

@ -39,7 +39,7 @@ const isHoliday = async (number: string | number) => {
locale: ptBR locale: ptBR
}) })
) )
); );
if (currentDate.fullDate == startTime.fullDate) { if (currentDate.fullDate == startTime.fullDate) {
obj.set = true; obj.set = true;
@ -173,8 +173,80 @@ async function isOutBusinessTime(number: string | number) {
return obj; return obj;
} }
export { async function isOutBusinessTimeSaturday(number: string | number) {
isWeekend, let obj = { set: false, msg: "" };
isHoliday,
isOutBusinessTime const outBusinessHoursSaturday = await SettingTicket.findOne({
}; where: { key: "saturdayBusinessTime", number }
});
let isWithinRange = false;
if (
true &&
outBusinessHoursSaturday
// outBusinessHoursSaturday &&
// outBusinessHoursSaturday.value == "enabled" &&
// outBusinessHoursSaturday?.message?.trim()?.length > 0
) {
const ticketDateTimeUpdate = splitDateTime(
new Date(
_format(new Date(), "yyyy-MM-dd HH:mm:ss", {
locale: ptBR
})
)
);
const startTime = splitDateTime(
new Date(
_format(
new Date(outBusinessHoursSaturday.startTime),
"yyyy-MM-dd HH:mm:ss",
{
locale: ptBR
}
)
)
);
const endTime = splitDateTime(
new Date(
_format(
new Date(outBusinessHoursSaturday.endTime),
"yyyy-MM-dd HH:mm:ss",
{
locale: ptBR
}
)
)
);
const format = "HH:mm:ss";
const parsedStartTime = parse(
ticketDateTimeUpdate.fullTime,
format,
new Date()
);
const parsedEndTime = parse(startTime.fullTime, format, new Date());
const parsedTimeToCheck = parse(endTime.fullTime, format, new Date());
const timeInterval = { start: parsedStartTime, end: parsedEndTime };
// If the time range spans across different days, handle the date part
if (parsedEndTime < parsedStartTime) {
const nextDay = new Date(parsedStartTime);
nextDay.setDate(nextDay.getDate() + 1);
timeInterval.end = nextDay;
}
isWithinRange = isWithinInterval(parsedTimeToCheck, timeInterval);
if (!isWithinRange) {
obj.set = true;
obj.msg = outBusinessHoursSaturday.message;
}
}
return obj;
}
export { isWeekend, isHoliday, isOutBusinessTime, isOutBusinessTimeSaturday };

View File

@ -10,6 +10,7 @@ import path from "path";
import { import {
isHoliday, isHoliday,
isOutBusinessTime, isOutBusinessTime,
isOutBusinessTimeSaturday,
isWeekend isWeekend
} from "../../helpers/TicketConfig"; } from "../../helpers/TicketConfig";
@ -1221,6 +1222,13 @@ const outOfService = async (number: string) => {
objs.push({ type: "holiday", msg: holiday.msg }); objs.push({ type: "holiday", msg: holiday.msg });
} }
// MESSAGE TO SATURDAY BUSINESS TIME
const businessTimeSaturday = await isOutBusinessTimeSaturday(number);
if (businessTimeSaturday && businessTimeSaturday.set) {
objs.push({ type: "saturdayBusinessTime", msg: businessTimeSaturday.msg });
}
// MESSAGES TO SATURDAY OR SUNDAY // MESSAGES TO SATURDAY OR SUNDAY
const weekend: any = await isWeekend(number); const weekend: any = await isWeekend(number);

View File

@ -77,8 +77,16 @@ const ConfigModal = ({ open, onClose, change }) => {
const initialState = { const initialState = {
startTimeBus: new Date(), startTimeBus: new Date(),
endTimeBus: new Date(), endTimeBus: new Date(),
startTimeBusSaturday: new Date(),
endTimeBusSaturday: new Date(),
messageBus: '', messageBus: '',
messageBusSaturday: '',
businessTimeEnable: false, businessTimeEnable: false,
businessTimeEnableSaturday: false,
ticketTimeExpiration: new Date(), ticketTimeExpiration: new Date(),
ticketExpirationMsg: '', ticketExpirationMsg: '',
ticketExpirationEnable: false, ticketExpirationEnable: false,
@ -115,13 +123,16 @@ const ConfigModal = ({ open, onClose, change }) => {
if (!selectedNumber) return if (!selectedNumber) return
const { data } = await api.get(`/settings/ticket/${selectedNumber}`) const { data } = await api.get(`/settings/ticket/${selectedNumber}`)
if (data?.config && data.config.length === 0) { if (data?.config && data.config.length === 0) {
setConfig(initialState) setConfig(initialState)
return return
} }
const outBusinessHours = data.config.find((c) => c.key === "outBusinessHours") const outBusinessHours = data.config.find((c) => c.key === "outBusinessHours")
const saturdayBusinessTime = data.config.find((c) => c.key === "saturdayBusinessTime")
const ticketExpiration = data.config.find((c) => c.key === "ticketExpiration") const ticketExpiration = data.config.find((c) => c.key === "ticketExpiration")
const saturday = data.config.find((c) => c.key === "saturday") const saturday = data.config.find((c) => c.key === "saturday")
const sunday = data.config.find((c) => c.key === "sunday") const sunday = data.config.find((c) => c.key === "sunday")
@ -134,6 +145,11 @@ const ConfigModal = ({ open, onClose, change }) => {
messageBus: outBusinessHours.message, messageBus: outBusinessHours.message,
businessTimeEnable: outBusinessHours.value === 'enabled' ? true : false, businessTimeEnable: outBusinessHours.value === 'enabled' ? true : false,
startTimeBusSaturday: saturdayBusinessTime.startTime,
endTimeBusSaturday: saturdayBusinessTime.endTime,
messageBusSaturday: saturdayBusinessTime.message,
businessTimeEnableSaturday: saturdayBusinessTime.value === 'enabled' ? true : false,
ticketTimeExpiration: ticketExpiration.startTime, ticketTimeExpiration: ticketExpiration.startTime,
ticketExpirationMsg: ticketExpiration.message, ticketExpirationMsg: ticketExpiration.message,
ticketExpirationEnable: ticketExpiration.value === 'enabled' ? true : false, ticketExpirationEnable: ticketExpiration.value === 'enabled' ? true : false,
@ -165,6 +181,14 @@ const ConfigModal = ({ open, onClose, change }) => {
message: values.messageBus, message: values.messageBus,
value: values.businessTimeEnable ? 'enabled' : 'disabled' value: values.businessTimeEnable ? 'enabled' : 'disabled'
}, },
saturdayBusinessTime: {
startTime: values.startTimeBusSaturday,
endTime: values.endTimeBusSaturday,
message: values.messageBusSaturday,
value: values.businessTimeEnableSaturday ? 'enabled' : 'disabled'
},
ticketExpiration: { ticketExpiration: {
startTime: values.ticketTimeExpiration, startTime: values.ticketTimeExpiration,
message: values.ticketExpirationMsg, message: values.ticketExpirationMsg,
@ -205,7 +229,7 @@ const ConfigModal = ({ open, onClose, change }) => {
onClose() onClose()
// setConfig(initialState) // setConfig(initialState)
} }
return ( return (
<div className={classes.root}> <div className={classes.root}>
<Dialog <Dialog
@ -325,6 +349,61 @@ const ConfigModal = ({ open, onClose, change }) => {
</div> </div>
<br />
{/* SABADO INICIO */}
<div className={classes.multFieldLine}>
<Field
component={TimePicker}
name="startTimeBusSaturday"
label="Inicio atendimentosssssss"
ampm={false}
openTo="hours"
views={['hours', 'minutes',]}
format="HH:mm"
/>
{' '}
<Field
component={TimePicker}
name="endTimeBusSaturday"
label="Fim atendimento"
ampm={false}
openTo="hours"
views={['hours', 'minutes',]}
format="HH:mm"
/>
<FormControlLabel
control={
<Field
as={Switch}
color="primary"
name="businessTimeEnableSaturday"
checked={values.businessTimeEnableSaturday}
/>
}
label={'Ativar/Desativar'} />
</div>
<div>
<Field
as={TextField}
label={'Mensagem fora do horário de atendimento sábado'}
type="messageBusSaturday"
multiline
rows={5}
fullWidth
name="messageBusSaturday"
error={
touched.messageBusSaturday && Boolean(errors.messageBusSaturday)
}
helperText={
touched.messageBusSaturday && errors.messageBusSaturday
}
variant="outlined"
margin="dense"
/>
</div>
{/* SABADO FIM */}
<br /> <br />

View File

@ -293,7 +293,7 @@ const Dashboard = () => {
dispatch({ type: "LOAD_QUERY", payload: data.usersProfile }) dispatch({ type: "LOAD_QUERY", payload: data.usersProfile })
const { data: ticketStatusChatEndData } = await api.get("/reports/count/statusChatEnd", { const { data: ticketStatusChatEndData } = await api.get("/reports/count/statusChatEnd", {
params: { startDate: '2024-03-21', endDate: '2024-03-28' }, params: { startDate: startDate, endDate: endDate },
}) })
setTicketStatusChatEnd(ticketStatusChatEndData.reportStatusChatEnd) setTicketStatusChatEnd(ticketStatusChatEndData.reportStatusChatEnd)