Proyectos de Subversion Moodle

Rev

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

<?php
namespace local_cesa_reportes\task;

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\IOFactory;

defined('MOODLE_INTERNAL') || die();

require_once dirname(dirname(__DIR__)) . DIRECTORY_SEPARATOR .  'locallib.php';
require_once dirname(dirname(dirname(dirname(__DIR__)))) . DIRECTORY_SEPARATOR .  'lib' . DIRECTORY_SEPARATOR . 'phpspreadsheet' . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';


 
class processreport extends \core\task\scheduled_task {
    const _STATUS_PENDING = 0;
    const _STATUS_PROCESSING = 1;
    const _STATUS_READY = 2;
    const _STATUS_ERROR = 3;
    

    public function get_name() {
        return get_string('process_report_task', 'local_cesa_reportes');
    }
    

    public function execute() {
        global $DB;
        

        $record_files = $DB->get_records('local_cesa_reportes', ['status' => self::_STATUS_PENDING]);
        foreach($record_files as $record_file)
        {

            $parameters = json_decode($record_file->parameters);
            
            if($parameters->type ==  'todos_los_usuarios_de_un_curso') {
                
                $record_file->status = self::_STATUS_PROCESSING;
                $DB->update_record('local_cesa_reportes', $record_file);
                
                $this->todos_los_usuarios_de_un_curso($record_file);
            }
            else if($parameters->type ==  'todos_los_cursos_de_un_usuario') {
                
                $record_file->status = self::_STATUS_PROCESSING;
                $DB->update_record('local_cesa_reportes', $record_file);
                
                $this->todos_los_cursos_de_un_usuario($record_file);
            }
            else if($parameters->type ==  'todos_los_cursos') {
                    
                $record_file->status = self::_STATUS_PROCESSING;
                $DB->update_record('local_cesa_reportes', $record_file);
                    
                $this->todos_los_cursos($record_file);
            }
            else if($parameters->type ==  'todos_los_cursos_con_actividades') {
                
                $record_file->status = self::_STATUS_PROCESSING;
                $DB->update_record('local_cesa_reportes', $record_file);
                
                $this->todos_los_cursos_con_actividades($record_file);
            }
            else if($parameters->type ==  'los_ultimos_siete_dias') {
                
                $record_file->status = self::_STATUS_PROCESSING;
                $DB->update_record('local_cesa_reportes', $record_file);
                
                $this->los_ultimos_siete_dias($record_file);
            }
            else if($parameters->type ==  'custom') {
                
                $record_file->status = self::_STATUS_PROCESSING;
                $DB->update_record('local_cesa_reportes', $record_file);
                
                $this->custom($record_file);
            }
        }
        

        return true;    
        

    }
    
