Issues (2128)

main/attendance/attendance_controller.php (1 issue)

1
<?php
2
/* For licensing terms, see /license.txt */
3
4
/**
5
 * This file contains class used like controller,
6
 * it should be included inside a dispatcher file (e.g: index.php).
7
 *
8
 * !!! WARNING !!! : ALL DATES IN THIS MODULE ARE STORED IN UTC !
9
 * DO NOT CONVERT DURING THE TRANSITION FROM CHAMILO 1.8.x TO 2.0
10
 *
11
 * @author Christian Fasanando <[email protected]>
12
 * @author Julio Montoya <[email protected]> lot of bugfixes + improvements
13
 *
14
 * @package chamilo.attendance
15
 */
16
class AttendanceController
17
{
18
    /**
19
     * Constructor.
20
     */
21
    public function __construct()
22
    {
23
        $this->toolname = 'attendance';
24
        $this->view = new View($this->toolname);
25
    }
26
27
    /**
28
     * It's used for listing attendance,
29
     * render to attendance_list view.
30
     */
31
    public function attendance_list()
32
    {
33
        // render to the view
34
        $this->view->set_data([]);
35
        $this->view->set_layout('layout');
36
        $this->view->set_template('attendance_list');
37
        $this->view->render();
38
    }
39
40
    /**
41
     * It's used for adding attendace,
42
     * render to attendance_add or attendance_list view.
43
     */
44
    public function attendance_add()
45
    {
46
        $attendance = new Attendance();
47
        $data = [];
48
        if (strtoupper($_SERVER['REQUEST_METHOD']) == 'POST') {
49
            if (!empty($_POST['title'])) {
50
                $check = Security::check_token();
51
                $attendanceId = 0;
52
                if ($check) {
53
                    $attendance->set_name($_POST['title']);
54
                    $attendance->set_description($_POST['description']);
55
                    $attendance->set_attendance_qualify_title($_POST['attendance_qualify_title']);
56
                    $attendance->set_attendance_weight($_POST['attendance_weight']);
57
                    $link_to_gradebook = false;
58
                    if (isset($_POST['attendance_qualify_gradebook']) &&
59
                        $_POST['attendance_qualify_gradebook'] == 1
60
                    ) {
61
                        $link_to_gradebook = true;
62
                    }
63
                    $attendance->category_id = isset($_POST['category_id']) ? $_POST['category_id'] : 0;
64
                    $attendanceId = $attendance->attendance_add($link_to_gradebook);
65
66
                    if ($attendanceId) {
67
                        $form = new FormValidator('attendance_add');
68
                        Skill::saveSkills($form, ITEM_TYPE_ATTENDANCE, $attendanceId);
69
                    }
70
                    Security::clear_token();
71
                }
72
                header('Location: index.php?action=calendar_add&attendance_id='.$attendanceId.'&'.api_get_cidreq());
73
                exit;
74
            } else {
75
                $data['error'] = true;
76
                $this->view->set_data($data);
77
                $this->view->set_layout('layout');
78
                $this->view->set_template('attendance_add');
79
                $this->view->render();
80
            }
81
        } else {
82
            $this->view->set_data($data);
83
            $this->view->set_layout('layout');
84
            $this->view->set_template('attendance_add');
85
            $this->view->render();
86
        }
87
    }
88
89
    /**
90
     * It's used for editing attendance,
91
     * render to attendance_edit or attendance_list view.
92
     *
93
     * @param int $attendance_id
94
     */
95
    public function attendance_edit($attendance_id)
96
    {
97
        $attendance = new Attendance();
98
        $data = [];
99
        $attendance_id = intval($attendance_id);
100
101
        if (strtoupper($_SERVER['REQUEST_METHOD']) == 'POST') {
102
            if (!empty($_POST['title'])) {
103
                $check = Security::check_token();
104
                if ($check) {
105
                    $attendance->set_name($_POST['title']);
106
                    $attendance->set_description($_POST['description']);
107
                    if (isset($_POST['attendance_qualify_title'])) {
108
                        $attendance->set_attendance_qualify_title(
109
                            $_POST['attendance_qualify_title']
110
                        );
111
                    }
112
113
                    if (isset($_POST['attendance_weight'])) {
114
                        $attendance->set_attendance_weight(
115
                            $_POST['attendance_weight']
116
                        );
117
                    }
118
119
                    $attendance->category_id = isset($_POST['category_id']) ? $_POST['category_id'] : '';
120
                    $link_to_gradebook = false;
121
                    if (isset($_POST['attendance_qualify_gradebook']) &&
122
                        $_POST['attendance_qualify_gradebook'] == 1
123
                    ) {
124
                        $link_to_gradebook = true;
125
                    }
126
                    $attendance->attendance_edit($attendance_id, $link_to_gradebook);
127
128
                    $form = new FormValidator('attendance_edit');
129
                    Skill::saveSkills($form, ITEM_TYPE_ATTENDANCE, $attendance_id);
130
                    Display::addFlash(Display::return_message(get_lang('Updated')));
131
132
                    Security::clear_token();
133
                    header('Location:index.php?action=attendance_list&'.api_get_cidreq());
134
                    exit;
135
                }
136
            } else {
137
                $data['attendance_id'] = $_POST['attendance_id'];
138
                $data['error'] = true;
139
                $this->view->set_data($data);
140
                $this->view->set_layout('layout');
141
                $this->view->set_template('attendance_edit');
142
                $this->view->render();
143
            }
144
        } else {
145
            // default values
146
            $attendance_data = $attendance->get_attendance_by_id(
147
                $attendance_id
148
            );
149
            $data['attendance_id'] = $attendance_data['id'];
150
            $data['title'] = $attendance_data['name'];
151
            $data['description'] = $attendance_data['description'];
152
            $data['attendance_qualify_title'] = $attendance_data['attendance_qualify_title'];
153
            $data['attendance_weight'] = $attendance_data['attendance_weight'];
154
155
            $this->view->set_data($data);
156
            $this->view->set_layout('layout');
157
            $this->view->set_template('attendance_edit');
158
            $this->view->render();
159
        }
160
    }
161
162
    /**
163
     * It's used for delete attendaces
164
     * render to attendance_list view.
165
     *
166
     * @param int $attendance_id
167
     *
168
     * @return bool
169
     */
170
    public function attendance_delete($attendance_id)
171
    {
172
        $allowDeleteAttendance = api_get_setting('allow_delete_attendance');
173
        if ($allowDeleteAttendance !== 'true') {
174
            $this->attendance_list();
175
176
            return false;
177
        }
178
179
        $attendance = new Attendance();
180
        if (!empty($attendance_id)) {
181
            $affected_rows = $attendance->attendance_delete($attendance_id);
182
            Skill::deleteSkillsFromItem($attendance_id, ITEM_TYPE_ATTENDANCE);
183
        }
184
185
        if ($affected_rows) {
186
            $message['message_attendance_delete'] = true;
187
        }
188
        $this->attendance_list();
189
190
        return true;
191
    }
192
193
    /**
194
     * It's used for make attendance visible
195
     * render to attendance_list view.
196
     *
197
     * @param int $attendanceId
198
     */
199
    public function attendanceSetVisible($attendanceId)
200
    {
201
        $attendance = new Attendance();
202
        $affectedRows = null;
203
        if (!empty($attendanceId)) {
204
            $affectedRows = $attendance->changeVisibility($attendanceId, 1);
205
        }
206
        if ($affectedRows) {
207
            $message['message_attendance_delete'] = true;
208
        }
209
        $this->attendance_list();
210
    }
211
212
    /**
213
     * It's used for make attendance invisible
214
     * render to attendance_list view.
215
     *
216
     * @param int $attendanceId
217
     */
218
    public function attendanceSetInvisible($attendanceId)
219
    {
220
        $attendance = new Attendance();
221
        if (!empty($attendanceId)) {
222
            $affectedRows = $attendance->changeVisibility($attendanceId, 0);
223
        }
224
        if ($affectedRows) {
225
            $message['message_attendance_delete'] = true;
226
        }
227
        $this->attendance_list();
228
    }
229
230
    /**
231
     * Restores an attendance entry and fallback to attendances rendering.
232
     *
233
     * @param int $attendance_id
234
     */
235
    public function attendance_restore($attendance_id)
236
    {
237
        $attendance = new Attendance();
238
        $affected_rows = false;
239
        if (!empty($attendance_id)) {
240
            $affected_rows = $attendance->attendance_restore($attendance_id);
241
        }
242
        if ($affected_rows) {
243
            $message['message_attendance_restore'] = true;
244
        }
245
        $this->attendance_list();
246
    }
247
248
    /**
249
     * Lock or unlock an attendance
250
     * render to attendance_list view.
251
     *
252
     * @param string $action        (lock_attendance or unlock_attendance)
253
     * @param int    $attendance_id
254
     *                              render to attendance_list view
255
     */
256
    public function lock_attendance($action, $attendance_id)
257
    {
258
        $attendance = new Attendance();
259
        $attendance_id = intval($attendance_id);
260
261
        if ($action == 'lock_attendance') {
262
            $result = $attendance->lock_attendance($attendance_id);
263
        } else {
264
            $result = $attendance->lock_attendance($attendance_id, false);
265
        }
266
        if ($result) {
267
            $message['message_locked_attendance'] = true;
268
        }
269
        $this->attendance_list();
270
    }
271
272
    public function export($id, $type = 'pdf')
273
    {
274
        $attendance = new Attendance();
275
    }
276
277
    /**
278
     * It's used for controlling attendance sheet (list, add),
279
     * render to attendance_sheet view.
280
     *
281
     * @param string $action
282
     * @param int    $attendance_id
283
     * @param int    $student_id
284
     * @param bool   $edit
285
     */
286
    public function attendance_sheet(
287
        $action,
288
        $attendance_id,
289
        $student_id = 0,
290
        $edit = true
291
    ) {
292
        $attendance = new Attendance();
293
        $data = [];
294
        $data['attendance_id'] = $attendance_id;
295
        $groupId = isset($_REQUEST['group_id']) ? $_REQUEST['group_id'] : null;
296
        $data['users_in_course'] = $attendance->get_users_rel_course($attendance_id, $groupId);
297
        $data['faults'] = [];
298
299
        $filter_type = 'today';
300
        if (!empty($_REQUEST['filter'])) {
301
            $filter_type = $_REQUEST['filter'];
302
        }
303
304
        $isDrhOfCourse = CourseManager::isUserSubscribedInCourseAsDrh(
305
            api_get_user_id(),
306
            api_get_course_info()
307
        ) || api_is_drh();
308
309
        if ($edit == true) {
310
            if (api_is_allowed_to_edit(null, true) || $isDrhOfCourse) {
311
                $data['users_presence'] = $attendance->get_users_attendance_sheet(
312
                    $attendance_id,
313
                    0,
314
                    $groupId
315
                );
316
            }
317
        } else {
318
            if (!empty($student_id)) {
319
                $user_id = intval($student_id);
320
            } else {
321
                $user_id = api_get_user_id();
322
            }
323
324
            if (api_is_allowed_to_edit(null, true) ||
325
                api_is_coach(api_get_session_id(), api_get_course_int_id()) ||
326
                $isDrhOfCourse
327
            ) {
328
                $data['users_presence'] = $attendance->get_users_attendance_sheet(
329
                    $attendance_id,
330
                    0,
331
                    $groupId
332
                );
333
            } else {
334
                $data['users_presence'] = $attendance->get_users_attendance_sheet(
335
                    $attendance_id,
336
                    $user_id,
337
                    $groupId
338
                );
339
            }
340
341
            $data['faults'] = $attendance->get_faults_of_user($user_id, $attendance_id, $groupId);
342
            $data['user_id'] = $user_id;
343
        }
344
345
        $data['next_attendance_calendar_id'] = $attendance->get_next_attendance_calendar_id(
346
            $attendance_id
347
        );
348
        $data['next_attendance_calendar_datetime'] = $attendance->getNextAttendanceCalendarDatetime(
349
            $attendance_id
350
        );
351
352
        if (strtoupper($_SERVER['REQUEST_METHOD']) == 'POST') {
353
            $check = Security::check_token();
354
            if ($check) {
355
                if (isset($_POST['hidden_input'])) {
356
                    foreach ($_POST['hidden_input'] as $cal_id) {
357
                        $users_present = [];
358
                        if (isset($_POST['check_presence'][$cal_id])) {
359
                            $users_present = $_POST['check_presence'][$cal_id];
360
                        }
361
                        $attendance->attendance_sheet_add(
362
                            $cal_id,
363
                            $users_present,
364
                            $attendance_id
365
                        );
366
                    }
367
                }
368
                Security::clear_token();
369
            }
370
            $data['users_in_course'] = $attendance->get_users_rel_course($attendance_id, $groupId);
371
            $my_calendar_id = null;
372
            if (is_numeric($filter_type)) {
373
                $my_calendar_id = $filter_type;
374
                $filter_type = 'calendar_id';
375
            }
376
            $data['attendant_calendar'] = $attendance->get_attendance_calendar(
377
                $attendance_id,
378
                $filter_type,
379
                $my_calendar_id,
380
                $groupId
381
            );
382
            $data['attendant_calendar_all'] = $attendance->get_attendance_calendar(
383
                $attendance_id,
384
                'all',
385
                null,
386
                $groupId
387
            );
388
            $data['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id, 0, $groupId);
389
            $data['next_attendance_calendar_id'] = $attendance->get_next_attendance_calendar_id($attendance_id);
390
            $data['next_attendance_calendar_datetime'] = $attendance->getNextAttendanceCalendarDatetime($attendance_id);
391
        } else {
392
            $data['attendant_calendar_all'] = $attendance->get_attendance_calendar(
393
                $attendance_id,
394
                'all',
395
                null,
396
                $groupId
397
            );
398
            $data['attendant_calendar'] = $attendance->get_attendance_calendar(
399
                $attendance_id,
400
                $filter_type,
401
                null,
402
                $groupId
403
            );
404
        }
405
406
        $attendanceInfo = $attendance->get_attendance_by_id($attendance_id);
407
408
        $allowSignature = api_get_configuration_value('enable_sign_attendance_sheet');
409
        $allowComment = api_get_configuration_value('attendance_allow_comments');
410
        $func = isset($_REQUEST['func']) ? $_REQUEST['func'] : null;
411
        $calendarId = isset($_REQUEST['calendar_id']) ? (int) $_REQUEST['calendar_id'] : null;
412
        $fullScreen = ($func == 'fullscreen' && $calendarId > 0 && $allowSignature);
413
414
        $data['edit_table'] = intval($edit);
415
        $data['is_locked_attendance'] = $attendance->is_locked_attendance($attendance_id);
416
        $data['allowSignature'] = $allowSignature;
417
        $data['allowComment'] = $allowComment;
418
        $data['fullScreen'] = $fullScreen;
419
        $data['attendanceName'] = $attendanceInfo['name'];
420
421
        if ($fullScreen) {
422
            if (api_is_allowed_to_edit()) {
423
                $uinfo = api_get_user_info();
424
                $cinfo = api_get_course_info();
425
                $data['calendarId'] = $calendarId;
426
                $data['trainer'] = api_get_person_name($uinfo['firstname'], $uinfo['lastname']);
427
                $data['courseName'] = $cinfo['title'];
428
                $attendanceCalendar = $attendance->get_attendance_calendar(
429
                    $attendance_id,
430
                    'calendar_id',
431
                    $calendarId,
432
                    $groupId
433
                );
434
                $data['attendanceCalendar'] = $attendanceCalendar[0];
435
                $this->view->set_template('attendance_sheet_fullscreen');
436
            }
437
        } else {
438
            $this->view->set_template('attendance_sheet');
439
        }
440
441
        $this->view->set_data($data);
442
        $this->view->set_layout('layout');
443
        $this->view->render();
444
    }
445
446
    /**
447
     * It's used for controlling attendance calendar (list, add, edit, delete),
448
     * render to attendance_calendar view.
449
     *
450
     * @param string $action        (optional, by default 'calendar_list')
451
     * @param int    $attendance_id (optional)
452
     * @param int    $calendar_id   (optional)
453
     */
454
    public function attendance_calendar($action = 'calendar_list', $attendance_id = 0, $calendar_id = 0)
455
    {
456
        $attendance = new Attendance();
457
        $calendar_id = intval($calendar_id);
458
        $data = [];
459
        $data['attendance_id'] = $attendance_id;
460
        $attendance_id = intval($attendance_id);
461
        $groupList = isset($_POST['groups']) ? [$_POST['groups']] : [];
462
463
        if ($action == 'calendar_add') {
464
            if (strtoupper($_SERVER['REQUEST_METHOD']) == "POST") {
465
                if (!isset($_POST['cancel'])) {
466
                    if (isset($_POST['repeat'])) {
467
                        //@todo  check this error_logs
468
                        $start_datetime = api_strtotime(
469
                            api_get_utc_datetime($_POST['date_time']),
470
                            'UTC'
471
                        );
472
473
                        $end_datetime = api_strtotime(api_get_utc_datetime($_POST['end_date_time'].' 23:59:59'), 'UTC');
474
                        $checkdate = api_is_valid_date(api_get_utc_datetime($_POST['end_date_time'].' 23:59:59'));
475
476
                        $repeat_type = $_POST['repeat_type'];
477
                        if (($end_datetime > $start_datetime) && $checkdate) {
478
                            $attendance->attendance_repeat_calendar_add(
479
                                $attendance_id,
480
                                $start_datetime,
481
                                $end_datetime,
482
                                $repeat_type,
483
                                $groupList,
484
                                $_POST
485
                            );
486
                            $action = 'calendar_list';
487
                        } else {
488
                            if (!$checkdate) {
489
                                $data['error_checkdate'] = true;
490
                            } else {
491
                                $data['error_repeat_date'] = true;
492
                            }
493
                            $data['repeat'] = true;
494
                            $action = 'calendar_add';
495
                        }
496
                    } else {
497
                        $datetime = $_POST['date_time'];
498
                        $datetimezone = api_get_utc_datetime($datetime);
499
                        if (!empty($datetime)) {
500
                            $attendance->set_date_time($datetimezone);
501
                            $attendance->attendance_calendar_add($attendance_id, $groupList);
502
                            $action = 'calendar_list';
503
                        } else {
504
                            $data['error_date'] = true;
505
                            $action = 'calendar_add';
506
                        }
507
                    }
508
                } else {
509
                    $action = 'calendar_list';
510
                }
511
            }
512
        } elseif ($action === 'calendar_edit') {
513
            $data['calendar_id'] = $calendar_id;
514
            if (strtoupper($_SERVER['REQUEST_METHOD']) == "POST") {
515
                if (!isset($_POST['cancel'])) {
516
                    $datetime = $_POST['date_time'];
517
                    $datetimezone = api_get_utc_datetime($datetime);
518
                    $attendance->set_date_time($datetimezone);
519
                    $attendance->attendance_calendar_edit($calendar_id, $attendance_id, $_POST);
520
                    $data['calendar_id'] = 0;
521
                    $action = 'calendar_list';
522
                } else {
523
                    $action = 'calendar_list';
524
                }
525
            }
526
        } elseif ($action == 'calendar_delete') {
527
            $attendance->attendance_calendar_delete($calendar_id, $attendance_id);
528
            $action = 'calendar_list';
529
        } elseif ($action == 'calendar_all_delete') {
530
            $attendance->attendance_calendar_delete(0, $attendance_id, true);
531
            $action = 'calendar_list';
532
        }
533
534
        $data['action'] = $action;
535
        $data['attendance_calendar'] = $attendance->get_attendance_calendar(
536
            $attendance_id,
537
            'all',
538
            null,
539
            null,
540
            true
541
        );
542
        $data['is_locked_attendance'] = $attendance->is_locked_attendance($attendance_id);
543
        // render to the view
544
        $this->view->set_data($data);
545
        $this->view->set_layout('layout');
546
        $this->view->set_template('attendance_calendar');
547
        $this->view->render();
548
    }
549
550
    /**
551
     * Checks the attendance sheet to export XLS.
552
     */
553
    public function attendanceSheetExportToXls(
554
        int $attendanceId,
555
        int $studentId = 0,
556
        string $courseCode = '',
557
        ?int $groupId,
558
        ?string $filter
559
    ) {
560
        $attendance = new Attendance();
561
        $courseInfo = api_get_course_info($courseCode);
562
        $attendance->set_course_id($courseInfo['code']);
563
564
        $filterType = 'today';
565
        if (!empty($filter)) {
566
            $filterType = $filter;
567
        }
568
569
        $myCalendarId = null;
570
        if (is_numeric($filterType)) {
571
            $myCalendarId = $filterType;
572
            $filterType = 'calendar_id';
573
        }
574
575
        $attendance->exportAttendanceSheetToXls(
576
            $attendanceId,
577
            $studentId,
578
            $courseCode,
579
            $groupId,
580
            $filterType,
581
            $myCalendarId
582
        );
583
    }
584
585
    /**
586
     * It's used to print attendance sheet.
587
     *
588
     * @param string $action
589
     * @param int    $attendance_id
590
     */
591
    public function attendance_sheet_export_to_pdf(
592
        $action,
593
        $attendance_id,
594
        $student_id = 0,
595
        $course_id = ''
596
    ) {
597
        $attendance = new Attendance();
598
        $courseInfo = api_get_course_info($course_id);
599
        $attendance->set_course_id($courseInfo['code']);
600
        $groupId = isset($_REQUEST['group_id']) ? $_REQUEST['group_id'] : null;
601
        $data_array = [];
602
        $data_array['attendance_id'] = $attendance_id;
603
        $data_array['users_in_course'] = $attendance->get_users_rel_course($attendance_id, $groupId);
604
605
        $filter_type = 'today';
606
607
        if (!empty($_REQUEST['filter'])) {
608
            $filter_type = $_REQUEST['filter'];
609
        }
610
611
        $my_calendar_id = null;
612
        if (is_numeric($filter_type)) {
613
            $my_calendar_id = $filter_type;
614
            $filter_type = 'calendar_id';
615
        }
616
617
        $data_array['attendant_calendar'] = $attendance->get_attendance_calendar(
618
            $attendance_id,
619
            $filter_type,
620
            $my_calendar_id,
621
            $groupId
622
        );
623
624
        if (api_is_allowed_to_edit(null, true) || api_is_drh()) {
625
            $data_array['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id, 0, $groupId);
626
        } else {
627
            if (!empty($student_id)) {
628
                $user_id = intval($student_id);
629
            } else {
630
                $user_id = api_get_user_id();
631
            }
632
            $data_array['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id, $user_id, $groupId);
633
            $data_array['faults'] = $attendance->get_faults_of_user($user_id, $attendance_id, $groupId);
634
            $data_array['user_id'] = $user_id;
635
        }
636
637
        $data_array['next_attendance_calendar_id'] = $attendance->get_next_attendance_calendar_id($attendance_id);
638
639
        // Set headers pdf.
640
        $courseCategory = CourseManager::get_course_category($courseInfo['categoryCode']);
641
        $teacherInfo = CourseManager::get_teacher_list_from_course_code($courseInfo['code']);
642
        $teacherName = null;
643
        foreach ($teacherInfo as $teacherData) {
644
            if ($teacherName != null) {
645
                $teacherName = $teacherName." / ";
646
            }
647
            $teacherName .= api_get_person_name($teacherData['firstname'], $teacherData['lastname']);
648
        }
649
650
        // Get data table
651
        $data_table = [];
652
        $head_table = ['#', get_lang('Name')];
653
        foreach ($data_array['attendant_calendar'] as $class_day) {
654
            $labelDuration = !empty($class_day['duration']) ? get_lang('Duration').' : '.$class_day['duration'] : '';
655
            $head_table[] =
656
                api_format_date($class_day['date_time'], DATE_FORMAT_NUMBER_NO_YEAR).' '.
657
                api_format_date($class_day['date_time'], TIME_NO_SEC_FORMAT).' '.
658
                $labelDuration;
659
        }
660
        $data_table[] = $head_table;
661
        $data_attendant_calendar = $data_array['attendant_calendar'];
662
        $data_users_presence = $data_array['users_presence'];
663
        $count = 1;
664
665
        if (!empty($data_array['users_in_course'])) {
666
            foreach ($data_array['users_in_course'] as $user) {
667
                $cols = 1;
668
                $result = [];
669
                $result['count'] = $count;
670
                $result['full_name'] = api_get_person_name($user['firstname'], $user['lastname']);
671
                foreach ($data_array['attendant_calendar'] as $class_day) {
672
                    if ($class_day['done_attendance'] == 1) {
673
                        if ($data_users_presence[$user['user_id']][$class_day['id']]['presence'] == 1) {
674
                            $result[$class_day['id']] = get_lang('UserAttendedSymbol');
675
                        } else {
676
                            $result[$class_day['id']] = '<span style="color:red">'.get_lang('UserNotAttendedSymbol').'</span>';
677
                        }
678
                    } else {
679
                        $result[$class_day['id']] = ' ';
680
                    }
681
                    $cols++;
682
                }
683
                $count++;
684
                $data_table[] = $result;
685
            }
686
        }
687
        $max_cols_per_page = 12; //10 dates + 2 name and number
688
        $max_dates_per_page = $max_dates_per_page_original = $max_cols_per_page - 2; //10
689
        $rows = count($data_table);
690
691
        if ($cols > $max_cols_per_page) {
692
            $number_tables = round(($cols - 2) / $max_dates_per_page);
693
            $headers = $data_table[0];
694
            $all = [];
695
            $tables = [];
696
            $changed = 1;
697
698
            for ($i = 0; $i <= $rows; $i++) {
699
                $row = isset($data_table[$i]) ? $data_table[$i] : null;
700
                $key = 1;
701
                $max_dates_per_page = 10;
702
                $item = isset($data_table[$i]) ? $data_table[$i] : null;
703
                $count_j = 0;
704
705
                if (!empty($item)) {
706
                    foreach ($item as $value) {
707
                        if ($count_j >= $max_dates_per_page) {
708
                            $key++;
709
                            $max_dates_per_page = $max_dates_per_page_original * $key;
710
                            //magic hack
711
                            $tables[$key][$i][] = $tables[1][$i][0];
712
                            $tables[$key][$i][] = $tables[1][$i][1];
713
                        }
714
                        $tables[$key][$i][] = $value;
715
                        $count_j++;
716
                    }
717
                }
718
            }
719
720
            $content = null;
721
            if (!empty($tables)) {
722
                foreach ($tables as $sub_table) {
723
                    $content .= Export::convert_array_to_html($sub_table).'<br /><br />';
724
                }
725
            }
726
        } else {
727
            $content = Export::convert_array_to_html(
728
                $data_table,
729
                ['header_attributes' => ['align' => 'center']]
730
            );
731
        }
732
733
        $params = [
734
            'filename' => get_lang('Attendance').'-'.api_get_local_time(),
735
            'pdf_title' => $courseInfo['title'],
736
            'course_code' => $courseInfo['code'],
737
            'add_signatures' => ['Drh', 'Teacher', 'Date'],
738
            'orientation' => 'landscape',
739
            'pdf_teachers' => $teacherName,
740
            'pdf_course_category' => $courseCategory['name'],
741
            'format' => 'A4-L',
742
            'orientation' => 'L',
743
        ];
744
745
        Export::export_html_to_pdf($content, $params);
746
        exit;
0 ignored issues
show
Using exit here is not recommended.

In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.

Loading history...
747
    }
748
749
    /**
750
     * Gets attendance base in the table:
751
     * TABLE_STATISTIC_TRACK_E_COURSE_ACCESS.
752
     *
753
     * @param bool $showForm
754
     * @param bool $exportToPdf
755
     */
756
    public function getAttendanceBaseInLogin($showForm = false, $exportToPdf = true)
757
    {
758
        $table = null;
759
        $formToDisplay = null;
760
        $startDate = null;
761
        $endDate = null;
762
763
        $sessionId = api_get_session_id();
764
        if ($showForm) {
765
            $form = new FormValidator(
766
                'search',
767
                'post',
768
                api_get_self().'?'.api_get_cidreq().'&action=calendar_logins'
769
            );
770
            $form->addDateRangePicker('range', get_lang('DateRange'));
771
            $form->addButton('submit', get_lang('Submit'));
772
773
            if ($form->validate()) {
774
                $values = $form->getSubmitValues();
775
776
                $startDate = api_get_utc_datetime($values['range_start']);
777
                $endDate = api_get_utc_datetime($values['range_end']);
778
            }
779
            $formToDisplay = $form->returnForm();
780
        } else {
781
            if (!empty($sessionId)) {
782
                $sessionInfo = api_get_session_info($sessionId);
783
                $startDate = $sessionInfo['access_start_date'];
784
                $endDate = $sessionInfo['access_end_date'];
785
            }
786
        }
787
788
        $attendance = new Attendance();
789
        if ($exportToPdf) {
790
            $result = $attendance->exportAttendanceLogin($startDate, $endDate);
791
            if (empty($result)) {
792
                api_not_allowed(true, get_lang('NoDataAvailable'));
793
            }
794
        }
795
        $table = $attendance->getAttendanceLoginTable($startDate, $endDate);
796
        $data = [
797
            'form' => $formToDisplay,
798
            'table' => $table,
799
        ];
800
        $this->view->set_data($data);
801
        $this->view->set_layout('layout');
802
        $this->view->set_template('calendar_logins');
803
        $this->view->render();
804
    }
805
}
806