nombrePeriodoActivo = $periodoService->obtenerPeriodoActivoNombre(); } catch (\Exception $e) { $this->nombrePeriodoActivo = null; } } public function getAllTareas() { try { $tareas = DB::table('tareas_usuarios_colegioabc as tu') ->join('tareas as t', 'tu.idTarea', '=', 't.idTarea') ->join('materias as m', 't.idMateriaTarea', '=', 'm.idMateria') ->join('tareas_tipos as tt', 't.idTipoTarea', '=', 'tt.idTareasTipos') ->join('usuarios as u', 't.idUsuario', '=', 'u.idUsuario') ->select( 'u.primerNombre', 'u.segundoNombre', 'u.apellidoPaterno', 'u.apellidoMaterno', 'u.alias', 'm.nombreMateria as materia', 'tt.nombreTareasTipos as tipo_tarea', 't.*', // todos los campos de tareas 'tu.idUsuario as usuario_asignado', // opcional, por si quieres saber a qué usuario está asignada 'tu.completa' ) ->orderBy('t.fechaPublicacion', 'desc') ->get(); return response()->json($tareas); } catch (\Exception $e) { return response()->json([ 'mensaje' => 'Error al obtener las tareas: ' . $e->getMessage() ], 500); } } public function getTareasPorFechaEntrega($fecha, $idUsuario) { try { $tareas = DB::table('tareas as t') ->join('materias as m', 't.idMateriaTarea', '=', 'm.idMateria') ->join('tareas_tipos as tt', 't.idTipoTarea', '=', 'tt.idTareasTipos') ->join('tareas_usuarios_colegioabc as tu', 't.idTarea', '=', 'tu.idTarea') ->where('tu.idUsuario', $idUsuario) ->whereDate('t.fechaEntrega', '=', $fecha) ->select( 'm.nombreMateria as materia', 'tt.nombreTareasTipos as tipo_tarea', 't.*' ) ->orderBy('t.fechaEntrega', 'asc') ->get(); return response()->json($tareas); } catch (\Exception $e) { return response()->json(['mensaje' => 'Error al obtener las tareas por fecha de entrega: ' . $e->getMessage()], 500); } } public function getAllTareasPorFechaEntrega($fecha) { try { $tareas = DB::table('tareas as t') ->join('materias as m', 't.idMateriaTarea', '=', 'm.idMateria') ->join('tareas_tipos as tt', 't.idTipoTarea', '=', 'tt.idTareasTipos') ->join('tareas_usuarios_colegioabc as tu', 't.idTarea', '=', 'tu.idTarea') ->whereDate('t.fechaEntrega', '=', $fecha) ->select( 'm.nombreMateria as materia', 'tt.nombreTareasTipos as tipo_tarea', 't.*' ) ->orderBy('t.fechaEntrega', 'asc') ->get(); return response()->json($tareas); } catch (\Exception $e) { return response()->json(['mensaje' => 'Error al obtener las tareas por fecha de entrega: ' . $e->getMessage()], 500); } } public function getAllTareasPorFechaAsignacion($fecha) { try { $tareas = DB::table('tareas as t') ->join('materias as m', 't.idMateriaTarea', '=', 'm.idMateria') ->join('tareas_tipos as tt', 't.idTipoTarea', '=', 'tt.idTareasTipos') ->join('tareas_usuarios_colegioabc as tu', 't.idTarea', '=', 'tu.idTarea') ->whereDate('t.fechaPublicacion', '=', $fecha) ->select( 'm.nombreMateria as materia', 'tt.nombreTareasTipos as tipo_tarea', 't.*' ) ->orderBy('t.fechaPublicacion', 'asc') ->get(); return response()->json($tareas); } catch (\Exception $e) { return response()->json(['mensaje' => 'Error al obtener las tareas por fecha de asignación: ' . $e->getMessage()], 500); } } public function getTareasPorFechaAsignacion($fecha, $idUsuario) { try { $tareas = DB::table('tareas as t') ->join('materias as m', 't.idMateriaTarea', '=', 'm.idMateria') ->join('tareas_tipos as tt', 't.idTipoTarea', '=', 'tt.idTareasTipos') ->join('tareas_usuarios_colegioabc as tu', 't.idTarea', '=', 'tu.idTarea') ->where('tu.idUsuario', $idUsuario) ->whereDate('t.fechaPublicacion', '=', $fecha) ->select( 'm.nombreMateria as materia', 'tt.nombreTareasTipos as tipo_tarea', 't.*' ) ->orderBy('t.fechaPublicacion', 'asc') ->get(); return response()->json($tareas); } catch (\Exception $e) { return response()->json(['mensaje' => 'Error al obtener las tareas por fecha de asignación: ' . $e->getMessage()], 500); } } public function getMateriasUsuarioUltimos30Dias($idUsuario) { try { $materias = DB::table('tareas as t') ->join('materias as m', 't.idMateriaTarea', '=', 'm.idMateria') ->join('tareas_usuarios_colegioabc as tu', 't.idTarea', '=', 'tu.idTarea') ->where('tu.idUsuario', $idUsuario) ->where('t.fechaPublicacion', '>=', now()->subDays(30)) ->select( 'm.idMateria', 'm.nombreMateria' ) ->distinct() ->orderBy('m.nombreMateria', 'asc') ->get(); return response()->json($materias); } catch (\Exception $e) { return response()->json([ 'mensaje' => 'Error al obtener las materias: ' . $e->getMessage() ], 500); } } public function getTareasPorMateria($idMateria) { try { $tareas = DB::table('tareas as t') ->join('materias as m', 't.idMateriaTarea', '=', 'm.idMateria') ->join('tareas_tipos as tt', 't.idTipoTarea', '=', 'tt.idTareasTipos') ->where('t.idMateriaTarea', $idMateria) ->select( 'm.nombreMateria as materia', 'tt.nombreTareasTipos as tipo_tarea', 't.*' ) ->orderBy('t.fechaPublicacion', 'desc') ->get(); return response()->json($tareas); } catch (\Exception $e) { return response()->json(['mensaje' => 'Error al obtener las tareas por materia: ' . $e->getMessage()], 500); } } public function crear(Request $request) { $carpetaBase = config('custom.s3_carpeta_base'); $periodoService = new PeriodoService(); $carpetaPeriodo = $periodoService->obtenerPeriodoActivoNombre(); $rutaBucket = 'tareas/'; try { // Procesar adjuntoTarea (por si mandas archivos en base64 como en circulares) $adjuntos = []; if ($request->has('bases64')) { foreach ($request->bases64 as $file) { $fileInfo = explode(';', $file['base64'])[0]; $fileExtension = explode('/', $fileInfo)[1]; switch ($fileExtension) { case 'vnd.openxmlformats-officedocument.wordprocessingml.document': $fileExtension = 'docx'; break; case 'vnd.openxmlformats-officedocument.spreadsheetml.sheet': $fileExtension = 'xlsx'; break; case 'vnd.openxmlformats-officedocument.presentationml.presentation': $fileExtension = 'pptx'; break; } $fileData = substr($file['base64'], strpos($file['base64'], ',') + 1); $fileData = str_replace(' ', '+', $fileData); $contenidoArchivo = base64_decode($fileData); $fileName = $file['id'] . '-' . $file['nombre'] . '.' . $fileExtension; $pathS3 = $carpetaBase . '/' . $carpetaPeriodo . '/' . $rutaBucket . $fileName; // Subir al s3 Storage::disk('s3')->put($pathS3, $contenidoArchivo, 'public'); $adjuntos[] = [ 'id' => $file['id'], 'nombre' => $file['nombre'], 'ruta' => Storage::disk('s3')->url($pathS3) ]; } } // Insertar tarea en la base de datos DB::table('tareas')->insert([ 'idEscuela' => 'COlEGIOABC', 'idMateriaTarea' => $request->idMateriaTarea, 'idTipoTarea' => $request->idTipoTarea, 'tituloTarea' => $request->tituloTarea, 'descripcionTarea' => $request->descripcionTarea, 'vinculoTarea' => $request->vinculoTarea, 'adjuntoTarea' => json_encode($adjuntos), 'fechaPublicacion' => $request->fechaPublicacion, 'fechaEntrega' => $request->fechaEntrega, 'estado' => 'Completa', // estos por default en 'No' si no vienen en la request 'entregaDigital' => $request->entregaDigital ?? 'No', 'calificacion' => $request->calificacion ?? 'No', 'retroalimentacion' => $request->retroalimentacion ?? 'No', 'descargarTareas' => $request->descargarTareas ?? 'No', 'idUsuario' => $request->idUsuario, ]); return response()->json([ 'mensaje' => 'Tarea creada exitosamente', 'idTarea' => DB::getPdo()->lastInsertId() ], 201); } catch (\Exception $e) { return response()->json(['mensaje' => 'Error al crear la tarea: ' . $e->getMessage()], 500); } } public function actualizar(Request $request, $idTarea) { $carpetaBase = config('custom.s3_carpeta_base'); $periodoService = new PeriodoService(); $carpetaPeriodo = $periodoService->obtenerPeriodoActivoNombre(); $rutaBucket = 'tareas/'; try { // Recuperar tarea existente $tareaExistente = DB::table('tareas')->where('idTarea', $idTarea)->first(); if (!$tareaExistente) { return response()->json(['mensaje' => 'Tarea no encontrada'], 404); } // Adjuntos (si vienen) $adjuntos = json_decode($tareaExistente->adjuntoTarea ?? '[]', true); if ($request->has('bases64')) { foreach ($request->bases64 as $file) { $fileInfo = explode(';', $file['base64'])[0]; $fileExtension = explode('/', $fileInfo)[1]; switch ($fileExtension) { case 'vnd.openxmlformats-officedocument.wordprocessingml.document': $fileExtension = 'docx'; break; case 'vnd.openxmlformats-officedocument.spreadsheetml.sheet': $fileExtension = 'xlsx'; break; case 'vnd.openxmlformats-officedocument.presentationml.presentation': $fileExtension = 'pptx'; break; } $fileData = substr($file['base64'], strpos($file['base64'], ',') + 1); $fileData = str_replace(' ', '+', $fileData); $contenidoArchivo = base64_decode($fileData); $fileName = $file['id'] . '-' . $file['nombre'] . '.' . $fileExtension; $pathS3 = $carpetaBase . '/' . $carpetaPeriodo . '/' . $rutaBucket . $fileName; Storage::disk('s3')->put($pathS3, $contenidoArchivo, 'public'); $adjuntos[] = [ 'id' => $file['id'], 'nombre' => $file['nombre'], 'ruta' => Storage::disk('s3')->url($pathS3) ]; } } // Actualizar tarea en DB DB::table('tareas') ->where('idTarea', $idTarea) ->update([ 'idMateriaTarea' => $request->idMateriaTarea ?? $tareaExistente->idMateriaTarea, 'idTipoTarea' => $request->idTipoTarea ?? $tareaExistente->idTipoTarea, 'tituloTarea' => $request->tituloTarea ?? $tareaExistente->tituloTarea, 'descripcionTarea' => $request->descripcionTarea ?? $tareaExistente->descripcionTarea, 'vinculoTarea' => $request->vinculoTarea ?? $tareaExistente->vinculoTarea, 'adjuntoTarea' => json_encode($adjuntos), 'fechaPublicacion' => $request->fechaPublicacion ?? $tareaExistente->fechaPublicacion, 'fechaEntrega' => $request->fechaEntrega ?? $tareaExistente->fechaEntrega, 'entregaDigital' => $request->entregaDigital ?? $tareaExistente->entregaDigital, 'calificacion' => $request->calificacion ?? $tareaExistente->calificacion, 'retroalimentacion' => $request->retroalimentacion ?? $tareaExistente->retroalimentacion, 'descargarTareas' => $request->descargarTareas ?? $tareaExistente->descargarTareas, 'estado' => $request->estado ?? $tareaExistente->estado, 'idUsuario' => $request->idUsuario ?? $tareaExistente->idUsuario, ]); return response()->json([ 'mensaje' => 'Tarea actualizada exitosamente', 'idTarea' => $idTarea ], 200); } catch (\Exception $e) { return response()->json(['mensaje' => 'Error al actualizar la tarea: ' . $e->getMessage()], 500); } } public function obtenerAlumnosPorMateria($idMateria) { // Primero obtenemos el grado o grupo relacionado con la materia $materia = DB::table('vista_materias_grados_grupos') ->where('idMateria', $idMateria) ->first(); if (!$materia) { return collect(); // Si no existe la materia } $idRelacionado = $materia->idGradoGrupoRelacionado; // --- Caso 1: Coincide con el grado del usuario --- $alumnosPorGrado = DB::table('usuarios') ->where('grado', $idRelacionado) ->where('tipoUsuario', 'AL') // solo alumnos ->where('estatus', 'Activo') ->get(); // --- Caso 2: Coincide con un grupo --- $alumnosPorGrupo = DB::table('usuarios') ->join('grupos', 'usuarios.idUsuario', '=', 'grupos.idUsuario') ->where('grupos.idGrupo', $idRelacionado) ->where('usuarios.tipoUsuario', 'AL') ->where('usuarios.estatus', 'Activo') ->select('usuarios.*') ->get(); // Unimos los resultados return $alumnosPorGrado->merge($alumnosPorGrupo); } public function asignarTareaUsuario(Request $request) { // Insertar con Query Builder DB::table('tareas_usuarios_colegioabc')->insert([ 'idTarea' => $request->idTarea, 'idUsuario' => $request->idUsuario, ]); return response()->json([ 'success' => true, 'message' => 'Tarea asignada al usuario correctamente', ], 201); } public function getTareasPorUsuario($idUsuario) { try { $tareas = DB::table('tareas_usuarios_colegioabc as tu') ->join('tareas as t', 'tu.idTarea', '=', 't.idTarea') ->join('materias as m', 't.idMateriaTarea', '=', 'm.idMateria') ->join('tareas_tipos as tt', 't.idTipoTarea', '=', 'tt.idTareasTipos') ->where('tu.idUsuario', $idUsuario) ->select( 'm.nombreMateria as materia', 'tt.nombreTareasTipos as tipo_tarea', 't.*', // todos los campos de tareas 'tu.idUsuario as usuario_asignado', // opcional, por si quieres saber a qué usuario está asignada 'tu.completa' ) ->orderBy('t.fechaPublicacion', 'desc') ->get(); return response()->json($tareas); } catch (\Exception $e) { return response()->json([ 'mensaje' => 'Error al obtener las tareas: ' . $e->getMessage() ], 500); } } // Función para completar una tarea por idUsuario y idTarea public function completarTarea(Request $request) { try { $tarea = DB::table('tareas_usuarios_colegioabc') ->where('idTarea', $request->idTarea) ->where('idUsuario', $request->idUsuario) ->first(); if ($tarea) { // Si ya existe, alternamos el valor de "completa" $nuevoEstado = $tarea->completa ? 0 : 1; DB::table('tareas_usuarios_colegioabc') ->where('idTarea', $request->idTarea) ->where('idUsuario', $request->idUsuario) ->update(['completa' => $nuevoEstado]); $mensaje = $nuevoEstado ? 'Tarea completada' : 'Tarea desmarcada como incompleta'; } else { // Si no existe el registro, la creamos como completada DB::table('tareas_usuarios_colegioabc')->insert([ 'idTarea' => $request->idTarea, 'idUsuario' => $request->idUsuario, 'completa' => 1 ]); $mensaje = 'Tarea completada por primera vez'; } return response()->json(['mensaje' => $mensaje], 200); } catch (\Exception $e) { return response()->json(['mensaje' => 'Error al cambiar el estado de la tarea: ' . $e->getMessage()], 500); } } public function habilitar($id) { try { //code... DB::table('tareas') ->updateOrInsert( ['idTarea' => $id], ['estado' => 'Completa'] ); return response()->json(['mensaje' => 'Tarea habilitada exitosamente'], 201); } catch (\Exception $e) { //throw $th; return response()->json(['mensaje' => 'Error al habilitar la tarea: ' . $e->getMessage()], 500); } } public function eliminar($id) { try { //code... DB::table('tareas') ->updateOrInsert( ['idTarea' => $id], ['estado' => 'Eliminada'] ); return response()->json(['mensaje' => 'Tarea eliminada exitosamente'], 201); } catch (\Exception $e) { //throw $th; return response()->json(['mensaje' => 'Error al eliminar la tarea: ' . $e->getMessage()], 500); } } }