Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
namespace local_cesa_reportes\task;
3
 
4
use PhpOffice\PhpSpreadsheet\Spreadsheet;
5
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
6
use PhpOffice\PhpSpreadsheet\IOFactory;
7
 
8
defined('MOODLE_INTERNAL') || die();
9
 
10
require_once dirname(dirname(__DIR__)) . DIRECTORY_SEPARATOR .  'locallib.php';
11
require_once dirname(dirname(dirname(dirname(__DIR__)))) . DIRECTORY_SEPARATOR .  'lib' . DIRECTORY_SEPARATOR . 'phpspreadsheet' . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
12
 
13
 
14
 
15
class processreport extends \core\task\scheduled_task {
16
    const _STATUS_PENDING = 0;
17
    const _STATUS_PROCESSING = 1;
18
    const _STATUS_READY = 2;
19
    const _STATUS_ERROR = 3;
20
 
21
 
22
    public function get_name() {
23
        return get_string('process_report_task', 'local_cesa_reportes');
24
    }
25
 
26
 
27
    public function execute() {
28
        global $DB;
29
 
30
 
31
        $record_files = $DB->get_records('local_cesa_reportes', ['status' => self::_STATUS_PENDING]);
32
        foreach($record_files as $record_file)
33
        {
34
 
35
            $parameters = json_decode($record_file->parameters);
36
 
37
            if($parameters->type ==  'todos_los_usuarios_de_un_curso') {
38
 
39
                $record_file->status = self::_STATUS_PROCESSING;
40
                $DB->update_record('local_cesa_reportes', $record_file);
41
 
42
                $this->todos_los_usuarios_de_un_curso($record_file);
43
            }
44
            else if($parameters->type ==  'todos_los_cursos_de_un_usuario') {
45
 
46
                $record_file->status = self::_STATUS_PROCESSING;
47
                $DB->update_record('local_cesa_reportes', $record_file);
48
 
49
                $this->todos_los_cursos_de_un_usuario($record_file);
50
            }
51
            else if($parameters->type ==  'todos_los_cursos') {
52
 
53
                $record_file->status = self::_STATUS_PROCESSING;
54
                $DB->update_record('local_cesa_reportes', $record_file);
55
 
56
                $this->todos_los_cursos($record_file);
57
            }
58
            else if($parameters->type ==  'todos_los_cursos_con_actividades') {
59
 
60
                $record_file->status = self::_STATUS_PROCESSING;
61
                $DB->update_record('local_cesa_reportes', $record_file);
62
 
63
                $this->todos_los_cursos_con_actividades($record_file);
64
            }
65
            else if($parameters->type ==  'los_ultimos_siete_dias') {
66
 
67
                $record_file->status = self::_STATUS_PROCESSING;
68
                $DB->update_record('local_cesa_reportes', $record_file);
69
 
70
                $this->los_ultimos_siete_dias($record_file);
71
            }
72
            else if($parameters->type ==  'custom') {
73
 
74
                $record_file->status = self::_STATUS_PROCESSING;
75
                $DB->update_record('local_cesa_reportes', $record_file);
76
 
77
                $this->custom($record_file);
78
            }
79
        }
80
 
81
 
82
        return true;
83
 
84
 
85
    }
86
 
87
    private function los_ultimos_siete_dias($record_file)
88
    {
89
        global $DB;
90
 
91
        $filter_userids = [];
92
        $filter_courseids = [];
93
        $filter_by_company_active = false;
94
 
95
 
96
        $data = local_cesa_reportes_get_week_days();
97
 
98
 
99
        $last_ten_user_activities = (array) local_cesa_reportes_get_last_ten_user_activities($filter_by_company_active, $filter_userids, $data->min, $data->max);
100
        $top_ten_user_activities = (array)  local_cesa_reportes_get_top_ten_user_activities($filter_by_company_active, $filter_userids, $data->min, $data->max);
101
 
102
 
103
 
104
        $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);
105
        $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);
106
 
107
 
108
 
109
        $chart = [];
110
 
111
 
112
        foreach($data->days as $day)
113
        {
114
 
115
            $data1 = local_cesa_reportes_get_count_activities($filter_by_company_active, $filter_userids, $day->min, $day->max);
116
            $data2 = local_cesa_reportes_get_count_modules_completion($filter_by_company_active, $filter_userids, $day->min, $day->max);
117
 
118
            array_push($chart, [
119
                'label' => $day->day,
120
                'data1' => $data1,
121
                'data2' => $data2,
122
            ]);
123
 
124
 
125
        }
126
 
127
        $spreadsheet = new Spreadsheet();
128
        $sheet = $spreadsheet->getActiveSheet();
129
 
130
        $sheet->setMergeCells(['A1', 'E1']);
