feat: módulo de evaluaciones para admin con constructor dinámico

- Modelos completos: Evaluacion, EvaluacionTipo, Pregunta, PreguntaTipo,
  PreguntaOpcion, EvaluacionSubmission, Respuesta (con $table explícito
  para nombres en español que Laravel pluraliza incorrectamente)
- Relaciones evaluaciones() añadidas a Plantel y Nivel
- EvaluacionBuilder (Livewire): constructor interactivo con preguntas
  de tipo texto libre, opción múltiple, escala 1-5/1-10 y sí/no;
  reorden con flechas, vista previa por tipo, selección de planteles
  y niveles, configuración de estado, fechas y flag de anónima
- EvaluacionController: CRUD completo + toggleStatus
- Vistas: index, create/edit (con Livewire builder), show con detalle
  de preguntas y cambio de estado
- Rutas resource /evaluacion + PATCH /evaluacion/{id}/status
- Migraciones: evaluaciones, preguntas, pregunta_opciones,
  evaluacion_submissions, respuestas, evaluacion_plantel, evaluacion_nivel
- Menú: enlace Evaluaciones en panel de Administrador

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-30 18:09:48 -06:00
parent f81237b23c
commit 2af36ea272
27 changed files with 1471 additions and 21 deletions
@@ -0,0 +1,64 @@
<?php
namespace App\Http\Controllers;
use App\Models\Evaluacion;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class EvaluacionController extends Controller
{
public function index()
{
$evaluaciones = Evaluacion::with('tipo')
->withCount(['preguntas', 'submissions'])
->latest()
->get();
return view('evaluacion.index', compact('evaluaciones'));
}
public function create()
{
return view('evaluacion.create');
}
public function store(Request $request)
{
// Manejado por Livewire EvaluacionBuilder
}
public function show(Evaluacion $evaluacion)
{
$evaluacion->load(['tipo', 'preguntas.tipo', 'preguntas.opciones', 'planteles', 'niveles']);
return view('evaluacion.show', compact('evaluacion'));
}
public function edit(Evaluacion $evaluacion)
{
$evaluacion->load(['preguntas.opciones', 'planteles', 'niveles']);
return view('evaluacion.create', compact('evaluacion'));
}
public function update(Request $request, Evaluacion $evaluacion)
{
// Manejado por Livewire EvaluacionBuilder
}
public function destroy(Evaluacion $evaluacion)
{
$evaluacion->delete();
return redirect()->route('evaluacion.index')->with('info', 'Evaluación eliminada.');
}
public function toggleStatus(Request $request, Evaluacion $evaluacion)
{
$request->validate(['status' => 'required|in:borrador,activa,cerrada']);
$evaluacion->update(['status' => $request->status]);
return back()->with('info', 'Estado actualizado.');
}
}