Autoría | Ultima modificación | Ver Log |
<?phpdefined('MOODLE_INTERNAL') || die();global $CFG;require_once($CFG->libdir . '/externallib.php');require_once $CFG->libdir . '/completionlib.php';require_once $CFG->dirroot. '/completion/classes/progress.php';require_once(__DIR__ . '/locallib.php');require_once $CFG->libdir . '/phpspreadsheet/vendor/autoload.php';class local_cesa_reportes_ajax_external extends \external_api{const _STATUS_PENDING = 0;const _STATUS_PROCESSING = 1;const _STATUS_READY = 2;const _STATUS_ERROR = 3;public static function report_for_one_course_parameters(){return new \external_function_parameters(['courseid' => new \external_value(PARAM_INT, 'ID del curso', VALUE_DEFAULT, 0),]);}public static function report_for_one_course($courseid){global $CFG, $DB, $OUTPUT, $PAGE;require_login();require_capability('local/cesa_reportes:view', context_system::instance());$PAGE->set_context(context_system::instance());$filter_userids = [];$filter_courseids = [$courseid];$filter_by_company_active = true;$extra_fields = local_cesa_reportes_get_user_extra_field_names();$context['fields'] = [];array_push($context['fields'], ['field' => 'Apellido']);array_push($context['fields'], ['field' => 'Nombre']);array_push($context['fields'], ['field' => 'Email']);array_push($context['fields'], ['field' => 'Curso']);array_push($context['fields'], ['field' => 'Categoria']);array_push($context['fields'], ['field' => 'Matriculación']);array_push($context['fields'], ['field' => 'Fecha finalización']);array_push($context['fields'], ['field' => 'Actividades asignadas']);array_push($context['fields'], ['field' => 'Actividades completadas']);array_push($context['fields'], ['field' => 'Progreso %']);array_push($context['fields'], ['field' => 'Primera actividad']);array_push($context['fields'], ['field' => 'Ultima actividad']);foreach($extra_fields as $extra_field){array_push($context['fields'], ['field' => $extra_field->name]);}$context['items'] = [];$include_modules = false;$page = 0;$data = local_cesa_reportes_get_data_for_report_or_excel($filter_by_company_active, $filter_userids, $filter_courseids, $include_modules, $page);$records = $data['items'];$context['pagination'] = $data['pagination'];foreach($records as $record){if(!$record->courses) {continue;}foreach($record->courses as $course){$item = [];array_push($item, ['value' => $record->lastname ]);array_push($item, ['value' => $record->firstname ]);array_push($item, ['value' => $record->email ]);array_push($item, ['value' => $course->name ]);array_push($item, ['value' => $course->category ]);array_push($item, ['value' => empty($course->timeenrolled) ? '' : date('d/m/Y h:i a', $course->timeenrolled) ]);array_push($item, ['value' => empty($course->timecompleted) ? '' : date('d/m/Y h:i a', $course->timecompleted) ]);array_push($item, ['value' => $course->activities_assigned, 'align-right' => true ]);array_push($item, ['value' => $course->activities_completed, 'align-right' => true ]);array_push($item, ['value' => number_format($course->percentage, 2), 'align-right' => true ]);array_push($item, ['value' => empty($course->time_activities_first) ? '' : date('d/m/Y h:i a', $course->time_activities_first) ]);array_push($item, ['value' => empty($course->time_activities_last) ? '' : date('d/m/Y h:i a', $course->time_activities_last) ]);foreach($extra_fields as $extra_field){$value = '';foreach($record->extras as $extra){if($extra->id == $extra_field->id) {$value = $extra->value;}}array_push($item, ['value' => $value ]);}array_push($context['items'], ['item' => $item]);}}$data = $OUTPUT->render_from_template('local_cesa_reportes/report_one_course', $context);return json_encode(['success' =>true, 'data' => $data]);}public static function report_for_one_course_returns(){return new \external_value(PARAM_RAW, 'The updated JSON output');}public static function report_for_one_user_parameters(){return new \external_function_parameters(['userid' => new \external_value(PARAM_INT, 'ID del usuario', VALUE_DEFAULT, 0),]);}public static function report_for_one_user($userid){global $CFG, $DB, $OUTPUT, $PAGE;require_login();require_capability('local/cesa_reportes:view', context_system::instance());$PAGE->set_context(context_system::instance());$filter_userids = [$userid];$filter_courseids = [];$filter_by_company_active = true;$extra_fields = local_cesa_reportes_get_user_extra_field_names();$context['fields'] = [];array_push($context['fields'], ['field' => 'Apellido']);array_push($context['fields'], ['field' => 'Nombre']);array_push($context['fields'], ['field' => 'Email']);array_push($context['fields'], ['field' => 'Curso']);array_push($context['fields'], ['field' => 'Categoria']);array_push($context['fields'], ['field' => 'Matriculación']);array_push($context['fields'], ['field' => 'Fecha finalización']);array_push($context['fields'], ['field' => 'Actividades asignadas']);array_push($context['fields'], ['field' => 'Actividades completadas']);array_push($context['fields'], ['field' => 'Progreso %']);array_push($context['fields'], ['field' => 'Primera actividad']);array_push($context['fields'], ['field' => 'Ultima actividad']);foreach($extra_fields as $extra_field){array_push($context['fields'], ['field' => $extra_field->name]);}$context['items'] = [];$include_modules = false;$page = 0;$data = local_cesa_reportes_get_data_for_report_or_excel($filter_by_company_active, $filter_userids, $filter_courseids, $include_modules, $page);$records = $data['items'];$context['pagination'] = $data['pagination'];foreach($records as $record){if(!$record->courses) {continue;}foreach($record->courses as $course){$item = [];array_push($item, ['value' => $record->lastname ]);array_push($item, ['value' => $record->firstname ]);array_push($item, ['value' => $record->email ]);array_push($item, ['value' => $course->name ]);array_push($item, ['value' => $course->category ]);array_push($item, ['value' => empty($course->timeenrolled) ? '' : date('d/m/Y h:i a', $course->timeenrolled) ]);array_push($item, ['value' => empty($course->timecompleted) ? '' : date('d/m/Y h:i a', $course->timecompleted) ]);array_push($item, ['value' => $course->activities_assigned, 'align-right' => true ]);array_push($item, ['value' => $course->activities_completed, 'align-right' => true ]);array_push($item, ['value' => number_format($course->percentage, 2), 'align-right' => true ]);array_push($item, ['value' => empty($course->time_activities_first) ? '' : date('d/m/Y h:i a', $course->time_activities_first) ]);array_push($item, ['value' => empty($course->time_activities_last) ? '' : date('d/m/Y h:i a', $course->time_activities_last) ]);foreach($extra_fields as $extra_field){$value = '';foreach($record->extras as $extra){if($extra->id == $extra_field->id) {$value = $extra->value;}}array_push($item, ['value' => $value ]);}array_push($context['items'], ['item' => $item]);}}$data = $OUTPUT->render_from_template('local_cesa_reportes/report_one_course', $context);return json_encode(['success' => true, 'data' => $data]);}public static function report_for_one_user_returns(){return new \external_value(PARAM_RAW, 'The updated JSON output');}public static function excel_last_seven_days_parameters(){return new \external_function_parameters(['fakeparam' => new \external_value(PARAM_INT, 'fakeparam', VALUE_DEFAULT, 0),]);}public static function excel_last_seven_days($fakeparam){global $CFG, $DB, $PAGE, $USER;require_login();require_capability('local/cesa_reportes:view', context_system::instance());$PAGE->set_context(context_system::instance());$data = ['request_userid' => $USER->id,'request_time' => time(),'generate_time' => 0,'status' => self::_STATUS_PENDING,'parameters' => json_encode(['type' => 'los_ultimos_siete_dias',]),'filename' => '',];if($DB->insert_record('local_cesa_reportes', $data)) {return json_encode(['success' => true, 'data' => 'La petición de generación del reporte ha sido agregada']);} else {return json_encode(['success' => false, 'data' => 'No se pudo agregar la petición de generación del reporte']);}}public static function excel_last_seven_days_returns(){return new \external_value(PARAM_RAW, 'The updated JSON output');}public static function excel_for_one_course_parameters(){return new \external_function_parameters(['courseid' => new \external_value(PARAM_INT, 'ID del usuario', VALUE_DEFAULT, 0),]);}public static function excel_for_one_course($courseid){global $CFG, $DB, $PAGE, $USER;require_login();require_capability('local/cesa_reportes:view', context_system::instance());$PAGE->set_context(context_system::instance());$data = ['request_userid' => $USER->id,'request_time' => time(),'generate_time' => 0,'status' => self::_STATUS_PENDING,'parameters' => json_encode(['type' => 'todos_los_usuarios_de_un_curso','courseid' => $courseid,]),'filename' => '',];if($DB->insert_record('local_cesa_reportes', $data)) {return json_encode(['success' => true, 'data' => 'La petición de generación del reporte ha sido agregada']);} else {return json_encode(['success' => false, 'data' => 'No se pudo agregar la petición de generación del reporte']);}}public static function excel_for_one_course_returns(){return new \external_value(PARAM_RAW, 'The updated JSON output');}public static function excel_for_one_user_parameters(){return new \external_function_parameters(['userid' => new \external_value(PARAM_INT, 'ID del usuario', VALUE_DEFAULT, 0),]);}public static function excel_for_one_user($userid){global $CFG, $DB, $PAGE, $USER;require_login();require_capability('local/cesa_reportes:view', context_system::instance());$PAGE->set_context(context_system::instance());$data = ['request_userid' => $USER->id,'request_time' => time(),'generate_time' => 0,'status' => self::_STATUS_PENDING,'parameters' => json_encode(['type' => 'todos_los_cursos_de_un_usuario','userid' => $userid,]),'filename' => '',];if($DB->insert_record('local_cesa_reportes', $data)) {return json_encode(['success' => true, 'data' => 'La petición de generación del reporte ha sido agregada']);} else {return json_encode(['success' => false, 'data' => 'No se pudo agregar la petición de generación del reporte']);}}public static function excel_for_one_user_returns(){return new \external_value(PARAM_RAW, 'The updated JSON output');}public static function excel_all_courses_parameters(){return new \external_function_parameters(['fakeparam' => new \external_value(PARAM_INT, 'fakeparam', VALUE_DEFAULT, 0),]);}public static function excel_all_courses($fakeparam){global $CFG, $DB, $PAGE, $USER;require_login();require_capability('local/cesa_reportes:view', context_system::instance());$PAGE->set_context(context_system::instance());$data = ['request_userid' => $USER->id,'request_time' => time(),'generate_time' => 0,'status' => self::_STATUS_PENDING,'parameters' => json_encode(['type' => 'todos_los_cursos',]),'filename' => '',];if($DB->insert_record('local_cesa_reportes', $data)) {return json_encode(['success' => true, 'data' => 'La petición de generación del reporte ha sido agregada']);} else {return json_encode(['success' => false, 'data' => 'No se pudo agregar la petición de generación del reporte']);}}public static function excel_all_courses_returns(){return new \external_value(PARAM_RAW, 'The updated JSON output');}public static function excel_all_courses_with_activites_parameters(){return new \external_function_parameters(['fakeparam' => new \external_value(PARAM_INT, 'fakeparam', VALUE_DEFAULT, 0),]);}public static function excel_all_courses_with_activites($fakeparam){global $CFG, $DB, $PAGE, $USER;require_login();require_capability('local/cesa_reportes:view', context_system::instance());$PAGE->set_context(context_system::instance());$data = ['request_userid' => $USER->id,'request_time' => time(),'generate_time' => 0,'status' => self::_STATUS_PENDING,'parameters' => json_encode(['type' => 'todos_los_cursos_con_actividades',]),'filename' => '',];if($DB->insert_record('local_cesa_reportes', $data)) {return json_encode(['success' => true, 'data' => 'La petición de generación del reporte ha sido agregada']);} else {return json_encode(['success' => false, 'data' => 'No se pudo agregar la petición de generación del reporte']);}}public static function excel_all_courses_with_activites_returns(){return new \external_value(PARAM_RAW, 'The updated JSON output');}public static function all_files_parameters(){return new \external_function_parameters(['fakeparam' => new \external_value(PARAM_INT, 'fakeparam', VALUE_DEFAULT, 0),]);}public static function all_files($fakeparam){global $CFG, $DB, $PAGE, $OUTPUT;require_login();require_capability('local/cesa_reportes:view', context_system::instance());$PAGE->set_context(context_system::instance());$context['items'] = [];$users = [];$records = $DB->get_records('local_cesa_reportes', [], 'request_time DESC');foreach($records as $record){if(isset($users[$record->request_userid])) {$user = $users[$record->request_userid];} else {$user = $DB->get_record('user', ['id' => $record->request_userid]);$users[$record->request_userid] = $user;//select id, username, firstname, lastname, email from db_moodle4_dev.mdl_user}$item = ['id' => $record->id,'download' => false,'delete' => false,'values' => [],];array_push($item['values'], ['value' => date('d/m/Y h:i a', $record->request_time)]);array_push($item['values'], ['value' => $user->firstname . ' ' . $user->lastname ]);switch($record->status){case 1 :array_push($item['values'], ['value' => 'Procesando' ]);break;case 2 :array_push($item['values'], ['value' => 'Generado' ]);$item['delete'] = true;$item['download'] = true;break;case 3 :array_push($item['values'], ['value' => 'Error' ]);$item['delete'] = true;break;default :array_push($item['values'], ['value' => 'Pendiente']);$item['delete'] = true;break;}array_push($item['values'], ['value' => $record->filename] );array_push($item['values'], ['value' => empty($record->generate_time) ? '' : date('d/m/Y h:i a', $record->generate_time)]);array_push($context['items'],['item' => $item]);}$data = $OUTPUT->render_from_template('local_cesa_reportes/all_files', $context);return json_encode(['success' => true, 'data' => $data]);}public static function all_files_returns(){return new \external_value(PARAM_RAW, 'The updated JSON output');}public static function delete_file_parameters(){return new \external_function_parameters(['id' => new \external_value(PARAM_INT, 'fakeparam', VALUE_DEFAULT, 0),]);}public static function delete_file($id){global $CFG, $DB, $PAGE, $OUTPUT;require_login();require_capability('local/cesa_reportes:view', context_system::instance());$PAGE->set_context(context_system::instance());$record = $DB->get_record('local_cesa_reportes', ['id' => $id]);if($record) {$full_filename = __DIR__ . DIRECTORY_SEPARATOR . 'files' . DIRECTORY_SEPARATOR . $record->filename ;if(file_exists($full_filename)) {@unlink($full_filename);}$DB->delete_records('local_cesa_reportes', ['id' => $id]);}$context['items'] = [];$users = [];$records = $DB->get_records('local_cesa_reportes', [], 'request_time DESC');foreach($records as $record){if(isset($users[$record->request_userid])) {$user = $users[$record->request_userid];} else {$user = $DB->get_record('user', ['id' => $record->request_userid]);$users[$record->request_userid] = $user;//select id, username, firstname, lastname, email from db_moodle4_dev.mdl_user}$item = ['id' => $record->id,'download' => false,'delete' => false,'values' => [],];array_push($item['values'], ['value' => date('d/m/Y h:i a', $record->request_time)]);array_push($item['values'], ['value' => $user->firstname . ' ' . $user->lastname ]);switch($record->status){case 1 :array_push($item['values'], ['value' => 'Procesando' ]);break;case 2 :array_push($item['values'], ['value' => 'Generado' ]);$item['download'] = true;$item['delete'] = true;break;case 3 :array_push($item['values'], ['value' => 'Error' ]);$item['delete'] = true;break;default :array_push($item['values'], ['value' => 'Pendiente']);$item['delete'] = true;break;}array_push($item['values'], ['value' => $record->filename] );array_push($item['values'], ['value' => empty($record->generate_time) ? '' : date('d/m/Y h:i a', $record->generate_time)]);array_push($context['items'],['item' => $item]);}$data = $OUTPUT->render_from_template('local_cesa_reportes/all_files', $context);return json_encode(['success' => true, 'data' => $data]);}public static function delete_file_returns(){return new \external_value(PARAM_RAW, 'The updated JSON output');}public static function download_file_parameters(){return new \external_function_parameters(['id' => new \external_value(PARAM_INT, 'fakeparam', VALUE_DEFAULT, 0),]);}public static function download_file($id){global $CFG, $DB, $PAGE, $OUTPUT;require_login();require_capability('local/cesa_reportes:view', context_system::instance());$PAGE->set_context(context_system::instance());$record = $DB->get_record('local_cesa_reportes', ['id' => $id]);if($record) {$full_filename = __DIR__ . DIRECTORY_SEPARATOR . 'files' . DIRECTORY_SEPARATOR . $record->filename ;if(file_exists($full_filename)) {$data = base64_encode(file_get_contents($full_filename));return json_encode(['success' => true, 'data' =>['basename' => $record->filename, 'content' => $data]]);}}return json_encode(['success' => false, 'data' => get_string('cesa_reportes_error_file_not_found', 'local_cesa_reportes')]);}public static function download_file_returns(){return new \external_value(PARAM_RAW, 'The updated JSON output');}public static function report_custom_parameters(){return new \external_function_parameters(['filter_from' => new \external_value(PARAM_ALPHANUMEXT, 'filter_from', VALUE_DEFAULT, ''),'filter_to' => new \external_value(PARAM_ALPHANUMEXT, 'filter_to', VALUE_DEFAULT, ''),'filter_userkeyword' => new \external_value(PARAM_RAW, 'filter_userkeyword', VALUE_DEFAULT, ''),]);}public static function report_custom($filter_from, $filter_to, $filter_userkeyword){global $CFG, $DB, $PAGE, $OUTPUT;require_login();require_capability('local/cesa_reportes:view', context_system::instance());$PAGE->set_context(context_system::instance());$filter_userkeyword = filter_var($filter_userkeyword, FILTER_SANITIZE_STRING);$extra_fields = local_cesa_reportes_get_user_extra_field_names();$context['fields'] = [];array_push($context['fields'], ['field' => 'Apellido']);array_push($context['fields'], ['field' => 'Nombre']);array_push($context['fields'], ['field' => 'Email']);array_push($context['fields'], ['field' => 'Curso']);array_push($context['fields'], ['field' => 'Categoria']);array_push($context['fields'], ['field' => 'Matriculación']);array_push($context['fields'], ['field' => 'Fecha finalización']);array_push($context['fields'], ['field' => 'Actividades asignadas ']);array_push($context['fields'], ['field' => 'Actividades completadas ']);array_push($context['fields'], ['field' => 'Progreso %']);array_push($context['fields'], ['field' => 'Primera actividad']);array_push($context['fields'], ['field' => 'Ultima actividad']);array_push($context['fields'], ['field' => 'Actividad']);array_push($context['fields'], ['field' => 'Completado']);foreach($extra_fields as $extra_field){array_push($context['fields'], ['field' => $extra_field->name]);}$filter_userids = [];$filter_by_company_active = false;$dt = \DateTime::createFromFormat('Y-m-d', $filter_from);$dt->setTime(0, 0, 0);$filter_from = $dt ? $dt->getTimestamp() : strtotime('-1 Month');$dt = \DateTime::createFromFormat('Y-m-d', $filter_to);$dt->setTime(23, 59, 59);$filter_to = $dt ? $dt->getTimestamp() : time();$context['items'] = [];$context['filter_from'] = $filter_from;$context['filter_to'] = $filter_to;$filter_courseids = local_cesa_reportes_get_course_with_activites_range($filter_from, $filter_to);$filter_by_company_active = true;$include_modules = false;$data = local_cesa_reportes_get_data_for_report_or_excel_custom($filter_by_company_active, $filter_userids, $filter_courseids, $filter_userkeyword, $filter_from, $filter_to, $include_modules, $page = 1);$records = $data['items'];$context['pagination'] = $data['pagination'];if($context['pagination']['page'] > 1) {$context['pagination']['previous_page'] = $context['pagination']['page'] - 1;}if($context['pagination']['page'] < $context['pagination']['max_pages']) {$context['pagination']['next_page'] = $context['pagination']['page'] + 1;}foreach($records as $record){if(!$record->courses) {continue;}foreach($record->courses as $course){if(isset($course->activities)) {foreach($course->activities as $activity){$item = [];array_push($item, ['value' => $record->lastname ]);array_push($item, ['value' => $record->firstname ]);array_push($item, ['value' => $record->email ]);array_push($item, ['value' => $course->name ]);array_push($item, ['value' => $course->category ]);array_push($item, ['value' => empty($course->timeenrolled) ? '' : date('d/m/Y h:i a', $course->timeenrolled)]);array_push($item, ['value' => empty($course->timecompleted) ? '' : date('d/m/Y h:i a', $course->timecompleted)]);array_push($item, ['value' => $course->activities_assigned, 'align-right' => true ]);array_push($item, ['value' => $course->activities_completed, 'align-right' => true ]);array_push($item, ['value' => number_format($course->percentage, 2), 'align-right' => true ]);array_push($item, ['value' => empty($course->time_activities_first) ? '' : date('d/m/Y h:i a', $course->time_activities_first) ]);array_push($item, ['value' => empty($course->time_activities_last) ? '' : date('d/m/Y h:i a', $course->time_activities_last) ]);array_push($item, ['value' => $activity->module ]);array_push($item, ['value' => empty($activity->timecompleted) ? '' : date('d/m/Y h:i a', $activity->timecompleted) ]);foreach($extra_fields as $extra_field){$value = '';foreach($record->extras as $extra){if($extra->id == $extra_field->id) {$value = $extra->value;}}array_push($item, ['value' => $value ]);}array_push($context['items'], ['item' => $item]);}} else {$item = [];array_push($item, ['value' => $record->lastname ]);array_push($item, ['value' => $record->firstname ]);array_push($item, ['value' => $record->email ]);array_push($item, ['value' => $course->name ]);array_push($item, ['value' => $course->category ]);array_push($item, ['value' => empty($course->timeenrolled) ? '' : date('d/m/Y h:i a', $course->timeenrolled)]);array_push($item, ['value' => empty($course->timecompleted) ? '' : date('d/m/Y h:i a', $course->timecompleted)]);array_push($item, ['value' => $course->activities_assigned, 'align-right' => true ]);array_push($item, ['value' => $course->activities_completed, 'align-right' => true ]);array_push($item, ['value' => number_format($course->percentage, 2), 'align-right' => true ]);array_push($item, ['value' => empty($course->time_activities_first) ? '' : date('d/m/Y h:i a', $course->time_activities_first) ]);array_push($item, ['value' => empty($course->time_activities_last) ? '' : date('d/m/Y h:i a', $course->time_activities_last) ]);foreach($extra_fields as $extra_field){$value = '';foreach($record->extras as $extra){if($extra->id == $extra_field->id) {$value = $extra->value;}}array_push($item, ['value' => $value ]);}array_push($context['items'], ['item' => $item]);}}}$data = $OUTPUT->render_from_template('local_cesa_reportes/report_custom', $context);return json_encode(['success' => true, 'data' => $data]);}public static function report_custom_returns(){return new \external_value(PARAM_RAW, 'The updated JSON output');}public static function report_excel_custom_parameters(){return new \external_function_parameters(['filter_from' => new \external_value(PARAM_ALPHANUMEXT, 'filter_from', VALUE_DEFAULT, ''),'filter_to' => new \external_value(PARAM_ALPHANUMEXT, 'filter_to', VALUE_DEFAULT, ''),'filter_userkeyword' => new \external_value(PARAM_RAW, 'filter_userkeyword', VALUE_DEFAULT, ''),]);}public static function report_excel_custom($filter_from, $filter_to, $filter_userkeyword){global $CFG, $DB, $PAGE, $USER;require_login();require_capability('local/cesa_reportes:view', context_system::instance());$PAGE->set_context(context_system::instance());$data = ['request_userid' => $USER->id,'request_time' => time(),'generate_time' => 0,'status' => self::_STATUS_PENDING,'parameters' => json_encode(['type' => 'custom','filter_from' => $filter_from,'filter_to' => $filter_to,'filter_userkeyword' => $filter_userkeyword,]),'filename' => '',];if($DB->insert_record('local_cesa_reportes', $data)) {return json_encode(['success' => true, 'data' => 'La petición de generación del reporte ha sido agregada']);} else {return json_encode(['success' => false, 'data' => 'No se pudo agregar la petición de generación del reporte']);}}public static function report_excel_custom_returns(){return new \external_value(PARAM_RAW, 'The updated JSON output');}}