131
        $sheet->setCellValue('A1', 'Los últimos 10 usuarios con actividades');
132
        $sheet->setCellValue('A2', 'Curso');
133
        $sheet->setCellValue('B2', 'Nombre');
134
        $sheet->setCellValue('C2', 'Apellido');
135
        $sheet->setCellValue('D2', 'Email');
136
        $sheet->setCellValue('E2', 'Fecha');
137
 
138
 
139
        $row = 3;
140
        foreach($last_ten_user_activities as $record)
141
        {
142
            $sheet->setCellValue('A' . $row, $record['course']);
143
            $sheet->setCellValue('B' . $row, $record['firstname']);
144
            $sheet->setCellValue('C' . $row, $record['lastname']);
145
            $sheet->setCellValue('D' . $row, $record['email']);
146
            $sheet->setCellValue('E' . $row, $record['timecreated']);
147
            $row++;
148
        }
149
 
150
        $sheet = $spreadsheet->createSheet();
151
        $sheet->setMergeCells(['A1', 'D1']);
152
        $sheet->setCellValue('A1', 'Los 10 usuarios con más  actividades vistas');
153
        $sheet->setCellValue('A2', 'Nombre');
154
        $sheet->setCellValue('B2', 'Apellido');
155
        $sheet->setCellValue('C2', 'Email');
156
        $sheet->setCellValue('D2', 'Total');
157
 
158
 
159
 
160
        foreach($top_ten_user_activities as $record)
161
        {
162
            $sheet->setCellValue('A' . $row, $record['firstname']);
163
            $sheet->setCellValue('B' . $row, $record['lastname']);
164
            $sheet->setCellValue('C' . $row, $record['email']);
165
            $sheet->setCellValue('D' . $row, $record['activities']);
166
            $row++;
167
        }
168
 
169
        $sheet = $spreadsheet->createSheet();
170
        $sheet->setMergeCells(['A1', 'E1']);
171
        $sheet->setCellValue('A1', 'Los últimos 10 usuarios con actividades completadas');
172
        $sheet->setCellValue('A2', 'Curso');
173
        $sheet->setCellValue('B2', 'Nombre');
174
        $sheet->setCellValue('C2', 'Apellido');
175
        $sheet->setCellValue('D2', 'Email');
176
        $sheet->setCellValue('E2', 'Fecha');
177
 
178
 
179
 
180
        $row = 3;
181
        foreach($last_ten_user_modules_completion as $record)
182
        {
183
            $sheet->setCellValue('A' . $row, $record['course']);
184
            $sheet->setCellValue('B' . $row, $record['firstname']);
185
            $sheet->setCellValue('C' . $row, $record['lastname']);
186
            $sheet->setCellValue('D' . $row, $record['email']);
187
            $sheet->setCellValue('E' . $row, $record['timemodified']);
188
            $row++;
189
        }
190
 
191
 
192
        $sheet = $spreadsheet->createSheet();
193
        $sheet->setMergeCells(['A1', 'D1']);
194
        $sheet->setCellValue('A1', 'Los 10 usuarios con más actividades completadas');
195
        $sheet->setCellValue('A2', 'Nombre');
196
        $sheet->setCellValue('B2', 'Apellido');
197
        $sheet->setCellValue('C2', 'Email');
198
        $sheet->setCellValue('D2', 'Total');
199
 
200
 
201
        $row = 3;
202
        foreach($top_ten_user_modules_completion as $record)
203
        {
204
            $sheet->setCellValue('A' . $row, $record['firstname']);
205
            $sheet->setCellValue('B' . $row, $record['lastname']);
206
            $sheet->setCellValue('C' . $row, $record['email']);
207
            $sheet->setCellValue('D' . $row, $record['completion']);
208
            $row++;
209
        }
210
 
211
 
212
        $sheet = $spreadsheet->createSheet();
213
        $sheet->setMergeCells(['A1','B1','C1']);
214
        $sheet->setCellValue('A1', 'Actividades Vistas / Actividades Completadas');
215
        $sheet->setCellValue('A2', 'Fecha');
216
        $sheet->setCellValue('B2', 'Actividades Vistas');
217
        $sheet->setCellValue('C2', 'Actividades Completadas');
218
 
219
 
220
 
221
        $row = 3;
222
        foreach($chart as $record)
223
        {
224
            $sheet->setCellValue('A' . $row, $record['label']);
225
            $sheet->setCellValue('B' . $row, $record['data1']);
226
            $sheet->setCellValue('C' . $row, $record['data2']);
227
            $row++;
228
        }
229
 
230
 
231
        $pathname = dirname(dirname(__DIR__)) . DIRECTORY_SEPARATOR . 'files';
232
        if(!file_exists($pathname)) {
233
 
234
            mkdir($pathname,0755, true);
235
        }
236
 
