Gestion du planning
Pour gérer le planning, il faut les éléments suivants :
- une variable $planning indique où se trouve le planning de l'année en cours (partie qui change chaque année), cette variable doit être définit dans l'aiguilleur (le fichier index.php,
- un fichier planning.php qui s'occupe d'afficher le planning (partie fixe et indépendante de l'année),
- un fichier synthese-enseignements.php qui s'occupe de générer une synthèse des heures effectuées par les enseignants (bien utile pour déclarer les heures),
Vous pouvez voir le rendu de l'exemple de planning décrit sur cette page ici.
Le planning de l'année en cours
La construction d'un planning pour une année est relativement naturelle. Vous pouvez vous inspirer librement de l'exemple suivant qui utilise toutes les fonctionnalités, y compris celle permettant de modifier les enseignants ou les salles pour certaines séances.
<?php
//
// La plupart des enseignants sont déjà dans infra-web-cours/infra-web-cours/new/teachers.php
// et ce fichier est inclus sans que vous n'ayez rien à faire.
// N'hésitez pas à me demander si vous voulez ajouter des enseignants.
//
// J'ai ajouté des enseignants ici pour avoir des noms rigolos (et indépendants du fichier teachers.php)
//
$camille = new Teacher('Camille la Chenille', 'camille.la-chenille at telecom-sudparis.eu');
$loulou = new Teacher('Loulou le Pou', 'loulou.le-pou at telecom-sudparis.eu');
$mireille = new Teacher('Mireille l\'Abeille', 'mireille.l-abeille at telecom-sudparis.eu');
$simeon = new Teacher('Siméon le Papillon', 'simeon.le-papillon at telecom-sudparis.eu');
$carole = new Teacher('Carole la Luciole', 'carole.la-luciole at telecom-sudparis.eu');
$lulu = new Teacher('Lulu la Tortue', 'lulu.la-tortue at telecom-sudparis.eu');
$marie = new Teacher('Marie la fourmi', 'larie.la-fourmi at telecom-sudparis.eu');
$patouch = new Teacher('Patouch la mouche', 'Patouch.la-mouche at telecom-sudparis.eu');
$benjamin = new Teacher('Benjamin le lutin', 'benjamin.le-lutin at telecom-sudparis.eu');
$leonard = new Teacher('Léonard le têtard', 'léonard.le-têtard at telecom-sudparis.eu');
$victor = new Teacher('Victor le castor', 'victor.le-castor at telecom-sudparis.eu');
$oscar = new Teacher('Oscar le cafard', 'oscar.le-cafard at telecom-sudparis.eu');
$adrien = new Teacher('Adrien le lapin', 'adrien.le-lapin at telecom-sudparis.eu');
//
// En argument: l'année (n'importe quelle chaîne de caractères) suivie des responsables du module
//
$schedule = new Schedule("2019/2020", $camille, $loulou);
//
// Première étape : on cré les groupes
// La couleur est obligatoire, elle permet de rendre le planning à peu près lisible
//
$gA = $schedule->createGroup('A', 'Cyan', 'B02', $mireille, $oscar);
$gB = $schedule->createGroup('B', 'Cornsilk', 'B02', $simeon, $oscar);
$gC = $schedule->createGroup('C', 'LightPink', 'B06', $carole, $tba); // $tba veut dire "to be anounced"
$gD = $schedule->createGroup('D', 'Khaki', 'B07', $lulu); // pas d'assistant dans ce groupe
$gE = $schedule->createGroup('E', 'PaleGreen', 'B02', $marie, $oscar);
$gF = $schedule->createGroup('F', 'PeachPuff', 'B03', $patouch, $tba);
$gG = $schedule->createGroup('G', 'PowderBlue', 'B06', $benjamin, $oscar);
$gH = $schedule->createGroup('H', 'Thistle', 'B07', $leonard, $tba);
$gI = $schedule->createGroup('I', 'Cornsilk', 'B111', $victor, $oscar);
//
// Seconde étape : on cré les regroupement de groupes qui ont des cours au même moment
//
$g1 = [ $gA, $gB, $gC, $gD ];
$g2 = [ $gE, $gF, $gG, $gH, $gI ];
//
// Troisième étape : on cré les créneaux
//
// Arguments: jour, debut, fin, nombre-enseignants, debut, fin, nombre-enseignants, ...
//
$cm1 = new Slot('17/9/2019', '8:15', '11:15', 1); // un seul long créneau de 3h
$ci1g1 = new Slot('19/9/2019', '8:15', '9:45', 1, '10:00', '11:30', 2); // deux petits créneaux de 1h30 chacun
$ci1g2 = new Slot('17/9/2019', '12:45', '14:15', 1, '14:30', '16:00', 2);
$ci2g1 = new Slot('26/9/2019', '8:15', '9:45', 1, '10:00', '11:30', 2);
$ci2g2 = new Slot('25/9/2019', '12:45', '14:15', 1, '14:30', '16:00', 2);
$ci3g1 = new Slot('2/10/2019', '8:15', '9:45', 1, '10:00', '11:30', 2);
$ci3g2 = new Slot('3/10/2019', '8:15', '9:45', 1, '10:00', '11:30', 2);
$ci4g1 = new Slot('9/10/2019', '8:15', '9:45', 1, '10:00', '11:30', 2);
$ci4g2 = new Slot('10/10/2019', '8:15', '9:45', 1, '10:00', '11:30', 2);
$ci5g1 = new Slot('16/10/2019', '14:30', '16:00', 1, '16:15', '17:45', 2);
$ci5g2 = new Slot('17/10/2019', '8:15', '9:45', 1, '10:00', '11:30', 2);
$ci6g1 = new Slot('23/10/2019', '8:15', '9:45', 1, '10:00', '13:00', 2);
$ci6g2 = new Slot('5/11/2019', '8:15', '9:45', 1, '10:00', '13:00', 2);
$ci7g1 = new Slot('6/11/2019', '8:15', '9:45', 1, '10:00', '11:30', 2);
$ci7g2 = new Slot('7/11/2019', '8:15', '9:45', 1, '10:00', '11:30', 2);
$ci8g1 = new Slot('20/11/2019', '8:15', '9:45', 1, '10:00', '11:30', 2);
$ci8g2 = new Slot('21/11/2019', '8:15', '9:45', 1, '10:00', '11:30', 2);
$ci9g1 = new Slot('27/11/2019', '8:15', '9:45', 1, '10:00', '11:30', 2);
$ci9g2 = new Slot('28/11/2019', '8:15', '9:45', 1, '10:00', '11:30', 2);
$cf1 = new Slot('13/12/2019', '8:30', '11:30', 12);
$cf2 = new Slot(null, null, null, 2); // on ne connait pas encore l'horaire
//
// Troisième étape : on crée les cours
//
$schedule->createBloc('CM1') // le cours CM1
->add($cm1, 'Promo', 'LightGray', 'Amphi 10', $adrien); // un seul group avec toute la promo
$schedule->createBloc('CI1') // le cours CI1
->addGroups($ci1g1, $g1) // avec un créneau pour les groupes A, B, C, D
->addGroups($ci1g2, $g2); // et un créneau pour les groupes E, F, G, H, I
$schedule->createBloc('CI2') // le cours CI2
->addGroups($ci2g1, $g1) // avec un créneau pour les groupes A, B, C, D
->addGroups($ci2g2, $g2) // et un créneau pour les groupes E, F, G, H, I
->setRoom($gA, 'Sur la Lune') // pour ce cours, on change la salle du groupe A
->setRoom($gB, 'Sur Mars', 1) // et ici, uniquement la salle pour le seconde créneau
->setTeachers($gC, $camille, $loulou) // remplace les enseignants pour les deux créneaux du groupe F
->replaceTeacher($gD, 1, 1, $mireille) // remplace le second enseignant du second créneau
->addTeacher($gE, 1, $camille) // ajoute un troisième enseignant au second créneau
->setTeachersAt($gF, 1, $simeon) // remplace tous les enseignants du second créneau
;
$schedule->createBloc('CI3') // etc...
->addGroups($ci3g1, $g1)
->addGroups($ci3g2, $g2);
$schedule->createBloc('CI4')
->addGroups($ci4g1, $g1)
->addGroups($ci4g2, $g2);
$schedule->createBloc('CI5')
->addGroups($ci5g1, $g1)
->addGroups($ci5g2, $g2);
$schedule->createBloc('CI6')
->addGroups($ci6g1, $g1)
->addGroups($ci6g2, $g2);
$schedule->createBloc('CI7')
->addGroups($ci7g1, $g1)
->addGroups($ci7g2, $g2);
$schedule->createBloc('CI8')
->addGroups($ci8g1, $g1)
->addGroups($ci8g2, $g2);
$schedule->createBloc('CI9')
->addGroups($ci9g1, $g1)
->addGroups($ci9g2, $g2);
$schedule->createBloc('CF1') // le CF1 avec plein de surveillants
->add($cf1, 'Promo', 'LightGray', 'E010/E011',
$camille, $loulou, $mireille, $simeon, $carole, $lulu,
$marie, $patouch, $benjamin, $leonard, $victor, $oscar);
$schedule->createBloc('CF2') // et le CF2, on ne connait pas grand chose, mais on sait qu'il existe
->add($cf2, 'Promo', 'LightGray', '???', $adrien, $tba);
?>
//
// La plupart des enseignants sont déjà dans infra-web-cours/infra-web-cours/new/teachers.php
// et ce fichier est inclus sans que vous n'ayez rien à faire.
// N'hésitez pas à me demander si vous voulez ajouter des enseignants.
//
// J'ai ajouté des enseignants ici pour avoir des noms rigolos (et indépendants du fichier teachers.php)
//
$camille = new Teacher('Camille la Chenille', 'camille.la-chenille at telecom-sudparis.eu');
$loulou = new Teacher('Loulou le Pou', 'loulou.le-pou at telecom-sudparis.eu');
$mireille = new Teacher('Mireille l\'Abeille', 'mireille.l-abeille at telecom-sudparis.eu');
$simeon = new Teacher('Siméon le Papillon', 'simeon.le-papillon at telecom-sudparis.eu');
$carole = new Teacher('Carole la Luciole', 'carole.la-luciole at telecom-sudparis.eu');
$lulu = new Teacher('Lulu la Tortue', 'lulu.la-tortue at telecom-sudparis.eu');
$marie = new Teacher('Marie la fourmi', 'larie.la-fourmi at telecom-sudparis.eu');
$patouch = new Teacher('Patouch la mouche', 'Patouch.la-mouche at telecom-sudparis.eu');
$benjamin = new Teacher('Benjamin le lutin', 'benjamin.le-lutin at telecom-sudparis.eu');
$leonard = new Teacher('Léonard le têtard', 'léonard.le-têtard at telecom-sudparis.eu');
$victor = new Teacher('Victor le castor', 'victor.le-castor at telecom-sudparis.eu');
$oscar = new Teacher('Oscar le cafard', 'oscar.le-cafard at telecom-sudparis.eu');
$adrien = new Teacher('Adrien le lapin', 'adrien.le-lapin at telecom-sudparis.eu');
//
// En argument: l'année (n'importe quelle chaîne de caractères) suivie des responsables du module
//
$schedule = new Schedule("2019/2020", $camille, $loulou);
//
// Première étape : on cré les groupes
// La couleur est obligatoire, elle permet de rendre le planning à peu près lisible
//
$gA = $schedule->createGroup('A', 'Cyan', 'B02', $mireille, $oscar);
$gB = $schedule->createGroup('B', 'Cornsilk', 'B02', $simeon, $oscar);
$gC = $schedule->createGroup('C', 'LightPink', 'B06', $carole, $tba); // $tba veut dire "to be anounced"
$gD = $schedule->createGroup('D', 'Khaki', 'B07', $lulu); // pas d'assistant dans ce groupe
$gE = $schedule->createGroup('E', 'PaleGreen', 'B02', $marie, $oscar);
$gF = $schedule->createGroup('F', 'PeachPuff', 'B03', $patouch, $tba);
$gG = $schedule->createGroup('G', 'PowderBlue', 'B06', $benjamin, $oscar);
$gH = $schedule->createGroup('H', 'Thistle', 'B07', $leonard, $tba);
$gI = $schedule->createGroup('I', 'Cornsilk', 'B111', $victor, $oscar);
//
// Seconde étape : on cré les regroupement de groupes qui ont des cours au même moment
//
$g1 = [ $gA, $gB, $gC, $gD ];
$g2 = [ $gE, $gF, $gG, $gH, $gI ];
//
// Troisième étape : on cré les créneaux
//
// Arguments: jour, debut, fin, nombre-enseignants, debut, fin, nombre-enseignants, ...
//
$cm1 = new Slot('17/9/2019', '8:15', '11:15', 1); // un seul long créneau de 3h
$ci1g1 = new Slot('19/9/2019', '8:15', '9:45', 1, '10:00', '11:30', 2); // deux petits créneaux de 1h30 chacun
$ci1g2 = new Slot('17/9/2019', '12:45', '14:15', 1, '14:30', '16:00', 2);
$ci2g1 = new Slot('26/9/2019', '8:15', '9:45', 1, '10:00', '11:30', 2);
$ci2g2 = new Slot('25/9/2019', '12:45', '14:15', 1, '14:30', '16:00', 2);
$ci3g1 = new Slot('2/10/2019', '8:15', '9:45', 1, '10:00', '11:30', 2);
$ci3g2 = new Slot('3/10/2019', '8:15', '9:45', 1, '10:00', '11:30', 2);
$ci4g1 = new Slot('9/10/2019', '8:15', '9:45', 1, '10:00', '11:30', 2);
$ci4g2 = new Slot('10/10/2019', '8:15', '9:45', 1, '10:00', '11:30', 2);
$ci5g1 = new Slot('16/10/2019', '14:30', '16:00', 1, '16:15', '17:45', 2);
$ci5g2 = new Slot('17/10/2019', '8:15', '9:45', 1, '10:00', '11:30', 2);
$ci6g1 = new Slot('23/10/2019', '8:15', '9:45', 1, '10:00', '13:00', 2);
$ci6g2 = new Slot('5/11/2019', '8:15', '9:45', 1, '10:00', '13:00', 2);
$ci7g1 = new Slot('6/11/2019', '8:15', '9:45', 1, '10:00', '11:30', 2);
$ci7g2 = new Slot('7/11/2019', '8:15', '9:45', 1, '10:00', '11:30', 2);
$ci8g1 = new Slot('20/11/2019', '8:15', '9:45', 1, '10:00', '11:30', 2);
$ci8g2 = new Slot('21/11/2019', '8:15', '9:45', 1, '10:00', '11:30', 2);
$ci9g1 = new Slot('27/11/2019', '8:15', '9:45', 1, '10:00', '11:30', 2);
$ci9g2 = new Slot('28/11/2019', '8:15', '9:45', 1, '10:00', '11:30', 2);
$cf1 = new Slot('13/12/2019', '8:30', '11:30', 12);
$cf2 = new Slot(null, null, null, 2); // on ne connait pas encore l'horaire
//
// Troisième étape : on crée les cours
//
$schedule->createBloc('CM1') // le cours CM1
->add($cm1, 'Promo', 'LightGray', 'Amphi 10', $adrien); // un seul group avec toute la promo
$schedule->createBloc('CI1') // le cours CI1
->addGroups($ci1g1, $g1) // avec un créneau pour les groupes A, B, C, D
->addGroups($ci1g2, $g2); // et un créneau pour les groupes E, F, G, H, I
$schedule->createBloc('CI2') // le cours CI2
->addGroups($ci2g1, $g1) // avec un créneau pour les groupes A, B, C, D
->addGroups($ci2g2, $g2) // et un créneau pour les groupes E, F, G, H, I
->setRoom($gA, 'Sur la Lune') // pour ce cours, on change la salle du groupe A
->setRoom($gB, 'Sur Mars', 1) // et ici, uniquement la salle pour le seconde créneau
->setTeachers($gC, $camille, $loulou) // remplace les enseignants pour les deux créneaux du groupe F
->replaceTeacher($gD, 1, 1, $mireille) // remplace le second enseignant du second créneau
->addTeacher($gE, 1, $camille) // ajoute un troisième enseignant au second créneau
->setTeachersAt($gF, 1, $simeon) // remplace tous les enseignants du second créneau
;
$schedule->createBloc('CI3') // etc...
->addGroups($ci3g1, $g1)
->addGroups($ci3g2, $g2);
$schedule->createBloc('CI4')
->addGroups($ci4g1, $g1)
->addGroups($ci4g2, $g2);
$schedule->createBloc('CI5')
->addGroups($ci5g1, $g1)
->addGroups($ci5g2, $g2);
$schedule->createBloc('CI6')
->addGroups($ci6g1, $g1)
->addGroups($ci6g2, $g2);
$schedule->createBloc('CI7')
->addGroups($ci7g1, $g1)
->addGroups($ci7g2, $g2);
$schedule->createBloc('CI8')
->addGroups($ci8g1, $g1)
->addGroups($ci8g2, $g2);
$schedule->createBloc('CI9')
->addGroups($ci9g1, $g1)
->addGroups($ci9g2, $g2);
$schedule->createBloc('CF1') // le CF1 avec plein de surveillants
->add($cf1, 'Promo', 'LightGray', 'E010/E011',
$camille, $loulou, $mireille, $simeon, $carole, $lulu,
$marie, $patouch, $benjamin, $leonard, $victor, $oscar);
$schedule->createBloc('CF2') // et le CF2, on ne connait pas grand chose, mais on sait qu'il existe
->add($cf2, 'Promo', 'LightGray', '???', $adrien, $tba);
?>
Affiche du planning
Vous pouvez vous inspirer de l'exemple suivant :
<!-- on commence par charger l'interface de planning -->
<?php include($root . '/' . $web . '/planning-interface.php'); ?>
<!-- On peut afficher l'année en accédant à $schedule->year -->
<chapitre title="<?= 'Equipe pedagogique ' . $schedule->year ?>">
<p>L'aide permettant de comprendre comment cette page
est générée se trouve <a href="?page=edt">ici</a></p>
<!-- on peut afficher les coordinateurs de la façon suivante -->
<p>Responsables : <?= $schedule->displayCoordinators(); ?></p>
<!-- et le enseignants qui s'occupent des différents groupes comme ça -->
<!-- l'argument citpMetaSlot signifie que sur chaque séance et pour chaque groupe, -->
<!-- il y a une partie cours avec un unique enseignant -->
<!-- et une partie TP avec deux enseignants -->
<!-- vous pouvez utiliser ciMetaSlot si il n'y a qu'un unique enseignant par séance -->
<?= $schedule->displayGroups($citpMetaSlot); ?>
<!-- un lien vers la sythèse des heures enseignées, c'est utile -->
<p><a href='?page=synthese-enseignements'>Synthèse des heures enseignées</a></p>
</chapitre>
<chapitre title="<?= 'Planning ' . $schedule->year ?>">
<!-- un selecteur pour pouvoir charger un calendrier associé à l'un des enseignants -->
<?= $schedule->displayICSSelector() ?>
<!-- affichage du planning complet -->
<?= $schedule->displaySchedule($citpMetaSlot); ?>
</chapitre>
Synthèse des heures enseignées
Vous pouvez vous inspirer de l'exemple suivant :
<?php include($root . '/' . $web . '/planning-interface.php'); ?>
<chapitre title='Synthèse des heures enseignées'>
<!-- l'argument de displaySynthesis permet de regrouper les différents cours suivant -->
<!-- leur type (Cours, CI, CF etc...) -->
<!-- la valeur devant la liste (3 pour cours ou 1.5 pour CI) permet d'indiquer le temps -->
<!-- que dure une séance. Ca permet de savoir le nombre de créneaux qu'il faut valider dans AER -->
<!-- Par exemple, pour les CI, en CSC3102, on a des déclarations par tranche de 1h30 comme ici -->
<!-- alors que pour CSC3101 c'est par tranche de 3h -->
<?php $schedule->displaySynthesis([
'Cours' => [ 3, [ 'CM1' ] ],
'CI' => [ 1.5, [ 'CI1', 'CI2', 'CI3', 'CI4', 'CI5', 'CI6', 'CI7', 'CI8', 'CI9' ] ],
'CF' => [ 1, [ 'CF1', 'CF2' ] ]
]); ?>
</chapitre>
<!-- Local Variables: -->
<!-- mode: web -->
<!-- mode: flyspell -->
<!-- ispell-dictionary: "french" -->
<!-- coding: utf-8 -->
<!-- End: -->