diff --git a/app/Http/Controllers/GraduacaoController.php b/app/Http/Controllers/GraduacaoController.php index dab4677..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(); @@ -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 2547a5c..8a7bfe2 100644 --- a/app/Replicado/Graduacao.php +++ b/app/Replicado/Graduacao.php @@ -1022,4 +1022,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..c94162f 100644 --- a/config/laravel-usp-theme.php +++ b/config/laravel-usp-theme.php @@ -29,7 +29,12 @@ [ 'text' => 'Relatório carga extensionista', 'url' => 'graduacao/relatorio/carga-extensao', - 'can' => 'disciplinas', + 'can' => 'ver-relatorio', + ], + [ + 'text' => 'Relatório carga horária cumprida por aluno', + 'url' => 'graduacao/relatorio/carga-alunos', + 'can' => 'ver-relatorio', ], [ 'text' => 'Relatório de evasão', 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') +
| Nº USP | +Nome | +Curso | +Complemento | +Ingresso | +Carga Exigida | +Carga Cumprida | +% Progresso | +|
|---|---|---|---|---|---|---|---|---|
| {{ $r['codpes'] }} | +{{ $r['nompes'] }} | +{{ $r['email'] }} | +{{ $r['curso'] }} | +{{ $r['habilitacao'] }} | +{{ $r['ano'] }} | +{{ $r['exigida'] }} h | +{{ $r['cumprida'] }} h | +
+
+
+
+
+
+ {{ $r['porcentagem'] }}%
+
+ |
+