237
        $t = time();
238
 
239
        $filename = 'los-ultimos-siete-dias-'.date('Y-m-d-H-i').'.xlsx';
240
        $fullname =  $pathname . DIRECTORY_SEPARATOR .  $filename;
241
 
242
        try {
243
            $writer = new Xlsx($spreadsheet);
244
            $writer->save($fullname);
245
 
246
 
247
            $record_file->generate_time = $t;
248
            $record_file->status = self::_STATUS_READY;
249
            $record_file->filename = $filename;
250
            $DB->update_record('local_cesa_reportes', $record_file);
251
 
252
            return true;
253
 
254
        } catch (\Exception $e) {
255
 
256
 
257
            $record_file->status = self::_STATUS_ERROR;
258
            $DB->update_record('local_cesa_reportes', $record_file);
259
 
260
            return false;
261
 
262
        }
263
    }
264
 
265
    private function todos_los_cursos_con_actividades($record_file)
266
    {
267
        global $DB;
268
 
269
        $filter_userids = [];
270
        $filter_courseids = [];
271
        $filter_by_company_active = false;
272
 
273
 
274
        $pathname = dirname(dirname(__DIR__)) . DIRECTORY_SEPARATOR . 'files';
275
        if(!file_exists($pathname)) {
276
 
277
            mkdir($pathname,0755, true);
278
        }
279
 
280
        $t = time();
281
 
282
 
283
        $filename = 'todos-los-cursos-con-actividades-'.date('Y-m-d-H-i').'.csv';
284
        $fullname =  $pathname . DIRECTORY_SEPARATOR .  $filename;
285
 
286
 
287
        $filename_zip = 'todos-los-cursos-con-actividades-'.date('Y-m-d-H-i').'.zip';
288
        $fullname_zip =  $pathname . DIRECTORY_SEPARATOR .  $filename_zip;
289
 
290
 
291
 
292
 
293
        try {
294
 
295
            $fp = fopen($fullname, 'w+');
296
 
297
 
298
            $extra_fields = local_cesa_reportes_get_user_extra_field_names();
299
 
300
 
301
            $fields = [
302
                'Apellido',
303
                'Nombre',
304
                'Email',
305
                'Curso',
306
                'Categoria',
307
                'Matriculación',
308
                'Fecha finalización',
309
                'Actividades asignadas',
310
                'Actividades completadas',
311
                'Progreso %',
312
                'Primera actividad',
313
                'Ultima actividad',
314
                'Actividad',
315
                'Completado'
316
            ];
317
 
318
            foreach($extra_fields as $extra_field)
319
            {
320
                array_push($fields, $extra_field->name );
321
            }
322
 
323
            fputcsv($fp, $fields);
324
 
325
 
326
            $include_modules = true;
327
            $page = 0;
328
            $data = local_cesa_reportes_get_data_for_report_or_excel($filter_by_company_active, $filter_userids, $filter_courseids, $include_modules, $page);
329
            $records = $data['items'];
330
 
331
            foreach($records as $record)
332
            {
333
                if(!$record->courses) {
334
                    continue;
335
                }
336
 
337
                foreach($record->courses as $course)
338
                {
339
                    foreach($course->activities as $activity)
340
                    {
341
                        $item = [
342
                            $record->lastname,
343
                            $record->firstname,
344
                            $record->email,
345
                            $course->name,
346
                            $course->category,
347
                            empty($course->timeenrolled)  ? '' : date('d/m/Y h:i a', $course->timeenrolled),
348
                            empty($course->timecompleted)  ? '' : date('d/m/Y h:i a', $course->timecompleted),
349
                            $course->activities_assigned,
350
                            $course->activities_completed,
351
                            number_format($course->percentage, 2),
352
                            empty($course->time_activities_first)  ? '' : date('d/m/Y h:i a', $course->time_activities_first),
353
                            empty($course->time_activities_last)  ? '' : date('d/m/Y h:i a', $course->time_activities_last),
354
                            $activity->module,
355
                            empty($activity->timecompleted)  ? '' : date('d/m/Y h:i a', $activity->timecompleted)
356
                        ];
357
 
358
 
359
                        foreach($extra_fields as $extra_field)
360
                        {
361
                            $value = '';
362
 
363
                            foreach($record->extras as $extra)
364
                            {
365
                                if($extra->id == $extra_field->id) {
366
                                    $value = $extra->value;
367
                                }
368
                            }
369
                            array_push($item,  $value);
370
                        }
371
 
372
                        fputcsv($fp, $item);
373
 
374
                    }
375
                }
376
            }
377
 
378
            fflush($fp);
379
            fclose($fp);
380
 
381
 
382
            $zip = new \ZipArchive();
383
            if ($zip->open($fullname_zip, \ZIPARCHIVE::CREATE) != TRUE) {
384
                $record_file->status = self::_STATUS_ERROR;
385
                $DB->update_record('local_cesa_reportes', $record_file);
386
 
387
                return false;
388
            }
389
            $zip->addFile($fullname, $filename);
390
            $zip->close();
391
 
392
            @unlink($fullname);
393
 
394
 
395
            $record_file->generate_time = $t;
396
            $record_file->status = self::_STATUS_READY;
397
            $record_file->filename = $filename_zip;
398
 
399
 
400
            $DB->update_record('local_cesa_reportes', $record_file);
401
 
402
 
403
            return true;
404
        } catch (\Exception $e) {
405
 
406
 
407
            $record_file->status = self::_STATUS_ERROR;
408
            $DB->update_record('local_cesa_reportes', $record_file);
409
 
410
            return false;
411
 
412
        }
413
    }