    private function los_ultimos_siete_dias($record_file)
    {
        global $DB;
        
        $filter_userids = [];
        $filter_courseids = [];
        $filter_by_company_active = false;
        
        
        $data = local_cesa_reportes_get_week_days();
        
        
        $last_ten_user_activities = (array) local_cesa_reportes_get_last_ten_user_activities($filter_by_company_active, $filter_userids, $data->min, $data->max);
        $top_ten_user_activities = (array)  local_cesa_reportes_get_top_ten_user_activities($filter_by_company_active, $filter_userids, $data->min, $data->max);
        
        
        
        $last_ten_user_modules_completion =  (array) local_cesa_reportes_get_last_ten_user_modules_completion($filter_by_company_active, $filter_userids, $data->min, $data->max);
        $top_ten_user_modules_completion =  (array) local_cesa_reportes_get_top_ten_user_modules_completion($filter_by_company_active, $filter_userids, $data->min, $data->max);

        
        
        $chart = [];
        
        
        foreach($data->days as $day)
        {
            
            $data1 = local_cesa_reportes_get_count_activities($filter_by_company_active, $filter_userids, $day->min, $day->max);
            $data2 = local_cesa_reportes_get_count_modules_completion($filter_by_company_active, $filter_userids, $day->min, $day->max);
            
            array_push($chart, [
                'label' => $day->day,
                'data1' => $data1,
                'data2' => $data2,
            ]);
            
            
        }

        $spreadsheet = new Spreadsheet();
        $sheet = $spreadsheet->getActiveSheet();
        
        $sheet->setMergeCells(['A1', 'E1']);
        $sheet->setCellValue('A1', 'Los últimos 10 usuarios con actividades');
        $sheet->setCellValue('A2', 'Curso');
        $sheet->setCellValue('B2', 'Nombre');
        $sheet->setCellValue('C2', 'Apellido');
        $sheet->setCellValue('D2', 'Email');
        $sheet->setCellValue('E2', 'Fecha');
        

        $row = 3;
        foreach($last_ten_user_activities as $record)
        {
            $sheet->setCellValue('A' . $row, $record['course']);
            $sheet->setCellValue('B' . $row, $record['firstname']);
            $sheet->setCellValue('C' . $row, $record['lastname']);
            $sheet->setCellValue('D' . $row, $record['email']);
            $sheet->setCellValue('E' . $row, $record['timecreated']);
            $row++;
        }
        
        $sheet = $spreadsheet->createSheet();
        $sheet->setMergeCells(['A1', 'D1']);
        $sheet->setCellValue('A1', 'Los 10 usuarios con más  actividades vistas');
        $sheet->setCellValue('A2', 'Nombre');
        $sheet->setCellValue('B2', 'Apellido');
        $sheet->setCellValue('C2', 'Email');
        $sheet->setCellValue('D2', 'Total');
        
        
 
        foreach($top_ten_user_activities as $record)
        {
            $sheet->setCellValue('A' . $row, $record['firstname']);
            $sheet->setCellValue('B' . $row, $record['lastname']);
            $sheet->setCellValue('C' . $row, $record['email']);
            $sheet->setCellValue('D' . $row, $record['activities']);
            $row++;
        }
        
        $sheet = $spreadsheet->createSheet();
        $sheet->setMergeCells(['A1', 'E1']);
        $sheet->setCellValue('A1', 'Los últimos 10 usuarios con actividades completadas');
        $sheet->setCellValue('A2', 'Curso');
        $sheet->setCellValue('B2', 'Nombre');
        $sheet->setCellValue('C2', 'Apellido');
        $sheet->setCellValue('D2', 'Email');
        $sheet->setCellValue('E2', 'Fecha');
        
 
        
        $row = 3;
        foreach($last_ten_user_modules_completion as $record)
        {
            $sheet->setCellValue('A' . $row, $record['course']);
            $sheet->setCellValue('B' . $row, $record['firstname']);
            $sheet->setCellValue('C' . $row, $record['lastname']);
            $sheet->setCellValue('D' . $row, $record['email']);
            $sheet->setCellValue('E' . $row, $record['timemodified']);
            $row++;
        }
        
        
        $sheet = $spreadsheet->createSheet();
        $sheet->setMergeCells(['A1', 'D1']);
        $sheet->setCellValue('A1', 'Los 10 usuarios con más actividades completadas');
        $sheet->setCellValue('A2', 'Nombre');
        $sheet->setCellValue('B2', 'Apellido');
        $sheet->setCellValue('C2', 'Email');
        $sheet->setCellValue('D2', 'Total');
        
        
        $row = 3;
        foreach($top_ten_user_modules_completion as $record)
        {
            $sheet->setCellValue('A' . $row, $record['firstname']);
            $sheet->setCellValue('B' . $row, $record['lastname']);
            $sheet->setCellValue('C' . $row, $record['email']);
            $sheet->setCellValue('D' . $row, $record['completion']);
            $row++;
        }
        
        
        $sheet = $spreadsheet->createSheet();
        $sheet->setMergeCells(['A1','B1','C1']);
        $sheet->setCellValue('A1', 'Actividades Vistas / Actividades Completadas');
        $sheet->setCellValue('A2', 'Fecha');
        $sheet->setCellValue('B2', 'Actividades Vistas');
        $sheet->setCellValue('C2', 'Actividades Completadas');
        
        
        
        $row = 3;
        foreach($chart as $record)
        {
            $sheet->setCellValue('A' . $row, $record['label']);
            $sheet->setCellValue('B' . $row, $record['data1']);
            $sheet->setCellValue('C' . $row, $record['data2']);
            $row++;
        }
        
        
        $pathname = dirname(dirname(__DIR__)) . DIRECTORY_SEPARATOR . 'files';
        if(!file_exists($pathname)) {
            
            mkdir($pathname,0755, true);
        }
        
        $t = time();
        
        $filename = 'los-ultimos-siete-dias-'.date('Y-m-d-H-i').'.xlsx';
        $fullname =  $pathname . DIRECTORY_SEPARATOR .  $filename;
        
        try {
            $writer = new Xlsx($spreadsheet);
            $writer->save($fullname);
            
            
            $record_file->generate_time = $t;
            $record_file->status = self::_STATUS_READY;
            $record_file->filename = $filename;
            $DB->update_record('local_cesa_reportes', $record_file);
            
            return true;
            
        } catch (\Exception $e) {
            
            
            $record_file->status = self::_STATUS_ERROR;
            $DB->update_record('local_cesa_reportes', $record_file);
            
            return false;
            
        }
    }
    
