123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- <?php
- require_once "{$_SERVER['DOCUMENT_ROOT']}/dependencies.php";
- // Exportar a archivo separado por comas
- // Must receive from POST associative array with keys and values
- use Respect\Validation\Validator as v;
- $query = json_decode(file_get_contents('php://input'), true);
- $consulta = $db
- ->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';
- # 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';
- 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();
|