excel.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  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. $queries = array(
  8. 'usuarios' => <<<SQL
  9. SELECT
  10. u.id AS user_id,
  11. u.username AS username,
  12. CONCAT(u.firstname, ' ', u.lastname) AS full_name,
  13. u.email AS email,
  14. u.lastaccess AS last_access,
  15. c.fullname AS course_name,
  16. cc.name AS category_name
  17. FROM
  18. mdl_user u
  19. LEFT JOIN
  20. mdl_user_enrolments ue ON u.id = ue.userid
  21. LEFT JOIN
  22. mdl_enrol e ON ue.enrolid = e.id
  23. LEFT JOIN
  24. mdl_course c ON e.courseid = c.id
  25. LEFT JOIN
  26. mdl_course_categories cc ON c.category = cc.id
  27. WHERE
  28. u.deleted = 0
  29. ORDER BY
  30. u.id
  31. SQL,
  32. 'alumnos' => <<<SQL
  33. SELECT u.id, u.username, u.firstname, u.lastname, u.email
  34. FROM mdl_user u
  35. JOIN mdl_role_assignments ra ON ra.userid = u.id
  36. WHERE username LIKE 'al%';
  37. SQL,
  38. 'usuarios_temporales' => <<<SQL
  39. SELECT id, username, firstname, lastname, email, deleted
  40. FROM mdl_user
  41. WHERE deleted = 1 or confirmed = 0;
  42. SQL,
  43. 'calificaciones' => <<<SQL
  44. SELECT
  45. c.id AS courseid,
  46. c.shortname,
  47. COALESCE(cc2.name, cc.name) AS AREA,
  48. CASE
  49. WHEN cc2.name IS NULL THEN NULL
  50. ELSE cc.name
  51. END AS GRUPO,
  52. prof.username AS profesor_clave,
  53. CONCAT(prof.firstname, ' ', prof.lastname) AS profesor_nombre,
  54. c.fullname AS course_fullname,
  55. MAX(mgi.calculation) AS fórmula,
  56. CASE
  57. WHEN COALESCE(MIN(mgi.calculation) <> '', false) THEN 'Sí'
  58. ELSE 'No'
  59. END AS formula,
  60. CASE
  61. WHEN MAX(mgi.AGGREGATIONCOEF) > 0 THEN 'Sí'
  62. ELSE 'No'
  63. END AS ponderacion,
  64. CASE
  65. WHEN MAX(mgi.calculation) IS NOT NULL THEN (
  66. SELECT SUM(val::numeric)
  67. FROM (
  68. SELECT
  69. unnest(regexp_matches(MAX(mgi.calculation), '\d?\.\d+', 'g')) AS val
  70. ) AS subquery
  71. )
  72. ELSE NULL
  73. END AS suma_numeros,
  74. JSONB_AGG(JSONB_BUILD_OBJECT(COALESCE(gc.fullname, '-'), mgi.aggregationcoef)) FILTER (WHERE mgi.aggregationcoef >0 ) ,
  75. CASE WHEN MAX(MGI.GRADEMAX) > 0 THEN
  76. sum(mgi.aggregationcoef) / max(mgi.grademax) FILTER (WHERE mgi.itemtype = 'course')
  77. ELSE
  78. 0 END AS "Suma categorías",
  79. MAX(MGI.GRADEMAX)
  80. FROM
  81. mdl_course c
  82. JOIN mdl_grade_items mgi ON c.id = mgi.courseid
  83. LEFT JOIN mdl_grade_categories gc ON mgi.iteminstance = gc.id AND mgi.itemtype = 'category' -- Asegúrate de que el itemtype sea 'category'
  84. JOIN mdl_course_categories cc ON cc.id = c.category
  85. LEFT JOIN mdl_course_categories cc2 ON cc.parent = cc2.id
  86. JOIN mdl_context ctx ON ctx.instanceid = c.id
  87. JOIN mdl_role_assignments ra ON ra.contextid = ctx.id AND ra.roleid = 3
  88. JOIN mdl_user prof ON ra.userid = prof.id
  89. WHERE
  90. mgi.itemtype IN ('course', 'category')
  91. GROUP BY
  92. c.id, c.shortname, cc.name, cc2.name, c.fullname, prof.firstname, prof.lastname, prof.username
  93. ORDER BY
  94. AREA, GRUPO, profesor_nombre;
  95. SQL,
  96. 'calificaciones_brutas' => <<<SQL
  97. SELECT
  98. gi.itemname AS item_name,
  99. c.id AS course_id,
  100. c.fullname AS course_name,
  101. u.id AS user_id,
  102. u.username,
  103. u.firstname,
  104. u.lastname,
  105. gg.finalgrade
  106. FROM
  107. mdl_grade_grades gg
  108. JOIN
  109. mdl_grade_items gi ON gg.itemid = gi.id
  110. JOIN
  111. mdl_course c ON gi.courseid = c.id
  112. JOIN
  113. mdl_user u ON gg.userid = u.id
  114. WHERE
  115. gi.itemtype = 'mod' and gi.itemmodule <> 'attendance' and username like 'al%'
  116. order by username, item_name;
  117. SQL,
  118. );
  119. methods(['POST' => v::keySet(
  120. v::key('query', v::in(array_keys($queries))),
  121. )]);
  122. // method must be POST
  123. if (!isset($_SESSION['user'], $moodle_db)) {
  124. 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');
  125. exit();
  126. }
  127. $data = $moodle_db->query($queries[$query['query']]);
  128. $filename = 'test.csv';
  129. header('Content-Type: text/csv; charset=UTF-8');
  130. header('Content-Disposition: attachment; filename="' . $filename . '"');
  131. echo "\xEF\xBB\xBF"; // Añade el BOM de UTF-8 al inicio del archivo para indicar su codificación
  132. $fp = fopen('php://output', 'w'); // 'wb' también es válido en este contexto
  133. // insert header
  134. $headers = array_keys($data[0]);
  135. switch ($query['query']) {
  136. case 'calificaciones':
  137. $headers[] = 'Tiene calificación'; // Añade el nombre de la nueva columna al final del encabezado
  138. $headers[] = 'Calificación Máxima';
  139. $headers[] = 'grupo_numerico'; // Añade el nombre de la nueva columna al final del encabezado
  140. break;
  141. }
  142. // todos los headers en Mayúsculas incluyendo los acentos
  143. $headers = array_map(function ($header) {
  144. return mb_convert_case($header, MB_CASE_UPPER, 'UTF-8');
  145. }, $headers);
  146. fputcsv($fp, $headers);
  147. // insert data
  148. foreach ($data as $line) {
  149. switch ($query['query']) {
  150. case 'calificaciones':
  151. $penultimaColumna = $line['formula']; // Asume que 'formula' es la penúltima columna
  152. $ultimaColumna = $line['ponderacion']; // Asume que 'ponderacion' es la última columna
  153. // Determina el valor de la nueva columna
  154. $nuevoValor = ($penultimaColumna === 'Sí' || $ultimaColumna === 'Sí') ? 'Sí' : 'No';
  155. // Añade el nuevo valor al final de la línea
  156. $line['Tiene calificación'] = $nuevoValor;
  157. $line['Calificación Máxima'] = $line['SUMA_NUMEROS'] + $line['Suma categorías'];
  158. $grupoNumerico = '';
  159. if (preg_match('/\d+/', $line['grupo'], $matches)) {
  160. $grupoNumerico = $matches[0]; // El primer match contiene la parte numérica
  161. }
  162. // Añade el valor numérico extraído al final de la línea
  163. $line['grupo_numerico'] = $grupoNumerico;
  164. break;
  165. }
  166. // Convertir cada elemento de la línea a UTF-8 antes de escribir al archivo
  167. $line_utf8 = array_map(function ($elem) {
  168. return mb_convert_encoding($elem, 'UTF-8', 'UTF-8');
  169. }, $line);
  170. fputcsv($fp, $line_utf8);
  171. }
  172. fclose($fp);
  173. exit();