• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

apsolu / enrol_select / 14662782900

25 Apr 2025 10:43AM UTC coverage: 14.049% (-0.1%) from 14.159%
14662782900

push

github

jboulen
test(behat): supprime les messages de debug relatifs aux inscriptions lors d'exécution de tests Behat

0 of 34 new or added lines in 2 files covered. (0.0%)

14 existing lines in 2 files now uncovered.

144 of 1025 relevant lines covered (14.05%)

1.12 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

32.67
/lib.php
1
<?php
2
// This file is part of Moodle - http://moodle.org/
3
//
4
// Moodle is free software: you can redistribute it and/or modify
5
// it under the terms of the GNU General Public License as published by
6
// the Free Software Foundation, either version 3 of the License, or
7
// (at your option) any later version.
8
//
9
// Moodle is distributed in the hope that it will be useful,
10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
// GNU General Public License for more details.
13
//
14
// You should have received a copy of the GNU General Public License
15
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
16

17
/**
18
 * Select enrolment plugin.
19
 *
20
 * @package    enrol_select
21
 * @copyright  2016 Université Rennes 2 <dsi-contact@univ-rennes2.fr>
22
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23
 */
24

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

27
use local_apsolu\core\federation\course as FederationCourse;
28

29
require_once($CFG->dirroot.'/enrol/select/locallib.php');
×
30
require_once($CFG->dirroot.'/local/apsolu/locallib.php');
×
31

32
/**
33
 * Classe principale du module enrol_select.
34
 *
35
 * @package    enrol_select
36
 * @copyright  2016 Université Rennes 2 <dsi-contact@univ-rennes2.fr>
37
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
38
 */