414
 
415
    private function todos_los_cursos($record_file)
416
    {
417
        global $DB;
418
 
419
        $filter_userids = [];
420
        $filter_courseids = [];
421
        $filter_by_company_active = false;
422
 
423
 
424
        $extra_fields = local_cesa_reportes_get_user_extra_field_names();
425
 
426
 
427
 
428
        try {
429
 
430
            $pathname = dirname(dirname(__DIR__)) . DIRECTORY_SEPARATOR . 'files';
431
            if(!file_exists($pathname)) {
432
 
433
                mkdir($pathname,0755, true);
434
            }
435
 
436
            $t = time();
437
 
438
            $filename = 'todos-los-cursos-'.date('Y-m-d-H-i').'.csv';
439
            $fullname =  $pathname . DIRECTORY_SEPARATOR .  $filename;
440
 
441
            $filename_zip = 'todos-los-cursos-'.date('Y-m-d-H-i').'.zip';
442
            $fullname_zip =  $pathname . DIRECTORY_SEPARATOR .  $filename_zip;
443
 
444
            $fp = fopen($fullname, 'w+');
445
 
446
 
447
            $fields = [
448
                'Apellido',
449
                'Nombre',
450
                'Email',
451
                'Curso',
452
                'Categoria',
453
                'Matriculación',
454
                'Fecha finalización',
455
                'Actividades asignadas',
456
                'Actividades completadas',
457
                'Progreso %',
458
                'Primera actividad',
459
                'Ultima actividad',
460
            ];
461
 
462
            foreach($extra_fields as $extra_field)
463
            {
464
                array_push($fields, $extra_field->name );
465
            }
466
 
467
            fputcsv($fp, $fields);
468
 
469
 
470
            $include_modules = false;
471
            $page = 0;
472
            $data = local_cesa_reportes_get_data_for_report_or_excel($filter_by_company_active, $filter_userids, $filter_courseids, $include_modules, $page);
473
            $records = $data['items'];
474
 
475
 
476
            foreach($records as $record)
477
            {
478
                if(!$record->courses) {
479
                    continue;
480
                }
481
 
482
                foreach($record->courses as $course)
483
                {
484
                    $item = [
485
                        $record->lastname,
486
                        $record->firstname,
487
 
488
                        $record->email,
489
                        $course->name,
490
                        $course->category,
491
                        empty($course->timeenrolled)  ? '' : date('d/m/Y h:i a', $course->timeenrolled),
492
                        empty($course->timecompleted)  ? '' : date('d/m/Y h:i a', $course->timecompleted),
493
                        $course->activities_assigned,
494
                        $course->activities_completed,
495
                        number_format($course->percentage, 2),
496
                        empty($course->time_activities_first)  ? '' : date('d/m/Y h:i a', $course->time_activities_first),
497
                        empty($course->time_activities_last)  ? '' : date('d/m/Y h:i a', $course->time_activities_last),
498
                    ];
499
 
500
                    foreach($extra_fields as $extra_field)
501
                    {
502
                        $value = '';
503
 
504
                        foreach($record->extras as $extra)
505
                        {
506
                            if($extra->id == $extra_field->id) {
507
                                $value = $extra->value;
508
                            }
509
                        }
510
                        array_push($item,  $value);
511
                    }
512
 
513
 
514
                    fputcsv($fp, $item);
515
                }
516
            }
517
 
518
            fflush($fp);
519
            fclose($fp);
520
 
521
 
522
            $zip = new \ZipArchive();
523
            if ($zip->open($fullname_zip, \ZIPARCHIVE::CREATE) != TRUE) {
524
                $record_file->status = self::_STATUS_ERROR;
525
                $DB->update_record('local_cesa_reportes', $record_file);
526
 
527
                return false;
528
            }
529
            $zip->addFile($fullname, $filename);
530
            $zip->close();
531
 
532
            @unlink($fullname);
533
 
534
 
535
 
536
            $record_file->generate_time = $t;
537
            $record_file->status = self::_STATUS_READY;
538
            $record_file->filename = $filename_zip;
539
            $DB->update_record('local_cesa_reportes', $record_file);
540
 
541
            return true;
542
 
543
        } catch (\Exception $e) {
544
            $record_file->status = self::_STATUS_ERROR;
545
            $DB->update_record('local_cesa_reportes', $record_file);
546
 
547
            return false;
548
 
549
        }
550
    }
