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

apsolu / local_apsolu / 18468445848

13 Oct 2025 02:06PM UTC coverage: 9.418% (+0.2%) from 9.224%
18468445848

push

github

jboulen
refactor(core): applique des corrections pour le nouveau coding style de Moodle

69 of 875 new or added lines in 51 files covered. (7.89%)

47 existing lines in 11 files now uncovered.

557 of 5914 relevant lines covered (9.42%)

0.12 hits per line

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

50.55
/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, 'local_apsolu'). */
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) {
1✔
127
            $transaction = $DB->start_delegated_transaction();
1✔
128
        }
129

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

133
        // Supprime les sessions du cours.
134
        foreach ($this->get_sessions() as $session) {
1✔
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);
1✔
140
        $result = delete_course($course, $showfeedback = false);
1✔
141

142
        if ($result === false) {
1✔
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]);
1✔
150

151
        // TODO: supprimer les notes.
152

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

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

161
        return true;
1✔
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() {
NEW
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

NEW
208
        $strtime = get_string($weekday, 'local_apsolu') . ' ' . $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', 'local_apsolu'):
×
277
                return 1;
×
278
            case get_string('tuesday', 'local_apsolu'):
×
279
                return 2;
×
280
            case get_string('wednesday', 'local_apsolu'):
×
281
                return 3;
×
282
            case get_string('thursday', 'local_apsolu'):
×
283
                return 4;
×
284
            case get_string('friday', 'local_apsolu'):
×
285
                return 5;
×
286
            case get_string('saturday', 'local_apsolu'):
×
287
                return 6;
×
288
            case get_string('sunday', 'local_apsolu'):
×
289
                return 7;
×
290
        }
291

NEW
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(
308
        ?array $conditions = null,
309
        string $sort = '',
310
        string $fields = '*',
311
        int $limitfrom = 0,
312
        int $limitnum = 0
313
    ) {
314
        global $DB;
315

316
        $classname = __CLASS__;
×
317

318
        $records = [];
×
319

320
        foreach ($DB->get_records(get_called_class()::TABLENAME, $conditions, $sort, $fields, $limitfrom, $limitnum) as $data) {
×
321
            $record = new $classname();
×
322
            $record->set_vars($data);
×
323
            $records[$record->id] = $record;
×
324
        }
325

326
        return $records;
×
327
    }
328

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

341
        [$hours, $minutes] = explode(':', $this->starttime);
1✔
342

343
        $offset = 0;
1✔
344
        $offset += (($this->numweekday - 1) * 24 * 60 * 60);
1✔
345
        $offset += ($hours * 60 * 60);
1✔
346
        $offset += ($minutes * 60);
1✔
347

348
        return $offset;
1✔
349
    }
350

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

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

375
        return $weekdays;
×
376
    }
377

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

391
        foreach ($times as $key => $values) {
×
392
            if (count($values) !== 2) {
×
NEW
393
                debugging(__METHOD__ . ': 2 valeurs attendues pour la variable $' . $key, $level = DEBUG_DEVELOPER);
×
394

395
                return false;
×
396
            }
397

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

401
                return false;
×
402
            }
403

404
            $times[$key] = $values[0] * 60 * 60 + $values[1] * 60;
×
405
        }
406

407
        $duration = $times['endtime'] - $times['starttime'];
×
408

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

412
            return false;
×
413
        }
414

415
        return $duration;
×
416
    }
417

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

430
        $strictness = IGNORE_MISSING;
1✔
431
        if ($required) {
1✔
432
            $strictness = MUST_EXIST;
×
433
        }
434

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

443
        if ($record === false) {
1✔
444
            return;
1✔
445
        }
446

447
        $this->set_vars($record);
1✔
448
    }
449

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

464
        if ($data === null) {
1✔
NEW
465
            throw new coding_exception('$data parameter cannot be null for ' . __METHOD__ . '.');
×
466
        }
467

468
        $this->set_vars($data);
1✔
469
        $this->numweekday = self::get_numweekdays($this->weekday);
1✔
470

471
        // Set fullname.
