excel.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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. # Ejecuta el query de 'c-calif' para obtener la calificación
  37. $calificacion = $db
  38. ->where('clave', 'c-calif')
  39. ->getOne('consulta');
  40. $result = $moodle_db->query($calificacion['consulta_sql']);
  41. break;
  42. }
  43. // todos los headers en Mayúsculas incluyendo los acentos
  44. $headers = array_map(function ($header) {
  45. return mb_convert_case($header, MB_CASE_UPPER, 'UTF-8');
  46. }, $headers);
  47. fputcsv($fp, $headers);
  48. // insert data
  49. foreach ($data as $line) {
  50. switch ($query['query']) {
  51. case 'c-calif':
  52. $penultimaColumna = $line['formula']; // Asume que 'formula' es la penúltima columna
  53. $ultimaColumna = $line['ponderacion']; // Asume que 'ponderacion' es la última columna
  54. // Determina el valor de la nueva columna
  55. $nuevoValor = ($penultimaColumna === 'Sí' || $ultimaColumna === 'Sí') ? 'Sí' : 'No';
  56. // Añade el nuevo valor al final de la línea
  57. $line['TIENE CALIFICACIÓN'] = $nuevoValor;
  58. $line['CALIFICACIÓN MÁXIMA'] = floatval($line['suma_numeros']) + floatval($line['Suma categorías']);
  59. $grupoNumerico = '';
  60. if (preg_match('/\d+/', $line['grupo'], $matches)) {
  61. $grupoNumerico = $matches[0]; // El primer match contiene la parte numérica
  62. }
  63. // Añade el valor numérico extraído al final de la línea
  64. $line['GRUPO NUMÉRICO'] = $grupoNumerico;
  65. break;
  66. case 'c-fin':
  67. // encuentra el result que tenga el mismo courseid
  68. $courseid = $line['course_id'];
  69. $calificacion = array_filter($result, function ($row) use ($courseid) {
  70. return $row['courseid'] === $courseid && ($row['ponderacion'] === 'Sí' || $row['formula'] === 'Sí');
  71. });
  72. // si encuentra el result, añade 'Sí' a la última columna
  73. $line['TIENE CALIFICACIÓN'] = count($calificacion) > 0 ? 'Sí' : 'No';
  74. break;
  75. }
  76. // Convertir cada elemento de la línea a UTF-8 antes de escribir al archivo
  77. $line_utf8 = array_map(function ($elem) {
  78. return mb_convert_encoding($elem, 'UTF-8', 'UTF-8');
  79. }, $line);
  80. fputcsv($fp, $line_utf8);
  81. }
  82. fclose($fp);
  83. exit();