TareasController.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Http\Controllers\Controller;
  4. use App\Services\PeriodoService;
  5. use Illuminate\Http\Request;
  6. use Illuminate\Support\Facades\DB;
  7. use Illuminate\Support\Facades\Storage;
  8. use Illuminate\Support\Facades\Validator;
  9. class TareasController extends Controller
  10. {
  11. protected $nombrePeriodoActivo;
  12. public function __construct(PeriodoService $periodoService)
  13. {
  14. try {
  15. $this->nombrePeriodoActivo = $periodoService->obtenerPeriodoActivoNombre();
  16. } catch (\Exception $e) {
  17. $this->nombrePeriodoActivo = null;
  18. }
  19. }
  20. public function getAllTareas(){
  21. $tareas = DB::table('tareas')
  22. ->where('idEscuela', 'COlEGIOABC')
  23. ->orderBy('fechaPublicacion', 'desc')
  24. ->get();
  25. return response()->json($tareas);
  26. }
  27. public function crear(Request $request)
  28. {
  29. $carpetaBase = config('custom.s3_carpeta_base');
  30. $periodoService = new PeriodoService();
  31. $carpetaPeriodo = $periodoService->obtenerPeriodoActivoNombre();
  32. $rutaBucket = 'circulares/';
  33. try {
  34. // Procesar adjuntoTarea (por si mandas archivos en base64 como en circulares)
  35. $adjuntos = [];
  36. if ($request->has('bases64')) {
  37. foreach ($request->bases64 as $file) {
  38. $fileInfo = explode(';', $file['base64'])[0];
  39. $fileExtension = explode('/', $fileInfo)[1];
  40. switch ($fileExtension) {
  41. case 'vnd.openxmlformats-officedocument.wordprocessingml.document':
  42. $fileExtension = 'docx';
  43. break;
  44. case 'vnd.openxmlformats-officedocument.spreadsheetml.sheet':
  45. $fileExtension = 'xlsx';
  46. break;
  47. case 'vnd.openxmlformats-officedocument.presentationml.presentation':
  48. $fileExtension = 'pptx';
  49. break;
  50. }
  51. $fileData = substr($file['base64'], strpos($file['base64'], ',') + 1);
  52. $fileData = str_replace(' ', '+', $fileData);
  53. $contenidoArchivo = base64_decode($fileData);
  54. $fileName = $file['id'] . '-' . $file['nombre'] . '.' . $fileExtension;
  55. $pathS3 = $carpetaBase . '/' . $carpetaPeriodo . '/' . $rutaBucket . $fileName;
  56. // Subir al s3
  57. Storage::disk('s3')->put($pathS3, $contenidoArchivo, 'public');
  58. $adjuntos[] = [
  59. 'id' => $file['id'],
  60. 'nombre' => $file['nombre'],
  61. 'ruta' => Storage::disk('s3')->url($pathS3)
  62. ];
  63. }
  64. }
  65. // Insertar tarea en la base de datos
  66. DB::table('tareas')->insert([
  67. 'idEscuela' => 'COlEGIOABC',
  68. 'idMateriaTarea' => $request->idMateriaTarea,
  69. 'idTipoTarea' => $request->idTipoTarea,
  70. 'tituloTarea' => $request->tituloTarea,
  71. 'descripcionTarea' => $request->descripcionTarea,
  72. 'vinculoTarea' => $request->vinculoTarea,
  73. 'adjuntoTarea' => json_encode($adjuntos),
  74. 'fechaPublicacion' => $request->fechaPublicacion,
  75. 'fechaEntrega' => $request->fechaEntrega,
  76. 'estado' => 'Completa',
  77. // estos por default en 'No' si no vienen en la request
  78. 'entregaDigital' => $request->entregaDigital ?? 'No',
  79. 'calificacion' => $request->calificacion ?? 'No',
  80. 'retroalimentacion' => $request->retroalimentacion ?? 'No',
  81. 'descargarTareas' => $request->descargarTareas ?? 'No',
  82. 'idUsuario' => $request->idUsuario,
  83. ]);
  84. return response()->json([
  85. 'mensaje' => 'Tarea creada exitosamente',
  86. 'idTarea' => DB::getPdo()->lastInsertId()
  87. ], 201);
  88. } catch (\Exception $e) {
  89. return response()->json(['mensaje' => 'Error al crear la tarea: ' . $e->getMessage()], 500);
  90. }
  91. }
  92. public function obtenerAlumnosPorMateria($idMateria)
  93. {
  94. // Primero obtenemos el grado o grupo relacionado con la materia
  95. $materia = DB::table('vista_materias_grados_grupos')
  96. ->where('idMateria', $idMateria)
  97. ->first();
  98. if (!$materia) {
  99. return collect(); // Si no existe la materia
  100. }
  101. $idRelacionado = $materia->idGradoGrupoRelacionado;
  102. // --- Caso 1: Coincide con el grado del usuario ---
  103. $alumnosPorGrado = DB::table('usuarios')
  104. ->where('grado', $idRelacionado)
  105. ->where('tipoUsuario', 'AL') // solo alumnos
  106. ->where('estatus', 'Activo')
  107. ->get();
  108. // --- Caso 2: Coincide con un grupo ---
  109. $alumnosPorGrupo = DB::table('usuarios')
  110. ->join('grupos', 'usuarios.idUsuario', '=', 'grupos.idUsuario')
  111. ->where('grupos.idGrupo', $idRelacionado)
  112. ->where('usuarios.tipoUsuario', 'AL')
  113. ->where('usuarios.estatus', 'Activo')
  114. ->select('usuarios.*')
  115. ->get();
  116. // Unimos los resultados
  117. return $alumnosPorGrado->merge($alumnosPorGrupo);
  118. }
  119. public function asignarTareaUsuario(Request $request)
  120. {
  121. // Insertar con Query Builder
  122. DB::table('tareas_usuarios_colegioabc')->insert([
  123. 'idTarea' => $request->idTarea,
  124. 'idUsuario' => $request->idUsuario,
  125. ]);
  126. return response()->json([
  127. 'success' => true,
  128. 'message' => 'Tarea asignada al usuario correctamente',
  129. ], 201);
  130. }
  131. }