551
 
552
    private function todos_los_cursos_de_un_usuario($record_file)
553
    {
554
        global $DB;
555
        $parameters = json_decode($record_file->parameters);
556
 
557
        $filter_userids = [$parameters->userid];
558
        $filter_courseids = [];
559
        $filter_by_company_active = true;
560
 
561
 
562
 
563
        $extra_fields = local_cesa_reportes_get_user_extra_field_names();
564
 
565
 
566
        $fields = [
567
            'Apellido',
568
            'Nombre',
569
            'Email',
570
            'Curso',
571
            'Categoria',
572
            'Matriculación',
573
            'Fecha finalización',
574
            'Actividades asignadas',
575
            'Actividades completadas',
576
            'Progreso %',
577
            'Primera actividad',
578
            'Ultima actividad',
579
        ];
580
 
581
 
582
        foreach($extra_fields as $extra_field)
583
        {
584
            array_push($fields, $extra_field->name );
585
        }
586
 
587
 
588
        $items  = [];
589
 
590
 
591
 
592
        $include_modules = false;
593
        $page = 0;
594
        $data = local_cesa_reportes_get_data_for_report_or_excel($filter_by_company_active, $filter_userids, $filter_courseids, $include_modules, $page);
595
        $records = $data['items'];
596
 
597
        foreach($records as $record)
598
        {
599
            if(!$record->courses) {
600
                continue;
601
            }
602
 
603
            foreach($record->courses as $course)
604
            {
605
                $item = [
606
                    $record->lastname,
607
                    $record->firstname,
608
                    $record->email,
609
                    $course->name,
610
                    $course->category,
611
                    empty($course->timeenrolled)  ? '' : date('d/m/Y h:i a', $course->timeenrolled),
612
                    empty($course->timecompleted)  ? '' : date('d/m/Y h:i a', $course->timecompleted),
613
                    $course->activities_assigned,
614
                    $course->activities_completed,
615
                    number_format($course->percentage, 2),
616
                    empty($course->time_activities_first)  ? '' : date('d/m/Y h:i a', $course->time_activities_first),
617
                    empty($course->time_activities_last)  ? '' : date('d/m/Y h:i a', $course->time_activities_last),
618
                ];
619
 
620
 
621
                foreach($extra_fields as $extra_field)
622
                {
623
                    $value = '';
624
 
625
                    foreach($record->extras as $extra)
626
                    {
627
                        if($extra->id == $extra_field->id) {
628
                            $value = $extra->value;
629
                        }
630
                    }
631
                    array_push($item,  $value);
632
                }
633
                array_push($items, $item);
634
            }
635
        }
636
 
637
 
638
        $letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'O', 'P', 'Q', 'R', 'S'];
639
 
640
        // (B) CREATE A NEW SPREADSHEET
641
        $spreadsheet = new Spreadsheet();
642
        $sheet = $spreadsheet->getActiveSheet();
643
 
644
 
645
 
646
        for($i = 0; $maxi = count($fields), $i < $maxi; $i++)
647
        {
648
            $letter = $letters[$i];
649
            $row    = 1;
650
            $cell   = $letter . $row;
651
            $sheet->setCellValue($cell, $fields[$i]);
652
        }
653
 
654
        for($i = 0; $maxi = count($items), $i < $maxi; $i++)
655
        {
656
            $item = $items[$i];
657
 
658
 
659
 
660
 
661
            $row  = $i + 2;
662
 
663
            for($j = 0; $maxj = count($item), $j < $maxj; $j++)
664
            {
665
 
666
                $letter = $letters[$j];
667
                $cell   = $letter . $row;
668
 
669
                $sheet->setCellValue($cell, $item[$j]);
670
            }
671
        }
672
 
673
        $pathname = dirname(dirname(__DIR__)) . DIRECTORY_SEPARATOR . 'files';
674
        if(!file_exists($pathname)) {
675
 
676
            mkdir($pathname,0755, true);
677
        }
678
 
679
        $t = time();
680
 
681
        $filename = 'todos-los-cursos-de-un-usuario-'.date('Y-m-d-H-i').'.xlsx';
682
        $fullname =  $pathname . DIRECTORY_SEPARATOR .  $filename;
683
 
684
 
