Proyectos de Subversion Moodle

Rev

Autoría | Ultima modificación | Ver Log |

<?php
defined('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');
        
    }
    
}