472
        $this->fullname = self::get_fullname(
1✔
473
            $data->str_category,
1✔
474
            $this->event,
1✔
475
            $this->weekday,
1✔
476
            $this->starttime,
1✔
477
            $this->endtime,
1✔
478
            $data->str_skill
1✔
479
        );
1✔
480

481
        // Set shortname.
482
        $this->shortname = self::get_shortname($this->id, $this->fullname);
1✔
483

484
        if (isset($data->idnumber) === true) {
1✔
485
            $this->idnumber = $data->idnumber;
1✔
486
        }
487

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

490
        // Démarre une transaction, si ce n'est pas déjà fait.
491
        if ($DB->is_transaction_started() === false) {
1✔
492
            $transaction = $DB->start_delegated_transaction();
1✔
493
        }
494

495
        if (empty($this->id) === true) {
1✔
496
            // Créé le cours.
497
            $newcourse = create_course((object)(array)$this);
1✔
498
            $this->id = $newcourse->id;
1✔
499

500
            // Créé l'instance apsolu_courses.
501
            // Note: insert_record() exige l'absence d'un id.
502
            $sql = "INSERT INTO {apsolu_courses} (id, event, skillid, locationid, weekday, numweekday, starttime, endtime,
1✔
503
                                                  periodid, license, on_homepage, showpolicy, information, informationformat)
504
                                          VALUES (:id, :event, :skillid, :locationid, :weekday, :numweekday, :starttime, :endtime,
505
                                                  :periodid, :license, :onhomepage, :showpolicy, :information, :informationformat)";
1✔
506
            $params = [];
1✔
507
            $params['id'] = $this->id;
1✔
508
            $params['event'] = $this->event;
1✔
509
            $params['skillid'] = $this->skillid;
1✔
510
            $params['locationid'] = $this->locationid;
1✔
511
            $params['weekday'] = $this->weekday;
1✔
512
            $params['numweekday'] = $this->numweekday;
1✔
513
            $params['starttime'] = $this->starttime;
1✔
514
            $params['endtime'] = $this->endtime;
1✔
515
            $params['periodid'] = $this->periodid;
1✔
516
            $params['license'] = $this->license;
1✔
517
            $params['onhomepage'] = $this->on_homepage;
1✔
518
            $params['showpolicy'] = $this->showpolicy;
1✔
519
            $params['information'] = $this->information;
1✔
520
            $params['informationformat'] = $this->informationformat;
1✔
521
            $DB->execute($sql, $params);
1✔
522

523
            // Ajoute une méthode d'inscription manuelle.
524
            $instance = $DB->get_record('enrol', ['enrol' => 'manual', 'courseid' => $this->id]);
1✔
525
            if ($instance === false) {
1✔
526
                $plugin = enrol_get_plugin('manual');
×
527

528
                $fields = $plugin->get_instance_defaults();
×
529

530
                $instance = new stdClass();
×
531
                $instance->id = $plugin->add_instance($newcourse, $fields);
×
532
            }
533

534
            // Ajoute le bloc apsolu_course.
535
            $blocktype = 'apsolu_course';
1✔
536
            $context = context_course::instance($this->id, MUST_EXIST);
1✔
537

538
            $blockinstance = new stdClass();
1✔
539
            $blockinstance->blockname = $blocktype;
1✔
540
            $blockinstance->parentcontextid = $context->id;
1✔
541
            $blockinstance->showinsubcontexts = 0;
1✔
542
            $blockinstance->pagetypepattern = 'course-view-*';
1✔
543
            $blockinstance->subpagepattern = null;
1✔
544
            $blockinstance->defaultregion = 'side-pre'; // Dans la colonne de gauche.
1✔
545
            $blockinstance->defaultweight = -1; // Avant le bloc "Paramètres du cours".
1✔
546
            $blockinstance->configdata = '';
1✔
547
            $blockinstance->timecreated = time();
1✔
548
            $blockinstance->timemodified = time();
1✔
549
            $blockinstance->id = $DB->insert_record('block_instances', $blockinstance);
1✔
550

551
            // Ensure the block context is created.
552
            context_block::instance($blockinstance->id);