39
#[\AllowDynamicProperties]
40
class enrol_select_plugin extends enrol_plugin {
41
    /**
42
     * Code du statut accepté.
43
     */
44
    const ACCEPTED = '0';
45

46
    /**
47
     * Code du statut de la liste principale.
48
     */
49
    const MAIN = '2';
50

51
    /**
52
     * Code du statut de la liste secondaire.
53
     */
54
    const WAIT = '3';
55

56
    /**
57
     * Code du statut désinscrit.
58
     */
59
    const DELETED = '4';
60

61
    /** @var array Tableau indexé avec les constantes de classe ACCEPTED, MAIN, WAIT et DELETED. */
62
    public static $states = [
63
        self::ACCEPTED => 'accepted',
64
        self::MAIN => 'main',
65
        self::WAIT => 'wait',
66
        self::DELETED => 'deleted',
67
    ];
68

69
    /**
70
     * Retourne la chaine de caractères correspondant à une constante.
71
     *
72
     * @param int|string  $status Valeur correspondant à une des constantes de classe (ACCEPTED, MAIN, WAIT et DELETED).
73
     * @param null|string $type   Valeur pouvant être null, abbr ou short.
74
     *
75
     * @return string|false Retourne false si le $status n'est pas correct.
76
     */
77
    public static function get_enrolment_list_name($status, $type = null) {
78
        if ($type !== null ) {
×
79
            $type = '_'.$type;
×
80
        }
81

82
        switch ($status) {
83
            case self::ACCEPTED:
84
            case self::MAIN:
×
85
            case self::WAIT:
×
86
            case self::DELETED:
×
87
                return get_string(self::$states[$status].'_list'.$type, 'enrol_select');
×
88
        }
89

90
        return false;
×
91
    }
92

93
    /**
94
     * Returns name of this enrol plugin.
95
     *
96
     * @return string
97
     */
98
    public function get_name() {
99
        // Second word in class is always enrol name, sorry, no fancy plugin names with _.
100
        return 'select';
×
101
    }
102

103
    /**
104
     * Returns edit icons for the page with list of instances.
105
     *
106
     * @param stdClass $instance
107
     *
108
     * @return array
109
     */
110
    public function get_action_icons(stdClass $instance) {
111
        global $OUTPUT;
112

113
        if ($instance->enrol !== 'select') {
×
114
            throw new coding_exception('invalid enrol instance!');
×
115
        }
116
        $context = context_course::instance($instance->courseid);
×
117

118
        $icons = [];
×
119

120
        if (has_capability('enrol/select:enrol', $context) || has_capability('enrol/select:unenrol', $context)) {
×
121
            $managelink = new moodle_url("/enrol/select/manage.php", ['enrolid' => $instance->id]);
×
122

123
            $label = get_string('enrolusers', 'enrol_manual');
×
124
            $pixicon = new pix_icon('t/enrolusers', $label, 'core', ['class' => 'iconsmall']);
×
125
            $icons[] = $OUTPUT->action_icon($managelink, $pixicon);
×
126
        }
127

128
        if (has_capability('enrol/select:config', $context)) {
×
129
            $editlink = new moodle_url("/enrol/select/edit.php", ['courseid' => $instance->courseid, 'id' => $instance->id]);
×
130
            $icons[] = $OUTPUT->action_icon($editlink, new pix_icon('t/edit', get_string('edit'), 'core',
×
131
                ['class' => 'iconsmall']));
×
132
        }
133

134
        return $icons;
×
135
    }
136

137
    /**
138
     * Méthode permettant de récupérer la liste des utilisateurs dont l'inscription est valide/autorisée pour une péride donnée.
139
     *
140
     * @param int|string $courseid  Identifiant du cours.
141
     * @param int|null   $timestart Horodatage UNIX représentant la date de début de la période à valider.
142
     * @param int|null   $timeend   Horodatage UNIX représentant la date de fin de la période à valider.
143
     *
144
     * @return array Tableau contenant les utilisateurs indéxé par userid.
145
     */
146
    public static function get_authorized_registred_users($courseid, $timestart = null, $timeend = null) {
147
        global $DB;
148

149
        if ($timestart === null) {
×
150
            $timestart = time();
×
151
        }
152

153
        if ($timeend === null) {
×
154
            $timeend = time();
×
155
        }
156

157
        $sql = "SELECT DISTINCT u.*".
×
158
            " FROM {user} u".
×
159
            " JOIN {user_enrolments} ue ON u.id = ue.userid".
×
160
            " JOIN {enrol} e ON e.id = ue.enrolid AND e.enrol = 'select'".
×
161
            " JOIN {role_assignments} ra ON u.id = ra.userid AND e.id = ra.itemid AND ra.component = 'enrol_select'".
×
162
            " JOIN {role} r ON r.id = ra.roleid".
×
163
            " JOIN {context} ctx ON ra.contextid = ctx.id AND ctx.instanceid = e.courseid".
×
164
            " JOIN {cohort_members} cm ON u.id = cm.userid".
×
165
            " JOIN {enrol_select_roles} esr ON r.id = esr.roleid AND e.id = esr.enrolid".
×
166
            " JOIN {enrol_select_cohorts} esc ON cm.cohortid = esc.cohortid AND e.id = esr.enrolid".
×
167
            " JOIN {apsolu_colleges_members} acm ON cm.cohortid = acm.cohortid".
×
168
            " JOIN {apsolu_colleges} ac ON ra.roleid = ac.roleid AND acm.collegeid = ac.id".
×
169
            " WHERE e.status = 0". // Only active enrolments.
×
170
            " AND ue.status = 0".
×
171
            " AND (ue.timestart < :timestart OR ue.timestart = 0)".
×
172
            " AND (ue.timeend > :timeend OR ue.timeend = 0)".
×
173
            " AND e.courseid = :courseid".
×
174
            " AND ctx.contextlevel = 50". // Course level.
×
175
            " AND r.archetype = 'student'";
×
176

177
        $params = [];
×
178
        $params['courseid'] = $courseid;
×
179
        $params['timestart'] = $timestart;
×
180
        $params['timeend'] = $timeend;
×
181

182
        return $DB->get_records_sql($sql, $params);
×
183
    }
184

185
    /**
186
     * This returns false for backwards compatibility, but it is really recommended.
187
     *
188
     * @since Moodle 3.1
189
     * @return boolean
190
     */
191
    public function use_standard_editing_ui() {
192
        // TODO: mettre à true pour afficher les méthodes dans le menu déroulant.
193
        return false;
×
194
    }
195

196
    /**
197
     * Add elements to the edit instance form.
198
     *
199
     * @param stdClass $instance
200
     * @param MoodleQuickForm $mform
201
     * @param context $context
202
     * @return bool
203
     */
204
    public function edit_instance_form($instance, MoodleQuickForm $mform, $context) {
205
        // TODO: ne pas utiliser ce hook moche.
206
        redirect(new moodle_url('/enrol/select/edit.php', ['courseid' => $instance->courseid, 'id' => $instance->id]));
×
207
    }
208

209
    /**
210
     * Perform custom validation of the data used to edit the instance.
211
     *
212
     * @param array $data array of ("fieldname"=>value) of submitted data
213
     * @param array $files array of uploaded files "element_name"=>tmp_file_path
214
     * @param object $instance The instance loaded from the DB
215
     * @param context $context The context of the instance we are editing
216
     * @return array of "element_name"=>"error_description" if there are errors,
217
     *         or an empty array if everything is OK.
218
     * @return void
219
     */
220
    public function edit_instance_validation($data, $files, $instance, $context) {
221
        // TODO.
222
    }
×
223

224
    /**
225
     * Returns link to page which may be used to add new instance of enrolment plugin in course.
226
     *
227
     * @param int $courseid
228
     *
229
     * @return moodle_url page url
230
     */
231
    public function get_newinstance_link($courseid) {
232
        $context = context_course::instance($courseid, MUST_EXIST);
×
233

234
        if (!has_capability('moodle/course:enrolconfig', $context) || !has_capability('enrol/select:config', $context)) {
×
235
            return null;
×
236
        }
237
        // Multiple instances supported - different roles with different password.
238
        return new moodle_url('/enrol/select/edit.php', ['courseid' => $courseid]);
×
239
    }
240

241
    /**
242
     * Returns defaults for new instances.
243
     *
244
     * @return array
245
     */
246
    public function get_instance_defaults() {
247
        $instance = get_config('enrol_select');
×
248

249
        if (isset($instance->default_roles) === false) {
×
250
            $instance->default_cohorts = '';
×
251
            $instance->default_roles = 5;
×
252
            $instance->default_cards = '';
×
253
            $instance->default_customint1 = 20;
×
254
            $instance->default_customint2 = 10;
×
255
            $instance->default_customint3 = 0;
×
256
            $instance->default_customdec1 = 0;
×
257
            $instance->default_customchar1 = 0;
×
258
            $instance->default_customchar2 = 0;
×
259
            $instance->default_customchar3 = self::MAIN;
×
260
            $instance->default_customtext1 = '';
×
261
            $instance->default_customtext2 = '';
×
262
            $instance->default_customtext3 = '';
×
263
        }
264

265
        $fields = [];
×
266
        $fields['status'] = ENROL_INSTANCE_ENABLED; // Enable method or not.
×
267
        $fields['cohorts'] = explode(',', $instance->default_cohorts); // Cohortes par défaut.
×
268
        $fields['roles'] = explode(',', $instance->default_roles); // Rôles par défaut.
×
269
        $fields['cards'] = explode(',', $instance->default_cards); // Paiements par défaut.
×
270
        $fields['customint1'] = $instance->default_customint1; // Maximum de place sur la liste principale.
×
271
        $fields['customint2'] = $instance->default_customint2; // Maximum de place sur la liste d'attente.
×
272
        $fields['customint3'] = $instance->default_customint3; // Activer les quotas.
×
273
        $fields['customint4'] = 0; // Reenrol start date.
×
274
        $fields['customint5'] = 0; // Reenrol end date.
×
275
        $fields['customint6'] = 0; // Reenrol select_enrol instance.
×
276
        $fields['customint7'] = 0; // Course start date.
×
277
        $fields['customint8'] = 0; // Course end date.
×
278
        $fields['customdec1'] = $instance->default_customdec1; // Délai de paiement.
×
279
        $fields['customchar1'] = $instance->default_customchar1; // Type de calendrier.
×
280
        $fields['customchar2'] = $instance->default_customchar2; // Remontée de liste automatique.
×
281
        $fields['customchar3'] = $instance->default_customchar3; // Liste sur laquelle inscrire les étudiants.
×
282
        $fields['customtext1'] = $instance->default_customtext1; // Message de bienvenue pour les inscrits sur liste des acceptés.
×
283
        $fields['customtext2'] = $instance->default_customtext2; // Message de bienvenue pour les inscrits sur liste principale.
×
284
        $fields['customtext3'] = $instance->default_customtext3; // Message de bienvenue pour les inscrits sur liste complémentaire.
×
285

286
        return $fields;
×
287
    }
288

289
    /**
290
     * Is it possible to hide/show enrol instance via standard UI?
291
     *
292
     * @param stdClass $instance
293
     *
294
     * @return bool
295
     */
296
    public function can_hide_show_instance($instance) {
297
        $context = context_course::instance($instance->courseid);
×
298

299
        return has_capability('enrol/select:config', $context);
×
300
    }
301

302
    /**
303
     * Return true if we can add a new instance to this course.
304
     *
305
     * @param int $courseid
306
     *
307
     * @return boolean
308
     */
309
    public function can_add_instance($courseid) {
310
        global $DB;
311

312
        $context = context_course::instance($courseid, MUST_EXIST);
×
313
        if (!has_capability('moodle/course:enrolconfig', $context) || !has_capability('enrol/manual:config', $context)) {
×
314
            return false;
×
315
        }
316

317
        if ($DB->record_exists('enrol', ['courseid' => $courseid, 'enrol' => 'manual'])) {
×
318
            // Multiple instances not supported.
319
            return false;
×
320
        }
321

322
        return true;
×
323
    }
324

325
    /**
326
     * Is it possible to delete enrol instance via standard UI?
327
     *
328
     * @param object $instance
329
     *
330
     * @return bool
331
     */
332
    public function can_delete_instance($instance) {
333
        $context = context_course::instance($instance->courseid);
×
334
        return has_capability('enrol/select:config', $context);
×
335
    }
336

337
    /**
338
     * Retourne le code de la liste dans laquelle sera enregistré le prochain inscrit.
339
     *
340
     * @param object $instance Objet de l'instance de la méthode d'inscription.
341
     * @param object $user     Objet représentant le prochain utilisateur inscrit.
342
     *
343
     * @return string|false Retourne false si il n'y a plus de place cette méthode d'inscription par voeux.
344
     */
345
    public function get_available_status($instance, $user) {
346
        global $DB;
347

348
        if (empty($instance->customint3) === true) {
8✔
349
            // Lorsque les quota ne sont pas activés, on retourne le code de la liste principale.
350
            return self::get_default_enrolment_list($instance);
8✔
351
        }
352

353
        // Détermine si l'utilisateur est déjà inscrit sur cette instance.
354
        $userenrolment = $DB->get_record('user_enrolments', ['enrolid' => $instance->id, 'userid' => $user->id]);
8✔
355
        if ($userenrolment !== false) {
8✔
356
            // Retourne la liste d'inscription actuelle de l'utilisateur.
357
            return $userenrolment->status;
8✔
358
        }
359

360
        // Détermine si il y a déjà des utilisateurs sur liste complémentaire.
361
        $params = ['enrolid' => $instance->id, 'status' => self::WAIT];
8✔
362
        $waitlistenrolements = $DB->get_records('user_enrolments', $params, '', 'userid');
8✔
363
        $this->count_wait_list_enrolements = count($waitlistenrolements);
8✔
364

365
        if (isset($user, $waitlistenrolements[$user->id])) {
8✔
366
            unset($waitlistenrolements[$user->id]);
×
367
            $countwaitlistenrolements = $this->count_wait_list_enrolements - 1;
×
368
        } else {
369
            $countwaitlistenrolements = $this->count_wait_list_enrolements;
8✔
370
        }
371

372
        if ($countwaitlistenrolements >= $instance->customint2 && empty($instance->customint2) === false) {
8✔
373
            // Il n'y a plus de place disponible sur la liste complémentaire
374
            // et les quotas sont définis pour la liste complémentaire.
375
            return false;
8✔
376
        }
377

378
        if ($countwaitlistenrolements !== 0) {
8✔
379
            // Il y a déjà des utilisateurs sur liste complémentaire. On est sûr qu'il reste de la place uniquement ici.
380
            return self::WAIT;
8✔
381
        }
382

383
        // Détermine si il y a déjà des utilisateurs sur la liste des acceptés et la liste principale.
384
        $sql = "SELECT userid".
8✔
385
            " FROM {user_enrolments}".
8✔
386
            " WHERE enrolid = :enrolid".
8✔
387
            " AND status IN (:accepted, :main)";
8✔
388
        $params = ['enrolid' => $instance->id, 'accepted' => self::ACCEPTED, 'main' => self::MAIN];
8✔
389
        $mainlistenrolements = $DB->get_records_sql($sql, $params);
8✔
390
        $this->count_main_list_enrolements = count($mainlistenrolements);
8✔
391

392
        if (isset($user, $mainlistenrolements[$user->id])) {
8✔
393
            unset($mainlistenrolements[$user->id]);
×
394
            $countmainlistenrolements = $this->count_main_list_enrolements - 1;
×
395
        } else {
396
            $countmainlistenrolements = $this->count_main_list_enrolements;
8✔
397
        }
398

399
        if ($countmainlistenrolements < $instance->customint1 && empty($instance->customint1) === false) {
8✔
400
            // Il reste des places disponibles sur liste principale et les quotas sont définis pour la liste principale.
401
            return self::get_default_enrolment_list($instance);
8✔
402
        }
403

404
        // Cas où la liste principale est pleine et la liste complémentaire est vide.
405
        if (empty($instance->customint2) === false) {
8✔
406
            // Si le quota sur la liste complémentaire n'est pas vide.
407
            return self::WAIT;
8✔
408
        }
409

410
        // Il n'y a pas de liste complémentaire. Il n'est plus possible de s'inscrire.
411
        return false;
8✔
412
    }
413

414
    /**
415
     * Retourne le code de la liste sur laquelle est inscrit l'utilisateur par défaut.
416
     *
417
     * @param object $instance Objet de l'instance de la méthode d'inscription.
418
     *
419
     * @return int Retourne soit self::ACCEPTED, soit self::MAIN.
420
     */
421
    public static function get_default_enrolment_list($instance) {
422
        if ($instance->customchar3 === self::ACCEPTED) {
8✔
423
            return self::ACCEPTED;
8✔
424
        }
425

426
        return self::MAIN;
8✔
427
    }
428

429
    /**
430
     * Retourne les rôles disponibles pour une méthode d'inscription donnée et un contexte.
431
     *
432
     * @param object $instance Objet de l'instance de la méthode d'inscription
433
     * @param object $context  Objet représentant un contexte.
434
     *
435
     * @return array Retourne un tableau de rôles.
436
     */
437
    public function get_roles($instance, $context) {
438
        global $DB;
439

440
        $roles = $DB->get_records('enrol_select_roles', ['enrolid' => $instance->id], '', 'roleid');
×
441
        foreach (get_assignable_roles($context, ROLENAME_BOTH) as $id => $role) {
×
442
            if (!isset($roles[$id])) {
×
443
                unset($roles[$id]);
×
444
            } else {
445
                $roles[$id]->id = $id;
×
446
                $roles[$id]->name = $role;
×
447
            }
448
        }
449

450
        $roles = array_values($roles);
×
451

452
        return $roles;
×
453
    }
454

455
    /**
456
     * Retourne le rôle d'un utilisateur pour une méthode d'inscription donnée.
457
     *
458
     * @param object $instance Objet de l'instance de la méthode d'inscription
459
     * @param int    $userid   Identifiant de l'utilisateur. Si il n'est pas fourni,
460
     *                         c'est l'identifiant de l'utilisateur courant qui sera utilisé.
461
     *
462
     * @return object|false Retourne un object du rôle ou false si l'utilisateur n'est pas inscrit via cette méthode.
463
     */
464
    public function get_user_role($instance, $userid = null) {
465
        global $DB, $USER;
466

467
        if ($userid === null) {
×
468
            $userid = $USER->id;
×
469
        }
470

471
        $sql = "SELECT r.*".
×
472
            " FROM {role} r".
×
473
            " JOIN {role_assignments} ra ON r.id = ra.roleid".
×
474
            " JOIN {context} ctx ON ctx.id = ra.contextid".
×
475
            " JOIN {enrol} e ON ctx.instanceid = e.courseid AND e.id = ra.itemid".
×
476
            " JOIN {user_enrolments} ue ON e.id = ue.enrolid AND ue.userid = ra.userid".
×
477
            " WHERE e.id = :enrolid".
×
478
            " AND e.enrol = 'select'".
×
479
            " AND e.status = 0". // Active.
×
480
            " AND ue.userid = :userid".
×
481
            " AND ctx.contextlevel = 50";
×
482
        $params = ['enrolid' => $instance->id, 'userid' => $userid];
×
483

484
        $roles = role_fix_names($DB->get_records_sql($sql, $params));
×
485

486
        return current($roles);
×
487
    }
488

489
    /**
490
     * Retourne les rôles disponibles pour un utilisateur et une méthode d'inscription donnée.
491
     *
492
     * @param object $instance Objet de l'instance de la méthode d'inscription
493
     * @param int    $userid   Identifiant de l'utilisateur. Si il n'est pas fourni,
494
     *                         c'est l'identifiant de l'utilisateur courant qui sera utilisé.
495
     *
496
     * @return array Retourne un tableau de rôles.
497
     */
498
    public function get_available_user_roles($instance, $userid = null) {
499
        global $DB, $USER;
500

501
        if ($userid === null) {
×
502
            $userid = $USER->id;
×
503
        }
504

505
        $sql = "SELECT DISTINCT r.*
×
506
                  FROM {role} r
507
                  JOIN {enrol_select_roles} esr ON r.id = esr.roleid
508
                  JOIN {enrol} e ON e.id = esr.enrolid
509
                  JOIN {enrol_select_cohorts} esc ON e.id = esc.enrolid
510
                  JOIN {cohort_members} cm ON cm.cohortid = esc.cohortid
511
                  JOIN {apsolu_colleges_members} acm ON acm.cohortid = cm.cohortid
512
                  JOIN {apsolu_colleges} ac ON ac.id = acm.collegeid AND r.id = ac.roleid
513
                 WHERE e.id = :enrolid
514
                   AND e.enrol = 'select'
515
                   AND e.status = 0  -- Active.
516
                   AND cm.userid = :userid
517
              ORDER BY r.sortorder";
×
518
        $params = ['enrolid' => $instance->id, 'userid' => $userid];
×
519

520
        return role_fix_names($DB->get_records_sql($sql, $params));
×
521
    }
522

523
    /**
524
     * Fonction à documenter (TODO).
525
     *
526
     * @param object      $instance Objet de l'instance de la méthode d'inscription
527
     * @param null|object $user     Identifiant de l'utilisateur. Si il n'est pas fourni,
528
     *                              c'est l'identifiant de l'utilisateur courant qui sera utilisé.
529
     *
530
     * @return void.
531
     */
532
    public function set_available_status($instance, $user = null) {
533
        global $DB;
534

535
        debugging(sprintf('%s() is deprecated. Please see'.
×
536
            ' enrol_select_plugin::get_available_status() method instead.', __METHOD__), DEBUG_DEVELOPER);
×
537

538
        $this->available_status = [];
×
539

540
        // Check main list.
541
        $sql = "SELECT userid".
×
542
            " FROM {user_enrolments}".
×
543
            " WHERE enrolid = :enrolid".
×
544
            " AND status IN (0, 2)";
×
545
        $mainlistenrolements = $DB->get_records_sql($sql, ['enrolid' => $instance->id]);
×
546
        $this->count_main_list_enrolements = count($mainlistenrolements);
×
547

548
        if (isset($user, $mainlistenrolements[$user->id])) {
×
549
            unset($mainlistenrolements[$user->id]);
×
550
            $countmainlistenrolements = $this->count_main_list_enrolements - 1;
×
551
        } else {
552
            $countmainlistenrolements = $this->count_main_list_enrolements;
×
553
        }
554

555
        if ($countmainlistenrolements < $instance->customint1) {
×
556
            // Some slots are available on main list.
557
            $this->available_status[] = '2';
×
558
        }
559

560
        // Check wait list.
561
        $params = ['enrolid' => $instance->id, 'status' => self::WAIT];
×
562
        $waitlistenrolements = $DB->get_records('user_enrolments', $params, '', 'userid');
×
563
        $this->count_wait_list_enrolements = count($waitlistenrolements);
×
564

565
        if (isset($user, $waitlistenrolements[$user->id])) {
×
566
            unset($waitlistenrolements[$user->id]);
×
567
            $countwaitlistenrolements = $this->count_wait_list_enrolements - 1;
×
568
        } else {
569
            $countwaitlistenrolements = $this->count_wait_list_enrolements;
×
570
        }
571

572
        if ($countwaitlistenrolements < $instance->customint2) {
×
573
            // Some slots are available on wait list.
574
            $this->available_status[] = '3';
×
575
        }
576
    }
577

578
    /**
579
     * Détermine si les inscriptions sont ouvertes.
580
     *
581
     * @param object $instance Objet de l'instance de la méthode d'inscription
582
     *
583
     * @return bool Vrai si les inscriptions sont ouvertes.
584
     */
585
    public function is_enrol_period_active($instance) {
586
        $today = time();
×
587

588
        $opening = ($instance->enrolstartdate === '0' || $instance->enrolstartdate <= $today);
×
589
        $closing = ($instance->enrolenddate === '0' || $instance->enrolenddate >= $today);
×
590

591
        return ($opening && $closing);
×
592
    }
593

594
    /**
595
     * Détermine si un utilisateur peut s'inscrire à une instance avec un rôle donné.
596
     *
597
     * @param object     $instance Objet de l'instance de la méthode d'inscription.
598
     * @param object     $user     Objet représentant l'utilisateur.
599
     * @param int|string $roleid   Identifiant d'un rôle.
600
     *
601
     * @return bool Vrai si les inscriptions sont ouvertes.
602
     */
603
    public function can_enrol($instance, $user, $roleid) {
604
        global $CFG, $DB;
605

606
        $today = time();
×
607

608
        // Check opening register period.
609
        if ($instance->enrolstartdate !== '0' && $instance->enrolstartdate > $today) {
×
NEW
610
            if (defined('BEHAT_SITE_RUNNING') === false) {
×
NEW
611
                debugging($this->get_name().' not opened yet.', $level = DEBUG_DEVELOPER);
×
612
            }
UNCOV
613
            return false;
×
614
        }
615

616
        // Check closing register period.
617
        if ($instance->enrolenddate !== '0' && $instance->enrolenddate < $today) {
×
NEW
618
            if (defined('BEHAT_SITE_RUNNING') === false) {
×
NEW
619
                debugging($this->get_name().' already closed.', $level = DEBUG_DEVELOPER);
×
620
            }
UNCOV
621
            return false;
×
622
        }
623

624
        // Check cohorts.
625
        $usercohorts = $DB->get_records('cohort_members', ['userid' => $user->id]);
×
626
        $enrolcohorts = $DB->get_records('enrol_select_cohorts', ['enrolid' => $instance->id], '', 'cohortid');
×
627

628
        $found = false;
×
629
        foreach ($usercohorts as $cohort) {
×
630
            if (isset($enrolcohorts[$cohort->cohortid])) {
×
631
                $found = true;
×
632
                break;
×
633
            }
634
        }
635

636
        if ($found !== true) {
×
NEW
637
            if (defined('BEHAT_SITE_RUNNING') === false) {
×
NEW
638
                debugging($this->get_name().': '.$user->username.' and enrol cohort mismatch.', $level = DEBUG_DEVELOPER);
×
639
            }
UNCOV
640
            return false;
×
641
        }
642

643
        $federationcourse = new FederationCourse();
×
644
        if ($instance->courseid === $federationcourse->get_courseid()) {
×
645
            // Bidouille moche pour gérer l'inscription à la FFSU.
646
            return true;
×
647
        }
648

649
        if (isset($CFG->is_siuaps_rennes) === true) {
×
650
            // Dirty hack pour les activités complémentaires !
651
            // À virer, et mettre des auto-inscriptions à la place.
652
            if ($roleid == 5 || in_array($instance->courseid, ['249', '250'], $strict = true) === true) {
×
653
                return true;
×
654
            }
655
        }
656

657
        // Check available slots.
658
        if ($this->get_available_status($instance, $user) === false) {
×
NEW
659
            if (defined('BEHAT_SITE_RUNNING') === false) {
×
NEW
660
                debugging($this->get_name().' n\'a plus aucune place disponible.', $level = DEBUG_DEVELOPER);
×
661
            }
UNCOV
662
            return false;
×
663
        }
664

665
        // Check user limit.
666
        $userchoices = enrol_select_get_sum_user_choices($userid = null, $count = true);
×
667
        $available = false;
×
668
        foreach ($userchoices as $choice) {
×
669
            if ($choice->roleid != $roleid) {
×
670
                continue;
×
671
            }
672

673
            if ($choice->maxwish == 0 || $choice->count < $choice->maxwish) {
×
674
                $available = true;
×
675
                break;
×
676
            }
677
        }
678

679
        if ($available === false) {
×
680
            $parameters = ['userid' => $user->id, 'roleid' => $roleid];
×
681
            $message = get_string('the_user_X_has_reached_their_wish_limit_for_the_role_Y', 'enrol_select', $parameters);
×
682

NEW
683
            if (defined('BEHAT_SITE_RUNNING') === false) {
×
NEW
684
                debugging($message, $level = DEBUG_DEVELOPER);
×
685
            }
UNCOV
686
            return false;
×
687
        }
688

689
        // Check role.
690
        if ($DB->get_record('enrol_select_roles', ['enrolid' => $instance->id, 'roleid' => $roleid]) === false) {
×
NEW
691
            if (defined('BEHAT_SITE_RUNNING') === false) {
×
NEW
692
                debugging($this->get_name().': roleid #'.$roleid.' is not available.', $level = DEBUG_DEVELOPER);
×
693
            }
UNCOV
694
            return false;
×
695
        }
696

697
        return true;
×
698
    }
699

700
    /**
701
     * Détermine si un utilisateur peut se réinscrire.
702
     *
703
     * @param object          $instance Objet de l'instance de la méthode d'inscription.
704
     * @param null|int|string $userid   Identifiant d'un utilisateur.
705
     * @param null|int|string $roleid   Identifiant d'un rôle.
706
     *
707
     * @return bool Vrai si les inscriptions sont ouvertes.
708
     */
709
    public function can_reenrol($instance, $userid = null, $roleid = null) {
710
        global $DB, $USER;
711

712
        $today = time();
×
713

714
        if ($userid === null) {
×
715
            $userid = $USER->id;
×
716
        }
717

718
        // Check reenrol enabled.
719
        if (empty($instance->customint6)) {
×
NEW
720
            if (defined('BEHAT_SITE_RUNNING') === false) {
×
NEW
721
                debugging($this->get_name().' reenrol not enabled.', $level = DEBUG_DEVELOPER);
×
722
            }
UNCOV
723
            return false;
×
724
        }
725

726
        // Check reenrol exists.
727
        $enrol = $DB->get_record('enrol', ['id' => $instance->customint6, 'enrol' => 'select']);
×
728
        if ($enrol === false) {
×
NEW
729
            if (defined('BEHAT_SITE_RUNNING') === false) {
×
NEW
730
                debugging($this->get_name().' reenrol id #'.$instance->customint6.' does not exist', $level = DEBUG_DEVELOPER);
×
731
            }
UNCOV
732
            return false;
×
733
        }
734

735
        // Check opening reenrol period.
736
        if ($instance->customint4 !== '0' && $instance->customint4 > $today) {
×
NEW
737
            if (defined('BEHAT_SITE_RUNNING') === false) {
×
NEW
738
                debugging($this->get_name().' not opened yet.', $level = DEBUG_DEVELOPER);
×
739
            }
UNCOV
740
            return false;
×
741
        }
742

743
        // Check closing reenrol period.
744
        if ($instance->customint5 !== '0' && $instance->customint5 < $today) {
×
NEW
745
            if (defined('BEHAT_SITE_RUNNING') === false) {
×
NEW
746
                debugging($this->get_name().' already closed.', $level = DEBUG_DEVELOPER);
×
747
            }
UNCOV
748
            return false;
×
749
        }
750

751
        // Check cohorts.
752
        if ($instance->customint3 === '1') {
×
753
            $usercohorts = $DB->get_records('cohort_members', ['userid' => $userid]);
×
754
            $enrolcohorts = $DB->get_records('enrol_select_cohorts', ['enrolid' => $instance->id], '', 'cohortid');
×
755

756
            $found = false;
×
757
            foreach ($usercohorts as $cohort) {
×
758
                if (isset($enrolcohorts[$cohort->cohortid])) {
×
759
                    $found = true;
×
760
                    break;
×
761
                }
762
            }
763

764
            if ($found !== true) {
×
NEW
765
                if (defined('BEHAT_SITE_RUNNING') === false) {
×
NEW
766
                    debugging($this->get_name().': userid #'.$userid.' and enrol cohort mismatch.', $level = DEBUG_DEVELOPER);
×
767
                }
UNCOV
768
                return false;
×
769
            }
770
        }
771

772
        // We don't check available slots.
773
        // We don't check user limit.
774

775
        // Check role.
776
        if ($roleid !== null) {
×
777
            if ($DB->get_record('enrol_select_roles', ['enrolid' => $instance->id, 'roleid' => $roleid]) === false) {
×
NEW
778
                if (defined('BEHAT_SITE_RUNNING') === false) {
×
NEW
779
                    debugging($this->get_name().': roleid #'.$roleid.' is not available.', $level = DEBUG_DEVELOPER);
×
780
                }
UNCOV
781
                return false;
×
782
            }
783
        }
784

785
        return true;
×
786
    }
787

788
    /**
789
     * Méthode permettant l'inscription d'un utilisateur à une instance.
790
     *
791
     * @param stdClass        $instance      Objet de l'instance de la méthode d'inscription.
792
     * @param int|string      $userid        Identifiant d'un utilisateur.
793
     * @param null|int|string $roleid        Identifiant d'un rôle.
794
     * @param int|string      $timestart     Timestamp de début de cours.
795
     * @param int|string      $timeend       Timestamp de fin de cours.
796
     * @param null|int|string $status        État de l'inscription (accepté, liste principale, liste secondaire, supprimé).
797
     * @param null|bool       $recovergrades Récupérer les notes ?
798
     *
799
     * @return void.
800
     */
801
    public function enrol_user(stdClass $instance, $userid, $roleid = null, $timestart = 0, $timeend = 0,
802
        $status = null, $recovergrades = null) {
803
        global $DB, $USER;
804

805
        // La méthode parent::enrol_user() ne remplace pas les rôles, mais cumul.
806
        // Il faut donc faire un traitement différent si il s'agit juste d'un changement de rôle.
807
        $enrolled = $DB->get_record('user_enrolments', ['enrolid' => $instance->id, 'userid' => $userid]);
8✔
808
        if ($enrolled === false) {
8✔
809
            if ($timestart === 0) {
8✔
810
                $timestart = $instance->customint7;
8✔
811
            }
812

813
            if ($timeend === 0) {
8✔
814
                $timeend = $instance->customint8;
8✔
815
            }
816

817
            parent::enrol_user($instance, $userid, $roleid, $timestart, $timeend, $status, $recovergrades);
8✔
818

819
            // Ajoute une tâche pour contrôler le paiement après l'inscription.
820
            $instance->customdec1 = intval($instance->customdec1);
8✔
821
            if (empty($instance->customdec1) === false && $status === self::ACCEPTED) {
8✔
822
                $customdata = (object) ['courseid' => $instance->courseid, 'enrolid' => $instance->id];
×
823

824
                $task = new enrol_select\task\check_enrolment_payment();
×
825
                $task->set_next_run_time(time() + $instance->customdec1);
×
826
                $task->set_custom_data($customdata);
×
827
                $task->set_userid($userid);
×
828

829
                core\task\manager::queue_adhoc_task($task);
×
830
            }
831

832
            // Notifie le nouvel inscrit.
833
            if ($userid === $USER->id) {
8✔
834
                $message = '';
8✔
835
                switch ($status) {
836
                    case self::ACCEPTED:
837
                        $message = $instance->customtext1;
8✔
838
                        break;
8✔
839
                    case self::MAIN:
8✔
840
                        $message = $instance->customtext2;
8✔
841
                        break;
8✔
842
                    case self::WAIT:
8✔
843
                        $message = $instance->customtext3;
8✔
844
                        break;
8✔
845
                }
846

847
                if (empty($message) === false) {
8✔
848
                    $course = $DB->get_record('course', ['id' => $instance->courseid]);
8✔
849

850
                    $eventdata = new \core\message\message();
8✔
851
                    $eventdata->name = 'select_notification';
8✔
852
                    $eventdata->component = 'enrol_select';
8✔
853
                    $eventdata->userfrom = get_admin();
8✔
854
                    $eventdata->userto = $userid;
8✔
855
                    $params = format_string($course->fullname, $striplinks = true, $course->id);
8✔
856
                    $eventdata->subject = get_string('enrolment_to', 'enrol_select', $params);
8✔
857
                    $eventdata->fullmessage = $message;
8✔
858
                    $eventdata->fullmessageformat = FORMAT_HTML;
8✔
859
                    $eventdata->fullmessagehtml = $message;
8✔
860
                    $eventdata->smallmessage = '';
8✔
861
                    $eventdata->notification = 1;
8✔
862
                    $eventdata->courseid = $course->id;
8✔
863

864
                    message_send($eventdata);
8✔
865
                }
866
            }
867

868
            return;
8✔
869
        }
870

871
        // Traite le cas où on souhaite juste modifier le statut.
872
        if ($status !== null) {
8✔
873
            $sql = "UPDATE {user_enrolments}".
8✔
874
                " SET status = :status, timemodified = :now".
8✔
875
                " WHERE enrolid = :enrolid".
8✔
876
                " AND userid = :userid";
8✔
877
            $DB->execute($sql, ['status' => $status, 'now' => time(), 'enrolid' => $instance->id, 'userid' => $userid]);
8✔
878
        }
879

880
        // Traite le cas où on souhaite juste modifier le rôle.
881
        if ($roleid !== null) {
8✔
882
            $coursecontext = context_course::instance($instance->courseid);
8✔
883

884
            $sql = "UPDATE {role_assignments}".
8✔
885
                " SET roleid = :roleid, timemodified = :now".
8✔
886
                " WHERE component = 'enrol_select'".
8✔
887
                " AND userid = :userid".
8✔
888
                " AND contextid = :contextid".
8✔
889
                " AND itemid= :itemid";
8✔
890
            $params = [
8✔
891
                'roleid' => $roleid,
8✔
892
                'now' => time(),
8✔
893
                'userid' => $userid,
8✔
894
                'contextid' => $coursecontext->id,
8✔
895
                'itemid' => $instance->id,
8✔
896
            ];
8✔
897
            $DB->execute($sql, $params);
8✔
898
        }
899
    }
900

901
    /**
902
     * Méthode permettant de déinscrire un utilisateur d'une instance.
903
     *
904
     * @param stdClass   $instance      Objet de l'instance de la méthode d'inscription.
905
     * @param int|string $userid        Identifiant d'un utilisateur.
906
     *
907
     * @return void.
908
     */
909
    public function unenrol_user(stdClass $instance, $userid) {
910
        global $DB;
911

912
        parent::unenrol_user($instance, $userid);
8✔
913

914
        // Si la remontée de liste est activée.
915
        if (empty($instance->customchar2) === false) {
8✔
916
            $this->refill_main_list($instance, $userid);
8✔
917
        }
918

919
        // Si les paiements à l'inscription sont activées.
920
        $instance->customdec1 = intval($instance->customdec1);
8✔
921
        if (empty($instance->customdec1) === false) {
8✔
922
            // On supprime la tâche adhoc associée à l'utilisateur.
923
            $classname = '\enrol_select\task\check_enrolment_payment';
×
924
            $params = ['component' => 'enrol_select', 'classname' => $classname, 'userid' => $userid];
×
925
            $tasks = $DB->get_records('task_adhoc', $params);
×
926
            foreach ($tasks as $taskid => $task) {
×
927
                $customdata = json_decode($task->customdata);
×
928
                if (isset($customdata->enrolid) === false) {
×
929
                    continue;
×
930
                }
931

932
                if ($customdata->enrolid !== $instance->id) {
×
933
                    continue;
×
934
                }
935

936
                $DB->delete_records('task_adhoc', ['id' => $taskid]);
×
937
            }
938
        }
939
    }
940

941
    /**
942
     * Réorganise la liste d'inscription principale.
943
     *
944
     * @param stdClass   $instance      Objet de l'instance de la méthode d'inscription.
945
     * @param int|string $userid        Identifiant d'un utilisateur.
946
     *
947
     * @return void.
948
     */
949
    public function refill_main_list(stdClass $instance, $userid) {
950
        global $DB, $USER;
951

952
        if ($this->is_enrol_period_active($instance) === false) {
8✔
953
            // On ne réalimente pas la liste principale si les inscriptions sont closes.
954
            return;
8✔
955
        }
956

957
        if ($USER->id !== $userid) {
8✔
958
            // L'utilisateur courant n'est pas l'utilisateur à désinscrire.
959
            // Il s'agit probablement d'un enseignant dans la partie management.
960
            // On ne provoque pas la réalimentation de la liste principale.
961
            return;
8✔
962
        }
963

964
        if (empty($instance->customint3) === true) {
8✔
965
            // Les quotas ne sont pas activés pour ce cours.
966
            return;
8✔
967
        }
968

969
        $sql = "SELECT COUNT(*) FROM {user_enrolments} WHERE enrolid = :enrolid AND status IN (:main, :accepted)";
8✔
970
        $params = ['enrolid' => $instance->id, 'main' => self::MAIN, 'accepted' => self::ACCEPTED];
8✔
971
        $countmain = $DB->count_records_sql($sql, $params);
8✔
972
        if ($countmain >= $instance->customint1) {
8✔
973
            // La liste principale (et des acceptés) est déjà pleine.
974
            return;
8✔
975
        }
976

977
        $countwait = $DB->count_records('user_enrolments', ['enrolid' => $instance->id, 'status' => self::WAIT]);
8✔
978
        if ($countwait === 0) {
8✔
979
            // La liste complémentaire est vide.
980
            return;
8✔
981
        }
982

983
        // Détermine le nombre d'inscription à transférer de la liste complémentaire à la liste principale.
984
        $promote = $instance->customint1 - $countmain;
8✔
985

986
        // Récupère les utilisateurs sur liste complémentaire par ordre d'inscription.
987
        $params = ['enrolid' => $instance->id, 'status' => self::WAIT];
8✔
988
        $waitingusers = $DB->get_records('user_enrolments', $params, $sort = 'timecreated ASC');
8✔
989

990
        $course = $DB->get_record('course', ['id' => $instance->courseid], '*', MUST_EXIST);
8✔
991
        foreach ($waitingusers as $user) {
8✔
992
            $user->status = self::MAIN;
8✔
993
            $DB->update_record('user_enrolments', $user);
8✔
994

995
            // Notifie l'utilisateur sur liste d'attente qui vient d'être basculé sur liste principale.
996
            $eventdata = new \core\message\message();
8✔
997
            $eventdata->courseid = $course->id;
8✔
998
            $eventdata->component = 'enrol_select';
8✔
999
            $eventdata->name = 'select_notification';
8✔
1000
            $eventdata->userfrom = core_user::get_noreply_user();
8✔
1001
            $eventdata->userto = $DB->get_record('user', ['id' => $user->userid]);
8✔
1002
            $eventdata->subject = get_string('enrolcoursesubject', 'enrol_select', $course);
8✔
1003
            $eventdata->fullmessage = get_string('message_promote', 'enrol_select');
8✔
1004
            $eventdata->fullmessageformat = FORMAT_PLAIN;
8✔
1005
            $eventdata->fullmessagehtml = '';
8✔
1006
            $eventdata->smallmessage = '';
8✔
1007
            $eventdata->notification = 1;
8✔
1008

1009
            message_send($eventdata);
8✔
1010

1011
            $promote--;
8✔
1012
            if ($promote === 0) {
8✔
1013
                break;
8✔
1014
            }
1015
        }
1016
    }
1017
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc