@royalschedule/maps 4.0.30 → 4.0.32

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 (285) 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 +0 -1
  8. package/dist/Additio/from/schedules.js +4 -2
  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 +0 -2
  12. package/dist/Additio/to/schedules.js +4 -2
  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 +0 -1
  21. package/dist/Admentum/from/schedules.js +6 -3
  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 +0 -1
  25. package/dist/Admentum/to/schedules.js +7 -4
  26. package/dist/Admentum/to/schedules.js.map +1 -1
  27. package/dist/Excel/index.d.ts +4 -4
  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 -4
  31. package/dist/Excel/v2/from/index.js +54 -45
  32. package/dist/Excel/v2/from/index.js.map +1 -1
  33. package/dist/Excel/v2/index.d.ts +4 -4
  34. package/dist/IdunSoft/from/courses.js.map +1 -1
  35. package/dist/IdunSoft/from/events.js +2 -1
  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 +0 -1
  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 +0 -1
  44. package/dist/IdunSoft/to/schedules.js +6 -3
  45. package/dist/IdunSoft/to/schedules.js.map +1 -1
  46. package/dist/InfoMentor/to/index.d.ts +0 -1
  47. package/dist/InfoMentor/to/schedules.js +2 -1
  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 +11 -9
  51. package/dist/PlanDigital/from/schedules.js.map +1 -1
  52. package/dist/PlanDigital/index.d.ts +0 -1
  53. package/dist/Quiculum/file/to/index.d.ts +0 -1
  54. package/dist/Quiculum/file/to/schedules.js +9 -5
  55. package/dist/Quiculum/file/to/schedules.js.map +1 -1
  56. package/dist/RS/from/division.d.ts +0 -1
  57. package/dist/RS/from/division.js +2 -1
  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 +0 -1
  61. package/dist/RS/from/schedules.js.map +1 -1
  62. package/dist/RS/make-connected.d.ts +1 -3
  63. package/dist/RS/make-connected.js +42 -33
  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 +6 -4
  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 +2 -1
  70. package/dist/RS/to/input/default.js.map +1 -1
  71. package/dist/RS/to/input/dependencies.js +2 -1
  72. package/dist/RS/to/input/dependencies.js.map +1 -1
  73. package/dist/RS/to/input/dynamic-locked-times.js +2 -1
  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 +2 -1
  78. package/dist/RS/to/input/individuals.js.map +1 -1
  79. package/dist/RS/to/input/input.js +2 -1
  80. package/dist/RS/to/input/input.js.map +1 -1
  81. package/dist/RS/to/input/intervals.js +4 -2
  82. package/dist/RS/to/input/intervals.js.map +1 -1
  83. package/dist/RS/to/input/periods.js +4 -2
  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.map +1 -1
  87. package/dist/RS/to/input/util/attach-locked-times.js.map +1 -1
  88. package/dist/RS/to/input/util/parse-days.js.map +1 -1
  89. package/dist/RS/to/input/util/parse-group-references.js.map +1 -1
  90. package/dist/RS/to/input/util/parse-intervals.js +4 -2
  91. package/dist/RS/to/input/util/parse-intervals.js.map +1 -1
  92. package/dist/RS/to/input/util/parse-location-references.js +2 -1
  93. package/dist/RS/to/input/util/parse-location-references.js.map +1 -1
  94. package/dist/RS/to/input/util/parse-max-working-hours.js.map +1 -1
  95. package/dist/RS/to/input/util/parse-minimum-break-length.js.map +1 -1
  96. package/dist/RS/to/input/util/util.js +2 -1
  97. package/dist/RS/to/input/util/util.js.map +1 -1
  98. package/dist/RS/to/schedules.js.map +1 -1
  99. package/dist/RS/types/to.d.ts +0 -1
  100. package/dist/SS12000/from/activities.js +2 -1
  101. package/dist/SS12000/from/activities.js.map +1 -1
  102. package/dist/SS12000/from/calendar-events.js.map +1 -1
  103. package/dist/SS12000/from/duties.js.map +1 -1
  104. package/dist/SS12000/from/groups.js.map +1 -1
  105. package/dist/SS12000/from/index.js.map +1 -1
  106. package/dist/SS12000/from/persons.js.map +1 -1
  107. package/dist/SS12000/from/resources.js.map +1 -1
  108. package/dist/SS12000/from/rooms.js.map +1 -1
  109. package/dist/SS12000/from/syllabuses.js.map +1 -1
  110. package/dist/SS12000/index.d.ts +181 -1
  111. package/dist/SS12000/to/activities.js.map +1 -1
  112. package/dist/SS12000/to/calendar-events.js.map +1 -1
  113. package/dist/SS12000/to/common.js.map +1 -1
  114. package/dist/SS12000/to/duties.js.map +1 -1
  115. package/dist/SS12000/to/groups.js.map +1 -1
  116. package/dist/SS12000/to/index.d.ts +0 -1
  117. package/dist/SS12000/to/persons.js.map +1 -1
  118. package/dist/SS12000/to/resources.js.map +1 -1
  119. package/dist/SS12000/to/rooms.js.map +1 -1
  120. package/dist/SS12000/to/syllabuses.js.map +1 -1
  121. package/dist/SchoolSoft/api/from/index.js.map +1 -1
  122. package/dist/SchoolSoft/api/from/schedules.js +12 -8
  123. package/dist/SchoolSoft/api/from/schedules.js.map +1 -1
  124. package/dist/SchoolSoft/api/index.d.ts +7 -6
  125. package/dist/SchoolSoft/file/from/index.js.map +1 -1
  126. package/dist/SchoolSoft/file/from/schedules.js +87 -83
  127. package/dist/SchoolSoft/file/from/schedules.js.map +1 -1
  128. package/dist/SchoolSoft/file/index.d.ts +0 -1
  129. package/dist/SchoolSoft/file/to/index.d.ts +0 -1
  130. package/dist/SchoolSoft/file/to/schedules.js +2 -1
  131. package/dist/SchoolSoft/file/to/schedules.js.map +1 -1
  132. package/dist/SchoolSoft/index.d.ts +0 -1
  133. package/dist/Schoolity/txt/to/index.d.ts +0 -1
  134. package/dist/Schoolity/txt/to/schedules.js +12 -5
  135. package/dist/Schoolity/txt/to/schedules.js.map +1 -1
  136. package/dist/Skola24/mdb/from/course-and-events.js +5 -3
  137. package/dist/Skola24/mdb/from/course-and-events.js.map +1 -1
  138. package/dist/Skola24/mdb/from/groups.js.map +1 -1
  139. package/dist/Skola24/mdb/from/index.js.map +1 -1
  140. package/dist/Skola24/mdb/from/locations.js.map +1 -1
  141. package/dist/Skola24/mdb/from/schedule.d.ts +0 -1
  142. package/dist/Skola24/mdb/from/schedule.js.map +1 -1
  143. package/dist/Skola24/mdb/from/teachers.js.map +1 -1
  144. package/dist/Skola24/txt/from/calendar-exceptions.js +2 -1
  145. package/dist/Skola24/txt/from/calendar-exceptions.js.map +1 -1
  146. package/dist/Skola24/txt/from/division.js.map +1 -1
  147. package/dist/Skola24/txt/from/index.js.map +1 -1
  148. package/dist/Skola24/txt/from/period.js +34 -31
  149. package/dist/Skola24/txt/from/period.js.map +1 -1
  150. package/dist/Skola24/txt/from/schedules.d.ts +0 -1
  151. package/dist/Skola24/txt/from/schedules.js +10 -6
  152. package/dist/Skola24/txt/from/schedules.js.map +1 -1
  153. package/dist/Skola24/txt/from/util.js.map +1 -1
  154. package/dist/Skola24/txt/index.d.ts +0 -1
  155. package/dist/Skola24/txt/to/index.d.ts +0 -1
  156. package/dist/Skola24/txt/to/schedules.js +12 -5
  157. package/dist/Skola24/txt/to/schedules.js.map +1 -1
  158. package/dist/common/constants.js.map +1 -1
  159. package/dist/common/functions.js.map +1 -1
  160. package/dist/common/get-date.js.map +1 -1
  161. package/dist/common/make-chainable/index.js.map +1 -1
  162. package/dist/common/types.d.ts +3 -1
  163. package/dist/core/from/configurations.js.map +1 -1
  164. package/dist/core/from/courses.js.map +1 -1
  165. package/dist/core/from/events.js.map +1 -1
  166. package/dist/core/from/exceptions.js.map +1 -1
  167. package/dist/core/from/groups.js.map +1 -1
  168. package/dist/core/from/index.js.map +1 -1
  169. package/dist/core/from/locations.js.map +1 -1
  170. package/dist/core/from/locked-times.js.map +1 -1
  171. package/dist/core/from/overlap-groups.js.map +1 -1
  172. package/dist/core/from/periods.js.map +1 -1
  173. package/dist/core/from/persons.js.map +1 -1
  174. package/dist/core/from/root-intervals.js.map +1 -1
  175. package/dist/core/from/schedules.js.map +1 -1
  176. package/dist/core/from/settings.js.map +1 -1
  177. package/dist/core/from/syllabuses.js.map +1 -1
  178. package/dist/core/from/teachers.js.map +1 -1
  179. package/dist/core/index.d.ts +0 -1
  180. package/dist/core/interfaces/other/companies.js.map +1 -1
  181. package/dist/core/interfaces/other/operations.d.ts +0 -1
  182. package/dist/core/interfaces/vertices/companies.d.ts +0 -1
  183. package/dist/core/interfaces/vertices/configurations.d.ts +1 -2
  184. package/dist/core/interfaces/vertices/courses.d.ts +0 -1
  185. package/dist/core/interfaces/vertices/division-settings.d.ts +0 -1
  186. package/dist/core/interfaces/vertices/divisions.d.ts +0 -1
  187. package/dist/core/interfaces/vertices/events.d.ts +2 -1
  188. package/dist/core/interfaces/vertices/exceptions.d.ts +0 -1
  189. package/dist/core/interfaces/vertices/generations.d.ts +0 -2
  190. package/dist/core/interfaces/vertices/groups.d.ts +0 -1
  191. package/dist/core/interfaces/vertices/index.d.ts +14 -1
  192. package/dist/core/interfaces/vertices/locations.d.ts +0 -1
  193. package/dist/core/interfaces/vertices/locked-times.d.ts +0 -2
  194. package/dist/core/interfaces/vertices/overlap-groups.d.ts +0 -1
  195. package/dist/core/interfaces/vertices/periods.d.ts +0 -2
  196. package/dist/core/interfaces/vertices/persons.d.ts +0 -1
  197. package/dist/core/interfaces/vertices/properties/belongs-to.d.ts +0 -1
  198. package/dist/core/interfaces/vertices/properties/coalesced.d.ts +0 -1
  199. package/dist/core/interfaces/vertices/root-intervals.d.ts +0 -2
  200. package/dist/core/interfaces/vertices/syllabuses.d.ts +0 -1
  201. package/dist/core/interfaces/vertices/teachers.d.ts +0 -1
  202. package/dist/core/interfaces/vertices/threads.d.ts +31 -0
  203. package/dist/core/interfaces/vertices/users.d.ts +4 -2
  204. package/dist/core/interfaces/vertices/util/custom-vertex-export/index.d.ts +9 -8
  205. package/dist/core/interfaces/vertices/util/custom-vertex-export/util.d.ts +4 -4
  206. package/dist/core/interfaces/vertices/util/deep-vertex-export/index.d.ts +9 -8
  207. package/dist/core/interfaces/vertices/util/edges.d.ts +26 -8
  208. package/dist/core/interfaces/vertices/util/util.d.ts +24 -20
  209. package/dist/core/interfaces/vertices/util/vertex-query/index.d.ts +16 -11
  210. package/dist/core/interfaces/vertices/util/vertex.d.ts +2 -2
  211. package/dist/core/interfaces/vertices/vertex-query.d.ts +29 -26
  212. package/dist/core/interfaces/vertices/vertex-query.js +8 -0
  213. package/dist/core/interfaces/vertices/vertex-query.js.map +1 -1
  214. package/dist/core/to/configurations.js +2 -1
  215. package/dist/core/to/configurations.js.map +1 -1
  216. package/dist/core/to/courses.js +2 -1
  217. package/dist/core/to/courses.js.map +1 -1
  218. package/dist/core/to/division.js.map +1 -1
  219. package/dist/core/to/events.js +4 -2
  220. package/dist/core/to/events.js.map +1 -1
  221. package/dist/core/to/exceptions.js +2 -1
  222. package/dist/core/to/exceptions.js.map +1 -1
  223. package/dist/core/to/groups.js +2 -1
  224. package/dist/core/to/groups.js.map +1 -1
  225. package/dist/core/to/locations.js +2 -1
  226. package/dist/core/to/locations.js.map +1 -1
  227. package/dist/core/to/locked-times.js +2 -1
  228. package/dist/core/to/locked-times.js.map +1 -1
  229. package/dist/core/to/overlap-groups.js +2 -1
  230. package/dist/core/to/overlap-groups.js.map +1 -1
  231. package/dist/core/to/periods.js +2 -1
  232. package/dist/core/to/periods.js.map +1 -1
  233. package/dist/core/to/persons.js +2 -1
  234. package/dist/core/to/persons.js.map +1 -1
  235. package/dist/core/to/root-intervals.js +2 -1
  236. package/dist/core/to/root-intervals.js.map +1 -1
  237. package/dist/core/to/schedules.d.ts +0 -1
  238. package/dist/core/to/schedules.js.map +1 -1
  239. package/dist/core/to/settings.js +2 -1
  240. package/dist/core/to/settings.js.map +1 -1
  241. package/dist/core/to/syllabuses.js +2 -1
  242. package/dist/core/to/syllabuses.js.map +1 -1
  243. package/dist/core/to/teachers.js +2 -1
  244. package/dist/core/to/teachers.js.map +1 -1
  245. package/dist/core/to/util.d.ts +0 -2
  246. package/dist/core/to/util.js +2 -1
  247. package/dist/core/to/util.js.map +1 -1
  248. package/dist/core/types/index.d.ts +10 -1
  249. package/dist/core/util.js +2 -1
  250. package/dist/core/util.js.map +1 -1
  251. package/dist/identify/constants/index.js.map +1 -1
  252. package/dist/identify/index.js +2 -1
  253. package/dist/identify/index.js.map +1 -1
  254. package/dist/sdui/from/classes.js.map +1 -1
  255. package/dist/sdui/from/courses.js.map +1 -1
  256. package/dist/sdui/from/holidays.js.map +1 -1
  257. package/dist/sdui/from/index.js.map +1 -1
  258. package/dist/sdui/from/lessons.js.map +1 -1
  259. package/dist/sdui/from/rooms.js.map +1 -1
  260. package/dist/sdui/from/schedules.d.ts +0 -2
  261. package/dist/sdui/from/schedules.js.map +1 -1
  262. package/dist/sdui/from/school-years.js.map +1 -1
  263. package/dist/sdui/from/substitution-plans.js.map +1 -1
  264. package/dist/sdui/from/teachers.js.map +1 -1
  265. package/dist/sdui/to/classes.js.map +1 -1
  266. package/dist/sdui/to/courses.js.map +1 -1
  267. package/dist/sdui/to/holidays.js.map +1 -1
  268. package/dist/sdui/to/hours.js.map +1 -1
  269. package/dist/sdui/to/index.d.ts +0 -2
  270. package/dist/sdui/to/lessons.js.map +1 -1
  271. package/dist/sdui/to/rooms.js.map +1 -1
  272. package/dist/sdui/to/schedules.js.map +1 -1
  273. package/dist/sdui/to/school-years.js.map +1 -1
  274. package/dist/sdui/to/substitution-plans.js +6 -3
  275. package/dist/sdui/to/substitution-plans.js.map +1 -1
  276. package/dist/sdui/to/teachers.js.map +1 -1
  277. package/dist/vKlass/from/index.js.map +1 -1
  278. package/dist/vKlass/from/schedule.d.ts +0 -1
  279. package/dist/vKlass/from/schedule.js.map +1 -1
  280. package/dist/vKlass/to/schedules.js +17 -6
  281. package/dist/vKlass/to/schedules.js.map +1 -1
  282. package/package.json +1 -1
  283. package/dist/core/interfaces/index.d.ts +0 -23
  284. package/dist/core/interfaces/other/index.d.ts +0 -6
  285. package/dist/core/interfaces/vertices/util/index.d.ts +0 -6