1✔
553

554
            // If the new instance was created, allow it to do additional setup.
555
            $block = block_instance($blocktype, $blockinstance);
1✔
556
            $block->instance_create();
1✔
557

558
            // Génére les sessions de cours.
559
            $this->set_sessions();
1✔
560
        } else {
561
            $oldcourse = new course();
1✔
562
            $oldcourse->load($this->id, $required = true);
1✔
563

564
            update_course((object)(array)$this);
1✔
565

566
            $DB->update_record(self::TABLENAME, $this);
1✔
567

568
            // Vérifie que les informations liées aux sessions de cours n'ont pas été modifiées.
569
            $sessionfields = ['locationid', 'weekday', 'numweekday', 'starttime', 'endtime', 'periodid'];
1✔
570
            foreach ($sessionfields as $field) {
1✔
571
                if ($oldcourse->{$field} == $this->{$field}) {
1✔
572
                    continue;
1✔
573
                }
574

575
                // Génère les sessions de cours.
576
                $this->set_sessions();
×
577
                break;
×
578
            }
579
        }
580

581
        // Trie les cours de la catégorie.
582
        $category = core_course_category::get((int) $this->category);
1✔
583
        if ($category->can_resort_courses()) {
1✔
584
            \core_course\management\helper::action_category_resort_courses($category, $sort = 'fullname');
1✔
585
        }
586

587
        // Valide la transaction en cours.
588
        if (isset($transaction) === true) {
1✔
589
            $transaction->allow_commit();
1✔
590
        }
591
    }
592

593
    /**
594
     * Génère ou met à jour le carnet de notes.
595
     *
596
     * @param bool $rescalegrades Témoin indiquant si la note doit être ajustée lorsque la note maximale attendue change.
597
     *
598
     * @return void
599
     */
600
    public function set_gradebook($rescalegrades = false) {
601
        global $DB;
602

603
        // Récupère tous les éléments de notation prévus pour ce cours.
604
        $sql = "SELECT agi.*
×
605
                  FROM {apsolu_grade_items} agi
606
                  JOIN {enrol} e ON agi.calendarid = e.customchar1
607
                 WHERE e.enrol = 'select'
608
                   AND e.courseid = :courseid";
×
609
        $coursegradeitems = $DB->get_records_sql($sql, ['courseid' => $this->id]);
×
610

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

614
        if ($gradeitems === false) {
×
615
            $gradeitems = [];
×
616
        }
617

618
        foreach ($gradeitems as $item) {
×
NEW
619
            [$apsolugradeid, $itemname] = explode('-', $item->itemname, 2);
×
620

621
            if (isset($coursegradeitems[$apsolugradeid]) === false) {
×
622
                // Supprime un élément de notation obsolète.
623
                $item->delete();
×
624
                continue;
×
625
            }
626

627
            $gradeitem = $coursegradeitems[$apsolugradeid];
×
628
            unset($coursegradeitems[$apsolugradeid]);
×
629

630
            // Met à jour le nom de l'élément de notation.
631
            $item->iteminfo = 'APSOLU';
×
NEW
632
            $item->itemname = $gradeitem->id . '-' . $gradeitem->name;
×
633
            $item->set_hidden($gradeitem->publicationdate);
×
634
            $oldmax = $item->grademax;
×
635
            $item->grademax = $gradeitem->grademax;
×
636
            if ($rescalegrades === true) {
×
637
                $oldmin = 0;
×
638
                $newmin = 0;
×
639
                $newmax = $item->grademax;
×
640
                $source = gradebook::SOURCE;
×
641
                $item->rescale_grades_keep_percentage($oldmin, $oldmax, $newmin, $newmax, $source);
×
642
            }
643
            $item->update();
×
644
        }
645

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

649
        foreach ($coursegradeitems as $item) {
×
650
            $gradeitem = new grade_item(['id' => 0, 'courseid' => $this->id]);
×
651
            $gradeitem->iteminfo = gradebook::NAME;
×
NEW
652
            $gradeitem->itemname = $item->id . '-' . $item->name;
×
653
            $gradeitem->itemtype = 'manual';
×
654
            $gradeitem->categoryid = $rootcategory->id;
×
655
            $gradeitem->hidden = $gradeitem->hidden;
×
656
            $gradeitem->grademax = $gradeitem->grademax;
×
657
            $gradeitem->id = $gradeitem->insert();
×
658
        }
659
    }