685
        try {
686
            $writer = new Xlsx($spreadsheet);
687
            $writer->save($fullname);
688
 
689
            $record_file->generate_time = $t;
690
            $record_file->status = self::_STATUS_READY;
691
            $record_file->filename = $filename;
692
            $DB->update_record('local_cesa_reportes', $record_file);
693
 
694
            return true;
695
 
696
 
697
        } catch (\Exception $e) {
698
            $record_file->status = self::_STATUS_ERROR;
699
            $DB->update_record('local_cesa_reportes', $record_file);
700
 
701
            return false;
702
 
703
        }
704
    }
705
 
706
    private function todos_los_usuarios_de_un_curso($record_file)
707
    {
708
        global $DB;
709
        $parameters = json_decode($record_file->parameters);
710
 
711
 
712
        $filter_userids = [];
713
        $filter_courseids = [$parameters->courseid];
714
        $filter_by_company_active = true;
715
 
716
 
717
        $extra_fields = local_cesa_reportes_get_user_extra_field_names();
718
 
719
 
720
        $fields = [
721
            'Apellido',
722
            'Nombre',
723
            'Email',
724
            'Curso',
725
            'Categoria',
726
            'Matriculación',
727
            'Fecha finalización',
728
            'Actividades asignadas',
729
            'Actividades completadas',
730
            'Progreso %',
731
            'Primera actividad',
732
            'Ultima actividad',
733
        ];
734
 
735
 
736
        foreach($extra_fields as $extra_field)
737
        {
738
            array_push($fields, $extra_field->name );
739
        }
740
 
741
 
742
        $items  = [];
743
 
744
 
745
 
746
        $include_modules = false;
747
        $page = 0;
748
        $data = local_cesa_reportes_get_data_for_report_or_excel($filter_by_company_active, $filter_userids, $filter_courseids, $include_modules, $page);
749
        $records = $data['items'];
750
 
751
 
752
 
753
        foreach($records as $record)
754
        {
755
            if(!$record->courses) {
756
                continue;
757
            }
758
 
759
            foreach($record->courses as $course)
760
            {
761
                $item = [
762
                    $record->lastname,
763
                    $record->firstname,
764
                    $record->email,
765
                    $course->name,
766
                    $course->category,
767
                    empty($course->timeenrolled)  ? '' : date('d/m/Y h:i a', $course->timeenrolled),
768
                    empty($course->timecompleted)  ? '' : date('d/m/Y h:i a', $course->timecompleted),
769
                    $course->activities_assigned,
770
                    $course->activities_completed,
771
                    number_format($course->percentage, 2),
772
                    empty($course->time_activities_first)  ? '' : date('d/m/Y h:i a', $course->time_activities_first),
773
                    empty($course->time_activities_last)  ? '' : date('d/m/Y h:i a', $course->time_activities_last),
774
                ];
775
 
776
 
777
                foreach($extra_fields as $extra_field)
778
                {
779
                    $value = '';
780
 
781
                    foreach($record->extras as $extra)
782
                    {
783
                        if($extra->id == $extra_field->id) {
784
                            $value = $extra->value;
785
                        }
786
                    }
787
                    array_push($item,  $value);
788
                }
789
                array_push($items, $item);
790
            }
791
        }
792
 
793
 
794
        $letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'O', 'P', 'Q', 'R', 'S'];
795
 
796
        // (B) CREATE A NEW SPREADSHEET
797
        $spreadsheet = new Spreadsheet();
798
        $sheet = $spreadsheet->getActiveSheet();
799
 
800
 
801
 
802
        for($i = 0; $maxi = count($fields), $i < $maxi; $i++)
803
        {
804
            $letter = $letters[$i];
805
            $row    = 1;
806
            $cell   = $letter . $row;
807
            $sheet->setCellValue($cell, $fields[$i]);
808
        }
809
 
810
        for($i = 0; $maxi = count($items), $i < $maxi; $i++)
811
        {
812
            $item = $items[$i];
813
 
814
 
815
 
816
 
817
            $row  = $i + 2;
818
 
819
            for($j = 0; $maxj = count($item), $j < $maxj; $j++)
820
            {
821
 
822
                $letter = $letters[$j];
823
                $cell   = $letter . $row;
824
 
825
                $sheet->setCellValue($cell, $item[$j]);
826
            }
827
        }
828
 
829
        //
830
 
831
 
832
 
833
        $pathname = dirname(dirname(__DIR__)) . DIRECTORY_SEPARATOR . 'files';
834
        if(!file_exists($pathname)) {
835
 
836
            mkdir($pathname,0755, true);
837
        }
838
 
839
        $t = time();
840
 
841
        $filename = 'todos-los-usuarios-de-un-curso-'.date('Y-m-d-H-i').'.xlsx';
842
        $fullname =  $pathname . DIRECTORY_SEPARATOR .  $filename;
