From 3ff7154fda9c9b142e1da4072e363c5b734310c1 Mon Sep 17 00:00:00 2001 From: Lucas Lopes Date: Tue, 31 Mar 2026 15:38:34 -0300 Subject: [PATCH 01/10] =?UTF-8?q?feat:=20adiciona=20configura=C3=A7=C3=A3o?= =?UTF-8?q?=20para=20CODHABS=20e=20implementa=20a=20classe=20Gradua=C3=A7?= =?UTF-8?q?=C3=A3o=20para=20habilita=C3=A7=C3=B5es=20de=20curso?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 10 +++++ .../Controllers/EquivalenciaController.php | 11 +++++ app/Replicado/Graduacao.php | 45 +++++++++++++++++++ config/equivalencia.php | 5 +++ 4 files changed, 71 insertions(+) create mode 100644 app/Replicado/Graduacao.php create mode 100644 config/equivalencia.php diff --git a/.env.example b/.env.example index 00044c6..175171f 100644 --- a/.env.example +++ b/.env.example @@ -167,3 +167,13 @@ WSFOTO_PASS= # Caminho para o arquivo de imagem desejada para ser utilizada # como a foto fake WS_FOTO_FAKE_PATH= + + + +# Configurações específicas da aplicação + +# Quais habilitações serão consideradas? +# Na EESC somente as com codhab = 0, default +CODHABS=0 +# Na ECA são consideradas as com codhab terminando em 0, 2 e 4 +# CODHABS=0,2,4 \ No newline at end of file diff --git a/app/Http/Controllers/EquivalenciaController.php b/app/Http/Controllers/EquivalenciaController.php index fc5a872..bfe82f4 100644 --- a/app/Http/Controllers/EquivalenciaController.php +++ b/app/Http/Controllers/EquivalenciaController.php @@ -11,11 +11,22 @@ class EquivalenciaController extends Controller { + public function __construct() + { + // Adiciona o middleware para marcar a URL ativa no menu da aplicação, utilizando o pacote Uspdev/Theme. + $this->middleware(function ($request, $next) { + \UspTheme::activeUrl('equivalencias'); + + return $next($request); + }); + } + /** * Display a listing of the resource. */ public function index() { + $disciplinas = Equivalencia::query() ->usp() ->with(['equivalentes' => function ($query) { diff --git a/app/Replicado/Graduacao.php b/app/Replicado/Graduacao.php new file mode 100644 index 0000000..9dfb705 --- /dev/null +++ b/app/Replicado/Graduacao.php @@ -0,0 +1,45 @@ + explode(',', env('CODHABS', 0)), +]; From 88c15cdf05daaa3dc6dd5aeda9290d4305efd459 Mon Sep 17 00:00:00 2001 From: Lucas Lopes Date: Tue, 31 Mar 2026 17:41:11 -0300 Subject: [PATCH 02/10] =?UTF-8?q?feat:=20iadiciona=20nova=20view=20de=20li?= =?UTF-8?q?stagem=20de=20cursos=20e=20refatora=20as=20demais=20na=20nova?= =?UTF-8?q?=20l=C3=B3gica?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/equivalencias/cursos.blade.php | 40 +++++++++++++++++++ resources/views/equivalencias/index.blade.php | 12 +++--- resources/views/equivalencias/show.blade.php | 12 +++--- routes/web.php | 17 ++++++-- 4 files changed, 64 insertions(+), 17 deletions(-) create mode 100644 resources/views/equivalencias/cursos.blade.php diff --git a/resources/views/equivalencias/cursos.blade.php b/resources/views/equivalencias/cursos.blade.php new file mode 100644 index 0000000..fa9f803 --- /dev/null +++ b/resources/views/equivalencias/cursos.blade.php @@ -0,0 +1,40 @@ +@extends('layouts.app') + +@section('content') +
+
+

Cursos e habilitações

+
+ +
+
+ @if (empty($cursos)) +

Nenhum curso/habilitação ativo encontrado.

+ @else +
+ + + + + + + + + @foreach ($cursos as $curso) + + + + + + @endforeach + +
CursoHabilitação
+ + {{ $curso['nomcur'] ?? '-' }} ({{ $curso['codcur'] ?? '-' }}) + {{ $curso['nomhab'] ?? '-' }} ({{ $curso['codhab'] ?? '-' }})
+
+ @endif +
+
+
+@endsection diff --git a/resources/views/equivalencias/index.blade.php b/resources/views/equivalencias/index.blade.php index 5a898c9..8912c85 100644 --- a/resources/views/equivalencias/index.blade.php +++ b/resources/views/equivalencias/index.blade.php @@ -3,8 +3,10 @@ @section('content')
-

Equivalências Automáticas

- @include('equivalencias.partials.modal-create') + Cursos +
+

Equivalências Automáticas ({{ $codcur }}/{{ $codhab }})

