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

apsolu / local_apsolu / 14666526810

25 Apr 2025 01:04PM UTC coverage: 10.429% (-2.8%) from 13.18%
14666526810

push

github

jboulen
test(github): supprime temporairement l'exécution des tests Behat sur Moodle 5.x et supérieur

518 of 4967 relevant lines covered (10.43%)

0.49 hits per line

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

49.43
/classes/core/course.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
// phpcs:disable moodle.NamingConventions.ValidFunctionName.LowercaseMethod
18
// phpcs:disable moodle.NamingConventions.ValidVariableName.MemberNameUnderscore
19

20
namespace local_apsolu\core;
21

22
use coding_exception;
23
use context_block;
24
use context_course;
25
use core_course_category;
26
use core_php_time_limit;
27
use grade_category;
28
use grade_item;
29
use moodle_exception;
30
use moodle_url;
31
use stdClass;
32

33
/**
34
 * Classe gérant les créneaux horaires APSOLU (cours Moodle).
35
 *
36
 * @package    local_apsolu
37
 * @copyright  2019 Université Rennes 2 <dsi-contact@univ-rennes2.fr>
38
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
39
 */
40
class course extends record {
41
    /**
42
     * Nom de la table de référence en base de données.
43
     */
44
    const TABLENAME = 'apsolu_courses';
45

46
    /** @var int|string Identifiant numérique du créneau horaire. */
47
    public $id = 0;
48

49
    /** @var string $shortname Nom abrégé du créneau horaire. */
50
    public $shortname = '';
51

52
    /** @var string $fullname Nom complet du créneau horaire. */
53
    public $fullname = '';
54

55
    /** @var string $idnumber Identifiant du créneau horaire. */
56
    public $idnumber = '';
57

58
    /** @var int|string $category Entier représentant l'identifiant de l'activité sportive. */
59
    public $category = '';
60

61
    /** @var string $event Précision sur la discipline ou la spécificité de
62
                           ce créneau (ex: 100m, 110m haies, football en salle, etc). */
63
    public $event = '';
64

65
    /** @var int|string $numweekday Ordre du jour (ex: 1 = lundi, 2 = mardi, etc). Facilite le tri dans la requête SQL. */
66
    public $numweekday = '';
67

68
    /** @var string $weekday Jour de la semaine en anglais. Champ à utiliser avec
69
                             la fonction Moodle get_string($weekday, 'calendar'). */
70
    public $weekday = '';
71

72
    /** @var string $starttime Heure de début du créneau au format HH:MM. */
73
    public $starttime = '';
74

75
    /** @var string $endtime Heure de fin du créneau au format HH:MM. */
76
    public $endtime = '';
77

78
    /** @var bool $license Indique si le créneau nécessite l'adhésion à la FFSU. */
79
    public $license = 0;
80

81
    /** @var bool $on_homepage Indique si le créneau doit être affiché sur la homepage. */
82
    public $on_homepage = '';
83

84
    /** @var bool $showpolicy Indique si les recommandations médicales doivent être acceptées lors de l'inscription. */
85
    public $showpolicy = '';
86

87
    /** @var int|string $locationid Identifiant numérique du lieu de pratique. */
88
    public $locationid = '';
89

90
    /** @var int|string $periodid Identifiant numérique de la période de cours. */
91
    public $periodid = '';
92

93
    /** @var int|string $skillid Identifiant numérique du niveau de pratique. */
94
    public $skillid = '';
95

96
    /** @var string $information Informations additionnelles affichées après l'inscription à un créneau. */
97
    public $information = '';
98

99
    /** @var int|string $informationformat Identifiant numérique du format du texte. */
100
    public $informationformat = FORMAT_HTML;
101

102
    /** @var string $information_editor Variable pour le formulaire contenant l'éditeur de texte. */
103
    public $information_editor = '';
104

105
    /**
106
     * Affiche une représentation textuelle de l'objet.
107
     *
108
     * @return string.
109
     */
110
    public function __toString() {
111
        return $this->fullname;
×
112
    }
113

114
    /**
115
     * Supprime un objet en base de données.
116
     *
117
     * @throws moodle_exception A moodle exception is thrown when moodle course cannot be delete.
118
     * @throws dml_exception A DML specific exception is thrown for any errors.
119
     *
120
     * @return bool true.
121
     */
122
    public function delete() {
123
        global $DB;
124

125
        // Démarre une transaction, si ce n'est pas déjà fait.
126
        if ($DB->is_transaction_started() === false) {
4✔
127
            $transaction = $DB->start_delegated_transaction();
4✔
128
        }
129

130
        // This might take a while. Raise the execution time limit.
131
        core_php_time_limit::raise();
4✔
132

133
        // Supprime les sessions du cours.
134
        foreach ($this->get_sessions() as $session) {
4✔
135
            $session->delete();
×
136
        }
137

138
        // We do this here because it spits out feedback as it goes.
139
        $course = $DB->get_record('course', ['id' => $this->id], $fields = '*', MUST_EXIST);
4✔
140
        $result = delete_course($course, $showfeedback = false);
4✔
141

142
        if ($result === false) {
4✔
143
            $link = new moodle_url('/local/apsolu/courses/index.php', ['tab' => 'courses']);
×
144

145
            throw new moodle_exception('cannotdeletecategorycourse', $module = '', $link, $parameter = $this->fullname);
×
146
        }
147

148
        // Supprime l'objet en base de données.
149
        $DB->delete_records(self::TABLENAME, ['id' => $this->id]);
4✔
150

151
        // TODO: supprimer les notes.
152

153
        // Update course count in categories.
154
        fix_course_sortorder();
4✔
155

156
        // Valide la transaction en cours.
157
        if (isset($transaction) === true) {
4✔
158
            $transaction->allow_commit();
×
159
        }
160

161
        return true;
4✔
162
    }
163

164
    /**
165
     * Retourne l'id du cours de FFSU.
166
     *
167
     * @return int|false Retourne l'id du cours de FFSU ou false si il n'est pas défini.
168
     */
169
    public static function get_federation_courseid() {
170
        debugging('Use of '.__METHOD__.' is deprecated. Use local_apsolu\core\federation\course::get_courseid().', DEBUG_DEVELOPER);
×
171

172
        $federationcourse = get_config('local_apsolu', 'federation_course');
×
173

174
        if (empty($federationcourse) === true) {
×
175
            return false;
×
176
        }
177

178
        return $federationcourse;
×
179
    }
180

181
    /**
182
     * Calcule le nom complet du cours à partir des paramètres passés à la méthode.
183
     *
184
     * @param int|string $category  Identifiant ou nom de la catégorie d'activité sportive.
185
     * @param string     $event     Libellé complémentaire / spécialité.
186
     * @param string     $weekday   Jour de la semaine en anglais.
187
     * @param string     $starttime Heure de début du cours.
188
     * @param string     $endtime   Heure de fin du cours.
189
     * @param int|string $skill     Identifiant ou libellé du niveau de pratique.
190
     *
191
     * @return string Nom abrégé unique.
192
     */
193
    public static function get_fullname($category, $event, $weekday, $starttime, $endtime, $skill) {
194
        global $DB;
195

196
        if (ctype_digit($category) === true) {
×
197
            // Récupère le nom de la catégorie en base de données, si c'est un identifiant qui a été entré en paramètre.
198
            $record = $DB->get_record('course_categories', ['id' => $category], $fields = '*', MUST_EXIST);
×
199
            $category = $record->name;
×
200
        }
201

202
        if (ctype_digit($skill) === true) {
×
203
            // Récupère le nom du niveau de pratique en base de données, si c'est un identifiant qui a été entré en paramètre.
204
            $record = $DB->get_record('apsolu_skills', ['id' => $skill], $fields = '*', MUST_EXIST);
×
205
            $skill = $record->name;
×
206
        }
207

208
        $strtime = get_string($weekday, 'calendar').' '.$starttime.' '.$endtime;
×
209

210
        if (empty($event) === false) {
×
211
            return sprintf('%s %s %s %s', $category, $event, $strtime, $skill);
×
212
        }
213

214
        return sprintf('%s %s %s', $category, $strtime, $skill);
×
215
    }
216

217
    /**
218
     * Vérifie le nom abrégé du cours.
219
     *
220
     * Si le nom abrégé passé en paramètre est déjà utilisé, un nouveau nom abrégé est généré.
221
     *
222
     * @param int|string $courseid  Identifiant du cours.
223
     * @param string     $shortname Nom abrégé du cours à contrôler.
224
     *
225
     * @return string Nom abrégé unique.
226
     */
227
    public static function get_shortname($courseid, $shortname) {
228
        global $DB;
229

230
        // Contrôle que le nom abrégé est bien unique.
231
        while (true) {
×
232
            $course = $DB->get_record('course', ['shortname' => $shortname]);
×
233
            if ($course === false) {
×
234
                break;
×
235
            }
236

237
            if ($courseid === $course->id) {
×
238
                break;
×
239
            }
240

241
            $shortname .= '.';
×
242
        }
243

244
        return $shortname;
×
245
    }
246

247
    /**
248
     * Retourne l'index du jour de la semaine donné en paramètre.
249
     * ex: monday=1, tuesday=2, etc.
250
     *
251
     * @throws coding_exception A coding exception is thrown when $data parameter is null.
252
     *
253
     * @param string $day Jour de la semaine en anglais ou dans la langue locale de Moodle.
254
     *
255
     * @return int Numéro du jour de la semaine.
256
     */
257
    public static function get_numweekdays($day) {
258
        switch ($day) {
259
            case 'monday':
×
260
                return 1;
×
261
            case 'tuesday':
×
262
                return 2;
×
263
            case 'wednesday':
×
264
                return 3;
×
265
            case 'thursday':
×
266
                return 4;
×
267
            case 'friday':
×
268
                return 5;
×
269
            case 'saturday':
×
270
                return 6;
×
271
            case 'sunday':
×
272
                return 7;
×
273
        }
274

275
        switch ($day) {
276
            case get_string('monday', 'calendar'):
×
277
                return 1;
×
278
            case get_string('tuesday', 'calendar'):
×
279
                return 2;
×
280
            case get_string('wednesday', 'calendar'):
×
281
                return 3;
×
282
            case get_string('thursday', 'calendar'):
×
283
                return 4;
×
284
            case get_string('friday', 'calendar'):
×
285
                return 5;
×
286
            case get_string('saturday', 'calendar'):
×
287
                return 6;
×
288
            case get_string('sunday', 'calendar'):
×
289
                return 7;
×
290
        }
291

292
        throw new coding_exception('Invalid value ('.json_encode(['day' => $day]).' for '.__METHOD__.'.');
×
293
    }
294

295
    /**
296
     * Recherche et instancie des objets depuis la base de données.
297
     *
298
     * @see Se référer à la documentation de la méthode get_records() de la variable globale $DB.
299
     * @param array|null $conditions Critères de sélection des objets.
300
     * @param string     $sort       Champs par lesquels s'effectue le tri.
301
     * @param string     $fields     Liste des champs retournés.
302
     * @param int        $limitfrom  Retourne les enregistrements à partir de n+$limitfrom.
303
     * @param int        $limitnum   Nombre total d'enregistrements retournés.
304
     *
305
     * @return array Un tableau d'objets instanciés.
306
     */
307
    public static function get_records(?array $conditions = null, string $sort = '', string $fields = '*',
308
                                       int $limitfrom = 0, int $limitnum = 0) {
309
        global $DB;
310

311
        $classname = __CLASS__;
×
312

313
        $records = [];
×
314

315
        foreach ($DB->get_records(get_called_class()::TABLENAME, $conditions, $sort, $fields, $limitfrom, $limitnum) as $data) {
×
316
            $record = new $classname();
×
317
            $record->set_vars($data);
×
318
            $records[$record->id] = $record;
×
319
        }
320

321
        return $records;
×
322
    }
323

324
    /**
325
     * Retourne le nombre de secondes écoulées entre le début de la semaine et le début du cours.
326
     *
327
     * @throws coding_exception Lève une exception lorsque la date de début du cours est mal formatée.
328
     *
329
     * @return int
330
     */
331
    public function get_session_offset() {
332
        if (preg_match('/^[0-9][0-9]:[0-9][0-9]$/', $this->starttime) !== 1) {
4✔
333
            throw new coding_exception('Unexpected value of starttime ('.$this->starttime.') for '.__METHOD__.'.');
4✔
334
        }
335

336
        list($hours, $minutes) = explode(':', $this->starttime);
4✔
337

338
        $offset = 0;
4✔
339
        $offset += (($this->numweekday - 1) * 24 * 60 * 60);
4✔
340
        $offset += ($hours * 60 * 60);
4✔
341
        $offset += ($minutes * 60);
4✔
342

343
        return $offset;
4✔
344
    }
345

346
    /**
347
     * Retourne les sessions du cours.
348
     *
349
     * @return array Retourne un tableau d'objets attendancesession.
350
     */
351
    public function get_sessions() {
352
        return attendancesession::get_records(['courseid' => $this->id]);
×
353
    }
354

355
    /**
356
     * Retourne un tableau trié par jour de la semaine et indéxé par le nom du jour en anglais.
357
     *
358
     * @return array Tableau trié et indéxé par le jour de la semaine en anglais.
359
     */
360
    public static function get_weekdays() {
361
        $weekdays = [];
×
362
        $weekdays['monday'] = get_string('monday', 'calendar');
×
363
        $weekdays['tuesday'] = get_string('tuesday', 'calendar');
×
364
        $weekdays['wednesday'] = get_string('wednesday', 'calendar');
×
365
        $weekdays['thursday'] = get_string('thursday', 'calendar');
×
366
        $weekdays['friday'] = get_string('friday', 'calendar');
×
367
        $weekdays['saturday'] = get_string('saturday', 'calendar');
×
368
        $weekdays['sunday'] = get_string('sunday', 'calendar');
×
369

370
        return $weekdays;
×
371
    }
372

373
    /**
374
     * Retourne la durée d'un cours en secondes à partir de son heure de début et son heure de fin.
375
     *
376
     * @param string $starttime Date de début du cours au format hh:mm.
377
     * @param string $endtime   Date de fin du cours au format hh:mm.
378
     *
379
     * @return int|false Durée en secondes du cours, ou false si une erreur est détectée.
380
     */
381
    public static function getDuration(string $starttime, string $endtime) {
382
        $times = [];
×
383
        $times['starttime'] = explode(':', $starttime);
×
384
        $times['endtime'] = explode(':', $endtime);
×
385

386
        foreach ($times as $key => $values) {
×
387
            if (count($values) !== 2) {
×
388
                debugging(__METHOD__.': 2 valeurs attendues pour la variable $'.$key, $level = DEBUG_DEVELOPER);
×
389

390
                return false;
×
391
            }
392

393
            if (ctype_digit($values[0]) === false || ctype_digit($values[1]) === false) {
×
394
                debugging(__METHOD__.': 2 entiers attendus pour la variable $'.$key, $level = DEBUG_DEVELOPER);
×
395

396
                return false;
×
397
            }
398

399
            $times[$key] = $values[0] * 60 * 60 + $values[1] * 60;
×
400
        }
401

402
        $duration = $times['endtime'] - $times['starttime'];
×
403

404
        if ($duration <= 0) {
×
405
            debugging(__METHOD__.': valeur nulle ou négative pour la variable $duration', $level = DEBUG_DEVELOPER);
×
406

407
            return false;
×
408
        }
409

410
        return $duration;
×
411
    }
412

413
    /**
414
     * Charge un objet à partir de son identifiant.
415
     *
416
     * @param int|string $recordid Identifiant de l'objet à charger.
417
     * @param bool       $required Si true, lève une exception lorsque l'objet n'existe pas.
418
                                   Valeur par défaut: false (pas d'exception levée).
419
     *
420
     * @return void
421
     */
422
    public function load($recordid, bool $required = false) {
423
        global $DB;
424

425
        $strictness = IGNORE_MISSING;
4✔
426
        if ($required) {
4✔
427
            $strictness = MUST_EXIST;
×
428
        }
429

430
        $sql = "SELECT c.id, c.shortname, c.fullname, c.category, ac.event, ac.skillid, ac.locationid,
4✔
431
                       ac.numweekday, ac.weekday, ac.starttime, ac.endtime, ac.periodid,
432
                       ac.license, ac.on_homepage, ac.showpolicy, ac.information, ac.informationformat
433
                  FROM {course} c
434
                  JOIN {apsolu_courses} ac ON ac.id=c.id
435
                 WHERE c.id = :id";
4✔
436
        $record = $DB->get_record_sql($sql, ['id' => $recordid], $strictness);
4✔
437

438
        if ($record === false) {
4✔
439
            return;
4✔
440
        }
441

442
        $this->set_vars($record);
4✔
443
    }
444

445
    /**
446
     * Enregistre un objet en base de données.
447
     *
448
     * @throws coding_exception A coding exception is thrown when $data parameter is null.
449
     * @throws dml_exception A DML specific exception is thrown for any errors.
450
     *
451
     * @param object|null $data  StdClass représentant l'objet à enregistrer.
452
     * @param object|null $mform Mform représentant un formulaire Moodle nécessaire à la gestion d'un champ de type editor.
453
     *
454
     * @return void
455
     */
456
    public function save(?object $data = null, ?object $mform = null) {
457
        global $DB;
458

459
        if ($data === null) {
4✔
460
            throw new coding_exception('$data parameter cannot be null for '.__METHOD__.'.');
×
461
        }
462

463
        $this->set_vars($data);
4✔
464
        $this->numweekday = self::get_numweekdays($this->weekday);
4✔
465

466
        // Set fullname.
467
        $this->fullname = self::get_fullname($data->str_category, $this->event, $this->weekday,
4✔
468
            $this->starttime, $this->endtime, $data->str_skill);
4✔
469

470
        // Set shortname.
471
        $this->shortname = self::get_shortname($this->id, $this->fullname);
4✔
472

473
        if (isset($data->idnumber) === true) {
4✔
474
            $this->idnumber = $data->idnumber;
4✔
475
        }
476

477
        // TODO: controler que endtime n'est pas inférieur à startime.
478

479
        // Démarre une transaction, si ce n'est pas déjà fait.
480
        if ($DB->is_transaction_started() === false) {
4✔
481
            $transaction = $DB->start_delegated_transaction();
4✔
482
        }
483

484
        if (empty($this->id) === true) {
4✔
485
            // Créé le cours.
486
            $newcourse = create_course((object)(array)$this);
4✔
487
            $this->id = $newcourse->id;
4✔
488

489
            // Créé l'instance apsolu_courses.
490
            // Note: insert_record() exige l'absence d'un id.
491
            $sql = "INSERT INTO {apsolu_courses} (id, event, skillid, locationid, weekday, numweekday, starttime, endtime,
4✔
492
                                                  periodid, license, on_homepage, showpolicy, information, informationformat)
493
                                          VALUES (:id, :event, :skillid, :locationid, :weekday, :numweekday, :starttime, :endtime,
494
                                                  :periodid, :license, :onhomepage, :showpolicy, :information, :informationformat)";
4✔
495
            $params = [];
4✔
496
            $params['id'] = $this->id;
4✔
497
            $params['event'] = $this->event;
4✔
498
            $params['skillid'] = $this->skillid;
4✔
499
            $params['locationid'] = $this->locationid;
4✔
500
            $params['weekday'] = $this->weekday;
4✔
501
            $params['numweekday'] = $this->numweekday;
4✔
502
            $params['starttime'] = $this->starttime;
4✔
503
            $params['endtime'] = $this->endtime;
4✔
504
            $params['periodid'] = $this->periodid;
4✔
505
            $params['license'] = $this->license;
4✔
506
            $params['onhomepage'] = $this->on_homepage;
4✔
507
            $params['showpolicy'] = $this->showpolicy;
4✔
508
            $params['information'] = $this->information;
4✔
509
            $params['informationformat'] = $this->informationformat;
4✔
510
            $DB->execute($sql, $params);
4✔
511

512
            // Ajoute une méthode d'inscription manuelle.
513
            $instance = $DB->get_record('enrol', ['enrol' => 'manual', 'courseid' => $this->id]);
4✔
514
            if ($instance === false) {
4✔
515
                $plugin = enrol_get_plugin('manual');
×
516

517
                $fields = $plugin->get_instance_defaults();
×
518

519
                $instance = new stdClass();
×
520
                $instance->id = $plugin->add_instance($newcourse, $fields);
×
521
            }
522

523
            // Ajoute le bloc apsolu_course.
524
            $blocktype = 'apsolu_course';
4✔
525
            $context = context_course::instance($this->id, MUST_EXIST);
4✔
526

527
            $blockinstance = new stdClass();
4✔
528
            $blockinstance->blockname = $blocktype;
4✔
529
            $blockinstance->parentcontextid = $context->id;
4✔
530
            $blockinstance->showinsubcontexts = 0;
4✔
531
            $blockinstance->pagetypepattern = 'course-view-*';
4✔
532
            $blockinstance->subpagepattern = null;
4✔
533
            $blockinstance->defaultregion = 'side-pre'; // Dans la colonne de gauche.
4✔
534
            $blockinstance->defaultweight = -1; // Avant le bloc "Paramètres du cours".
4✔
535
            $blockinstance->configdata = '';
4✔
536
            $blockinstance->timecreated = time();
4✔
537
            $blockinstance->timemodified = time();
4✔
538
            $blockinstance->id = $DB->insert_record('block_instances', $blockinstance);
4✔
539

540
            // Ensure the block context is created.
541
            context_block::instance($blockinstance->id);
4✔
542

543
            // If the new instance was created, allow it to do additional setup.
544
            $block = block_instance($blocktype, $blockinstance);
4✔
545
            $block->instance_create();
4✔
546

547
            // Génére les sessions de cours.
548
            $this->set_sessions();
4✔
549
        } else {
550
            $oldcourse = new course();
4✔
551
            $oldcourse->load($this->id, $required = true);
4✔
552

553
            update_course((object)(array)$this);
4✔
554

555
            $DB->update_record(self::TABLENAME, $this);
4✔
556

557
            // Vérifie que les informations liées aux sessions de cours n'ont pas été modifiées.
558
            $sessionfields = ['locationid', 'weekday', 'numweekday', 'starttime', 'endtime', 'periodid'];
4✔
559
            foreach ($sessionfields as $field) {
4✔
560
                if ($oldcourse->{$field} == $this->{$field}) {
4✔
561
                    continue;
4✔
562
                }
563

564
                // Génère les sessions de cours.
565
                $this->set_sessions();
×
566
                break;
×
567
            }
568
        }
569

570
        // Trie les cours de la catégorie.
571
        $category = core_course_category::get((int) $this->category);
4✔
572
        if ($category->can_resort_courses()) {
4✔
573
            \core_course\management\helper::action_category_resort_courses($category, $sort = 'fullname');
4✔
574
        }
575

576
        // Valide la transaction en cours.
577
        if (isset($transaction) === true) {
4✔
578
            $transaction->allow_commit();
4✔
579
        }
580
    }