843
 
844
 
845
        try {
846
            $writer = new Xlsx($spreadsheet);
847
            $writer->save($fullname);
848
 
849
            $record_file->generate_time = $t;
850
            $record_file->status = self::_STATUS_READY;
851
            $record_file->filename = $filename;
852
            $DB->update_record('local_cesa_reportes', $record_file);
853
 
854
 
855
            return true;
856
 
857
 
858
        } catch (\Exception $e) {
859
            $record_file->status = self::_STATUS_ERROR;
860
            $DB->update_record('local_cesa_reportes', $record_file);
861
 
862
            return false;
863
 
864
        }
865
    }
866
 
867
 
868
    private function custom($record_file)
869
    {
870
        global $DB;
871
        $parameters = json_decode($record_file->parameters);
872
 
873
 
874
        $filter_from = $parameters->filter_from;
875
        $filter_to = $parameters->filter_to;
876
        $filter_userkeyword = $parameters->filter_userkeyword;
877
 
878
 
879
        $filter_userids = [];
880
        $filter_by_company_active = false;
881
 
882
 
883
        $dt = \DateTime::createFromFormat('Y-m-d', $filter_from);
884
        $dt->setTime(0, 0, 0);
885
        $filter_from = $dt ? $dt->getTimestamp() : strtotime('-1 Month');
886
 
887
 
888
        $dt = \DateTime::createFromFormat('Y-m-d', $filter_to);
889
        $dt->setTime(23, 59, 59);
890
        $filter_to = $dt ? $dt->getTimestamp() : time();
891
 
892
 
893
        $filter_courseids = local_cesa_reportes_get_course_with_activites_range($filter_from, $filter_to);
894
        $filter_by_company_active = true;
895
 
896
 
897
        $include_modules = false;
898
        $page = 0;
899
 
900
        $include_modules = false;
901
 
902
        try {
903
 
904
            $pathname = dirname(dirname(__DIR__)) . DIRECTORY_SEPARATOR . 'files';
905
            if(!file_exists($pathname)) {
906
 
907
                mkdir($pathname,0755, true);
908
            }
909
 
910
            $t = time();
911
 
912
            $filename = 'custom-'.date('Y-m-d-H-i').'.csv';
913
            $fullname =  $pathname . DIRECTORY_SEPARATOR .  $filename;
914
 
915
 
916
            $filename_zip = 'custom-'.date('Y-m-d-H-i').'.zip';
917
            $fullname_zip =  $pathname . DIRECTORY_SEPARATOR .  $filename_zip;
918
 
919
 
920
 
921
 
922
 
923
            $fp  = fopen($fullname, 'w+');
924
 
925
            $extra_fields = local_cesa_reportes_get_user_extra_field_names();
926
 
927
 
928
            if($include_modules) {
929
 
930
                $fields = [
931
                    'Apellido',
932
                    'Nombre',
933
                    'Email',
934
                    'Curso',
935
                    'Categoria',
936
                    'Matriculación',
937
                    'Fecha finalización',
938
                    'Actividades asignadas ',
939
                    'Actividades completadas ',
940
                    'Progreso %',
941
                    'Primera actividad',
942
                    'Ultima actividad',
943
                    'Actividad',
944
                    'Completado',
945
                    'Actividades asignadas (Curso) ',
946
                    'Actividades completadas (Curso) ',
947
                    'Progreso % (Curso) ',
948
                    'Primera actividad (Curso) ',
949
                    'Ultima actividad (Curso) ',
950
                ];
951
            } else {
952
                $fields = [
953
                    'Apellido',
954
                    'Nombre',
955
                    'Email',
956
                    'Curso',
957
                    'Categoria',
958
                    'Matriculación',
959
                    'Fecha finalización',
960
                    'Actividades asignadas ',
961
                    'Actividades completadas ',
962
                    'Progreso %',
963
                    'Primera actividad',
964
                    'Ultima actividad',
965
                    'Actividades asignadas (Curso) ',
966
                    'Actividades completadas (Curso) ',
967
                    'Progreso % (Curso) ',
968
                    'Primera actividad (Curso) ',
969
                    'Ultima actividad (Curso) ',
970
                ];
971
            }
972
 
973
 
974
            foreach($extra_fields as $extra_field)
975
            {
976
                array_push($fields, $extra_field->name);
977
            }
978
 
979
            fputcsv($fp, $fields);
980
 
981
 
982
 
983
 
984
 
985
 
986
 
987
            $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);
988
            $records = $data['items'];
989
 
990
 
991
            foreach($records as $record)
992
            {
993
                if(!$record->courses) {
994
                    continue;
995
                }
996
 
997
                foreach($record->courses as $course)
998
                {
999
                    if(isset($course->activities)) {
1000
 
1001
                        foreach($course->activities as $activity)
1002
                        {
1003
                            $item = [
1004
                                $record->lastname,
1005
                                $record->firstname,
1006
                                $record->email,
1007
                                $course->name,
1008
                                $course->category,
1009
                                empty($course->timeenrolled)  ? '' : date('d/m/Y h:i a', $course->timeenrolled),
1010
                                empty($course->timecompleted)  ? '' : date('d/m/Y h:i a', $course->timecompleted),
1011
                                $course->activities_assigned,
1012
                                $course->activities_completed,
1013
                                number_format($course->percentage, 2),
1014
                                empty($course->time_activities_first)  ? '' : date('d/m/Y h:i a', $course->time_activities_first),
1015
                                empty($course->time_activities_last)  ? '' : date('d/m/Y h:i a', $course->time_activities_last),
1016
                                $activity->module,
1017
                                empty($activity->timecompleted)  ? '' : date('d/m/Y h:i a', $activity->timecompleted),
1018
                                $course->activities_assigned_course,
1019
                                $course->activities_completed_course,
1020
                                number_format($course->percentage_course, 2),
1021
                                empty($course->time_activities_first_course)  ? '' : date('d/m/Y h:i a', $course->time_activities_first_course),
1022
                                empty($course->time_activities_last_course)  ? '' : date('d/m/Y h:i a', $course->time_activities_last_course),
1023
                           ];
1024
 
1025
 
1026
 
1027
 
1028
 
1029
 
1030
                            foreach($extra_fields as $extra_field)
1031
                            {
1032
                                $value = '';
1033
 
1034
                                foreach($record->extras as $extra)
1035
                                {
1036
                                    if($extra->id == $extra_field->id) {
1037
                                        $value = $extra->value;
1038
                                    }
1039
                                }
1040
                                array_push($item, $value);
1041
                            }
1042
 
1043
 
1044
                        }
1045
                    } else {
1046
                        $item = [
1047
                            $record->lastname,
1048
                            $record->firstname,
1049
                            $record->email,
1050
                            $course->name,
1051
                            $course->category,
1052
                            empty($course->timeenrolled)  ? '' : date('d/m/Y h:i a', $course->timeenrolled),
1053
                            empty($course->timecompleted)  ? '' : date('d/m/Y h:i a', $course->timecompleted),
1054
                            $course->activities_assigned,
1055
                            $course->activities_completed,
1056
                            number_format($course->percentage, 2),
1057
                            empty($course->time_activities_first)  ? '' : date('d/m/Y h:i a', $course->time_activities_first),
1058
                            empty($course->time_activities_last)  ? '' : date('d/m/Y h:i a', $course->time_activities_last),
1059
                            $course->activities_assigned_course,
1060
                            $course->activities_completed_course,
1061
                            number_format($course->percentage_course, 2),
1062
                            empty($course->time_activities_first_course)  ? '' : date('d/m/Y h:i a', $course->time_activities_first_course),
1063
                            empty($course->time_activities_last_course)  ? '' : date('d/m/Y h:i a', $course->time_activities_last_course),
1064
                        ];
1065
 
1066
                        foreach($extra_fields as $extra_field)
1067
                        {
1068
                            $value = '';
1069
 
1070
                            foreach($record->extras as $extra)
1071
                            {
1072
 
1073
 
1074
                                if($extra->id == $extra_field->id) {
1075
                                    $value = $extra->value;
1076
                                }
1077
                            }
1078
                            array_push($item, $value );
1079
                        }
1080
 
1081
 
1082
                    }
1083
                }
1084
 
1085
                fputcsv($fp, $item);
1086
            }
1087
 
1088
            fflush($fp);
1089
            fclose($fp);
1090
 
1091
            $zip = new \ZipArchive();
1092
            if ($zip->open($fullname_zip, \ZIPARCHIVE::CREATE) != TRUE) {
1093
                $record_file->status = self::_STATUS_ERROR;
1094
                $DB->update_record('local_cesa_reportes', $record_file);
1095
 
1096
                return false;
1097
            }
1098
            $zip->addFile($fullname, $filename);
1099
            $zip->close();
1100
 
1101
            @unlink($fullname);
1102
 
1103
 
1104
 
1105
            $record_file->generate_time = $t;
1106
            $record_file->status = self::_STATUS_READY;
1107
            $record_file->filename = $filename_zip;
1108
            $DB->update_record('local_cesa_reportes', $record_file);
1109
 
1110
 
1111
            return true;
1112
 
1113
 
1114
        } catch (\Exception $e) {
1115
            $record_file->status = self::_STATUS_ERROR;
1116
            $DB->update_record('local_cesa_reportes', $record_file);
1117
 
1118
            return false;
1119
 
1120
        }
1121
    }
1122
}