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:
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
|
||||
class Evaluacion extends Model
|
||||
{
|
||||
protected $table = 'evaluaciones';
|
||||
protected $guarded = [];
|
||||
|
||||
protected $casts = [
|
||||
'anonima' => 'boolean',
|
||||
'fecha_inicio' => 'date',
|
||||
'fecha_fin' => 'date',
|
||||
];
|
||||
|
||||
public function tipo(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(EvaluacionTipo::class, 'evaluacion_tipo_id');
|
||||
}
|
||||
|
||||
public function preguntas(): HasMany
|
||||
{
|
||||
return $this->hasMany(Pregunta::class)->orderBy('orden');
|
||||
}
|
||||
|
||||
public function planteles(): BelongsToMany
|
||||
{
|
||||
return $this->belongsToMany(Plantel::class, 'evaluacion_plantel');
|
||||
}
|
||||
|
||||
public function niveles(): BelongsToMany
|
||||
{
|
||||
return $this->belongsToMany(Nivel::class, 'evaluacion_nivel');
|
||||
}
|
||||
|
||||
public function submissions(): HasMany
|
||||
{
|
||||
return $this->hasMany(EvaluacionSubmission::class);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
|
||||
class EvaluacionSubmission extends Model
|
||||
{
|
||||
protected $guarded = [];
|
||||
|
||||
public function evaluacion(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(Evaluacion::class);
|
||||
}
|
||||
|
||||
public function user(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(User::class);
|
||||
}
|
||||
|
||||
public function respuestas(): HasMany
|
||||
{
|
||||
return $this->hasMany(Respuesta::class, 'submission_id');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
|
||||
class EvaluacionTipo extends Model
|
||||
{
|
||||
public $timestamps = false;
|
||||
protected $guarded = [];
|
||||
|
||||
public function evaluaciones(): HasMany
|
||||
{
|
||||
return $this->hasMany(Evaluacion::class);
|
||||
}
|
||||
}
|
||||
@@ -42,4 +42,9 @@ class Nivel extends Model
|
||||
'documento_tipo_id'
|
||||
);
|
||||
}
|
||||
|
||||
public function evaluaciones() : BelongsToMany
|
||||
{
|
||||
return $this->belongsToMany(Evaluacion::class, 'evaluacion_nivel');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,4 +35,9 @@ class Plantel extends Model
|
||||
{
|
||||
return $this->belongsToMany(Turno::class);
|
||||
}
|
||||
|
||||
public function evaluaciones() : BelongsToMany
|
||||
{
|
||||
return $this->belongsToMany(Evaluacion::class, 'evaluacion_plantel');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
|
||||
class Pregunta extends Model
|
||||
{
|
||||
protected $guarded = [];
|
||||
|
||||
public function evaluacion(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(Evaluacion::class);
|
||||
}
|
||||
|
||||
public function tipo(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(PreguntaTipo::class, 'pregunta_tipo_id');
|
||||
}
|
||||
|
||||
public function opciones(): HasMany
|
||||
{
|
||||
return $this->hasMany(PreguntaOpcion::class)->orderBy('orden');
|
||||
}
|
||||
|
||||
public function respuestas(): HasMany
|
||||
{
|
||||
return $this->hasMany(Respuesta::class);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
|
||||
class PreguntaOpcion extends Model
|
||||
{
|
||||
protected $table = 'pregunta_opciones';
|
||||
public $timestamps = false;
|
||||
protected $guarded = [];
|
||||
|
||||
public function pregunta(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(Pregunta::class);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
|
||||
class PreguntaTipo extends Model
|
||||
{
|
||||
public $timestamps = false;
|
||||
protected $guarded = [];
|
||||
|
||||
public function preguntas(): HasMany
|
||||
{
|
||||
return $this->hasMany(Pregunta::class);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
|
||||
class Respuesta extends Model
|
||||
{
|
||||
protected $guarded = [];
|
||||
|
||||
public function submission(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(EvaluacionSubmission::class);
|
||||
}
|
||||
|
||||
public function pregunta(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(Pregunta::class);
|
||||
}
|
||||
|
||||
public function opcion(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(PreguntaOpcion::class, 'opcion_id');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user