@@ -1 +1 @@
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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"}
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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"}
@@ -18,9 +18,10 @@ 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");
21
22
  return {
22
23
  start,
23
- end: start.clone().add(lesson.Length, "minute"),
24
+ end,
24
25
  parked: false
25
26
  };
26
27
  }
@@ -206,11 +207,12 @@ function course_and_events_default(groups, lessons, meta, groupPlansMap, planMap
206
207
  const courses = [...courseMap].filter(([k]) => populatedCourses.has(k));
207
208
  courseMap = new Map(courses);
208
209
  }
209
- for (const key of [
210
+ const keys = [
210
211
  "groups",
211
212
  "teachers",
212
213
  "locations"
213
- ]) courseMap.forEach((c, courseKey) => {
214
+ ];
215
+ for (const key of keys) courseMap.forEach((c, courseKey) => {
214
216
  const events = eventMap.get(courseKey.toString());
215
217
  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;
216
218
  if (eventEntries.length != 1) return;
@@ -1 +1 @@
1
- {"version":3,"file":"course-and-events.js","names":["weeks: number[]","matches: RegExpExecArray | null","intervals: CoreTypes.interval[]","courseMap: Map<number, OutTypes.course>","subject: string | undefined","event: OutTypes.event","l","classes: Set<string>","days: CoreTypes.day[]","idss: string[]","displayNames: string[]","groups","newCourse: OutTypes.course","x"],"sources":["../../../../src/Skola24/mdb/from/course-and-events.ts"],"sourcesContent":["import moment from 'moment';\nimport { uniqBy } from 'lodash-es';\nimport type { CoreTypes } from '../../../core';\nimport type { OutTypes } from './schedule';\nimport type { Types as Skal24Types } from '../types';\nimport type { BaseOptions } from '../../../common/types';\nimport { makeChainable } from '../../../common/make-chainable';\n\n\nconst separator = ', ';\nconst arbetstid = 'Arbetstid'.toLowerCase();\nconst firstDay = '1970-01-05';\nconst numDays = 5;\nconst defaultDayStart = [8, 0];\nconst defaultDayEnd = [17, 0];\n\nfunction generateDate (\n days: number,\n hours: number,\n minutes: number\n) {\n return moment.utc(firstDay)\n .add(days, 'days')\n .add(hours, 'hours')\n .add(minutes, 'minutes');\n}\n\nfunction startAndEnd (\n lesson: Skal24Types.lesson\n): undefined | { start: moment.Moment, end: moment.Moment, parked: false } {\n if ('Length' in lesson && 'DayOfWeek' in lesson && 'StartTime' in lesson) {\n const dateTimeDate = moment(lesson.StartTime, 'MM/DD/YY hh:mm:ss');\n const hours = dateTimeDate.get('hours');\n const minutes = dateTimeDate.get('minutes');\n\n // let start = moment.utc(firstDay)\n // .add(lesson.DayOfWeek, \"days\")\n // .add(hours, \"hours\")\n // .add(minutes, \"minutes\");\n const start = generateDate(lesson.DayOfWeek!, hours, minutes);\n const end = start.clone().add(lesson.Length, 'minute');\n return { start: start, end: end, parked: false };\n }\n\n return;\n}\n\nfunction parseActualWeeks (val?: string) {\n if (!val) return [];\n\n const weeks: number[] = [];\n\n val\n .split(',')\n .forEach(x => {\n if (x.includes('-')) {\n // multiple weeks\n const [start, end] = x.split('-');\n for (let i = parseInt(start); i <= parseInt(end); i++)\n weeks.push(i);\n } else {\n // single week\n weeks.push(parseInt(x));\n }\n });\n\n return weeks;\n}\n\nfunction addGroupsFromName (\n name: string,\n groupSet: Set<string>,\n groupNamePkMap: Map<string, string>\n) {\n // assumes course names of the type \"10IDS01-EK20C-LAG\"\n const regex = /-([^\\s-]+)/gi;\n\n let matches: RegExpExecArray | null;\n while ((matches = regex.exec(name)) !== null) {\n if (groupNamePkMap.has(matches[1])) {\n const PK = groupNamePkMap.get(matches[1])!;\n groupSet.add(PK);\n }\n }\n}\n\nfunction getDay (mnt: moment.Moment) {\n return mnt.dayOfYear() - moment.utc(firstDay).dayOfYear();\n}\n\nfunction createDefaultIntervals () {\n const intervals: CoreTypes.interval[] = [];\n\n for (let d = 0; d < numDays; d++) {\n intervals.push({\n start: generateDate(d, defaultDayStart[0], defaultDayStart[1]),\n end: generateDate(d, defaultDayEnd[0], defaultDayEnd[1])\n });\n }\n\n return intervals;\n}\n\n\n\n\nexport default function (\n groups: Skal24Types.group[],\n lessons: Skal24Types.lesson[],\n meta: Skal24Types.options & BaseOptions | undefined,\n\n groupPlansMap: Map<number, Set<string> >,\n planMap: Map<number, Skal24Types.plan>,\n\n subjectMap: Map<number, string>,\n planTeachersMap: Map<number, Set<string> >,\n groupClassesMap: Map<string, Set<string> >,\n RSgroups: OutTypes.group[],\n\n groupMap: Map<number, Skal24Types.group>,\n lessonRoomsMap: Map<number, Set<string> >,\n lessonTeachersMap: Map<number, Set<string> >,\n lessonGroupsMap: Map<number, Set<string> >,\n RSteachers: OutTypes.teacher[],\n\n warnings: string[],\n errors: string[]\n): { courses: OutTypes.course[], events: OutTypes.event[] } {\n\n // used when deducing groups from the course name\n const groupNamePkMap = new Map(RSgroups.map(g => [g.displayName!, g.ids!]));\n\n ////\n //// courses\n ////\n let courseMap: Map<number, OutTypes.course> = new Map();\n groups.forEach(x => {\n // need to be a scheduled group\n if (x.bClass) return;\n\n // check if at least one plan intersects our period\n const plans = groupPlansMap.get(x.PK);\n\n // fetch subject via first plan\n let subject: string | undefined;\n if (plans) {\n const subjPK = planMap.get(parseInt([...plans][0]))?.FKSubject;\n if (subjPK) subject = subjectMap.get(subjPK);\n }\n // if (subject) console.log(subject)\n\n const groupSet = groupClassesMap.get(x.PK.toString()) ?? new Set<string>();\n\n // attempt to deduce groups by analyzing the course name\n if (meta?.deduceGroupsFromCourseName && x.ID) {\n addGroupsFromName(x.ID, groupSet, groupNamePkMap);\n }\n\n\n\n // if (groups) console.log(groups)\n\n const teacherSet = new Set<string>();\n groupPlansMap.get(x.PK)?.forEach(p => {\n planTeachersMap.get(parseInt(p))?.forEach(t => teacherSet.add(t));\n });\n // if (teacherSet) console.log(teacherSet)\n\n\n courseMap.set(x.PK, {\n ids: x.PK.toString(),\n displayName: x.ID,\n\n ...( subject && { subject } ),\n ...( groupSet?.size && { groups: [...groupSet ].map(to => ({ to })) } ),\n ...( teacherSet.size && { teachers: [...teacherSet].map(to => ({ to })) } )\n });\n });\n\n\n\n ////\n //// events\n ////\n let numAdditionalCourses = 0;\n const eventMap = new Map<string, OutTypes.event[]>();\n const intervalMap = new Map<string, Map<number, CoreTypes.interval> >();\n lessons.forEach(l => {\n // ignore all lessons which are not scheduled on the week of interest\n if (meta?.week == undefined || !parseActualWeeks(l.CalcActualWeeks).includes(meta.week)) return;\n\n\n const coursesIds = [...(lessonGroupsMap.get(l.PK) ?? new Set())]\n .map(id => groupMap.get(parseInt(id)))\n .filter((g): g is NonNullable<typeof g> => g?.bClass == false)\n .sort((g1, g2) => g1.PK - g2.PK)\n .map(g => g.PK);\n\n const event: OutTypes.event = {\n ids: l.PK.toString(),\n\n duration: l.Length,\n preferredDuration: l.Length,\n ...startAndEnd(l)\n };\n\n // try add room\n const rooms = lessonRoomsMap.get(l.PK);\n if (rooms?.size) {\n event.inLocations = [...rooms];\n event.locations = [...rooms].map(l => ({ locations: [l] }));\n }\n\n // try add teachers\n const teachers = lessonTeachersMap.get(l.PK);\n if (teachers?.size) event.teachers = [...teachers].map(to => ({ to }));\n\n // fetch groups\n const classes: Set<string> = new Set();\n lessonGroupsMap.get(l.PK)?.forEach(scheduleGroupId => {\n groupClassesMap.get(scheduleGroupId)?.forEach(classId => {\n classes.add(classId);\n });\n });\n\n // attempt to deduce groups by analyzing the course name\n // (but only if the event explicitly has groups or its course has none)\n const courseHasGroups = coursesIds.some(x => courseMap.get(x)?.groups);\n if (meta?.deduceGroupsFromCourseName && (!courseHasGroups || classes.size)) {\n coursesIds.map(x => courseMap.get(x)?.displayName)\n .filter(x => x != null)\n .forEach(x => addGroupsFromName(x, classes, groupNamePkMap));\n }\n\n // try add groups\n if (classes.size) event.groups = [...classes].map(to => ({ to }));\n\n\n const subject = subjectMap.get(l.FKSubject!);\n if (subject?.toLowerCase() == arbetstid) {\n // is an interval\n\n // ensure start and end is set\n const start = event.start;\n const end = event.end;\n if (!start || !end) {\n warnings.push('Start or end not set on interval event');\n return;\n }\n\n // interval day\n const day = getDay(moment.utc(start));\n\n if (0 > day || day > numDays - 1) {\n warnings.push('Interval day out of bounds');\n return;\n }\n\n // add interval\n teachers?.forEach(t => {\n if (!intervalMap.has(t)) intervalMap.set(t, new Map());\n intervalMap.get(t)?.set(day, { start, end });\n });\n\n } else {\n // is an event\n\n ////\n //// if there is no course, create it\n //// (can also be interval)\n ////\n if (!coursesIds.length) {\n const id = --numAdditionalCourses;\n\n courseMap.set(id, {\n ids: id.toString(),\n\n ...( subject && { displayName: subject } ),\n ...( subject && { subject } ),\n\n // // makes it easier to se in the table\n // ...( teachers?.size && { teachers: [...teachers] } ),\n // ...( classes?.size && { groups: [...classes] } ),\n });\n\n coursesIds.push(id);\n }\n\n\n // add\n const key = coursesIds.join(separator);\n if (!eventMap.has(key)) eventMap.set(key, []);\n eventMap.get(key)?.push(event);\n }\n\n });\n\n\n ////\n //// set teacher days and intervals\n ////\n intervalMap.forEach((v, k) => {\n // fetch teacher\n const teacher = RSteachers.find(t => t.ids == k);\n if (!teacher) {\n warnings.push(`An interval referred to the unknown teacher with PK = ${k}`);\n return;\n }\n\n // construct\n const intervals = createDefaultIntervals();\n const days: CoreTypes.day[] = [];\n v.forEach((i, d) => {\n days.push({ day: d });\n intervals[d] = i;\n });\n\n // set\n // (set days only if not all are permitted)\n teacher.intervals = intervals;\n if (days.length != numDays) teacher.days = days;\n });\n\n\n ////\n //// merge courses\n ////\n eventMap.forEach((events, key) => {\n const courseIds = key.split(separator).map(x => parseInt(x));\n\n if (courseIds.length > 1) {\n const idss: string[] = [];\n const displayNames: string[] = [];\n\n const subjects = new Set<string>();\n const groups = new Set<string>();\n const teachers = new Set<string>();\n\n // merge courses\n courseIds.map(x => courseMap.get(x))\n .filter(c => c != undefined)\n .forEach(c => {\n if (c.ids) idss.push(c.ids);\n if (c.displayName) displayNames.push(c.displayName);\n\n if (c.subject) subjects.add(c.subject);\n if (c.groups) c.groups.forEach(({ to }) => groups.add(to.toString()));\n if (c.teachers) c.teachers.forEach(({ to }) => teachers.add(to.toString()));\n });\n\n const newKey = --numAdditionalCourses;\n const newCourse: OutTypes.course = {\n ids: idss.join(separator),\n displayName: displayNames.join(separator),\n\n ...( subjects.size && { subject: [...subjects].join(separator) } ),\n\n ...( groups.size && { groups: [...groups].map(to => ({ to })) } ),\n ...( teachers.size && { teachers: [...teachers].map(to => ({ to })) } )\n };\n\n // add courses\n // (leave old courses if they have events) <-- WTF!?\n courseMap.set(newKey, newCourse);\n\n // link events to new course\n eventMap.set(newKey.toString(), [...events]);\n events.length = 0;\n\n // console.log(`The courses with PKs [${courseIds.join(separator)}] needed to be merged.`);\n warnings.push(`The courses with PKs [${courseIds.join(separator)}] needed to be merged.`);\n }\n });\n\n\n\n ////\n //// link events with courses\n ////\n const populatedCourses = new Set<number>();\n eventMap.forEach((events, key) => {\n // need to contain events\n if (!events.length) return;\n\n const courseIds = key.split(separator).map(x => parseInt(x));\n\n if (courseIds.length != 1 && events.length) throw new Error('Well this was unexpected...');\n\n const courseId = courseIds[0];\n const PK = courseMap.get(courseId)?.ids;\n\n if (PK == undefined) {\n // console.log(courseIds, PK, key, events)\n // throw \"Well this was also unexpected...\";\n // console.log(`The events with PKs ${events.map(e => e.ids)} were ignored since their course was not found.`);\n errors.push(`The events with PKs ${events.map(e => e.ids).join(', ')} were ignored since their course was not found.`);\n events.length = 0;\n return;\n }\n\n // link\n events.forEach(e => e.course = PK);\n\n populatedCourses.add(courseId);\n });\n\n\n\n ////\n //// try remove empty courses\n ////\n if (meta?.ignoreEmptyCourses) {\n // filter in place\n const courses = [...courseMap].filter(([k]) => populatedCourses.has(k));\n courseMap = new Map(courses);\n }\n\n\n ////\n //// try promote groups, teachers and locations to the parent course\n //// (if the course has none and all sibling events have the same)\n ////\n const keys = ['groups', 'teachers', 'locations'] as const;\n for (const key of keys) {\n courseMap.forEach((c, courseKey) => {\n // need to use the \"courseKey\" as it is different from the \"c.ids\" if the course has been merged\n const events = eventMap.get(courseKey.toString());\n\n const eventEntries = makeChainable(events ?? [])\n .chain(\n x => x\n .map(e => e[key] ?? c[key])\n .filter(x => x != null),\n x => uniqBy(x, x => x\n .map(x => 'to' in x ? x.to : x.locations[0])\n .sort()\n .join('.')\n )\n )\n .value;\n\n // the event entries must be exactly one\n if (eventEntries.length != 1) return;\n\n // update\n switch (key) {\n case 'groups': c[key] = eventEntries[0] as (typeof c)[typeof key]; break;\n case 'teachers': c[key] = eventEntries[0] as (typeof c)[typeof key]; break;\n case 'locations': c[key] = eventEntries[0] as (typeof c)[typeof key]; break;\n default: throw new Error(`Unknown key \"${key satisfies never as string}\"`);\n }\n events?.forEach(e => delete e[key]);\n });\n }\n\n\n // let eventsArray: Types.courseEvent[] = [];\n return { courses: [...courseMap.values()], events: [...eventMap.values()].flat() };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"course-and-events.js","names":["weeks: number[]","matches: RegExpExecArray | null","intervals: CoreTypes.interval[]","courseMap: Map<number, OutTypes.course>","subject: string | undefined","event: OutTypes.event","l","classes: Set<string>","days: CoreTypes.day[]","idss: string[]","displayNames: string[]","groups","newCourse: OutTypes.course","x"],"sources":["../../../../src/Skola24/mdb/from/course-and-events.ts"],"sourcesContent":["import moment from 'moment';\nimport { uniqBy } from 'lodash-es';\nimport type { CoreTypes } from '../../../core';\nimport type { OutTypes } from './schedule';\nimport type { Types as Skal24Types } from '../types';\nimport type { BaseOptions } from '../../../common/types';\nimport { makeChainable } from '../../../common/make-chainable';\n\n\nconst separator = ', ';\nconst arbetstid = 'Arbetstid'.toLowerCase();\nconst firstDay = '1970-01-05';\nconst numDays = 5;\nconst defaultDayStart = [8, 0];\nconst defaultDayEnd = [17, 0];\n\nfunction generateDate (\n days: number,\n hours: number,\n minutes: number\n) {\n return moment.utc(firstDay)\n .add(days, 'days')\n .add(hours, 'hours')\n .add(minutes, 'minutes');\n}\n\nfunction startAndEnd (\n lesson: Skal24Types.lesson\n): undefined | { start: moment.Moment, end: moment.Moment, parked: false } {\n if ('Length' in lesson && 'DayOfWeek' in lesson && 'StartTime' in lesson) {\n const dateTimeDate = moment(lesson.StartTime, 'MM/DD/YY hh:mm:ss');\n const hours = dateTimeDate.get('hours');\n const minutes = dateTimeDate.get('minutes');\n\n // let start = moment.utc(firstDay)\n // .add(lesson.DayOfWeek, \"days\")\n // .add(hours, \"hours\")\n // .add(minutes, \"minutes\");\n const start = generateDate(lesson.DayOfWeek!, hours, minutes);\n const end = start.clone().add(lesson.Length, 'minute');\n return { start: start, end: end, parked: false };\n }\n\n return;\n}\n\nfunction parseActualWeeks (val?: string) {\n if (!val) return [];\n\n const weeks: number[] = [];\n\n val\n .split(',')\n .forEach(x => {\n if (x.includes('-')) {\n // multiple weeks\n const [start, end] = x.split('-');\n for (let i = parseInt(start); i <= parseInt(end); i++)\n weeks.push(i);\n } else {\n // single week\n weeks.push(parseInt(x));\n }\n });\n\n return weeks;\n}\n\nfunction addGroupsFromName (\n name: string,\n groupSet: Set<string>,\n groupNamePkMap: Map<string, string>\n) {\n // assumes course names of the type \"10IDS01-EK20C-LAG\"\n const regex = /-([^\\s-]+)/gi;\n\n let matches: RegExpExecArray | null;\n while ((matches = regex.exec(name)) !== null) {\n if (groupNamePkMap.has(matches[1])) {\n const PK = groupNamePkMap.get(matches[1])!;\n groupSet.add(PK);\n }\n }\n}\n\nfunction getDay (mnt: moment.Moment) {\n return mnt.dayOfYear() - moment.utc(firstDay).dayOfYear();\n}\n\nfunction createDefaultIntervals () {\n const intervals: CoreTypes.interval[] = [];\n\n for (let d = 0; d < numDays; d++) {\n intervals.push({\n start: generateDate(d, defaultDayStart[0], defaultDayStart[1]),\n end: generateDate(d, defaultDayEnd[0], defaultDayEnd[1])\n });\n }\n\n return intervals;\n}\n\n\n\n\nexport default function (\n groups: Skal24Types.group[],\n lessons: Skal24Types.lesson[],\n meta: Skal24Types.options & BaseOptions | undefined,\n\n groupPlansMap: Map<number, Set<string> >,\n planMap: Map<number, Skal24Types.plan>,\n\n subjectMap: Map<number, string>,\n planTeachersMap: Map<number, Set<string> >,\n groupClassesMap: Map<string, Set<string> >,\n RSgroups: OutTypes.group[],\n\n groupMap: Map<number, Skal24Types.group>,\n lessonRoomsMap: Map<number, Set<string> >,\n lessonTeachersMap: Map<number, Set<string> >,\n lessonGroupsMap: Map<number, Set<string> >,\n RSteachers: OutTypes.teacher[],\n\n warnings: string[],\n errors: string[]\n): { courses: OutTypes.course[], events: OutTypes.event[] } {\n\n // used when deducing groups from the course name\n const groupNamePkMap = new Map(RSgroups.map(g => [g.displayName!, g.ids!]));\n\n ////\n //// courses\n ////\n let courseMap: Map<number, OutTypes.course> = new Map();\n groups.forEach(x => {\n // need to be a scheduled group\n if (x.bClass) return;\n\n // check if at least one plan intersects our period\n const plans = groupPlansMap.get(x.PK);\n\n // fetch subject via first plan\n let subject: string | undefined;\n if (plans) {\n const subjPK = planMap.get(parseInt([...plans][0]))?.FKSubject;\n if (subjPK) subject = subjectMap.get(subjPK);\n }\n // if (subject) console.log(subject)\n\n const groupSet = groupClassesMap.get(x.PK.toString()) ?? new Set<string>();\n\n // attempt to deduce groups by analyzing the course name\n if (meta?.deduceGroupsFromCourseName && x.ID) {\n addGroupsFromName(x.ID, groupSet, groupNamePkMap);\n }\n\n\n\n // if (groups) console.log(groups)\n\n const teacherSet = new Set<string>();\n groupPlansMap.get(x.PK)?.forEach(p => {\n planTeachersMap.get(parseInt(p))?.forEach(t => teacherSet.add(t));\n });\n // if (teacherSet) console.log(teacherSet)\n\n\n courseMap.set(x.PK, {\n ids: x.PK.toString(),\n displayName: x.ID,\n\n ...( subject && { subject } ),\n ...( groupSet?.size && { groups: [...groupSet ].map(to => ({ to })) } ),\n ...( teacherSet.size && { teachers: [...teacherSet].map(to => ({ to })) } )\n });\n });\n\n\n\n ////\n //// events\n ////\n let numAdditionalCourses = 0;\n const eventMap = new Map<string, OutTypes.event[]>();\n const intervalMap = new Map<string, Map<number, CoreTypes.interval> >();\n lessons.forEach(l => {\n // ignore all lessons which are not scheduled on the week of interest\n if (meta?.week == undefined || !parseActualWeeks(l.CalcActualWeeks).includes(meta.week)) return;\n\n\n const coursesIds = [...(lessonGroupsMap.get(l.PK) ?? new Set())]\n .map(id => groupMap.get(parseInt(id)))\n .filter((g): g is NonNullable<typeof g> => g?.bClass == false)\n .sort((g1, g2) => g1.PK - g2.PK)\n .map(g => g.PK);\n\n const event: OutTypes.event = {\n ids: l.PK.toString(),\n\n duration: l.Length,\n preferredDuration: l.Length,\n ...startAndEnd(l)\n };\n\n // try add room\n const rooms = lessonRoomsMap.get(l.PK);\n if (rooms?.size) {\n event.inLocations = [...rooms];\n event.locations = [...rooms].map(l => ({ locations: [l] }));\n }\n\n // try add teachers\n const teachers = lessonTeachersMap.get(l.PK);\n if (teachers?.size) event.teachers = [...teachers].map(to => ({ to }));\n\n // fetch groups\n const classes: Set<string> = new Set();\n lessonGroupsMap.get(l.PK)?.forEach(scheduleGroupId => {\n groupClassesMap.get(scheduleGroupId)?.forEach(classId => {\n classes.add(classId);\n });\n });\n\n // attempt to deduce groups by analyzing the course name\n // (but only if the event explicitly has groups or its course has none)\n const courseHasGroups = coursesIds.some(x => courseMap.get(x)?.groups);\n if (meta?.deduceGroupsFromCourseName && (!courseHasGroups || classes.size)) {\n coursesIds.map(x => courseMap.get(x)?.displayName)\n .filter(x => x != null)\n .forEach(x => addGroupsFromName(x, classes, groupNamePkMap));\n }\n\n // try add groups\n if (classes.size) event.groups = [...classes].map(to => ({ to }));\n\n\n const subject = subjectMap.get(l.FKSubject!);\n if (subject?.toLowerCase() == arbetstid) {\n // is an interval\n\n // ensure start and end is set\n const start = event.start;\n const end = event.end;\n if (!start || !end) {\n warnings.push('Start or end not set on interval event');\n return;\n }\n\n // interval day\n const day = getDay(moment.utc(start));\n\n if (0 > day || day > numDays - 1) {\n warnings.push('Interval day out of bounds');\n return;\n }\n\n // add interval\n teachers?.forEach(t => {\n if (!intervalMap.has(t)) intervalMap.set(t, new Map());\n intervalMap.get(t)?.set(day, { start, end });\n });\n\n } else {\n // is an event\n\n ////\n //// if there is no course, create it\n //// (can also be interval)\n ////\n if (!coursesIds.length) {\n const id = --numAdditionalCourses;\n\n courseMap.set(id, {\n ids: id.toString(),\n\n ...( subject && { displayName: subject } ),\n ...( subject && { subject } ),\n\n // // makes it easier to se in the table\n // ...( teachers?.size && { teachers: [...teachers] } ),\n // ...( classes?.size && { groups: [...classes] } ),\n });\n\n coursesIds.push(id);\n }\n\n\n // add\n const key = coursesIds.join(separator);\n if (!eventMap.has(key)) eventMap.set(key, []);\n eventMap.get(key)?.push(event);\n }\n\n });\n\n\n ////\n //// set teacher days and intervals\n ////\n intervalMap.forEach((v, k) => {\n // fetch teacher\n const teacher = RSteachers.find(t => t.ids == k);\n if (!teacher) {\n warnings.push(`An interval referred to the unknown teacher with PK = ${k}`);\n return;\n }\n\n // construct\n const intervals = createDefaultIntervals();\n const days: CoreTypes.day[] = [];\n v.forEach((i, d) => {\n days.push({ day: d });\n intervals[d] = i;\n });\n\n // set\n // (set days only if not all are permitted)\n teacher.intervals = intervals;\n if (days.length != numDays) teacher.days = days;\n });\n\n\n ////\n //// merge courses\n ////\n eventMap.forEach((events, key) => {\n const courseIds = key.split(separator).map(x => parseInt(x));\n\n if (courseIds.length > 1) {\n const idss: string[] = [];\n const displayNames: string[] = [];\n\n const subjects = new Set<string>();\n const groups = new Set<string>();\n const teachers = new Set<string>();\n\n // merge courses\n courseIds.map(x => courseMap.get(x))\n .filter(c => c != undefined)\n .forEach(c => {\n if (c.ids) idss.push(c.ids);\n if (c.displayName) displayNames.push(c.displayName);\n\n if (c.subject) subjects.add(c.subject);\n if (c.groups) c.groups.forEach(({ to }) => groups.add(to.toString()));\n if (c.teachers) c.teachers.forEach(({ to }) => teachers.add(to.toString()));\n });\n\n const newKey = --numAdditionalCourses;\n const newCourse: OutTypes.course = {\n ids: idss.join(separator),\n displayName: displayNames.join(separator),\n\n ...( subjects.size && { subject: [...subjects].join(separator) } ),\n\n ...( groups.size && { groups: [...groups].map(to => ({ to })) } ),\n ...( teachers.size && { teachers: [...teachers].map(to => ({ to })) } )\n };\n\n // add courses\n // (leave old courses if they have events) <-- WTF!?\n courseMap.set(newKey, newCourse);\n\n // link events to new course\n eventMap.set(newKey.toString(), [...events]);\n events.length = 0;\n\n // console.log(`The courses with PKs [${courseIds.join(separator)}] needed to be merged.`);\n warnings.push(`The courses with PKs [${courseIds.join(separator)}] needed to be merged.`);\n }\n });\n\n\n\n ////\n //// link events with courses\n ////\n const populatedCourses = new Set<number>();\n eventMap.forEach((events, key) => {\n // need to contain events\n if (!events.length) return;\n\n const courseIds = key.split(separator).map(x => parseInt(x));\n\n if (courseIds.length != 1 && events.length) throw new Error('Well this was unexpected...');\n\n const courseId = courseIds[0];\n const PK = courseMap.get(courseId)?.ids;\n\n if (PK == undefined) {\n // console.log(courseIds, PK, key, events)\n // throw \"Well this was also unexpected...\";\n // console.log(`The events with PKs ${events.map(e => e.ids)} were ignored since their course was not found.`);\n errors.push(`The events with PKs ${events.map(e => e.ids).join(', ')} were ignored since their course was not found.`);\n events.length = 0;\n return;\n }\n\n // link\n events.forEach(e => e.course = PK);\n\n populatedCourses.add(courseId);\n });\n\n\n\n ////\n //// try remove empty courses\n ////\n if (meta?.ignoreEmptyCourses) {\n // filter in place\n const courses = [...courseMap].filter(([k]) => populatedCourses.has(k));\n courseMap = new Map(courses);\n }\n\n\n ////\n //// try promote groups, teachers and locations to the parent course\n //// (if the course has none and all sibling events have the same)\n ////\n const keys = ['groups', 'teachers', 'locations'] as const;\n for (const key of keys) {\n courseMap.forEach((c, courseKey) => {\n // need to use the \"courseKey\" as it is different from the \"c.ids\" if the course has been merged\n const events = eventMap.get(courseKey.toString());\n\n const eventEntries = makeChainable(events ?? [])\n .chain(\n x => x\n .map(e => e[key] ?? c[key])\n .filter(x => x != null),\n x => uniqBy(x, x => x\n .map(x => 'to' in x ? x.to : x.locations[0])\n .sort()\n .join('.')\n )\n )\n .value;\n\n // the event entries must be exactly one\n if (eventEntries.length != 1) return;\n\n // update\n switch (key) {\n case 'groups': c[key] = eventEntries[0] as (typeof c)[typeof key]; break;\n case 'teachers': c[key] = eventEntries[0] as (typeof c)[typeof key]; break;\n case 'locations': c[key] = eventEntries[0] as (typeof c)[typeof key]; break;\n default: throw new Error(`Unknown key \"${key satisfies never as string}\"`);\n }\n events?.forEach(e => delete e[key]);\n });\n }\n\n\n // let eventsArray: Types.courseEvent[] = [];\n return { courses: [...courseMap.values()], events: [...eventMap.values()].flat() };\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"groups.js","names":[],"sources":["../../../../src/Skola24/mdb/from/groups.ts"],"sourcesContent":["import type { Types as Skola24Types } from '../types';\nimport type { OutTypes } from './schedule';\n\nexport default function (\n groups: Skola24Types.group[],\n warnings: string[],\n errors: string[]\n): OutTypes.group[] {\n return groups.filter(x => x.bClass)\n .map(x => ({\n ids: x.PK.toString(),\n displayName: x.ID,\n species: 'class',\n }));\n}\n"],"mappings":";AAGA,wBACE,QACA,UACA,QACkB;AAClB,QAAO,OAAO,QAAO,MAAK,EAAE,OAAO,CAChC,KAAI,OAAM;EACT,KAAa,EAAE,GAAG,UAAU;EAC5B,aAAa,EAAE;EACf,SAAa;EACd,EAAE"}
1
+ {"version":3,"file":"groups.js","names":[],"sources":["../../../../src/Skola24/mdb/from/groups.ts"],"sourcesContent":["import type { Types as Skola24Types } from '../types';\nimport type { OutTypes } from './schedule';\n\nexport default function (\n groups: Skola24Types.group[],\n warnings: string[],\n errors: string[]\n): OutTypes.group[] {\n return groups.filter(x => x.bClass)\n .map(x => ({\n ids: x.PK.toString(),\n displayName: x.ID,\n species: 'class',\n }));\n}\n"],"mappings":";AAGA,wBACE,QACA,UACA,QACkB;AAClB,QAAO,OAAO,QAAO,MAAK,EAAE,QACzB,KAAI,OAAM;EACT,KAAa,EAAE,GAAG;EAClB,aAAa,EAAE;EACf,SAAa"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_schedule"],"sources":["../../../../src/Skola24/mdb/from/index.ts"],"sourcesContent":["import type { FromInterface } from '../../../common/types';\nimport _schedule from './schedule';\n\nexport default {\n schedules: _schedule\n} satisfies FromInterface;\n"],"mappings":";;;AAGA,mBAAe,EACb,WAAWA,kBACZ"}
1
+ {"version":3,"file":"index.js","names":["_schedule"],"sources":["../../../../src/Skola24/mdb/from/index.ts"],"sourcesContent":["import type { FromInterface } from '../../../common/types';\nimport _schedule from './schedule';\n\nexport default {\n schedules: _schedule\n} satisfies FromInterface;\n"],"mappings":";;;AAGA,mBAAe,EACb,WAAWA"}
@@ -1 +1 @@
1
- {"version":3,"file":"locations.js","names":[],"sources":["../../../../src/Skola24/mdb/from/locations.ts"],"sourcesContent":["import type { Types as Skola24Types } from '../types';\nimport type { OutTypes } from './schedule';\n\nexport default function (\n rooms: Skola24Types.room[],\n warnings: string[],\n errors: string[]\n): OutTypes.location[] {\n return rooms.map(x => ({\n ids: x.PK.toString(),\n displayName: x.ID\n }));\n}\n"],"mappings":";AAGA,2BACE,OACA,UACA,QACqB;AACrB,QAAO,MAAM,KAAI,OAAM;EACrB,KAAa,EAAE,GAAG,UAAU;EAC5B,aAAa,EAAE;EAChB,EAAE"}
1
+ {"version":3,"file":"locations.js","names":[],"sources":["../../../../src/Skola24/mdb/from/locations.ts"],"sourcesContent":["import type { Types as Skola24Types } from '../types';\nimport type { OutTypes } from './schedule';\n\nexport default function (\n rooms: Skola24Types.room[],\n warnings: string[],\n errors: string[]\n): OutTypes.location[] {\n return rooms.map(x => ({\n ids: x.PK.toString(),\n displayName: x.ID\n }));\n}\n"],"mappings":";AAGA,2BACE,OACA,UACA,QACqB;AACrB,QAAO,MAAM,KAAI,OAAM;EACrB,KAAa,EAAE,GAAG;EAClB,aAAa,EAAE"}
@@ -1,6 +1,5 @@
1
1
  import { InternalIdKey } from "../../../core/types/common/index.js";
2
2
  import { Types } from "../../../core/types/index.js";
3
- import "../../../core/index.js";
4
3
  import { Types as Types$1 } from "../types/index.js";
5
4
 
6
5
  //#region src/Skola24/mdb/from/schedule.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"schedule.js","names":["warnings: string[]","errors: string[]","_locations","_teachers","_groups","coursesAndEvents"],"sources":["../../../../src/Skola24/mdb/from/schedule.ts"],"sourcesContent":["import type { CoreTypes } from '../../../core';\nimport type { Types as Skola24Types } from '../types';\nimport type { InternalIdKey } from '../../../core/types/common';\nimport { getVertexId } from '../../../core/util';\nimport _locations from './locations';\nimport _teachers from './teachers';\nimport _groups from './groups';\nimport coursesAndEvents from './course-and-events';\nimport type { BaseOptions } from '../../../common/types';\n\nexport namespace OutTypes {\n export type location = Omit<CoreTypes.Serialized.Location, InternalIdKey>;\n export type teacher = Omit<CoreTypes.Serialized.Teacher, InternalIdKey>;\n export type group = Omit<CoreTypes.Serialized.Group, InternalIdKey>;\n export type course = Omit<CoreTypes.Serialized.Course, InternalIdKey>;\n export type event = Omit<CoreTypes.Serialized.Event, InternalIdKey>;\n}\n\ntype Out = {\n locations: OutTypes.location[];\n teachers: OutTypes.teacher[];\n groups: OutTypes.group[];\n courses: OutTypes.course[];\n events: OutTypes.event[];\n meta?: {\n errors?: string[];\n warnings?: string[];\n };\n};\n\nexport default function (\n src: Skola24Types.schedule,\n _options: Skola24Types.options = { }\n): Out {\n const options = Object.assign(_options, { dKey: 'ids' } as BaseOptions);\n\n // gather all import related warnings/errors\n const warnings: string[] = [];\n const errors: string[] = [];\n\n // check which weeks this schedule concern\n if (options?.week == undefined) {\n warnings.push('No events will be imported since no import week was provided');\n }\n\n ////\n //// construct maps\n ////\n\n // groups\n const groupMap = new Map(src.school_tblgroup.map(x => [x.PK, x]));\n\n // courses\n const courseMap = new Map(src.school_tblcourse.map(x => [x.PK, x]));\n\n // plan\n const planMap = new Map(src.school_tblplan.map(x => [x.PK, x]));\n\n // subject\n const subjectMap = new Map(src.school_tblsubject.map(x => [x.PK, x.ID]));\n\n\n // plan-teacher\n const planTeachersMap = new Map<number, Set<string>>();\n src.school_tblplan_teacher.forEach(x => {\n if (!planTeachersMap.has(x.FKPlan)) planTeachersMap.set(x.FKPlan, new Set());\n planTeachersMap.get(x.FKPlan)!.add(x.FKTeacher.toString());\n });\n\n // plan-group\n const planGroupsMap = new Map<number, Set<string>>();\n src.school_tblplan_group.forEach(x => {\n if (!planGroupsMap.has(x.FKPlan)) planGroupsMap.set(x.FKPlan, new Set());\n planGroupsMap.get(x.FKPlan)!.add(x.FKGroup.toString());\n });\n\n // group-plan\n const groupPlansMap = new Map<number, Set<string>>();\n src.school_tblplan_group.forEach(x => {\n if (!groupPlansMap.has(x.FKGroup)) groupPlansMap.set(x.FKGroup, new Set());\n groupPlansMap.get(x.FKGroup)!.add(x.FKPlan.toString());\n });\n\n // lesson-rooms\n const lessonRoomsMap = new Map<number, Set<string> >();\n src.school_tblschedule_room.forEach(x => {\n if (!lessonRoomsMap.has(x.FKSchedule)) lessonRoomsMap.set(x.FKSchedule, new Set());\n lessonRoomsMap.get(x.FKSchedule)!.add(x.FKRoom.toString());\n });\n\n // lesson-teacher\n const lessonTeachersMap = new Map<number, Set<string> >();\n src.school_tblschedule_teacher.forEach(x => {\n if (!lessonTeachersMap.has(x.FKSchedule)) lessonTeachersMap.set(x.FKSchedule, new Set());\n lessonTeachersMap.get(x.FKSchedule)!.add(x.FKTeacher.toString());\n });\n\n // lesson-group\n const lessonGroupsMap = new Map<number, Set<string> >();\n src.school_tblschedule_group.forEach(x => {\n if (!lessonGroupsMap.has(x.FKSchedule)) lessonGroupsMap.set(x.FKSchedule, new Set());\n lessonGroupsMap.get(x.FKSchedule)!.add(x.FKGroup.toString());\n });\n\n // construct a group (= course) to class map\n const groupClassesMap = new Map<string, Set<string> >();\n src.school_tblgroup_group.forEach(x => {\n if (!groupClassesMap.has(x.FKGroup.toString())) groupClassesMap.set(x.FKGroup.toString(), new Set());\n groupClassesMap.get(x.FKGroup.toString())!.add(x.FKGroupCon.toString());\n });\n // class-class not present in the \"school_tblgroup_group\" table, so add manually\n src.school_tblgroup.forEach(x => {\n if (x.bClass) {\n if (!groupClassesMap.has(x.PK.toString())) groupClassesMap.set(x.PK.toString(), new Set());\n groupClassesMap.get(x.PK.toString())!.add(x.PK.toString());\n }\n });\n\n\n ////\n //// map entities\n ////\n const locations = _locations(src.unit_tblroom, warnings, errors);\n let teachers = _teachers (src.school_tblteacher, warnings, errors);\n let groups = _groups (src.school_tblgroup, warnings, errors);\n\n const { courses, events }\n = coursesAndEvents(src.school_tblgroup,\n src.school_tblschedule,\n options,\n\n groupPlansMap,\n planMap,\n\n subjectMap,\n planTeachersMap,\n groupClassesMap,\n groups,\n\n groupMap,\n lessonRoomsMap,\n lessonTeachersMap,\n lessonGroupsMap,\n teachers,\n\n warnings, errors);\n\n\n ////\n //// try filter unreferenced groups and teachers\n ////\n if (options?.removeUnreferencedTeachers) {\n const unreferencedTeacherSet = new Set(teachers.map(x => getVertexId(x, options)));\n events.forEach(e => {\n e.teachers?.forEach(({ to }) => unreferencedTeacherSet.delete(getVertexId(to, options)));\n });\n courses.forEach(c => {\n c.teachers?.forEach(({ to }) => unreferencedTeacherSet.delete(getVertexId(to, options)));\n });\n teachers = teachers.filter(x => !unreferencedTeacherSet.has(getVertexId(x, options)));\n }\n\n if (options?.removeUnreferencedGroups) {\n const unreferencedGroupSet = new Set(groups.map(x => getVertexId(x, options)));\n events.forEach(e => {\n e.groups?.forEach(({ to }) => unreferencedGroupSet.delete(getVertexId(to, options)));\n });\n courses.forEach(c => {\n c.groups?.forEach(({ to }) => unreferencedGroupSet.delete(getVertexId(to, options)));\n });\n groups = groups.filter(x => !unreferencedGroupSet.has(getVertexId(x, options)));\n }\n\n\n return { locations, teachers, groups, courses, events,\n meta: {\n ...( errors.length ? { errors: errors } : { } ),\n ...( warnings.length ? { warnings: warnings } : { } )\n }\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"schedule.js","names":["warnings: string[]","errors: string[]","_locations","_teachers","_groups","coursesAndEvents"],"sources":["../../../../src/Skola24/mdb/from/schedule.ts"],"sourcesContent":["import type { CoreTypes } from '../../../core';\nimport type { Types as Skola24Types } from '../types';\nimport type { InternalIdKey } from '../../../core/types/common';\nimport { getVertexId } from '../../../core/util';\nimport _locations from './locations';\nimport _teachers from './teachers';\nimport _groups from './groups';\nimport coursesAndEvents from './course-and-events';\nimport type { BaseOptions } from '../../../common/types';\n\nexport namespace OutTypes {\n export type location = Omit<CoreTypes.Serialized.Location, InternalIdKey>;\n export type teacher = Omit<CoreTypes.Serialized.Teacher, InternalIdKey>;\n export type group = Omit<CoreTypes.Serialized.Group, InternalIdKey>;\n export type course = Omit<CoreTypes.Serialized.Course, InternalIdKey>;\n export type event = Omit<CoreTypes.Serialized.Event, InternalIdKey>;\n}\n\ntype Out = {\n locations: OutTypes.location[];\n teachers: OutTypes.teacher[];\n groups: OutTypes.group[];\n courses: OutTypes.course[];\n events: OutTypes.event[];\n meta?: {\n errors?: string[];\n warnings?: string[];\n };\n};\n\nexport default function (\n src: Skola24Types.schedule,\n _options: Skola24Types.options = { }\n): Out {\n const options = Object.assign(_options, { dKey: 'ids' } as BaseOptions);\n\n // gather all import related warnings/errors\n const warnings: string[] = [];\n const errors: string[] = [];\n\n // check which weeks this schedule concern\n if (options?.week == undefined) {\n warnings.push('No events will be imported since no import week was provided');\n }\n\n ////\n //// construct maps\n ////\n\n // groups\n const groupMap = new Map(src.school_tblgroup.map(x => [x.PK, x]));\n\n // courses\n const courseMap = new Map(src.school_tblcourse.map(x => [x.PK, x]));\n\n // plan\n const planMap = new Map(src.school_tblplan.map(x => [x.PK, x]));\n\n // subject\n const subjectMap = new Map(src.school_tblsubject.map(x => [x.PK, x.ID]));\n\n\n // plan-teacher\n const planTeachersMap = new Map<number, Set<string>>();\n src.school_tblplan_teacher.forEach(x => {\n if (!planTeachersMap.has(x.FKPlan)) planTeachersMap.set(x.FKPlan, new Set());\n planTeachersMap.get(x.FKPlan)!.add(x.FKTeacher.toString());\n });\n\n // plan-group\n const planGroupsMap = new Map<number, Set<string>>();\n src.school_tblplan_group.forEach(x => {\n if (!planGroupsMap.has(x.FKPlan)) planGroupsMap.set(x.FKPlan, new Set());\n planGroupsMap.get(x.FKPlan)!.add(x.FKGroup.toString());\n });\n\n // group-plan\n const groupPlansMap = new Map<number, Set<string>>();\n src.school_tblplan_group.forEach(x => {\n if (!groupPlansMap.has(x.FKGroup)) groupPlansMap.set(x.FKGroup, new Set());\n groupPlansMap.get(x.FKGroup)!.add(x.FKPlan.toString());\n });\n\n // lesson-rooms\n const lessonRoomsMap = new Map<number, Set<string> >();\n src.school_tblschedule_room.forEach(x => {\n if (!lessonRoomsMap.has(x.FKSchedule)) lessonRoomsMap.set(x.FKSchedule, new Set());\n lessonRoomsMap.get(x.FKSchedule)!.add(x.FKRoom.toString());\n });\n\n // lesson-teacher\n const lessonTeachersMap = new Map<number, Set<string> >();\n src.school_tblschedule_teacher.forEach(x => {\n if (!lessonTeachersMap.has(x.FKSchedule)) lessonTeachersMap.set(x.FKSchedule, new Set());\n lessonTeachersMap.get(x.FKSchedule)!.add(x.FKTeacher.toString());\n });\n\n // lesson-group\n const lessonGroupsMap = new Map<number, Set<string> >();\n src.school_tblschedule_group.forEach(x => {\n if (!lessonGroupsMap.has(x.FKSchedule)) lessonGroupsMap.set(x.FKSchedule, new Set());\n lessonGroupsMap.get(x.FKSchedule)!.add(x.FKGroup.toString());\n });\n\n // construct a group (= course) to class map\n const groupClassesMap = new Map<string, Set<string> >();\n src.school_tblgroup_group.forEach(x => {\n if (!groupClassesMap.has(x.FKGroup.toString())) groupClassesMap.set(x.FKGroup.toString(), new Set());\n groupClassesMap.get(x.FKGroup.toString())!.add(x.FKGroupCon.toString());\n });\n // class-class not present in the \"school_tblgroup_group\" table, so add manually\n src.school_tblgroup.forEach(x => {\n if (x.bClass) {\n if (!groupClassesMap.has(x.PK.toString())) groupClassesMap.set(x.PK.toString(), new Set());\n groupClassesMap.get(x.PK.toString())!.add(x.PK.toString());\n }\n });\n\n\n ////\n //// map entities\n ////\n const locations = _locations(src.unit_tblroom, warnings, errors);\n let teachers = _teachers (src.school_tblteacher, warnings, errors);\n let groups = _groups (src.school_tblgroup, warnings, errors);\n\n const { courses, events }\n = coursesAndEvents(src.school_tblgroup,\n src.school_tblschedule,\n options,\n\n groupPlansMap,\n planMap,\n\n subjectMap,\n planTeachersMap,\n groupClassesMap,\n groups,\n\n groupMap,\n lessonRoomsMap,\n lessonTeachersMap,\n lessonGroupsMap,\n teachers,\n\n warnings, errors);\n\n\n ////\n //// try filter unreferenced groups and teachers\n ////\n if (options?.removeUnreferencedTeachers) {\n const unreferencedTeacherSet = new Set(teachers.map(x => getVertexId(x, options)));\n events.forEach(e => {\n e.teachers?.forEach(({ to }) => unreferencedTeacherSet.delete(getVertexId(to, options)));\n });\n courses.forEach(c => {\n c.teachers?.forEach(({ to }) => unreferencedTeacherSet.delete(getVertexId(to, options)));\n });\n teachers = teachers.filter(x => !unreferencedTeacherSet.has(getVertexId(x, options)));\n }\n\n if (options?.removeUnreferencedGroups) {\n const unreferencedGroupSet = new Set(groups.map(x => getVertexId(x, options)));\n events.forEach(e => {\n e.groups?.forEach(({ to }) => unreferencedGroupSet.delete(getVertexId(to, options)));\n });\n courses.forEach(c => {\n c.groups?.forEach(({ to }) => unreferencedGroupSet.delete(getVertexId(to, options)));\n });\n groups = groups.filter(x => !unreferencedGroupSet.has(getVertexId(x, options)));\n }\n\n\n return { locations, teachers, groups, courses, events,\n meta: {\n ...( errors.length ? { errors: errors } : { } ),\n ...( warnings.length ? { warnings: warnings } : { } )\n }\n };\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"teachers.js","names":[],"sources":["../../../../src/Skola24/mdb/from/teachers.ts"],"sourcesContent":["import type { Types as Skola24Types } from '../types';\nimport type { OutTypes } from './schedule';\n\nexport default function (\n teachers: Skola24Types.teacher[],\n warnings: string[],\n errors: string[]\n): OutTypes.teacher[] {\n\n return teachers.map(x => ({\n ids: x.PK.toString(),\n displayName: x.FirstName && x.LastName ? x.FirstName + ' ' + x.LastName : x.ID\n }));\n}\n"],"mappings":";AAGA,0BACE,UACA,UACA,QACoB;AAEpB,QAAO,SAAS,KAAI,OAAM;EACxB,KAAa,EAAE,GAAG,UAAU;EAC5B,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,MAAM,EAAE,WAAW,EAAE;EAC7E,EAAE"}
1
+ {"version":3,"file":"teachers.js","names":[],"sources":["../../../../src/Skola24/mdb/from/teachers.ts"],"sourcesContent":["import type { Types as Skola24Types } from '../types';\nimport type { OutTypes } from './schedule';\n\nexport default function (\n teachers: Skola24Types.teacher[],\n warnings: string[],\n errors: string[]\n): OutTypes.teacher[] {\n\n return teachers.map(x => ({\n ids: x.PK.toString(),\n displayName: x.FirstName && x.LastName ? x.FirstName + ' ' + x.LastName : x.ID\n }));\n}\n"],"mappings":";AAGA,0BACE,UACA,UACA,QACoB;AAEpB,QAAO,SAAS,KAAI,OAAM;EACxB,KAAa,EAAE,GAAG;EAClB,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,MAAM,EAAE,WAAW,EAAE"}
@@ -41,7 +41,8 @@ function parseCalendarExceptions(period, startYear, warnings) {
41
41
  for (let i = 0; i < allowedRanges.length - 1; i++) {
42
42
  const x = allowedRanges[i];
43
43
  const y = allowedRanges[i + 1];
44
- if (y.start.diff(x.end) <= 2) {
44
+ const diff = y.start.diff(x.end);
45
+ if (diff <= 2) {
45
46
  x.end = moment.max(x.end, y.end);
46
47
  allowedRanges.splice(i + 1, 1);
47
48
  i--;
@@ -1 +1 @@
1
- {"version":3,"file":"calendar-exceptions.js","names":["exceptions: { start: moment.Moment, end: moment.Moment }[]"],"sources":["../../../../src/Skola24/txt/from/calendar-exceptions.ts"],"sourcesContent":["import moment from 'moment';\nimport type { Types, Warning } from '../types';\nimport type { OutTypes } from './schedules';\n\nexport function parseCalendarExceptions (\n period: Types.periodGeneral | undefined,\n startYear: number,\n warnings: Warning[]\n): OutTypes.settings['calendarExceptions'] {\n if (!period) return [];\n\n // should warn only once\n let warned = false;\n\n // parse range\n const allowedRanges = (period.SchoolYear ?? '')\n .split(',')\n // parse each range\n .map(x => {\n // date ranges on the form \"20/8-23/8\"\n const [_start, _end] = x.split('-');\n if (!_start || !_end) return;\n\n const start = moment.utc(`${_start}/${startYear}`, 'DD/MM/YYYY').startOf('day');\n const end = moment.utc(`${_end}/${startYear}`, 'DD/MM/YYYY').endOf ('day');\n if (!start.isValid() || !end.isValid()) {\n if (warned) return;\n warned = true;\n warnings.push({\n code: 'calendarExceptions.problem_parsing_range',\n context: period\n });\n return;\n }\n\n return { start, end };\n })\n .filter((x): x is NonNullable<typeof x> => !!x)\n // make the ranges ordered by incrementing by a year if needed\n .reduce<{ start: moment.Moment, end: moment.Moment }[]>((acc, x) => {\n const prev = acc.at(-1);\n if (!prev) {\n acc.push(x);\n } else {\n while (prev.end.isAfter(x.start)) {\n x.start.add(1, 'year');\n x.end .add(1, 'year');\n }\n acc.push(x);\n }\n return acc;\n }, []);\n\n // extend the range to whole week if the end is a friday\n for (let i = 1; i < allowedRanges.length - 1; i++) {\n const x = allowedRanges[i];\n\n if (x.end.isoWeekday() === 5) {\n x.end = x.end.add(2, 'days');\n }\n };\n\n // merge ranges if they are adjacent or overlapping (the latter is not expected)\n for (let i = 0; i < allowedRanges.length - 1; i++) {\n const x = allowedRanges[i];\n const y = allowedRanges[i + 1];\n\n const diff = y.start.diff(x.end); // 1 ms if adjacent, negative if overlapping\n if (diff <= 2) {\n x.end = moment.max(x.end, y.end);\n allowedRanges.splice(i + 1, 1);\n i--;\n }\n }\n\n // invert the allowed ranges to get the exceptions\n const exceptions: { start: moment.Moment, end: moment.Moment }[] = [];\n for (let i = 0; i < allowedRanges.length - 1; i++) {\n const x = allowedRanges[i];\n const y = allowedRanges[i + 1];\n exceptions.push({\n start: x.end .add (1, 'day').startOf('day'),\n end: y.start.subtract(1, 'day').endOf ('day'),\n });\n }\n\n return exceptions.map(x => ({\n start: x.start.toISOString(),\n end: x.end .toISOString(),\n }));\n}"],"mappings":";;;AAIA,SAAgB,wBACd,QACA,WACA,UACyC;AACzC,KAAI,CAAC,OAAQ,QAAO,EAAE;CAGtB,IAAI,SAAS;CAGb,MAAM,iBAAiB,OAAO,cAAc,IACzC,MAAM,IAAI,CAEV,KAAI,MAAK;EAER,MAAM,CAAC,QAAQ,QAAQ,EAAE,MAAM,IAAI;AACnC,MAAI,CAAC,UAAU,CAAC,KAAM;EAEtB,MAAM,QAAQ,OAAO,IAAI,GAAG,OAAO,GAAG,aAAa,aAAa,CAAC,QAAQ,MAAM;EAC/E,MAAM,MAAQ,OAAO,IAAI,GAAG,KAAK,GAAG,aAAe,aAAa,CAAC,MAAQ,MAAM;AAC/E,MAAI,CAAC,MAAM,SAAS,IAAI,CAAC,IAAI,SAAS,EAAE;AACtC,OAAI,OAAQ;AACZ,YAAS;AACT,YAAS,KAAK;IACZ,MAAS;IACT,SAAS;IACV,CAAC;AACF;;AAGF,SAAO;GAAE;GAAO;GAAK;GACrB,CACD,QAAQ,MAAkC,CAAC,CAAC,EAAE,CAE9C,QAAwD,KAAK,MAAM;EAClE,MAAM,OAAO,IAAI,GAAG,GAAG;AACvB,MAAI,CAAC,KACH,KAAI,KAAK,EAAE;OACN;AACL,UAAO,KAAK,IAAI,QAAQ,EAAE,MAAM,EAAE;AAChC,MAAE,MAAM,IAAI,GAAG,OAAO;AACtB,MAAE,IAAM,IAAI,GAAG,OAAO;;AAExB,OAAI,KAAK,EAAE;;AAEb,SAAO;IACN,EAAE,CAAC;AAGR,MAAK,IAAI,IAAI,GAAG,IAAI,cAAc,SAAS,GAAG,KAAK;EACjD,MAAM,IAAI,cAAc;AAExB,MAAI,EAAE,IAAI,YAAY,KAAK,EACzB,GAAE,MAAM,EAAE,IAAI,IAAI,GAAG,OAAO;;AAKhC,MAAK,IAAI,IAAI,GAAG,IAAI,cAAc,SAAS,GAAG,KAAK;EACjD,MAAM,IAAI,cAAc;EACxB,MAAM,IAAI,cAAc,IAAI;AAG5B,MADa,EAAE,MAAM,KAAK,EAAE,IAAI,IACpB,GAAG;AACb,KAAE,MAAM,OAAO,IAAI,EAAE,KAAK,EAAE,IAAI;AAChC,iBAAc,OAAO,IAAI,GAAG,EAAE;AAC9B;;;CAKJ,MAAMA,aAA6D,EAAE;AACrE,MAAK,IAAI,IAAI,GAAG,IAAI,cAAc,SAAS,GAAG,KAAK;EACjD,MAAM,IAAI,cAAc;EACxB,MAAM,IAAI,cAAc,IAAI;AAC5B,aAAW,KAAK;GACd,OAAO,EAAE,IAAM,IAAS,GAAG,MAAM,CAAC,QAAQ,MAAM;GAChD,KAAO,EAAE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAQ,MAAM;GACjD,CAAC;;AAGJ,QAAO,WAAW,KAAI,OAAM;EAC1B,OAAO,EAAE,MAAM,aAAa;EAC5B,KAAO,EAAE,IAAM,aAAa;EAC7B,EAAE"}
1
+ {"version":3,"file":"calendar-exceptions.js","names":["exceptions: { start: moment.Moment, end: moment.Moment }[]"],"sources":["../../../../src/Skola24/txt/from/calendar-exceptions.ts"],"sourcesContent":["import moment from 'moment';\nimport type { Types, Warning } from '../types';\nimport type { OutTypes } from './schedules';\n\nexport function parseCalendarExceptions (\n period: Types.periodGeneral | undefined,\n startYear: number,\n warnings: Warning[]\n): OutTypes.settings['calendarExceptions'] {\n if (!period) return [];\n\n // should warn only once\n let warned = false;\n\n // parse range\n const allowedRanges = (period.SchoolYear ?? '')\n .split(',')\n // parse each range\n .map(x => {\n // date ranges on the form \"20/8-23/8\"\n const [_start, _end] = x.split('-');\n if (!_start || !_end) return;\n\n const start = moment.utc(`${_start}/${startYear}`, 'DD/MM/YYYY').startOf('day');\n const end = moment.utc(`${_end}/${startYear}`, 'DD/MM/YYYY').endOf ('day');\n if (!start.isValid() || !end.isValid()) {\n if (warned) return;\n warned = true;\n warnings.push({\n code: 'calendarExceptions.problem_parsing_range',\n context: period\n });\n return;\n }\n\n return { start, end };\n })\n .filter((x): x is NonNullable<typeof x> => !!x)\n // make the ranges ordered by incrementing by a year if needed\n .reduce<{ start: moment.Moment, end: moment.Moment }[]>((acc, x) => {\n const prev = acc.at(-1);\n if (!prev) {\n acc.push(x);\n } else {\n while (prev.end.isAfter(x.start)) {\n x.start.add(1, 'year');\n x.end .add(1, 'year');\n }\n acc.push(x);\n }\n return acc;\n }, []);\n\n // extend the range to whole week if the end is a friday\n for (let i = 1; i < allowedRanges.length - 1; i++) {\n const x = allowedRanges[i];\n\n if (x.end.isoWeekday() === 5) {\n x.end = x.end.add(2, 'days');\n }\n };\n\n // merge ranges if they are adjacent or overlapping (the latter is not expected)\n for (let i = 0; i < allowedRanges.length - 1; i++) {\n const x = allowedRanges[i];\n const y = allowedRanges[i + 1];\n\n const diff = y.start.diff(x.end); // 1 ms if adjacent, negative if overlapping\n if (diff <= 2) {\n x.end = moment.max(x.end, y.end);\n allowedRanges.splice(i + 1, 1);\n i--;\n }\n }\n\n // invert the allowed ranges to get the exceptions\n const exceptions: { start: moment.Moment, end: moment.Moment }[] = [];\n for (let i = 0; i < allowedRanges.length - 1; i++) {\n const x = allowedRanges[i];\n const y = allowedRanges[i + 1];\n exceptions.push({\n start: x.end .add (1, 'day').startOf('day'),\n end: y.start.subtract(1, 'day').endOf ('day'),\n });\n }\n\n return exceptions.map(x => ({\n start: x.start.toISOString(),\n end: x.end .toISOString(),\n }));\n}"],"mappings":";;;AAIA,SAAgB,wBACd,QACA,WACA,UACyC;AACzC,KAAI,CAAC,OAAQ,QAAO;CAGpB,IAAI,SAAS;CAGb,MAAM,iBAAiB,OAAO,cAAc,IACzC,MAAM,KAEN,KAAI,MAAK;EAER,MAAM,CAAC,QAAQ,QAAQ,EAAE,MAAM;AAC/B,MAAI,CAAC,UAAU,CAAC,KAAM;EAEtB,MAAM,QAAQ,OAAO,IAAI,GAAG,OAAO,GAAG,aAAa,cAAc,QAAQ;EACzE,MAAM,MAAQ,OAAO,IAAI,GAAG,KAAK,GAAG,aAAe,cAAc,MAAQ;AACzE,MAAI,CAAC,MAAM,aAAa,CAAC,IAAI,WAAW;AACtC,OAAI,OAAQ;AACZ,YAAS;AACT,YAAS,KAAK;IACZ,MAAS;IACT,SAAS;;AAEX;;AAGF,SAAO;GAAE;GAAO;;IAEjB,QAAQ,MAAkC,CAAC,CAAC,GAE5C,QAAwD,KAAK,MAAM;EAClE,MAAM,OAAO,IAAI,GAAG;AACpB,MAAI,CAAC,KACH,KAAI,KAAK;OACJ;AACL,UAAO,KAAK,IAAI,QAAQ,EAAE,QAAQ;AAChC,MAAE,MAAM,IAAI,GAAG;AACf,MAAE,IAAM,IAAI,GAAG;;AAEjB,OAAI,KAAK;;AAEX,SAAO;IACN;AAGL,MAAK,IAAI,IAAI,GAAG,IAAI,cAAc,SAAS,GAAG,KAAK;EACjD,MAAM,IAAI,cAAc;AAExB,MAAI,EAAE,IAAI,iBAAiB,EACzB,GAAE,MAAM,EAAE,IAAI,IAAI,GAAG;;AAKzB,MAAK,IAAI,IAAI,GAAG,IAAI,cAAc,SAAS,GAAG,KAAK;EACjD,MAAM,IAAI,cAAc;EACxB,MAAM,IAAI,cAAc,IAAI;EAE5B,MAAM,OAAO,EAAE,MAAM,KAAK,EAAE;AAC5B,MAAI,QAAQ,GAAG;AACb,KAAE,MAAM,OAAO,IAAI,EAAE,KAAK,EAAE;AAC5B,iBAAc,OAAO,IAAI,GAAG;AAC5B;;;CAKJ,MAAMA,aAA6D;AACnE,MAAK,IAAI,IAAI,GAAG,IAAI,cAAc,SAAS,GAAG,KAAK;EACjD,MAAM,IAAI,cAAc;EACxB,MAAM,IAAI,cAAc,IAAI;AAC5B,aAAW,KAAK;GACd,OAAO,EAAE,IAAM,IAAS,GAAG,OAAO,QAAQ;GAC1C,KAAO,EAAE,MAAM,SAAS,GAAG,OAAO,MAAQ;;;AAI9C,QAAO,WAAW,KAAI,OAAM;EAC1B,OAAO,EAAE,MAAM;EACf,KAAO,EAAE,IAAM"}
@@ -1 +1 @@
1
- {"version":3,"file":"division.js","names":["division: Partial<Pick<CoreTypes.Serialized.Division, 'displayName' | 'start' | 'end'>>","division"],"sources":["../../../../src/Skola24/txt/from/division.ts"],"sourcesContent":["import moment from 'moment';\nimport type { CoreTypes } from '../../../core';\nimport { getStartYear } from './util';\n\n\nexport function extractDivisionName (input: string): undefined | Pick<CoreTypes.Serialized.Division, 'displayName'> {\n // extract base and offset year\n const displayName = input.match(/^School=(.+)$/m)\n ?.at(1)\n ?.trim();\n\n return displayName ? { displayName } : undefined;\n}\n\nexport function extractStartAndEnd (input: string): undefined | Pick<CoreTypes.Serialized.Division, 'start' | 'end'> {\n\n // extract the PeriodGeneral table content\n const match = input.match(/PeriodGeneral \\((?:\\d+)\\)(?:\\r\\n|\\r|\\n)\\[Rows\\](?:\\r\\n|\\r|\\n)SchoolYear \\((?:\\d+)\\)(?:\\r\\n|\\r|\\n)([^\\n]*)/);\n if (!match) return;\n\n // date rangers on the form \"20/8-23/8, 26/8-30/8, ..., 9/6-13/6\"\n const dateRanges = match.at(1)?.trim();\n if (!dateRanges) return;\n\n // extract the first date of the first range and the last date of the last range\n const _start = dateRanges.match(/(\\d{1,2}\\/\\d{1,2})/) ?.at(1);\n const _end = dateRanges.match(/(\\d{1,2}\\/\\d{1,2})$/)?.at(1);\n if (!_start || !_end) return;\n\n // format the dates to YYYY-MM-DD using moment\n const startYear = getStartYear(input);\n if (!startYear) return;\n const start = moment.utc(`${_start}/${startYear}`, 'DD/MM/YYYY').startOf('day');\n const end = moment.utc(`${_end}/${startYear}`, 'DD/MM/YYYY') .endOf ('day');\n if (!start.isValid() || !end.isValid()) return;\n\n // if the start date is after the end date, increase the year of the end date\n while (start.isAfter(end)) end.add(1, 'year');\n\n return { start, end };\n}\n\nexport const division = (input: unknown): Partial<Pick<CoreTypes.Serialized.Division, 'displayName' | 'start' | 'end'>> => {\n const division: Partial<Pick<CoreTypes.Serialized.Division, 'displayName' | 'start' | 'end'>> = {};\n if (typeof input !== 'string') return division;\n\n // division name\n {\n const x = extractDivisionName(input);\n if (x) Object.assign(division, x);\n }\n\n // division range\n {\n const x = extractStartAndEnd(input);\n if (x) Object.assign(division, x);\n }\n\n return division;\n};"],"mappings":";;;;AAKA,SAAgB,oBAAqB,OAA+E;CAElH,MAAM,cAAc,MAAM,MAAM,iBAAiB,EAC7C,GAAG,EAAE,EACL,MAAM;AAEV,QAAO,cAAc,EAAE,aAAa,GAAG;;AAGzC,SAAgB,mBAAoB,OAAiF;CAGnH,MAAM,QAAQ,MAAM,MAAM,4GAA4G;AACtI,KAAI,CAAC,MAAO;CAGZ,MAAM,aAAa,MAAM,GAAG,EAAE,EAAE,MAAM;AACtC,KAAI,CAAC,WAAY;CAGjB,MAAM,SAAS,WAAW,MAAM,qBAAqB,EAAG,GAAG,EAAE;CAC7D,MAAM,OAAS,WAAW,MAAM,sBAAsB,EAAE,GAAG,EAAE;AAC7D,KAAI,CAAC,UAAU,CAAC,KAAM;CAGtB,MAAM,YAAY,aAAa,MAAM;AACrC,KAAI,CAAC,UAAW;CAChB,MAAM,QAAQ,OAAO,IAAI,GAAG,OAAO,GAAG,aAAa,aAAa,CAAC,QAAQ,MAAM;CAC/E,MAAM,MAAQ,OAAO,IAAI,GAAG,KAAK,GAAG,aAAa,aAAa,CAAG,MAAQ,MAAM;AAC/E,KAAI,CAAC,MAAM,SAAS,IAAI,CAAC,IAAI,SAAS,CAAE;AAGxC,QAAO,MAAM,QAAQ,IAAI,CAAE,KAAI,IAAI,GAAG,OAAO;AAE7C,QAAO;EAAE;EAAO;EAAK;;AAGvB,MAAa,YAAY,UAAkG;CACzH,MAAMA,aAA0F,EAAE;AAClG,KAAI,OAAO,UAAU,SAAU,QAAOC;CAGtC;EACE,MAAM,IAAI,oBAAoB,MAAM;AACpC,MAAI,EAAG,QAAO,OAAOA,YAAU,EAAE;;CAInC;EACE,MAAM,IAAI,mBAAmB,MAAM;AACnC,MAAI,EAAG,QAAO,OAAOA,YAAU,EAAE;;AAGnC,QAAOA"}
1
+ {"version":3,"file":"division.js","names":["division: Partial<Pick<CoreTypes.Serialized.Division, 'displayName' | 'start' | 'end'>>","division"],"sources":["../../../../src/Skola24/txt/from/division.ts"],"sourcesContent":["import moment from 'moment';\nimport type { CoreTypes } from '../../../core';\nimport { getStartYear } from './util';\n\n\nexport function extractDivisionName (input: string): undefined | Pick<CoreTypes.Serialized.Division, 'displayName'> {\n // extract base and offset year\n const displayName = input.match(/^School=(.+)$/m)\n ?.at(1)\n ?.trim();\n\n return displayName ? { displayName } : undefined;\n}\n\nexport function extractStartAndEnd (input: string): undefined | Pick<CoreTypes.Serialized.Division, 'start' | 'end'> {\n\n // extract the PeriodGeneral table content\n const match = input.match(/PeriodGeneral \\((?:\\d+)\\)(?:\\r\\n|\\r|\\n)\\[Rows\\](?:\\r\\n|\\r|\\n)SchoolYear \\((?:\\d+)\\)(?:\\r\\n|\\r|\\n)([^\\n]*)/);\n if (!match) return;\n\n // date rangers on the form \"20/8-23/8, 26/8-30/8, ..., 9/6-13/6\"\n const dateRanges = match.at(1)?.trim();\n if (!dateRanges) return;\n\n // extract the first date of the first range and the last date of the last range\n const _start = dateRanges.match(/(\\d{1,2}\\/\\d{1,2})/) ?.at(1);\n const _end = dateRanges.match(/(\\d{1,2}\\/\\d{1,2})$/)?.at(1);\n if (!_start || !_end) return;\n\n // format the dates to YYYY-MM-DD using moment\n const startYear = getStartYear(input);\n if (!startYear) return;\n const start = moment.utc(`${_start}/${startYear}`, 'DD/MM/YYYY').startOf('day');\n const end = moment.utc(`${_end}/${startYear}`, 'DD/MM/YYYY') .endOf ('day');\n if (!start.isValid() || !end.isValid()) return;\n\n // if the start date is after the end date, increase the year of the end date\n while (start.isAfter(end)) end.add(1, 'year');\n\n return { start, end };\n}\n\nexport const division = (input: unknown): Partial<Pick<CoreTypes.Serialized.Division, 'displayName' | 'start' | 'end'>> => {\n const division: Partial<Pick<CoreTypes.Serialized.Division, 'displayName' | 'start' | 'end'>> = {};\n if (typeof input !== 'string') return division;\n\n // division name\n {\n const x = extractDivisionName(input);\n if (x) Object.assign(division, x);\n }\n\n // division range\n {\n const x = extractStartAndEnd(input);\n if (x) Object.assign(division, x);\n }\n\n return division;\n};"],"mappings":";;;;AAKA,SAAgB,oBAAqB,OAA+E;CAElH,MAAM,cAAc,MAAM,MAAM,mBAC5B,GAAG,IACH;AAEJ,QAAO,cAAc,EAAE,gBAAgB;;AAGzC,SAAgB,mBAAoB,OAAiF;CAGnH,MAAM,QAAQ,MAAM,MAAM;AAC1B,KAAI,CAAC,MAAO;CAGZ,MAAM,aAAa,MAAM,GAAG,IAAI;AAChC,KAAI,CAAC,WAAY;CAGjB,MAAM,SAAS,WAAW,MAAM,uBAAwB,GAAG;CAC3D,MAAM,OAAS,WAAW,MAAM,wBAAwB,GAAG;AAC3D,KAAI,CAAC,UAAU,CAAC,KAAM;CAGtB,MAAM,YAAY,aAAa;AAC/B,KAAI,CAAC,UAAW;CAChB,MAAM,QAAQ,OAAO,IAAI,GAAG,OAAO,GAAG,aAAa,cAAc,QAAQ;CACzE,MAAM,MAAQ,OAAO,IAAI,GAAG,KAAK,GAAG,aAAa,cAAgB,MAAQ;AACzE,KAAI,CAAC,MAAM,aAAa,CAAC,IAAI,UAAW;AAGxC,QAAO,MAAM,QAAQ,KAAM,KAAI,IAAI,GAAG;AAEtC,QAAO;EAAE;EAAO;;;AAGlB,MAAa,YAAY,UAAkG;CACzH,MAAMA,aAA0F;AAChG,KAAI,OAAO,UAAU,SAAU,QAAOC;CAGtC;EACE,MAAM,IAAI,oBAAoB;AAC9B,MAAI,EAAG,QAAO,OAAOA,YAAU;;CAIjC;EACE,MAAM,IAAI,mBAAmB;AAC7B,MAAI,EAAG,QAAO,OAAOA,YAAU;;AAGjC,QAAOA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/Skola24/txt/from/index.ts"],"sourcesContent":["import type { FromInterface } from '../../../common/types';\nimport { division } from './division';\nimport { schedules } from './schedules';\n\nexport default {\n division: division,\n schedules: schedules\n} satisfies FromInterface;"],"mappings":";;;;AAIA,mBAAe;CACF;CACA;CACZ"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/Skola24/txt/from/index.ts"],"sourcesContent":["import type { FromInterface } from '../../../common/types';\nimport { division } from './division';\nimport { schedules } from './schedules';\n\nexport default {\n division: division,\n schedules: schedules\n} satisfies FromInterface;"],"mappings":";;;;AAIA,mBAAe;CACF;CACA"}
@@ -38,9 +38,11 @@ function parsePeriod(period, scheduleStart, warnings) {
38
38
  }
39
39
  return acc;
40
40
  }, []).map((x) => {
41
+ const start = x.start.startOf("isoWeek");
42
+ const end = x.end.endOf("isoWeek");
41
43
  return {
42
- start: x.start.startOf("isoWeek"),
43
- end: x.end.endOf("isoWeek")
44
+ start,
45
+ end
44
46
  };
45
47
  }).filter((x, i, arr) => {
46
48
  for (let j = i + 1; j < arr.length; j++) if (x.start.isSame(arr[j].start) && x.end.isSame(arr[j].end)) return false;
@@ -55,38 +57,39 @@ function parsePeriod(period, scheduleStart, warnings) {
55
57
  function fromWeekNumberRange(ids, weekNumberRange, scheduleStart) {
56
58
  const startYear = scheduleStart.year();
57
59
  const scheduleStartWeek = scheduleStart.startOf("isoWeek");
58
- return {
59
- ids,
60
- displayName: weekNumberRange,
61
- ranges: weekNumberRange.split(",").map((x) => {
62
- const interval = x.split("-").map((x$1) => parseInt(x$1.trim()));
63
- const startWeekNumber = interval[0];
64
- const endWeekNumber = interval[1] ?? startWeekNumber;
65
- const start = moment.utc().isoWeekYear(startYear).isoWeek(startWeekNumber).startOf("isoWeek");
66
- if (start.isBefore(scheduleStartWeek)) start.add(1, "year").isoWeek(startWeekNumber).startOf("isoWeek");
67
- const end = moment.utc().isoWeekYear(start.year()).isoWeek(endWeekNumber).endOf("isoWeek");
68
- if (end.isBefore(start)) end.add(1, "year").isoWeek(endWeekNumber).endOf("isoWeek");
69
- return [start, end];
70
- }).reduce((acc, x) => {
71
- const prev = acc.at(-1);
72
- if (!prev) acc.push({
60
+ const ranges = weekNumberRange.split(",").map((x) => {
61
+ const interval = x.split("-").map((x$1) => parseInt(x$1.trim()));
62
+ const startWeekNumber = interval[0];
63
+ const endWeekNumber = interval[1] ?? startWeekNumber;
64
+ const start = moment.utc().isoWeekYear(startYear).isoWeek(startWeekNumber).startOf("isoWeek");
65
+ if (start.isBefore(scheduleStartWeek)) start.add(1, "year").isoWeek(startWeekNumber).startOf("isoWeek");
66
+ const end = moment.utc().isoWeekYear(start.year()).isoWeek(endWeekNumber).endOf("isoWeek");
67
+ if (end.isBefore(start)) end.add(1, "year").isoWeek(endWeekNumber).endOf("isoWeek");
68
+ return [start, end];
69
+ }).reduce((acc, x) => {
70
+ const prev = acc.at(-1);
71
+ if (!prev) acc.push({
72
+ start: x[0],
73
+ end: x[1]
74
+ });
75
+ else {
76
+ while (prev.end.isAfter(x[0])) {
77
+ const startWeekNumber = x[0].isoWeek();
78
+ const endWeekNumber = x[1].isoWeek();
79
+ x[0].add(1, "year").isoWeek(startWeekNumber).startOf("isoWeek");
80
+ x[1].add(1, "year").isoWeek(endWeekNumber).endOf("isoWeek");
81
+ }
82
+ acc.push({
73
83
  start: x[0],
74
84
  end: x[1]
75
85
  });
76
- else {
77
- while (prev.end.isAfter(x[0])) {
78
- const startWeekNumber = x[0].isoWeek();
79
- const endWeekNumber = x[1].isoWeek();
80
- x[0].add(1, "year").isoWeek(startWeekNumber).startOf("isoWeek");
81
- x[1].add(1, "year").isoWeek(endWeekNumber).endOf("isoWeek");
82
- }
83
- acc.push({
84
- start: x[0],
85
- end: x[1]
86
- });
87
- }
88
- return acc;
89
- }, [])
86
+ }
87
+ return acc;
88
+ }, []);
89
+ return {
90
+ ids,
91
+ displayName: weekNumberRange,
92
+ ranges
90
93
  };
91
94
  }
92
95
 
@@ -1 +1 @@
1
- {"version":3,"file":"period.js","names":["x"],"sources":["../../../../src/Skola24/txt/from/period.ts"],"sourcesContent":["import moment from 'moment';\nimport type { Types, Warning } from '../types';\nimport { extractId } from './util';\nimport type { OutTypes } from './schedules';\n\nexport function parsePeriod (\n period: Types.period,\n scheduleStart: moment.Moment,\n warnings: Warning[]\n): OutTypes.period {\n // should warn only once\n let warned = false;\n\n // parse range\n const ranges = (period.Calendar ?? '')\n .split(',')\n // parse each range\n .map(x => {\n // date ranges on the form \"20/8-23/8\"\n const [_start, _end] = x.split('-');\n if (!_start || !_end) return;\n\n const start = moment.utc(`${_start}/${scheduleStart.year()}`, 'DD/MM/YYYY');\n const end = moment.utc(`${_end}/${scheduleStart.year()}`, 'DD/MM/YYYY');\n if (!start.isValid() || !end.isValid()) {\n if (warned) return;\n warned = true;\n warnings.push({\n code: 'period.problem_parsing_range',\n context: period\n });\n return;\n }\n\n // add one year to the range if it is before the schedule start\n if (start.isBefore(scheduleStart)) {\n start.add(1, 'year');\n end .add(1, 'year');\n }\n\n return { start, end };\n })\n .filter((x): x is NonNullable<typeof x> => !!x)\n // make the ranges ordered by incrementing by a year if needed\n .reduce<{ start: moment.Moment, end: moment.Moment }[]>((acc, x) => {\n const prev = acc.at(-1);\n if (!prev) {\n acc.push(x);\n } else {\n while (prev.end.isAfter(x.start)) {\n x.start.add(1, 'year');\n x.end .add(1, 'year');\n }\n acc.push(x);\n }\n return acc;\n }, [])\n // convert to whole week\n .map(x => {\n const start = x.start.startOf('isoWeek');\n const end = x.end .endOf ('isoWeek');\n return { start, end };\n })\n // remove duplicates (if a week was split into two ranges)\n .filter((x, i, arr) => {\n for (let j = i + 1; j < arr.length; j++) {\n if (x.start.isSame(arr[j].start) && x.end.isSame(arr[j].end)) return false;\n }\n return true;\n });\n\n return {\n ids: extractId(period.GUID),\n displayName: period.TextBelowSchedule,\n ranges\n };\n}\n\n\nexport function fromWeekNumberRange (\n ids: string,\n weekNumberRange: string,\n scheduleStart: moment.Moment\n): OutTypes.period {\n const startYear = scheduleStart.year();\n const scheduleStartWeek = scheduleStart.startOf('isoWeek');\n\n const ranges = weekNumberRange\n // parse the range to positive intervals that lie after the schedule start\n .split(',')\n .map(x => {\n const interval = x.split('-').map(x => parseInt(x.trim()));\n const startWeekNumber = interval[0];\n const endWeekNumber = interval[1] ?? startWeekNumber;\n\n const start = moment.utc()\n .isoWeekYear(startYear)\n .isoWeek(startWeekNumber)\n .startOf('isoWeek');\n if (start.isBefore(scheduleStartWeek)) {\n start.add(1, 'year')\n .isoWeek(startWeekNumber)\n .startOf('isoWeek');\n }\n\n const end = moment.utc()\n .isoWeekYear(start.year())\n .isoWeek(endWeekNumber)\n .endOf('isoWeek');\n if (end.isBefore(start)) {\n end.add(1, 'year')\n .isoWeek(endWeekNumber)\n .endOf('isoWeek');\n }\n\n return [ start, end ];\n })\n // make the ranges ordered by incrementing by a year if needed\n .reduce<{ start: moment.Moment, end: moment.Moment }[]>((acc, x) => {\n const prev = acc.at(-1);\n if (!prev) {\n acc.push({ start: x[0], end: x[1] });\n } else {\n while (prev.end.isAfter(x[0])) {\n const startWeekNumber = x[0].isoWeek();\n const endWeekNumber = x[1].isoWeek();\n // preserve the week number\n x[0].add(1, 'year').isoWeek(startWeekNumber).startOf('isoWeek');\n x[1].add(1, 'year').isoWeek(endWeekNumber ).endOf ('isoWeek');\n }\n acc.push({ start: x[0], end: x[1] });\n }\n return acc;\n }, []);\n\n return {\n ids,\n displayName: weekNumberRange,\n ranges: ranges\n };\n}"],"mappings":"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"}
1
+ {"version":3,"file":"period.js","names":["x"],"sources":["../../../../src/Skola24/txt/from/period.ts"],"sourcesContent":["import moment from 'moment';\nimport type { Types, Warning } from '../types';\nimport { extractId } from './util';\nimport type { OutTypes } from './schedules';\n\nexport function parsePeriod (\n period: Types.period,\n scheduleStart: moment.Moment,\n warnings: Warning[]\n): OutTypes.period {\n // should warn only once\n let warned = false;\n\n // parse range\n const ranges = (period.Calendar ?? '')\n .split(',')\n // parse each range\n .map(x => {\n // date ranges on the form \"20/8-23/8\"\n const [_start, _end] = x.split('-');\n if (!_start || !_end) return;\n\n const start = moment.utc(`${_start}/${scheduleStart.year()}`, 'DD/MM/YYYY');\n const end = moment.utc(`${_end}/${scheduleStart.year()}`, 'DD/MM/YYYY');\n if (!start.isValid() || !end.isValid()) {\n if (warned) return;\n warned = true;\n warnings.push({\n code: 'period.problem_parsing_range',\n context: period\n });\n return;\n }\n\n // add one year to the range if it is before the schedule start\n if (start.isBefore(scheduleStart)) {\n start.add(1, 'year');\n end .add(1, 'year');\n }\n\n return { start, end };\n })\n .filter((x): x is NonNullable<typeof x> => !!x)\n // make the ranges ordered by incrementing by a year if needed\n .reduce<{ start: moment.Moment, end: moment.Moment }[]>((acc, x) => {\n const prev = acc.at(-1);\n if (!prev) {\n acc.push(x);\n } else {\n while (prev.end.isAfter(x.start)) {\n x.start.add(1, 'year');\n x.end .add(1, 'year');\n }\n acc.push(x);\n }\n return acc;\n }, [])\n // convert to whole week\n .map(x => {\n const start = x.start.startOf('isoWeek');\n const end = x.end .endOf ('isoWeek');\n return { start, end };\n })\n // remove duplicates (if a week was split into two ranges)\n .filter((x, i, arr) => {\n for (let j = i + 1; j < arr.length; j++) {\n if (x.start.isSame(arr[j].start) && x.end.isSame(arr[j].end)) return false;\n }\n return true;\n });\n\n return {\n ids: extractId(period.GUID),\n displayName: period.TextBelowSchedule,\n ranges\n };\n}\n\n\nexport function fromWeekNumberRange (\n ids: string,\n weekNumberRange: string,\n scheduleStart: moment.Moment\n): OutTypes.period {\n const startYear = scheduleStart.year();\n const scheduleStartWeek = scheduleStart.startOf('isoWeek');\n\n const ranges = weekNumberRange\n // parse the range to positive intervals that lie after the schedule start\n .split(',')\n .map(x => {\n const interval = x.split('-').map(x => parseInt(x.trim()));\n const startWeekNumber = interval[0];\n const endWeekNumber = interval[1] ?? startWeekNumber;\n\n const start = moment.utc()\n .isoWeekYear(startYear)\n .isoWeek(startWeekNumber)\n .startOf('isoWeek');\n if (start.isBefore(scheduleStartWeek)) {\n start.add(1, 'year')\n .isoWeek(startWeekNumber)\n .startOf('isoWeek');\n }\n\n const end = moment.utc()\n .isoWeekYear(start.year())\n .isoWeek(endWeekNumber)\n .endOf('isoWeek');\n if (end.isBefore(start)) {\n end.add(1, 'year')\n .isoWeek(endWeekNumber)\n .endOf('isoWeek');\n }\n\n return [ start, end ];\n })\n // make the ranges ordered by incrementing by a year if needed\n .reduce<{ start: moment.Moment, end: moment.Moment }[]>((acc, x) => {\n const prev = acc.at(-1);\n if (!prev) {\n acc.push({ start: x[0], end: x[1] });\n } else {\n while (prev.end.isAfter(x[0])) {\n const startWeekNumber = x[0].isoWeek();\n const endWeekNumber = x[1].isoWeek();\n // preserve the week number\n x[0].add(1, 'year').isoWeek(startWeekNumber).startOf('isoWeek');\n x[1].add(1, 'year').isoWeek(endWeekNumber ).endOf ('isoWeek');\n }\n acc.push({ start: x[0], end: x[1] });\n }\n return acc;\n }, []);\n\n return {\n ids,\n displayName: weekNumberRange,\n ranges: ranges\n };\n}"],"mappings":";;;;AAKA,SAAgB,YACd,QACA,eACA,UACiB;CAEjB,IAAI,SAAS;CAGb,MAAM,UAAU,OAAO,YAAY,IAChC,MAAM,KAEN,KAAI,MAAK;EAER,MAAM,CAAC,QAAQ,QAAQ,EAAE,MAAM;AAC/B,MAAI,CAAC,UAAU,CAAC,KAAM;EAEtB,MAAM,QAAQ,OAAO,IAAI,GAAG,OAAO,GAAG,cAAc,UAAU;EAC9D,MAAM,MAAQ,OAAO,IAAI,GAAG,KAAK,GAAG,cAAc,UAAY;AAC9D,MAAI,CAAC,MAAM,aAAa,CAAC,IAAI,WAAW;AACtC,OAAI,OAAQ;AACZ,YAAS;AACT,YAAS,KAAK;IACZ,MAAS;IACT,SAAS;;AAEX;;AAIF,MAAI,MAAM,SAAS,gBAAgB;AACjC,SAAM,IAAI,GAAG;AACb,OAAM,IAAI,GAAG;;AAGf,SAAO;GAAE;GAAO;;IAEjB,QAAQ,MAAkC,CAAC,CAAC,GAE5C,QAAwD,KAAK,MAAM;EAClE,MAAM,OAAO,IAAI,GAAG;AACpB,MAAI,CAAC,KACH,KAAI,KAAK;OACJ;AACL,UAAO,KAAK,IAAI,QAAQ,EAAE,QAAQ;AAChC,MAAE,MAAM,IAAI,GAAG;AACf,MAAE,IAAM,IAAI,GAAG;;AAEjB,OAAI,KAAK;;AAEX,SAAO;IACN,IAEF,KAAI,MAAK;EACR,MAAM,QAAQ,EAAE,MAAM,QAAQ;EAC9B,MAAM,MAAQ,EAAE,IAAM,MAAQ;AAC9B,SAAO;GAAE;GAAO;;IAGjB,QAAQ,GAAG,GAAG,QAAQ;AACrB,OAAK,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,IAClC,KAAI,EAAE,MAAM,OAAO,IAAI,GAAG,UAAU,EAAE,IAAI,OAAO,IAAI,GAAG,KAAM,QAAO;AAEvE,SAAO;;AAGX,QAAO;EACL,KAAa,UAAU,OAAO;EAC9B,aAAa,OAAO;EACpB;;;AAKJ,SAAgB,oBACd,KACA,iBACA,eACiB;CACjB,MAAM,YAAoB,cAAc;CACxC,MAAM,oBAAoB,cAAc,QAAQ;CAEhD,MAAM,SAAS,gBAEZ,MAAM,KACN,KAAI,MAAK;EACR,MAAM,WAAW,EAAE,MAAM,KAAK,KAAI,QAAK,SAASA,IAAE;EAClD,MAAM,kBAAkB,SAAS;EACjC,MAAM,gBAAkB,SAAS,MAAM;EAEvC,MAAM,QAAQ,OAAO,MAClB,YAAY,WACZ,QAAQ,iBACR,QAAQ;AACX,MAAI,MAAM,SAAS,mBACjB,OAAM,IAAI,GAAG,QACV,QAAQ,iBACR,QAAQ;EAGb,MAAM,MAAM,OAAO,MAChB,YAAY,MAAM,QAClB,QAAQ,eACR,MAAM;AACT,MAAI,IAAI,SAAS,OACf,KAAI,IAAI,GAAG,QACR,QAAQ,eACR,MAAM;AAGX,SAAO,CAAE,OAAO;IAGjB,QAAwD,KAAK,MAAM;EAClE,MAAM,OAAO,IAAI,GAAG;AACpB,MAAI,CAAC,KACH,KAAI,KAAK;GAAE,OAAO,EAAE;GAAI,KAAK,EAAE;;OAC1B;AACL,UAAO,KAAK,IAAI,QAAQ,EAAE,KAAK;IAC7B,MAAM,kBAAkB,EAAE,GAAG;IAC7B,MAAM,gBAAkB,EAAE,GAAG;AAE7B,MAAE,GAAG,IAAI,GAAG,QAAQ,QAAQ,iBAAiB,QAAQ;AACrD,MAAE,GAAG,IAAI,GAAG,QAAQ,QAAQ,eAAiB,MAAQ;;AAEvD,OAAI,KAAK;IAAE,OAAO,EAAE;IAAI,KAAK,EAAE;;;AAEjC,SAAO;IACN;AAEL,QAAO;EACL;EACA,aAAa;EACA"}
@@ -1,5 +1,4 @@
1
1
  import { Types } from "../../../core/types/index.js";
2
- import "../../../core/index.js";
3
2
 
4
3
  //#region src/Skola24/txt/from/schedules.d.ts
5
4
  declare namespace OutTypes {