excel.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <?php
  2. require_once "{$_SERVER['DOCUMENT_ROOT']}/dependencies.php";
  3. // Exportar a archivo separado por comas
  4. // Must receive from POST associative array with keys and values
  5. use Respect\Validation\Validator as v;
  6. $query = json_decode(file_get_contents('php://input'), true);
  7. $consulta = $db
  8. ->where('clave', $query['query'])
  9. ->getOne('consulta', 'consulta_sql, archivo');
  10. methods([
  11. 'POST' => v::keySet(
  12. v::key('query', v::in($query)),
  13. )
  14. ]);
  15. // method must be POST
  16. if (!isset($_SESSION['user'], $moodle_db)) {
  17. serverError(title: 'Error de conexión', message: 'No se ha iniciado sesión o no se ha establecido una conexión con la base de datos de Moodle');
  18. exit();
  19. }
  20. $data = $moodle_db->query($consulta['consulta_sql']);
  21. header('Content-Type: text/csv; charset=UTF-8');
  22. header('Content-Disposition: attachment; filename="' . $consulta['archivo'] . '"');
  23. echo "\xEF\xBB\xBF"; // Añade el BOM de UTF-8 al inicio del archivo para indicar su codificación
  24. $fp = fopen('php://output', 'w'); // 'wb' también es válido en este contexto
  25. // insert header
  26. $headers = array_keys($data[0]);
  27. switch ($query['query']) {
  28. case 'c-calif':
  29. $headers[] = 'TIENE CALIFICACIÓN';
  30. $headers[] = 'CALIFICACIÓN MÁXIMA';
  31. $headers[] = 'GRUPO NUMÉRICO';
  32. break;
  33. case 'c-fin':
  34. # Añade 'TIENE CALIFICACIÓN'
  35. $headers[] = 'TIENE CALIFICACIÓN';
  36. $headers[] = 'PROMEDIO_GENERAL';
  37. $headers[] = 'DESVIACIÓN';
  38. # Ejecuta el query de 'c-calif' para obtener la calificación
  39. $calificacion = $db
  40. ->where('clave', 'c-calif')
  41. ->getOne('consulta');
  42. $result = $moodle_db->query($calificacion['consulta_sql']);
  43. break;
  44. }
  45. // todos los headers en Mayúsculas incluyendo los acentos
  46. $headers = array_map(function ($header) {
  47. return mb_convert_case($header, MB_CASE_UPPER, 'UTF-8');
  48. }, $headers);
  49. fputcsv($fp, $headers);
  50. // insert data
  51. foreach ($data as $line) {
  52. switch ($query['query']) {
  53. case 'c-calif':
  54. $penultimaColumna = $line['formula']; // Asume que 'formula' es la penúltima columna
  55. $ultimaColumna = $line['ponderacion']; // Asume que 'ponderacion' es la última columna
  56. // Determina el valor de la nueva columna
  57. $nuevoValor = ($penultimaColumna === 'Sí' || $ultimaColumna === 'Sí') ? 'Sí' : 'No';
  58. // Añade el nuevo valor al final de la línea
  59. $line['TIENE CALIFICACIÓN'] = $nuevoValor;
  60. $line['CALIFICACIÓN MÁXIMA'] = floatval($line['suma_numeros']) + floatval($line['Suma categorías']);
  61. $grupoNumerico = '';
  62. if (preg_match('/\d+/', $line['grupo'], $matches)) {
  63. $grupoNumerico = $matches[0]; // El primer match contiene la parte numérica
  64. }
  65. // Añade el valor numérico extraído al final de la línea
  66. $line['GRUPO NUMÉRICO'] = $grupoNumerico;
  67. break;
  68. case 'c-fin':
  69. // encuentra el result que tenga el mismo courseid
  70. $courseid = $line['course_id'];
  71. $calificacion = array_filter($result, function ($row) use ($courseid) {
  72. return $row['courseid'] === $courseid && ($row['ponderacion'] === 'Sí' || $row['formula'] === 'Sí');
  73. });
  74. // si encuentra el result, añade 'Sí' a la última columna
  75. $line['TIENE CALIFICACIÓN'] = count($calificacion) > 0 ? 'Sí' : 'No';
  76. preg_match('/-(\d+)$/', $line['shortname'], $matches);
  77. $materia = $sgi_db->querySingle('SELECT
  78. AVG(amg."Calificacion_calif") AS calificación,
  79. STDDEV(amg."Calificacion_calif") AS desviación
  80. FROM "Alumno_Materia_Calificacion" amg
  81. WHERE amg."Materia_id" = :materia_id
  82. GROUP BY amg."Materia_id"
  83. ORDER BY AVG(amg."Calificacion_calif")',
  84. ['materia_id' => intval($matches[1])]
  85. );
  86. $line['PROMEDIO_GENERAL'] = $materia['calificación'] ?? 0;
  87. $line['DESVIACIÓN'] = $materia['desviación'] ?? 0;
  88. break;
  89. }
  90. // Convertir cada elemento de la línea a UTF-8 antes de escribir al archivo
  91. $line_utf8 = array_map(function ($elem) {
  92. return mb_convert_encoding($elem, 'UTF-8', 'UTF-8');
  93. }, $line);
  94. fputcsv($fp, $line_utf8);
  95. }
  96. fclose($fp);
  97. exit();