Files
Sistema-Educativo-Laravel/app/Http/Controllers/TareaController.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.');
}
}