summaryrefslogtreecommitdiff
path: root/school/node_modules/pronote-api/src/fetch/timetable.js
diff options
context:
space:
mode:
authorMinteck <contact@minteck.org>2023-01-10 14:54:04 +0100
committerMinteck <contact@minteck.org>2023-01-10 14:54:04 +0100
commit99c1d9af689e5325f3cf535c4007b3aeb8325229 (patch)
treee663b3c2ebdbd67c818ac0c5147f0ce1d2463cda /school/node_modules/pronote-api/src/fetch/timetable.js
parent9871b03912fc28ad38b4037ebf26a78aa937baba (diff)
downloadpluralconnect-99c1d9af689e5325f3cf535c4007b3aeb8325229.tar.gz
pluralconnect-99c1d9af689e5325f3cf535c4007b3aeb8325229.tar.bz2
pluralconnect-99c1d9af689e5325f3cf535c4007b3aeb8325229.zip
Update - This is an automated commit
Diffstat (limited to 'school/node_modules/pronote-api/src/fetch/timetable.js')
-rw-r--r--school/node_modules/pronote-api/src/fetch/timetable.js95
1 files changed, 95 insertions, 0 deletions
diff --git a/school/node_modules/pronote-api/src/fetch/timetable.js b/school/node_modules/pronote-api/src/fetch/timetable.js
new file mode 100644
index 0000000..059b849
--- /dev/null
+++ b/school/node_modules/pronote-api/src/fetch/timetable.js
@@ -0,0 +1,95 @@
+const { toPronoteWeek } = require('../data/dates');
+const { withId, checkDuplicates } = require('../data/id');
+
+const { getFilledDaysAndWeeks, getTimetable } = require('./pronote/timetable');
+
+async function timetable(session, user, from = new Date(), to = null)
+{
+ if (!to || to < from) {
+ to = new Date(from.getTime());
+ to.setDate(to.getDate() + 1);
+ }
+
+ const filled = await getFilledDaysAndWeeks(session, user);
+ if (!filled) {
+ return null;
+ }
+
+ const fromWeek = toPronoteWeek(session, from);
+ const toWeek = toPronoteWeek(session, to);
+
+ const weeks = [];
+ for (let i = fromWeek; i <= toWeek; i++) {
+ weeks.push(i);
+ }
+
+ const result = [];
+ for (const week of weeks) {
+ const timetable = await getTimetable(session, user, week);
+ const lessons = getTimetableWeek(session, timetable);
+
+ if (lessons) {
+ lessons.filter(l => l.from >= from && l.from <= to).forEach(lesson => {
+ if (!filled.filledWeeks.includes(week)) {
+ lesson.isCancelled = true;
+ }
+
+ result.push(lesson);
+ });
+ }
+ }
+
+ return result.sort((a, b) => a.from - b.from);
+}
+
+function getTimetableWeek(session, table) {
+ const result = [];
+ if (!table || !table.lessons) {
+ return
+ }
+
+ for (const lesson of table.lessons) {
+ const from = lesson.date;
+ const to = new Date(from.getTime() + (lesson.duration / session.params.ticksPerHour * 3600000));
+
+ const res = {
+ from,
+ to,
+ isDetention: lesson.isDetention,
+ remoteLesson: lesson.remoteLesson,
+ status: lesson.status,
+ hasDuplicate: !!table.lessons.find(l => l.date.getTime() === from.getTime() && l !== lesson)
+ };
+
+ let room, subject, teacher;
+ if (lesson.isDetention) {
+ subject = lesson.content[0];
+ teacher = lesson.content[1];
+ room = lesson.content[2];
+ } else {
+ if (lesson.content) {
+ subject = lesson.content.find(o => o.type === 16);
+ teacher = lesson.content.find(o => o.type === 3);
+ room = lesson.content.find(o => o.type === 17);
+ } else {
+ subject = 'Non défini';
+ room = 'Non défini';
+ teacher = 'Non défini';
+ }
+
+ res.isAway = (lesson.status || false) && !!lesson.status.match(/(.+)?prof(.+)?absent(.+)?/giu);
+ res.isCancelled = !res.isAway && lesson.isCancelled;
+ res.color = lesson.color;
+ }
+
+ res.subject = subject && subject.name || null;
+ res.teacher = teacher && teacher.name || null;
+ res.room = room && room.name || null;
+
+ result.push(withId(res, ['from', 'to', 'subject']));
+ }
+
+ return checkDuplicates(result);
+}
+
+module.exports = timetable;