@royalschedule/maps 4.0.31 → 4.0.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Additio/from/courses.js.map +1 -1
- package/dist/Additio/from/events.js.map +1 -1
- package/dist/Additio/from/groups.js.map +1 -1
- package/dist/Additio/from/index.js.map +1 -1
- package/dist/Additio/from/locations.js.map +1 -1
- package/dist/Additio/from/persons.js.map +1 -1
- package/dist/Additio/from/schedules.d.ts +1 -0
- package/dist/Additio/from/schedules.js +2 -4
- package/dist/Additio/from/schedules.js.map +1 -1
- package/dist/Additio/from/teachers.js.map +1 -1
- package/dist/Additio/to/index.d.ts +4 -2
- package/dist/Additio/to/schedules.js +2 -4
- package/dist/Additio/to/schedules.js.map +1 -1
- package/dist/Admentum/from/courses.js.map +1 -1
- package/dist/Admentum/from/events.js.map +1 -1
- package/dist/Admentum/from/groups.js.map +1 -1
- package/dist/Admentum/from/index.js.map +1 -1
- package/dist/Admentum/from/locations.js.map +1 -1
- package/dist/Admentum/from/persons.js.map +1 -1
- package/dist/Admentum/from/schedules.d.ts +1 -0
- package/dist/Admentum/from/schedules.js +3 -6
- package/dist/Admentum/from/schedules.js.map +1 -1
- package/dist/Admentum/from/teachers.js.map +1 -1
- package/dist/Admentum/to/index.d.ts +1 -0
- package/dist/Admentum/to/schedules.js +4 -7
- package/dist/Admentum/to/schedules.js.map +1 -1
- package/dist/Excel/index.d.ts +1 -0
- package/dist/Excel/v1/from/index.js +1 -1
- package/dist/Excel/v1/from/index.js.map +1 -1
- package/dist/Excel/v1/index.d.ts +4 -3
- package/dist/Excel/v2/from/index.js +45 -54
- package/dist/Excel/v2/from/index.js.map +1 -1
- package/dist/Excel/v2/index.d.ts +4 -3
- package/dist/IdunSoft/from/courses.js.map +1 -1
- package/dist/IdunSoft/from/events.js +1 -2
- package/dist/IdunSoft/from/events.js.map +1 -1
- package/dist/IdunSoft/from/groups.js.map +1 -1
- package/dist/IdunSoft/from/index.js.map +1 -1
- package/dist/IdunSoft/from/locations.js.map +1 -1
- package/dist/IdunSoft/from/schedules.d.ts +1 -0
- package/dist/IdunSoft/from/schedules.js.map +1 -1
- package/dist/IdunSoft/from/teachers.js.map +1 -1
- package/dist/IdunSoft/to/index.d.ts +1 -0
- package/dist/IdunSoft/to/schedules.js +3 -6
- package/dist/IdunSoft/to/schedules.js.map +1 -1
- package/dist/InfoMentor/to/index.d.ts +1 -0
- package/dist/InfoMentor/to/schedules.js +1 -2
- package/dist/InfoMentor/to/schedules.js.map +1 -1
- package/dist/PlanDigital/from/index.js.map +1 -1
- package/dist/PlanDigital/from/schedules.js +9 -11
- package/dist/PlanDigital/from/schedules.js.map +1 -1
- package/dist/PlanDigital/index.d.ts +1 -0
- package/dist/Quiculum/file/to/index.d.ts +1 -0
- package/dist/Quiculum/file/to/schedules.js +5 -9
- package/dist/Quiculum/file/to/schedules.js.map +1 -1
- package/dist/RS/from/division.d.ts +1 -0
- package/dist/RS/from/division.js +1 -2
- package/dist/RS/from/division.js.map +1 -1
- package/dist/RS/from/index.js.map +1 -1
- package/dist/RS/from/schedules.d.ts +1 -0
- package/dist/RS/from/schedules.js.map +1 -1
- package/dist/RS/make-connected.d.ts +3 -1
- package/dist/RS/make-connected.js +34 -42
- package/dist/RS/make-connected.js.map +1 -1
- package/dist/RS/to/index.js.map +1 -1
- package/dist/RS/to/initial-configuration.js +4 -6
- package/dist/RS/to/initial-configuration.js.map +1 -1
- package/dist/RS/to/input/collections.js.map +1 -1
- package/dist/RS/to/input/default.js +1 -2
- package/dist/RS/to/input/default.js.map +1 -1
- package/dist/RS/to/input/dependencies.js +1 -2
- package/dist/RS/to/input/dependencies.js.map +1 -1
- package/dist/RS/to/input/dynamic-locked-times.js +1 -2
- package/dist/RS/to/input/dynamic-locked-times.js.map +1 -1
- package/dist/RS/to/input/events.js.map +1 -1
- package/dist/RS/to/input/groups.js.map +1 -1
- package/dist/RS/to/input/individuals.js +1 -2
- package/dist/RS/to/input/individuals.js.map +1 -1
- package/dist/RS/to/input/input.js +1 -2
- package/dist/RS/to/input/input.js.map +1 -1
- package/dist/RS/to/input/intervals.js +2 -4
- package/dist/RS/to/input/intervals.js.map +1 -1
- package/dist/RS/to/input/periods.js +2 -4
- package/dist/RS/to/input/periods.js.map +1 -1
- package/dist/RS/to/input/settings.js.map +1 -1
- package/dist/RS/to/input/teachers.js +1 -1
- package/dist/RS/to/input/teachers.js.map +1 -1
- package/dist/RS/to/input/util/attach-locked-times.js.map +1 -1
- package/dist/RS/to/input/util/parse-days.js.map +1 -1
- package/dist/RS/to/input/util/parse-group-references.js.map +1 -1
- package/dist/RS/to/input/util/parse-intervals.js +2 -4
- package/dist/RS/to/input/util/parse-intervals.js.map +1 -1
- package/dist/RS/to/input/util/parse-location-references.js +1 -2
- package/dist/RS/to/input/util/parse-location-references.js.map +1 -1
- package/dist/RS/to/input/util/parse-max-working-hours.js.map +1 -1
- package/dist/RS/to/input/util/parse-minimum-break-length.js.map +1 -1
- package/dist/RS/to/input/util/util.js +1 -2
- package/dist/RS/to/input/util/util.js.map +1 -1
- package/dist/RS/to/schedules.js.map +1 -1
- package/dist/RS/types/to.d.ts +1 -0
- package/dist/SS12000/from/activities.js +1 -2
- package/dist/SS12000/from/activities.js.map +1 -1
- package/dist/SS12000/from/calendar-events.js.map +1 -1
- package/dist/SS12000/from/duties.js.map +1 -1
- package/dist/SS12000/from/groups.js.map +1 -1
- package/dist/SS12000/from/index.js.map +1 -1
- package/dist/SS12000/from/persons.js.map +1 -1
- package/dist/SS12000/from/resources.js.map +1 -1
- package/dist/SS12000/from/rooms.js.map +1 -1
- package/dist/SS12000/from/syllabuses.js.map +1 -1
- package/dist/SS12000/index.d.ts +41 -6
- package/dist/SS12000/to/activities.js.map +1 -1
- package/dist/SS12000/to/calendar-events.js.map +1 -1
- package/dist/SS12000/to/common.js.map +1 -1
- package/dist/SS12000/to/duties.js.map +1 -1
- package/dist/SS12000/to/groups.js.map +1 -1
- package/dist/SS12000/to/index.d.ts +1 -0
- package/dist/SS12000/to/persons.js.map +1 -1
- package/dist/SS12000/to/resources.js.map +1 -1
- package/dist/SS12000/to/rooms.js.map +1 -1
- package/dist/SS12000/to/syllabuses.js.map +1 -1
- package/dist/SchoolSoft/api/from/index.js.map +1 -1
- package/dist/SchoolSoft/api/from/schedules.js +8 -12
- package/dist/SchoolSoft/api/from/schedules.js.map +1 -1
- package/dist/SchoolSoft/api/index.d.ts +6 -5
- package/dist/SchoolSoft/file/from/index.js.map +1 -1
- package/dist/SchoolSoft/file/from/schedules.js +83 -87
- package/dist/SchoolSoft/file/from/schedules.js.map +1 -1
- package/dist/SchoolSoft/file/index.d.ts +1 -0
- package/dist/SchoolSoft/file/to/index.d.ts +3 -2
- package/dist/SchoolSoft/file/to/schedules.js +1 -2
- package/dist/SchoolSoft/file/to/schedules.js.map +1 -1
- package/dist/SchoolSoft/index.d.ts +1 -0
- package/dist/Schoolity/txt/to/index.d.ts +1 -0
- package/dist/Schoolity/txt/to/schedules.js +5 -12
- package/dist/Schoolity/txt/to/schedules.js.map +1 -1
- package/dist/Skola24/mdb/from/course-and-events.js +3 -5
- package/dist/Skola24/mdb/from/course-and-events.js.map +1 -1
- package/dist/Skola24/mdb/from/groups.js.map +1 -1
- package/dist/Skola24/mdb/from/index.js.map +1 -1
- package/dist/Skola24/mdb/from/locations.js.map +1 -1
- package/dist/Skola24/mdb/from/schedule.d.ts +1 -0
- package/dist/Skola24/mdb/from/schedule.js.map +1 -1
- package/dist/Skola24/mdb/from/teachers.js.map +1 -1
- package/dist/Skola24/txt/from/calendar-exceptions.js +1 -2
- package/dist/Skola24/txt/from/calendar-exceptions.js.map +1 -1
- package/dist/Skola24/txt/from/division.js.map +1 -1
- package/dist/Skola24/txt/from/index.js.map +1 -1
- package/dist/Skola24/txt/from/period.js +31 -34
- package/dist/Skola24/txt/from/period.js.map +1 -1
- package/dist/Skola24/txt/from/schedules.d.ts +1 -0
- package/dist/Skola24/txt/from/schedules.js +6 -10
- package/dist/Skola24/txt/from/schedules.js.map +1 -1
- package/dist/Skola24/txt/from/util.js.map +1 -1
- package/dist/Skola24/txt/index.d.ts +1 -0
- package/dist/Skola24/txt/to/index.d.ts +1 -0
- package/dist/Skola24/txt/to/schedules.js +5 -12
- package/dist/Skola24/txt/to/schedules.js.map +1 -1
- package/dist/common/constants.js.map +1 -1
- package/dist/common/functions.js.map +1 -1
- package/dist/common/get-date.js.map +1 -1
- package/dist/common/make-chainable/index.js.map +1 -1
- package/dist/common/types.d.ts +1 -3
- package/dist/core/from/configurations.js.map +1 -1
- package/dist/core/from/courses.js.map +1 -1
- package/dist/core/from/events.js.map +1 -1
- package/dist/core/from/exceptions.js.map +1 -1
- package/dist/core/from/groups.js.map +1 -1
- package/dist/core/from/index.js.map +1 -1
- package/dist/core/from/locations.js.map +1 -1
- package/dist/core/from/locked-times.js.map +1 -1
- package/dist/core/from/overlap-groups.js.map +1 -1
- package/dist/core/from/periods.js.map +1 -1
- package/dist/core/from/persons.js.map +1 -1
- package/dist/core/from/root-intervals.js.map +1 -1
- package/dist/core/from/schedules.js.map +1 -1
- package/dist/core/from/settings.js.map +1 -1
- package/dist/core/from/syllabuses.js.map +1 -1
- package/dist/core/from/teachers.js.map +1 -1
- package/dist/core/index.d.ts +1 -0
- package/dist/core/interfaces/index.d.ts +23 -0
- package/dist/core/interfaces/other/companies.d.ts +1 -0
- package/dist/core/interfaces/other/companies.js.map +1 -1
- package/dist/core/interfaces/other/index.d.ts +6 -0
- package/dist/core/interfaces/other/operations.d.ts +1 -0
- package/dist/core/interfaces/vertices/companies.d.ts +1 -0
- package/dist/core/interfaces/vertices/configurations.d.ts +1 -0
- package/dist/core/interfaces/vertices/courses.d.ts +1 -0
- package/dist/core/interfaces/vertices/division-settings.d.ts +2 -0
- package/dist/core/interfaces/vertices/divisions.d.ts +1 -0
- package/dist/core/interfaces/vertices/events.d.ts +1 -0
- package/dist/core/interfaces/vertices/exceptions.d.ts +1 -0
- package/dist/core/interfaces/vertices/generations.d.ts +2 -0
- package/dist/core/interfaces/vertices/groups.d.ts +1 -0
- package/dist/core/interfaces/vertices/index.d.ts +1 -0
- package/dist/core/interfaces/vertices/locations.d.ts +1 -0
- package/dist/core/interfaces/vertices/locked-times.d.ts +2 -0
- package/dist/core/interfaces/vertices/overlap-groups.d.ts +1 -0
- package/dist/core/interfaces/vertices/periods.d.ts +3 -0
- package/dist/core/interfaces/vertices/persons.d.ts +1 -0
- package/dist/core/interfaces/vertices/properties/belongs-to.d.ts +1 -0
- package/dist/core/interfaces/vertices/properties/coalesced.d.ts +1 -0
- package/dist/core/interfaces/vertices/root-intervals.d.ts +2 -0
- package/dist/core/interfaces/vertices/syllabuses.d.ts +1 -0
- package/dist/core/interfaces/vertices/teachers.d.ts +1 -0
- package/dist/core/interfaces/vertices/threads.d.ts +6 -4
- package/dist/core/interfaces/vertices/users.d.ts +1 -0
- package/dist/core/interfaces/vertices/util/custom-vertex-export/index.d.ts +6 -6
- package/dist/core/interfaces/vertices/util/custom-vertex-export/util.d.ts +4 -4
- package/dist/core/interfaces/vertices/util/deep-vertex-export/index.d.ts +9 -9
- package/dist/core/interfaces/vertices/util/edges.d.ts +7 -7
- package/dist/core/interfaces/vertices/util/index.d.ts +6 -0
- package/dist/core/interfaces/vertices/util/util.d.ts +20 -24
- package/dist/core/interfaces/vertices/util/vertex-query/index.d.ts +11 -11
- package/dist/core/interfaces/vertices/util/vertex.d.ts +1 -1
- package/dist/core/interfaces/vertices/vertex-query.d.ts +27 -26
- package/dist/core/interfaces/vertices/vertex-query.js.map +1 -1
- package/dist/core/to/configurations.js +1 -2
- package/dist/core/to/configurations.js.map +1 -1
- package/dist/core/to/courses.js +1 -2
- package/dist/core/to/courses.js.map +1 -1
- package/dist/core/to/division.js.map +1 -1
- package/dist/core/to/events.js +1 -2
- package/dist/core/to/events.js.map +1 -1
- package/dist/core/to/exceptions.js +1 -2
- package/dist/core/to/exceptions.js.map +1 -1
- package/dist/core/to/groups.js +1 -2
- package/dist/core/to/groups.js.map +1 -1
- package/dist/core/to/locations.js +1 -2
- package/dist/core/to/locations.js.map +1 -1
- package/dist/core/to/locked-times.js +1 -2
- package/dist/core/to/locked-times.js.map +1 -1
- package/dist/core/to/overlap-groups.js +1 -2
- package/dist/core/to/overlap-groups.js.map +1 -1
- package/dist/core/to/periods.js +1 -2
- package/dist/core/to/periods.js.map +1 -1
- package/dist/core/to/persons.js +1 -2
- package/dist/core/to/persons.js.map +1 -1
- package/dist/core/to/root-intervals.js +1 -2
- package/dist/core/to/root-intervals.js.map +1 -1
- package/dist/core/to/schedules.d.ts +1 -0
- package/dist/core/to/schedules.js.map +1 -1
- package/dist/core/to/settings.js +1 -2
- package/dist/core/to/settings.js.map +1 -1
- package/dist/core/to/syllabuses.js +1 -2
- package/dist/core/to/syllabuses.js.map +1 -1
- package/dist/core/to/teachers.js +1 -2
- package/dist/core/to/teachers.js.map +1 -1
- package/dist/core/to/util.d.ts +2 -0
- package/dist/core/to/util.js +1 -2
- package/dist/core/to/util.js.map +1 -1
- package/dist/core/types/index.d.ts +6 -0
- package/dist/core/util.js +1 -2
- package/dist/core/util.js.map +1 -1
- package/dist/identify/constants/index.js.map +1 -1
- package/dist/identify/index.js +1 -2
- package/dist/identify/index.js.map +1 -1
- package/dist/sdui/from/classes.js.map +1 -1
- package/dist/sdui/from/courses.js.map +1 -1
- package/dist/sdui/from/holidays.js.map +1 -1
- package/dist/sdui/from/index.js.map +1 -1
- package/dist/sdui/from/lessons.js.map +1 -1
- package/dist/sdui/from/rooms.js.map +1 -1
- package/dist/sdui/from/schedules.d.ts +2 -0
- package/dist/sdui/from/schedules.js.map +1 -1
- package/dist/sdui/from/school-years.js.map +1 -1
- package/dist/sdui/from/substitution-plans.js.map +1 -1
- package/dist/sdui/from/teachers.js.map +1 -1
- package/dist/sdui/to/classes.js.map +1 -1
- package/dist/sdui/to/courses.js.map +1 -1
- package/dist/sdui/to/holidays.js.map +1 -1
- package/dist/sdui/to/hours.js.map +1 -1
- package/dist/sdui/to/index.d.ts +2 -0
- package/dist/sdui/to/lessons.js.map +1 -1
- package/dist/sdui/to/rooms.js.map +1 -1
- package/dist/sdui/to/schedules.js.map +1 -1
- package/dist/sdui/to/school-years.js.map +1 -1
- package/dist/sdui/to/substitution-plans.js +3 -6
- package/dist/sdui/to/substitution-plans.js.map +1 -1
- package/dist/sdui/to/teachers.js.map +1 -1
- package/dist/vKlass/from/index.js.map +1 -1
- package/dist/vKlass/from/schedule.d.ts +1 -0
- package/dist/vKlass/from/schedule.js.map +1 -1
- package/dist/vKlass/to/schedules.js +6 -17
- package/dist/vKlass/to/schedules.js.map +1 -1
- package/package.json +1 -1
|
@@ -14,8 +14,7 @@ const days = [
|
|
|
14
14
|
];
|
|
15
15
|
function _parseWeeks(weeks, set, method = "add") {
|
|
16
16
|
if (!weeks) return;
|
|
17
|
-
|
|
18
|
-
intervals.forEach((interval) => {
|
|
17
|
+
weeks.split(",").map((x) => trim(x)).forEach((interval) => {
|
|
19
18
|
if (!interval.includes("-")) {
|
|
20
19
|
set[method](Number(interval));
|
|
21
20
|
return;
|
|
@@ -28,92 +27,89 @@ var schedules_default = (input, options) => {
|
|
|
28
27
|
const teachers = /* @__PURE__ */ new Set();
|
|
29
28
|
const groups = /* @__PURE__ */ new Set();
|
|
30
29
|
const locations = /* @__PURE__ */ new Set();
|
|
31
|
-
const events = input.map((event) => {
|
|
32
|
-
if (!event.length) return;
|
|
33
|
-
const weeks = /* @__PURE__ */ new Set();
|
|
34
|
-
const { inweek, exweek, realweeks } = event;
|
|
35
|
-
try {
|
|
36
|
-
_parseWeeks(inweek, weeks, "add");
|
|
37
|
-
_parseWeeks(realweeks, weeks, "add");
|
|
38
|
-
if (weeks.size == 0) Array.from({ length: 51 }, (_, index) => index + 1).forEach((x) => weeks.add(x));
|
|
39
|
-
_parseWeeks(exweek, weeks, "delete");
|
|
40
|
-
} catch (err) {
|
|
41
|
-
console.error(err);
|
|
42
|
-
}
|
|
43
|
-
if (options?.interval) {
|
|
44
|
-
const { start: start$1, end: end$1 } = options.interval;
|
|
45
|
-
if (start$1 > 52 || start$1 <= 0) throw new Error(`(SchoolSoft::From::Schedules) Interval::start is invalid. value ${start$1}`);
|
|
46
|
-
if (end$1 > 52 || end$1 <= 0) throw new Error(`(SchoolSoft::From::Schedules) Interval::end is invalid. value ${end$1}`);
|
|
47
|
-
if (start$1 > end$1) {
|
|
48
|
-
if (!Array.from(weeks).some((week) => week >= start$1 && week <= 52 || week <= end$1)) return;
|
|
49
|
-
} else if (!Array.from(weeks).some((week) => week >= start$1 && week <= end$1)) return;
|
|
50
|
-
}
|
|
51
|
-
let start;
|
|
52
|
-
let end;
|
|
53
|
-
const { starttime, subject, day, length, teacher, group, room } = event;
|
|
54
|
-
if (day && starttime) {
|
|
55
|
-
const _day = days.indexOf(day);
|
|
56
|
-
if (_day > 4) return;
|
|
57
|
-
start = get_date_default(_day, `${starttime.substring(0, 2)}:${starttime.substring(2, 4)}`);
|
|
58
|
-
end = start.clone().add(length, "m");
|
|
59
|
-
}
|
|
60
|
-
let _teachers;
|
|
61
|
-
let _groups;
|
|
62
|
-
let _locations;
|
|
63
|
-
if (teacher) {
|
|
64
|
-
_teachers = teacher.split(",").map((x) => x.trim());
|
|
65
|
-
_teachers?.forEach((x) => teachers.add(x));
|
|
66
|
-
}
|
|
67
|
-
if (group) {
|
|
68
|
-
_groups = group.split(",").map((x) => x.trim());
|
|
69
|
-
_groups?.forEach((x) => groups.add(x));
|
|
70
|
-
}
|
|
71
|
-
if (room) {
|
|
72
|
-
_locations = sortBy(room.split(",").map((x) => x.trim()));
|
|
73
|
-
_locations?.forEach((x) => locations.add(x));
|
|
74
|
-
}
|
|
75
|
-
const doc = {
|
|
76
|
-
ids: event.id,
|
|
77
|
-
preferredDuration: event.length,
|
|
78
|
-
weeks: sortBy(Array.from(weeks)),
|
|
79
|
-
...subject && { subject },
|
|
80
|
-
...start && { start },
|
|
81
|
-
...end && { end },
|
|
82
|
-
...event.group && { groups: _groups?.map((to) => ({ to })) },
|
|
83
|
-
...event.teacher && { teachers: _teachers?.map((to) => ({ to })) },
|
|
84
|
-
...event.room && {
|
|
85
|
-
inLocations: _locations,
|
|
86
|
-
locations: _locations?.map((_location, index) => ({
|
|
87
|
-
locations: [_location],
|
|
88
|
-
groupIndex: index
|
|
89
|
-
}))
|
|
90
|
-
}
|
|
91
|
-
};
|
|
92
|
-
return doc;
|
|
93
|
-
}).filter((x) => x != null);
|
|
94
|
-
const courses = makeChainable(events).chain((x) => x.filter((e) => !!e.ids), (x) => groupBy(x, (e) => e.subject + ".g." + e.groups?.map((x$1) => x$1.to).join(",") + (e.groups?.length ? "" : ".t." + e.teachers?.map((x$1) => x$1.to).join(","))), (x) => Object.values(x).map((events$1) => {
|
|
95
|
-
const { subject, groups: groups$1, teachers: teachers$1 } = events$1[0];
|
|
96
|
-
for (const e of events$1) {
|
|
97
|
-
delete e.subject;
|
|
98
|
-
delete e.groups;
|
|
99
|
-
}
|
|
100
|
-
const course = {
|
|
101
|
-
displayName: `${subject}-${(groups$1 ?? teachers$1)?.map((x$1) => x$1.to).join(" ")}`,
|
|
102
|
-
events: events$1.map((e) => e.ids),
|
|
103
|
-
...groups$1
|
|
104
|
-
};
|
|
105
|
-
if (size(countBy(events$1, (e) => e.teachers?.map((x$1) => x$1.to).sort().join(","))) == 1) {
|
|
106
|
-
course.teachers = events$1[0].teachers ?? void 0;
|
|
107
|
-
events$1.forEach((e) => delete e.teachers);
|
|
108
|
-
}
|
|
109
|
-
if (size(countBy(events$1, (e) => e.locations?.map((x$1) => x$1.locations[0]).sort().join(","))) == 1) {
|
|
110
|
-
course.locations = events$1[0].locations ?? void 0;
|
|
111
|
-
events$1.forEach((e) => delete e.locations);
|
|
112
|
-
}
|
|
113
|
-
return course;
|
|
114
|
-
})).value;
|
|
115
30
|
return {
|
|
116
|
-
courses
|
|
31
|
+
courses: makeChainable(input.map((event) => {
|
|
32
|
+
if (!event.length) return;
|
|
33
|
+
const weeks = /* @__PURE__ */ new Set();
|
|
34
|
+
const { inweek, exweek, realweeks } = event;
|
|
35
|
+
try {
|
|
36
|
+
_parseWeeks(inweek, weeks, "add");
|
|
37
|
+
_parseWeeks(realweeks, weeks, "add");
|
|
38
|
+
if (weeks.size == 0) Array.from({ length: 51 }, (_, index) => index + 1).forEach((x) => weeks.add(x));
|
|
39
|
+
_parseWeeks(exweek, weeks, "delete");
|
|
40
|
+
} catch (err) {
|
|
41
|
+
console.error(err);
|
|
42
|
+
}
|
|
43
|
+
if (options?.interval) {
|
|
44
|
+
const { start: start$1, end: end$1 } = options.interval;
|
|
45
|
+
if (start$1 > 52 || start$1 <= 0) throw new Error(`(SchoolSoft::From::Schedules) Interval::start is invalid. value ${start$1}`);
|
|
46
|
+
if (end$1 > 52 || end$1 <= 0) throw new Error(`(SchoolSoft::From::Schedules) Interval::end is invalid. value ${end$1}`);
|
|
47
|
+
if (start$1 > end$1) {
|
|
48
|
+
if (!Array.from(weeks).some((week) => week >= start$1 && week <= 52 || week <= end$1)) return;
|
|
49
|
+
} else if (!Array.from(weeks).some((week) => week >= start$1 && week <= end$1)) return;
|
|
50
|
+
}
|
|
51
|
+
let start;
|
|
52
|
+
let end;
|
|
53
|
+
const { starttime, subject, day, length, teacher, group, room } = event;
|
|
54
|
+
if (day && starttime) {
|
|
55
|
+
const _day = days.indexOf(day);
|
|
56
|
+
if (_day > 4) return;
|
|
57
|
+
start = get_date_default(_day, `${starttime.substring(0, 2)}:${starttime.substring(2, 4)}`);
|
|
58
|
+
end = start.clone().add(length, "m");
|
|
59
|
+
}
|
|
60
|
+
let _teachers;
|
|
61
|
+
let _groups;
|
|
62
|
+
let _locations;
|
|
63
|
+
if (teacher) {
|
|
64
|
+
_teachers = teacher.split(",").map((x) => x.trim());
|
|
65
|
+
_teachers?.forEach((x) => teachers.add(x));
|
|
66
|
+
}
|
|
67
|
+
if (group) {
|
|
68
|
+
_groups = group.split(",").map((x) => x.trim());
|
|
69
|
+
_groups?.forEach((x) => groups.add(x));
|
|
70
|
+
}
|
|
71
|
+
if (room) {
|
|
72
|
+
_locations = sortBy(room.split(",").map((x) => x.trim()));
|
|
73
|
+
_locations?.forEach((x) => locations.add(x));
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
ids: event.id,
|
|
77
|
+
preferredDuration: event.length,
|
|
78
|
+
weeks: sortBy(Array.from(weeks)),
|
|
79
|
+
...subject && { subject },
|
|
80
|
+
...start && { start },
|
|
81
|
+
...end && { end },
|
|
82
|
+
...event.group && { groups: _groups?.map((to) => ({ to })) },
|
|
83
|
+
...event.teacher && { teachers: _teachers?.map((to) => ({ to })) },
|
|
84
|
+
...event.room && {
|
|
85
|
+
inLocations: _locations,
|
|
86
|
+
locations: _locations?.map((_location, index) => ({
|
|
87
|
+
locations: [_location],
|
|
88
|
+
groupIndex: index
|
|
89
|
+
}))
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
}).filter((x) => x != null)).chain((x) => x.filter((e) => !!e.ids), (x) => groupBy(x, (e) => e.subject + ".g." + e.groups?.map((x$1) => x$1.to).join(",") + (e.groups?.length ? "" : ".t." + e.teachers?.map((x$1) => x$1.to).join(","))), (x) => Object.values(x).map((events) => {
|
|
93
|
+
const { subject, groups: groups$1, teachers: teachers$1 } = events[0];
|
|
94
|
+
for (const e of events) {
|
|
95
|
+
delete e.subject;
|
|
96
|
+
delete e.groups;
|
|
97
|
+
}
|
|
98
|
+
const course = {
|
|
99
|
+
displayName: `${subject}-${(groups$1 ?? teachers$1)?.map((x$1) => x$1.to).join(" ")}`,
|
|
100
|
+
events: events.map((e) => e.ids),
|
|
101
|
+
...groups$1
|
|
102
|
+
};
|
|
103
|
+
if (size(countBy(events, (e) => e.teachers?.map((x$1) => x$1.to).sort().join(","))) == 1) {
|
|
104
|
+
course.teachers = events[0].teachers ?? void 0;
|
|
105
|
+
events.forEach((e) => delete e.teachers);
|
|
106
|
+
}
|
|
107
|
+
if (size(countBy(events, (e) => e.locations?.map((x$1) => x$1.locations[0]).sort().join(","))) == 1) {
|
|
108
|
+
course.locations = events[0].locations ?? void 0;
|
|
109
|
+
events.forEach((e) => delete e.locations);
|
|
110
|
+
}
|
|
111
|
+
return course;
|
|
112
|
+
})).value,
|
|
117
113
|
teachers: Array.from(teachers).map((ids) => ({
|
|
118
114
|
ids,
|
|
119
115
|
displayName: ids
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedules.js","names":["days: Day[]","start","end","start: moment.Moment | undefined","end: moment.Moment | undefined","_day: number","getDate","_teachers: string[] | undefined","_groups: string[] | undefined","_locations: string[] | undefined","doc: CoreTypes.SerializedWithOptionalId.Event & { subject?: string }","x","events","course: CoreTypes.SerializedWithOptionalId.Course","groups","teachers"],"sources":["../../../../src/SchoolSoft/file/from/schedules.ts"],"sourcesContent":["import type moment from 'moment';\nimport { trim, sortBy, countBy, size, groupBy } from 'lodash-es';\nimport type { Day, Event } from '../types/events';\nimport type { CoreTypes } from '../../../core';\nimport getDate from '../../../common/get-date';\nimport type { Options } from '../types';\nimport { makeChainable } from '../../../common/make-chainable';\n\nconst days: Day[] = ['Mån', 'Tis', 'Ons', 'Tor', 'Fre', 'Lör', 'Sön'];\n\nfunction _parseWeeks (\n weeks: string | undefined,\n set: Set<number>,\n method: ('add' | 'delete') = 'add'\n): void {\n if (!weeks) return;\n const intervals = weeks.split(',').map(x => trim(x)) as (`${number}-${number}` | `${number}${number}`)[];\n intervals.forEach(interval => {\n if (!interval.includes('-')) {\n set[method](Number(interval));\n return;\n }\n const [start, end] = interval.split('-').map(Number);\n Array.from({ length: end - start + 1 }, (_, index) => start + index)\n .forEach(x => set[method](x));\n });\n}\n\n\nexport default (\n input: Event[],\n options?: Options\n): Partial<CoreTypes.SerializedWithOptionalId.Schedule> => {\n const teachers = new Set<string>();\n const groups = new Set<string>();\n const locations = new Set<string>();\n\n const events = input\n .map(event => {\n if (!event.length) return;\n\n const weeks = new Set<number>();\n const {\n inweek,\n exweek,\n realweeks\n } = event;\n\n try {\n _parseWeeks(inweek, weeks, 'add');\n _parseWeeks(realweeks, weeks, 'add');\n\n if (weeks.size == 0)\n Array.from({ length: 51 }, (_, index) => index + 1).forEach(x => weeks.add(x));\n _parseWeeks(exweek, weeks, 'delete');\n } catch (err) {\n console.error(err);\n }\n\n if (options?.interval) {\n const { start, end } = options.interval;\n\n if (start > 52 || start <= 0)\n throw new Error(`(SchoolSoft::From::Schedules) Interval::start is invalid. value ${ start }`);\n\n if (end > 52 || end <= 0)\n throw new Error(`(SchoolSoft::From::Schedules) Interval::end is invalid. value ${ end }`);\n\n if (start > end) {\n if (!Array.from(weeks).some(week => (week >= start && week <= 52) || week <= end))\n return;\n } else {\n if (!Array.from(weeks).some(week => week >= start && week <= end))\n return;\n }\n }\n\n let start: moment.Moment | undefined;\n let end: moment.Moment | undefined;\n\n const {\n starttime,\n subject,\n day,\n length,\n teacher,\n group,\n room\n } = event;\n\n if (day && starttime) {\n const _day: number = days.indexOf(day);\n\n if (_day > 4) return;\n\n start = getDate(_day, `${ starttime.substring(0, 2) }:${ starttime.substring(2, 4) }`);\n end = start.clone().add(length, 'm');\n }\n\n let _teachers: string[] | undefined;\n let _groups: string[] | undefined;\n let _locations: string[] | undefined;\n\n if (teacher) {\n _teachers = teacher.split(',').map(x => x.trim());\n _teachers?.forEach(x => teachers.add(x));\n }\n\n if (group) {\n _groups = group.split(',').map(x => x.trim());\n _groups?.forEach(x => groups.add(x));\n }\n\n if (room) {\n _locations = sortBy(room.split(',').map(x => x.trim()));\n _locations?.forEach(x => locations.add(x));\n }\n\n const doc: CoreTypes.SerializedWithOptionalId.Event & { subject?: string } ={\n ids: event.id,\n preferredDuration: event.length,\n weeks: sortBy(Array.from(weeks)),\n ...subject && { subject },\n ...start && { start },\n ...end && { end },\n ...event.group && { groups: _groups ?.map(to => ({ to })) },\n ...event.teacher && { teachers: _teachers?.map(to => ({ to })) },\n ...event.room && {\n inLocations: _locations,\n locations: _locations?.map((_location, index: number) => (\n {\n locations: [_location],\n groupIndex: index\n })\n )\n }\n };\n\n return doc;\n })\n .filter(x => x != null);\n\n // construct courses from events with same subject, groups and teachers\n const courses = makeChainable(events)\n .chain(\n x => x.filter((e): e is typeof e & { ids: string } => !!e.ids),\n x => groupBy(x, e =>\n e.subject\n + '.g.' + e.groups?.map(x => x.to).join(',')\n // Subject Lunch only have teacher and no groups\n + (e.groups?.length ? '' : ('.t.' + e.teachers?.map(x => x.to).join(',') ))\n ),\n x => Object.values(x)\n .map(events => {\n // promote shared properties to course\n const { subject, groups, teachers } = events[0];\n for (const e of events) {\n delete e.subject;\n delete e.groups;\n }\n\n const course: CoreTypes.SerializedWithOptionalId.Course = {\n displayName: `${ subject }-${ (groups ?? teachers)?.map(x => x.to).join(' ') }`,\n events: events.map(e => e.ids),\n ...groups,\n };\n\n // try to also promote teachers and locations\n if (size(countBy(events, e => e.teachers?.map(x => x.to).sort().join(','))) == 1) {\n course.teachers = events[0].teachers ?? undefined;\n events.forEach(e => delete e.teachers);\n }\n if (size(countBy(events, e => e.locations?.map(x => x.locations[0]).sort().join(','))) == 1) {\n course.locations = events[0].locations ?? undefined;\n events.forEach(e => delete e.locations);\n }\n\n return course;\n })\n )\n .value;\n\n return {\n courses: courses,\n teachers: Array.from(teachers) .map(ids => ({ ids, displayName: ids })),\n groups: Array.from(groups) .map(ids => ({ ids, displayName: ids })),\n locations: Array.from(locations).map(ids => ({ ids, displayName: ids }))\n };\n};"],"mappings":";;;;;AAQA,MAAMA,OAAc;CAAC;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;;AAE/D,SAAS,YACP,OACA,KACA,SAA6B,OACvB;AACN,KAAI,CAAC,MAAO;CACZ,MAAM,YAAY,MAAM,MAAM,KAAK,KAAI,MAAK,KAAK;AACjD,WAAU,SAAQ,aAAY;AAC5B,MAAI,CAAC,SAAS,SAAS,MAAM;AAC3B,OAAI,QAAQ,OAAO;AACnB;;EAEF,MAAM,CAAC,OAAO,OAAO,SAAS,MAAM,KAAK,IAAI;AAC7C,QAAM,KAAK,EAAE,QAAQ,MAAM,QAAQ,MAAM,GAAG,UAAU,QAAQ,OAC3D,SAAQ,MAAK,IAAI,QAAQ;;;AAKhC,yBACE,OACA,YACyD;CACzD,MAAM,2BAAY,IAAI;CACtB,MAAM,yBAAY,IAAI;CACtB,MAAM,4BAAY,IAAI;CAEtB,MAAM,SAAS,MACZ,KAAI,UAAS;AACZ,MAAI,CAAC,MAAM,OAAQ;EAEnB,MAAM,wBAAQ,IAAI;EAClB,MAAM,EACJ,QACA,QACA,cACE;AAEJ,MAAI;AACF,eAAY,QAAW,OAAO;AAC9B,eAAY,WAAW,OAAO;AAE9B,OAAI,MAAM,QAAQ,EAChB,OAAM,KAAK,EAAE,QAAQ,OAAO,GAAG,UAAU,QAAQ,GAAG,SAAQ,MAAK,MAAM,IAAI;AAC7E,eAAY,QAAQ,OAAO;WACpB,KAAK;AACZ,WAAQ,MAAM;;AAGhB,MAAI,SAAS,UAAU;GACrB,MAAM,EAAE,gBAAO,eAAQ,QAAQ;AAE/B,OAAIC,UAAQ,MAAMA,WAAS,EACzB,OAAM,IAAI,MAAM,mEAAoEA;AAEtF,OAAIC,QAAM,MAAMA,SAAO,EACrB,OAAM,IAAI,MAAM,iEAAkEA;AAEpF,OAAID,UAAQC,OACV;QAAI,CAAC,MAAM,KAAK,OAAO,MAAK,SAAS,QAAQD,WAAS,QAAQ,MAAO,QAAQC,OAC3E;cAEE,CAAC,MAAM,KAAK,OAAO,MAAK,SAAQ,QAAQD,WAAS,QAAQC,OAC3D;;EAIN,IAAIC;EACJ,IAAIC;EAEJ,MAAM,EACJ,WACA,SACA,KACA,QACA,SACA,OACA,SACE;AAEJ,MAAI,OAAO,WAAW;GACpB,MAAMC,OAAe,KAAK,QAAQ;AAElC,OAAI,OAAO,EAAG;AAEd,WAAQC,iBAAQ,MAAM,GAAI,UAAU,UAAU,GAAG,GAAI,GAAI,UAAU,UAAU,GAAG;AAChF,SAAQ,MAAM,QAAQ,IAAI,QAAQ;;EAGpC,IAAIC;EACJ,IAAIC;EACJ,IAAIC;AAEJ,MAAI,SAAS;AACX,eAAY,QAAQ,MAAM,KAAK,KAAI,MAAK,EAAE;AAC1C,cAAW,SAAQ,MAAK,SAAS,IAAI;;AAGvC,MAAI,OAAO;AACT,aAAU,MAAM,MAAM,KAAK,KAAI,MAAK,EAAE;AACtC,YAAS,SAAQ,MAAK,OAAO,IAAI;;AAGnC,MAAI,MAAM;AACR,gBAAa,OAAO,KAAK,MAAM,KAAK,KAAI,MAAK,EAAE;AAC/C,eAAY,SAAQ,MAAK,UAAU,IAAI;;EAGzC,MAAMC,MAAsE;GAC1E,KAAmB,MAAM;GACzB,mBAAmB,MAAM;GACzB,OAAmB,OAAO,MAAM,KAAK;GACrC,GAAG,WAAmB,EAAE;GACxB,GAAG,SAAmB,EAAE;GACxB,GAAG,OAAmB,EAAE;GACxB,GAAG,MAAM,SAAa,EAAE,QAAU,SAAW,KAAI,QAAO,EAAE;GAC1D,GAAG,MAAM,WAAa,EAAE,UAAU,WAAW,KAAI,QAAO,EAAE;GAC1D,GAAG,MAAM,QAAa;IACpB,aAAa;IACb,WAAa,YAAY,KAAK,WAAW,WACvC;KACE,WAAY,CAAC;KACb,YAAY;;;;AAMpB,SAAO;IAER,QAAO,MAAK,KAAK;CAGpB,MAAM,UAAU,cAAc,QAC3B,OACC,MAAK,EAAE,QAAQ,MAAuC,CAAC,CAAC,EAAE,OAC1D,MAAK,QAAQ,IAAG,MACd,EAAE,UACA,QAAQ,EAAE,QAAQ,KAAI,QAAKC,IAAE,IAAI,KAAK,QAErC,EAAE,QAAQ,SAAS,KAAO,QAAQ,EAAE,UAAU,KAAI,QAAKA,IAAE,IAAI,KAAK,SAEvE,MAAK,OAAO,OAAO,GAChB,KAAI,aAAU;EAEb,MAAM,EAAE,SAAS,kBAAQ,yBAAaC,SAAO;AAC7C,OAAK,MAAM,KAAKA,UAAQ;AACtB,UAAO,EAAE;AACT,UAAO,EAAE;;EAGX,MAAMC,SAAoD;GACxD,aAAa,GAAI,QAAS,IAAKC,YAAUC,aAAW,KAAI,QAAKJ,IAAE,IAAI,KAAK;GACxE,QAAaC,SAAO,KAAI,MAAK,EAAE;GAC/B,GAAGE;;AAIL,MAAI,KAAK,QAAQF,WAAQ,MAAK,EAAE,UAAU,KAAI,QAAKD,IAAE,IAAI,OAAO,KAAK,UAAU,GAAG;AAChF,UAAO,WAAWC,SAAO,GAAG,YAAY;AACxC,YAAO,SAAQ,MAAK,OAAO,EAAE;;AAE/B,MAAI,KAAK,QAAQA,WAAQ,MAAK,EAAE,WAAW,KAAI,QAAKD,IAAE,UAAU,IAAI,OAAO,KAAK,UAAU,GAAG;AAC3F,UAAO,YAAYC,SAAO,GAAG,aAAa;AAC1C,YAAO,SAAQ,MAAK,OAAO,EAAE;;AAG/B,SAAO;KAGZ;AAEH,QAAO;EACM;EACX,UAAW,MAAM,KAAK,UAAW,KAAI,SAAQ;GAAE;GAAK,aAAa;;EACjE,QAAW,MAAM,KAAK,QAAW,KAAI,SAAQ;GAAE;GAAK,aAAa;;EACjE,WAAW,MAAM,KAAK,WAAW,KAAI,SAAQ;GAAE;GAAK,aAAa"}
|
|
1
|
+
{"version":3,"file":"schedules.js","names":["days: Day[]","start","end","start: moment.Moment | undefined","end: moment.Moment | undefined","_day: number","getDate","_teachers: string[] | undefined","_groups: string[] | undefined","_locations: string[] | undefined","x","course: CoreTypes.SerializedWithOptionalId.Course","groups","teachers"],"sources":["../../../../src/SchoolSoft/file/from/schedules.ts"],"sourcesContent":["import type moment from 'moment';\nimport { trim, sortBy, countBy, size, groupBy } from 'lodash-es';\nimport type { Day, Event } from '../types/events';\nimport type { CoreTypes } from '../../../core';\nimport getDate from '../../../common/get-date';\nimport type { Options } from '../types';\nimport { makeChainable } from '../../../common/make-chainable';\n\nconst days: Day[] = ['Mån', 'Tis', 'Ons', 'Tor', 'Fre', 'Lör', 'Sön'];\n\nfunction _parseWeeks (\n weeks: string | undefined,\n set: Set<number>,\n method: ('add' | 'delete') = 'add'\n): void {\n if (!weeks) return;\n const intervals = weeks.split(',').map(x => trim(x)) as (`${number}-${number}` | `${number}${number}`)[];\n intervals.forEach(interval => {\n if (!interval.includes('-')) {\n set[method](Number(interval));\n return;\n }\n const [start, end] = interval.split('-').map(Number);\n Array.from({ length: end - start + 1 }, (_, index) => start + index)\n .forEach(x => set[method](x));\n });\n}\n\n\nexport default (\n input: Event[],\n options?: Options\n): Partial<CoreTypes.SerializedWithOptionalId.Schedule> => {\n const teachers = new Set<string>();\n const groups = new Set<string>();\n const locations = new Set<string>();\n\n const events = input\n .map(event => {\n if (!event.length) return;\n\n const weeks = new Set<number>();\n const {\n inweek,\n exweek,\n realweeks\n } = event;\n\n try {\n _parseWeeks(inweek, weeks, 'add');\n _parseWeeks(realweeks, weeks, 'add');\n\n if (weeks.size == 0)\n Array.from({ length: 51 }, (_, index) => index + 1).forEach(x => weeks.add(x));\n _parseWeeks(exweek, weeks, 'delete');\n } catch (err) {\n console.error(err);\n }\n\n if (options?.interval) {\n const { start, end } = options.interval;\n\n if (start > 52 || start <= 0)\n throw new Error(`(SchoolSoft::From::Schedules) Interval::start is invalid. value ${ start }`);\n\n if (end > 52 || end <= 0)\n throw new Error(`(SchoolSoft::From::Schedules) Interval::end is invalid. value ${ end }`);\n\n if (start > end) {\n if (!Array.from(weeks).some(week => (week >= start && week <= 52) || week <= end))\n return;\n } else {\n if (!Array.from(weeks).some(week => week >= start && week <= end))\n return;\n }\n }\n\n let start: moment.Moment | undefined;\n let end: moment.Moment | undefined;\n\n const {\n starttime,\n subject,\n day,\n length,\n teacher,\n group,\n room\n } = event;\n\n if (day && starttime) {\n const _day: number = days.indexOf(day);\n\n if (_day > 4) return;\n\n start = getDate(_day, `${ starttime.substring(0, 2) }:${ starttime.substring(2, 4) }`);\n end = start.clone().add(length, 'm');\n }\n\n let _teachers: string[] | undefined;\n let _groups: string[] | undefined;\n let _locations: string[] | undefined;\n\n if (teacher) {\n _teachers = teacher.split(',').map(x => x.trim());\n _teachers?.forEach(x => teachers.add(x));\n }\n\n if (group) {\n _groups = group.split(',').map(x => x.trim());\n _groups?.forEach(x => groups.add(x));\n }\n\n if (room) {\n _locations = sortBy(room.split(',').map(x => x.trim()));\n _locations?.forEach(x => locations.add(x));\n }\n\n const doc: CoreTypes.SerializedWithOptionalId.Event & { subject?: string } ={\n ids: event.id,\n preferredDuration: event.length,\n weeks: sortBy(Array.from(weeks)),\n ...subject && { subject },\n ...start && { start },\n ...end && { end },\n ...event.group && { groups: _groups ?.map(to => ({ to })) },\n ...event.teacher && { teachers: _teachers?.map(to => ({ to })) },\n ...event.room && {\n inLocations: _locations,\n locations: _locations?.map((_location, index: number) => (\n {\n locations: [_location],\n groupIndex: index\n })\n )\n }\n };\n\n return doc;\n })\n .filter(x => x != null);\n\n // construct courses from events with same subject, groups and teachers\n const courses = makeChainable(events)\n .chain(\n x => x.filter((e): e is typeof e & { ids: string } => !!e.ids),\n x => groupBy(x, e =>\n e.subject\n + '.g.' + e.groups?.map(x => x.to).join(',')\n // Subject Lunch only have teacher and no groups\n + (e.groups?.length ? '' : ('.t.' + e.teachers?.map(x => x.to).join(',') ))\n ),\n x => Object.values(x)\n .map(events => {\n // promote shared properties to course\n const { subject, groups, teachers } = events[0];\n for (const e of events) {\n delete e.subject;\n delete e.groups;\n }\n\n const course: CoreTypes.SerializedWithOptionalId.Course = {\n displayName: `${ subject }-${ (groups ?? teachers)?.map(x => x.to).join(' ') }`,\n events: events.map(e => e.ids),\n ...groups,\n };\n\n // try to also promote teachers and locations\n if (size(countBy(events, e => e.teachers?.map(x => x.to).sort().join(','))) == 1) {\n course.teachers = events[0].teachers ?? undefined;\n events.forEach(e => delete e.teachers);\n }\n if (size(countBy(events, e => e.locations?.map(x => x.locations[0]).sort().join(','))) == 1) {\n course.locations = events[0].locations ?? undefined;\n events.forEach(e => delete e.locations);\n }\n\n return course;\n })\n )\n .value;\n\n return {\n courses: courses,\n teachers: Array.from(teachers) .map(ids => ({ ids, displayName: ids })),\n groups: Array.from(groups) .map(ids => ({ ids, displayName: ids })),\n locations: Array.from(locations).map(ids => ({ ids, displayName: ids }))\n };\n};"],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { Types } from "../../core/types/index.js";
|
|
|
2
2
|
import { Event } from "./types/events.js";
|
|
3
3
|
import { export_default } from "./to/index.js";
|
|
4
4
|
import { Options, Types as Types$1 } from "./types/index.js";
|
|
5
|
+
import "../../index.js";
|
|
5
6
|
|
|
6
7
|
//#region src/SchoolSoft/file/index.d.ts
|
|
7
8
|
declare class Map {
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { BaseOptions } from "../../../common/types.js";
|
|
2
2
|
import { Types } from "../../../core/types/index.js";
|
|
3
|
-
import
|
|
3
|
+
import "../../../index.js";
|
|
4
|
+
import * as xlsx0 from "xlsx";
|
|
4
5
|
|
|
5
6
|
//#region src/SchoolSoft/file/to/index.d.ts
|
|
6
7
|
declare class export_default {
|
|
7
8
|
static schedules: (schedule: Types.Mixed.Schedule & {
|
|
8
9
|
division?: Types.Mixed.Division;
|
|
9
|
-
}, options?: BaseOptions) =>
|
|
10
|
+
}, options?: BaseOptions) => xlsx0.WorkBook;
|
|
10
11
|
}
|
|
11
12
|
//#endregion
|
|
12
13
|
export { export_default };
|
|
@@ -68,8 +68,7 @@ var schedules_default = (schedule, options = {}) => {
|
|
|
68
68
|
}
|
|
69
69
|
const subject = course.subject;
|
|
70
70
|
const _period = e.period ?? course.period ?? schedule.settings.period;
|
|
71
|
-
const
|
|
72
|
-
const weeks = period?.ranges.map((x) => {
|
|
71
|
+
const weeks = periodsMap.get(_period ? getVertexId(_period, options) : void 0)?.ranges.map((x) => {
|
|
73
72
|
const start$1 = moment.utc(x.start);
|
|
74
73
|
const end$1 = moment.utc(x.end);
|
|
75
74
|
const weeks$1 = new Array();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedules.js","names":["x","start","end","weeks"],"sources":["../../../../src/SchoolSoft/file/to/schedules.ts"],"sourcesContent":["import XLSX from 'xlsx';\nimport moment from 'moment';\nimport { orderBy, uniq } from 'lodash-es';\nimport type { CoreTypes } from '../../../core';\nimport { getDayIndex, getVertexId } from '../../../core/util';\nimport type { BaseOptions } from '../../../common/types';\nimport { makeChainable } from '../../../common/make-chainable';\n\n\ntype Undervisningsgrupp = {\n name?: string;\n socialnumber: string;\n externalid: string;\n classtype: 1 | 0;\n};\n\nfunction createUndervisningsgrupp (\n collection: 'courses' | 'events',\n entity: CoreTypes.Mixed.Course | CoreTypes.Mixed.Event,\n fallbackName: string | undefined,\n did: string,\n groupPersonsMap: Map<string, CoreTypes.Mixed.Person[]>,\n personsMap: Map<string, CoreTypes.Mixed.Person>,\n options: BaseOptions\n): Undervisningsgrupp {\n const SSNs = makeChainable(entity.groups ?? [])\n .chain(\n x => x\n .map(x => {\n const include = groupPersonsMap.get(getVertexId(x.to, options))?.map(x => x.SSN?.value)\n .filter((x): x is string => !!x) ?? [];\n const exclude = x.exclude?.map(x => personsMap.get(getVertexId(x, options))?.SSN?.value).filter((x): x is string => !!x) ?? [];\n return include.filter(x => !exclude.includes(x));\n })\n .concat(entity.participants?.map(({ to }) => personsMap.get(getVertexId(to, options))?.SSN?.value).filter((x): x is string => !!x) ?? [])\n .flat(),\n x => uniq(x).join(', ')\n )\n .value;\n\n return {\n name: entity.displayName ?? fallbackName,\n socialnumber: SSNs,\n externalid: `${did}.${getVertexId(entity, options)}${collection == 'courses' ? 'C' : 'E'}`,\n classtype: 0\n };\n};\n\nexport default (\n schedule: CoreTypes.Mixed.Schedule & { division?: CoreTypes.Mixed.Division },\n options: BaseOptions = {}\n): XLSX.WorkBook => {\n const division = schedule.division ?? schedule.divisions;\n\n // must have a division id\n const did = getVertexId(division, options);\n\n // a map of period id -> period\n const periodsMap = new Map(schedule.periods.map(p => [getVertexId(p, options) as string | undefined, p as Pick<CoreTypes.Mixed.Period, 'ranges'>]));\n periodsMap.set(undefined, { ranges: [{ start: division.start, end: division.end }] });\n\n // a map of group id -> persons\n const groupPersonsMap = new Map<string, CoreTypes.Mixed.Person[]>();\n schedule.persons.forEach(p => {\n if (!p.group) return;\n const gid = getVertexId(p.group, options);\n if (!groupPersonsMap.has(gid)) groupPersonsMap.set(gid, []);\n groupPersonsMap.get(gid)?.push(p);\n });\n\n // a map of person id -> person\n const personsMap = new Map(schedule.persons.map(p => [getVertexId(p, options), p]));\n\n // a map of teacher id -> teacher\n const teachersMap = new Map(schedule.teachers.map(t => [getVertexId(t, options), t]));\n\n // a map of course id -> course\n const coursesMap = new Map(schedule.courses.map(c => [getVertexId(c, options), c]));\n\n\n ////\n //// kurser, grupper -> undervisningsgrupper\n ////\n let undervisningsgrupper = new Array<Undervisningsgrupp>();\n schedule.courses.forEach(c => {\n undervisningsgrupper.push(createUndervisningsgrupp('courses', c, '', did, groupPersonsMap, personsMap, options));\n });\n schedule.groups.forEach(g => {\n const SSNs = (groupPersonsMap.get(getVertexId(g, options))?? [])\n .map(x => x.SSN?.value)\n .filter((x): x is string => !!x)\n .join(', ');\n\n undervisningsgrupper.push({\n name: g.displayName,\n socialnumber: SSNs,\n externalid: `${did}.${getVertexId(g, options)}G`,\n classtype: 1\n });\n });\n\n // for convenience, sort first by classtype in descending order, then by name\n undervisningsgrupper = orderBy(undervisningsgrupper, ['classtype', 'name'], ['desc', 'asc']);\n\n\n ////\n //// salar\n ////\n const salar = schedule.locations\n .map(l => ({\n name: l.displayName,\n externalid: `${did}.${getVertexId(l, options)}`\n }));\n\n\n ////\n //// lektioner\n ////\n const lektioner = schedule.events\n .map(e => {\n // must have start and end\n if (!e.start || !e.end) return null;\n const start = moment.utc(e.start);\n const end = moment.utc(e.end);\n\n // must have course\n const course = e.course ? coursesMap.get(getVertexId(e.course, options)) : undefined;\n if (!course) return null;\n let groupexternalid = `${did}.${getVertexId(course, options)}C`;\n\n // if the event overrides the course's groups or participants, create a new overlap group from the event\n if (e.groups || e.participants) {\n const UG = createUndervisningsgrupp('events', e, course.displayName, did, groupPersonsMap, personsMap, options);\n undervisningsgrupper.push(UG);\n groupexternalid = UG.externalid;\n }\n\n const subject = course.subject;\n const _period = e.period ?? course.period ?? schedule.settings.period;\n const period = periodsMap.get(_period ? getVertexId(_period, options) : undefined);\n\n const weeks = period?.ranges.map(x => {\n // fetch all weeks between start and end\n const start = moment.utc(x.start);\n const end = moment.utc(x.end);\n const weeks = new Array<number>();\n while (start.isBefore(end)) {\n weeks.push(start.week());\n start.add(1, 'week');\n }\n return weeks;\n }).flat()\n .join(', ');\n\n const teachers = (e.teachers ?? course.teachers ?? [])\n .map(x => teachersMap.get(getVertexId(x.to, options))?.ids)\n .filter((x): x is string => !!x)\n .join(', ');\n\n const rooms = (e.inLocations as CoreTypes.Deep.Location[] ?? [])\n .filter(Boolean)\n .map(x => `${did}.${getVertexId(x, options)}`)\n .join(', ');\n\n return {\n dayid: getDayIndex(start),\n starttime: start.format('HHmm'),\n length: end.diff(start, 'minutes'),\n roomexternalid: rooms,\n subject: subject,\n exweek: '',\n inweek: weeks,\n period: '',\n groupexternalid: groupexternalid,\n teacherid: teachers,\n externalref: `${did}.${getVertexId(e, options)}`,\n };\n })\n .filter(x => x != null);\n\n\n ////\n //// store in workbook\n ////\n const wb = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(undervisningsgrupper), '1. Undervisningsgrupper');\n XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(salar), '2. Salar');\n XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(lektioner), '3. Lektioner');\n\n return wb;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schedules.js","names":["x","start","end","weeks"],"sources":["../../../../src/SchoolSoft/file/to/schedules.ts"],"sourcesContent":["import XLSX from 'xlsx';\nimport moment from 'moment';\nimport { orderBy, uniq } from 'lodash-es';\nimport type { CoreTypes } from '../../../core';\nimport { getDayIndex, getVertexId } from '../../../core/util';\nimport type { BaseOptions } from '../../../common/types';\nimport { makeChainable } from '../../../common/make-chainable';\n\n\ntype Undervisningsgrupp = {\n name?: string;\n socialnumber: string;\n externalid: string;\n classtype: 1 | 0;\n};\n\nfunction createUndervisningsgrupp (\n collection: 'courses' | 'events',\n entity: CoreTypes.Mixed.Course | CoreTypes.Mixed.Event,\n fallbackName: string | undefined,\n did: string,\n groupPersonsMap: Map<string, CoreTypes.Mixed.Person[]>,\n personsMap: Map<string, CoreTypes.Mixed.Person>,\n options: BaseOptions\n): Undervisningsgrupp {\n const SSNs = makeChainable(entity.groups ?? [])\n .chain(\n x => x\n .map(x => {\n const include = groupPersonsMap.get(getVertexId(x.to, options))?.map(x => x.SSN?.value)\n .filter((x): x is string => !!x) ?? [];\n const exclude = x.exclude?.map(x => personsMap.get(getVertexId(x, options))?.SSN?.value).filter((x): x is string => !!x) ?? [];\n return include.filter(x => !exclude.includes(x));\n })\n .concat(entity.participants?.map(({ to }) => personsMap.get(getVertexId(to, options))?.SSN?.value).filter((x): x is string => !!x) ?? [])\n .flat(),\n x => uniq(x).join(', ')\n )\n .value;\n\n return {\n name: entity.displayName ?? fallbackName,\n socialnumber: SSNs,\n externalid: `${did}.${getVertexId(entity, options)}${collection == 'courses' ? 'C' : 'E'}`,\n classtype: 0\n };\n};\n\nexport default (\n schedule: CoreTypes.Mixed.Schedule & { division?: CoreTypes.Mixed.Division },\n options: BaseOptions = {}\n): XLSX.WorkBook => {\n const division = schedule.division ?? schedule.divisions;\n\n // must have a division id\n const did = getVertexId(division, options);\n\n // a map of period id -> period\n const periodsMap = new Map(schedule.periods.map(p => [getVertexId(p, options) as string | undefined, p as Pick<CoreTypes.Mixed.Period, 'ranges'>]));\n periodsMap.set(undefined, { ranges: [{ start: division.start, end: division.end }] });\n\n // a map of group id -> persons\n const groupPersonsMap = new Map<string, CoreTypes.Mixed.Person[]>();\n schedule.persons.forEach(p => {\n if (!p.group) return;\n const gid = getVertexId(p.group, options);\n if (!groupPersonsMap.has(gid)) groupPersonsMap.set(gid, []);\n groupPersonsMap.get(gid)?.push(p);\n });\n\n // a map of person id -> person\n const personsMap = new Map(schedule.persons.map(p => [getVertexId(p, options), p]));\n\n // a map of teacher id -> teacher\n const teachersMap = new Map(schedule.teachers.map(t => [getVertexId(t, options), t]));\n\n // a map of course id -> course\n const coursesMap = new Map(schedule.courses.map(c => [getVertexId(c, options), c]));\n\n\n ////\n //// kurser, grupper -> undervisningsgrupper\n ////\n let undervisningsgrupper = new Array<Undervisningsgrupp>();\n schedule.courses.forEach(c => {\n undervisningsgrupper.push(createUndervisningsgrupp('courses', c, '', did, groupPersonsMap, personsMap, options));\n });\n schedule.groups.forEach(g => {\n const SSNs = (groupPersonsMap.get(getVertexId(g, options))?? [])\n .map(x => x.SSN?.value)\n .filter((x): x is string => !!x)\n .join(', ');\n\n undervisningsgrupper.push({\n name: g.displayName,\n socialnumber: SSNs,\n externalid: `${did}.${getVertexId(g, options)}G`,\n classtype: 1\n });\n });\n\n // for convenience, sort first by classtype in descending order, then by name\n undervisningsgrupper = orderBy(undervisningsgrupper, ['classtype', 'name'], ['desc', 'asc']);\n\n\n ////\n //// salar\n ////\n const salar = schedule.locations\n .map(l => ({\n name: l.displayName,\n externalid: `${did}.${getVertexId(l, options)}`\n }));\n\n\n ////\n //// lektioner\n ////\n const lektioner = schedule.events\n .map(e => {\n // must have start and end\n if (!e.start || !e.end) return null;\n const start = moment.utc(e.start);\n const end = moment.utc(e.end);\n\n // must have course\n const course = e.course ? coursesMap.get(getVertexId(e.course, options)) : undefined;\n if (!course) return null;\n let groupexternalid = `${did}.${getVertexId(course, options)}C`;\n\n // if the event overrides the course's groups or participants, create a new overlap group from the event\n if (e.groups || e.participants) {\n const UG = createUndervisningsgrupp('events', e, course.displayName, did, groupPersonsMap, personsMap, options);\n undervisningsgrupper.push(UG);\n groupexternalid = UG.externalid;\n }\n\n const subject = course.subject;\n const _period = e.period ?? course.period ?? schedule.settings.period;\n const period = periodsMap.get(_period ? getVertexId(_period, options) : undefined);\n\n const weeks = period?.ranges.map(x => {\n // fetch all weeks between start and end\n const start = moment.utc(x.start);\n const end = moment.utc(x.end);\n const weeks = new Array<number>();\n while (start.isBefore(end)) {\n weeks.push(start.week());\n start.add(1, 'week');\n }\n return weeks;\n }).flat()\n .join(', ');\n\n const teachers = (e.teachers ?? course.teachers ?? [])\n .map(x => teachersMap.get(getVertexId(x.to, options))?.ids)\n .filter((x): x is string => !!x)\n .join(', ');\n\n const rooms = (e.inLocations as CoreTypes.Deep.Location[] ?? [])\n .filter(Boolean)\n .map(x => `${did}.${getVertexId(x, options)}`)\n .join(', ');\n\n return {\n dayid: getDayIndex(start),\n starttime: start.format('HHmm'),\n length: end.diff(start, 'minutes'),\n roomexternalid: rooms,\n subject: subject,\n exweek: '',\n inweek: weeks,\n period: '',\n groupexternalid: groupexternalid,\n teacherid: teachers,\n externalref: `${did}.${getVertexId(e, options)}`,\n };\n })\n .filter(x => x != null);\n\n\n ////\n //// store in workbook\n ////\n const wb = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(undervisningsgrupper), '1. Undervisningsgrupper');\n XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(salar), '2. Salar');\n XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(lektioner), '3. Lektioner');\n\n return wb;\n};\n"],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import { Options, Types } from "./file/types/index.js";
|
|
|
5
5
|
import { Map } from "./file/index.js";
|
|
6
6
|
import { Types as Types$1 } from "./api/types/index.js";
|
|
7
7
|
import { Map as Map$1 } from "./api/index.js";
|
|
8
|
+
import "../index.js";
|
|
8
9
|
|
|
9
10
|
//#region src/SchoolSoft/index.d.ts
|
|
10
11
|
declare class SchoolSoftMap {
|
|
@@ -218,10 +218,8 @@ var schedules_default = (data, options = {}) => {
|
|
|
218
218
|
const totalHoursRegex = /(\d+) hrs/;
|
|
219
219
|
const weekTimeRegex = /(\d+) min\/week/;
|
|
220
220
|
const c = courses?.map((course) => {
|
|
221
|
-
const
|
|
222
|
-
const
|
|
223
|
-
const groupIds = course.groups?.map((x) => getVertexId(x.to, options));
|
|
224
|
-
const groups$1 = groupIds?.map((id) => groupMap.get(id)).filter((x) => x != null) ?? [];
|
|
221
|
+
const teachers$1 = (course.teachers?.map((x) => getVertexId(x.to, options)))?.map((id) => teacherMap.get(id)).filter((x) => x != null) ?? [];
|
|
222
|
+
const groups$1 = (course.groups?.map((x) => getVertexId(x.to, options)))?.map((id) => groupMap.get(id)).filter((x) => x != null) ?? [];
|
|
225
223
|
const syllabus = course.syllabus;
|
|
226
224
|
const subject = syllabus && typeof syllabus == "object" ? "courseCode" in syllabus ? syllabus.subjectCode ?? course.subject : course.subject ?? ("subjectName" in syllabus ? syllabus.subjectName : void 0) : course.subject;
|
|
227
225
|
return {
|
|
@@ -266,14 +264,9 @@ var schedules_default = (data, options = {}) => {
|
|
|
266
264
|
let period = event.period == null ? course?.period : event.period;
|
|
267
265
|
if (isString(period)) period = periodMap.get(period);
|
|
268
266
|
if (period && !("ranges" in period)) period = void 0;
|
|
269
|
-
const
|
|
270
|
-
const
|
|
271
|
-
const
|
|
272
|
-
const g$1 = event.groups == null ? course?.groups : event.groups;
|
|
273
|
-
const groupIds = g$1?.map((x) => getVertexId(x.to, options));
|
|
274
|
-
const groups$1 = groupIds?.map((id) => groupMap.get(id)).filter(Boolean) ?? [];
|
|
275
|
-
const locationIds = event.inLocations?.map((x) => x ? getVertexId(x, options) : null).filter((x) => x != null);
|
|
276
|
-
const locations$1 = locationIds?.map((id) => locationMap.get(id)).filter(Boolean) ?? [];
|
|
267
|
+
const teachers$1 = ((event.teachers == null ? course?.teachers : event.teachers)?.map((x) => getVertexId(x.to, options)))?.map((id) => teacherMap.get(id)).filter(Boolean) ?? [];
|
|
268
|
+
const groups$1 = ((event.groups == null ? course?.groups : event.groups)?.map((x) => getVertexId(x.to, options)))?.map((id) => groupMap.get(id)).filter(Boolean) ?? [];
|
|
269
|
+
const locations$1 = (event.inLocations?.map((x) => x ? getVertexId(x, options) : null).filter((x) => x != null))?.map((id) => locationMap.get(id)).filter(Boolean) ?? [];
|
|
277
270
|
const dayOfWeek = moment.utc(event.start).toDate().toLocaleDateString("sv-SE", {
|
|
278
271
|
weekday: "long",
|
|
279
272
|
timeZone: "UTC"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedules.js","names":["s","teachers","groups","t","g","locations","allWeeks: moment.Moment[]","index"],"sources":["../../../../src/Schoolity/txt/to/schedules.ts"],"sourcesContent":["import Papa from 'papaparse';\nimport moment from 'moment';\nimport { isString } from 'lodash-es';\nimport type { Types as MongooseTypes } from 'mongoose';\nimport { isObjectIdOrHexString } from 'mongoose';\nimport type { CoreTypes } from '../../../core';\nimport type { BaseOptions } from '../../../common/types';\nimport { getVertexId } from '../../../core/util';\n\nconst papaOptions = {\n quotes: false, //or array of booleans\n quoteChar: '\"',\n escapeChar: '\"',\n delimiter: '\\t',\n header: true,\n newline: '\\r\\n',\n skipEmptyLines: false, //other option is 'greedy', meaning skip delimiters, quotes, and whitespace.\n // columns: null //or array of strings\n} as Papa.UnparseConfig;\n\nconst uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nexport default (\n data: CoreTypes.Mixed.Schedule,\n options: BaseOptions = {}\n): string => {\n const { locations, teachers, groups, persons, events, courses, periods, syllabuses, divisions } = data;\n const { start, end, displayName } = divisions ?? data as unknown as CoreTypes.Mixed.Division;\n\n const startYear = moment.utc(start).year ();\n const startMonth = moment.utc(start).month();\n\n const courseMap = new Map(data.courses ?.map(x => [getVertexId(x, options), x]));\n const periodMap = new Map(data.periods ?.map(x => [getVertexId(x, options), x]));\n const teacherMap = new Map(data.teachers ?.map(x => [getVertexId(x, options), x]));\n const groupMap = new Map(data.groups ?.map(x => [getVertexId(x, options), x]));\n const locationMap = new Map(data.locations ?.map(x => [getVertexId(x, options), x]));\n const syllabusMap = new Map(data.syllabuses?.map(x => [getVertexId(x, options), x]));\n\n // Stupid thing Schoolity wants (Nikos responsible for future bugs)\n // This overrides the normal behavior for gr. So basically if a course has a subject it will always use that for subjectCode and fulltext, even if it has a syllabus with different values.\n // In the case where a course has a syllabus but no subject it will use the regular behavior.\n\n const subjectSyllabusMap = new Map<string, { subjectCode: string, guid?: string, fullText: string }>();\n if (courses) {\n for (const course of courses) {\n const subject = course.subject;\n const syllabus = course.syllabus;\n if (subject) {\n // If the course has a subject, we want to use that instead of syllabus. This is because Schoolity is stupid. Also note that this is endorsed by Nikos. :(\n if (!subjectSyllabusMap.has(subject)) {\n subjectSyllabusMap.set(subject, {\n subjectCode: subject,\n fullText: subject,\n guid: typeof syllabus == 'object' && 'ids' in syllabus ? syllabus?.ids : undefined\n });\n }\n } else if (typeof syllabus == 'object' && 'subjectCode' in syllabus && syllabus.subjectCode && !syllabus.courseCode) {\n // If the course has a syllabus but no subject, we want to use the syllabus id as the identifier\n // and not the course id. This is because Schoolity expects the syllabus to be unique across all courses.\n if (!subjectSyllabusMap.has(getVertexId(syllabus, options))) {\n subjectSyllabusMap.set(getVertexId(syllabus, options), {\n subjectCode: syllabus.subjectName, // Use subjectName as subjectCode (Nikos responsible for future bugs)\n fullText: syllabus.subjectName,\n guid: syllabus.ids\n });\n };\n }\n };\n }\n\n // Set cvs to the source section\n let csv = `[Source]${papaOptions.newline}ApplicationVerMajor=4${papaOptions.newline}ApplicationVerMinor=0${papaOptions.newline}DatabaseRevNo=527${papaOptions.newline}CurrentNovaschemDatabase=${papaOptions.newline}User=${papaOptions.newline}`;\n csv += `SchoolID=RS${papaOptions.newline}School=${displayName}${papaOptions.newline}County=RS${papaOptions.newline}`;\n csv += `BaseYear=${startYear}${papaOptions.newline}OffsetYear=0${papaOptions.newline}OffsetMonth=${startMonth}${papaOptions.newline}CreationDate=${moment().format('YYYY-MM-DD')}${papaOptions.newline}${papaOptions.newline}`;\n // add destination section to csv\n csv += `[Destination]${papaOptions.newline}Application=${papaOptions.newline}ApplicationID=${papaOptions.newline}${papaOptions.newline}`;\n\n // add database options to csv\n csv += `[DatabaseOptions]${papaOptions.newline}Update=TRUE${papaOptions.newline}AddNew=TRUE${papaOptions.newline}${papaOptions.newline}`;\n\n // start tables section\n csv += `[Tables]${papaOptions.newline}${papaOptions.newline}`;\n\n // append locations to csv\n const l = locations?.map(location => {\n return {\n 'Room (6601)': location.displayName!,\n 'GUID (5800)': (location.ids && uuid.test(location.ids)) ? `{${location.ids}}` : '',\n 'Category (6602)': location.tags?.find(tag => tag.type == 'category')?.value ?? '',\n 'SeatingCapacity (6607)': location.maximumCapacity,\n };\n }) ?? [];\n csv += `${papaOptions.newline}Room (6600)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (l.length) {\n csv += Papa.unparse(l, papaOptions);\n } else {\n csv += ['Room (6601)', 'GUID (5800)', 'Category (6602)', 'SeatingCapacity (6607)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append subjects to csv\n // First add all subjects from syllabuses with courses (they should follow the standard)\n const subjectSyllabuses = syllabuses?.reduce((unique, syllabus) => {\n if (syllabus.subjectCode && syllabus.courseCode && !unique.seen.has(syllabus.subjectCode)) {\n unique.seen.add(syllabus.subjectCode);\n unique.result.push({\n 'Subject (6401)': syllabus.subjectCode,\n 'GUID (5800)': syllabus.ids,\n 'Category (6402)': '',\n 'FullText (6403)': syllabus.subjectName,\n 'BackgroundColor (6432)': '',\n 'TextColor (6433)': '',\n 'EvaluationNumber (6429)': ''\n });\n }\n return unique;\n }, {\n seen: new Set<string>(),\n result: [] as Array<{\n 'Subject (6401)': string;\n 'GUID (5800)': string | undefined;\n 'Category (6402)': string | undefined;\n 'FullText (6403)': string;\n 'BackgroundColor (6432)': string | undefined;\n 'TextColor (6433)': string | undefined;\n 'EvaluationNumber (6429)': string | undefined;\n }>\n })?.result ?? [];\n // Then add all subjects from the subjectSyllabusMap (they should follow the Nikos standard, that is, the stupid one)\n subjectSyllabuses.push(...Array.from(subjectSyllabusMap.values()).map(subject => {\n return {\n 'Subject (6401)': subject.subjectCode,\n 'GUID (5800)': subject.guid,\n 'Category (6402)': '',\n 'FullText (6403)': subject.fullText,\n 'BackgroundColor (6432)': '',\n 'TextColor (6433)': '',\n 'EvaluationNumber (6429)': ''\n };\n }));\n\n csv += `${papaOptions.newline}Subject (6400)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (subjectSyllabuses.length) {\n csv += Papa.unparse(subjectSyllabuses, papaOptions);\n } else {\n csv += ['Subject (6401)', 'GUID (5800)', 'Category (6402)', 'FullText (6403)', 'BackgroundColor (6432)', 'TextColor (6433)', 'EvaluationNumber (6429)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append teachers to csv\n const t = teachers?.map(teacher => {\n return {\n 'Teacher (6001)': teacher.signature,\n 'GUID (5800)': '',\n 'Category (6002)': '',\n 'PersonalCode (6028)': 'person' in teacher && typeof teacher.person == 'object' && 'SSN' in teacher.person ? (teacher.person?.SSN?.value ?? '') : '',\n 'LastName (6003)': '',\n 'Title (6006)': '',\n 'FirstName (6004)': '',\n 'Phone (6033)': '',\n 'EMail (6034)': '',\n 'EvaluationNumber (6014)': ''\n };\n }) ?? [];\n csv += `${papaOptions.newline}Teacher (6000)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (t.length) {\n csv += Papa.unparse(t, papaOptions);\n } else {\n csv += ['Teacher (6001)', 'GUID (5800)', 'Category (6002)', 'PersonalCode (6028)', 'LastName (6003)', 'Title (6006)', 'FirstName (6004)', 'Phone (6033)', 'EMail (6034)', 'EvaluationNumber (6014)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append students to csv\n const s = persons?.filter(person => {\n return person.type != 'Teacher';\n }).filter((s) => Boolean(s.SSN)).map(person => {\n return {\n 'Student (7201)': person.SSN?.value,\n 'GUID (5800)': (person.ids && uuid.test(person.ids)) ? `{${person.ids}}` : '',\n 'Category (7305)': '',\n 'LastName (7202)': person.lastName ?? '',\n 'FirstName (7211)': person.firstName ?? '',\n 'EMail (7215)': person.emails?.[0]?.value ?? ''\n };\n }) ?? [];\n csv += `${papaOptions.newline}Student (7200)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (s.length) {\n csv += Papa.unparse(s, papaOptions);\n } else {\n csv += ['Student (7201)', 'GUID (5800)', 'Category (7305)', 'LastName (7202)', 'FirstName (7211)', 'EMail (7215)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // create a map of students.id to students.SSN\n const studentMap = new Map(persons?.filter(x => x.type != 'Teacher').map(x => [getVertexId(x, options), x.SSN?.value ?? '']));\n\n // append groups to csv\n const g = groups?.map(group => {\n return {\n 'Group (6201)': group.displayName!,\n 'GUID (5800)': (group.ids && uuid.test(group.ids)) ? `{${group.ids}}` : '',\n 'Class (6210)': group.species == 'class' ? 1 : 0,\n 'Teacher (6204)': '',\n 'IClass (6206)': '',\n 'Student (6205)': group.members?.map(x => studentMap.get(getVertexId(x, options))).filter(Boolean).join(',')\n };\n }) ?? [];\n csv += `${papaOptions.newline}Group (6200)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (g.length) {\n csv += Papa.unparse(g, papaOptions);\n } else {\n csv += ['Group (6201)', 'GUID (5800)', 'Class (6210)', 'Teacher (6204)', 'IClass (6206)', 'Student (6205)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append courses to csv (only if there actually are courses, since its very important to Schoolity that the course table isn't present for GR)\n const courseSyllabuses = syllabuses?.filter(syllabus => !!syllabus.courseName).map(syllabus => {\n return {\n 'Course (7601)': syllabus.courseCode,\n 'GUID (5800)': syllabus.ids,\n 'FullText (7602)': syllabus.courseName,\n 'Subject (7603)': syllabus.subjectCode ?? '',\n 'Points (7604)': syllabus.points\n };\n }) ?? [];\n if (courseSyllabuses.length) {\n csv += `${papaOptions.newline}Course (7600)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n csv += Papa.unparse(courseSyllabuses, papaOptions);\n csv += papaOptions.newline;\n }\n // else {\n // csv += ['PK (7100)', 'GUID (5800)', 'DayOfWeek (7101)', 'Starttime (7102)', 'Length (7115)', 'Course (7106)', 'Subject (7103)', 'Period (7108)', 'Week (7109)', 'ActualWeeks (7167)'].join(options.delimiter);\n // }\n\n // append periods to csv\n const p = periods?.map(period => {\n return {\n 'Period (8001)': period.displayName!,\n 'GUID (5800)': (period.ids && uuid.test(period.ids)) ? `{${period.ids}}` : '',\n 'TextBelowSchedule (8002)': period.displayName!,\n 'Category (8006)': '',\n 'Calendar (8005)': period.ranges?.map(range => `${moment.utc(range.start).format('D/M')}-${moment.utc(range.end).format('D/M')}`).join(', ')\n };\n }) ?? [];\n csv += `${papaOptions.newline}Period (8000)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (p.length) {\n csv += Papa.unparse(p, papaOptions);\n } else {\n csv += ['Period (8001)', 'GUID (5800)', 'TextBelowSchedule (8002)', 'Category (8006)', 'Calendar (8005)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append TA to csv\n const totalHoursRegex = /(\\d+) hrs/;\n const weekTimeRegex = /(\\d+) min\\/week/;\n const c = courses?.map(course => {\n // Only use deserialize teachers\n const teacherIds = course.teachers?.map(x => getVertexId(x.to, options));\n const teachers = teacherIds?.map(id => teacherMap.get(id)).filter(x => x != null) ?? [];\n\n // Only use deserialize groups\n const groupIds = course.groups?.map(x => getVertexId(x.to, options));\n const groups = groupIds?.map(id => groupMap.get(id)).filter(x => x != null) ?? [];\n\n // Only use deserialize syllabus\n const syllabus = course.syllabus;\n const subject = syllabus && typeof syllabus == 'object'\n ? 'courseCode' in syllabus\n ? syllabus.subjectCode ?? course.subject\n : course.subject ?? ('subjectName' in syllabus ? syllabus.subjectName : undefined)\n : course.subject;\n\n return {\n 'PK (8200)': '',\n 'GUID (5800)': course.ids,\n 'OriginalRecord (8224)': '1',\n 'CreateLesson (8227)': '1',\n 'Course (8202)': typeof syllabus == 'object' && 'courseCode' in syllabus ? syllabus?.courseCode : undefined,\n 'Subject (8209)': subject ?? '', // Nikos ansvarig för framtida buggar\n 'Teacher (8210)': teachers?.map(x => x.signature ).filter(Boolean).join(','),\n 'Group (8203)': groups ?.map(x => x.displayName).filter(Boolean).join(','),\n 'TotalHours (8204)': (course.plannedDuration && totalHoursRegex.test(course.plannedDuration)) ? totalHoursRegex.exec(course.plannedDuration)![1] : '',\n 'Weektime (8208)': (course.plannedDuration && weekTimeRegex.test(course.plannedDuration)) ? weekTimeRegex.exec(course.plannedDuration)![1] : '',\n 'Blockname (8215)': '',\n 'Period (8206)': '',\n 'Week (8207)': '',\n 'NotPeriod (8212)': '',\n 'NotWeek (8213)': ''\n };\n }) ?? [];\n csv += `${papaOptions.newline}TA (8200)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (c.length) {\n csv += Papa.unparse(c, papaOptions);\n } else {\n csv += ['Course (8202)', 'GUID (5800)', 'Subject (8209)', 'Teacher (8210)', 'Group (8203)', 'TotalHours (8204)', 'Weektime (8208)', 'Blockname (8215)', 'Period (8206)', 'Week (8207)', 'NotPeriod (8212)', 'NotWeek (8213)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append lessons to csv\n const e = events\n // ?.filter(x => !isNaN(Date.parse(x.start?.toString() ?? '')))\n ?.map((event, index) => {\n if (!event.start || !event.end) return;\n\n const courseId = event.course ? getVertexId(event.course, options) : undefined;\n const course = courseId ? courseMap.get(courseId) : undefined;\n\n // Only use deserialize period\n let period = event.period == null ? course?.period : event.period;\n if (isString(period))\n period = periodMap.get(period);\n if ((period && !('ranges' in period)))\n period = undefined;\n\n // Only use deserialize teachers\n const t = event.teachers == null ? course?.teachers : event.teachers;\n const teacherIds = t?.map(x => getVertexId(x.to, options));\n const teachers = teacherIds?.map(id => teacherMap.get(id)).filter(Boolean) ?? [];\n\n // Only use deserialize groups\n const g = event.groups == null ? course?.groups : event.groups;\n const groupIds = g?.map(x => getVertexId(x.to, options));\n const groups = groupIds?.map(id => groupMap.get(id)).filter(Boolean) ?? [];\n\n // Only use deserialize locations\n const locationIds = event.inLocations?.map(x => x ? getVertexId(x, options) : null).filter(x => x != null);\n const locations = locationIds?.map(id => locationMap.get(id)).filter(Boolean) ?? [];\n const dayOfWeek = moment.utc(event.start).toDate().toLocaleDateString('sv-SE', { weekday: 'long', timeZone: 'UTC' });\n\n // Syllabus of the course\n const syllabusId = isString(course?.syllabus) ? course.syllabus : (course?.syllabus && isObjectIdOrHexString(course?.syllabus)) ? (course?.syllabus as MongooseTypes.ObjectId | string).toString() : undefined;\n const syllabus = syllabusId ? syllabusMap.get(syllabusId) : course?.syllabus as CoreTypes.Deep.Syllabus | undefined;\n const isCourseSyllabus = !!syllabus?.courseCode;\n\n // From start and end, get all weeks that the schedule spans\n const allWeeks: moment.Moment[] = [];\n const endDate = moment.utc(end);\n const currentDate = moment.utc(start);\n while (currentDate.isBefore(endDate) || currentDate.isSame(endDate, 'day')) {\n allWeeks.push(currentDate.clone());\n currentDate.add(1, 'week');\n }\n\n const actualWeeks = period\n ? period?.ranges?.map(range => `${moment.utc(range.start).week()}-${moment.utc(range.end).week()}`).join(',')\n : allWeeks.map((week, index) => {\n const nextWeek = index < allWeeks.length - 1 ? allWeeks[index + 1] : week.clone().add(1, 'week');\n return `${week.week()}-${nextWeek.week()}`;\n }).join(',');\n\n // capitalize first letter of dayOfWeek\n const dayOfWeekCapitalized = dayOfWeek.charAt(0).toUpperCase() + dayOfWeek.slice(1);\n return {\n 'PK (7100)': index + 1,\n 'GUID (5800)': (event.ids && uuid.test(event.ids)) ? `{${event.ids}}` : '',\n 'DayOfWeek (7101)': dayOfWeekCapitalized,\n 'Starttime (7102)': moment.utc(event.start).format('HH:mm'),\n 'Length (7115)': event.duration,\n 'Course (7106)': syllabus?.courseCode,\n 'Subject (7103)': isCourseSyllabus ? (syllabus?.subjectCode ?? course?.subject) : (course?.subject ?? syllabus?.subjectName) ?? '', // Nikos ansvarig för framtida buggar\n 'Teacher (7104)': teachers ?.map(x => x?.signature ).filter(Boolean).join(','),\n 'Group (7105)': groups ?.map(x => x?.displayName).filter(Boolean).join(','),\n 'Room (7107)': locations?.map(x => x?.displayName).filter(Boolean).join(','),\n 'Period (7108)': '',\n 'Week (7109)': '',\n 'ActualWeeks (7167)': actualWeeks\n };\n }) ?? [];\n csv += `${papaOptions.newline}Lesson (7100)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (e.length) {\n csv += Papa.unparse(e, papaOptions);\n } else {\n csv += ['PK (7100)', 'GUID (5800)', 'DayOfWeek (7101)', 'Starttime (7102)', 'Length (7115)', 'Course (7106)', 'Subject (7103)', 'Period (7108)', 'Week (7109)', 'ActualWeeks (7167)'].join(papaOptions.delimiter);\n }\n\n return csv;\n};"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schedules.js","names":["s","teachers","groups","locations","allWeeks: moment.Moment[]","index"],"sources":["../../../../src/Schoolity/txt/to/schedules.ts"],"sourcesContent":["import Papa from 'papaparse';\nimport moment from 'moment';\nimport { isString } from 'lodash-es';\nimport type { Types as MongooseTypes } from 'mongoose';\nimport { isObjectIdOrHexString } from 'mongoose';\nimport type { CoreTypes } from '../../../core';\nimport type { BaseOptions } from '../../../common/types';\nimport { getVertexId } from '../../../core/util';\n\nconst papaOptions = {\n quotes: false, //or array of booleans\n quoteChar: '\"',\n escapeChar: '\"',\n delimiter: '\\t',\n header: true,\n newline: '\\r\\n',\n skipEmptyLines: false, //other option is 'greedy', meaning skip delimiters, quotes, and whitespace.\n // columns: null //or array of strings\n} as Papa.UnparseConfig;\n\nconst uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nexport default (\n data: CoreTypes.Mixed.Schedule,\n options: BaseOptions = {}\n): string => {\n const { locations, teachers, groups, persons, events, courses, periods, syllabuses, divisions } = data;\n const { start, end, displayName } = divisions ?? data as unknown as CoreTypes.Mixed.Division;\n\n const startYear = moment.utc(start).year ();\n const startMonth = moment.utc(start).month();\n\n const courseMap = new Map(data.courses ?.map(x => [getVertexId(x, options), x]));\n const periodMap = new Map(data.periods ?.map(x => [getVertexId(x, options), x]));\n const teacherMap = new Map(data.teachers ?.map(x => [getVertexId(x, options), x]));\n const groupMap = new Map(data.groups ?.map(x => [getVertexId(x, options), x]));\n const locationMap = new Map(data.locations ?.map(x => [getVertexId(x, options), x]));\n const syllabusMap = new Map(data.syllabuses?.map(x => [getVertexId(x, options), x]));\n\n // Stupid thing Schoolity wants (Nikos responsible for future bugs)\n // This overrides the normal behavior for gr. So basically if a course has a subject it will always use that for subjectCode and fulltext, even if it has a syllabus with different values.\n // In the case where a course has a syllabus but no subject it will use the regular behavior.\n\n const subjectSyllabusMap = new Map<string, { subjectCode: string, guid?: string, fullText: string }>();\n if (courses) {\n for (const course of courses) {\n const subject = course.subject;\n const syllabus = course.syllabus;\n if (subject) {\n // If the course has a subject, we want to use that instead of syllabus. This is because Schoolity is stupid. Also note that this is endorsed by Nikos. :(\n if (!subjectSyllabusMap.has(subject)) {\n subjectSyllabusMap.set(subject, {\n subjectCode: subject,\n fullText: subject,\n guid: typeof syllabus == 'object' && 'ids' in syllabus ? syllabus?.ids : undefined\n });\n }\n } else if (typeof syllabus == 'object' && 'subjectCode' in syllabus && syllabus.subjectCode && !syllabus.courseCode) {\n // If the course has a syllabus but no subject, we want to use the syllabus id as the identifier\n // and not the course id. This is because Schoolity expects the syllabus to be unique across all courses.\n if (!subjectSyllabusMap.has(getVertexId(syllabus, options))) {\n subjectSyllabusMap.set(getVertexId(syllabus, options), {\n subjectCode: syllabus.subjectName, // Use subjectName as subjectCode (Nikos responsible for future bugs)\n fullText: syllabus.subjectName,\n guid: syllabus.ids\n });\n };\n }\n };\n }\n\n // Set cvs to the source section\n let csv = `[Source]${papaOptions.newline}ApplicationVerMajor=4${papaOptions.newline}ApplicationVerMinor=0${papaOptions.newline}DatabaseRevNo=527${papaOptions.newline}CurrentNovaschemDatabase=${papaOptions.newline}User=${papaOptions.newline}`;\n csv += `SchoolID=RS${papaOptions.newline}School=${displayName}${papaOptions.newline}County=RS${papaOptions.newline}`;\n csv += `BaseYear=${startYear}${papaOptions.newline}OffsetYear=0${papaOptions.newline}OffsetMonth=${startMonth}${papaOptions.newline}CreationDate=${moment().format('YYYY-MM-DD')}${papaOptions.newline}${papaOptions.newline}`;\n // add destination section to csv\n csv += `[Destination]${papaOptions.newline}Application=${papaOptions.newline}ApplicationID=${papaOptions.newline}${papaOptions.newline}`;\n\n // add database options to csv\n csv += `[DatabaseOptions]${papaOptions.newline}Update=TRUE${papaOptions.newline}AddNew=TRUE${papaOptions.newline}${papaOptions.newline}`;\n\n // start tables section\n csv += `[Tables]${papaOptions.newline}${papaOptions.newline}`;\n\n // append locations to csv\n const l = locations?.map(location => {\n return {\n 'Room (6601)': location.displayName!,\n 'GUID (5800)': (location.ids && uuid.test(location.ids)) ? `{${location.ids}}` : '',\n 'Category (6602)': location.tags?.find(tag => tag.type == 'category')?.value ?? '',\n 'SeatingCapacity (6607)': location.maximumCapacity,\n };\n }) ?? [];\n csv += `${papaOptions.newline}Room (6600)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (l.length) {\n csv += Papa.unparse(l, papaOptions);\n } else {\n csv += ['Room (6601)', 'GUID (5800)', 'Category (6602)', 'SeatingCapacity (6607)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append subjects to csv\n // First add all subjects from syllabuses with courses (they should follow the standard)\n const subjectSyllabuses = syllabuses?.reduce((unique, syllabus) => {\n if (syllabus.subjectCode && syllabus.courseCode && !unique.seen.has(syllabus.subjectCode)) {\n unique.seen.add(syllabus.subjectCode);\n unique.result.push({\n 'Subject (6401)': syllabus.subjectCode,\n 'GUID (5800)': syllabus.ids,\n 'Category (6402)': '',\n 'FullText (6403)': syllabus.subjectName,\n 'BackgroundColor (6432)': '',\n 'TextColor (6433)': '',\n 'EvaluationNumber (6429)': ''\n });\n }\n return unique;\n }, {\n seen: new Set<string>(),\n result: [] as Array<{\n 'Subject (6401)': string;\n 'GUID (5800)': string | undefined;\n 'Category (6402)': string | undefined;\n 'FullText (6403)': string;\n 'BackgroundColor (6432)': string | undefined;\n 'TextColor (6433)': string | undefined;\n 'EvaluationNumber (6429)': string | undefined;\n }>\n })?.result ?? [];\n // Then add all subjects from the subjectSyllabusMap (they should follow the Nikos standard, that is, the stupid one)\n subjectSyllabuses.push(...Array.from(subjectSyllabusMap.values()).map(subject => {\n return {\n 'Subject (6401)': subject.subjectCode,\n 'GUID (5800)': subject.guid,\n 'Category (6402)': '',\n 'FullText (6403)': subject.fullText,\n 'BackgroundColor (6432)': '',\n 'TextColor (6433)': '',\n 'EvaluationNumber (6429)': ''\n };\n }));\n\n csv += `${papaOptions.newline}Subject (6400)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (subjectSyllabuses.length) {\n csv += Papa.unparse(subjectSyllabuses, papaOptions);\n } else {\n csv += ['Subject (6401)', 'GUID (5800)', 'Category (6402)', 'FullText (6403)', 'BackgroundColor (6432)', 'TextColor (6433)', 'EvaluationNumber (6429)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append teachers to csv\n const t = teachers?.map(teacher => {\n return {\n 'Teacher (6001)': teacher.signature,\n 'GUID (5800)': '',\n 'Category (6002)': '',\n 'PersonalCode (6028)': 'person' in teacher && typeof teacher.person == 'object' && 'SSN' in teacher.person ? (teacher.person?.SSN?.value ?? '') : '',\n 'LastName (6003)': '',\n 'Title (6006)': '',\n 'FirstName (6004)': '',\n 'Phone (6033)': '',\n 'EMail (6034)': '',\n 'EvaluationNumber (6014)': ''\n };\n }) ?? [];\n csv += `${papaOptions.newline}Teacher (6000)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (t.length) {\n csv += Papa.unparse(t, papaOptions);\n } else {\n csv += ['Teacher (6001)', 'GUID (5800)', 'Category (6002)', 'PersonalCode (6028)', 'LastName (6003)', 'Title (6006)', 'FirstName (6004)', 'Phone (6033)', 'EMail (6034)', 'EvaluationNumber (6014)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append students to csv\n const s = persons?.filter(person => {\n return person.type != 'Teacher';\n }).filter((s) => Boolean(s.SSN)).map(person => {\n return {\n 'Student (7201)': person.SSN?.value,\n 'GUID (5800)': (person.ids && uuid.test(person.ids)) ? `{${person.ids}}` : '',\n 'Category (7305)': '',\n 'LastName (7202)': person.lastName ?? '',\n 'FirstName (7211)': person.firstName ?? '',\n 'EMail (7215)': person.emails?.[0]?.value ?? ''\n };\n }) ?? [];\n csv += `${papaOptions.newline}Student (7200)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (s.length) {\n csv += Papa.unparse(s, papaOptions);\n } else {\n csv += ['Student (7201)', 'GUID (5800)', 'Category (7305)', 'LastName (7202)', 'FirstName (7211)', 'EMail (7215)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // create a map of students.id to students.SSN\n const studentMap = new Map(persons?.filter(x => x.type != 'Teacher').map(x => [getVertexId(x, options), x.SSN?.value ?? '']));\n\n // append groups to csv\n const g = groups?.map(group => {\n return {\n 'Group (6201)': group.displayName!,\n 'GUID (5800)': (group.ids && uuid.test(group.ids)) ? `{${group.ids}}` : '',\n 'Class (6210)': group.species == 'class' ? 1 : 0,\n 'Teacher (6204)': '',\n 'IClass (6206)': '',\n 'Student (6205)': group.members?.map(x => studentMap.get(getVertexId(x, options))).filter(Boolean).join(',')\n };\n }) ?? [];\n csv += `${papaOptions.newline}Group (6200)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (g.length) {\n csv += Papa.unparse(g, papaOptions);\n } else {\n csv += ['Group (6201)', 'GUID (5800)', 'Class (6210)', 'Teacher (6204)', 'IClass (6206)', 'Student (6205)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append courses to csv (only if there actually are courses, since its very important to Schoolity that the course table isn't present for GR)\n const courseSyllabuses = syllabuses?.filter(syllabus => !!syllabus.courseName).map(syllabus => {\n return {\n 'Course (7601)': syllabus.courseCode,\n 'GUID (5800)': syllabus.ids,\n 'FullText (7602)': syllabus.courseName,\n 'Subject (7603)': syllabus.subjectCode ?? '',\n 'Points (7604)': syllabus.points\n };\n }) ?? [];\n if (courseSyllabuses.length) {\n csv += `${papaOptions.newline}Course (7600)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n csv += Papa.unparse(courseSyllabuses, papaOptions);\n csv += papaOptions.newline;\n }\n // else {\n // csv += ['PK (7100)', 'GUID (5800)', 'DayOfWeek (7101)', 'Starttime (7102)', 'Length (7115)', 'Course (7106)', 'Subject (7103)', 'Period (7108)', 'Week (7109)', 'ActualWeeks (7167)'].join(options.delimiter);\n // }\n\n // append periods to csv\n const p = periods?.map(period => {\n return {\n 'Period (8001)': period.displayName!,\n 'GUID (5800)': (period.ids && uuid.test(period.ids)) ? `{${period.ids}}` : '',\n 'TextBelowSchedule (8002)': period.displayName!,\n 'Category (8006)': '',\n 'Calendar (8005)': period.ranges?.map(range => `${moment.utc(range.start).format('D/M')}-${moment.utc(range.end).format('D/M')}`).join(', ')\n };\n }) ?? [];\n csv += `${papaOptions.newline}Period (8000)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (p.length) {\n csv += Papa.unparse(p, papaOptions);\n } else {\n csv += ['Period (8001)', 'GUID (5800)', 'TextBelowSchedule (8002)', 'Category (8006)', 'Calendar (8005)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append TA to csv\n const totalHoursRegex = /(\\d+) hrs/;\n const weekTimeRegex = /(\\d+) min\\/week/;\n const c = courses?.map(course => {\n // Only use deserialize teachers\n const teacherIds = course.teachers?.map(x => getVertexId(x.to, options));\n const teachers = teacherIds?.map(id => teacherMap.get(id)).filter(x => x != null) ?? [];\n\n // Only use deserialize groups\n const groupIds = course.groups?.map(x => getVertexId(x.to, options));\n const groups = groupIds?.map(id => groupMap.get(id)).filter(x => x != null) ?? [];\n\n // Only use deserialize syllabus\n const syllabus = course.syllabus;\n const subject = syllabus && typeof syllabus == 'object'\n ? 'courseCode' in syllabus\n ? syllabus.subjectCode ?? course.subject\n : course.subject ?? ('subjectName' in syllabus ? syllabus.subjectName : undefined)\n : course.subject;\n\n return {\n 'PK (8200)': '',\n 'GUID (5800)': course.ids,\n 'OriginalRecord (8224)': '1',\n 'CreateLesson (8227)': '1',\n 'Course (8202)': typeof syllabus == 'object' && 'courseCode' in syllabus ? syllabus?.courseCode : undefined,\n 'Subject (8209)': subject ?? '', // Nikos ansvarig för framtida buggar\n 'Teacher (8210)': teachers?.map(x => x.signature ).filter(Boolean).join(','),\n 'Group (8203)': groups ?.map(x => x.displayName).filter(Boolean).join(','),\n 'TotalHours (8204)': (course.plannedDuration && totalHoursRegex.test(course.plannedDuration)) ? totalHoursRegex.exec(course.plannedDuration)![1] : '',\n 'Weektime (8208)': (course.plannedDuration && weekTimeRegex.test(course.plannedDuration)) ? weekTimeRegex.exec(course.plannedDuration)![1] : '',\n 'Blockname (8215)': '',\n 'Period (8206)': '',\n 'Week (8207)': '',\n 'NotPeriod (8212)': '',\n 'NotWeek (8213)': ''\n };\n }) ?? [];\n csv += `${papaOptions.newline}TA (8200)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (c.length) {\n csv += Papa.unparse(c, papaOptions);\n } else {\n csv += ['Course (8202)', 'GUID (5800)', 'Subject (8209)', 'Teacher (8210)', 'Group (8203)', 'TotalHours (8204)', 'Weektime (8208)', 'Blockname (8215)', 'Period (8206)', 'Week (8207)', 'NotPeriod (8212)', 'NotWeek (8213)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append lessons to csv\n const e = events\n // ?.filter(x => !isNaN(Date.parse(x.start?.toString() ?? '')))\n ?.map((event, index) => {\n if (!event.start || !event.end) return;\n\n const courseId = event.course ? getVertexId(event.course, options) : undefined;\n const course = courseId ? courseMap.get(courseId) : undefined;\n\n // Only use deserialize period\n let period = event.period == null ? course?.period : event.period;\n if (isString(period))\n period = periodMap.get(period);\n if ((period && !('ranges' in period)))\n period = undefined;\n\n // Only use deserialize teachers\n const t = event.teachers == null ? course?.teachers : event.teachers;\n const teacherIds = t?.map(x => getVertexId(x.to, options));\n const teachers = teacherIds?.map(id => teacherMap.get(id)).filter(Boolean) ?? [];\n\n // Only use deserialize groups\n const g = event.groups == null ? course?.groups : event.groups;\n const groupIds = g?.map(x => getVertexId(x.to, options));\n const groups = groupIds?.map(id => groupMap.get(id)).filter(Boolean) ?? [];\n\n // Only use deserialize locations\n const locationIds = event.inLocations?.map(x => x ? getVertexId(x, options) : null).filter(x => x != null);\n const locations = locationIds?.map(id => locationMap.get(id)).filter(Boolean) ?? [];\n const dayOfWeek = moment.utc(event.start).toDate().toLocaleDateString('sv-SE', { weekday: 'long', timeZone: 'UTC' });\n\n // Syllabus of the course\n const syllabusId = isString(course?.syllabus) ? course.syllabus : (course?.syllabus && isObjectIdOrHexString(course?.syllabus)) ? (course?.syllabus as MongooseTypes.ObjectId | string).toString() : undefined;\n const syllabus = syllabusId ? syllabusMap.get(syllabusId) : course?.syllabus as CoreTypes.Deep.Syllabus | undefined;\n const isCourseSyllabus = !!syllabus?.courseCode;\n\n // From start and end, get all weeks that the schedule spans\n const allWeeks: moment.Moment[] = [];\n const endDate = moment.utc(end);\n const currentDate = moment.utc(start);\n while (currentDate.isBefore(endDate) || currentDate.isSame(endDate, 'day')) {\n allWeeks.push(currentDate.clone());\n currentDate.add(1, 'week');\n }\n\n const actualWeeks = period\n ? period?.ranges?.map(range => `${moment.utc(range.start).week()}-${moment.utc(range.end).week()}`).join(',')\n : allWeeks.map((week, index) => {\n const nextWeek = index < allWeeks.length - 1 ? allWeeks[index + 1] : week.clone().add(1, 'week');\n return `${week.week()}-${nextWeek.week()}`;\n }).join(',');\n\n // capitalize first letter of dayOfWeek\n const dayOfWeekCapitalized = dayOfWeek.charAt(0).toUpperCase() + dayOfWeek.slice(1);\n return {\n 'PK (7100)': index + 1,\n 'GUID (5800)': (event.ids && uuid.test(event.ids)) ? `{${event.ids}}` : '',\n 'DayOfWeek (7101)': dayOfWeekCapitalized,\n 'Starttime (7102)': moment.utc(event.start).format('HH:mm'),\n 'Length (7115)': event.duration,\n 'Course (7106)': syllabus?.courseCode,\n 'Subject (7103)': isCourseSyllabus ? (syllabus?.subjectCode ?? course?.subject) : (course?.subject ?? syllabus?.subjectName) ?? '', // Nikos ansvarig för framtida buggar\n 'Teacher (7104)': teachers ?.map(x => x?.signature ).filter(Boolean).join(','),\n 'Group (7105)': groups ?.map(x => x?.displayName).filter(Boolean).join(','),\n 'Room (7107)': locations?.map(x => x?.displayName).filter(Boolean).join(','),\n 'Period (7108)': '',\n 'Week (7109)': '',\n 'ActualWeeks (7167)': actualWeeks\n };\n }) ?? [];\n csv += `${papaOptions.newline}Lesson (7100)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (e.length) {\n csv += Papa.unparse(e, papaOptions);\n } else {\n csv += ['PK (7100)', 'GUID (5800)', 'DayOfWeek (7101)', 'Starttime (7102)', 'Length (7115)', 'Course (7106)', 'Subject (7103)', 'Period (7108)', 'Week (7109)', 'ActualWeeks (7167)'].join(papaOptions.delimiter);\n }\n\n return csv;\n};"],"mappings":";;;;;;;AASA,MAAM,cAAc;CAClB,QAAgB;CAChB,WAAgB;CAChB,YAAgB;CAChB,WAAgB;CAChB,QAAgB;CAChB,SAAgB;CAChB,gBAAgB;CAEjB;AAED,MAAM,OAAO;AAEb,yBACE,MACA,UAAuB,EAAE,KACd;CACX,MAAM,EAAE,WAAW,UAAU,QAAQ,SAAS,QAAQ,SAAS,SAAS,YAAY,cAAc;CAClG,MAAM,EAAE,OAAO,KAAK,gBAAgB,aAAa;CAEjD,MAAM,YAAa,OAAO,IAAI,MAAM,CAAC,MAAO;CAC5C,MAAM,aAAa,OAAO,IAAI,MAAM,CAAC,OAAO;CAE5C,MAAM,YAAc,IAAI,IAAI,KAAK,SAAY,KAAI,MAAK,CAAC,YAAY,GAAG,QAAQ,EAAE,EAAE,CAAC,CAAC;CACpF,MAAM,YAAc,IAAI,IAAI,KAAK,SAAY,KAAI,MAAK,CAAC,YAAY,GAAG,QAAQ,EAAE,EAAE,CAAC,CAAC;CACpF,MAAM,aAAc,IAAI,IAAI,KAAK,UAAY,KAAI,MAAK,CAAC,YAAY,GAAG,QAAQ,EAAE,EAAE,CAAC,CAAC;CACpF,MAAM,WAAc,IAAI,IAAI,KAAK,QAAY,KAAI,MAAK,CAAC,YAAY,GAAG,QAAQ,EAAE,EAAE,CAAC,CAAC;CACpF,MAAM,cAAc,IAAI,IAAI,KAAK,WAAY,KAAI,MAAK,CAAC,YAAY,GAAG,QAAQ,EAAE,EAAE,CAAC,CAAC;CACpF,MAAM,cAAc,IAAI,IAAI,KAAK,YAAY,KAAI,MAAK,CAAC,YAAY,GAAG,QAAQ,EAAE,EAAE,CAAC,CAAC;CAMpF,MAAM,qCAAqB,IAAI,KAAuE;AACtG,KAAI,QACF,MAAK,MAAM,UAAU,SAAS;EAC5B,MAAM,UAAU,OAAO;EACvB,MAAM,WAAW,OAAO;AACxB,MAAI,SAEF;OAAI,CAAC,mBAAmB,IAAI,QAAQ,CAClC,oBAAmB,IAAI,SAAS;IAC9B,aAAa;IACb,UAAa;IACb,MAAa,OAAO,YAAY,YAAY,SAAS,WAAW,UAAU,MAAM;IACjF,CAAC;aAEK,OAAO,YAAY,YAAY,iBAAiB,YAAY,SAAS,eAAe,CAAC,SAAS,YAGvG;OAAI,CAAC,mBAAmB,IAAI,YAAY,UAAU,QAAQ,CAAC,CACzD,oBAAmB,IAAI,YAAY,UAAU,QAAQ,EAAE;IACrD,aAAa,SAAS;IACtB,UAAa,SAAS;IACtB,MAAa,SAAS;IACvB,CAAC;;;CAOV,IAAI,MAAM,WAAW,YAAY,QAAQ,uBAAuB,YAAY,QAAQ,uBAAuB,YAAY,QAAQ,mBAAmB,YAAY,QAAQ,2BAA2B,YAAY,QAAQ,OAAO,YAAY;AACxO,QAAO,cAAc,YAAY,QAAQ,SAAS,cAAc,YAAY,QAAQ,WAAW,YAAY;AAC3G,QAAO,YAAY,YAAY,YAAY,QAAQ,cAAc,YAAY,QAAQ,cAAc,aAAa,YAAY,QAAQ,eAAe,QAAQ,CAAC,OAAO,aAAa,GAAG,YAAY,UAAU,YAAY;AAErN,QAAO,gBAAgB,YAAY,QAAQ,cAAc,YAAY,QAAQ,gBAAgB,YAAY,UAAU,YAAY;AAG/H,QAAO,oBAAoB,YAAY,QAAQ,aAAa,YAAY,QAAQ,aAAa,YAAY,UAAU,YAAY;AAG/H,QAAO,WAAW,YAAY,UAAU,YAAY;CAGpD,MAAM,IAAI,WAAW,KAAI,aAAY;AACnC,SAAO;GACL,eAA0B,SAAS;GACnC,eAA2B,SAAS,OAAO,KAAK,KAAK,SAAS,IAAI,GAAI,IAAI,SAAS,IAAI,KAAK;GAC5F,mBAA0B,SAAS,MAAM,MAAK,QAAO,IAAI,QAAQ,WAAW,EAAE,SAAS;GACvF,0BAA0B,SAAS;GACpC;GACD,IAAI,EAAE;AACR,QAAO,GAAG,YAAY,QAAQ,aAAa,YAAY,QAAQ,QAAQ,YAAY;AACnF,KAAI,EAAE,OACJ,QAAO,KAAK,QAAQ,GAAG,YAAY;KAEnC,QAAO;EAAC;EAAe;EAAe;EAAmB;EAAyB,CAAC,KAAK,YAAY,UAAU;AAEhH,QAAO,YAAY;CAInB,MAAM,oBAAoB,YAAY,QAAQ,QAAQ,aAAa;AACjE,MAAI,SAAS,eAAe,SAAS,cAAc,CAAC,OAAO,KAAK,IAAI,SAAS,YAAY,EAAE;AACzF,UAAO,KAAK,IAAI,SAAS,YAAY;AACrC,UAAO,OAAO,KAAK;IACjB,kBAA2B,SAAS;IACpC,eAA2B,SAAS;IACpC,mBAA2B;IAC3B,mBAA2B,SAAS;IACpC,0BAA2B;IAC3B,oBAA2B;IAC3B,2BAA2B;IAC5B,CAAC;;AAEJ,SAAO;IACN;EACD,sBAAQ,IAAI,KAAa;EACzB,QAAQ,EAAE;EASX,CAAC,EAAE,UAAU,EAAE;AAEhB,mBAAkB,KAAK,GAAG,MAAM,KAAK,mBAAmB,QAAQ,CAAC,CAAC,KAAI,YAAW;AAC/E,SAAO;GACL,kBAA2B,QAAQ;GACnC,eAA2B,QAAQ;GACnC,mBAA2B;GAC3B,mBAA2B,QAAQ;GACnC,0BAA2B;GAC3B,oBAA2B;GAC3B,2BAA2B;GAC5B;GACD,CAAC;AAEH,QAAO,GAAG,YAAY,QAAQ,gBAAgB,YAAY,QAAQ,QAAQ,YAAY;AACtF,KAAI,kBAAkB,OACpB,QAAO,KAAK,QAAQ,mBAAmB,YAAY;KAEnD,QAAO;EAAC;EAAkB;EAAe;EAAmB;EAAmB;EAA0B;EAAoB;EAA0B,CAAC,KAAK,YAAY,UAAU;AAErL,QAAO,YAAY;CAGnB,MAAM,IAAI,UAAU,KAAI,YAAW;AACjC,SAAO;GACL,kBAA2B,QAAQ;GACnC,eAA2B;GAC3B,mBAA2B;GAC3B,uBAA2B,YAAY,WAAW,OAAO,QAAQ,UAAU,YAAY,SAAS,QAAQ,SAAU,QAAQ,QAAQ,KAAK,SAAS,KAAM;GACtJ,mBAA2B;GAC3B,gBAA2B;GAC3B,oBAA2B;GAC3B,gBAA2B;GAC3B,gBAA2B;GAC3B,2BAA2B;GAC5B;GACD,IAAI,EAAE;AACR,QAAO,GAAG,YAAY,QAAQ,gBAAgB,YAAY,QAAQ,QAAQ,YAAY;AACtF,KAAI,EAAE,OACJ,QAAO,KAAK,QAAQ,GAAG,YAAY;KAEnC,QAAO;EAAC;EAAkB;EAAe;EAAmB;EAAuB;EAAmB;EAAgB;EAAoB;EAAgB;EAAgB;EAA0B,CAAC,KAAK,YAAY,UAAU;AAElO,QAAO,YAAY;CAGnB,MAAM,IAAI,SAAS,QAAO,WAAU;AAClC,SAAO,OAAO,QAAQ;GACtB,CAAC,QAAQ,QAAM,QAAQA,IAAE,IAAI,CAAC,CAAC,KAAI,WAAU;AAC7C,SAAO;GACL,kBAAoB,OAAO,KAAK;GAChC,eAAqB,OAAO,OAAO,KAAK,KAAK,OAAO,IAAI,GAAI,IAAI,OAAO,IAAI,KAAK;GAChF,mBAAoB;GACpB,mBAAoB,OAAO,YAAY;GACvC,oBAAoB,OAAO,aAAa;GACxC,gBAAoB,OAAO,SAAS,IAAI,SAAS;GAClD;GACD,IAAI,EAAE;AACR,QAAO,GAAG,YAAY,QAAQ,gBAAgB,YAAY,QAAQ,QAAQ,YAAY;AACtF,KAAI,EAAE,OACJ,QAAO,KAAK,QAAQ,GAAG,YAAY;KAEnC,QAAO;EAAC;EAAkB;EAAe;EAAmB;EAAmB;EAAoB;EAAe,CAAC,KAAK,YAAY,UAAU;AAEhJ,QAAO,YAAY;CAGnB,MAAM,aAAa,IAAI,IAAI,SAAS,QAAO,MAAK,EAAE,QAAQ,UAAU,CAAC,KAAI,MAAK,CAAC,YAAY,GAAG,QAAQ,EAAE,EAAE,KAAK,SAAS,GAAG,CAAC,CAAC;CAG7H,MAAM,IAAI,QAAQ,KAAI,UAAS;AAC7B,SAAO;GACL,gBAAkB,MAAM;GACxB,eAAmB,MAAM,OAAO,KAAK,KAAK,MAAM,IAAI,GAAI,IAAI,MAAM,IAAI,KAAK;GAC3E,gBAAkB,MAAM,WAAW,UAAU,IAAI;GACjD,kBAAkB;GAClB,iBAAkB;GAClB,kBAAkB,MAAM,SAAS,KAAI,MAAK,WAAW,IAAI,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI;GAC7G;GACD,IAAI,EAAE;AACR,QAAO,GAAG,YAAY,QAAQ,cAAc,YAAY,QAAQ,QAAQ,YAAY;AACpF,KAAI,EAAE,OACJ,QAAO,KAAK,QAAQ,GAAG,YAAY;KAEnC,QAAO;EAAC;EAAgB;EAAe;EAAgB;EAAkB;EAAiB;EAAiB,CAAC,KAAK,YAAY,UAAU;AAEzI,QAAO,YAAY;CAGnB,MAAM,mBAAmB,YAAY,QAAO,aAAY,CAAC,CAAC,SAAS,WAAW,CAAC,KAAI,aAAY;AAC7F,SAAO;GACL,iBAAmB,SAAS;GAC5B,eAAmB,SAAS;GAC5B,mBAAmB,SAAS;GAC5B,kBAAmB,SAAS,eAAe;GAC3C,iBAAmB,SAAS;GAC7B;GACD,IAAI,EAAE;AACR,KAAI,iBAAiB,QAAQ;AAC3B,SAAO,GAAG,YAAY,QAAQ,eAAe,YAAY,QAAQ,QAAQ,YAAY;AACrF,SAAO,KAAK,QAAQ,kBAAkB,YAAY;AAClD,SAAO,YAAY;;CAOrB,MAAM,IAAI,SAAS,KAAI,WAAU;AAC/B,SAAO;GACL,iBAA4B,OAAO;GACnC,eAA6B,OAAO,OAAO,KAAK,KAAK,OAAO,IAAI,GAAI,IAAI,OAAO,IAAI,KAAK;GACxF,4BAA4B,OAAO;GACnC,mBAA4B;GAC5B,mBAA4B,OAAO,QAAQ,KAAI,UAAS,GAAG,OAAO,IAAI,MAAM,MAAM,CAAC,OAAO,MAAM,CAAC,GAAG,OAAO,IAAI,MAAM,IAAI,CAAC,OAAO,MAAM,GAAG,CAAC,KAAK,KAAK;GACtJ;GACD,IAAI,EAAE;AACR,QAAO,GAAG,YAAY,QAAQ,eAAe,YAAY,QAAQ,QAAQ,YAAY;AACrF,KAAI,EAAE,OACJ,QAAO,KAAK,QAAQ,GAAG,YAAY;KAEnC,QAAO;EAAC;EAAiB;EAAe;EAA4B;EAAmB;EAAkB,CAAC,KAAK,YAAY,UAAU;AAEvI,QAAO,YAAY;CAGnB,MAAM,kBAAkB;CACxB,MAAM,gBAAgB;CACtB,MAAM,IAAI,SAAS,KAAI,WAAU;EAG/B,MAAMC,cADa,OAAO,UAAU,KAAI,MAAK,YAAY,EAAE,IAAI,QAAQ,CAAC,GACzC,KAAI,OAAM,WAAW,IAAI,GAAG,CAAC,CAAC,QAAO,MAAK,KAAK,KAAK,IAAI,EAAE;EAIzF,MAAMC,YADa,OAAO,QAAQ,KAAI,MAAK,YAAY,EAAE,IAAI,QAAQ,CAAC,GACzC,KAAI,OAAM,SAAS,IAAI,GAAG,CAAC,CAAC,QAAO,MAAK,KAAK,KAAK,IAAI,EAAE;EAGrF,MAAM,WAAW,OAAO;EACxB,MAAM,UAAU,YAAY,OAAO,YAAY,WAC3C,gBAAgB,WACd,SAAS,eAAe,OAAO,UAC/B,OAAO,YAAY,iBAAiB,WAAW,SAAS,cAAc,UACxE,OAAO;AAEX,SAAO;GACL,aAAyB;GACzB,eAAyB,OAAO;GAChC,yBAAyB;GACzB,uBAAyB;GACzB,iBAAyB,OAAO,YAAY,YAAY,gBAAgB,WAAW,UAAU,aAAa;GAC1G,kBAAyB,WAAW;GACpC,kBAAyBD,YAAU,KAAI,MAAK,EAAE,UAAY,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI;GACpF,gBAAyBC,UAAU,KAAI,MAAK,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI;GACpF,qBAA0B,OAAO,mBAAmB,gBAAgB,KAAK,OAAO,gBAAgB,GAAI,gBAAgB,KAAK,OAAO,gBAAgB,CAAE,KAAK;GACvJ,mBAA0B,OAAO,mBAAmB,cAAc,KAAK,OAAO,gBAAgB,GAAI,cAAc,KAAK,OAAO,gBAAgB,CAAE,KAAK;GACnJ,oBAAyB;GACzB,iBAAyB;GACzB,eAAyB;GACzB,oBAAyB;GACzB,kBAAyB;GAC1B;GACD,IAAI,EAAE;AACR,QAAO,GAAG,YAAY,QAAQ,WAAW,YAAY,QAAQ,QAAQ,YAAY;AACjF,KAAI,EAAE,OACJ,QAAO,KAAK,QAAQ,GAAG,YAAY;KAEnC,QAAO;EAAC;EAAiB;EAAe;EAAkB;EAAkB;EAAgB;EAAqB;EAAmB;EAAoB;EAAiB;EAAe;EAAoB;EAAiB,CAAC,KAAK,YAAY,UAAU;AAE3P,QAAO,YAAY;CAGnB,MAAM,IAAI,QAEN,KAAK,OAAO,UAAU;AACtB,MAAI,CAAC,MAAM,SAAS,CAAC,MAAM,IAAK;EAEhC,MAAM,WAAW,MAAM,SAAS,YAAY,MAAM,QAAQ,QAAQ,GAAG;EACrE,MAAM,SAAS,WAAW,UAAU,IAAI,SAAS,GAAG;EAGpD,IAAI,SAAS,MAAM,UAAU,OAAO,QAAQ,SAAS,MAAM;AAC3D,MAAI,SAAS,OAAO,CAClB,UAAS,UAAU,IAAI,OAAO;AAChC,MAAK,UAAU,EAAE,YAAY,QAC3B,UAAS;EAKX,MAAMD,eAFa,MAAM,YAAY,OAAO,QAAQ,WAAW,MAAM,WAC/C,KAAI,MAAK,YAAY,EAAE,IAAI,QAAQ,CAAC,GAC3B,KAAI,OAAM,WAAW,IAAI,GAAG,CAAC,CAAC,OAAO,QAAQ,IAAI,EAAE;EAKlF,MAAMC,aAFa,MAAM,UAAU,OAAO,QAAQ,SAAS,MAAM,SAC3C,KAAI,MAAK,YAAY,EAAE,IAAI,QAAQ,CAAC,GAC7B,KAAI,OAAM,SAAS,IAAI,GAAG,CAAC,CAAC,OAAO,QAAQ,IAAI,EAAE;EAI9E,MAAMC,eADc,MAAM,aAAa,KAAI,MAAK,IAAI,YAAY,GAAG,QAAQ,GAAG,KAAK,CAAC,QAAO,MAAK,KAAK,KAAK,GACzE,KAAI,OAAM,YAAY,IAAI,GAAG,CAAC,CAAC,OAAO,QAAQ,IAAI,EAAE;EACrF,MAAM,YAAc,OAAO,IAAI,MAAM,MAAM,CAAC,QAAQ,CAAC,mBAAmB,SAAS;GAAE,SAAS;GAAQ,UAAU;GAAO,CAAC;EAGtH,MAAM,aAAa,SAAS,QAAQ,SAAS,GAAG,OAAO,WAAY,QAAQ,YAAY,sBAAsB,QAAQ,SAAS,IAAK,QAAQ,UAA6C,UAAU,GAAG;EACrM,MAAM,WAAW,aAAa,YAAY,IAAI,WAAW,GAAG,QAAQ;EACpE,MAAM,mBAAmB,CAAC,CAAC,UAAU;EAGrC,MAAMC,WAA4B,EAAE;EACpC,MAAM,UAAU,OAAO,IAAI,IAAI;EAC/B,MAAM,cAAc,OAAO,IAAI,MAAM;AACrC,SAAO,YAAY,SAAS,QAAQ,IAAI,YAAY,OAAO,SAAS,MAAM,EAAE;AAC1E,YAAS,KAAK,YAAY,OAAO,CAAC;AAClC,eAAY,IAAI,GAAG,OAAO;;EAG5B,MAAM,cAAc,SAChB,QAAQ,QAAQ,KAAI,UAAS,GAAG,OAAO,IAAI,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,IAAI,MAAM,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,IAAI,GAC3G,SAAS,KAAK,MAAM,YAAU;GAC9B,MAAM,WAAWC,UAAQ,SAAS,SAAS,IAAI,SAASA,UAAQ,KAAK,KAAK,OAAO,CAAC,IAAI,GAAG,OAAO;AAChG,UAAO,GAAG,KAAK,MAAM,CAAC,GAAG,SAAS,MAAM;IACxC,CAAC,KAAK,IAAI;EAGd,MAAM,uBAAuB,UAAU,OAAO,EAAE,CAAC,aAAa,GAAG,UAAU,MAAM,EAAE;AACnF,SAAO;GACL,aAAsB,QAAQ;GAC9B,eAAuB,MAAM,OAAO,KAAK,KAAK,MAAM,IAAI,GAAI,IAAI,MAAM,IAAI,KAAK;GAC/E,oBAAsB;GACtB,oBAAsB,OAAO,IAAI,MAAM,MAAM,CAAC,OAAO,QAAQ;GAC7D,iBAAsB,MAAM;GAC5B,iBAAsB,UAAU;GAChC,kBAAsB,mBAAoB,UAAU,eAAe,QAAQ,UAAY,QAAQ,WAAW,UAAU,eAAgB;GACpI,kBAAsBJ,YAAW,KAAI,MAAK,GAAG,UAAY,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI;GACnF,gBAAsBC,UAAW,KAAI,MAAK,GAAG,YAAY,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI;GACnF,eAAsBC,aAAW,KAAI,MAAK,GAAG,YAAY,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI;GACnF,iBAAsB;GACtB,eAAsB;GACtB,sBAAsB;GACvB;GACD,IAAI,EAAE;AACV,QAAO,GAAG,YAAY,QAAQ,eAAe,YAAY,QAAQ,QAAQ,YAAY;AACrF,KAAI,EAAE,OACJ,QAAO,KAAK,QAAQ,GAAG,YAAY;KAEnC,QAAO;EAAC;EAAa;EAAe;EAAoB;EAAoB;EAAiB;EAAiB;EAAkB;EAAiB;EAAe;EAAqB,CAAC,KAAK,YAAY,UAAU;AAGnN,QAAO"}
|
|
@@ -18,10 +18,9 @@ function startAndEnd(lesson) {
|
|
|
18
18
|
const hours = dateTimeDate.get("hours");
|
|
19
19
|
const minutes = dateTimeDate.get("minutes");
|
|
20
20
|
const start = generateDate(lesson.DayOfWeek, hours, minutes);
|
|
21
|
-
const end = start.clone().add(lesson.Length, "minute");
|
|
22
21
|
return {
|
|
23
22
|
start,
|
|
24
|
-
end,
|
|
23
|
+
end: start.clone().add(lesson.Length, "minute"),
|
|
25
24
|
parked: false
|
|
26
25
|
};
|
|
27
26
|
}
|
|
@@ -207,12 +206,11 @@ function course_and_events_default(groups, lessons, meta, groupPlansMap, planMap
|
|
|
207
206
|
const courses = [...courseMap].filter(([k]) => populatedCourses.has(k));
|
|
208
207
|
courseMap = new Map(courses);
|
|
209
208
|
}
|
|
210
|
-
const
|
|
209
|
+
for (const key of [
|
|
211
210
|
"groups",
|
|
212
211
|
"teachers",
|
|
213
212
|
"locations"
|
|
214
|
-
]
|
|
215
|
-
for (const key of keys) courseMap.forEach((c, courseKey) => {
|
|
213
|
+
]) courseMap.forEach((c, courseKey) => {
|
|
216
214
|
const events = eventMap.get(courseKey.toString());
|
|
217
215
|
const eventEntries = makeChainable(events ?? []).chain((x) => x.map((e) => e[key] ?? c[key]).filter((x$1) => x$1 != null), (x) => uniqBy(x, (x$1) => x$1.map((x$2) => "to" in x$2 ? x$2.to : x$2.locations[0]).sort().join("."))).value;
|
|
218
216
|
if (eventEntries.length != 1) return;
|