where('clave', $query['query']) ->getOne('consulta', 'consulta_sql, archivo'); methods([ 'POST' => v::keySet( v::key('query', v::in($query)), ) ]); // method must be POST if (!isset($_SESSION['user'], $moodle_db)) { 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'); exit(); } $data = $moodle_db->query($consulta['consulta_sql']); header('Content-Type: text/csv; charset=UTF-8'); header('Content-Disposition: attachment; filename="' . $consulta['archivo'] . '"'); echo "\xEF\xBB\xBF"; // Añade el BOM de UTF-8 al inicio del archivo para indicar su codificación $fp = fopen('php://output', 'w'); // 'wb' también es válido en este contexto // insert header $headers = array_keys($data[0]); switch ($query['query']) { case 'c-calif': $headers[] = 'TIENE CALIFICACIÓN'; $headers[] = 'CALIFICACIÓN MÁXIMA'; $headers[] = 'GRUPO NUMÉRICO'; break; case 'c-fin': # Añade 'TIENE CALIFICACIÓN' $headers[] = 'TIENE CALIFICACIÓN'; $headers[] = 'PROMEDIO_GENERAL'; $headers[] = 'DESVIACIÓN'; # Ejecuta el query de 'c-calif' para obtener la calificación $calificacion = $db ->where('clave', 'c-calif') ->getOne('consulta'); $result = $moodle_db->query($calificacion['consulta_sql']); break; } // todos los headers en Mayúsculas incluyendo los acentos $headers = array_map(function ($header) { return mb_convert_case($header, MB_CASE_UPPER, 'UTF-8'); }, $headers); fputcsv($fp, $headers); // insert data foreach ($data as $line) { switch ($query['query']) { case 'c-calif': $penultimaColumna = $line['formula']; // Asume que 'formula' es la penúltima columna $ultimaColumna = $line['ponderacion']; // Asume que 'ponderacion' es la última columna // Determina el valor de la nueva columna $nuevoValor = ($penultimaColumna === 'Sí' || $ultimaColumna === 'Sí') ? 'Sí' : 'No'; // Añade el nuevo valor al final de la línea $line['TIENE CALIFICACIÓN'] = $nuevoValor; $line['CALIFICACIÓN MÁXIMA'] = floatval($line['suma_numeros']) + floatval($line['Suma categorías']); $grupoNumerico = ''; if (preg_match('/\d+/', $line['grupo'], $matches)) { $grupoNumerico = $matches[0]; // El primer match contiene la parte numérica } // Añade el valor numérico extraído al final de la línea $line['GRUPO NUMÉRICO'] = $grupoNumerico; break; case 'c-fin': // encuentra el result que tenga el mismo courseid $courseid = $line['course_id']; $calificacion = array_filter($result, function ($row) use ($courseid) { return $row['courseid'] === $courseid && ($row['ponderacion'] === 'Sí' || $row['formula'] === 'Sí'); }); // si encuentra el result, añade 'Sí' a la última columna $line['TIENE CALIFICACIÓN'] = count($calificacion) > 0 ? 'Sí' : 'No'; preg_match('/-(\d+)$/', $line['shortname'], $matches); $materia = $sgi_db->querySingle('SELECT AVG(amg."Calificacion_calif") AS calificación, STDDEV(amg."Calificacion_calif") AS desviación FROM "Alumno_Materia_Calificacion" amg WHERE amg."Materia_id" = :materia_id GROUP BY amg."Materia_id" ORDER BY AVG(amg."Calificacion_calif")', ['materia_id' => intval($matches[1])] ); $line['PROMEDIO_GENERAL'] = $materia['calificación'] ?? 0; $line['DESVIACIÓN'] = $materia['desviación'] ?? 0; break; } // Convertir cada elemento de la línea a UTF-8 antes de escribir al archivo $line_utf8 = array_map(function ($elem) { return mb_convert_encoding($elem, 'UTF-8', 'UTF-8'); }, $line); fputcsv($fp, $line_utf8); } fclose($fp); exit();