@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.
Files changed (286) hide show
  1. package/dist/Additio/from/courses.js.map +1 -1
  2. package/dist/Additio/from/events.js.map +1 -1
  3. package/dist/Additio/from/groups.js.map +1 -1
  4. package/dist/Additio/from/index.js.map +1 -1
  5. package/dist/Additio/from/locations.js.map +1 -1
  6. package/dist/Additio/from/persons.js.map +1 -1
  7. package/dist/Additio/from/schedules.d.ts +1 -0
  8. package/dist/Additio/from/schedules.js +2 -4
  9. package/dist/Additio/from/schedules.js.map +1 -1
  10. package/dist/Additio/from/teachers.js.map +1 -1
  11. package/dist/Additio/to/index.d.ts +4 -2
  12. package/dist/Additio/to/schedules.js +2 -4
  13. package/dist/Additio/to/schedules.js.map +1 -1
  14. package/dist/Admentum/from/courses.js.map +1 -1
  15. package/dist/Admentum/from/events.js.map +1 -1
  16. package/dist/Admentum/from/groups.js.map +1 -1
  17. package/dist/Admentum/from/index.js.map +1 -1
  18. package/dist/Admentum/from/locations.js.map +1 -1
  19. package/dist/Admentum/from/persons.js.map +1 -1
  20. package/dist/Admentum/from/schedules.d.ts +1 -0
  21. package/dist/Admentum/from/schedules.js +3 -6
  22. package/dist/Admentum/from/schedules.js.map +1 -1
  23. package/dist/Admentum/from/teachers.js.map +1 -1
  24. package/dist/Admentum/to/index.d.ts +1 -0
  25. package/dist/Admentum/to/schedules.js +4 -7
  26. package/dist/Admentum/to/schedules.js.map +1 -1
  27. package/dist/Excel/index.d.ts +1 -0
  28. package/dist/Excel/v1/from/index.js +1 -1
  29. package/dist/Excel/v1/from/index.js.map +1 -1
  30. package/dist/Excel/v1/index.d.ts +4 -3
  31. package/dist/Excel/v2/from/index.js +45 -54
  32. package/dist/Excel/v2/from/index.js.map +1 -1
  33. package/dist/Excel/v2/index.d.ts +4 -3
  34. package/dist/IdunSoft/from/courses.js.map +1 -1
  35. package/dist/IdunSoft/from/events.js +1 -2
  36. package/dist/IdunSoft/from/events.js.map +1 -1
  37. package/dist/IdunSoft/from/groups.js.map +1 -1
  38. package/dist/IdunSoft/from/index.js.map +1 -1
  39. package/dist/IdunSoft/from/locations.js.map +1 -1
  40. package/dist/IdunSoft/from/schedules.d.ts +1 -0
  41. package/dist/IdunSoft/from/schedules.js.map +1 -1
  42. package/dist/IdunSoft/from/teachers.js.map +1 -1
  43. package/dist/IdunSoft/to/index.d.ts +1 -0
  44. package/dist/IdunSoft/to/schedules.js +3 -6
  45. package/dist/IdunSoft/to/schedules.js.map +1 -1
  46. package/dist/InfoMentor/to/index.d.ts +1 -0
  47. package/dist/InfoMentor/to/schedules.js +1 -2
  48. package/dist/InfoMentor/to/schedules.js.map +1 -1
  49. package/dist/PlanDigital/from/index.js.map +1 -1
  50. package/dist/PlanDigital/from/schedules.js +9 -11
  51. package/dist/PlanDigital/from/schedules.js.map +1 -1
  52. package/dist/PlanDigital/index.d.ts +1 -0
  53. package/dist/Quiculum/file/to/index.d.ts +1 -0
  54. package/dist/Quiculum/file/to/schedules.js +5 -9
  55. package/dist/Quiculum/file/to/schedules.js.map +1 -1
  56. package/dist/RS/from/division.d.ts +1 -0
  57. package/dist/RS/from/division.js +1 -2
  58. package/dist/RS/from/division.js.map +1 -1
  59. package/dist/RS/from/index.js.map +1 -1
  60. package/dist/RS/from/schedules.d.ts +1 -0
  61. package/dist/RS/from/schedules.js.map +1 -1
  62. package/dist/RS/make-connected.d.ts +3 -1
  63. package/dist/RS/make-connected.js +34 -42
  64. package/dist/RS/make-connected.js.map +1 -1
  65. package/dist/RS/to/index.js.map +1 -1
  66. package/dist/RS/to/initial-configuration.js +4 -6
  67. package/dist/RS/to/initial-configuration.js.map +1 -1
  68. package/dist/RS/to/input/collections.js.map +1 -1
  69. package/dist/RS/to/input/default.js +1 -2
  70. package/dist/RS/to/input/default.js.map +1 -1
  71. package/dist/RS/to/input/dependencies.js +1 -2
  72. package/dist/RS/to/input/dependencies.js.map +1 -1
  73. package/dist/RS/to/input/dynamic-locked-times.js +1 -2
  74. package/dist/RS/to/input/dynamic-locked-times.js.map +1 -1
  75. package/dist/RS/to/input/events.js.map +1 -1
  76. package/dist/RS/to/input/groups.js.map +1 -1
  77. package/dist/RS/to/input/individuals.js +1 -2
  78. package/dist/RS/to/input/individuals.js.map +1 -1
  79. package/dist/RS/to/input/input.js +1 -2
  80. package/dist/RS/to/input/input.js.map +1 -1
  81. package/dist/RS/to/input/intervals.js +2 -4
  82. package/dist/RS/to/input/intervals.js.map +1 -1
  83. package/dist/RS/to/input/periods.js +2 -4
  84. package/dist/RS/to/input/periods.js.map +1 -1
  85. package/dist/RS/to/input/settings.js.map +1 -1
  86. package/dist/RS/to/input/teachers.js +1 -1
  87. package/dist/RS/to/input/teachers.js.map +1 -1
  88. package/dist/RS/to/input/util/attach-locked-times.js.map +1 -1
  89. package/dist/RS/to/input/util/parse-days.js.map +1 -1
  90. package/dist/RS/to/input/util/parse-group-references.js.map +1 -1
  91. package/dist/RS/to/input/util/parse-intervals.js +2 -4
  92. package/dist/RS/to/input/util/parse-intervals.js.map +1 -1
  93. package/dist/RS/to/input/util/parse-location-references.js +1 -2
  94. package/dist/RS/to/input/util/parse-location-references.js.map +1 -1
  95. package/dist/RS/to/input/util/parse-max-working-hours.js.map +1 -1
  96. package/dist/RS/to/input/util/parse-minimum-break-length.js.map +1 -1
  97. package/dist/RS/to/input/util/util.js +1 -2
  98. package/dist/RS/to/input/util/util.js.map +1 -1
  99. package/dist/RS/to/schedules.js.map +1 -1
  100. package/dist/RS/types/to.d.ts +1 -0
  101. package/dist/SS12000/from/activities.js +1 -2
  102. package/dist/SS12000/from/activities.js.map +1 -1
  103. package/dist/SS12000/from/calendar-events.js.map +1 -1
  104. package/dist/SS12000/from/duties.js.map +1 -1
  105. package/dist/SS12000/from/groups.js.map +1 -1
  106. package/dist/SS12000/from/index.js.map +1 -1
  107. package/dist/SS12000/from/persons.js.map +1 -1
  108. package/dist/SS12000/from/resources.js.map +1 -1
  109. package/dist/SS12000/from/rooms.js.map +1 -1
  110. package/dist/SS12000/from/syllabuses.js.map +1 -1
  111. package/dist/SS12000/index.d.ts +41 -6
  112. package/dist/SS12000/to/activities.js.map +1 -1
  113. package/dist/SS12000/to/calendar-events.js.map +1 -1
  114. package/dist/SS12000/to/common.js.map +1 -1
  115. package/dist/SS12000/to/duties.js.map +1 -1
  116. package/dist/SS12000/to/groups.js.map +1 -1
  117. package/dist/SS12000/to/index.d.ts +1 -0
  118. package/dist/SS12000/to/persons.js.map +1 -1
  119. package/dist/SS12000/to/resources.js.map +1 -1
  120. package/dist/SS12000/to/rooms.js.map +1 -1
  121. package/dist/SS12000/to/syllabuses.js.map +1 -1
  122. package/dist/SchoolSoft/api/from/index.js.map +1 -1
  123. package/dist/SchoolSoft/api/from/schedules.js +8 -12
  124. package/dist/SchoolSoft/api/from/schedules.js.map +1 -1
  125. package/dist/SchoolSoft/api/index.d.ts +6 -5
  126. package/dist/SchoolSoft/file/from/index.js.map +1 -1
  127. package/dist/SchoolSoft/file/from/schedules.js +83 -87
  128. package/dist/SchoolSoft/file/from/schedules.js.map +1 -1
  129. package/dist/SchoolSoft/file/index.d.ts +1 -0
  130. package/dist/SchoolSoft/file/to/index.d.ts +3 -2
  131. package/dist/SchoolSoft/file/to/schedules.js +1 -2
  132. package/dist/SchoolSoft/file/to/schedules.js.map +1 -1
  133. package/dist/SchoolSoft/index.d.ts +1 -0
  134. package/dist/Schoolity/txt/to/index.d.ts +1 -0
  135. package/dist/Schoolity/txt/to/schedules.js +5 -12
  136. package/dist/Schoolity/txt/to/schedules.js.map +1 -1
  137. package/dist/Skola24/mdb/from/course-and-events.js +3 -5
  138. package/dist/Skola24/mdb/from/course-and-events.js.map +1 -1
  139. package/dist/Skola24/mdb/from/groups.js.map +1 -1
  140. package/dist/Skola24/mdb/from/index.js.map +1 -1
  141. package/dist/Skola24/mdb/from/locations.js.map +1 -1
  142. package/dist/Skola24/mdb/from/schedule.d.ts +1 -0
  143. package/dist/Skola24/mdb/from/schedule.js.map +1 -1
  144. package/dist/Skola24/mdb/from/teachers.js.map +1 -1
  145. package/dist/Skola24/txt/from/calendar-exceptions.js +1 -2
  146. package/dist/Skola24/txt/from/calendar-exceptions.js.map +1 -1
  147. package/dist/Skola24/txt/from/division.js.map +1 -1
  148. package/dist/Skola24/txt/from/index.js.map +1 -1
  149. package/dist/Skola24/txt/from/period.js +31 -34
  150. package/dist/Skola24/txt/from/period.js.map +1 -1
  151. package/dist/Skola24/txt/from/schedules.d.ts +1 -0
  152. package/dist/Skola24/txt/from/schedules.js +6 -10
  153. package/dist/Skola24/txt/from/schedules.js.map +1 -1
  154. package/dist/Skola24/txt/from/util.js.map +1 -1
  155. package/dist/Skola24/txt/index.d.ts +1 -0
  156. package/dist/Skola24/txt/to/index.d.ts +1 -0
  157. package/dist/Skola24/txt/to/schedules.js +5 -12
  158. package/dist/Skola24/txt/to/schedules.js.map +1 -1
  159. package/dist/common/constants.js.map +1 -1
  160. package/dist/common/functions.js.map +1 -1
  161. package/dist/common/get-date.js.map +1 -1
  162. package/dist/common/make-chainable/index.js.map +1 -1
  163. package/dist/common/types.d.ts +1 -3
  164. package/dist/core/from/configurations.js.map +1 -1
  165. package/dist/core/from/courses.js.map +1 -1
  166. package/dist/core/from/events.js.map +1 -1
  167. package/dist/core/from/exceptions.js.map +1 -1
  168. package/dist/core/from/groups.js.map +1 -1
  169. package/dist/core/from/index.js.map +1 -1
  170. package/dist/core/from/locations.js.map +1 -1
  171. package/dist/core/from/locked-times.js.map +1 -1
  172. package/dist/core/from/overlap-groups.js.map +1 -1
  173. package/dist/core/from/periods.js.map +1 -1
  174. package/dist/core/from/persons.js.map +1 -1
  175. package/dist/core/from/root-intervals.js.map +1 -1
  176. package/dist/core/from/schedules.js.map +1 -1
  177. package/dist/core/from/settings.js.map +1 -1
  178. package/dist/core/from/syllabuses.js.map +1 -1
  179. package/dist/core/from/teachers.js.map +1 -1
  180. package/dist/core/index.d.ts +1 -0
  181. package/dist/core/interfaces/index.d.ts +23 -0
  182. package/dist/core/interfaces/other/companies.d.ts +1 -0
  183. package/dist/core/interfaces/other/companies.js.map +1 -1
  184. package/dist/core/interfaces/other/index.d.ts +6 -0
  185. package/dist/core/interfaces/other/operations.d.ts +1 -0
  186. package/dist/core/interfaces/vertices/companies.d.ts +1 -0
  187. package/dist/core/interfaces/vertices/configurations.d.ts +1 -0
  188. package/dist/core/interfaces/vertices/courses.d.ts +1 -0
  189. package/dist/core/interfaces/vertices/division-settings.d.ts +2 -0
  190. package/dist/core/interfaces/vertices/divisions.d.ts +1 -0
  191. package/dist/core/interfaces/vertices/events.d.ts +1 -0
  192. package/dist/core/interfaces/vertices/exceptions.d.ts +1 -0
  193. package/dist/core/interfaces/vertices/generations.d.ts +2 -0
  194. package/dist/core/interfaces/vertices/groups.d.ts +1 -0
  195. package/dist/core/interfaces/vertices/index.d.ts +1 -0
  196. package/dist/core/interfaces/vertices/locations.d.ts +1 -0
  197. package/dist/core/interfaces/vertices/locked-times.d.ts +2 -0
  198. package/dist/core/interfaces/vertices/overlap-groups.d.ts +1 -0
  199. package/dist/core/interfaces/vertices/periods.d.ts +3 -0
  200. package/dist/core/interfaces/vertices/persons.d.ts +1 -0
  201. package/dist/core/interfaces/vertices/properties/belongs-to.d.ts +1 -0
  202. package/dist/core/interfaces/vertices/properties/coalesced.d.ts +1 -0
  203. package/dist/core/interfaces/vertices/root-intervals.d.ts +2 -0
  204. package/dist/core/interfaces/vertices/syllabuses.d.ts +1 -0
  205. package/dist/core/interfaces/vertices/teachers.d.ts +1 -0
  206. package/dist/core/interfaces/vertices/threads.d.ts +6 -4
  207. package/dist/core/interfaces/vertices/users.d.ts +1 -0
  208. package/dist/core/interfaces/vertices/util/custom-vertex-export/index.d.ts +6 -6
  209. package/dist/core/interfaces/vertices/util/custom-vertex-export/util.d.ts +4 -4
  210. package/dist/core/interfaces/vertices/util/deep-vertex-export/index.d.ts +9 -9
  211. package/dist/core/interfaces/vertices/util/edges.d.ts +7 -7
  212. package/dist/core/interfaces/vertices/util/index.d.ts +6 -0
  213. package/dist/core/interfaces/vertices/util/util.d.ts +20 -24
  214. package/dist/core/interfaces/vertices/util/vertex-query/index.d.ts +11 -11
  215. package/dist/core/interfaces/vertices/util/vertex.d.ts +1 -1
  216. package/dist/core/interfaces/vertices/vertex-query.d.ts +27 -26
  217. package/dist/core/interfaces/vertices/vertex-query.js.map +1 -1
  218. package/dist/core/to/configurations.js +1 -2
  219. package/dist/core/to/configurations.js.map +1 -1
  220. package/dist/core/to/courses.js +1 -2
  221. package/dist/core/to/courses.js.map +1 -1
  222. package/dist/core/to/division.js.map +1 -1
  223. package/dist/core/to/events.js +1 -2
  224. package/dist/core/to/events.js.map +1 -1
  225. package/dist/core/to/exceptions.js +1 -2
  226. package/dist/core/to/exceptions.js.map +1 -1
  227. package/dist/core/to/groups.js +1 -2
  228. package/dist/core/to/groups.js.map +1 -1
  229. package/dist/core/to/locations.js +1 -2
  230. package/dist/core/to/locations.js.map +1 -1
  231. package/dist/core/to/locked-times.js +1 -2
  232. package/dist/core/to/locked-times.js.map +1 -1
  233. package/dist/core/to/overlap-groups.js +1 -2
  234. package/dist/core/to/overlap-groups.js.map +1 -1
  235. package/dist/core/to/periods.js +1 -2
  236. package/dist/core/to/periods.js.map +1 -1
  237. package/dist/core/to/persons.js +1 -2
  238. package/dist/core/to/persons.js.map +1 -1
  239. package/dist/core/to/root-intervals.js +1 -2
  240. package/dist/core/to/root-intervals.js.map +1 -1
  241. package/dist/core/to/schedules.d.ts +1 -0
  242. package/dist/core/to/schedules.js.map +1 -1
  243. package/dist/core/to/settings.js +1 -2
  244. package/dist/core/to/settings.js.map +1 -1
  245. package/dist/core/to/syllabuses.js +1 -2
  246. package/dist/core/to/syllabuses.js.map +1 -1
  247. package/dist/core/to/teachers.js +1 -2
  248. package/dist/core/to/teachers.js.map +1 -1
  249. package/dist/core/to/util.d.ts +2 -0
  250. package/dist/core/to/util.js +1 -2
  251. package/dist/core/to/util.js.map +1 -1
  252. package/dist/core/types/index.d.ts +6 -0
  253. package/dist/core/util.js +1 -2
  254. package/dist/core/util.js.map +1 -1
  255. package/dist/identify/constants/index.js.map +1 -1
  256. package/dist/identify/index.js +1 -2
  257. package/dist/identify/index.js.map +1 -1
  258. package/dist/sdui/from/classes.js.map +1 -1
  259. package/dist/sdui/from/courses.js.map +1 -1
  260. package/dist/sdui/from/holidays.js.map +1 -1
  261. package/dist/sdui/from/index.js.map +1 -1
  262. package/dist/sdui/from/lessons.js.map +1 -1
  263. package/dist/sdui/from/rooms.js.map +1 -1
  264. package/dist/sdui/from/schedules.d.ts +2 -0
  265. package/dist/sdui/from/schedules.js.map +1 -1
  266. package/dist/sdui/from/school-years.js.map +1 -1
  267. package/dist/sdui/from/substitution-plans.js.map +1 -1
  268. package/dist/sdui/from/teachers.js.map +1 -1
  269. package/dist/sdui/to/classes.js.map +1 -1
  270. package/dist/sdui/to/courses.js.map +1 -1
  271. package/dist/sdui/to/holidays.js.map +1 -1
  272. package/dist/sdui/to/hours.js.map +1 -1
  273. package/dist/sdui/to/index.d.ts +2 -0
  274. package/dist/sdui/to/lessons.js.map +1 -1
  275. package/dist/sdui/to/rooms.js.map +1 -1
  276. package/dist/sdui/to/schedules.js.map +1 -1
  277. package/dist/sdui/to/school-years.js.map +1 -1
  278. package/dist/sdui/to/substitution-plans.js +3 -6
  279. package/dist/sdui/to/substitution-plans.js.map +1 -1
  280. package/dist/sdui/to/teachers.js.map +1 -1
  281. package/dist/vKlass/from/index.js.map +1 -1
  282. package/dist/vKlass/from/schedule.d.ts +1 -0
  283. package/dist/vKlass/from/schedule.js.map +1 -1
  284. package/dist/vKlass/to/schedules.js +6 -17
  285. package/dist/vKlass/to/schedules.js.map +1 -1
  286. 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
- const intervals = weeks.split(",").map((x) => trim(x));
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":"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"}
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 * as xlsx1 from "xlsx";
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) => xlsx1.WorkBook;
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 period = periodsMap.get(_period ? getVertexId(_period, options) : void 0);
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 {
@@ -1,5 +1,6 @@
1
1
  import { BaseOptions } from "../../../common/types.js";
2
2
  import { Types } from "../../../core/types/index.js";
3
+ import "../../../index.js";
3
4
 
4
5
  //#region src/Schoolity/txt/to/index.d.ts
5
6
  declare class export_default {
@@ -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 teacherIds = course.teachers?.map((x) => getVertexId(x.to, options));
222
- const teachers$1 = teacherIds?.map((id) => teacherMap.get(id)).filter((x) => x != null) ?? [];
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 t$1 = event.teachers == null ? course?.teachers : event.teachers;
270
- const teacherIds = t$1?.map((x) => getVertexId(x.to, options));
271
- const teachers$1 = teacherIds?.map((id) => teacherMap.get(id)).filter(Boolean) ?? [];
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":"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"}
@@ -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 keys = [
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;