Implementação de filtros de Ano Letivo e Turma na modal de emissão e correção da query de crianças únicas para evitar erro de scalar

This commit is contained in:
2026-05-28 13:14:43 +00:00
parent 4beb018680
commit ad67652b7d
3 changed files with 152 additions and 14 deletions
+72 -6
View File
@@ -755,13 +755,30 @@ app.delete('/api/modelos/:id', requireAuth, async (req, res) => {
// Obter lista única de crianças já observadas
app.get('/api/observacoes/criancas', requireAuth, async (req, res) => {
const { ano, turma } = req.query;
try {
const dbRes = await dbPool.query(`
let sql = `
SELECT DISTINCT jsonb_array_elements_text(criancas) as nome
FROM escola.observacoes
WHERE criancas IS NOT NULL AND jsonb_array_length(criancas) > 0
ORDER BY nome;
`);
WHERE jsonb_typeof(criancas) = 'array'
`;
const params = [];
let pCount = 1;
if (ano) {
sql += ` AND substring(date from 1 for 4) = $${pCount}`;
params.push(ano);
pCount++;
}
if (turma) {
sql += ` AND turma = $${pCount}`;
params.push(turma);
pCount++;
}
sql += ` ORDER BY nome;`;
const dbRes = await dbPool.query(sql, params);
res.json(dbRes.rows.map(r => r.nome));
} catch (err) {
console.error('Erro ao buscar crianças únicas:', err);
@@ -769,9 +786,34 @@ app.get('/api/observacoes/criancas', requireAuth, async (req, res) => {
}
});
// Obter metadados únicos para filtros (anos letivos e turmas)
app.get('/api/observacoes/metadata', requireAuth, async (req, res) => {
try {
const yearsRes = await dbPool.query(`
SELECT DISTINCT substring(date from 1 for 4) as ano
FROM escola.observacoes
WHERE date IS NOT NULL AND date != ''
ORDER BY ano DESC;
`);
const turmasRes = await dbPool.query(`
SELECT DISTINCT turma
FROM escola.observacoes
WHERE turma IS NOT NULL AND turma != ''
ORDER BY turma;
`);
res.json({
anos: yearsRes.rows.map(r => r.ano).filter(Boolean),
turmas: turmasRes.rows.map(r => r.turma).filter(Boolean)
});
} catch (err) {
console.error('Erro ao buscar metadados de observações:', err);
res.status(500).json({ error: err.message });
}
});
// Contar observações baseadas em filtros
app.get('/api/observacoes/contar', requireAuth, async (req, res) => {
const { crianca, dataInicio, dataFim, tags } = req.query;
const { crianca, dataInicio, dataFim, tags, ano, turma } = req.query;
try {
let sql = `SELECT COUNT(*) FROM escola.observacoes WHERE 1=1`;
const params = [];
@@ -798,6 +840,18 @@ app.get('/api/observacoes/contar', requireAuth, async (req, res) => {
pCount++;
}
if (ano) {
sql += ` AND substring(date from 1 for 4) = $${pCount}`;
params.push(ano);
pCount++;
}
if (turma) {
sql += ` AND turma = $${pCount}`;
params.push(turma);
pCount++;
}
if (tags) {
const tagList = tags.split(',').map(t => t.trim().toLowerCase());
sql += ` AND EXISTS (
@@ -818,7 +872,7 @@ app.get('/api/observacoes/contar', requireAuth, async (req, res) => {
// Gerar relatório consolidado com IA baseado em observações e um modelo
app.post('/api/modelos/gerar-relatorio', requireAuth, async (req, res) => {
const { crianca, dataInicio, dataFim, tags, modeloId } = req.body;
const { crianca, dataInicio, dataFim, tags, modeloId, ano, turma } = req.body;
if (!modeloId) return res.status(400).json({ error: 'O ID do modelo é obrigatório' });
try {
@@ -857,6 +911,18 @@ app.post('/api/modelos/gerar-relatorio', requireAuth, async (req, res) => {
pCount++;
}
if (ano) {
sql += ` AND substring(date from 1 for 4) = $${pCount}`;
params.push(ano);
pCount++;
}
if (turma) {
sql += ` AND turma = $${pCount}`;
params.push(turma);
pCount++;
}
if (tags) {
const tagList = Array.isArray(tags) ? tags : [tags];
sql += ` AND EXISTS (