From 70d73edf3610b84543b2b36a320cab293bd60986 Mon Sep 17 00:00:00 2001 From: ViniRafaelVale Date: Tue, 19 May 2026 14:25:30 -0300 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20adiciona=20relat=C3=B3rio=20de=20ca?= =?UTF-8?q?rga=20hor=C3=A1ria=20do=20aluno?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/GraduacaoController.php | 80 +++++++++++++++++++ app/Providers/AuthServiceProvider.php | 4 + app/Replicado/Graduacao.php | 51 ++++++++++++ config/laravel-usp-theme.php | 5 ++ .../grad/relatorio-carga-alunos.blade.php | 76 ++++++++++++++++++ resources/views/welcome.blade.php | 1 + routes/web.php | 5 +- 7 files changed, 221 insertions(+), 1 deletion(-) create mode 100644 resources/views/grad/relatorio-carga-alunos.blade.php diff --git a/app/Http/Controllers/GraduacaoController.php b/app/Http/Controllers/GraduacaoController.php index dab4677..58ffe5b 100644 --- a/app/Http/Controllers/GraduacaoController.php +++ b/app/Http/Controllers/GraduacaoController.php @@ -632,4 +632,84 @@ public function relatorioCargaExtensao(Request $request) 'params' => $request->all() ]); } + + public function relatorioCargaHorariaCumpridaAluno(Request $request) + { + if (!$request->old()) { + session()->flashInput($request->input()); + } + + $this->authorize('ver-relatorio'); + \UspTheme::activeUrl('graduacao/relatorio/carga-alunos'); + + $entradas = Tools::limparNomes($request->nusps); + + $codpesParaProcessar = []; + $naoEncontrados = []; + $resultados = []; + + foreach ($entradas as $entrada) { + if (is_numeric($entrada)) { + $codpesParaProcessar[] = $entrada; + } else { + $pessoas = Pessoa::procurarPorNome($entrada); + + if (!empty($pessoas)) { + foreach ($pessoas as $pessoa) { + $codpesParaProcessar[] = $pessoa['codpes']; + } + } else { + $naoEncontrados[] = $entrada; + } + } + } + + $codpesParaProcessar = array_unique($codpesParaProcessar); + + $nomesEncontrados = []; + + if (!empty($codpesParaProcessar)) { + $nomesEncontrados = Pessoa::obterNome($codpesParaProcessar); + } + + foreach ($codpesParaProcessar as $codpes) { + $nome = $nomesEncontrados[$codpes] ?? null; + + if (!$nome) { + $naoEncontrados[] = $codpes . " (Número USP não encontrado na base)"; + continue; + } + + $dadosAluno = Graduacao::obterCargaHorariaCumpridaAluno($codpes); + + if (!$dadosAluno) { + $naoEncontrados[] = $codpes . " - " . ($nome ?: 'Nº USP inválido') . " (Sem histórico de aprovações)"; + continue; + } + + $cursoInfo = Graduacao::obterCurso($dadosAluno['codcur'], $dadosAluno['codhab']); + + $cargaExigida = ($cursoInfo['cgahortot'] ?? 0) + ($cursoInfo['cgahorobgaac'] ?? 0); + $cumprida = $dadosAluno['carga_horaria_total_cumprida']; + + $porcentagem = ($cargaExigida > 0) ? ($cumprida / $cargaExigida) * 100 : 0; + + $resultados[] = [ + 'codpes' => $dadosAluno['codpes'], + 'nompes' => $dadosAluno['nompes'], + 'email' => $dadosAluno['email'], + 'curso' => $dadosAluno['codcur'] . " - " . ($cursoInfo['nomcur'] ?? 'Não encontrado'), + 'habilitacao' => $dadosAluno['codhab'] . " - " . ($cursoInfo['nomhab'] ?? 'Não encontrada'), + 'ano' => $dadosAluno['ano_ingresso'], + 'exigida' => $cargaExigida, + 'cumprida' => round($cumprida), + 'porcentagem' => number_format($porcentagem, 2, ',', '.') + ]; + } + + $resultados = collect($resultados)->sortBy('nompes')->toArray(); + + session()->flashInput($request->input()); + return view('grad.relatorio-carga-alunos', compact('resultados', 'naoEncontrados')); + } } diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index 8dad461..0a210c6 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -32,5 +32,9 @@ public function boot() || Gate::check('senhaunica.estagiario') || Gate::check('senhaunica.docente'); }); + + Gate::define('ver-relatorio', function (User $user) { + return Gate::allows('disciplina-cc') || Gate::allows('datagrad'); + }); } } diff --git a/app/Replicado/Graduacao.php b/app/Replicado/Graduacao.php index 077c30c..51e5d47 100644 --- a/app/Replicado/Graduacao.php +++ b/app/Replicado/Graduacao.php @@ -976,4 +976,55 @@ public static function listarCargaHorariaExtensionista($codcur, $anoIngresso) $ret = DB::fetchAll($query, $params); return $ret; } + + /** + * Método para obter os dados acadêmicos e a carga horária total + * cumprida em disciplinas por um aluno. + * + * @param Int $codpes + * @return Array Lista com codpes, nome, email, cod_curso, cod_habilitação, ano_ingresso, carga_horaria_total_cumprida ou false se não encontrado. + * @author Vinicius Rafael do Vale, em 15/05/2026 + */ + public static function obterCargaHorariaCumpridaAluno($codpes) + { + $query = " + SELECT + v.codpes, + v.nompes, + e.codema AS email, + v.codcurgrd AS codcur, + v.codhab AS codhab, + YEAR(v.dtainivin) AS ano_ingresso, + SUM( + (ISNULL(d.creaul, 0) * 15) + + (ISNULL(d.cretrb, 0) * 30) + ) AS carga_horaria_total_cumprida + FROM VINCULOPESSOAUSP v + INNER JOIN HISTESCOLARGR h ON h.codpes = v.codpes + INNER JOIN DISCIPLINAGR d ON d.coddis = h.coddis + LEFT JOIN EMAILPESSOA e ON e.codpes = v.codpes AND e.stamtr = 'S' + WHERE v.codpes = :codpes + AND v.tipvin = 'ALUNOGR' + AND v.sitatl = 'A' + AND h.rstfim IS NOT NULL + AND h.rstfim = 'A' + AND h.stamtr NOT IN ('E', 'R') + AND h.discrl IN ('O', 'L') + AND d.dtaatvdis <= ISNULL(h.dtavalfim, h.dtacrihst) + AND ( + d.dtadtvdis IS NULL + OR ISNULL(h.dtavalfim, h.dtacrihst) <= d.dtadtvdis + ) + GROUP BY + YEAR(v.dtainivin), + v.codpes, + v.codcurgrd, + v.codhab, + v.nompes, + e.codema + "; + + $param = ['codpes' => $codpes]; + return DB::fetch($query, $param); + } } diff --git a/config/laravel-usp-theme.php b/config/laravel-usp-theme.php index b0eaf80..f45e4a5 100644 --- a/config/laravel-usp-theme.php +++ b/config/laravel-usp-theme.php @@ -31,6 +31,11 @@ 'url' => 'graduacao/relatorio/carga-extensao', 'can' => 'disciplinas', ], + [ + 'text' => 'Relatório carga horária cumprida por aluno', + 'url' => 'graduacao/relatorio/carga-alunos', + 'can' => 'ver-relatorio', + ], [ 'text' => 'Relatório de evasão', 'url' => 'graduacao/relatorio/evasao', diff --git a/resources/views/grad/relatorio-carga-alunos.blade.php b/resources/views/grad/relatorio-carga-alunos.blade.php new file mode 100644 index 0000000..1e81210 --- /dev/null +++ b/resources/views/grad/relatorio-carga-alunos.blade.php @@ -0,0 +1,76 @@ +@extends('layouts.app') + +@section('content') +

Relatório carga horária cumprida por aluno

+
+ Lista a carga horária cumprida pelo aluno, juntamente com a porcentagem. +
+ +
+ @csrf +
+ + +
+ +
+ + @if($naoEncontrados) +
+ Não encontrados: + +
+ @endif + + @if($resultados) +
+
Resultados
+ + + + + + + + + + + + + + + + @foreach($resultados as $r) + + + + + + + + + + + + @endforeach + +
Nº USPNomeE-mailCursoComplementoIngressoCarga ExigidaCarga Cumprida% Progresso
{{ $r['codpes'] }}{{ $r['nompes'] }}{{ $r['email'] }}{{ $r['curso'] }}{{ $r['habilitacao'] }}{{ $r['ano'] }}{{ $r['exigida'] }} h{{ $r['cumprida'] }} h +
+
+
+ +
+ {{ $r['porcentagem'] }}% +
+
+
+ @endif +@endsection \ No newline at end of file diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php index 5c5cf7e..2add03b 100644 --- a/resources/views/welcome.blade.php +++ b/resources/views/welcome.blade.php @@ -61,6 +61,7 @@ - Relatório de carga didática: mostra a carga didática de docentes em determinado período;
- Relatório grade horária: mostra a grade horária corrente para a lista de alunos informada;
- Relatório carga de extensão: mostra por curso e por ano de ingresso a relação de alunos e o total de carga extensionista cumprida por cada um;
+ - Relatório carga horária cumprida por aluno: mostra a carga horária cumprida pelo aluno e a porcentagem com base na carga exigida pelo curso;
- Relatório de evasão: mostra gráfico e tabela de evasão por curso e por ano de ingresso;
- Alteração de ementas de disicplinas: Ferramenta que facilita a atualização das ementas das disciplinas.
diff --git a/routes/web.php b/routes/web.php index 199275d..d2ef9ca 100644 --- a/routes/web.php +++ b/routes/web.php @@ -59,4 +59,7 @@ Route::resource('/cursos', CursoController::class); Route::get('graduacao/relatorio/carga-extensao', [GraduacaoController::class, 'relatorioCargaExtensao'])->name('graduacao.relatorio.carga-extensao'); -Route::post('graduacao/relatorio/carga-extensao', [GraduacaoController::class, 'relatorioCargaExtensao'])->name('graduacao.relatorio.carga-extensao.post'); \ No newline at end of file +Route::post('graduacao/relatorio/carga-extensao', [GraduacaoController::class, 'relatorioCargaExtensao'])->name('graduacao.relatorio.carga-extensao.post'); + +Route::get('graduacao/relatorio/carga-alunos', [GraduacaoController::class, 'relatorioCargaHorariaCumpridaAluno'])->name('graduacao.relatorio.carga-alunos'); +Route::post('graduacao/relatorio/carga-alunos', [GraduacaoController::class, 'relatorioCargaHorariaCumpridaAluno'])->name('graduacao.relatorio.carga-alunos.post'); \ No newline at end of file From d56ce095f23b04080a63f040f4c29b325ffba448 Mon Sep 17 00:00:00 2001 From: ViniRafaelVale Date: Tue, 19 May 2026 16:11:09 -0300 Subject: [PATCH 2/2] =?UTF-8?q?refact:=20mudando=20permiss=C3=A3o=20de=20c?= =?UTF-8?q?arga-extensao?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/GraduacaoController.php | 2 +- config/laravel-usp-theme.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/GraduacaoController.php b/app/Http/Controllers/GraduacaoController.php index 58ffe5b..f29a367 100644 --- a/app/Http/Controllers/GraduacaoController.php +++ b/app/Http/Controllers/GraduacaoController.php @@ -604,7 +604,7 @@ public function relatorioTurma(Request $request) public function relatorioCargaExtensao(Request $request) { - $this->authorize('disciplinas'); + $this->authorize('ver-relatorio'); \UspTheme::activeUrl('graduacao/relatorio/carga-extensao'); $cursos = Evasao::retornarCodcurNomcur(); diff --git a/config/laravel-usp-theme.php b/config/laravel-usp-theme.php index f45e4a5..c94162f 100644 --- a/config/laravel-usp-theme.php +++ b/config/laravel-usp-theme.php @@ -29,7 +29,7 @@ [ 'text' => 'Relatório carga extensionista', 'url' => 'graduacao/relatorio/carga-extensao', - 'can' => 'disciplinas', + 'can' => 'ver-relatorio', ], [ 'text' => 'Relatório carga horária cumprida por aluno',