168 lines
5.5 KiB
PHP
168 lines
5.5 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Alumno;
|
|
use App\Models\Docente;
|
|
use App\Models\Entrega;
|
|
use App\Models\Grupo;
|
|
use App\Models\Material;
|
|
use App\Models\Tarea;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Routing\Controller;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\Storage;
|
|
|
|
class TareaController extends Controller
|
|
{
|
|
public function index(Grupo $grupo, Material $material)
|
|
{
|
|
$tareas = Tarea::where('grupo_id', $grupo->id)
|
|
->where('material_id', $material->id)
|
|
->withCount([
|
|
'entregas',
|
|
'entregas as pendientes_count' => fn($q) => $q->where('status', 'pendiente'),
|
|
'entregas as calificadas_count' => fn($q) => $q->where('status', 'calificada'),
|
|
])
|
|
->orderByDesc('created_at')
|
|
->get();
|
|
|
|
return view('tarea.index', compact('grupo', 'material', 'tareas'));
|
|
}
|
|
|
|
public function create(Grupo $grupo, Material $material)
|
|
{
|
|
return view('tarea.create', compact('grupo', 'material'));
|
|
}
|
|
|
|
public function store(Request $request, Grupo $grupo, Material $material)
|
|
{
|
|
$request->validate([
|
|
'titulo' => 'required|string|max:255',
|
|
'descripcion' => 'nullable|string',
|
|
'fecha_entrega' => 'nullable|date',
|
|
]);
|
|
|
|
$docente = Docente::whereHas('docentes', fn($q) => $q->where('id', Auth::id()))->firstOrFail();
|
|
|
|
$tarea = Tarea::create([
|
|
'titulo' => $request->titulo,
|
|
'descripcion' => $request->descripcion,
|
|
'fecha_entrega' => $request->fecha_entrega,
|
|
'material_id' => $material->id,
|
|
'grupo_id' => $grupo->id,
|
|
'docente_id' => $docente->id,
|
|
]);
|
|
|
|
foreach ($grupo->alumnos as $alumno) {
|
|
Entrega::create([
|
|
'tarea_id' => $tarea->id,
|
|
'alumno_id' => $alumno->id,
|
|
'status' => 'sin_subir',
|
|
]);
|
|
}
|
|
|
|
return redirect()->route('grupo.material.tareas', [$grupo, $material])
|
|
->with('info', 'Tarea creada correctamente.');
|
|
}
|
|
|
|
public function show(Grupo $grupo, Material $material, Tarea $tarea)
|
|
{
|
|
$alumnos = $grupo->alumnos()->with('alumnos')->get();
|
|
|
|
$entregasExistentes = Entrega::where('tarea_id', $tarea->id)->pluck('alumno_id')->toArray();
|
|
|
|
foreach ($alumnos as $alumno) {
|
|
if (!in_array($alumno->id, $entregasExistentes)) {
|
|
Entrega::create([
|
|
'tarea_id' => $tarea->id,
|
|
'alumno_id' => $alumno->id,
|
|
'status' => 'sin_subir',
|
|
]);
|
|
}
|
|
}
|
|
|
|
$entregas = Entrega::where('tarea_id', $tarea->id)
|
|
->with('alumno.alumnos')
|
|
->get()
|
|
->keyBy('alumno_id');
|
|
|
|
return view('tarea.show', compact('grupo', 'material', 'tarea', 'alumnos', 'entregas'));
|
|
}
|
|
|
|
public function edit(Grupo $grupo, Material $material, Tarea $tarea)
|
|
{
|
|
return view('tarea.create', compact('grupo', 'material', 'tarea'));
|
|
}
|
|
|
|
public function update(Request $request, Grupo $grupo, Material $material, Tarea $tarea)
|
|
{
|
|
$request->validate([
|
|
'titulo' => 'required|string|max:255',
|
|
'descripcion' => 'nullable|string',
|
|
'fecha_entrega' => 'nullable|date',
|
|
]);
|
|
|
|
$tarea->update([
|
|
'titulo' => $request->titulo,
|
|
'descripcion' => $request->descripcion,
|
|
'fecha_entrega' => $request->fecha_entrega,
|
|
]);
|
|
|
|
return redirect()->route('grupo.material.tareas', [$grupo, $material])
|
|
->with('info', 'Tarea actualizada correctamente.');
|
|
}
|
|
|
|
public function destroy(Grupo $grupo, Material $material, Tarea $tarea)
|
|
{
|
|
// Borrar archivos físicos de cada entrega antes de eliminar los registros
|
|
$tarea->entregas()
|
|
->whereNotNull('archivo')
|
|
->pluck('archivo')
|
|
->each(fn($path) => Storage::delete($path));
|
|
|
|
$tarea->delete(); // las entregas se eliminan en cascada por FK
|
|
|
|
return redirect()->route('grupo.material.tareas', [$grupo, $material])
|
|
->with('info', 'Tarea eliminada.');
|
|
}
|
|
|
|
public function acta(Grupo $grupo, Material $material)
|
|
{
|
|
$tareas = Tarea::where('grupo_id', $grupo->id)
|
|
->where('material_id', $material->id)
|
|
->orderBy('created_at')
|
|
->get();
|
|
|
|
$alumnos = $grupo->alumnos()->with('alumnos')->get();
|
|
|
|
// [alumno_id][tarea_id] => Entrega
|
|
$entregas = Entrega::whereIn('tarea_id', $tareas->pluck('id'))
|
|
->get()
|
|
->groupBy('alumno_id')
|
|
->map(fn($rows) => $rows->keyBy('tarea_id'));
|
|
|
|
return view('tarea.acta', compact('grupo', 'material', 'tareas', 'alumnos', 'entregas'));
|
|
}
|
|
|
|
public function calificar(Request $request, Tarea $tarea, Alumno $alumno)
|
|
{
|
|
$request->validate([
|
|
'calificacion' => 'required|numeric|min:0|max:10',
|
|
'comentario' => 'nullable|string',
|
|
]);
|
|
|
|
$entrega = Entrega::where('tarea_id', $tarea->id)
|
|
->where('alumno_id', $alumno->id)
|
|
->firstOrFail();
|
|
|
|
$entrega->update([
|
|
'calificacion' => $request->calificacion,
|
|
'comentario' => $request->comentario,
|
|
'status' => 'calificada',
|
|
]);
|
|
|
|
return back()->with('info', 'Calificación guardada.');
|
|
}
|
|
}
|