|
@@ -23,6 +23,38 @@ import { estruturarMensagem, montarUrlMidia } from "../utils/atendimentoFormat.j
|
|
|
import { parseFiltrosAvaliacoes } from "../utils/atendimentoAvaliacaoFiltros.js";
|
|
import { parseFiltrosAvaliacoes } from "../utils/atendimentoAvaliacaoFiltros.js";
|
|
|
import { config } from "../config/index.js";
|
|
import { config } from "../config/index.js";
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+function inteiroOuUndefined(valor) {
|
|
|
|
|
+ if (typeof valor !== "string") return undefined;
|
|
|
|
|
+ const texto = valor.trim();
|
|
|
|
|
+ if (!texto || !/^-?\d+$/.test(texto)) return undefined;
|
|
|
|
|
+ const numero = Number(texto);
|
|
|
|
|
+ return Number.isSafeInteger(numero) ? numero : undefined;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+function inteiroPositivoOu(valor, padrao) {
|
|
|
|
|
+ const numero = Math.floor(Number(valor));
|
|
|
|
|
+ return Number.isSafeInteger(numero) && numero >= 1 ? numero : padrao;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+const FUSO_RELATORIOS = "America/Sao_Paulo";
|
|
|
|
|
+
|
|
|
|
|
+function dataLocalAAAAMMDD(data = new Date()) {
|
|
|
|
|
+ const partes = Object.fromEntries(
|
|
|
|
|
+ new Intl.DateTimeFormat("en-US", {
|
|
|
|
|
+ timeZone: FUSO_RELATORIOS,
|
|
|
|
|
+ year: "numeric",
|
|
|
|
|
+ month: "2-digit",
|
|
|
|
|
+ day: "2-digit"
|
|
|
|
|
+ })
|
|
|
|
|
+ .formatToParts(data)
|
|
|
|
|
+ .map(({ type, value }) => [type, value])
|
|
|
|
|
+ );
|
|
|
|
|
+ return `${partes.year}-${partes.month}-${partes.day}`;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
export const AtendimentosController = {
|
|
export const AtendimentosController = {
|
|
|
Ingerir: async function (req, res, next) {
|
|
Ingerir: async function (req, res, next) {
|
|
|
try {
|
|
try {
|
|
@@ -65,16 +97,16 @@ export const AtendimentosController = {
|
|
|
|
|
|
|
|
Listar: async function (req, res, next) {
|
|
Listar: async function (req, res, next) {
|
|
|
try {
|
|
try {
|
|
|
- const page = Math.max(1, Number(req.query.page) || 1);
|
|
|
|
|
- const pageSize = Math.min(100, Math.max(1, Number(req.query.pageSize) || 20));
|
|
|
|
|
|
|
+ const page = inteiroPositivoOu(req.query.page, 1);
|
|
|
|
|
+ const pageSize = Math.min(100, inteiroPositivoOu(req.query.pageSize, 20));
|
|
|
const setor = typeof req.query.setor === "string" && req.query.setor.trim() ? req.query.setor.trim() : undefined;
|
|
const setor = typeof req.query.setor === "string" && req.query.setor.trim() ? req.query.setor.trim() : undefined;
|
|
|
- const status = req.query.status !== undefined ? Number(req.query.status) : undefined;
|
|
|
|
|
|
|
+ const status = inteiroOuUndefined(req.query.status);
|
|
|
|
|
|
|
|
const result = await listarAtendimentos({
|
|
const result = await listarAtendimentos({
|
|
|
page,
|
|
page,
|
|
|
pageSize,
|
|
pageSize,
|
|
|
setor,
|
|
setor,
|
|
|
- status: Number.isInteger(status) ? status : undefined
|
|
|
|
|
|
|
+ status
|
|
|
});
|
|
});
|
|
|
res.json(result);
|
|
res.json(result);
|
|
|
} catch (err) {
|
|
} catch (err) {
|
|
@@ -145,8 +177,8 @@ export const AtendimentosController = {
|
|
|
|
|
|
|
|
ListarAvaliacoes: async function (req, res, next) {
|
|
ListarAvaliacoes: async function (req, res, next) {
|
|
|
try {
|
|
try {
|
|
|
- const page = Math.max(1, Number(req.query.page) || 1);
|
|
|
|
|
- const pageSize = Math.min(100, Math.max(1, Number(req.query.pageSize) || 20));
|
|
|
|
|
|
|
+ const page = inteiroPositivoOu(req.query.page, 1);
|
|
|
|
|
+ const pageSize = Math.min(100, inteiroPositivoOu(req.query.pageSize, 20));
|
|
|
const filtros = parseFiltrosAvaliacoes(req.query);
|
|
const filtros = parseFiltrosAvaliacoes(req.query);
|
|
|
|
|
|
|
|
const result = await listarAvaliacoes({ page, pageSize, ...filtros });
|
|
const result = await listarAvaliacoes({ page, pageSize, ...filtros });
|
|
@@ -190,7 +222,7 @@ export const AtendimentosController = {
|
|
|
const { setor, dataInicio, dataFim } = parseFiltrosAvaliacoes(req.query);
|
|
const { setor, dataInicio, dataFim } = parseFiltrosAvaliacoes(req.query);
|
|
|
const { buffer } = await gerarRankingAtendentesPdf({ setor, dataInicio, dataFim });
|
|
const { buffer } = await gerarRankingAtendentesPdf({ setor, dataInicio, dataFim });
|
|
|
|
|
|
|
|
- const dataArquivo = new Date().toISOString().slice(0, 10);
|
|
|
|
|
|
|
+ const dataArquivo = dataLocalAAAAMMDD();
|
|
|
res.setHeader("Content-Type", "application/pdf");
|
|
res.setHeader("Content-Type", "application/pdf");
|
|
|
res.setHeader("Content-Disposition", `attachment; filename="ranking-atendentes-${dataArquivo}.pdf"`);
|
|
res.setHeader("Content-Disposition", `attachment; filename="ranking-atendentes-${dataArquivo}.pdf"`);
|
|
|
res.setHeader("Content-Length", buffer.length);
|
|
res.setHeader("Content-Length", buffer.length);
|
|
@@ -205,7 +237,7 @@ export const AtendimentosController = {
|
|
|
const filtros = parseFiltrosAvaliacoes(req.query);
|
|
const filtros = parseFiltrosAvaliacoes(req.query);
|
|
|
const { buffer } = await gerarRelatorioNaoResolvidosPdf({ ...filtros, resolvido: "nao" });
|
|
const { buffer } = await gerarRelatorioNaoResolvidosPdf({ ...filtros, resolvido: "nao" });
|
|
|
|
|
|
|
|
- const dataArquivo = new Date().toISOString().slice(0, 10);
|
|
|
|
|
|
|
+ const dataArquivo = dataLocalAAAAMMDD();
|
|
|
res.setHeader("Content-Type", "application/pdf");
|
|
res.setHeader("Content-Type", "application/pdf");
|
|
|
res.setHeader("Content-Disposition", `attachment; filename="atendimentos-nao-resolvidos-${dataArquivo}.pdf"`);
|
|
res.setHeader("Content-Disposition", `attachment; filename="atendimentos-nao-resolvidos-${dataArquivo}.pdf"`);
|
|
|
res.setHeader("Content-Length", buffer.length);
|
|
res.setHeader("Content-Length", buffer.length);
|