CourseLegalPlugin::removePreviousAgreements()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 6
nc 1
nop 2
dl 0
loc 8
rs 10
c 0
b 0
f 0
1
<?php
2
3
/* For licensing terms, see /license.txt */
4
5
/**
6
 * Class CourseLegalPlugin.
7
 */
8
class CourseLegalPlugin extends Plugin
9
{
10
    public $isCoursePlugin = true;
11
12
    // When creating a new course this settings are added to the course
13
    public $course_settings = [
14
        [
15
            'name' => 'courselegal',
16
            'type' => 'text',
17
        ],
18
    ];
19
20
    protected function __construct()
21
    {
22
        parent::__construct(
23
            '0.1',
24
            'Julio Montoya',
25
            [
26
            ]
27
        );
28
    }
29
30
    /**
31
     * @return CourseLegalPlugin
32
     */
33
    public static function create()
34
    {
35
        static $result = null;
36
37
        return $result ?: $result = new self();
38
    }
39
40
    /**
41
     * @return string
42
     */
43
    public function getTeacherLink()
44
    {
45
        $link = null;
46
        if (api_is_allowed_to_edit()) {
47
            $url = api_get_path(WEB_PLUGIN_PATH).'CourseLegal/start.php?'.api_get_cidreq();
48
            $link = Display::url(
49
                $this->get_lang('CourseLegal'),
50
                $url,
51
                ['class' => 'btn']
52
            );
53
        }
54
55
        return $link;
56
    }
57
58
    /**
59
     * @param int $userId
60
     * @param int $courseId
61
     * @param int $sessionId
62
     *
63
     * @return array
64
     */
65
    public function getUserAcceptedLegal($userId, $courseId, $sessionId)
66
    {
67
        $userId = (int) $userId;
68
        $courseId = (int) $courseId;
69
        $sessionId = (int) $sessionId;
70
71
        $table = Database::get_main_table('session_rel_course_rel_user_legal');
72
        $sql = "SELECT *
73
                FROM $table
74
                WHERE user_id = $userId AND c_id = $courseId AND session_id = $sessionId";
75
        $result = Database::query($sql);
76
        $data = [];
77
        if (Database::num_rows($result) > 0) {
78
            $data = Database::fetch_assoc($result);
79
        }
80
81
        return $data;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $data also could return the type boolean which is incompatible with the documented return type array.
Loading history...
82
    }
83
84
    /**
85
     * @param int    $userId
86
     * @param string $courseCode
87
     * @param int    $sessionId
88
     *
89
     * @return bool
90
     */
91
    public function isUserAcceptedLegal($userId, $courseCode, $sessionId)
92
    {
93
        $courseInfo = api_get_course_info($courseCode);
94
        $courseId = $courseInfo['real_id'];
95
        $result = $this->getUserAcceptedLegal($userId, $courseId, $sessionId);
96
97
        if (!empty($result)) {
98
            if (1 == $result['mail_agreement'] &&
99
                1 == $result['web_agreement']
100
            ) {
101
                return true;
102
            }
103
        }
104
105
        return false;
106
    }
107
108
    /**
109
     * @param int  $userId
110
     * @param int  $courseCode
111
     * @param int  $sessionId
112
     * @param bool $sendEmail  Optional. Indicate whether the mail must be sent. Default is true
113
     */
114
    public function saveUserLegal($userId, $courseCode, $sessionId, $sendEmail = true)
115
    {
116
        $courseInfo = api_get_course_info($courseCode);
117
        $courseId = $courseInfo['real_id'];
118
        $data = $this->getUserAcceptedLegal($userId, $courseId, $sessionId);
119
120
        $id = false;
121
        if (empty($data)) {
122
            $table = Database::get_main_table(
123
                'session_rel_course_rel_user_legal'
124
            );
125
            $uniqueId = api_get_unique_id();
126
            $values = [
127
                'user_id' => $userId,
128
                'c_id' => $courseId,
129
                'session_id' => $sessionId,
130
                'web_agreement' => 1,
131
                'web_agreement_date' => api_get_utc_datetime(),
132
                'mail_agreement_link' => $uniqueId,
133
            ];
134
            $id = Database::insert($table, $values);
135
136
            if ($sendEmail) {
137
                $this->sendMailLink($uniqueId, $userId, $courseId, $sessionId);
138
            }
139
        }
140
141
        return $id;
142
    }
143
144
    /**
145
     * @param int $userId
146
     * @param int $courseId
147
     * @param int $sessionId
148
     */
149
    public function updateMailAgreementLink($userId, $courseId, $sessionId)
150
    {
151
        $data = $this->getUserAcceptedLegal($userId, $courseId, $sessionId);
152
        if (!empty($data)) {
153
            $table = Database::get_main_table(
154
                'session_rel_course_rel_user_legal'
155
            );
156
            $uniqueId = api_get_unique_id();
157
            Database::update(
158
                $table,
159
                ['mail_agreement_link' => $uniqueId],
160
                ['id = ? ' => [$data['id']]]
161
            );
162
            $this->sendMailLink($uniqueId, $userId, $courseId, $sessionId);
163
        }
164
    }
165
166
    /**
167
     * @param int $userId
168
     * @param int $courseId
169
     * @param int $sessionId
170
     */
171
    public function deleteUserAgreement($userId, $courseId, $sessionId)
172
    {
173
        $data = $this->getUserAcceptedLegal($userId, $courseId, $sessionId);
174
        if (!empty($data)) {
175
            $table = Database::get_main_table(
176
                'session_rel_course_rel_user_legal'
177
            );
178
            Database::delete(
179
                $table,
180
                ['id = ? ' => [$data['id']]]
181
            );
182
        }
183
    }
184
185
    /**
186
     * @param string $uniqueId
187
     * @param int    $userId
188
     * @param int    $courseId
189
     * @param int    $sessionId
190
     */
191
    public function sendMailLink($uniqueId, $userId, $courseId, $sessionId)
192
    {
193
        $courseInfo = api_get_course_info_by_id($courseId);
194
        $courseCode = $courseInfo['code'];
195
196
        $url = api_get_path(WEB_CODE_PATH).'course_info/legal.php?web_agreement_link='.$uniqueId.'&course_code='.Security::remove_XSS($courseCode).'&session_id='.$sessionId;
197
        $courseUrl = Display::url($url, $url);
198
        $sessionInfo = api_get_session_info($sessionId);
199
        $sesstionTitle = null;
200
201
        if (!empty($sessionInfo)) {
202
            $sesstionTitle = ' ('.$sessionInfo['title'].')';
203
        }
204
205
        $courseTitle = $courseInfo['title'].$sesstionTitle;
206
207
        $subject = $this->get_lang('MailAgreement');
208
        $message = sprintf($this->get_lang('MailAgreementWasSentWithClickX'), $courseTitle, $courseUrl);
209
        MessageManager::send_message_simple($userId, $subject, $message);
210
    }
211
212
    /**
213
     * @param string $link
214
     * @param int    $userId
215
     * @param int    $courseId
216
     * @param int    $sessionId
217
     *
218
     * @return bool
219
     */
220
    public function saveUserMailLegal($link, $userId, $courseId, $sessionId)
221
    {
222
        $data = $this->getUserAcceptedLegal($userId, $courseId, $sessionId);
223
224
        if (empty($data)) {
225
            return null;
226
        }
227
228
        if ($data['mail_agreement_link'] == $link) {
229
            $table = Database::get_main_table('session_rel_course_rel_user_legal');
230
            $id = $data['id'];
231
            $values = [
232
                'mail_agreement' => 1,
233
                'mail_agreement_date' => api_get_utc_datetime(),
234
            ];
235
            Database::update($table, $values, ['id = ?' => [$id]]);
236
        }
237
    }
238
239
    /**
240
     * @param int    $courseId
241
     * @param int    $sessionId
242
     * @param string $filePath
243
     */
244
    public function warnUsersByEmail($courseId, $sessionId, $filePath = null)
245
    {
246
        $courseInfo = api_get_course_info_by_id($courseId);
247
        $courseCode = $courseInfo['code'];
248
249
        if (empty($sessionId)) {
250
            $students = CourseManager::get_student_list_from_course_code($courseCode, false);
251
        } else {
252
            $students = CourseManager::get_student_list_from_course_code($courseCode, true, $sessionId);
253
        }
254
255
        $url = api_get_course_url($courseId, $sessionId);
256
        $url = Display::url($url, $url);
257
258
        $subject = $this->get_lang('AgreementUpdated');
259
        $message = sprintf($this->get_lang('AgreementWasUpdatedClickHere'), $url);
260
261
        $dataFile = [];
262
        if (!empty($filePath)) {
263
            $dataFile = [
264
                'path' => $filePath,
265
                'filename' => basename($filePath),
266
            ];
267
            $message = sprintf($this->get_lang('AgreementWasUpdatedClickHere'), $url)." \n";
268
            $message .= $this->get_lang('TheAgreementIsAttachedInThisEmail');
269
        }
270
271
        if (!empty($students)) {
272
            foreach ($students as $student) {
273
                $userInfo = api_get_user_info($student['user_id']);
274
                api_mail_html(
275
                    $userInfo['complete_name'],
276
                    $userInfo['email'],
277
                    $subject,
278
                    $message,
279
                    null,
280
                    null,
281
                    [],
282
                    $dataFile
283
                );
284
                //MessageManager::send_message_simple($student['user_id'], $subject, $message);
285
            }
286
        }
287
    }
288
289
    /**
290
     * @param int    $courseId
291
     * @param int    $sessionId
292
     * @param string $order
293
     *
294
     * @return array
295
     */
296
    public function getUserAgreementList($courseId, $sessionId, $order = null)
297
    {
298
        $courseId = (int) $courseId;
299
        $sessionId = (int) $sessionId;
300
301
        $table = Database::get_main_table('session_rel_course_rel_user_legal');
302
        $userTable = Database::get_main_table(TABLE_MAIN_USER);
303
        $sql = "SELECT *
304
                FROM $table s INNER JOIN $userTable u
305
                ON u.id = s.user_id
306
                WHERE c_id = $courseId AND session_id = $sessionId ";
307
308
        if (!empty($order)) {
309
            $sql .= $order;
310
        }
311
        $result = Database::query($sql);
312
        $data = [];
313
        if (Database::num_rows($result) > 0) {
314
            $data = Database::store_result($result, 'ASSOC');
315
        }
316
317
        return $data;
318
    }
319
320
    /**
321
     * @param int $courseId
322
     * @param int $sessionId
323
     */
324
    public function removePreviousAgreements($courseId, $sessionId)
325
    {
326
        $table = Database::get_main_table('session_rel_course_rel_user_legal');
327
        $sessionId = (int) $sessionId;
328
        $courseId = (int) $courseId;
329
        $sql = "DELETE FROM $table
330
                WHERE c_id = '$courseId' AND session_id = $sessionId ";
331
        Database::query($sql);
332
    }
333
334
    /**
335
     * @param array $values
336
     * @param array $file       $_FILES['uploaded_file']
337
     * @param bool  $deleteFile
338
     */
339
    public function save($values, $file = [], $deleteFile = false)
340
    {
341
        $table = Database::get_main_table('session_rel_course_legal');
342
343
        $courseId = $values['c_id'];
344
        $sessionId = $values['session_id'];
345
346
        $conditions = [
347
            'c_id' => $courseId,
348
            'session_id' => $sessionId,
349
        ];
350
351
        $course = api_get_course_info_by_id($courseId);
352
353
        $legalData = $this->getData($courseId, $sessionId);
354
        $coursePath = api_get_path(SYS_COURSE_PATH).$course['directory'].'/CourseLegal';
0 ignored issues
show
Bug introduced by
The constant SYS_COURSE_PATH was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
355
        $uploadResult = $coursePath.'/'.$legalData['filename'];
356
357
        if (!is_dir($coursePath)) {
358
            mkdir($coursePath, api_get_permissions_for_new_directories());
359
        }
360
        $uploadOk = process_uploaded_file($file, false);
361
        $fileName = null;
362
363
        if ($uploadOk) {
364
            $uploadResult = null;
365
            /*$uploadResult = handle_uploaded_document(
366
                $course,
367
                $file,
368
                $coursePath,
369
                '/',
370
                api_get_user_id(),
371
                api_get_group_id(),
372
                null,
373
                false,
374
                false,
375
                false,
376
                true
377
            );*/
378
379
            if ($uploadResult) {
0 ignored issues
show
introduced by
$uploadResult is of type null, thus it always evaluated to false.
Loading history...
380
                $fileName = basename($uploadResult);
381
                // Delete old one if exists.
382
                if ($legalData) {
383
                    if (!empty($legalData['filename'])) {
384
                        $fileToDelete = $coursePath.'/'.$legalData['filename'];
385
                        if (file_exists($fileToDelete)) {
386
                            unlink($fileToDelete);
387
                        }
388
                    }
389
                }
390
            }
391
        }
392
393
        $conditions['content'] = $values['content'];
394
        $conditions['filename'] = $fileName;
395
396
        if (empty($legalData)) {
397
            $id = Database::insert($table, $conditions);
398
        } else {
399
            $id = $legalData['id'];
400
401
            $updateParams = [
402
                'content' => $values['content'],
403
            ];
404
405
            if (!empty($fileName)) {
406
                $updateParams['filename'] = $fileName;
407
            }
408
409
            Database::update(
410
                $table,
411
                $updateParams,
412
                ['id = ? ' => $id]
413
            );
414
        }
415
416
        if ($deleteFile) {
417
            Database::update(
418
                $table,
419
                ['filename' => ''],
420
                ['id = ? ' => $id]
421
            );
422
            if (!empty($legalData['filename'])) {
423
                $fileToDelete = $coursePath.'/'.$legalData['filename'];
424
                if (file_exists($fileToDelete)) {
425
                    unlink($fileToDelete);
426
                }
427
            }
428
        }
429
430
        if (isset($values['remove_previous_agreements']) &&
431
            !empty($values['remove_previous_agreements'])
432
        ) {
433
            $this->removePreviousAgreements($courseId, $sessionId);
434
        }
435
436
        $warnUsers = isset($values['warn_users_by_email']) ? $values['warn_users_by_email'] : null;
437
438
        switch ($warnUsers) {
439
            case '1':
440
                // Nothing
441
                break;
442
            case '2':
443
                // Send mail
444
                $this->warnUsersByEmail($courseId, $sessionId);
445
446
                break;
447
            case '3':
448
                // Send mail + attachment if exists.
449
                if (!empty($legalData['filename'])) {
450
                    $this->warnUsersByEmail(
451
                        $courseId,
452
                        $sessionId,
453
                        $uploadResult
454
                    );
455
                }
456
457
                break;
458
        }
459
    }
460
461
    /**
462
     * @param int $courseId
463
     * @param int $sessionId
464
     *
465
     * @return array|mixed
466
     */
467
    public function getData($courseId, $sessionId)
468
    {
469
        $table = Database::get_main_table('session_rel_course_legal');
470
        $conditions = [
471
            'c_id  = ? AND session_id = ? ' => [
472
                $courseId,
473
                $sessionId,
474
            ],
475
        ];
476
477
        $result = Database::select('*', $table, ['where' => $conditions]);
478
479
        return isset($result) && !empty($result) ? current($result) : [];
480
    }
481
482
    /**
483
     * @param int $courseId
484
     * @param int $sessionId
485
     *
486
     * @return string
487
     */
488
    public function getCurrentFile($courseId, $sessionId)
489
    {
490
        $data = $this->getData($courseId, $sessionId);
491
492
        if (isset($data['filename']) && !empty($data['filename'])) {
493
            $course = api_get_course_info_by_id($courseId);
494
495
            $coursePath = api_get_path(SYS_COURSE_PATH).$course['directory'].'/CourseLegal';
0 ignored issues
show
Bug introduced by
The constant SYS_COURSE_PATH was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
496
            $file = $coursePath.'/'.$data['filename'];
497
498
            if (file_exists($file)) {
499
                return Display::url(
500
                    $data['filename'],
501
                    api_get_path(WEB_COURSE_PATH).$course['directory'].'/CourseLegal/'.$data['filename'],
502
                    ['target' => '_blank']
503
                );
504
            }
505
        }
506
    }
507
508
    public function install()
509
    {
510
        $table = Database::get_main_table('session_rel_course_legal');
511
        $sql = "CREATE TABLE IF NOT EXISTS $table (
512
                    id int PRIMARY KEY AUTO_INCREMENT,
513
                    c_id int,
514
                    session_id int,
515
                    content text,
516
                    filename varchar(255)
517
                )";
518
        Database::query($sql);
519
520
        $table = Database::get_main_table('session_rel_course_rel_user_legal');
521
522
        $sql = "CREATE TABLE IF NOT EXISTS $table (
523
                    id int PRIMARY KEY AUTO_INCREMENT,
524
                    user_id int,
525
                    c_id int,
526
                    session_id int,
527
                    web_agreement varchar(255),
528
                    web_agreement_date datetime,
529
                    mail_agreement varchar(255),
530
                    mail_agreement_date datetime,
531
                    mail_agreement_link varchar(255)
532
                )";
533
        Database::query($sql);
534
535
        // Installing course settings
536
        $this->install_course_fields_in_all_courses(false);
537
    }
538
539
    public function uninstall()
540
    {
541
        $table = Database::get_main_table('session_rel_course_legal');
542
        $sql = "DROP TABLE $table ";
543
        Database::query($sql);
544
545
        $table = Database::get_main_table('session_rel_course_rel_user_legal');
546
        $sql = "DROP TABLE $table ";
547
        Database::query($sql);
548
549
        // Deleting course settings
550
        $this->uninstall_course_fields_in_all_courses($this->course_settings);
551
    }
552
}
553