581

582
    /**
583
     * Génère ou met à jour le carnet de notes.
584
     *
585
     * @param bool $rescalegrades Témoin indiquant si la note doit être ajustée lorsque la note maximale attendue change.
586
     *
587
     * @return void
588
     */
589
    public function set_gradebook($rescalegrades = false) {
590
        global $DB;
591

592
        // Récupère tous les éléments de notation prévus pour ce cours.
593
        $sql = "SELECT agi.*
×
594
                  FROM {apsolu_grade_items} agi
595
                  JOIN {enrol} e ON agi.calendarid = e.customchar1
596
                 WHERE e.enrol = 'select'
597
                   AND e.courseid = :courseid";
×
598
        $coursegradeitems = $DB->get_records_sql($sql, ['courseid' => $this->id]);
×
599

600
        // Récupère tous les élements de notation actuels de ce cours.
601
        $gradeitems = grade_item::fetch_all(['courseid' => $this->id, 'iteminfo' => gradebook::NAME]);
×
602

603
        if ($gradeitems === false) {
×
604
            $gradeitems = [];
×
605
        }
606

607
        foreach ($gradeitems as $item) {
×
608
            list($apsolugradeid, $itemname) = explode('-', $item->itemname, 2);
×
609

610
            if (isset($coursegradeitems[$apsolugradeid]) === false) {
×
611
                // Supprime un élément de notation obsolète.
612
                $item->delete();
×
613
                continue;
×
614
            }
615

616
            $gradeitem = $coursegradeitems[$apsolugradeid];
×
617
            unset($coursegradeitems[$apsolugradeid]);
×
618

619
            // Met à jour le nom de l'élément de notation.
620
            $item->iteminfo = 'APSOLU';
×
621
            $item->itemname = $gradeitem->id.'-'.$gradeitem->name;
×
622
            $item->set_hidden($gradeitem->publicationdate);
×
623
            $oldmax = $item->grademax;
×
624
            $item->grademax = $gradeitem->grademax;
×
625
            if ($rescalegrades === true) {
×
626
                $oldmin = 0;
×
627
                $newmin = 0;
×
628
                $newmax = $item->grademax;
×
629
                $source = gradebook::SOURCE;
×
630
                $item->rescale_grades_keep_percentage($oldmin, $oldmax, $newmin, $newmax, $source);
×
631
            }
632
            $item->update();
×
633
        }
634

635
        // Enregistre les nouveaux éléments dans le carnet de notes.
636
        $rootcategory = grade_category::fetch_course_category($this->id);
×
637

638
        foreach ($coursegradeitems as $item) {
×
639
            $gradeitem = new grade_item(['id' => 0, 'courseid' => $this->id]);
×
640
            $gradeitem->iteminfo = gradebook::NAME;
×
641
            $gradeitem->itemname = $item->id.'-'.$item->name;
×
642
            $gradeitem->itemtype = 'manual';
×
643
            $gradeitem->categoryid = $rootcategory->id;
×
644
            $gradeitem->hidden = $gradeitem->hidden;
×
645
            $gradeitem->grademax = $gradeitem->grademax;
×
646
            $gradeitem->id = $gradeitem->insert();
×
647
        }
648
    }