    private function todos_los_cursos_con_actividades($record_file)
    {
        global $DB;
        
        $filter_userids = [];
        $filter_courseids = [];
        $filter_by_company_active = false;
        
        
        $pathname = dirname(dirname(__DIR__)) . DIRECTORY_SEPARATOR . 'files';
        if(!file_exists($pathname)) {
            
            mkdir($pathname,0755, true);
        }
        
        $t = time();
        

        $filename = 'todos-los-cursos-con-actividades-'.date('Y-m-d-H-i').'.csv';
        $fullname =  $pathname . DIRECTORY_SEPARATOR .  $filename;
        
        
        $filename_zip = 'todos-los-cursos-con-actividades-'.date('Y-m-d-H-i').'.zip';
        $fullname_zip =  $pathname . DIRECTORY_SEPARATOR .  $filename_zip;
        

        
        
        try {
        
            $fp = fopen($fullname, 'w+');
            
            
            $extra_fields = local_cesa_reportes_get_user_extra_field_names();
            
            
            $fields = [
                'Apellido',
                'Nombre',
                'Email',
                'Curso',
                'Categoria',
                'Matriculación',
                'Fecha finalización',
                'Actividades asignadas',
                'Actividades completadas',
                'Progreso %',
                'Primera actividad',
                'Ultima actividad',
                'Actividad',
                'Completado'
            ];
            
            foreach($extra_fields as $extra_field)
            {
                array_push($fields, $extra_field->name );
            }
            
            fputcsv($fp, $fields);
            
            
            $include_modules = true;
            $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'];
            
            foreach($records as $record)
            {
                if(!$record->courses) {
                    continue;
                }
                
                foreach($record->courses as $course)
                {
                    foreach($course->activities as $activity)
                    {
                        $item = [
                            $record->lastname,
                            $record->firstname,
                            $record->email,
                            $course->name,
                            $course->category,
                            empty($course->timeenrolled)  ? '' : date('d/m/Y h:i a', $course->timeenrolled),
                            empty($course->timecompleted)  ? '' : date('d/m/Y h:i a', $course->timecompleted),
                            $course->activities_assigned,
                            $course->activities_completed,
                            number_format($course->percentage, 2),
                            empty($course->time_activities_first)  ? '' : date('d/m/Y h:i a', $course->time_activities_first),
                            empty($course->time_activities_last)  ? '' : date('d/m/Y h:i a', $course->time_activities_last),
                            $activity->module,
                            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);
                        }
                        
                        fputcsv($fp, $item);
                        
                    }
                }
            }
    
            fflush($fp);
            fclose($fp);
            
            
            $zip = new \ZipArchive();
            if ($zip->open($fullname_zip, \ZIPARCHIVE::CREATE) != TRUE) {
                $record_file->status = self::_STATUS_ERROR;
                $DB->update_record('local_cesa_reportes', $record_file);
                
                return false;
            }
            $zip->addFile($fullname, $filename);
            $zip->close(); 

            @unlink($fullname);
            
            
            $record_file->generate_time = $t;
            $record_file->status = self::_STATUS_READY;
            $record_file->filename = $filename_zip;
            
            
            $DB->update_record('local_cesa_reportes', $record_file);
            

            return true;
        } catch (\Exception $e) {
           
            
            $record_file->status = self::_STATUS_ERROR;
            $DB->update_record('local_cesa_reportes', $record_file);
            
            return false;
            
        }
    }
    
    private function todos_los_cursos($record_file) 
    {
        global $DB;
        
        $filter_userids = [];
        $filter_courseids = [];
        $filter_by_company_active = false;
        
        
        $extra_fields = local_cesa_reportes_get_user_extra_field_names();
        

        
        try {
            
            $pathname = dirname(dirname(__DIR__)) . DIRECTORY_SEPARATOR . 'files';
            if(!file_exists($pathname)) {
                
                mkdir($pathname,0755, true);
            }
            
            $t = time();
            
            $filename = 'todos-los-cursos-'.date('Y-m-d-H-i').'.csv';
            $fullname =  $pathname . DIRECTORY_SEPARATOR .  $filename;
            
            $filename_zip = 'todos-los-cursos-'.date('Y-m-d-H-i').'.zip';
            $fullname_zip =  $pathname . DIRECTORY_SEPARATOR .  $filename_zip;
            
            $fp = fopen($fullname, 'w+');
            
            
            $fields = [
                'Apellido',
                'Nombre',
                'Email',
                'Curso',
                'Categoria',
                'Matriculación',
                'Fecha finalización',
                'Actividades asignadas',
                'Actividades completadas',
                'Progreso %',
                'Primera actividad',
                'Ultima actividad',
            ];
            
            foreach($extra_fields as $extra_field)
            {
                array_push($fields, $extra_field->name );
            }
            
            fputcsv($fp, $fields);
           

            $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'];
            
            
            foreach($records as $record)
            {
                if(!$record->courses) {
                    continue;
                }
                
                foreach($record->courses as $course)
                {
                    $item = [
                        $record->lastname,
                        $record->firstname,
                        
                        $record->email,
                        $course->name,
                        $course->category,
                        empty($course->timeenrolled)  ? '' : date('d/m/Y h:i a', $course->timeenrolled),
                        empty($course->timecompleted)  ? '' : date('d/m/Y h:i a', $course->timecompleted),
                        $course->activities_assigned,
                        $course->activities_completed,
                        number_format($course->percentage, 2),
                        empty($course->time_activities_first)  ? '' : date('d/m/Y h:i a', $course->time_activities_first),
                        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);
                    }
                    
                    
                    fputcsv($fp, $item);
                }
            }
            
            fflush($fp);
            fclose($fp);
            
            
            $zip = new \ZipArchive();
            if ($zip->open($fullname_zip, \ZIPARCHIVE::CREATE) != TRUE) {
                $record_file->status = self::_STATUS_ERROR;
                $DB->update_record('local_cesa_reportes', $record_file);
                
                return false;
            }
            $zip->addFile($fullname, $filename);
            $zip->close();
            
            @unlink($fullname);
            

            
            $record_file->generate_time = $t;
            $record_file->status = self::_STATUS_READY;
            $record_file->filename = $filename_zip;
            $DB->update_record('local_cesa_reportes', $record_file);
            
            return true;
            
        } catch (\Exception $e) {
            $record_file->status = self::_STATUS_ERROR;
            $DB->update_record('local_cesa_reportes', $record_file);
            
            return false;
            
        }
    }
    
    private function todos_los_cursos_de_un_usuario($record_file) 
    {
        global $DB;
        $parameters = json_decode($record_file->parameters);
        
        $filter_userids = [$parameters->userid];
        $filter_courseids = [];
        $filter_by_company_active = true;
        
        
        
        $extra_fields = local_cesa_reportes_get_user_extra_field_names();
        
        
        $fields = [
            'Apellido',
            'Nombre',
            'Email',
            'Curso',
            'Categoria',
            'Matriculación',
            'Fecha finalización',
            'Actividades asignadas',
            'Actividades completadas',
            'Progreso %',
            'Primera actividad',
            'Ultima actividad',
        ];
        
        
        foreach($extra_fields as $extra_field)
        {
            array_push($fields, $extra_field->name );
        }
        
        
        $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'];
        
        foreach($records as $record)
        {
            if(!$record->courses) {
                continue;
            }
            
            foreach($record->courses as $course)
            {
                $item = [
                    $record->lastname,
                    $record->firstname,
                    $record->email,
                    $course->name,
                    $course->category,
                    empty($course->timeenrolled)  ? '' : date('d/m/Y h:i a', $course->timeenrolled),
                    empty($course->timecompleted)  ? '' : date('d/m/Y h:i a', $course->timecompleted),
                    $course->activities_assigned,
                    $course->activities_completed,
                    number_format($course->percentage, 2),
                    empty($course->time_activities_first)  ? '' : date('d/m/Y h:i a', $course->time_activities_first),
                    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);
                }
                array_push($items, $item);
            }
        }
        
        
        $letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'O', 'P', 'Q', 'R', 'S'];
        
        // (B) CREATE A NEW SPREADSHEET
        $spreadsheet = new Spreadsheet();
        $sheet = $spreadsheet->getActiveSheet();
        
        
        
        for($i = 0; $maxi = count($fields), $i < $maxi; $i++)
        {
            $letter = $letters[$i];
            $row    = 1;
            $cell   = $letter . $row;
            $sheet->setCellValue($cell, $fields[$i]);
        }
        
        for($i = 0; $maxi = count($items), $i < $maxi; $i++)
        {
            $item = $items[$i];
            
            
            
            
            $row  = $i + 2;
            
            for($j = 0; $maxj = count($item), $j < $maxj; $j++)
            {
                
                $letter = $letters[$j];
                $cell   = $letter . $row;
                
                $sheet->setCellValue($cell, $item[$j]);
            }
        }
        
        $pathname = dirname(dirname(__DIR__)) . DIRECTORY_SEPARATOR . 'files';
        if(!file_exists($pathname)) {
            
            mkdir($pathname,0755, true);
        }
        
        $t = time();
        
        $filename = 'todos-los-cursos-de-un-usuario-'.date('Y-m-d-H-i').'.xlsx';
        $fullname =  $pathname . DIRECTORY_SEPARATOR .  $filename;
        
        
        try {
            $writer = new Xlsx($spreadsheet);
            $writer->save($fullname);
            
            $record_file->generate_time = $t;
            $record_file->status = self::_STATUS_READY;
            $record_file->filename = $filename;
            $DB->update_record('local_cesa_reportes', $record_file);
            
            return true;
            
            
        } catch (\Exception $e) {
            $record_file->status = self::_STATUS_ERROR;
            $DB->update_record('local_cesa_reportes', $record_file);
            
            return false;
            
        }
    }
    
    private function todos_los_usuarios_de_un_curso($record_file) 
    {
        global $DB;
        $parameters = json_decode($record_file->parameters);
        
        
        $filter_userids = [];
        $filter_courseids = [$parameters->courseid];
        $filter_by_company_active = true;
        
        
        $extra_fields = local_cesa_reportes_get_user_extra_field_names();
        
        
        $fields = [
            'Apellido',
            'Nombre',
            'Email',
            'Curso',
            'Categoria',
            'Matriculación',
            'Fecha finalización',
            'Actividades asignadas',
            'Actividades completadas',
            'Progreso %',
            'Primera actividad',
            'Ultima actividad',
        ];
        
        
        foreach($extra_fields as $extra_field)
        {
            array_push($fields, $extra_field->name );
        }
        
        
        $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'];
        
        
        
        foreach($records as $record)
        {
            if(!$record->courses) {
                continue;
            }
            
            foreach($record->courses as $course)
            {
                $item = [
                    $record->lastname,
                    $record->firstname,
                    $record->email,
                    $course->name,
                    $course->category,
                    empty($course->timeenrolled)  ? '' : date('d/m/Y h:i a', $course->timeenrolled),
                    empty($course->timecompleted)  ? '' : date('d/m/Y h:i a', $course->timecompleted),
                    $course->activities_assigned,
                    $course->activities_completed,
                    number_format($course->percentage, 2),
                    empty($course->time_activities_first)  ? '' : date('d/m/Y h:i a', $course->time_activities_first),
                    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);
                }
                array_push($items, $item);
            }
        }
        
        
        $letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'O', 'P', 'Q', 'R', 'S'];
        
        // (B) CREATE A NEW SPREADSHEET
        $spreadsheet = new Spreadsheet();
        $sheet = $spreadsheet->getActiveSheet();
        
        
        
        for($i = 0; $maxi = count($fields), $i < $maxi; $i++)
        {
            $letter = $letters[$i];
            $row    = 1;
            $cell   = $letter . $row;
            $sheet->setCellValue($cell, $fields[$i]);
        }
        
        for($i = 0; $maxi = count($items), $i < $maxi; $i++)
        {
            $item = $items[$i];
            
            
            
            
            $row  = $i + 2;
            
            for($j = 0; $maxj = count($item), $j < $maxj; $j++)
            {
                
                $letter = $letters[$j];
                $cell   = $letter . $row;
                
                $sheet->setCellValue($cell, $item[$j]);
            }
        }
        
        //
        
        
        
        $pathname = dirname(dirname(__DIR__)) . DIRECTORY_SEPARATOR . 'files';
        if(!file_exists($pathname)) {
            
            mkdir($pathname,0755, true);
        }
        
        $t = time();
        
        $filename = 'todos-los-usuarios-de-un-curso-'.date('Y-m-d-H-i').'.xlsx';
        $fullname =  $pathname . DIRECTORY_SEPARATOR .  $filename;
        
        
        try {
            $writer = new Xlsx($spreadsheet);
            $writer->save($fullname);
            
            $record_file->generate_time = $t;
            $record_file->status = self::_STATUS_READY;
            $record_file->filename = $filename;
            $DB->update_record('local_cesa_reportes', $record_file);
            
            
            return true;
            
        
        } catch (\Exception $e) {
            $record_file->status = self::_STATUS_ERROR;
            $DB->update_record('local_cesa_reportes', $record_file);
            
            return false;

        }
    }
    
    
    private function custom($record_file)
    {
        global $DB;
        $parameters = json_decode($record_file->parameters);
        
        
        $filter_from = $parameters->filter_from;
        $filter_to = $parameters->filter_to;
        $filter_userkeyword = $parameters->filter_userkeyword;
        
        
        $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();

        
        $filter_courseids = local_cesa_reportes_get_course_with_activites_range($filter_from, $filter_to);
        $filter_by_company_active = true; 
        
        
        $include_modules = false;
        $page = 0;
        
        $include_modules = false;
        
        try {
        
            $pathname = dirname(dirname(__DIR__)) . DIRECTORY_SEPARATOR . 'files';
            if(!file_exists($pathname)) {
                
                mkdir($pathname,0755, true);
            }
            
            $t = time();
            
            $filename = 'custom-'.date('Y-m-d-H-i').'.csv';
            $fullname =  $pathname . DIRECTORY_SEPARATOR .  $filename;
            
            
            $filename_zip = 'custom-'.date('Y-m-d-H-i').'.zip';
            $fullname_zip =  $pathname . DIRECTORY_SEPARATOR .  $filename_zip;
            
            
            
        
        
            $fp  = fopen($fullname, 'w+');
            
            $extra_fields = local_cesa_reportes_get_user_extra_field_names();
            
            
            if($include_modules) {
            
                $fields = [
                    'Apellido',
                    'Nombre',
                    'Email',
                    'Curso',
                    'Categoria',
                    'Matriculación',
                    'Fecha finalización',
                    'Actividades asignadas ',
                    'Actividades completadas ',
                    'Progreso %',
                    'Primera actividad',
                    'Ultima actividad',
                    'Actividad',
                    'Completado',
                    'Actividades asignadas (Curso) ',
                    'Actividades completadas (Curso) ',
                    'Progreso % (Curso) ',
                    'Primera actividad (Curso) ',
                    'Ultima actividad (Curso) ',
                ];
            } else {
                $fields = [
                    'Apellido',
                    'Nombre',
                    'Email',
                    'Curso',
                    'Categoria',
                    'Matriculación',
                    'Fecha finalización',
                    'Actividades asignadas ',
                    'Actividades completadas ',
                    'Progreso %',
                    'Primera actividad',
                    'Ultima actividad',
                    'Actividades asignadas (Curso) ',
                    'Actividades completadas (Curso) ',
                    'Progreso % (Curso) ',
                    'Primera actividad (Curso) ',
                    'Ultima actividad (Curso) ',
                ];
            }

            
            foreach($extra_fields as $extra_field)
            {
                array_push($fields, $extra_field->name);
            }
            
            fputcsv($fp, $fields);
        
    

        
        
        
    
            $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);
            $records = $data['items'];
            
            
            foreach($records as $record)
            {
                if(!$record->courses) {
                    continue;
                }
                
                foreach($record->courses as $course)
                {
                    if(isset($course->activities)) {
                        
                        foreach($course->activities as $activity)
                        {
                            $item = [
                                $record->lastname,
                                $record->firstname,
                                $record->email,
                                $course->name,
                                $course->category,
                                empty($course->timeenrolled)  ? '' : date('d/m/Y h:i a', $course->timeenrolled),
                                empty($course->timecompleted)  ? '' : date('d/m/Y h:i a', $course->timecompleted), 
                                $course->activities_assigned,
                                $course->activities_completed,
                                number_format($course->percentage, 2),
                                empty($course->time_activities_first)  ? '' : date('d/m/Y h:i a', $course->time_activities_first),
                                empty($course->time_activities_last)  ? '' : date('d/m/Y h:i a', $course->time_activities_last),
                                $activity->module,
                                empty($activity->timecompleted)  ? '' : date('d/m/Y h:i a', $activity->timecompleted),
                                $course->activities_assigned_course,
                                $course->activities_completed_course,
                                number_format($course->percentage_course, 2),
                                empty($course->time_activities_first_course)  ? '' : date('d/m/Y h:i a', $course->time_activities_first_course),
                                empty($course->time_activities_last_course)  ? '' : date('d/m/Y h:i a', $course->time_activities_last_course),
                           ];      
                            
                            

                            
                            
                            
                            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);
                            }
                            
                            
                        }
                    } else {
                        $item = [
                            $record->lastname,
                            $record->firstname,
                            $record->email,
                            $course->name,
                            $course->category,
                            empty($course->timeenrolled)  ? '' : date('d/m/Y h:i a', $course->timeenrolled),
                            empty($course->timecompleted)  ? '' : date('d/m/Y h:i a', $course->timecompleted),
                            $course->activities_assigned,
                            $course->activities_completed,
                            number_format($course->percentage, 2),
                            empty($course->time_activities_first)  ? '' : date('d/m/Y h:i a', $course->time_activities_first),
                            empty($course->time_activities_last)  ? '' : date('d/m/Y h:i a', $course->time_activities_last),
                            $course->activities_assigned_course,
                            $course->activities_completed_course,
                            number_format($course->percentage_course, 2),
                            empty($course->time_activities_first_course)  ? '' : date('d/m/Y h:i a', $course->time_activities_first_course),
                            empty($course->time_activities_last_course)  ? '' : date('d/m/Y h:i a', $course->time_activities_last_course),
                        ];     
                        
                        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 );
                        }
                        

                    }
                }
                
                fputcsv($fp, $item);
            }
        
            fflush($fp);
            fclose($fp);

            $zip = new \ZipArchive();
            if ($zip->open($fullname_zip, \ZIPARCHIVE::CREATE) != TRUE) {
                $record_file->status = self::_STATUS_ERROR;
                $DB->update_record('local_cesa_reportes', $record_file);
                
                return false;
            }
            $zip->addFile($fullname, $filename);
            $zip->close();
            
            @unlink($fullname);
            
        
            
            $record_file->generate_time = $t;
            $record_file->status = self::_STATUS_READY;
            $record_file->filename = $filename_zip;
            $DB->update_record('local_cesa_reportes', $record_file);
            
            
            return true;
            
            
        } catch (\Exception $e) {
            $record_file->status = self::_STATUS_ERROR;
            $DB->update_record('local_cesa_reportes', $record_file);
            
            return false;
            
        }
    }
}