660

661
    /**
662
     * Génère les sessions du cours.
663
     *
664
     * @return void
665
     */
666
    public function set_sessions() {
667
        // Récupère le nombre de secondes entre le début de la semaine et la date de début du cours.
668
        $offset = $this->get_session_offset();
1✔
669

670
        $sessions = [];
1✔
671

672
        // Récupère les sessions prévues pour cette période.
673
        $period = new period();
1✔
674
        $period->load($this->periodid);
1✔
675
        foreach ($period->get_sessions($offset) as $sessiontime => $session) {
1✔
676
            if ($session->is_expired() === true && defined('APSOLU_DEMO') === false) {
1✔
677
                // On retire de la sélection toutes les sessions déjà passées.
678
                continue;
1✔
679
            }
680

681
            $sessions[$sessiontime] = $session;
1✔
682
        }
683

684
        // Récupère les sessions actuellement définies en base de données pour ce cours.
685
        foreach ($this->get_sessions() as $sessionid => $session) {
1✔
686
            $sessiontime = $session->sessiontime;
1✔
687

688
            if (isset($sessions[$sessiontime]) === true) {
1✔
689
                // La session existe déjà en base de données.
690
                $sessions[$sessiontime] = $session;
1✔
691
                continue;
1✔
692
            }
693

694
            if ($session->is_expired() === true) {
1✔
695
                // On conserve toutes les sessions passées.
696
                $sessions[$sessiontime] = $session;
1✔
697
                continue;
1✔
698
            }
699

700
            // Toutes les autres sessions, on les supprime.
701
            $session->delete();
1✔
702
        }
703

704
        // On procède à l'enregistrement des nouvelles sessions.
705
        $count = 0;
1✔
706
        ksort($sessions);
1✔
707
        foreach ($sessions as $sessiontime => $session) {
1✔
708
            $count++;
1✔
709

710
            if ($session->is_expired() === true && defined('APSOLU_DEMO') === false) {
1✔
711
                // On ne modifie jamais les sessions passées.
712
                continue;
1✔
713
            }
714

715
            $sessionid = $session->id;
1✔
716
            $sessionname = $session->name;
1✔
717

718
            $session->set_name($count);
1✔
719

720
            if ($sessionid !== 0 && $sessionname === $session->name && $session->locationid === $this->locationid) {
1✔
721
                // La session n'est pas nouvelle, le nom et le lieu sont identiques.
722
                continue;
×
723
            }
724

725
            $session->courseid = $this->id;
1✔
726
            $session->activityid = $this->category; // TODO: supprimer ce champ. Note: category ne semble pas être défini,
1✔
727
                                                    // provoquant une initialisation à 0 en base de données.
728
            $session->locationid = $this->locationid;
1✔
729
            if ($sessionid === 0) {
1✔
730
                $session->timecreated = time();
1✔
731
            }
732
            $session->timemodified = time();
1✔
733
            $session->save();
1✔
734
        }
735
    }
736

737
    /**
738
     * Change la visibilité du cours.
739
     *
740
     * La valeur de retour 1 indique que le cours est visible à la fin de l'exécution de la fonction.
741
     * La valeur de retour 0 indique que le cours est masqué.
742
     *
743
     * @param int|string $courseid Identifiant du cours.
744
     *
745
     * @return int Retourne un entier représentant la visibilité du cours
746
     */
747
    public static function toggle_visibility($courseid) {
748
        $course = new \core_course_list_element(get_course($courseid));
1✔
749

750
        if (empty($course->visible) === true) {
1✔
751
            \core_course\management\helper::action_course_show($course);
1✔
752
            return 1;
1✔
753
        }
754

755
        \core_course\management\helper::action_course_hide($course);
1✔
756
        return 0;
1✔
757
    }
758
}
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