649

650
    /**
651
     * Génère les sessions du cours.
652
     *
653
     * @return void
654
     */
655
    public function set_sessions() {
656
        // Récupère le nombre de secondes entre le début de la semaine et la date de début du cours.
657
        $offset = $this->get_session_offset();
4✔
658

659
        $sessions = [];
4✔
660

661
        // Récupère les sessions prévues pour cette période.
662
        $period = new period();
4✔
663
        $period->load($this->periodid);
4✔
664
        foreach ($period->get_sessions($offset) as $sessiontime => $session) {
4✔
665
            if ($session->is_expired() === true && defined('APSOLU_DEMO') === false) {
4✔
666
                // On retire de la sélection toutes les sessions déjà passées.
667
                continue;
4✔
668
            }
669

670
            $sessions[$sessiontime] = $session;
4✔
671
        }
672

673
        // Récupère les sessions actuellement définies en base de données pour ce cours.
674
        foreach ($this->get_sessions() as $sessionid => $session) {
4✔
675
            $sessiontime = $session->sessiontime;
4✔
676

677
            if (isset($sessions[$sessiontime]) === true) {
4✔
678
                // La session existe déjà en base de données.
679
                $sessions[$sessiontime] = $session;
4✔
680
                continue;
4✔
681
            }
682

683
            if ($session->is_expired() === true) {
4✔
684
                // On conserve toutes les sessions passées.
685
                $sessions[$sessiontime] = $session;
4✔
686
                continue;
4✔
687
            }
688

689
            // Toutes les autres sessions, on les supprime.
690
            $session->delete();
4✔
691
        }
692

693
        // On procède à l'enregistrement des nouvelles sessions.
694
        $count = 0;
4✔
695
        ksort($sessions);
4✔
696
        foreach ($sessions as $sessiontime => $session) {
4✔
697
            $count++;
4✔
698

699
            if ($session->is_expired() === true && defined('APSOLU_DEMO') === false) {
4✔
700
                // On ne modifie jamais les sessions passées.
701
                continue;
4✔
702
            }
703

704
            $sessionid = $session->id;
4✔
705
            $sessionname = $session->name;
4✔
706

707
            $session->set_name($count);
4✔
708

709
            if ($sessionid !== 0 && $sessionname === $session->name && $session->locationid === $this->locationid) {
4✔
710
                // La session n'est pas nouvelle, le nom et le lieu sont identiques.
711
                continue;
×
712
            }
713

714
            $session->courseid = $this->id;
4✔
715
            $session->activityid = $this->category; // TODO: supprimer ce champ. Note: category ne semble pas être défini,
4✔
716
                                                    // provoquant une initialisation à 0 en base de données.
717
            $session->locationid = $this->locationid;
4✔
718
            if ($sessionid === 0) {
4✔
719
                $session->timecreated = time();
4✔
720
            }
721
            $session->timemodified = time();
4✔
722
            $session->save();
4✔
723
        }
724
    }
725

726
    /**
727
     * Change la visibilité du cours.
728
     *
729
     * La valeur de retour 1 indique que le cours est visible à la fin de l'exécution de la fonction.
730
     * La valeur de retour 0 indique que le cours est masqué.
731
     *
732
     * @param int|string $courseid Identifiant du cours.
733
     *
734
     * @return int Retourne un entier représentant la visibilité du cours
735
     */
736
    public static function toggle_visibility($courseid) {
737
        $course = new \core_course_list_element(get_course($courseid));
4✔
738

739
        if (empty($course->visible) === true) {
4✔
740
            \core_course\management\helper::action_course_show($course);
4✔
741
            return 1;
4✔
742
        }
743

744
        \core_course\management\helper::action_course_hide($course);
4✔
745
        return 0;
4✔
746
    }
747
}
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