123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- <?php
- ini_set('display_errors', 1);
- ini_set('display_startup_errors', 1);
- error_reporting(E_ALL);
- require_once "{$_SERVER['DOCUMENT_ROOT']}/dependencies.php";
- 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();
- }
- $grade_items = $moodle_db->query(
- "SELECT mdl_grade_items.id, itemname, calculation, courseid, fullname, shortname
- FROM mdl_grade_items
- JOIN mdl_course ON mdl_course.id = mdl_grade_items.courseid
- WHERE itemtype = 'course' AND TRIM(calculation) <> ''"
- );
- // Regular expression to match the item placeholders and percentages
- $pattern = '/(\d*\.?\d*)\s?\*\s?##gi(\d+)##|##gi(\d+)##\s?\*\s?(\d*\.?\d*)/';
- $grade_items = array_map(function ($item) use ($moodle_db, $pattern) {
- $matches = [];
- preg_match_all($pattern, $item['calculation'], $matches, PREG_SET_ORDER);
- $porcentaje = array_map(function ($match) use ($moodle_db) {
- $percentage = $match[1] ?: $match[4];
- $itemid = $match[2] ?: $match[3];
- $item_name = $moodle_db
- ->where('id', $itemid)
- ->getOne('mdl_grade_items', ['itemname', 'idnumber']);
- return [
- 'itemid' => intval($itemid),
- 'percentage' => floatval($percentage),
- 'item_name' => is_null($item_name) ? 'No encontrado' : ($item_name['itemname'] ?: $item_name['idnumber']),
- 'tipo_item' => ($item_name['itemname'] ?? null) ? 'Actividad única' : 'categoría',
- ];
- }, $matches);
- return [
- 'id' => $item['id'],
- 'calculation' => $item['calculation'],
- 'courseid' => $item['courseid'],
- 'fullname' => $item['fullname'],
- 'shortname' => $item['shortname'],
- 'porcentaje' => $porcentaje,
- 'suma_porcentaje' => # redondeo de 3 decimales
- round(array_sum(array_column($porcentaje, 'percentage')), 2),
- ];
- }, $grade_items);
- // Output the result as JSON
- header('Content-Type: application/json');
- # filter where suma porcentaje is less than 1
- $grade_items = array_filter($grade_items, function ($item) {
- return $item['suma_porcentaje'] < 1;
- });
- echo json_encode($grade_items, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|