From 1c2b60d1b42c1cc4a7d6d3b40b22271e3789030e Mon Sep 17 00:00:00 2001 From: Daniel-Alvarenga Date: Fri, 22 Nov 2024 20:09:28 -0300 Subject: [PATCH] Finish load mentions for rankings --- .../components/funcionario/AsideDashboard.vue | 2 +- client/src/views/funcionario/Boletins.vue | 4 +- .../funcionario/CompareBoletinsUseCase.ts | 146 ++++++++++++++---- 3 files changed, 120 insertions(+), 32 deletions(-) diff --git a/client/src/components/funcionario/AsideDashboard.vue b/client/src/components/funcionario/AsideDashboard.vue index 7edcc8c..56f2d20 100644 --- a/client/src/components/funcionario/AsideDashboard.vue +++ b/client/src/components/funcionario/AsideDashboard.vue @@ -16,7 +16,7 @@
  • - +

    Vagas

  • diff --git a/client/src/views/funcionario/Boletins.vue b/client/src/views/funcionario/Boletins.vue index 3ea0047..2259300 100644 --- a/client/src/views/funcionario/Boletins.vue +++ b/client/src/views/funcionario/Boletins.vue @@ -6,7 +6,7 @@

    Boletins a serem validados

    -
    Nenhum boletim em análise encontrado.
    +
    Nenhum boletim para análise no momento
    @@ -58,7 +58,7 @@ export default { if (file) { const response = await compareBoletins(file, boletimId, this.funcionario.token); - alert(response.message || 'Erro ao comparar boletim.'); + alert(response.data.message); } else { alert('Por favor, selecione um arquivo para comparação.'); } diff --git a/server/src/modules/services/funcionario/CompareBoletinsUseCase.ts b/server/src/modules/services/funcionario/CompareBoletinsUseCase.ts index ca65e61..50a2200 100644 --- a/server/src/modules/services/funcionario/CompareBoletinsUseCase.ts +++ b/server/src/modules/services/funcionario/CompareBoletinsUseCase.ts @@ -50,19 +50,26 @@ export class CompareBoletimUseCase { const novoStatus = isEqual ? 'APROVADO' : 'RECUSADO'; - // await prisma.boletim.update({ - // where: { id: boletimId }, - // data: { status: novoStatus } - // }); - - if(isEqual){ + if (isEqual) { const relevantText = this.extractRelevantText(storedFileText); - // const ano = this.extractYear(relevantText); - + const ano = this.extractYear(uploadedFileText); const materias = this.extractMateriasAndNotas(relevantText); - console.log(materias); + console.log(ano, materias); + if (ano) { + await this.registerOrUpdateMaterias(ano, materias); + + await this.registerOrUpdateNotas(materias, boletim.alunoId, ano); + + await prisma.boletim.update({ + where: { id: boletimId }, + data: { status: novoStatus } + }); + + } else { + throw new AppError(`Erro ao extrair texto do PDF`); + } } await clearUploads(); @@ -76,7 +83,7 @@ export class CompareBoletimUseCase { if (error) { return reject(error); } - + const chunks: Buffer[] = []; dataStream.on('data', (chunk: Buffer) => { chunks.push(chunk); @@ -103,38 +110,38 @@ export class CompareBoletimUseCase { private extractRelevantText(text: string): string { const startMatch = text.match(/Resultado\s*Final\s*por\s*Componente/i); const endMatch = text.match(/Assiduidade\s*Parcial/i); - + if (!startMatch || !endMatch) { throw new AppError("Texto do boletim incompleto ou não encontrado."); } - + const start = startMatch.index! + startMatch[0].length; const end = endMatch.index!; - + return text.slice(start, end).trim(); } - - private extractYear(text: string): string { + + private extractYear(text: string): number { const startMatch = text.match(/Ano\s*Letivo\s*\/\s*Semestre:\s*/i); const endMatch = text.match(/\s*RM:/i); - + if (!startMatch || !endMatch) { throw new AppError("Texto do boletim incompleto ou não encontrado."); } - + const start = startMatch.index! + startMatch[0].length; const end = endMatch.index!; - - return text.slice(start, end).trim(); + + return parseInt(text.slice(start, end).trim()); } - + private extractMateriasAndNotas(text: string): any[] { const materias: any[] = []; const lines = text.split(/\r?\n/).map(line => line.trim()).filter(line => line.length > 0); - + let buffer = ""; - + lines.forEach((line) => { if (!/\d{2,3}/.test(line) || /^[A-Za-z\s]+$/.test(line)) { buffer += ` ${line}`; @@ -147,26 +154,26 @@ export class CompareBoletimUseCase { buffer = ""; } }); - + if (buffer) { const result = this.extractNotaFromLine(buffer.trim()); if (result) { materias.push(result); } } - + return materias; } private extractNotaFromLine(line: string): any | null { const match = line.match(/^(.+?)(\d[\d,]*)\s*(.*)/); - + if (!match) return null; - + const nomeMateria = match[1].trim(); - + const bimestres = []; - + if (match) { const group3 = match[3]; @@ -182,7 +189,7 @@ export class CompareBoletimUseCase { } console.log(bimestres); - } else{ + } else { throw new AppError(`Erro ao comparar boletins`); } @@ -191,4 +198,85 @@ export class CompareBoletimUseCase { bimestres }; } + + private async registerOrUpdateMaterias(ano: number, materias: any[]) { + for (const materia of materias) { + const { materia: nomeMateria } = materia; + + // Verifica se a matéria já existe + let materiaExistente = await prisma.materia.findFirst({ + where: { name: nomeMateria }, + }); + + if (!materiaExistente) { + // Registra a matéria se não existir + materiaExistente = await prisma.materia.create({ + data: { name: nomeMateria }, + }); + } + } + } + + private async registerOrUpdateNotas( + materias: any[], + alunoId: string, + ano: number + ) { + for (const materia of materias) { + const { materia: nomeMateria, bimestres } = materia; + + // Busca a matéria para associar ao registro de notas + const materiaExistente = await prisma.materia.findFirst({ + where: { name: nomeMateria }, + }); + + if (!materiaExistente) { + throw new AppError(`Matéria "${nomeMateria}" não encontrada.`); + } + + // Processa cada bimestre + for (let i = 0; i < bimestres.length; i++) { + const mencao = bimestres[i]; + const bimestre = i + 1; + + // Valida a menção + if (!["MB", "B", "R", "I"].includes(mencao)) { + console.log(`Menção "${mencao}" inválida para "${nomeMateria}".`); + continue; + } + + // Verifica se já existe nota para o aluno, matéria, ano e bimestre + const notaExistente = await prisma.nota.findFirst({ + where: { + alunoId, + materiaId: materiaExistente.id, + ano, + bimestre, + }, + }); + + if (notaExistente) { + // Atualiza a nota se a menção for diferente + if (notaExistente.mencao !== mencao) { + await prisma.nota.update({ + where: { id: notaExistente.id }, + data: { mencao }, + }); + } + } else { + // Cria nova nota + await prisma.nota.create({ + data: { + alunoId, + materiaId: materiaExistente.id, + ano, + bimestre, + mencao, + }, + }); + } + } + } + } + }