+
@include('equivalencias.partials.modal-create')
@@ -18,19 +20,15 @@ Código Nome Verdis - Codcur - Codhab Equivalências @foreach ($disciplinas as $disciplina) - {{ $disciplina->coddis }} + {{ $disciplina->coddis }} {{ $disciplina->nome_disciplina ?: '-' }} {{ $disciplina->verdis ?: '-' }} - {{ $disciplina->codcur ?: '-' }} - {{ $disciplina->codhab ?: '-' }} @forelse ($disciplina->equivalentes as $equivalencia)
{{ $equivalencia->coddis ?: '-' }} - {{ $equivalencia->nome_disciplina ?: '-' }}
diff --git a/resources/views/equivalencias/show.blade.php b/resources/views/equivalencias/show.blade.php index ef8dd25..afa7955 100644 --- a/resources/views/equivalencias/show.blade.php +++ b/resources/views/equivalencias/show.blade.php @@ -3,7 +3,9 @@ @section('content')
@@ -18,8 +20,6 @@ Código Nome Verdis - Codcur - Codhab Ações @@ -28,12 +28,10 @@ {{ $disciplina->coddis ?: '-' }} {{ $disciplina->nome_disciplina ?: '-' }} {{ $disciplina->verdis ?: '-' }} - {{ $disciplina->codcur ?: '-' }} - {{ $disciplina->codhab ?: '-' }}
@include('equivalencias.partials.modal-edit') -
+ @csrf @method('DELETE') @@ -81,7 +79,7 @@ {{ $equivalencia->carga_horaria ?: '-' }}
- + @csrf @method('DELETE') diff --git a/routes/web.php b/routes/web.php index 7506b3a..1b6cfdc 100644 --- a/routes/web.php +++ b/routes/web.php @@ -19,10 +19,21 @@ Route::get('/', [WorkflowController::class, 'home'])->name('workflows.index'); Route::middleware(['auth'])->group(function () { - Route::resource('equivalencias', EquivalenciaController::class)->except(['create', 'edit']); - Route::post('/equivalencias/{equivalencia}/equivalencias', [EquivalenciaController::class, 'addEquivalencia']) + Route::get('/equivalencias', [EquivalenciaController::class, 'cursos']) + ->name('equivalencias.index'); + Route::get('/equivalencias/{codcur}/{codhab}', [EquivalenciaController::class, 'index']) + ->name('equivalencias.curso'); + Route::post('/equivalencias/{codcur}/{codhab}', [EquivalenciaController::class, 'store']) + ->name('equivalencias.store'); + Route::get('/equivalencias/{codcur}/{codhab}/{equivalencia}', [EquivalenciaController::class, 'show']) + ->name('equivalencias.show'); + Route::put('/equivalencias/{codcur}/{codhab}/{equivalencia}', [EquivalenciaController::class, 'update']) + ->name('equivalencias.update'); + Route::delete('/equivalencias/{codcur}/{codhab}/{equivalencia}', [EquivalenciaController::class, 'destroy']) + ->name('equivalencias.destroy'); + Route::post('/equivalencias/{codcur}/{codhab}/{equivalencia}/equivalencias', [EquivalenciaController::class, 'addEquivalencia']) ->name('equivalencias.add-equivalencia'); - Route::delete('/equivalencias/{equivalencia}/equivalencias/{equivalenciaFilha}', [EquivalenciaController::class, 'destroyEquivalencia']) + Route::delete('/equivalencias/{codcur}/{codhab}/{equivalencia}/equivalencias/{equivalenciaFilha}', [EquivalenciaController::class, 'destroyEquivalencia']) ->name('equivalencias.destroy-equivalencia'); Route::get('/createdefinition', [WorkflowController::class, 'createDefinition'])->name('workflows.create-definition'); From cbd5607926ec4cd7351d2d26ef9c04e937b95a56 Mon Sep 17 00:00:00 2001 From: Lucas Lopes Date: Wed, 1 Apr 2026 14:11:18 -0300 Subject: [PATCH 03/10] =?UTF-8?q?feat:=20adiciona=20valida=C3=A7=C3=A3o=20?= =?UTF-8?q?espec=C3=ADfica=20em=20requests=20de=20equival=C3=AAncias=20dir?= =?UTF-8?q?etas=20e=20remove=20scripts=20desnecess=C3=A1rios=20do=20modal?= =?UTF-8?q?=20de=20edi=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/EquivalenciaController.php | 115 ++++++++++++------ .../Requests/StoreEquivalenciaRequest.php | 9 +- .../partials/modal-edit.blade.php | 10 -- 3 files changed, 88 insertions(+), 46 deletions(-) diff --git a/app/Http/Controllers/EquivalenciaController.php b/app/Http/Controllers/EquivalenciaController.php index bfe82f4..22e4df5 100644 --- a/app/Http/Controllers/EquivalenciaController.php +++ b/app/Http/Controllers/EquivalenciaController.php @@ -5,9 +5,9 @@ use App\Http\Requests\StoreEquivalenciaRequest; use App\Http\Requests\UpdateEquivalenciaRequest; use App\Models\Equivalencia; -use Symfony\Component\HttpFoundation\Request; +use App\Replicado\Graduacao; +use Illuminate\Http\Request; use Uspdev\Forms\Form; -use Uspdev\Replicado\Graduacao; class EquivalenciaController extends Controller { @@ -22,13 +22,33 @@ public function __construct() } /** - * Display a listing of the resource. + * Lista os cursos e habilitações disponíveis para cadastro de equivalências. + * Cada curso/habilitação é um link que leva para a página de disciplinas + * USP equivalentes cadastradas para aquele curso/habilitação. */ - public function index() + public function cursos() + { + $cursos = Graduacao::listarCursosHabilitacoes(); + + return view('equivalencias.cursos', [ + 'cursos' => $cursos, + ]); + } + + /** + * Exibe a lista de disciplinas USP equivalentes para um curso/habilitação específico. + * Pega o codcur e codhab da rota, + * busca as disciplinas USP equivalentes cadastradas para esse curso/habilitação, + * e retorna para a view. A view é responsável por exibir as disciplinas USP + * e os formulários para criar/editar as disciplinas USP e adicionar/remover equivalências. + */ + public function index(int $codcur, int $codhab) { $disciplinas = Equivalencia::query() ->usp() + ->where('codcur', $codcur) + ->where('codhab', $codhab) ->with(['equivalentes' => function ($query) { $query->orderBy('coddis'); }]) @@ -37,9 +57,11 @@ public function index() return view('equivalencias.index', [ 'disciplinas' => $disciplinas, + 'codcur' => $codcur, + 'codhab' => $codhab, 'formHtmlCreate' => $this->buildFormHtml( 'eq_usp_create', - route('equivalencias.store'), + route('equivalencias.store', ['codcur' => $codcur, 'codhab' => $codhab]), 'POST', $this->oldInputForFields(['coddis']) ), @@ -47,28 +69,33 @@ public function index() } /** - * Store a newly created resource in storage. + * Armazena uma nova disciplina USP equivalente para um curso/habilitação específico. + * Pega o codcur e codhab da rota, valida os dados do formulário utilizando a StoreEquivalenciaRequest, + * preenche os dados da disciplina USP com as informações do Replicado */ - public function store(StoreEquivalenciaRequest $request) + public function store(StoreEquivalenciaRequest $request, int $codcur, int $codhab) { $dados = $request->validated(); $dados['equivalencias_id'] = null; $dados['tipo'] = Equivalencia::TIPO_AUTOMATICA; + $dados['codcur'] = $codcur; + $dados['codhab'] = $codhab; $dados = $this->preencherDadosDisciplinaUsp($dados); $equivalencia = Equivalencia::create($dados); return redirect() - ->route('equivalencias.show', $equivalencia) + ->route('equivalencias.show', [$codcur, $codhab, $equivalencia]) ->with('alert-success', 'Disciplina USP criada com sucesso.'); } /** * Display the specified resource. */ - public function show(Equivalencia $equivalencia) + public function show(int $codcur, int $codhab, Equivalencia $equivalencia) { abort_unless($equivalencia->isUsp(), 404); + abort_unless($this->equivalenciaPertenceAoCurso($equivalencia, $codcur, $codhab), 404); $equivalencia->load(['equivalentes' => function ($query) { $query->orderBy('coddis'); @@ -77,21 +104,18 @@ public function show(Equivalencia $equivalencia) return view('equivalencias.show', [ 'disciplina' => $equivalencia, 'equivalencias' => $equivalencia->equivalentes, - 'formHtmlEdit' => $this->addHiddenModalField( - $this->buildFormHtml( - 'eq_usp_edit', - route('equivalencias.update', $equivalencia), - 'PUT', - $this->oldInputForFields( - ['coddis'], - ['coddis' => $equivalencia->coddis] - ) - ), - 'equivalencia-edit' + 'formHtmlEdit' => $this->buildFormHtml( + 'eq_usp_edit', + route('equivalencias.update', [$codcur, $codhab, $equivalencia]), + 'PUT', + $this->oldInputForFields( + ['coddis'], + ['coddis' => $equivalencia->coddis] + ) ), 'formHtmlEquivalencia' => $this->buildFormHtml( 'eq_child_add', - route('equivalencias.add-equivalencia', $equivalencia), + route('equivalencias.add-equivalencia', [$codcur, $codhab, $equivalencia]), 'POST', $this->oldInputForFields([ 'coddis', @@ -101,69 +125,89 @@ public function show(Equivalencia $equivalencia) 'carga_horaria', ]) ), + 'codcur' => $codcur, + 'codhab' => $codhab, ]); } /** * Update the specified resource in storage. */ - public function update(UpdateEquivalenciaRequest $request, Equivalencia $equivalencia) + public function update(UpdateEquivalenciaRequest $request, int $codcur, int $codhab, Equivalencia $equivalencia) { abort_unless($equivalencia->isUsp(), 404); + abort_unless($this->equivalenciaPertenceAoCurso($equivalencia, $codcur, $codhab), 404); $dados = $request->validated(); $dados['tipo'] = Equivalencia::TIPO_AUTOMATICA; + $dados['codcur'] = $codcur; + $dados['codhab'] = $codhab; $dados = $this->preencherDadosDisciplinaUsp($dados, $equivalencia->coddis); $equivalencia->update($dados); return redirect() - ->route('equivalencias.show', $equivalencia) + ->route('equivalencias.show', [$codcur, $codhab, $equivalencia]) ->with('alert-success', 'Disciplina USP atualizada com sucesso.'); } /** - * Remove the specified resource from storage. + * Deleta a disciplina USP, o que também deleta as equivalências + filhas devido à relação de chave estrangeira com cascade on delete */ - public function destroy(Equivalencia $equivalencia) + public function destroy(int $codcur, int $codhab, Equivalencia $equivalencia) { abort_unless($equivalencia->isUsp(), 404); + abort_unless($this->equivalenciaPertenceAoCurso($equivalencia, $codcur, $codhab), 404); $equivalencia->delete(); return redirect() - ->route('equivalencias.index') + ->route('equivalencias.curso', [$codcur, $codhab]) ->with('alert-success', 'Disciplina USP removida com sucesso.'); } - public function addEquivalencia(Request $request, Equivalencia $equivalencia) + /** + * Adiciona uma nova disciplina equivalente (filha) para uma disciplina USP (pai). + * Pega o codcur, codhab e a disciplina USP (pai) da rota + */ + public function addEquivalencia(Request $request, int $codcur, int $codhab, Equivalencia $equivalencia) { abort_unless($equivalencia->isUsp(), 404); + abort_unless($this->equivalenciaPertenceAoCurso($equivalencia, $codcur, $codhab), 404); $request['equivalencias_id'] = $equivalencia->id; $request['tipo'] = Equivalencia::TIPO_CURSADA; + $request['codcur'] = $codcur; + $request['codhab'] = $codhab; Equivalencia::create($request->all()); return redirect() - ->route('equivalencias.show', $equivalencia) + ->route('equivalencias.show', [$codcur, $codhab, $equivalencia]) ->with('alert-success', 'Equivalência adicionada com sucesso.'); } - public function destroyEquivalencia(Equivalencia $equivalencia, Equivalencia $equivalenciaFilha) + /** + * Remove uma disciplina equivalente (filha) de uma disciplina USP (pai). + */ + public function destroyEquivalencia(int $codcur, int $codhab, Equivalencia $equivalencia, Equivalencia $equivalenciaFilha) { abort_unless($equivalencia->isUsp(), 404); + abort_unless($this->equivalenciaPertenceAoCurso($equivalencia, $codcur, $codhab), 404); abort_unless($equivalenciaFilha->equivalencias_id === $equivalencia->id, 404); $equivalenciaFilha->delete(); return redirect() - ->route('equivalencias.show', $equivalencia) + ->route('equivalencias.show', [$codcur, $codhab, $equivalencia]) ->with('alert-success', 'Equivalência removida com sucesso.'); } - // Cria um formulário HTML para as views, utilizando a classe Form do pacote Uspdev/Forms. + /** + * Cria o HTML do formulário utilizando o pacote Uspdev/Forms + */ private function buildFormHtml(string $name, string $action, string $method, array $values): string { $form = new Form([ @@ -209,15 +253,16 @@ private function preencherDadosDisciplinaUsp(array $dados, ?string $coddisAtual $dados['creditos'] = $disciplina['creaul'] ?? $dados['creditos'] ?? null; $dados['carga_horaria'] = $disciplina['numhor'] ?? $dados['carga_horaria'] ?? null; $dados['nomcur'] = $disciplina['nomcur'] ?? $dados['nomcur'] ?? null; - $dados['codcur'] = $disciplina['codcur'] ?? $dados['codcur'] ?? null; - $dados['codhab'] = $disciplina['codhab'] ?? $dados['codhab'] ?? null; + $dados['codcur'] = $dados['codcur'] ?? $disciplina['codcur'] ?? null; + $dados['codhab'] = $dados['codhab'] ?? $disciplina['codhab'] ?? null; return $dados; } - private function addHiddenModalField(string $formHtml, string $value): string + private function equivalenciaPertenceAoCurso(Equivalencia $equivalencia, int $codcur, int $codhab): bool { - return str_replace('', '', $formHtml); + return (int) $equivalencia->codcur === $codcur + && (int) $equivalencia->codhab === $codhab; } private function buscarDisciplinaNoReplicado(?string $coddis): ?array diff --git a/app/Http/Requests/StoreEquivalenciaRequest.php b/app/Http/Requests/StoreEquivalenciaRequest.php index ef7fb43..d1a7923 100644 --- a/app/Http/Requests/StoreEquivalenciaRequest.php +++ b/app/Http/Requests/StoreEquivalenciaRequest.php @@ -22,9 +22,16 @@ public function authorize(): bool */ public function rules(): array { + // Obter os parâmetros da rota + $codcur = (int) $this->route('codcur'); + $codhab = (int) $this->route('codhab'); + return [ 'coddis' => [ - Rule::unique('equivalencias')->whereNull('equivalencias_id'), + Rule::unique('equivalencias') + ->whereNull('equivalencias_id') + ->where('codcur', $codcur) + ->where('codhab', $codhab), ], ]; diff --git a/resources/views/equivalencias/partials/modal-edit.blade.php b/resources/views/equivalencias/partials/modal-edit.blade.php index 1d851b5..b9dc860 100644 --- a/resources/views/equivalencias/partials/modal-edit.blade.php +++ b/resources/views/equivalencias/partials/modal-edit.blade.php @@ -28,13 +28,3 @@
-@section('javascripts_bottom') - @parent - -@endsection From 141c6912ba8f6d610160f75e1ce019d9b455c414 Mon Sep 17 00:00:00 2001 From: Lucas Lopes Date: Wed, 1 Apr 2026 14:11:38 -0300 Subject: [PATCH 04/10] =?UTF-8?q?feat:=20adiciona=20valida=C3=A7=C3=A3o=20?= =?UTF-8?q?de=20unicidade=20para=20'coddis'=20com=20base=20em=20'codcur'?= =?UTF-8?q?=20e=20'codhab'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Requests/UpdateEquivalenciaRequest.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/Http/Requests/UpdateEquivalenciaRequest.php b/app/Http/Requests/UpdateEquivalenciaRequest.php index ecaa3e6..d479faa 100644 --- a/app/Http/Requests/UpdateEquivalenciaRequest.php +++ b/app/Http/Requests/UpdateEquivalenciaRequest.php @@ -27,12 +27,16 @@ public function rules(): array $equivalenciaId = $equivalencia instanceof Equivalencia ? $equivalencia->id : $equivalencia; + // Obter os parâmetros da rota + $codcur = (int) $this->route('codcur'); + $codhab = (int) $this->route('codhab'); return [ 'coddis' => [ - 'sometimes', Rule::unique('equivalencias') ->whereNull('equivalencias_id') + ->where('codcur', $codcur) + ->where('codhab', $codhab) ->ignore($equivalenciaId), ], ]; From 5c3724361f98d810d6f9f9c5e333f07a8e028c9b Mon Sep 17 00:00:00 2001 From: Lucas Lopes Date: Wed, 1 Apr 2026 14:24:48 -0300 Subject: [PATCH 05/10] =?UTF-8?q?feat:=20atualiza=20coment=C3=A1rios=20par?= =?UTF-8?q?a=20melhorar=20a=20documenta=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 4 ++-- app/Http/Controllers/EquivalenciaController.php | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.env.example b/.env.example index 175171f..10958ce 100644 --- a/.env.example +++ b/.env.example @@ -170,9 +170,9 @@ WS_FOTO_FAKE_PATH= -# Configurações específicas da aplicação +# Configurações específicas da aplicação ################################ -# Quais habilitações serão consideradas? +# Define quais códigos de habilitação serão considerados pela aplicação. # Na EESC somente as com codhab = 0, default CODHABS=0 # Na ECA são consideradas as com codhab terminando em 0, 2 e 4 diff --git a/app/Http/Controllers/EquivalenciaController.php b/app/Http/Controllers/EquivalenciaController.php index 22e4df5..ecdf4c8 100644 --- a/app/Http/Controllers/EquivalenciaController.php +++ b/app/Http/Controllers/EquivalenciaController.php @@ -258,13 +258,14 @@ private function preencherDadosDisciplinaUsp(array $dados, ?string $coddisAtual return $dados; } - + // Verifica se a disciplina USP (equivalencia) pertence ao curso e habilitação especificados pelos códigos codcur e codhab. private function equivalenciaPertenceAoCurso(Equivalencia $equivalencia, int $codcur, int $codhab): bool { return (int) $equivalencia->codcur === $codcur && (int) $equivalencia->codhab === $codhab; } + // Busca os dados da disciplina no Replicado a partir do código da disciplina (coddis). private function buscarDisciplinaNoReplicado(?string $coddis): ?array { if (! $coddis) { From 6eb4ae1209619c7eade7f4b408086fa238a96ec7 Mon Sep 17 00:00:00 2001 From: Lucas Lopes Date: Wed, 1 Apr 2026 16:17:04 -0300 Subject: [PATCH 06/10] =?UTF-8?q?feat:=20adiciona=20funcionalidade=20para?= =?UTF-8?q?=20atualizar=20disciplinas=20equivalentes=20externas=20e=20impl?= =?UTF-8?q?ementa=20modal=20de=20edi=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/EquivalenciaController.php | 61 +++++++++++++++++++ .../modal-edit-equivalencia.blade.php | 29 +++++++++ resources/views/equivalencias/show.blade.php | 1 + routes/web.php | 5 +- 4 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 resources/views/equivalencias/partials/modal-edit-equivalencia.blade.php diff --git a/app/Http/Controllers/EquivalenciaController.php b/app/Http/Controllers/EquivalenciaController.php index ecdf4c8..0f32c8a 100644 --- a/app/Http/Controllers/EquivalenciaController.php +++ b/app/Http/Controllers/EquivalenciaController.php @@ -7,6 +7,7 @@ use App\Models\Equivalencia; use App\Replicado\Graduacao; use Illuminate\Http\Request; +use Illuminate\Validation\Rule; use Uspdev\Forms\Form; class EquivalenciaController extends Controller @@ -125,6 +126,24 @@ public function show(int $codcur, int $codhab, Equivalencia $equivalencia) 'carga_horaria', ]) ), + 'formHtmlEquivalenciaEdit' => $equivalencia->equivalentes + ->mapWithKeys(function (Equivalencia $equivalenciaFilha) use ($codcur, $codhab, $equivalencia) { + return [ + $equivalenciaFilha->id => $this->buildFormHtml( + 'eq_child_add', + route('equivalencias.update-equivalencia', [$codcur, $codhab, $equivalencia, $equivalenciaFilha]), + 'PUT', + [ + 'coddis' => $equivalenciaFilha->coddis, + 'nome_disciplina' => $equivalenciaFilha->nome_disciplina, + 'ies' => $equivalenciaFilha->ies, + 'creditos' => $equivalenciaFilha->creditos, + 'carga_horaria' => $equivalenciaFilha->carga_horaria, + ] + ), + ]; + }) + ->all(), 'codcur' => $codcur, 'codhab' => $codhab, ]); @@ -189,6 +208,48 @@ public function addEquivalencia(Request $request, int $codcur, int $codhab, Equi ->with('alert-success', 'Equivalência adicionada com sucesso.'); } + /** + * Atualiza uma disciplina equivalente (filha) de uma disciplina USP (pai). + */ + public function updateEquivalencia(Request $request, int $codcur, int $codhab, Equivalencia $equivalencia, Equivalencia $equivalenciaFilha) + { + abort_unless($equivalencia->isUsp(), 404); + abort_unless($this->equivalenciaPertenceAoCurso($equivalencia, $codcur, $codhab), 404); + abort_unless($equivalenciaFilha->isEquivalencia(), 404); + abort_unless($equivalenciaFilha->equivalencias_id === $equivalencia->id, 404); + + $dados = $request->validate([ + 'coddis' => [ + 'required', + 'string', + 'max:7', + Rule::unique('equivalencias', 'coddis') + ->where(function ($query) use ($equivalencia, $codcur, $codhab) { + return $query + ->where('equivalencias_id', $equivalencia->id) + ->where('codcur', $codcur) + ->where('codhab', $codhab); + }) + ->ignore($equivalenciaFilha->id), + ], + 'nome_disciplina' => ['required', 'string', 'max:240'], + 'ies' => ['required', 'string', 'max:255'], + 'creditos' => ['required', 'integer', 'min:0', 'max:20'], + 'carga_horaria' => ['required', 'integer', 'min:1', 'max:1200'], + ]); + + $dados['equivalencias_id'] = $equivalencia->id; + $dados['tipo'] = Equivalencia::TIPO_CURSADA; + $dados['codcur'] = $codcur; + $dados['codhab'] = $codhab; + + $equivalenciaFilha->update($dados); + + return redirect() + ->route('equivalencias.show', [$codcur, $codhab, $equivalencia]) + ->with('alert-success', 'Equivalência atualizada com sucesso.'); + } + /** * Remove uma disciplina equivalente (filha) de uma disciplina USP (pai). */ diff --git a/resources/views/equivalencias/partials/modal-edit-equivalencia.blade.php b/resources/views/equivalencias/partials/modal-edit-equivalencia.blade.php new file mode 100644 index 0000000..33939f9 --- /dev/null +++ b/resources/views/equivalencias/partials/modal-edit-equivalencia.blade.php @@ -0,0 +1,29 @@ + + + diff --git a/resources/views/equivalencias/show.blade.php b/resources/views/equivalencias/show.blade.php index afa7955..2161354 100644 --- a/resources/views/equivalencias/show.blade.php +++ b/resources/views/equivalencias/show.blade.php @@ -79,6 +79,7 @@ {{ $equivalencia->carga_horaria ?: '-' }}
+ @include('equivalencias.partials.modal-edit-equivalencia')
@csrf @method('DELETE') diff --git a/routes/web.php b/routes/web.php index 1b6cfdc..3f9f6fc 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,8 +1,8 @@ name('workflows.index'); Route::middleware(['auth'])->group(function () { @@ -33,6 +32,8 @@ ->name('equivalencias.destroy'); Route::post('/equivalencias/{codcur}/{codhab}/{equivalencia}/equivalencias', [EquivalenciaController::class, 'addEquivalencia']) ->name('equivalencias.add-equivalencia'); + Route::put('/equivalencias/{codcur}/{codhab}/{equivalencia}/equivalencias/{equivalenciaFilha}', [EquivalenciaController::class, 'updateEquivalencia']) + ->name('equivalencias.update-equivalencia'); Route::delete('/equivalencias/{codcur}/{codhab}/{equivalencia}/equivalencias/{equivalenciaFilha}', [EquivalenciaController::class, 'destroyEquivalencia']) ->name('equivalencias.destroy-equivalencia'); From f5498248377aa2e009e0dc8b5b25ce9f1b5e28a5 Mon Sep 17 00:00:00 2001 From: Lucas Lopes Date: Wed, 1 Apr 2026 16:41:30 -0300 Subject: [PATCH 07/10] =?UTF-8?q?fix:=20ajusta=20a=20valida=C3=A7=C3=A3o?= =?UTF-8?q?=20de=20dados=20na=20atualiza=C3=A7=C3=A3o=20de=20equival=C3=AA?= =?UTF-8?q?ncias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/EquivalenciaController.php | 20 +------------------ 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/app/Http/Controllers/EquivalenciaController.php b/app/Http/Controllers/EquivalenciaController.php index 0f32c8a..611daf0 100644 --- a/app/Http/Controllers/EquivalenciaController.php +++ b/app/Http/Controllers/EquivalenciaController.php @@ -218,25 +218,7 @@ public function updateEquivalencia(Request $request, int $codcur, int $codhab, E abort_unless($equivalenciaFilha->isEquivalencia(), 404); abort_unless($equivalenciaFilha->equivalencias_id === $equivalencia->id, 404); - $dados = $request->validate([ - 'coddis' => [ - 'required', - 'string', - 'max:7', - Rule::unique('equivalencias', 'coddis') - ->where(function ($query) use ($equivalencia, $codcur, $codhab) { - return $query - ->where('equivalencias_id', $equivalencia->id) - ->where('codcur', $codcur) - ->where('codhab', $codhab); - }) - ->ignore($equivalenciaFilha->id), - ], - 'nome_disciplina' => ['required', 'string', 'max:240'], - 'ies' => ['required', 'string', 'max:255'], - 'creditos' => ['required', 'integer', 'min:0', 'max:20'], - 'carga_horaria' => ['required', 'integer', 'min:1', 'max:1200'], - ]); + $dados = $request->all(); $dados['equivalencias_id'] = $equivalencia->id; $dados['tipo'] = Equivalencia::TIPO_CURSADA; From 9fee7fadee9b98d67131a4db4db75accc7c7b7ba Mon Sep 17 00:00:00 2001 From: Lucas Lopes Date: Wed, 1 Apr 2026 17:13:27 -0300 Subject: [PATCH 08/10] =?UTF-8?q?feat:=20adiciona=20nome=20do=20curso=20na?= =?UTF-8?q?s=20views=20de=20equival=C3=AAncias=20e=20ajusta=20t=C3=ADtulo?= =?UTF-8?q?=20de=20cursos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/EquivalenciaController.php | 14 +++++++++++++- resources/views/equivalencias/cursos.blade.php | 2 +- resources/views/equivalencias/index.blade.php | 2 +- resources/views/equivalencias/show.blade.php | 2 +- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/EquivalenciaController.php b/app/Http/Controllers/EquivalenciaController.php index 611daf0..fc76c62 100644 --- a/app/Http/Controllers/EquivalenciaController.php +++ b/app/Http/Controllers/EquivalenciaController.php @@ -7,7 +7,6 @@ use App\Models\Equivalencia; use App\Replicado\Graduacao; use Illuminate\Http\Request; -use Illuminate\Validation\Rule; use Uspdev\Forms\Form; class EquivalenciaController extends Controller @@ -46,6 +45,11 @@ public function cursos() public function index(int $codcur, int $codhab) { + $curso = collect(Graduacao::listarCursosHabilitacoes()) + ->first(fn ($item) => (int) $item['codcur'] === $codcur && (int) $item['codhab'] === $codhab); + + abort_unless($curso, 404); + $disciplinas = Equivalencia::query() ->usp() ->where('codcur', $codcur) @@ -60,6 +64,7 @@ public function index(int $codcur, int $codhab) 'disciplinas' => $disciplinas, 'codcur' => $codcur, 'codhab' => $codhab, + 'nomeCurso' => $curso['nomcur'], 'formHtmlCreate' => $this->buildFormHtml( 'eq_usp_create', route('equivalencias.store', ['codcur' => $codcur, 'codhab' => $codhab]), @@ -98,6 +103,11 @@ public function show(int $codcur, int $codhab, Equivalencia $equivalencia) abort_unless($equivalencia->isUsp(), 404); abort_unless($this->equivalenciaPertenceAoCurso($equivalencia, $codcur, $codhab), 404); + $curso = collect(Graduacao::listarCursosHabilitacoes()) + ->first(fn ($item) => (int) $item['codcur'] === $codcur && (int) $item['codhab'] === $codhab); + + abort_unless($curso, 404); + $equivalencia->load(['equivalentes' => function ($query) { $query->orderBy('coddis'); }]); @@ -105,6 +115,7 @@ public function show(int $codcur, int $codhab, Equivalencia $equivalencia) return view('equivalencias.show', [ 'disciplina' => $equivalencia, 'equivalencias' => $equivalencia->equivalentes, + 'nomeCurso' => $curso['nomcur'], 'formHtmlEdit' => $this->buildFormHtml( 'eq_usp_edit', route('equivalencias.update', [$codcur, $codhab, $equivalencia]), @@ -301,6 +312,7 @@ private function preencherDadosDisciplinaUsp(array $dados, ?string $coddisAtual return $dados; } + // Verifica se a disciplina USP (equivalencia) pertence ao curso e habilitação especificados pelos códigos codcur e codhab. private function equivalenciaPertenceAoCurso(Equivalencia $equivalencia, int $codcur, int $codhab): bool { diff --git a/resources/views/equivalencias/cursos.blade.php b/resources/views/equivalencias/cursos.blade.php index fa9f803..8405118 100644 --- a/resources/views/equivalencias/cursos.blade.php +++ b/resources/views/equivalencias/cursos.blade.php @@ -3,7 +3,7 @@ @section('content')
-

Cursos e habilitações

+

Cursos

diff --git a/resources/views/equivalencias/index.blade.php b/resources/views/equivalencias/index.blade.php index 8912c85..5b2ba64 100644 --- a/resources/views/equivalencias/index.blade.php +++ b/resources/views/equivalencias/index.blade.php @@ -5,7 +5,7 @@
Cursos
-

Equivalências Automáticas ({{ $codcur }}/{{ $codhab }})

+

{{ $nomeCurso ?? $disciplinas->first()->nomcur ?? 'Curso' }} ({{ $codcur }}/{{ $codhab }})

@include('equivalencias.partials.modal-create')
diff --git a/resources/views/equivalencias/show.blade.php b/resources/views/equivalencias/show.blade.php index 2161354..5a134b1 100644 --- a/resources/views/equivalencias/show.blade.php +++ b/resources/views/equivalencias/show.blade.php @@ -5,7 +5,7 @@ From a07336b7f77d7782f17dccb22d2ffc441929ca2d Mon Sep 17 00:00:00 2001 From: Lucas Lopes Date: Wed, 1 Apr 2026 17:20:21 -0300 Subject: [PATCH 09/10] feat: renomeia colunas da tabela de disciplinas --- resources/views/equivalencias/show.blade.php | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/resources/views/equivalencias/show.blade.php b/resources/views/equivalencias/show.blade.php index 5a134b1..04a996f 100644 --- a/resources/views/equivalencias/show.blade.php +++ b/resources/views/equivalencias/show.blade.php @@ -17,16 +17,14 @@ - - + - - +
CódigoNomeDisciplina requerida Verdis Ações
{{ $disciplina->coddis ?: '-' }}{{ $disciplina->nome_disciplina ?: '-' }}({{ $disciplina->coddis ?: '-' }}) {{ $disciplina->nome_disciplina ?: '-' }} {{ $disciplina->verdis ?: '-' }}
@@ -60,8 +58,7 @@ - - + @@ -72,8 +69,7 @@ @foreach ($equivalencias as $equivalencia) - - + From baf5d2e5f21b74cdc73b466ab945aa0896140b35 Mon Sep 17 00:00:00 2001 From: Lucas Lopes Date: Wed, 1 Apr 2026 17:51:00 -0300 Subject: [PATCH 10/10] =?UTF-8?q?feat:=20remove=20creditos=20e=20carga=5Fh?= =?UTF-8?q?oraria=20da=20adi=C3=A7=C3=A3o=20de=20equivalencia=20autom?= =?UTF-8?q?=C3=A1tica?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/EquivalenciaController.php | 4 ---- database/seeders/FormDefinitionsTableSeeder.php | 2 +- resources/views/equivalencias/show.blade.php | 4 ---- 3 files changed, 1 insertion(+), 9 deletions(-) diff --git a/app/Http/Controllers/EquivalenciaController.php b/app/Http/Controllers/EquivalenciaController.php index fc76c62..ec3a391 100644 --- a/app/Http/Controllers/EquivalenciaController.php +++ b/app/Http/Controllers/EquivalenciaController.php @@ -133,8 +133,6 @@ public function show(int $codcur, int $codhab, Equivalencia $equivalencia) 'coddis', 'nome_disciplina', 'ies', - 'creditos', - 'carga_horaria', ]) ), 'formHtmlEquivalenciaEdit' => $equivalencia->equivalentes @@ -148,8 +146,6 @@ public function show(int $codcur, int $codhab, Equivalencia $equivalencia) 'coddis' => $equivalenciaFilha->coddis, 'nome_disciplina' => $equivalenciaFilha->nome_disciplina, 'ies' => $equivalenciaFilha->ies, - 'creditos' => $equivalenciaFilha->creditos, - 'carga_horaria' => $equivalenciaFilha->carga_horaria, ] ), ]; diff --git a/database/seeders/FormDefinitionsTableSeeder.php b/database/seeders/FormDefinitionsTableSeeder.php index 835efdd..2a82b74 100644 --- a/database/seeders/FormDefinitionsTableSeeder.php +++ b/database/seeders/FormDefinitionsTableSeeder.php @@ -33,7 +33,7 @@ public function run() [21, 'tr_finalizar_enviar', 'equivalencia', null, '[{"name":"obs","type":"texttextarea","label":"Observações sobre finalização","required":false},{"name":"definition_name","type":"hidden","value":"workflowDefinitionName"},{"name":"place","type":"hidden","value":"place_name"},{"name":"transition","type":"hidden","value":"transition_name"}]', '2025-03-17 19:33:49', '2025-03-17 19:33:49'], [22, 'eq_usp_create', 'equivalencia-crud', 'Cadastro de disciplina USP', '[[{"name":"coddis","type":"disciplina-usp","label":"Código da disciplina","required":true}]]', '2025-03-17 19:33:49', '2025-03-17 19:33:49'], [23, 'eq_usp_edit', 'equivalencia-crud', 'Edição de disciplina USP', '[[{"name":"coddis","type":"disciplina-usp","label":"Código da disciplina","required":true}]]', '2025-03-17 19:33:49', '2025-03-17 19:33:49'], - [24, 'eq_child_add', 'equivalencia-crud', 'Cadastro de equivalência', '[[{"name":"coddis","type":"text","label":"Código","maxlength":"7","width":3,"required":true},{"name":"nome_disciplina","type":"text","label":"Nome da equivalência","maxlength":"240","required":true}],[{"name":"ies","type":"text","label":"IES","maxlength":"255","required":true}],[{"name":"creditos","type":"number","label":"Créditos","min":0,"max":20,"width":3,"required":true},{"name":"carga_horaria","type":"number","label":"Carga horária","min":0,"max":1000,"width":3,"required":true}]]', '2025-03-17 19:33:49', '2025-03-17 19:33:49'], + [24, 'eq_child_add', 'equivalencia-crud', 'Cadastro de equivalência', '[[{"name":"coddis","type":"text","label":"Código","maxlength":"7","width":3,"required":true},{"name":"nome_disciplina","type":"text","label":"Nome da equivalência","maxlength":"240","required":true}],[{"name":"ies","type":"text","label":"IES","maxlength":"255","required":true}]]', '2025-03-17 19:33:49', '2025-03-17 19:33:49'], ]; foreach ($formDefinitions as $formDefinition) { diff --git a/resources/views/equivalencias/show.blade.php b/resources/views/equivalencias/show.blade.php index 04a996f..ebe6a4d 100644 --- a/resources/views/equivalencias/show.blade.php +++ b/resources/views/equivalencias/show.blade.php @@ -60,8 +60,6 @@ - - @@ -71,8 +69,6 @@ - -
CódigoNomeDisciplina equivalente IES Créditos Carga horária
{{ $equivalencia->coddis }}{{ $equivalencia->nome_disciplina ?: '-' }}({{ $equivalencia->coddis ?: '-' }}) {{ $equivalencia->nome_disciplina ?: '-' }} {{ $equivalencia->ies ?: '-' }} {{ $equivalencia->creditos ?: '-' }} {{ $equivalencia->carga_horaria ?: '-' }}
Disciplina equivalente IESCréditosCarga horária
({{ $equivalencia->coddis ?: '-' }}) {{ $equivalencia->nome_disciplina ?: '-' }} {{ $equivalencia->ies ?: '-' }}{{ $equivalencia->creditos ?: '-' }}{{ $equivalencia->carga_horaria ?: '-' }}
@include('equivalencias.partials.modal-edit-equivalencia')