@royalschedule/maps 4.0.15 → 4.0.16

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 (346) 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 +7 -6
  8. package/dist/Additio/from/schedules.js +2 -4
  9. package/dist/Additio/from/schedules.js.map +1 -1
  10. package/dist/Additio/from/teachers.js.map +1 -1
  11. package/dist/Additio/to/index.d.ts +13 -11
  12. package/dist/Additio/to/schedules.js +2 -4
  13. package/dist/Additio/to/schedules.js.map +1 -1
  14. package/dist/Admentum/from/courses.js.map +1 -1
  15. package/dist/Admentum/from/events.js.map +1 -1
  16. package/dist/Admentum/from/groups.js.map +1 -1
  17. package/dist/Admentum/from/index.js.map +1 -1
  18. package/dist/Admentum/from/locations.js.map +1 -1
  19. package/dist/Admentum/from/persons.js.map +1 -1
  20. package/dist/Admentum/from/schedules.d.ts +7 -6
  21. package/dist/Admentum/from/schedules.js +2 -4
  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 +9 -8
  25. package/dist/Admentum/to/schedules.js +4 -7
  26. package/dist/Admentum/to/schedules.js.map +1 -1
  27. package/dist/Excel/index.d.ts +263 -26
  28. package/dist/Excel/v1/from/index.js +2 -1
  29. package/dist/Excel/v1/from/index.js.map +1 -1
  30. package/dist/Excel/v1/index.d.ts +218 -20
  31. package/dist/Excel/v2/from/index.js +49 -57
  32. package/dist/Excel/v2/from/index.js.map +1 -1
  33. package/dist/Excel/v2/index.d.ts +263 -26
  34. package/dist/IdunSoft/from/courses.js.map +1 -1
  35. package/dist/IdunSoft/from/events.js +1 -2
  36. package/dist/IdunSoft/from/events.js.map +1 -1
  37. package/dist/IdunSoft/from/groups.js.map +1 -1
  38. package/dist/IdunSoft/from/index.js.map +1 -1
  39. package/dist/IdunSoft/from/locations.js.map +1 -1
  40. package/dist/IdunSoft/from/schedules.d.ts +6 -5
  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 +2 -1
  44. package/dist/IdunSoft/to/schedules.js +5 -8
  45. package/dist/IdunSoft/to/schedules.js.map +1 -1
  46. package/dist/InfoMentor/to/index.d.ts +2 -1
  47. package/dist/InfoMentor/to/schedules.js +3 -4
  48. package/dist/InfoMentor/to/schedules.js.map +1 -1
  49. package/dist/PlanDigital/from/index.js.map +1 -1
  50. package/dist/PlanDigital/from/schedules.js +9 -11
  51. package/dist/PlanDigital/from/schedules.js.map +1 -1
  52. package/dist/PlanDigital/index.d.ts +73 -58
  53. package/dist/Quiculum/file/to/index.d.ts +10 -9
  54. package/dist/Quiculum/file/to/schedules.js +5 -9
  55. package/dist/Quiculum/file/to/schedules.js.map +1 -1
  56. package/dist/RS/from/division.d.ts +2 -1
  57. package/dist/RS/from/division.js +9 -6
  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 +2 -1
  61. package/dist/RS/from/schedules.js.map +1 -1
  62. package/dist/RS/make-connected.d.ts +17 -16
  63. package/dist/RS/make-connected.js +63 -96
  64. package/dist/RS/make-connected.js.map +1 -1
  65. package/dist/RS/to/index.js.map +1 -1
  66. package/dist/RS/to/initial-configuration.js +4 -6
  67. package/dist/RS/to/initial-configuration.js.map +1 -1
  68. package/dist/RS/to/input/collections.js.map +1 -1
  69. package/dist/RS/to/input/default.js +1 -2
  70. package/dist/RS/to/input/default.js.map +1 -1
  71. package/dist/RS/to/input/dependencies.js +1 -3
  72. package/dist/RS/to/input/dependencies.js.map +1 -1
  73. package/dist/RS/to/input/dynamic-locked-times.js +1 -2
  74. package/dist/RS/to/input/dynamic-locked-times.js.map +1 -1
  75. package/dist/RS/to/input/events.js +5 -3
  76. package/dist/RS/to/input/events.js.map +1 -1
  77. package/dist/RS/to/input/groups.js.map +1 -1
  78. package/dist/RS/to/input/individuals.js +2 -3
  79. package/dist/RS/to/input/individuals.js.map +1 -1
  80. package/dist/RS/to/input/input.js +1 -3
  81. package/dist/RS/to/input/input.js.map +1 -1
  82. package/dist/RS/to/input/intervals.js +2 -4
  83. package/dist/RS/to/input/intervals.js.map +1 -1
  84. package/dist/RS/to/input/periods.js +6 -8
  85. package/dist/RS/to/input/periods.js.map +1 -1
  86. package/dist/RS/to/input/settings.js.map +1 -1
  87. package/dist/RS/to/input/teachers.js.map +1 -1
  88. package/dist/RS/to/input/util/attach-locked-times.js.map +1 -1
  89. package/dist/RS/to/input/util/parse-days.js.map +1 -1
  90. package/dist/RS/to/input/util/parse-group-references.js.map +1 -1
  91. package/dist/RS/to/input/util/parse-intervals.js +2 -4
  92. package/dist/RS/to/input/util/parse-intervals.js.map +1 -1
  93. package/dist/RS/to/input/util/parse-location-references.js +1 -2
  94. package/dist/RS/to/input/util/parse-location-references.js.map +1 -1
  95. package/dist/RS/to/input/util/parse-max-working-hours.js.map +1 -1
  96. package/dist/RS/to/input/util/parse-minimum-break-length.js.map +1 -1
  97. package/dist/RS/to/input/util/util.js +1 -2
  98. package/dist/RS/to/input/util/util.js.map +1 -1
  99. package/dist/RS/to/schedules.js +1 -1
  100. package/dist/RS/to/schedules.js.map +1 -1
  101. package/dist/RS/types/to.d.ts +12 -3
  102. package/dist/RS/types/to.js +1 -1
  103. package/dist/RS/types/to.js.map +1 -1
  104. package/dist/SS12000/from/activities.js +1 -2
  105. package/dist/SS12000/from/activities.js.map +1 -1
  106. package/dist/SS12000/from/calendar-events.js.map +1 -1
  107. package/dist/SS12000/from/duties.js.map +1 -1
  108. package/dist/SS12000/from/groups.js.map +1 -1
  109. package/dist/SS12000/from/index.js.map +1 -1
  110. package/dist/SS12000/from/persons.js.map +1 -1
  111. package/dist/SS12000/from/resources.js.map +1 -1
  112. package/dist/SS12000/from/rooms.js.map +1 -1
  113. package/dist/SS12000/from/syllabuses.js.map +1 -1
  114. package/dist/SS12000/index.d.ts +12567 -9
  115. package/dist/SS12000/to/activities.js.map +1 -1
  116. package/dist/SS12000/to/calendar-events.js.map +1 -1
  117. package/dist/SS12000/to/common.js.map +1 -1
  118. package/dist/SS12000/to/duties.js.map +1 -1
  119. package/dist/SS12000/to/groups.js.map +1 -1
  120. package/dist/SS12000/to/index.d.ts +17 -16
  121. package/dist/SS12000/to/persons.js.map +1 -1
  122. package/dist/SS12000/to/resources.js.map +1 -1
  123. package/dist/SS12000/to/rooms.js.map +1 -1
  124. package/dist/SS12000/to/syllabuses.js.map +1 -1
  125. package/dist/SchoolSoft/api/from/index.js.map +1 -1
  126. package/dist/SchoolSoft/api/from/schedules.js +8 -12
  127. package/dist/SchoolSoft/api/from/schedules.js.map +1 -1
  128. package/dist/SchoolSoft/api/index.d.ts +444 -9
  129. package/dist/SchoolSoft/file/from/index.js.map +1 -1
  130. package/dist/SchoolSoft/file/from/schedules.js +83 -87
  131. package/dist/SchoolSoft/file/from/schedules.js.map +1 -1
  132. package/dist/SchoolSoft/file/index.d.ts +2 -1
  133. package/dist/SchoolSoft/file/to/index.d.ts +5 -4
  134. package/dist/SchoolSoft/file/to/schedules.js +1 -2
  135. package/dist/SchoolSoft/file/to/schedules.js.map +1 -1
  136. package/dist/SchoolSoft/index.d.ts +2 -1
  137. package/dist/Schoolity/txt/to/index.d.ts +2 -1
  138. package/dist/Schoolity/txt/to/schedules.js +5 -12
  139. package/dist/Schoolity/txt/to/schedules.js.map +1 -1
  140. package/dist/Skola24/mdb/from/course-and-events.js +3 -5
  141. package/dist/Skola24/mdb/from/course-and-events.js.map +1 -1
  142. package/dist/Skola24/mdb/from/groups.js.map +1 -1
  143. package/dist/Skola24/mdb/from/index.js.map +1 -1
  144. package/dist/Skola24/mdb/from/locations.js.map +1 -1
  145. package/dist/Skola24/mdb/from/schedule.d.ts +6 -5
  146. package/dist/Skola24/mdb/from/schedule.js.map +1 -1
  147. package/dist/Skola24/mdb/from/teachers.js.map +1 -1
  148. package/dist/Skola24/txt/from/calendar-exceptions.js +1 -2
  149. package/dist/Skola24/txt/from/calendar-exceptions.js.map +1 -1
  150. package/dist/Skola24/txt/from/division.js.map +1 -1
  151. package/dist/Skola24/txt/from/index.js.map +1 -1
  152. package/dist/Skola24/txt/from/period.js +31 -34
  153. package/dist/Skola24/txt/from/period.js.map +1 -1
  154. package/dist/Skola24/txt/from/schedules.d.ts +9 -8
  155. package/dist/Skola24/txt/from/schedules.js +10 -12
  156. package/dist/Skola24/txt/from/schedules.js.map +1 -1
  157. package/dist/Skola24/txt/from/util.js.map +1 -1
  158. package/dist/Skola24/txt/index.d.ts +2 -1
  159. package/dist/Skola24/txt/to/index.d.ts +2 -1
  160. package/dist/Skola24/txt/to/schedules.js +5 -12
  161. package/dist/Skola24/txt/to/schedules.js.map +1 -1
  162. package/dist/common/constants.js.map +1 -1
  163. package/dist/common/functions.js +46 -10
  164. package/dist/common/functions.js.map +1 -1
  165. package/dist/common/get-date.js.map +1 -1
  166. package/dist/common/make-chainable/index.js.map +1 -1
  167. package/dist/common/types.d.ts +3 -6
  168. package/dist/core/from/configurations.js.map +1 -1
  169. package/dist/core/from/courses.js.map +1 -1
  170. package/dist/core/from/events.js +1 -1
  171. package/dist/core/from/events.js.map +1 -1
  172. package/dist/core/from/exceptions.js.map +1 -1
  173. package/dist/core/from/groups.js.map +1 -1
  174. package/dist/core/from/index.js +9 -6
  175. package/dist/core/from/index.js.map +1 -1
  176. package/dist/core/from/locations.js.map +1 -1
  177. package/dist/core/from/locked-times.js.map +1 -1
  178. package/dist/core/from/overlap-groups.js.map +1 -1
  179. package/dist/core/from/periods.js.map +1 -1
  180. package/dist/core/from/persons.js.map +1 -1
  181. package/dist/core/from/root-intervals.js.map +1 -1
  182. package/dist/core/from/schedules.js.map +1 -1
  183. package/dist/core/from/syllabuses.js.map +1 -1
  184. package/dist/core/from/teachers.js.map +1 -1
  185. package/dist/core/index.d.ts +24 -1
  186. package/dist/core/index.js +4 -0
  187. package/dist/core/index.js.map +1 -1
  188. package/dist/core/interfaces/index.d.ts +23 -0
  189. package/dist/core/interfaces/index.js +6 -0
  190. package/dist/core/interfaces/other/companies.d.ts +132 -0
  191. package/dist/core/interfaces/other/companies.js +9 -0
  192. package/dist/core/interfaces/other/companies.js.map +1 -0
  193. package/dist/core/interfaces/other/etc.d.ts +19 -0
  194. package/dist/core/interfaces/other/index.d.ts +6 -0
  195. package/dist/core/interfaces/other/integrations.d.ts +17 -0
  196. package/dist/core/interfaces/other/operations.d.ts +36 -0
  197. package/dist/core/interfaces/other/policies.d.ts +31 -0
  198. package/dist/core/interfaces/other/sync-logs.d.ts +21 -0
  199. package/dist/core/interfaces/other/users.d.ts +35 -0
  200. package/dist/core/interfaces/vertices/companies.d.ts +8 -0
  201. package/dist/core/interfaces/vertices/configurations.d.ts +58 -0
  202. package/dist/core/interfaces/vertices/courses.d.ts +68 -0
  203. package/dist/core/{types → interfaces/vertices}/division-settings.d.ts +31 -29
  204. package/dist/core/interfaces/vertices/divisions.d.ts +31 -0
  205. package/dist/core/interfaces/vertices/events.d.ts +100 -0
  206. package/dist/core/interfaces/vertices/exceptions.d.ts +74 -0
  207. package/dist/core/interfaces/vertices/generations.d.ts +23 -0
  208. package/dist/core/interfaces/vertices/groups.d.ts +53 -0
  209. package/dist/core/interfaces/vertices/index.d.ts +209 -0
  210. package/dist/core/interfaces/vertices/index.js +3 -0
  211. package/dist/core/interfaces/vertices/locations.d.ts +22 -0
  212. package/dist/core/interfaces/vertices/locked-times.d.ts +37 -0
  213. package/dist/core/interfaces/vertices/overlap-groups.d.ts +17 -0
  214. package/dist/core/interfaces/vertices/periods.d.ts +15 -0
  215. package/dist/core/interfaces/vertices/persons.d.ts +32 -0
  216. package/dist/core/interfaces/vertices/properties/belongs-to.d.ts +11 -0
  217. package/dist/core/interfaces/vertices/properties/coalesced.d.ts +8 -0
  218. package/dist/core/interfaces/vertices/properties/days.d.ts +9 -0
  219. package/dist/core/interfaces/vertices/properties/index.d.ts +15 -0
  220. package/dist/core/interfaces/vertices/properties/intervals.d.ts +10 -0
  221. package/dist/core/{types/common → interfaces/vertices/properties}/maximum-schedule-span.d.ts +1 -1
  222. package/dist/core/interfaces/vertices/properties/min-break-length.d.ts +5 -0
  223. package/dist/core/{types/common/planned-schedule-duration.d.ts → interfaces/vertices/properties/planned-scheduled-duration.d.ts} +2 -2
  224. package/dist/core/interfaces/vertices/properties/species.d.ts +9 -0
  225. package/dist/core/interfaces/vertices/properties/tags.d.ts +9 -0
  226. package/dist/core/interfaces/vertices/properties/week.d.ts +22 -0
  227. package/dist/core/interfaces/vertices/properties/week.js +6 -0
  228. package/dist/core/interfaces/vertices/properties/week.js.map +1 -0
  229. package/dist/core/interfaces/vertices/root-intervals.d.ts +14 -0
  230. package/dist/core/interfaces/vertices/syllabuses.d.ts +18 -0
  231. package/dist/core/interfaces/vertices/teachers.d.ts +43 -0
  232. package/dist/core/interfaces/vertices/users.d.ts +8 -0
  233. package/dist/core/interfaces/vertices/util/common.d.ts +28 -0
  234. package/dist/core/interfaces/vertices/util/custom-vertex-export/index.d.ts +31 -0
  235. package/dist/core/interfaces/vertices/util/custom-vertex-export/util.d.ts +51 -0
  236. package/dist/core/interfaces/vertices/util/deep-vertex-export/index.d.ts +64 -0
  237. package/dist/core/interfaces/vertices/util/edges.d.ts +105 -0
  238. package/dist/core/interfaces/vertices/util/index.d.ts +5 -0
  239. package/dist/core/interfaces/vertices/util/keys-of.d.ts +27 -0
  240. package/dist/core/interfaces/vertices/util/serialized-vertex-export.d.ts +12 -0
  241. package/dist/core/interfaces/vertices/util/util.d.ts +76 -0
  242. package/dist/core/interfaces/vertices/util/vertex-query/index.d.ts +44 -0
  243. package/dist/core/interfaces/vertices/util/vertex-query/util.d.ts +13 -0
  244. package/dist/core/interfaces/vertices/util/vertex.d.ts +70 -0
  245. package/dist/core/interfaces/vertices/vertex-query.d.ts +102 -0
  246. package/dist/core/interfaces/vertices/vertex-query.js +94 -0
  247. package/dist/core/interfaces/vertices/vertex-query.js.map +1 -0
  248. package/dist/core/to/configurations.js +2 -3
  249. package/dist/core/to/configurations.js.map +1 -1
  250. package/dist/core/to/courses.js +2 -3
  251. package/dist/core/to/courses.js.map +1 -1
  252. package/dist/core/to/division.js.map +1 -1
  253. package/dist/core/to/events.js +2 -3
  254. package/dist/core/to/events.js.map +1 -1
  255. package/dist/core/to/exceptions.js +4 -4
  256. package/dist/core/to/exceptions.js.map +1 -1
  257. package/dist/core/to/groups.js +2 -3
  258. package/dist/core/to/groups.js.map +1 -1
  259. package/dist/core/to/locations.js +2 -3
  260. package/dist/core/to/locations.js.map +1 -1
  261. package/dist/core/to/locked-times.js +2 -3
  262. package/dist/core/to/locked-times.js.map +1 -1
  263. package/dist/core/to/overlap-groups.js +2 -3
  264. package/dist/core/to/overlap-groups.js.map +1 -1
  265. package/dist/core/to/periods.js +2 -3
  266. package/dist/core/to/periods.js.map +1 -1
  267. package/dist/core/to/persons.js +3 -9
  268. package/dist/core/to/persons.js.map +1 -1
  269. package/dist/core/to/root-intervals.js +2 -3
  270. package/dist/core/to/root-intervals.js.map +1 -1
  271. package/dist/core/to/schedules.d.ts +17 -18
  272. package/dist/core/to/schedules.js.map +1 -1
  273. package/dist/core/to/settings.js +2 -3
  274. package/dist/core/to/settings.js.map +1 -1
  275. package/dist/core/to/syllabuses.js +2 -3
  276. package/dist/core/to/syllabuses.js.map +1 -1
  277. package/dist/core/to/teachers.js +4 -4
  278. package/dist/core/to/teachers.js.map +1 -1
  279. package/dist/core/to/util.d.ts +4 -8
  280. package/dist/core/to/util.js +7 -5
  281. package/dist/core/to/util.js.map +1 -1
  282. package/dist/core/types/common/index.d.ts +4 -41
  283. package/dist/core/types/index.d.ts +108 -112
  284. package/dist/core/util.js +4 -5
  285. package/dist/core/util.js.map +1 -1
  286. package/dist/identify/constants/index.d.ts +1 -1
  287. package/dist/identify/constants/index.js.map +1 -1
  288. package/dist/identify/index.js +1 -2
  289. package/dist/identify/index.js.map +1 -1
  290. package/dist/index.d.ts +23 -1
  291. package/dist/index.js +4 -1
  292. package/dist/sdui/from/classes.js.map +1 -1
  293. package/dist/sdui/from/courses.js.map +1 -1
  294. package/dist/sdui/from/holidays.js.map +1 -1
  295. package/dist/sdui/from/index.js.map +1 -1
  296. package/dist/sdui/from/lessons.js +4 -0
  297. package/dist/sdui/from/lessons.js.map +1 -1
  298. package/dist/sdui/from/rooms.js.map +1 -1
  299. package/dist/sdui/from/schedules.d.ts +10 -8
  300. package/dist/sdui/from/schedules.js.map +1 -1
  301. package/dist/sdui/from/school-years.js +0 -1
  302. package/dist/sdui/from/school-years.js.map +1 -1
  303. package/dist/sdui/from/substitution-plans.js.map +1 -1
  304. package/dist/sdui/from/teachers.js.map +1 -1
  305. package/dist/sdui/index.d.ts +1 -1
  306. package/dist/sdui/to/classes.js.map +1 -1
  307. package/dist/sdui/to/courses.js.map +1 -1
  308. package/dist/sdui/to/holidays.js.map +1 -1
  309. package/dist/sdui/to/hours.js.map +1 -1
  310. package/dist/sdui/to/index.d.ts +12 -10
  311. package/dist/sdui/to/lessons.js.map +1 -1
  312. package/dist/sdui/to/rooms.js.map +1 -1
  313. package/dist/sdui/to/schedules.js.map +1 -1
  314. package/dist/sdui/to/school-years.js.map +1 -1
  315. package/dist/sdui/to/substitution-plans.js +3 -6
  316. package/dist/sdui/to/substitution-plans.js.map +1 -1
  317. package/dist/sdui/to/teachers.js.map +1 -1
  318. package/dist/vKlass/from/index.js.map +1 -1
  319. package/dist/vKlass/from/schedule.d.ts +4 -3
  320. package/dist/vKlass/from/schedule.js +2 -2
  321. package/dist/vKlass/from/schedule.js.map +1 -1
  322. package/dist/vKlass/to/schedules.d.ts +4 -4
  323. package/dist/vKlass/to/schedules.js +6 -17
  324. package/dist/vKlass/to/schedules.js.map +1 -1
  325. package/package.json +24 -22
  326. package/dist/core/types/areas.d.ts +0 -10
  327. package/dist/core/types/common/break-lengths.d.ts +0 -5
  328. package/dist/core/types/common/days.d.ts +0 -8
  329. package/dist/core/types/common/intervals.d.ts +0 -20
  330. package/dist/core/types/common/tag.d.ts +0 -9
  331. package/dist/core/types/configurations.d.ts +0 -31
  332. package/dist/core/types/courses.d.ts +0 -60
  333. package/dist/core/types/divisions.d.ts +0 -24
  334. package/dist/core/types/events.d.ts +0 -56
  335. package/dist/core/types/exceptions.d.ts +0 -35
  336. package/dist/core/types/groups.d.ts +0 -44
  337. package/dist/core/types/locations.d.ts +0 -27
  338. package/dist/core/types/locked-times.d.ts +0 -33
  339. package/dist/core/types/overlap-groups.d.ts +0 -14
  340. package/dist/core/types/periods.d.ts +0 -14
  341. package/dist/core/types/persons.d.ts +0 -38
  342. package/dist/core/types/root-intervals.d.ts +0 -13
  343. package/dist/core/types/schedules.d.ts +0 -44
  344. package/dist/core/types/syllabus.d.ts +0 -18
  345. package/dist/core/types/teachers.d.ts +0 -44
  346. package/dist/core/vertex-mapping.d.ts +0 -69
@@ -1 +1 @@
1
- {"version":3,"file":"schedules.js","names":["days: Day[]","start","end","start: moment.Moment | undefined","end: moment.Moment | undefined","_day: number","getDate","_teachers: string[] | undefined","_groups: string[] | undefined","_locations: string[] | undefined","doc: CoreTypes.serializedWithoutInternalId.event & { subject?: string }","x","events","course: CoreTypes.serializedWithoutInternalId.course","groups","teachers"],"sources":["../../../../src/SchoolSoft/file/from/schedules.ts"],"sourcesContent":["import type moment from 'moment';\nimport { trim, sortBy, countBy, size, groupBy } from 'lodash-es';\nimport type { Day, Event } from '../types/events';\nimport type { CoreTypes } from '../../../core';\nimport getDate from '../../../common/get-date';\nimport type { Options } from '../types';\nimport { makeChainable } from '../../../common/make-chainable';\n\nconst days: Day[] = ['Mån', 'Tis', 'Ons', 'Tor', 'Fre', 'Lör', 'Sön'];\n\nfunction _parseWeeks (\n weeks: string | undefined,\n set: Set<number>,\n method: ('add' | 'delete') = 'add'\n): void {\n if (!weeks) return;\n const intervals = weeks.split(',').map(x => trim(x)) as (`${number}-${number}` | `${number}${number}`)[];\n intervals.forEach(interval => {\n if (!interval.includes('-')) {\n set[method](Number(interval));\n return;\n }\n const [start, end] = interval.split('-').map(Number);\n Array.from({ length: end - start + 1 }, (_, index) => start + index)\n .forEach(x => set[method](x));\n });\n}\n\n\nexport default (\n input: Event[],\n options?: Options\n): Partial<CoreTypes.serializedWithoutInternalId.schedule> => {\n const teachers = new Set<string>();\n const groups = new Set<string>();\n const locations = new Set<string>();\n\n const events = input\n .map(event => {\n if (!event.length) return;\n\n const weeks = new Set<number>();\n const {\n inweek,\n exweek,\n realweeks\n } = event;\n\n try {\n _parseWeeks(inweek, weeks, 'add');\n _parseWeeks(realweeks, weeks, 'add');\n\n if (weeks.size == 0)\n Array.from({ length: 51 }, (_, index) => index + 1).forEach(x => weeks.add(x));\n _parseWeeks(exweek, weeks, 'delete');\n } catch (err) {\n console.error(err);\n }\n\n if (options?.interval) {\n const { start, end } = options.interval;\n\n if (start > 52 || start <= 0)\n throw new Error(`(SchoolSoft::From::Schedules) Interval::start is invalid. value ${ start }`);\n\n if (end > 52 || end <= 0)\n throw new Error(`(SchoolSoft::From::Schedules) Interval::end is invalid. value ${ end }`);\n\n if (start > end) {\n if (!Array.from(weeks).some(week => (week >= start && week <= 52) || week <= end))\n return;\n } else {\n if (!Array.from(weeks).some(week => week >= start && week <= end))\n return;\n }\n }\n\n let start: moment.Moment | undefined;\n let end: moment.Moment | undefined;\n\n const {\n starttime,\n subject,\n day,\n length,\n teacher,\n group,\n room\n } = event;\n\n if (day && starttime) {\n const _day: number = days.indexOf(day);\n\n if (_day > 4) return;\n\n start = getDate(_day, `${ starttime.substring(0, 2) }:${ starttime.substring(2, 4) }`);\n end = start.clone().add(length, 'm');\n }\n\n let _teachers: string[] | undefined;\n let _groups: string[] | undefined;\n let _locations: string[] | undefined;\n\n if (teacher) {\n _teachers = teacher.split(',').map(x => x.trim());\n _teachers?.forEach(x => teachers.add(x));\n }\n\n if (group) {\n _groups = group.split(',').map(x => x.trim());\n _groups?.forEach(x => groups.add(x));\n }\n\n if (room) {\n _locations = sortBy(room.split(',').map(x => x.trim()));\n _locations?.forEach(x => locations.add(x));\n }\n\n const doc: CoreTypes.serializedWithoutInternalId.event & { subject?: string } ={\n ids: event.id,\n preferredDuration: event.length,\n weeks: sortBy(Array.from(weeks)),\n ...subject && { subject },\n ...start && { start },\n ...end && { end },\n ...event.group && { groups: _groups ?.map(to => ({ to })) },\n ...event.teacher && { teachers: _teachers?.map(to => ({ to })) },\n ...event.room && {\n inLocations: _locations,\n locations: _locations?.map((_location, index: number) => (\n {\n locations: [_location],\n groupIndex: index\n })\n )\n }\n };\n\n return doc;\n })\n .filter(x => x != null);\n\n // construct courses from events with same subject, groups and teachers\n const courses = makeChainable(events)\n .chain(\n x => x.filter((e): e is typeof e & { ids: string } => !!e.ids),\n x => groupBy(x, e =>\n e.subject\n + '.g.' + e.groups?.map(x => x.to).join(',')\n // Subject Lunch only have teacher and no groups\n + (e.groups?.length ? '' : ('.t.' + e.teachers?.map(x => x.to).join(',') ))\n ),\n x => Object.values(x)\n .map(events => {\n // promote shared properties to course\n const { subject, groups, teachers } = events[0];\n for (const e of events) {\n delete e.subject;\n delete e.groups;\n }\n\n const course: CoreTypes.serializedWithoutInternalId.course = {\n displayName: `${ subject }-${ (groups ?? teachers)?.map(x => x.to).join(' ') }`,\n events: events.map(e => e.ids),\n ...groups,\n };\n\n // try to also promote teachers and locations\n if (size(countBy(events, e => e.teachers?.map(x => x.to).sort().join(','))) == 1) {\n course.teachers = events[0].teachers ?? undefined;\n events.forEach(e => delete e.teachers);\n }\n if (size(countBy(events, e => e.locations?.map(x => x.locations[0]).sort().join(','))) == 1) {\n course.locations = events[0].locations ?? undefined;\n events.forEach(e => delete e.locations);\n }\n\n return course;\n })\n )\n .value;\n\n return {\n courses: courses,\n teachers: Array.from(teachers) .map(ids => ({ ids, displayName: ids })),\n groups: Array.from(groups) .map(ids => ({ ids, displayName: ids })),\n locations: Array.from(locations).map(ids => ({ ids, displayName: ids }))\n };\n};"],"mappings":";;;;;AAQA,MAAMA,OAAc;CAAC;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;;AAE/D,SAAS,YACP,OACA,KACA,SAA6B,OACvB;AACN,KAAI,CAAC,MAAO;CACZ,MAAM,YAAY,MAAM,MAAM,KAAK,KAAI,MAAK,KAAK;AACjD,WAAU,SAAQ,aAAY;AAC5B,MAAI,CAAC,SAAS,SAAS,MAAM;AAC3B,OAAI,QAAQ,OAAO;AACnB;;EAEF,MAAM,CAAC,OAAO,OAAO,SAAS,MAAM,KAAK,IAAI;AAC7C,QAAM,KAAK,EAAE,QAAQ,MAAM,QAAQ,MAAM,GAAG,UAAU,QAAQ,OAC3D,SAAQ,MAAK,IAAI,QAAQ;;;AAKhC,yBACE,OACA,YAC4D;CAC5D,MAAM,2BAAY,IAAI;CACtB,MAAM,yBAAY,IAAI;CACtB,MAAM,4BAAY,IAAI;CAEtB,MAAM,SAAS,MACZ,KAAI,UAAS;AACZ,MAAI,CAAC,MAAM,OAAQ;EAEnB,MAAM,wBAAQ,IAAI;EAClB,MAAM,EACJ,QACA,QACA,cACE;AAEJ,MAAI;AACF,eAAY,QAAW,OAAO;AAC9B,eAAY,WAAW,OAAO;AAE9B,OAAI,MAAM,QAAQ,EAChB,OAAM,KAAK,EAAE,QAAQ,OAAO,GAAG,UAAU,QAAQ,GAAG,SAAQ,MAAK,MAAM,IAAI;AAC7E,eAAY,QAAQ,OAAO;WACpB,KAAK;AACZ,WAAQ,MAAM;;AAGhB,MAAI,SAAS,UAAU;GACrB,MAAM,EAAE,gBAAO,eAAQ,QAAQ;AAE/B,OAAIC,UAAQ,MAAMA,WAAS,EACzB,OAAM,IAAI,MAAM,mEAAoEA;AAEtF,OAAIC,QAAM,MAAMA,SAAO,EACrB,OAAM,IAAI,MAAM,iEAAkEA;AAEpF,OAAID,UAAQC,OACV;QAAI,CAAC,MAAM,KAAK,OAAO,MAAK,SAAS,QAAQD,WAAS,QAAQ,MAAO,QAAQC,OAC3E;cAEE,CAAC,MAAM,KAAK,OAAO,MAAK,SAAQ,QAAQD,WAAS,QAAQC,OAC3D;;EAIN,IAAIC;EACJ,IAAIC;EAEJ,MAAM,EACJ,WACA,SACA,KACA,QACA,SACA,OACA,SACE;AAEJ,MAAI,OAAO,WAAW;GACpB,MAAMC,OAAe,KAAK,QAAQ;AAElC,OAAI,OAAO,EAAG;AAEd,WAAQC,iBAAQ,MAAM,GAAI,UAAU,UAAU,GAAG,GAAI,GAAI,UAAU,UAAU,GAAG;AAChF,SAAQ,MAAM,QAAQ,IAAI,QAAQ;;EAGpC,IAAIC;EACJ,IAAIC;EACJ,IAAIC;AAEJ,MAAI,SAAS;AACX,eAAY,QAAQ,MAAM,KAAK,KAAI,MAAK,EAAE;AAC1C,cAAW,SAAQ,MAAK,SAAS,IAAI;;AAGvC,MAAI,OAAO;AACT,aAAU,MAAM,MAAM,KAAK,KAAI,MAAK,EAAE;AACtC,YAAS,SAAQ,MAAK,OAAO,IAAI;;AAGnC,MAAI,MAAM;AACR,gBAAa,OAAO,KAAK,MAAM,KAAK,KAAI,MAAK,EAAE;AAC/C,eAAY,SAAQ,MAAK,UAAU,IAAI;;EAGzC,MAAMC,MAAyE;GAC7E,KAAmB,MAAM;GACzB,mBAAmB,MAAM;GACzB,OAAmB,OAAO,MAAM,KAAK;GACrC,GAAG,WAAmB,EAAE;GACxB,GAAG,SAAmB,EAAE;GACxB,GAAG,OAAmB,EAAE;GACxB,GAAG,MAAM,SAAa,EAAE,QAAU,SAAW,KAAI,QAAO,EAAE;GAC1D,GAAG,MAAM,WAAa,EAAE,UAAU,WAAW,KAAI,QAAO,EAAE;GAC1D,GAAG,MAAM,QAAa;IACpB,aAAa;IACb,WAAa,YAAY,KAAK,WAAW,WACvC;KACE,WAAY,CAAC;KACb,YAAY;;;;AAMpB,SAAO;IAER,QAAO,MAAK,KAAK;CAGpB,MAAM,UAAU,cAAc,QAC3B,OACC,MAAK,EAAE,QAAQ,MAAuC,CAAC,CAAC,EAAE,OAC1D,MAAK,QAAQ,IAAG,MACd,EAAE,UACA,QAAQ,EAAE,QAAQ,KAAI,QAAKC,IAAE,IAAI,KAAK,QAErC,EAAE,QAAQ,SAAS,KAAO,QAAQ,EAAE,UAAU,KAAI,QAAKA,IAAE,IAAI,KAAK,SAEvE,MAAK,OAAO,OAAO,GAChB,KAAI,aAAU;EAEb,MAAM,EAAE,SAAS,kBAAQ,yBAAaC,SAAO;AAC7C,OAAK,MAAM,KAAKA,UAAQ;AACtB,UAAO,EAAE;AACT,UAAO,EAAE;;EAGX,MAAMC,SAAuD;GAC3D,aAAa,GAAI,QAAS,IAAKC,YAAUC,aAAW,KAAI,QAAKJ,IAAE,IAAI,KAAK;GACxE,QAAaC,SAAO,KAAI,MAAK,EAAE;GAC/B,GAAGE;;AAIL,MAAI,KAAK,QAAQF,WAAQ,MAAK,EAAE,UAAU,KAAI,QAAKD,IAAE,IAAI,OAAO,KAAK,UAAU,GAAG;AAChF,UAAO,WAAWC,SAAO,GAAG,YAAY;AACxC,YAAO,SAAQ,MAAK,OAAO,EAAE;;AAE/B,MAAI,KAAK,QAAQA,WAAQ,MAAK,EAAE,WAAW,KAAI,QAAKD,IAAE,UAAU,IAAI,OAAO,KAAK,UAAU,GAAG;AAC3F,UAAO,YAAYC,SAAO,GAAG,aAAa;AAC1C,YAAO,SAAQ,MAAK,OAAO,EAAE;;AAG/B,SAAO;KAGZ;AAEH,QAAO;EACM;EACX,UAAW,MAAM,KAAK,UAAW,KAAI,SAAQ;GAAE;GAAK,aAAa;;EACjE,QAAW,MAAM,KAAK,QAAW,KAAI,SAAQ;GAAE;GAAK,aAAa;;EACjE,WAAW,MAAM,KAAK,WAAW,KAAI,SAAQ;GAAE;GAAK,aAAa"}
1
+ {"version":3,"file":"schedules.js","names":["days: Day[]","start","end","start: moment.Moment | undefined","end: moment.Moment | undefined","_day: number","getDate","_teachers: string[] | undefined","_groups: string[] | undefined","_locations: string[] | undefined","x","course: CoreTypes.SerializedWithOptionalId.Course","groups","teachers"],"sources":["../../../../src/SchoolSoft/file/from/schedules.ts"],"sourcesContent":["import type moment from 'moment';\nimport { trim, sortBy, countBy, size, groupBy } from 'lodash-es';\nimport type { Day, Event } from '../types/events';\nimport type { CoreTypes } from '../../../core';\nimport getDate from '../../../common/get-date';\nimport type { Options } from '../types';\nimport { makeChainable } from '../../../common/make-chainable';\n\nconst days: Day[] = ['Mån', 'Tis', 'Ons', 'Tor', 'Fre', 'Lör', 'Sön'];\n\nfunction _parseWeeks (\n weeks: string | undefined,\n set: Set<number>,\n method: ('add' | 'delete') = 'add'\n): void {\n if (!weeks) return;\n const intervals = weeks.split(',').map(x => trim(x)) as (`${number}-${number}` | `${number}${number}`)[];\n intervals.forEach(interval => {\n if (!interval.includes('-')) {\n set[method](Number(interval));\n return;\n }\n const [start, end] = interval.split('-').map(Number);\n Array.from({ length: end - start + 1 }, (_, index) => start + index)\n .forEach(x => set[method](x));\n });\n}\n\n\nexport default (\n input: Event[],\n options?: Options\n): Partial<CoreTypes.SerializedWithOptionalId.Schedule> => {\n const teachers = new Set<string>();\n const groups = new Set<string>();\n const locations = new Set<string>();\n\n const events = input\n .map(event => {\n if (!event.length) return;\n\n const weeks = new Set<number>();\n const {\n inweek,\n exweek,\n realweeks\n } = event;\n\n try {\n _parseWeeks(inweek, weeks, 'add');\n _parseWeeks(realweeks, weeks, 'add');\n\n if (weeks.size == 0)\n Array.from({ length: 51 }, (_, index) => index + 1).forEach(x => weeks.add(x));\n _parseWeeks(exweek, weeks, 'delete');\n } catch (err) {\n console.error(err);\n }\n\n if (options?.interval) {\n const { start, end } = options.interval;\n\n if (start > 52 || start <= 0)\n throw new Error(`(SchoolSoft::From::Schedules) Interval::start is invalid. value ${ start }`);\n\n if (end > 52 || end <= 0)\n throw new Error(`(SchoolSoft::From::Schedules) Interval::end is invalid. value ${ end }`);\n\n if (start > end) {\n if (!Array.from(weeks).some(week => (week >= start && week <= 52) || week <= end))\n return;\n } else {\n if (!Array.from(weeks).some(week => week >= start && week <= end))\n return;\n }\n }\n\n let start: moment.Moment | undefined;\n let end: moment.Moment | undefined;\n\n const {\n starttime,\n subject,\n day,\n length,\n teacher,\n group,\n room\n } = event;\n\n if (day && starttime) {\n const _day: number = days.indexOf(day);\n\n if (_day > 4) return;\n\n start = getDate(_day, `${ starttime.substring(0, 2) }:${ starttime.substring(2, 4) }`);\n end = start.clone().add(length, 'm');\n }\n\n let _teachers: string[] | undefined;\n let _groups: string[] | undefined;\n let _locations: string[] | undefined;\n\n if (teacher) {\n _teachers = teacher.split(',').map(x => x.trim());\n _teachers?.forEach(x => teachers.add(x));\n }\n\n if (group) {\n _groups = group.split(',').map(x => x.trim());\n _groups?.forEach(x => groups.add(x));\n }\n\n if (room) {\n _locations = sortBy(room.split(',').map(x => x.trim()));\n _locations?.forEach(x => locations.add(x));\n }\n\n const doc: CoreTypes.SerializedWithOptionalId.Event & { subject?: string } ={\n ids: event.id,\n preferredDuration: event.length,\n weeks: sortBy(Array.from(weeks)),\n ...subject && { subject },\n ...start && { start },\n ...end && { end },\n ...event.group && { groups: _groups ?.map(to => ({ to })) },\n ...event.teacher && { teachers: _teachers?.map(to => ({ to })) },\n ...event.room && {\n inLocations: _locations,\n locations: _locations?.map((_location, index: number) => (\n {\n locations: [_location],\n groupIndex: index\n })\n )\n }\n };\n\n return doc;\n })\n .filter(x => x != null);\n\n // construct courses from events with same subject, groups and teachers\n const courses = makeChainable(events)\n .chain(\n x => x.filter((e): e is typeof e & { ids: string } => !!e.ids),\n x => groupBy(x, e =>\n e.subject\n + '.g.' + e.groups?.map(x => x.to).join(',')\n // Subject Lunch only have teacher and no groups\n + (e.groups?.length ? '' : ('.t.' + e.teachers?.map(x => x.to).join(',') ))\n ),\n x => Object.values(x)\n .map(events => {\n // promote shared properties to course\n const { subject, groups, teachers } = events[0];\n for (const e of events) {\n delete e.subject;\n delete e.groups;\n }\n\n const course: CoreTypes.SerializedWithOptionalId.Course = {\n displayName: `${ subject }-${ (groups ?? teachers)?.map(x => x.to).join(' ') }`,\n events: events.map(e => e.ids),\n ...groups,\n };\n\n // try to also promote teachers and locations\n if (size(countBy(events, e => e.teachers?.map(x => x.to).sort().join(','))) == 1) {\n course.teachers = events[0].teachers ?? undefined;\n events.forEach(e => delete e.teachers);\n }\n if (size(countBy(events, e => e.locations?.map(x => x.locations[0]).sort().join(','))) == 1) {\n course.locations = events[0].locations ?? undefined;\n events.forEach(e => delete e.locations);\n }\n\n return course;\n })\n )\n .value;\n\n return {\n courses: courses,\n teachers: Array.from(teachers) .map(ids => ({ ids, displayName: ids })),\n groups: Array.from(groups) .map(ids => ({ ids, displayName: ids })),\n locations: Array.from(locations).map(ids => ({ ids, displayName: ids }))\n };\n};"],"mappings":";;;;;AAQA,MAAMA,OAAc;CAAC;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAM;AAErE,SAAS,YACP,OACA,KACA,SAA6B,OACvB;AACN,KAAI,CAAC,MAAO;AAEZ,CADkB,MAAM,MAAM,IAAI,CAAC,KAAI,MAAK,KAAK,EAAE,CAAC,CAC1C,SAAQ,aAAY;AAC5B,MAAI,CAAC,SAAS,SAAS,IAAI,EAAE;AAC3B,OAAI,QAAQ,OAAO,SAAS,CAAC;AAC7B;;EAEF,MAAM,CAAC,OAAO,OAAO,SAAS,MAAM,IAAI,CAAC,IAAI,OAAO;AACpD,QAAM,KAAK,EAAE,QAAQ,MAAM,QAAQ,GAAG,GAAG,GAAG,UAAU,QAAQ,MAAM,CACjE,SAAQ,MAAK,IAAI,QAAQ,EAAE,CAAC;GAC/B;;AAIJ,yBACE,OACA,YACyD;CACzD,MAAM,2BAAY,IAAI,KAAa;CACnC,MAAM,yBAAY,IAAI,KAAa;CACnC,MAAM,4BAAY,IAAI,KAAa;AAmJnC,QAAO;EACL,SAxCc,cA1GD,MACZ,KAAI,UAAS;AACZ,OAAI,CAAC,MAAM,OAAQ;GAEnB,MAAM,wBAAQ,IAAI,KAAa;GAC/B,MAAM,EACJ,QACA,QACA,cACE;AAEJ,OAAI;AACF,gBAAY,QAAW,OAAO,MAAM;AACpC,gBAAY,WAAW,OAAO,MAAM;AAEpC,QAAI,MAAM,QAAQ,EAChB,OAAM,KAAK,EAAE,QAAQ,IAAI,GAAG,GAAG,UAAU,QAAQ,EAAE,CAAC,SAAQ,MAAK,MAAM,IAAI,EAAE,CAAC;AAChF,gBAAY,QAAQ,OAAO,SAAS;YAC7B,KAAK;AACZ,YAAQ,MAAM,IAAI;;AAGpB,OAAI,SAAS,UAAU;IACrB,MAAM,EAAE,gBAAO,eAAQ,QAAQ;AAE/B,QAAIC,UAAQ,MAAMA,WAAS,EACzB,OAAM,IAAI,MAAM,mEAAoEA,UAAS;AAE/F,QAAIC,QAAM,MAAMA,SAAO,EACrB,OAAM,IAAI,MAAM,iEAAkEA,QAAO;AAE3F,QAAID,UAAQC,OACV;SAAI,CAAC,MAAM,KAAK,MAAM,CAAC,MAAK,SAAS,QAAQD,WAAS,QAAQ,MAAO,QAAQC,MAAI,CAC/E;eAEE,CAAC,MAAM,KAAK,MAAM,CAAC,MAAK,SAAQ,QAAQD,WAAS,QAAQC,MAAI,CAC/D;;GAIN,IAAIC;GACJ,IAAIC;GAEJ,MAAM,EACJ,WACA,SACA,KACA,QACA,SACA,OACA,SACE;AAEJ,OAAI,OAAO,WAAW;IACpB,MAAMC,OAAe,KAAK,QAAQ,IAAI;AAEtC,QAAI,OAAO,EAAG;AAEd,YAAQC,iBAAQ,MAAM,GAAI,UAAU,UAAU,GAAG,EAAE,CAAE,GAAI,UAAU,UAAU,GAAG,EAAE,GAAI;AACtF,UAAQ,MAAM,OAAO,CAAC,IAAI,QAAQ,IAAI;;GAGxC,IAAIC;GACJ,IAAIC;GACJ,IAAIC;AAEJ,OAAI,SAAS;AACX,gBAAY,QAAQ,MAAM,IAAI,CAAC,KAAI,MAAK,EAAE,MAAM,CAAC;AACjD,eAAW,SAAQ,MAAK,SAAS,IAAI,EAAE,CAAC;;AAG1C,OAAI,OAAO;AACT,cAAU,MAAM,MAAM,IAAI,CAAC,KAAI,MAAK,EAAE,MAAM,CAAC;AAC7C,aAAS,SAAQ,MAAK,OAAO,IAAI,EAAE,CAAC;;AAGtC,OAAI,MAAM;AACR,iBAAa,OAAO,KAAK,MAAM,IAAI,CAAC,KAAI,MAAK,EAAE,MAAM,CAAC,CAAC;AACvD,gBAAY,SAAQ,MAAK,UAAU,IAAI,EAAE,CAAC;;AAuB5C,UApB4E;IAC1E,KAAmB,MAAM;IACzB,mBAAmB,MAAM;IACzB,OAAmB,OAAO,MAAM,KAAK,MAAM,CAAC;IAC5C,GAAG,WAAmB,EAAE,SAAS;IACjC,GAAG,SAAmB,EAAE,OAAO;IAC/B,GAAG,OAAmB,EAAE,KAAK;IAC7B,GAAG,MAAM,SAAa,EAAE,QAAU,SAAW,KAAI,QAAO,EAAE,IAAI,EAAE,EAAE;IAClE,GAAG,MAAM,WAAa,EAAE,UAAU,WAAW,KAAI,QAAO,EAAE,IAAI,EAAE,EAAE;IAClE,GAAG,MAAM,QAAa;KACpB,aAAa;KACb,WAAa,YAAY,KAAK,WAAW,WACvC;MACE,WAAY,CAAC,UAAU;MACvB,YAAY;MACb,EACF;KACF;IACF;IAGD,CACD,QAAO,MAAK,KAAK,KAAK,CAGY,CAClC,OACC,MAAK,EAAE,QAAQ,MAAuC,CAAC,CAAC,EAAE,IAAI,GAC9D,MAAK,QAAQ,IAAG,MACd,EAAE,UACA,QAAQ,EAAE,QAAQ,KAAI,QAAKC,IAAE,GAAG,CAAC,KAAK,IAAI,IAEzC,EAAE,QAAQ,SAAS,KAAO,QAAQ,EAAE,UAAU,KAAI,QAAKA,IAAE,GAAG,CAAC,KAAK,IAAI,EAC1E,GACD,MAAK,OAAO,OAAO,EAAE,CAClB,KAAI,WAAU;GAEb,MAAM,EAAE,SAAS,kBAAQ,yBAAa,OAAO;AAC7C,QAAK,MAAM,KAAK,QAAQ;AACtB,WAAO,EAAE;AACT,WAAO,EAAE;;GAGX,MAAMC,SAAoD;IACxD,aAAa,GAAI,QAAS,IAAKC,YAAUC,aAAW,KAAI,QAAKH,IAAE,GAAG,CAAC,KAAK,IAAI;IAC5E,QAAa,OAAO,KAAI,MAAK,EAAE,IAAI;IACnC,GAAGE;IACJ;AAGD,OAAI,KAAK,QAAQ,SAAQ,MAAK,EAAE,UAAU,KAAI,QAAKF,IAAE,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,GAAG;AAChF,WAAO,WAAW,OAAO,GAAG,YAAY;AACxC,WAAO,SAAQ,MAAK,OAAO,EAAE,SAAS;;AAExC,OAAI,KAAK,QAAQ,SAAQ,MAAK,EAAE,WAAW,KAAI,QAAKA,IAAE,UAAU,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,GAAG;AAC3F,WAAO,YAAY,OAAO,GAAG,aAAa;AAC1C,WAAO,SAAQ,MAAK,OAAO,EAAE,UAAU;;AAGzC,UAAO;IACP,CACL,CACA;EAID,UAAW,MAAM,KAAK,SAAS,CAAE,KAAI,SAAQ;GAAE;GAAK,aAAa;GAAK,EAAE;EACxE,QAAW,MAAM,KAAK,OAAO,CAAI,KAAI,SAAQ;GAAE;GAAK,aAAa;GAAK,EAAE;EACxE,WAAW,MAAM,KAAK,UAAU,CAAC,KAAI,SAAQ;GAAE;GAAK,aAAa;GAAK,EAAE;EACzE"}
@@ -2,11 +2,12 @@ import { Types } from "../../core/types/index.js";
2
2
  import { Event } from "./types/events.js";
3
3
  import { export_default } from "./to/index.js";
4
4
  import { Options, Types as Types$1 } from "./types/index.js";
5
+ import "../../index.js";
5
6
 
6
7
  //#region src/SchoolSoft/file/index.d.ts
7
8
  declare class Map {
8
9
  static from: {
9
- schedules: (input: Event[], options?: Options) => Partial<Types.serializedWithoutInternalId.schedule>;
10
+ schedules: (input: Event[], options?: Options) => Partial<Types.SerializedWithOptionalId.Schedule>;
10
11
  };
11
12
  static to: typeof export_default;
12
13
  }
@@ -1,12 +1,13 @@
1
1
  import { BaseOptions } from "../../../common/types.js";
2
2
  import { Types } from "../../../core/types/index.js";
3
- import * as xlsx1 from "xlsx";
3
+ import "../../../index.js";
4
+ import * as xlsx0 from "xlsx";
4
5
 
5
6
  //#region src/SchoolSoft/file/to/index.d.ts
6
7
  declare class export_default {
7
- static schedules: (schedule: Types.mixed.schedule & {
8
- division?: Types.mixed.division;
9
- }, options?: BaseOptions) => xlsx1.WorkBook;
8
+ static schedules: (schedule: Types.Mixed.Schedule & {
9
+ division?: Types.Mixed.Division;
10
+ }, options?: BaseOptions) => xlsx0.WorkBook;
10
11
  }
11
12
  //#endregion
12
13
  export { export_default };
@@ -68,8 +68,7 @@ var schedules_default = (schedule, options = {}) => {
68
68
  }
69
69
  const subject = course.subject;
70
70
  const _period = e.period ?? course.period ?? schedule.settings.period;
71
- const period = periodsMap.get(_period ? getVertexId(_period, options) : void 0);
72
- const weeks = period?.ranges.map((x) => {
71
+ const weeks = periodsMap.get(_period ? getVertexId(_period, options) : void 0)?.ranges.map((x) => {
73
72
  const start$1 = moment.utc(x.start);
74
73
  const end$1 = moment.utc(x.end);
75
74
  const weeks$1 = new Array();
@@ -1 +1 @@
1
- {"version":3,"file":"schedules.js","names":["x","start","end","weeks"],"sources":["../../../../src/SchoolSoft/file/to/schedules.ts"],"sourcesContent":["import XLSX from 'xlsx';\nimport moment from 'moment';\nimport { orderBy, uniq } from 'lodash-es';\nimport type { CoreTypes } from '../../../core';\nimport { getDayIndex, getVertexId } from '../../../core/util';\nimport type { BaseOptions } from '../../../common/types';\nimport { makeChainable } from '../../../common/make-chainable';\n\n\ntype Undervisningsgrupp = {\n name?: string;\n socialnumber: string;\n externalid: string;\n classtype: 1 | 0;\n};\n\nfunction createUndervisningsgrupp (\n collection: 'courses' | 'events',\n entity: CoreTypes.mixed.course | CoreTypes.mixed.event,\n fallbackName: string | undefined,\n did: string,\n groupPersonsMap: Map<string, CoreTypes.mixed.person[]>,\n personsMap: Map<string, CoreTypes.mixed.person>,\n options: BaseOptions\n): Undervisningsgrupp {\n const SSNs = makeChainable(entity.groups ?? [])\n .chain(\n x => x\n .map(x => {\n const include = groupPersonsMap.get(getVertexId(x.to, options))?.map(x => x.SSN?.value)\n .filter((x): x is string => !!x) ?? [];\n const exclude = x.exclude?.map(x => personsMap.get(getVertexId(x, options))?.SSN?.value).filter((x): x is string => !!x) ?? [];\n return include.filter(x => !exclude.includes(x));\n })\n .concat(entity.participants?.map(({ to }) => personsMap.get(getVertexId(to, options))?.SSN?.value).filter((x): x is string => !!x) ?? [])\n .flat(),\n x => uniq(x).join(', ')\n )\n .value;\n\n return {\n name: entity.displayName ?? fallbackName,\n socialnumber: SSNs,\n externalid: `${did}.${getVertexId(entity, options)}${collection == 'courses' ? 'C' : 'E'}`,\n classtype: 0\n };\n};\n\nexport default (\n schedule: CoreTypes.mixed.schedule & { division?: CoreTypes.mixed.division },\n options: BaseOptions = {}\n): XLSX.WorkBook => {\n const division = schedule.division ?? schedule.divisions;\n\n // must have a division id\n const did = getVertexId(division, options);\n\n // a map of period id -> period\n const periodsMap = new Map(schedule.periods.map(p => [getVertexId(p, options) as string | undefined, p as Pick<CoreTypes.mixed.period, 'ranges'>]));\n periodsMap.set(undefined, { ranges: [{ start: division.start, end: division.end }] });\n\n // a map of group id -> persons\n const groupPersonsMap = new Map<string, CoreTypes.mixed.person[]>();\n schedule.persons.forEach(p => {\n if (!p.group) return;\n const gid = getVertexId(p.group, options);\n if (!groupPersonsMap.has(gid)) groupPersonsMap.set(gid, []);\n groupPersonsMap.get(gid)?.push(p);\n });\n\n // a map of person id -> person\n const personsMap = new Map(schedule.persons.map(p => [getVertexId(p, options), p]));\n\n // a map of teacher id -> teacher\n const teachersMap = new Map(schedule.teachers.map(t => [getVertexId(t, options), t]));\n\n // a map of course id -> course\n const coursesMap = new Map(schedule.courses.map(c => [getVertexId(c, options), c]));\n\n\n ////\n //// kurser, grupper -> undervisningsgrupper\n ////\n let undervisningsgrupper = new Array<Undervisningsgrupp>();\n schedule.courses.forEach(c => {\n undervisningsgrupper.push(createUndervisningsgrupp('courses', c, '', did, groupPersonsMap, personsMap, options));\n });\n schedule.groups.forEach(g => {\n const SSNs = (groupPersonsMap.get(getVertexId(g, options))?? [])\n .map(x => x.SSN?.value)\n .filter((x): x is string => !!x)\n .join(', ');\n\n undervisningsgrupper.push({\n name: g.displayName,\n socialnumber: SSNs,\n externalid: `${did}.${getVertexId(g, options)}G`,\n classtype: 1\n });\n });\n\n // for convenience, sort first by classtype in descending order, then by name\n undervisningsgrupper = orderBy(undervisningsgrupper, ['classtype', 'name'], ['desc', 'asc']);\n\n\n ////\n //// salar\n ////\n const salar = schedule.locations\n .map(l => ({\n name: l.displayName,\n externalid: `${did}.${getVertexId(l, options)}`\n }));\n\n\n ////\n //// lektioner\n ////\n const lektioner = schedule.events\n .map(e => {\n // must have start and end\n if (!e.start || !e.end) return null;\n const start = moment.utc(e.start);\n const end = moment.utc(e.end);\n\n // must have course\n const course = e.course ? coursesMap.get(getVertexId(e.course, options)) : undefined;\n if (!course) return null;\n let groupexternalid = `${did}.${getVertexId(course, options)}C`;\n\n // if the event overrides the course's groups or participants, create a new overlap group from the event\n if (e.groups || e.participants) {\n const UG = createUndervisningsgrupp('events', e, course.displayName, did, groupPersonsMap, personsMap, options);\n undervisningsgrupper.push(UG);\n groupexternalid = UG.externalid;\n }\n\n const subject = course.subject;\n const _period = e.period ?? course.period ?? schedule.settings.period;\n const period = periodsMap.get(_period ? getVertexId(_period, options) : undefined);\n\n const weeks = period?.ranges.map(x => {\n // fetch all weeks between start and end\n const start = moment.utc(x.start);\n const end = moment.utc(x.end);\n const weeks = new Array<number>();\n while (start.isBefore(end)) {\n weeks.push(start.week());\n start.add(1, 'week');\n }\n return weeks;\n }).flat()\n .join(', ');\n\n const teachers = (e.teachers ?? course.teachers ?? [])\n .map(x => teachersMap.get(getVertexId(x.to, options))?.ids)\n .filter((x): x is string => !!x)\n .join(', ');\n\n const rooms = (e.inLocations as CoreTypes.location[] ?? [])\n .filter(Boolean)\n .map(x => `${did}.${getVertexId(x, options)}`)\n .join(', ');\n\n return {\n dayid: getDayIndex(start),\n starttime: start.format('HHmm'),\n length: end.diff(start, 'minutes'),\n roomexternalid: rooms,\n subject: subject,\n exweek: '',\n inweek: weeks,\n period: '',\n groupexternalid: groupexternalid,\n teacherid: teachers,\n externalref: `${did}.${getVertexId(e, options)}`,\n };\n })\n .filter(x => x != null);\n\n\n ////\n //// store in workbook\n ////\n const wb = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(undervisningsgrupper), '1. Undervisningsgrupper');\n XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(salar), '2. Salar');\n XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(lektioner), '3. Lektioner');\n\n return wb;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"schedules.js","names":["x","start","end","weeks"],"sources":["../../../../src/SchoolSoft/file/to/schedules.ts"],"sourcesContent":["import XLSX from 'xlsx';\nimport moment from 'moment';\nimport { orderBy, uniq } from 'lodash-es';\nimport type { CoreTypes } from '../../../core';\nimport { getDayIndex, getVertexId } from '../../../core/util';\nimport type { BaseOptions } from '../../../common/types';\nimport { makeChainable } from '../../../common/make-chainable';\n\n\ntype Undervisningsgrupp = {\n name?: string;\n socialnumber: string;\n externalid: string;\n classtype: 1 | 0;\n};\n\nfunction createUndervisningsgrupp (\n collection: 'courses' | 'events',\n entity: CoreTypes.Mixed.Course | CoreTypes.Mixed.Event,\n fallbackName: string | undefined,\n did: string,\n groupPersonsMap: Map<string, CoreTypes.Mixed.Person[]>,\n personsMap: Map<string, CoreTypes.Mixed.Person>,\n options: BaseOptions\n): Undervisningsgrupp {\n const SSNs = makeChainable(entity.groups ?? [])\n .chain(\n x => x\n .map(x => {\n const include = groupPersonsMap.get(getVertexId(x.to, options))?.map(x => x.SSN?.value)\n .filter((x): x is string => !!x) ?? [];\n const exclude = x.exclude?.map(x => personsMap.get(getVertexId(x, options))?.SSN?.value).filter((x): x is string => !!x) ?? [];\n return include.filter(x => !exclude.includes(x));\n })\n .concat(entity.participants?.map(({ to }) => personsMap.get(getVertexId(to, options))?.SSN?.value).filter((x): x is string => !!x) ?? [])\n .flat(),\n x => uniq(x).join(', ')\n )\n .value;\n\n return {\n name: entity.displayName ?? fallbackName,\n socialnumber: SSNs,\n externalid: `${did}.${getVertexId(entity, options)}${collection == 'courses' ? 'C' : 'E'}`,\n classtype: 0\n };\n};\n\nexport default (\n schedule: CoreTypes.Mixed.Schedule & { division?: CoreTypes.Mixed.Division },\n options: BaseOptions = {}\n): XLSX.WorkBook => {\n const division = schedule.division ?? schedule.divisions;\n\n // must have a division id\n const did = getVertexId(division, options);\n\n // a map of period id -> period\n const periodsMap = new Map(schedule.periods.map(p => [getVertexId(p, options) as string | undefined, p as Pick<CoreTypes.Mixed.Period, 'ranges'>]));\n periodsMap.set(undefined, { ranges: [{ start: division.start, end: division.end }] });\n\n // a map of group id -> persons\n const groupPersonsMap = new Map<string, CoreTypes.Mixed.Person[]>();\n schedule.persons.forEach(p => {\n if (!p.group) return;\n const gid = getVertexId(p.group, options);\n if (!groupPersonsMap.has(gid)) groupPersonsMap.set(gid, []);\n groupPersonsMap.get(gid)?.push(p);\n });\n\n // a map of person id -> person\n const personsMap = new Map(schedule.persons.map(p => [getVertexId(p, options), p]));\n\n // a map of teacher id -> teacher\n const teachersMap = new Map(schedule.teachers.map(t => [getVertexId(t, options), t]));\n\n // a map of course id -> course\n const coursesMap = new Map(schedule.courses.map(c => [getVertexId(c, options), c]));\n\n\n ////\n //// kurser, grupper -> undervisningsgrupper\n ////\n let undervisningsgrupper = new Array<Undervisningsgrupp>();\n schedule.courses.forEach(c => {\n undervisningsgrupper.push(createUndervisningsgrupp('courses', c, '', did, groupPersonsMap, personsMap, options));\n });\n schedule.groups.forEach(g => {\n const SSNs = (groupPersonsMap.get(getVertexId(g, options))?? [])\n .map(x => x.SSN?.value)\n .filter((x): x is string => !!x)\n .join(', ');\n\n undervisningsgrupper.push({\n name: g.displayName,\n socialnumber: SSNs,\n externalid: `${did}.${getVertexId(g, options)}G`,\n classtype: 1\n });\n });\n\n // for convenience, sort first by classtype in descending order, then by name\n undervisningsgrupper = orderBy(undervisningsgrupper, ['classtype', 'name'], ['desc', 'asc']);\n\n\n ////\n //// salar\n ////\n const salar = schedule.locations\n .map(l => ({\n name: l.displayName,\n externalid: `${did}.${getVertexId(l, options)}`\n }));\n\n\n ////\n //// lektioner\n ////\n const lektioner = schedule.events\n .map(e => {\n // must have start and end\n if (!e.start || !e.end) return null;\n const start = moment.utc(e.start);\n const end = moment.utc(e.end);\n\n // must have course\n const course = e.course ? coursesMap.get(getVertexId(e.course, options)) : undefined;\n if (!course) return null;\n let groupexternalid = `${did}.${getVertexId(course, options)}C`;\n\n // if the event overrides the course's groups or participants, create a new overlap group from the event\n if (e.groups || e.participants) {\n const UG = createUndervisningsgrupp('events', e, course.displayName, did, groupPersonsMap, personsMap, options);\n undervisningsgrupper.push(UG);\n groupexternalid = UG.externalid;\n }\n\n const subject = course.subject;\n const _period = e.period ?? course.period ?? schedule.settings.period;\n const period = periodsMap.get(_period ? getVertexId(_period, options) : undefined);\n\n const weeks = period?.ranges.map(x => {\n // fetch all weeks between start and end\n const start = moment.utc(x.start);\n const end = moment.utc(x.end);\n const weeks = new Array<number>();\n while (start.isBefore(end)) {\n weeks.push(start.week());\n start.add(1, 'week');\n }\n return weeks;\n }).flat()\n .join(', ');\n\n const teachers = (e.teachers ?? course.teachers ?? [])\n .map(x => teachersMap.get(getVertexId(x.to, options))?.ids)\n .filter((x): x is string => !!x)\n .join(', ');\n\n const rooms = (e.inLocations as CoreTypes.Deep.Location[] ?? [])\n .filter(Boolean)\n .map(x => `${did}.${getVertexId(x, options)}`)\n .join(', ');\n\n return {\n dayid: getDayIndex(start),\n starttime: start.format('HHmm'),\n length: end.diff(start, 'minutes'),\n roomexternalid: rooms,\n subject: subject,\n exweek: '',\n inweek: weeks,\n period: '',\n groupexternalid: groupexternalid,\n teacherid: teachers,\n externalref: `${did}.${getVertexId(e, options)}`,\n };\n })\n .filter(x => x != null);\n\n\n ////\n //// store in workbook\n ////\n const wb = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(undervisningsgrupper), '1. Undervisningsgrupper');\n XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(salar), '2. Salar');\n XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(lektioner), '3. Lektioner');\n\n return wb;\n};\n"],"mappings":";;;;;;;AAgBA,SAAS,yBACP,YACA,QACA,cACA,KACA,iBACA,YACA,SACoB;CACpB,MAAM,OAAO,cAAc,OAAO,UAAU,EAAE,CAAC,CAC5C,OACC,MAAK,EACF,KAAI,QAAK;EACR,MAAM,UAAU,gBAAgB,IAAI,YAAYA,IAAE,IAAI,QAAQ,CAAC,EAAE,KAAI,QAAKA,IAAE,KAAK,MAAM,CACpF,QAAQ,QAAmB,CAAC,CAACA,IAAE,IAAI,EAAE;EACxC,MAAM,UAAUA,IAAE,SAAS,KAAI,QAAK,WAAW,IAAI,YAAYA,KAAG,QAAQ,CAAC,EAAE,KAAK,MAAM,CAAC,QAAQ,QAAmB,CAAC,CAACA,IAAE,IAAI,EAAE;AAC9H,SAAO,QAAQ,QAAO,QAAK,CAAC,QAAQ,SAASA,IAAE,CAAC;GAChD,CACD,OAAO,OAAO,cAAc,KAAK,EAAE,SAAS,WAAW,IAAI,YAAY,IAAI,QAAQ,CAAC,EAAE,KAAK,MAAM,CAAC,QAAQ,QAAmB,CAAC,CAACA,IAAE,IAAI,EAAE,CAAC,CACxI,MAAM,GACT,MAAK,KAAK,EAAE,CAAC,KAAK,KAAK,CACxB,CACA;AAEH,QAAO;EACL,MAAc,OAAO,eAAe;EACpC,cAAc;EACd,YAAc,GAAG,IAAI,GAAG,YAAY,QAAQ,QAAQ,GAAG,cAAc,YAAY,MAAM;EACvF,WAAc;EACf;;AAGH,yBACE,UACA,UAAwB,EAAE,KACR;CAClB,MAAM,WAAW,SAAS,YAAY,SAAS;CAG/C,MAAM,MAAM,YAAY,UAAU,QAAQ;CAG1C,MAAM,aAAa,IAAI,IAAI,SAAS,QAAQ,KAAI,MAAK,CAAC,YAAY,GAAG,QAAQ,EAAwB,EAA4C,CAAC,CAAC;AACnJ,YAAW,IAAI,QAAW,EAAE,QAAQ,CAAC;EAAE,OAAO,SAAS;EAAO,KAAK,SAAS;EAAK,CAAC,EAAE,CAAC;CAGrF,MAAM,kCAAkB,IAAI,KAAuC;AACnE,UAAS,QAAQ,SAAQ,MAAK;AAC5B,MAAI,CAAC,EAAE,MAAO;EACd,MAAM,MAAM,YAAY,EAAE,OAAO,QAAQ;AACzC,MAAI,CAAC,gBAAgB,IAAI,IAAI,CAAE,iBAAgB,IAAI,KAAK,EAAE,CAAC;AAC3D,kBAAgB,IAAI,IAAI,EAAE,KAAK,EAAE;GACjC;CAGF,MAAM,aAAa,IAAI,IAAI,SAAS,QAAQ,KAAI,MAAK,CAAC,YAAY,GAAG,QAAQ,EAAE,EAAE,CAAC,CAAC;CAGnF,MAAM,cAAc,IAAI,IAAI,SAAS,SAAS,KAAI,MAAK,CAAC,YAAY,GAAG,QAAQ,EAAE,EAAE,CAAC,CAAC;CAGrF,MAAM,aAAa,IAAI,IAAI,SAAS,QAAQ,KAAI,MAAK,CAAC,YAAY,GAAG,QAAQ,EAAE,EAAE,CAAC,CAAC;CAMnF,IAAI,uBAAuB,IAAI,OAA2B;AAC1D,UAAS,QAAQ,SAAQ,MAAK;AAC5B,uBAAqB,KAAK,yBAAyB,WAAW,GAAG,IAAI,KAAK,iBAAiB,YAAY,QAAQ,CAAC;GAChH;AACF,UAAS,OAAO,SAAQ,MAAK;EAC3B,MAAM,QAAQ,gBAAgB,IAAI,YAAY,GAAG,QAAQ,CAAC,IAAG,EAAE,EAC5D,KAAI,MAAK,EAAE,KAAK,MAAM,CACtB,QAAQ,MAAmB,CAAC,CAAC,EAAE,CAC/B,KAAK,KAAK;AAEb,uBAAqB,KAAK;GACxB,MAAc,EAAE;GAChB,cAAc;GACd,YAAc,GAAG,IAAI,GAAG,YAAY,GAAG,QAAQ,CAAC;GAChD,WAAc;GACf,CAAC;GACF;AAGF,wBAAuB,QAAQ,sBAAsB,CAAC,aAAa,OAAO,EAAE,CAAC,QAAQ,MAAM,CAAC;CAM5F,MAAM,QAAQ,SAAS,UACpB,KAAI,OAAM;EACT,MAAY,EAAE;EACd,YAAY,GAAG,IAAI,GAAG,YAAY,GAAG,QAAQ;EAC9C,EAAE;CAML,MAAM,YAAY,SAAS,OACxB,KAAI,MAAK;AAER,MAAI,CAAC,EAAE,SAAS,CAAC,EAAE,IAAK,QAAO;EAC/B,MAAM,QAAQ,OAAO,IAAI,EAAE,MAAM;EACjC,MAAM,MAAQ,OAAO,IAAI,EAAE,IAAI;EAG/B,MAAM,SAAS,EAAE,SAAS,WAAW,IAAI,YAAY,EAAE,QAAQ,QAAQ,CAAC,GAAG;AAC3E,MAAI,CAAC,OAAQ,QAAO;EACpB,IAAI,kBAAkB,GAAG,IAAI,GAAG,YAAY,QAAQ,QAAQ,CAAC;AAG7D,MAAI,EAAE,UAAU,EAAE,cAAc;GAC9B,MAAM,KAAK,yBAAyB,UAAU,GAAG,OAAO,aAAa,KAAK,iBAAiB,YAAY,QAAQ;AAC/G,wBAAqB,KAAK,GAAG;AAC7B,qBAAkB,GAAG;;EAGvB,MAAM,UAAU,OAAO;EACvB,MAAM,UAAW,EAAE,UAAU,OAAO,UAAU,SAAS,SAAS;EAGhE,MAAM,QAFS,WAAW,IAAI,UAAU,YAAY,SAAS,QAAQ,GAAG,OAAU,EAE5D,OAAO,KAAI,MAAK;GAEpC,MAAMC,UAAQ,OAAO,IAAI,EAAE,MAAM;GACjC,MAAMC,QAAQ,OAAO,IAAI,EAAE,IAAI;GAC/B,MAAMC,UAAQ,IAAI,OAAe;AACjC,UAAOF,QAAM,SAASC,MAAI,EAAE;AAC1B,YAAM,KAAKD,QAAM,MAAM,CAAC;AACxB,YAAM,IAAI,GAAG,OAAO;;AAEtB,UAAOE;IACP,CAAC,MAAM,CACN,KAAK,KAAK;EAEb,MAAM,YAAY,EAAE,YAAY,OAAO,YAAY,EAAE,EAClD,KAAI,MAAK,YAAY,IAAI,YAAY,EAAE,IAAI,QAAQ,CAAC,EAAE,IAAI,CAC1D,QAAQ,MAAmB,CAAC,CAAC,EAAE,CAC/B,KAAK,KAAK;EAEb,MAAM,SAAS,EAAE,eAA4C,EAAE,EAC5D,OAAO,QAAQ,CACf,KAAI,MAAK,GAAG,IAAI,GAAG,YAAY,GAAG,QAAQ,GAAG,CAC7C,KAAK,KAAK;AAEb,SAAO;GACL,OAAiB,YAAY,MAAM;GACnC,WAAiB,MAAM,OAAO,OAAO;GACrC,QAAiB,IAAI,KAAK,OAAO,UAAU;GAC3C,gBAAiB;GACA;GACjB,QAAiB;GACjB,QAAiB;GACjB,QAAiB;GACA;GACjB,WAAiB;GACjB,aAAiB,GAAG,IAAI,GAAG,YAAY,GAAG,QAAQ;GACnD;GACD,CACD,QAAO,MAAK,KAAK,KAAK;CAMzB,MAAM,KAAK,KAAK,MAAM,UAAU;AAChC,MAAK,MAAM,kBAAkB,IAAI,KAAK,MAAM,cAAc,qBAAqB,EAAE,0BAA0B;AAC3G,MAAK,MAAM,kBAAkB,IAAI,KAAK,MAAM,cAAc,MAAM,EAAiB,WAAW;AAC5F,MAAK,MAAM,kBAAkB,IAAI,KAAK,MAAM,cAAc,UAAU,EAAa,eAAe;AAEhG,QAAO"}
@@ -5,12 +5,13 @@ import { Options, Types } from "./file/types/index.js";
5
5
  import { Map } from "./file/index.js";
6
6
  import { Types as Types$1 } from "./api/types/index.js";
7
7
  import { Map as Map$1 } from "./api/index.js";
8
+ import "../index.js";
8
9
 
9
10
  //#region src/SchoolSoft/index.d.ts
10
11
  declare class SchoolSoftMap {
11
12
  static to: typeof export_default;
12
13
  static from: {
13
- schedules: (input: Event[], options?: Options) => Partial<Types$2.serializedWithoutInternalId.schedule>;
14
+ schedules: (input: Event[], options?: Options) => Partial<Types$2.SerializedWithOptionalId.Schedule>;
14
15
  };
15
16
  static File: typeof Map;
16
17
  static Api: typeof Map$1;
@@ -1,9 +1,10 @@
1
1
  import { BaseOptions } from "../../../common/types.js";
2
2
  import { Types } from "../../../core/types/index.js";
3
+ import "../../../index.js";
3
4
 
4
5
  //#region src/Schoolity/txt/to/index.d.ts
5
6
  declare class export_default {
6
- static schedules: (data: Types.mixed.schedule, options?: BaseOptions) => string;
7
+ static schedules: (data: Types.Mixed.Schedule, options?: BaseOptions) => string;
7
8
  }
8
9
  //#endregion
9
10
  export { export_default };
@@ -218,10 +218,8 @@ var schedules_default = (data, options = {}) => {
218
218
  const totalHoursRegex = /(\d+) hrs/;
219
219
  const weekTimeRegex = /(\d+) min\/week/;
220
220
  const c = courses?.map((course) => {
221
- const teacherIds = course.teachers?.map((x) => getVertexId(x.to, options));
222
- const teachers$1 = teacherIds?.map((id) => teacherMap.get(id)).filter((x) => x != null) ?? [];
223
- const groupIds = course.groups?.map((x) => getVertexId(x.to, options));
224
- const groups$1 = groupIds?.map((id) => groupMap.get(id)).filter((x) => x != null) ?? [];
221
+ const teachers$1 = (course.teachers?.map((x) => getVertexId(x.to, options)))?.map((id) => teacherMap.get(id)).filter((x) => x != null) ?? [];
222
+ const groups$1 = (course.groups?.map((x) => getVertexId(x.to, options)))?.map((id) => groupMap.get(id)).filter((x) => x != null) ?? [];
225
223
  const syllabus = course.syllabus;
226
224
  const subject = syllabus && typeof syllabus == "object" ? "courseCode" in syllabus ? syllabus.subjectCode ?? course.subject : course.subject ?? ("subjectName" in syllabus ? syllabus.subjectName : void 0) : course.subject;
227
225
  return {
@@ -266,14 +264,9 @@ var schedules_default = (data, options = {}) => {
266
264
  let period = event.period == null ? course?.period : event.period;
267
265
  if (isString(period)) period = periodMap.get(period);
268
266
  if (period && !("ranges" in period)) period = void 0;
269
- const t$1 = event.teachers == null ? course?.teachers : event.teachers;
270
- const teacherIds = t$1?.map((x) => getVertexId(x.to, options));
271
- const teachers$1 = teacherIds?.map((id) => teacherMap.get(id)).filter(Boolean) ?? [];
272
- const g$1 = event.groups == null ? course?.groups : event.groups;
273
- const groupIds = g$1?.map((x) => getVertexId(x.to, options));
274
- const groups$1 = groupIds?.map((id) => groupMap.get(id)).filter(Boolean) ?? [];
275
- const locationIds = event.inLocations?.map((x) => x ? getVertexId(x, options) : null).filter((x) => x != null);
276
- const locations$1 = locationIds?.map((id) => locationMap.get(id)).filter(Boolean) ?? [];
267
+ const teachers$1 = ((event.teachers == null ? course?.teachers : event.teachers)?.map((x) => getVertexId(x.to, options)))?.map((id) => teacherMap.get(id)).filter(Boolean) ?? [];
268
+ const groups$1 = ((event.groups == null ? course?.groups : event.groups)?.map((x) => getVertexId(x.to, options)))?.map((id) => groupMap.get(id)).filter(Boolean) ?? [];
269
+ const locations$1 = (event.inLocations?.map((x) => x ? getVertexId(x, options) : null).filter((x) => x != null))?.map((id) => locationMap.get(id)).filter(Boolean) ?? [];
277
270
  const dayOfWeek = moment.utc(event.start).toDate().toLocaleDateString("sv-SE", {
278
271
  weekday: "long",
279
272
  timeZone: "UTC"
@@ -1 +1 @@
1
- {"version":3,"file":"schedules.js","names":["s","teachers","groups","t","g","locations","allWeeks: moment.Moment[]","index"],"sources":["../../../../src/Schoolity/txt/to/schedules.ts"],"sourcesContent":["import Papa from 'papaparse';\nimport moment from 'moment';\nimport { isString } from 'lodash-es';\nimport type { Types as MongooseTypes } from 'mongoose';\nimport { isObjectIdOrHexString } from 'mongoose';\nimport type { CoreTypes } from '../../../core';\nimport type { BaseOptions } from '../../../common/types';\nimport { getVertexId } from '../../../core/util';\n\nconst papaOptions = {\n quotes: false, //or array of booleans\n quoteChar: '\"',\n escapeChar: '\"',\n delimiter: '\\t',\n header: true,\n newline: '\\r\\n',\n skipEmptyLines: false, //other option is 'greedy', meaning skip delimiters, quotes, and whitespace.\n // columns: null //or array of strings\n} as Papa.UnparseConfig;\n\nconst uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nexport default (\n data: CoreTypes.mixed.schedule,\n options: BaseOptions = {}\n): string => {\n const { locations, teachers, groups, persons, events, courses, periods, syllabuses, divisions } = data;\n const { start, end, displayName } = divisions ?? data as unknown as CoreTypes.mixed.division;\n\n const startYear = moment.utc(start).year ();\n const startMonth = moment.utc(start).month();\n\n const courseMap = new Map(data.courses ?.map(x => [getVertexId(x, options), x]));\n const periodMap = new Map(data.periods ?.map(x => [getVertexId(x, options), x]));\n const teacherMap = new Map(data.teachers ?.map(x => [getVertexId(x, options), x]));\n const groupMap = new Map(data.groups ?.map(x => [getVertexId(x, options), x]));\n const locationMap = new Map(data.locations ?.map(x => [getVertexId(x, options), x]));\n const syllabusMap = new Map(data.syllabuses?.map(x => [getVertexId(x, options), x]));\n\n // Stupid thing Schoolity wants (Nikos responsible for future bugs)\n // This overrides the normal behavior for gr. So basically if a course has a subject it will always use that for subjectCode and fulltext, even if it has a syllabus with different values.\n // In the case where a course has a syllabus but no subject it will use the regular behavior.\n\n const subjectSyllabusMap = new Map<string, { subjectCode: string, guid?: string, fullText: string }>();\n if (courses) {\n for (const course of courses) {\n const subject = course.subject;\n const syllabus = course.syllabus;\n if (subject) {\n // If the course has a subject, we want to use that instead of syllabus. This is because Schoolity is stupid. Also note that this is endorsed by Nikos. :(\n if (!subjectSyllabusMap.has(subject)) {\n subjectSyllabusMap.set(subject, {\n subjectCode: subject,\n fullText: subject,\n guid: typeof syllabus == 'object' && 'ids' in syllabus ? syllabus?.ids : undefined\n });\n }\n } else if (typeof syllabus == 'object' && 'subjectCode' in syllabus && syllabus.subjectCode && !syllabus.courseCode) {\n // If the course has a syllabus but no subject, we want to use the syllabus id as the identifier\n // and not the course id. This is because Schoolity expects the syllabus to be unique across all courses.\n if (!subjectSyllabusMap.has(getVertexId(syllabus, options))) {\n subjectSyllabusMap.set(getVertexId(syllabus, options), {\n subjectCode: syllabus.subjectName, // Use subjectName as subjectCode (Nikos responsible for future bugs)\n fullText: syllabus.subjectName,\n guid: syllabus.ids\n });\n };\n }\n };\n }\n\n // Set cvs to the source section\n let csv = `[Source]${papaOptions.newline}ApplicationVerMajor=4${papaOptions.newline}ApplicationVerMinor=0${papaOptions.newline}DatabaseRevNo=527${papaOptions.newline}CurrentNovaschemDatabase=${papaOptions.newline}User=${papaOptions.newline}`;\n csv += `SchoolID=RS${papaOptions.newline}School=${displayName}${papaOptions.newline}County=RS${papaOptions.newline}`;\n csv += `BaseYear=${startYear}${papaOptions.newline}OffsetYear=0${papaOptions.newline}OffsetMonth=${startMonth}${papaOptions.newline}CreationDate=${moment().format('YYYY-MM-DD')}${papaOptions.newline}${papaOptions.newline}`;\n // add destination section to csv\n csv += `[Destination]${papaOptions.newline}Application=${papaOptions.newline}ApplicationID=${papaOptions.newline}${papaOptions.newline}`;\n\n // add database options to csv\n csv += `[DatabaseOptions]${papaOptions.newline}Update=TRUE${papaOptions.newline}AddNew=TRUE${papaOptions.newline}${papaOptions.newline}`;\n\n // start tables section\n csv += `[Tables]${papaOptions.newline}${papaOptions.newline}`;\n\n // append locations to csv\n const l = locations?.map(location => {\n return {\n 'Room (6601)': location.displayName!,\n 'GUID (5800)': (location.ids && uuid.test(location.ids)) ? `{${location.ids}}` : '',\n 'Category (6602)': location.tags?.find(tag => tag.type == 'category')?.value ?? '',\n 'SeatingCapacity (6607)': location.maximumCapacity,\n };\n }) ?? [];\n csv += `${papaOptions.newline}Room (6600)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (l.length) {\n csv += Papa.unparse(l, papaOptions);\n } else {\n csv += ['Room (6601)', 'GUID (5800)', 'Category (6602)', 'SeatingCapacity (6607)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append subjects to csv\n // First add all subjects from syllabuses with courses (they should follow the standard)\n const subjectSyllabuses = syllabuses?.reduce((unique, syllabus) => {\n if (syllabus.subjectCode && syllabus.courseCode && !unique.seen.has(syllabus.subjectCode)) {\n unique.seen.add(syllabus.subjectCode);\n unique.result.push({\n 'Subject (6401)': syllabus.subjectCode,\n 'GUID (5800)': syllabus.ids,\n 'Category (6402)': '',\n 'FullText (6403)': syllabus.subjectName,\n 'BackgroundColor (6432)': '',\n 'TextColor (6433)': '',\n 'EvaluationNumber (6429)': ''\n });\n }\n return unique;\n }, {\n seen: new Set<string>(),\n result: [] as Array<{\n 'Subject (6401)': string;\n 'GUID (5800)': string | undefined;\n 'Category (6402)': string | undefined;\n 'FullText (6403)': string;\n 'BackgroundColor (6432)': string | undefined;\n 'TextColor (6433)': string | undefined;\n 'EvaluationNumber (6429)': string | undefined;\n }>\n })?.result ?? [];\n // Then add all subjects from the subjectSyllabusMap (they should follow the Nikos standard, that is, the stupid one)\n subjectSyllabuses.push(...Array.from(subjectSyllabusMap.values()).map(subject => {\n return {\n 'Subject (6401)': subject.subjectCode,\n 'GUID (5800)': subject.guid,\n 'Category (6402)': '',\n 'FullText (6403)': subject.fullText,\n 'BackgroundColor (6432)': '',\n 'TextColor (6433)': '',\n 'EvaluationNumber (6429)': ''\n };\n }));\n\n csv += `${papaOptions.newline}Subject (6400)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (subjectSyllabuses.length) {\n csv += Papa.unparse(subjectSyllabuses, papaOptions);\n } else {\n csv += ['Subject (6401)', 'GUID (5800)', 'Category (6402)', 'FullText (6403)', 'BackgroundColor (6432)', 'TextColor (6433)', 'EvaluationNumber (6429)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append teachers to csv\n const t = teachers?.map(teacher => {\n return {\n 'Teacher (6001)': teacher.signature,\n 'GUID (5800)': '',\n 'Category (6002)': '',\n 'PersonalCode (6028)': 'person' in teacher && typeof teacher.person == 'object' && 'SSN' in teacher.person ? (teacher.person?.SSN?.value ?? '') : '',\n 'LastName (6003)': '',\n 'Title (6006)': '',\n 'FirstName (6004)': '',\n 'Phone (6033)': '',\n 'EMail (6034)': '',\n 'EvaluationNumber (6014)': ''\n };\n }) ?? [];\n csv += `${papaOptions.newline}Teacher (6000)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (t.length) {\n csv += Papa.unparse(t, papaOptions);\n } else {\n csv += ['Teacher (6001)', 'GUID (5800)', 'Category (6002)', 'PersonalCode (6028)', 'LastName (6003)', 'Title (6006)', 'FirstName (6004)', 'Phone (6033)', 'EMail (6034)', 'EvaluationNumber (6014)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append students to csv\n const s = persons?.filter(person => {\n return person.type != 'Teacher';\n }).filter((s) => Boolean(s.SSN)).map(person => {\n return {\n 'Student (7201)': person.SSN?.value,\n 'GUID (5800)': (person.ids && uuid.test(person.ids)) ? `{${person.ids}}` : '',\n 'Category (7305)': '',\n 'LastName (7202)': person.lastName ?? '',\n 'FirstName (7211)': person.firstName ?? '',\n 'EMail (7215)': person.emails?.[0]?.value ?? ''\n };\n }) ?? [];\n csv += `${papaOptions.newline}Student (7200)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (s.length) {\n csv += Papa.unparse(s, papaOptions);\n } else {\n csv += ['Student (7201)', 'GUID (5800)', 'Category (7305)', 'LastName (7202)', 'FirstName (7211)', 'EMail (7215)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // create a map of students.id to students.SSN\n const studentMap = new Map(persons?.filter(x => x.type != 'Teacher').map(x => [getVertexId(x, options), x.SSN?.value ?? '']));\n\n // append groups to csv\n const g = groups?.map(group => {\n return {\n 'Group (6201)': group.displayName!,\n 'GUID (5800)': (group.ids && uuid.test(group.ids)) ? `{${group.ids}}` : '',\n 'Class (6210)': group.species == 'class' ? 1 : 0,\n 'Teacher (6204)': '',\n 'IClass (6206)': '',\n 'Student (6205)': group.members?.map(x => studentMap.get(getVertexId(x, options))).filter(Boolean).join(',')\n };\n }) ?? [];\n csv += `${papaOptions.newline}Group (6200)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (g.length) {\n csv += Papa.unparse(g, papaOptions);\n } else {\n csv += ['Group (6201)', 'GUID (5800)', 'Class (6210)', 'Teacher (6204)', 'IClass (6206)', 'Student (6205)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append courses to csv (only if there actually are courses, since its very important to Schoolity that the course table isn't present for GR)\n const courseSyllabuses = syllabuses?.filter(syllabus => !!syllabus.courseName).map(syllabus => {\n return {\n 'Course (7601)': syllabus.courseCode,\n 'GUID (5800)': syllabus.ids,\n 'FullText (7602)': syllabus.courseName,\n 'Subject (7603)': syllabus.subjectCode ?? '',\n 'Points (7604)': syllabus.points\n };\n }) ?? [];\n if (courseSyllabuses.length) {\n csv += `${papaOptions.newline}Course (7600)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n csv += Papa.unparse(courseSyllabuses, papaOptions);\n csv += papaOptions.newline;\n }\n // else {\n // csv += ['PK (7100)', 'GUID (5800)', 'DayOfWeek (7101)', 'Starttime (7102)', 'Length (7115)', 'Course (7106)', 'Subject (7103)', 'Period (7108)', 'Week (7109)', 'ActualWeeks (7167)'].join(options.delimiter);\n // }\n\n // append periods to csv\n const p = periods?.map(period => {\n return {\n 'Period (8001)': period.displayName!,\n 'GUID (5800)': (period.ids && uuid.test(period.ids)) ? `{${period.ids}}` : '',\n 'TextBelowSchedule (8002)': period.displayName!,\n 'Category (8006)': '',\n 'Calendar (8005)': period.ranges?.map(range => `${moment.utc(range.start).format('D/M')}-${moment.utc(range.end).format('D/M')}`).join(', ')\n };\n }) ?? [];\n csv += `${papaOptions.newline}Period (8000)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (p.length) {\n csv += Papa.unparse(p, papaOptions);\n } else {\n csv += ['Period (8001)', 'GUID (5800)', 'TextBelowSchedule (8002)', 'Category (8006)', 'Calendar (8005)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append TA to csv\n const totalHoursRegex = /(\\d+) hrs/;\n const weekTimeRegex = /(\\d+) min\\/week/;\n const c = courses?.map(course => {\n // Only use deserialize teachers\n const teacherIds = course.teachers?.map(x => getVertexId(x.to, options));\n const teachers = teacherIds?.map(id => teacherMap.get(id)).filter(x => x != null) ?? [];\n\n // Only use deserialize groups\n const groupIds = course.groups?.map(x => getVertexId(x.to, options));\n const groups = groupIds?.map(id => groupMap.get(id)).filter(x => x != null) ?? [];\n\n // Only use deserialize syllabus\n const syllabus = course.syllabus;\n const subject = syllabus && typeof syllabus == 'object'\n ? 'courseCode' in syllabus\n ? syllabus.subjectCode ?? course.subject\n : course.subject ?? ('subjectName' in syllabus ? syllabus.subjectName : undefined)\n : course.subject;\n\n return {\n 'PK (8200)': '',\n 'GUID (5800)': course.ids,\n 'OriginalRecord (8224)': '1',\n 'CreateLesson (8227)': '1',\n 'Course (8202)': typeof syllabus == 'object' && 'courseCode' in syllabus ? syllabus?.courseCode : undefined,\n 'Subject (8209)': subject ?? '', // Nikos ansvarig för framtida buggar\n 'Teacher (8210)': teachers?.map(x => x.signature ).filter(Boolean).join(','),\n 'Group (8203)': groups ?.map(x => x.displayName).filter(Boolean).join(','),\n 'TotalHours (8204)': (course.plannedDuration && totalHoursRegex.test(course.plannedDuration)) ? totalHoursRegex.exec(course.plannedDuration)![1] : '',\n 'Weektime (8208)': (course.plannedDuration && weekTimeRegex.test(course.plannedDuration)) ? weekTimeRegex.exec(course.plannedDuration)![1] : '',\n 'Blockname (8215)': '',\n 'Period (8206)': '',\n 'Week (8207)': '',\n 'NotPeriod (8212)': '',\n 'NotWeek (8213)': ''\n };\n }) ?? [];\n csv += `${papaOptions.newline}TA (8200)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (c.length) {\n csv += Papa.unparse(c, papaOptions);\n } else {\n csv += ['Course (8202)', 'GUID (5800)', 'Subject (8209)', 'Teacher (8210)', 'Group (8203)', 'TotalHours (8204)', 'Weektime (8208)', 'Blockname (8215)', 'Period (8206)', 'Week (8207)', 'NotPeriod (8212)', 'NotWeek (8213)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append lessons to csv\n const e = events\n // ?.filter(x => !isNaN(Date.parse(x.start?.toString() ?? '')))\n ?.map((event, index) => {\n if (!event.start || !event.end) return;\n\n const courseId = event.course ? getVertexId(event.course, options) : undefined;\n const course = courseId ? courseMap.get(courseId) : undefined;\n\n // Only use deserialize period\n let period = event.period == null ? course?.period : event.period;\n if (isString(period))\n period = periodMap.get(period);\n if ((period && !('ranges' in period)))\n period = undefined;\n\n // Only use deserialize teachers\n const t = event.teachers == null ? course?.teachers : event.teachers;\n const teacherIds = t?.map(x => getVertexId(x.to, options));\n const teachers = teacherIds?.map(id => teacherMap.get(id)).filter(Boolean) ?? [];\n\n // Only use deserialize groups\n const g = event.groups == null ? course?.groups : event.groups;\n const groupIds = g?.map(x => getVertexId(x.to, options));\n const groups = groupIds?.map(id => groupMap.get(id)).filter(Boolean) ?? [];\n\n // Only use deserialize locations\n const locationIds = event.inLocations?.map(x => x ? getVertexId(x, options) : null).filter(x => x != null);\n const locations = locationIds?.map(id => locationMap.get(id)).filter(Boolean) ?? [];\n const dayOfWeek = moment.utc(event.start).toDate().toLocaleDateString('sv-SE', { weekday: 'long', timeZone: 'UTC' });\n\n // Syllabus of the course\n const syllabusId = isString(course?.syllabus) ? course.syllabus : (course?.syllabus && isObjectIdOrHexString(course?.syllabus)) ? (course?.syllabus as MongooseTypes.ObjectId | string).toString() : undefined;\n const syllabus = syllabusId ? syllabusMap.get(syllabusId) : course?.syllabus as CoreTypes.syllabus | undefined;\n const isCourseSyllabus = !!syllabus?.courseCode;\n\n // From start and end, get all weeks that the schedule spans\n const allWeeks: moment.Moment[] = [];\n const endDate = moment.utc(end);\n const currentDate = moment.utc(start);\n while (currentDate.isBefore(endDate) || currentDate.isSame(endDate, 'day')) {\n allWeeks.push(currentDate.clone());\n currentDate.add(1, 'week');\n }\n\n const actualWeeks = period\n ? period?.ranges?.map(range => `${moment.utc(range.start).week()}-${moment.utc(range.end).week()}`).join(',')\n : allWeeks.map((week, index) => {\n const nextWeek = index < allWeeks.length - 1 ? allWeeks[index + 1] : week.clone().add(1, 'week');\n return `${week.week()}-${nextWeek.week()}`;\n }).join(',');\n\n // capitalize first letter of dayOfWeek\n const dayOfWeekCapitalized = dayOfWeek.charAt(0).toUpperCase() + dayOfWeek.slice(1);\n return {\n 'PK (7100)': index + 1,\n 'GUID (5800)': (event.ids && uuid.test(event.ids)) ? `{${event.ids}}` : '',\n 'DayOfWeek (7101)': dayOfWeekCapitalized,\n 'Starttime (7102)': moment.utc(event.start).format('HH:mm'),\n 'Length (7115)': event.duration,\n 'Course (7106)': syllabus?.courseCode,\n 'Subject (7103)': isCourseSyllabus ? (syllabus?.subjectCode ?? course?.subject) : (course?.subject ?? syllabus?.subjectName) ?? '', // Nikos ansvarig för framtida buggar\n 'Teacher (7104)': teachers ?.map(x => x?.signature ).filter(Boolean).join(','),\n 'Group (7105)': groups ?.map(x => x?.displayName).filter(Boolean).join(','),\n 'Room (7107)': locations?.map(x => x?.displayName).filter(Boolean).join(','),\n 'Period (7108)': '',\n 'Week (7109)': '',\n 'ActualWeeks (7167)': actualWeeks\n };\n }) ?? [];\n csv += `${papaOptions.newline}Lesson (7100)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (e.length) {\n csv += Papa.unparse(e, papaOptions);\n } else {\n csv += ['PK (7100)', 'GUID (5800)', 'DayOfWeek (7101)', 'Starttime (7102)', 'Length (7115)', 'Course (7106)', 'Subject (7103)', 'Period (7108)', 'Week (7109)', 'ActualWeeks (7167)'].join(papaOptions.delimiter);\n }\n\n return csv;\n};"],"mappings":"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"}
1
+ {"version":3,"file":"schedules.js","names":["s","teachers","groups","locations","allWeeks: moment.Moment[]","index"],"sources":["../../../../src/Schoolity/txt/to/schedules.ts"],"sourcesContent":["import Papa from 'papaparse';\nimport moment from 'moment';\nimport { isString } from 'lodash-es';\nimport type { Types as MongooseTypes } from 'mongoose';\nimport { isObjectIdOrHexString } from 'mongoose';\nimport type { CoreTypes } from '../../../core';\nimport type { BaseOptions } from '../../../common/types';\nimport { getVertexId } from '../../../core/util';\n\nconst papaOptions = {\n quotes: false, //or array of booleans\n quoteChar: '\"',\n escapeChar: '\"',\n delimiter: '\\t',\n header: true,\n newline: '\\r\\n',\n skipEmptyLines: false, //other option is 'greedy', meaning skip delimiters, quotes, and whitespace.\n // columns: null //or array of strings\n} as Papa.UnparseConfig;\n\nconst uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nexport default (\n data: CoreTypes.Mixed.Schedule,\n options: BaseOptions = {}\n): string => {\n const { locations, teachers, groups, persons, events, courses, periods, syllabuses, divisions } = data;\n const { start, end, displayName } = divisions ?? data as unknown as CoreTypes.Mixed.Division;\n\n const startYear = moment.utc(start).year ();\n const startMonth = moment.utc(start).month();\n\n const courseMap = new Map(data.courses ?.map(x => [getVertexId(x, options), x]));\n const periodMap = new Map(data.periods ?.map(x => [getVertexId(x, options), x]));\n const teacherMap = new Map(data.teachers ?.map(x => [getVertexId(x, options), x]));\n const groupMap = new Map(data.groups ?.map(x => [getVertexId(x, options), x]));\n const locationMap = new Map(data.locations ?.map(x => [getVertexId(x, options), x]));\n const syllabusMap = new Map(data.syllabuses?.map(x => [getVertexId(x, options), x]));\n\n // Stupid thing Schoolity wants (Nikos responsible for future bugs)\n // This overrides the normal behavior for gr. So basically if a course has a subject it will always use that for subjectCode and fulltext, even if it has a syllabus with different values.\n // In the case where a course has a syllabus but no subject it will use the regular behavior.\n\n const subjectSyllabusMap = new Map<string, { subjectCode: string, guid?: string, fullText: string }>();\n if (courses) {\n for (const course of courses) {\n const subject = course.subject;\n const syllabus = course.syllabus;\n if (subject) {\n // If the course has a subject, we want to use that instead of syllabus. This is because Schoolity is stupid. Also note that this is endorsed by Nikos. :(\n if (!subjectSyllabusMap.has(subject)) {\n subjectSyllabusMap.set(subject, {\n subjectCode: subject,\n fullText: subject,\n guid: typeof syllabus == 'object' && 'ids' in syllabus ? syllabus?.ids : undefined\n });\n }\n } else if (typeof syllabus == 'object' && 'subjectCode' in syllabus && syllabus.subjectCode && !syllabus.courseCode) {\n // If the course has a syllabus but no subject, we want to use the syllabus id as the identifier\n // and not the course id. This is because Schoolity expects the syllabus to be unique across all courses.\n if (!subjectSyllabusMap.has(getVertexId(syllabus, options))) {\n subjectSyllabusMap.set(getVertexId(syllabus, options), {\n subjectCode: syllabus.subjectName, // Use subjectName as subjectCode (Nikos responsible for future bugs)\n fullText: syllabus.subjectName,\n guid: syllabus.ids\n });\n };\n }\n };\n }\n\n // Set cvs to the source section\n let csv = `[Source]${papaOptions.newline}ApplicationVerMajor=4${papaOptions.newline}ApplicationVerMinor=0${papaOptions.newline}DatabaseRevNo=527${papaOptions.newline}CurrentNovaschemDatabase=${papaOptions.newline}User=${papaOptions.newline}`;\n csv += `SchoolID=RS${papaOptions.newline}School=${displayName}${papaOptions.newline}County=RS${papaOptions.newline}`;\n csv += `BaseYear=${startYear}${papaOptions.newline}OffsetYear=0${papaOptions.newline}OffsetMonth=${startMonth}${papaOptions.newline}CreationDate=${moment().format('YYYY-MM-DD')}${papaOptions.newline}${papaOptions.newline}`;\n // add destination section to csv\n csv += `[Destination]${papaOptions.newline}Application=${papaOptions.newline}ApplicationID=${papaOptions.newline}${papaOptions.newline}`;\n\n // add database options to csv\n csv += `[DatabaseOptions]${papaOptions.newline}Update=TRUE${papaOptions.newline}AddNew=TRUE${papaOptions.newline}${papaOptions.newline}`;\n\n // start tables section\n csv += `[Tables]${papaOptions.newline}${papaOptions.newline}`;\n\n // append locations to csv\n const l = locations?.map(location => {\n return {\n 'Room (6601)': location.displayName!,\n 'GUID (5800)': (location.ids && uuid.test(location.ids)) ? `{${location.ids}}` : '',\n 'Category (6602)': location.tags?.find(tag => tag.type == 'category')?.value ?? '',\n 'SeatingCapacity (6607)': location.maximumCapacity,\n };\n }) ?? [];\n csv += `${papaOptions.newline}Room (6600)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (l.length) {\n csv += Papa.unparse(l, papaOptions);\n } else {\n csv += ['Room (6601)', 'GUID (5800)', 'Category (6602)', 'SeatingCapacity (6607)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append subjects to csv\n // First add all subjects from syllabuses with courses (they should follow the standard)\n const subjectSyllabuses = syllabuses?.reduce((unique, syllabus) => {\n if (syllabus.subjectCode && syllabus.courseCode && !unique.seen.has(syllabus.subjectCode)) {\n unique.seen.add(syllabus.subjectCode);\n unique.result.push({\n 'Subject (6401)': syllabus.subjectCode,\n 'GUID (5800)': syllabus.ids,\n 'Category (6402)': '',\n 'FullText (6403)': syllabus.subjectName,\n 'BackgroundColor (6432)': '',\n 'TextColor (6433)': '',\n 'EvaluationNumber (6429)': ''\n });\n }\n return unique;\n }, {\n seen: new Set<string>(),\n result: [] as Array<{\n 'Subject (6401)': string;\n 'GUID (5800)': string | undefined;\n 'Category (6402)': string | undefined;\n 'FullText (6403)': string;\n 'BackgroundColor (6432)': string | undefined;\n 'TextColor (6433)': string | undefined;\n 'EvaluationNumber (6429)': string | undefined;\n }>\n })?.result ?? [];\n // Then add all subjects from the subjectSyllabusMap (they should follow the Nikos standard, that is, the stupid one)\n subjectSyllabuses.push(...Array.from(subjectSyllabusMap.values()).map(subject => {\n return {\n 'Subject (6401)': subject.subjectCode,\n 'GUID (5800)': subject.guid,\n 'Category (6402)': '',\n 'FullText (6403)': subject.fullText,\n 'BackgroundColor (6432)': '',\n 'TextColor (6433)': '',\n 'EvaluationNumber (6429)': ''\n };\n }));\n\n csv += `${papaOptions.newline}Subject (6400)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (subjectSyllabuses.length) {\n csv += Papa.unparse(subjectSyllabuses, papaOptions);\n } else {\n csv += ['Subject (6401)', 'GUID (5800)', 'Category (6402)', 'FullText (6403)', 'BackgroundColor (6432)', 'TextColor (6433)', 'EvaluationNumber (6429)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append teachers to csv\n const t = teachers?.map(teacher => {\n return {\n 'Teacher (6001)': teacher.signature,\n 'GUID (5800)': '',\n 'Category (6002)': '',\n 'PersonalCode (6028)': 'person' in teacher && typeof teacher.person == 'object' && 'SSN' in teacher.person ? (teacher.person?.SSN?.value ?? '') : '',\n 'LastName (6003)': '',\n 'Title (6006)': '',\n 'FirstName (6004)': '',\n 'Phone (6033)': '',\n 'EMail (6034)': '',\n 'EvaluationNumber (6014)': ''\n };\n }) ?? [];\n csv += `${papaOptions.newline}Teacher (6000)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (t.length) {\n csv += Papa.unparse(t, papaOptions);\n } else {\n csv += ['Teacher (6001)', 'GUID (5800)', 'Category (6002)', 'PersonalCode (6028)', 'LastName (6003)', 'Title (6006)', 'FirstName (6004)', 'Phone (6033)', 'EMail (6034)', 'EvaluationNumber (6014)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append students to csv\n const s = persons?.filter(person => {\n return person.type != 'Teacher';\n }).filter((s) => Boolean(s.SSN)).map(person => {\n return {\n 'Student (7201)': person.SSN?.value,\n 'GUID (5800)': (person.ids && uuid.test(person.ids)) ? `{${person.ids}}` : '',\n 'Category (7305)': '',\n 'LastName (7202)': person.lastName ?? '',\n 'FirstName (7211)': person.firstName ?? '',\n 'EMail (7215)': person.emails?.[0]?.value ?? ''\n };\n }) ?? [];\n csv += `${papaOptions.newline}Student (7200)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (s.length) {\n csv += Papa.unparse(s, papaOptions);\n } else {\n csv += ['Student (7201)', 'GUID (5800)', 'Category (7305)', 'LastName (7202)', 'FirstName (7211)', 'EMail (7215)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // create a map of students.id to students.SSN\n const studentMap = new Map(persons?.filter(x => x.type != 'Teacher').map(x => [getVertexId(x, options), x.SSN?.value ?? '']));\n\n // append groups to csv\n const g = groups?.map(group => {\n return {\n 'Group (6201)': group.displayName!,\n 'GUID (5800)': (group.ids && uuid.test(group.ids)) ? `{${group.ids}}` : '',\n 'Class (6210)': group.species == 'class' ? 1 : 0,\n 'Teacher (6204)': '',\n 'IClass (6206)': '',\n 'Student (6205)': group.members?.map(x => studentMap.get(getVertexId(x, options))).filter(Boolean).join(',')\n };\n }) ?? [];\n csv += `${papaOptions.newline}Group (6200)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (g.length) {\n csv += Papa.unparse(g, papaOptions);\n } else {\n csv += ['Group (6201)', 'GUID (5800)', 'Class (6210)', 'Teacher (6204)', 'IClass (6206)', 'Student (6205)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append courses to csv (only if there actually are courses, since its very important to Schoolity that the course table isn't present for GR)\n const courseSyllabuses = syllabuses?.filter(syllabus => !!syllabus.courseName).map(syllabus => {\n return {\n 'Course (7601)': syllabus.courseCode,\n 'GUID (5800)': syllabus.ids,\n 'FullText (7602)': syllabus.courseName,\n 'Subject (7603)': syllabus.subjectCode ?? '',\n 'Points (7604)': syllabus.points\n };\n }) ?? [];\n if (courseSyllabuses.length) {\n csv += `${papaOptions.newline}Course (7600)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n csv += Papa.unparse(courseSyllabuses, papaOptions);\n csv += papaOptions.newline;\n }\n // else {\n // csv += ['PK (7100)', 'GUID (5800)', 'DayOfWeek (7101)', 'Starttime (7102)', 'Length (7115)', 'Course (7106)', 'Subject (7103)', 'Period (7108)', 'Week (7109)', 'ActualWeeks (7167)'].join(options.delimiter);\n // }\n\n // append periods to csv\n const p = periods?.map(period => {\n return {\n 'Period (8001)': period.displayName!,\n 'GUID (5800)': (period.ids && uuid.test(period.ids)) ? `{${period.ids}}` : '',\n 'TextBelowSchedule (8002)': period.displayName!,\n 'Category (8006)': '',\n 'Calendar (8005)': period.ranges?.map(range => `${moment.utc(range.start).format('D/M')}-${moment.utc(range.end).format('D/M')}`).join(', ')\n };\n }) ?? [];\n csv += `${papaOptions.newline}Period (8000)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (p.length) {\n csv += Papa.unparse(p, papaOptions);\n } else {\n csv += ['Period (8001)', 'GUID (5800)', 'TextBelowSchedule (8002)', 'Category (8006)', 'Calendar (8005)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append TA to csv\n const totalHoursRegex = /(\\d+) hrs/;\n const weekTimeRegex = /(\\d+) min\\/week/;\n const c = courses?.map(course => {\n // Only use deserialize teachers\n const teacherIds = course.teachers?.map(x => getVertexId(x.to, options));\n const teachers = teacherIds?.map(id => teacherMap.get(id)).filter(x => x != null) ?? [];\n\n // Only use deserialize groups\n const groupIds = course.groups?.map(x => getVertexId(x.to, options));\n const groups = groupIds?.map(id => groupMap.get(id)).filter(x => x != null) ?? [];\n\n // Only use deserialize syllabus\n const syllabus = course.syllabus;\n const subject = syllabus && typeof syllabus == 'object'\n ? 'courseCode' in syllabus\n ? syllabus.subjectCode ?? course.subject\n : course.subject ?? ('subjectName' in syllabus ? syllabus.subjectName : undefined)\n : course.subject;\n\n return {\n 'PK (8200)': '',\n 'GUID (5800)': course.ids,\n 'OriginalRecord (8224)': '1',\n 'CreateLesson (8227)': '1',\n 'Course (8202)': typeof syllabus == 'object' && 'courseCode' in syllabus ? syllabus?.courseCode : undefined,\n 'Subject (8209)': subject ?? '', // Nikos ansvarig för framtida buggar\n 'Teacher (8210)': teachers?.map(x => x.signature ).filter(Boolean).join(','),\n 'Group (8203)': groups ?.map(x => x.displayName).filter(Boolean).join(','),\n 'TotalHours (8204)': (course.plannedDuration && totalHoursRegex.test(course.plannedDuration)) ? totalHoursRegex.exec(course.plannedDuration)![1] : '',\n 'Weektime (8208)': (course.plannedDuration && weekTimeRegex.test(course.plannedDuration)) ? weekTimeRegex.exec(course.plannedDuration)![1] : '',\n 'Blockname (8215)': '',\n 'Period (8206)': '',\n 'Week (8207)': '',\n 'NotPeriod (8212)': '',\n 'NotWeek (8213)': ''\n };\n }) ?? [];\n csv += `${papaOptions.newline}TA (8200)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (c.length) {\n csv += Papa.unparse(c, papaOptions);\n } else {\n csv += ['Course (8202)', 'GUID (5800)', 'Subject (8209)', 'Teacher (8210)', 'Group (8203)', 'TotalHours (8204)', 'Weektime (8208)', 'Blockname (8215)', 'Period (8206)', 'Week (8207)', 'NotPeriod (8212)', 'NotWeek (8213)'].join(papaOptions.delimiter);\n }\n csv += papaOptions.newline;\n\n // append lessons to csv\n const e = events\n // ?.filter(x => !isNaN(Date.parse(x.start?.toString() ?? '')))\n ?.map((event, index) => {\n if (!event.start || !event.end) return;\n\n const courseId = event.course ? getVertexId(event.course, options) : undefined;\n const course = courseId ? courseMap.get(courseId) : undefined;\n\n // Only use deserialize period\n let period = event.period == null ? course?.period : event.period;\n if (isString(period))\n period = periodMap.get(period);\n if ((period && !('ranges' in period)))\n period = undefined;\n\n // Only use deserialize teachers\n const t = event.teachers == null ? course?.teachers : event.teachers;\n const teacherIds = t?.map(x => getVertexId(x.to, options));\n const teachers = teacherIds?.map(id => teacherMap.get(id)).filter(Boolean) ?? [];\n\n // Only use deserialize groups\n const g = event.groups == null ? course?.groups : event.groups;\n const groupIds = g?.map(x => getVertexId(x.to, options));\n const groups = groupIds?.map(id => groupMap.get(id)).filter(Boolean) ?? [];\n\n // Only use deserialize locations\n const locationIds = event.inLocations?.map(x => x ? getVertexId(x, options) : null).filter(x => x != null);\n const locations = locationIds?.map(id => locationMap.get(id)).filter(Boolean) ?? [];\n const dayOfWeek = moment.utc(event.start).toDate().toLocaleDateString('sv-SE', { weekday: 'long', timeZone: 'UTC' });\n\n // Syllabus of the course\n const syllabusId = isString(course?.syllabus) ? course.syllabus : (course?.syllabus && isObjectIdOrHexString(course?.syllabus)) ? (course?.syllabus as MongooseTypes.ObjectId | string).toString() : undefined;\n const syllabus = syllabusId ? syllabusMap.get(syllabusId) : course?.syllabus as CoreTypes.Deep.Syllabus | undefined;\n const isCourseSyllabus = !!syllabus?.courseCode;\n\n // From start and end, get all weeks that the schedule spans\n const allWeeks: moment.Moment[] = [];\n const endDate = moment.utc(end);\n const currentDate = moment.utc(start);\n while (currentDate.isBefore(endDate) || currentDate.isSame(endDate, 'day')) {\n allWeeks.push(currentDate.clone());\n currentDate.add(1, 'week');\n }\n\n const actualWeeks = period\n ? period?.ranges?.map(range => `${moment.utc(range.start).week()}-${moment.utc(range.end).week()}`).join(',')\n : allWeeks.map((week, index) => {\n const nextWeek = index < allWeeks.length - 1 ? allWeeks[index + 1] : week.clone().add(1, 'week');\n return `${week.week()}-${nextWeek.week()}`;\n }).join(',');\n\n // capitalize first letter of dayOfWeek\n const dayOfWeekCapitalized = dayOfWeek.charAt(0).toUpperCase() + dayOfWeek.slice(1);\n return {\n 'PK (7100)': index + 1,\n 'GUID (5800)': (event.ids && uuid.test(event.ids)) ? `{${event.ids}}` : '',\n 'DayOfWeek (7101)': dayOfWeekCapitalized,\n 'Starttime (7102)': moment.utc(event.start).format('HH:mm'),\n 'Length (7115)': event.duration,\n 'Course (7106)': syllabus?.courseCode,\n 'Subject (7103)': isCourseSyllabus ? (syllabus?.subjectCode ?? course?.subject) : (course?.subject ?? syllabus?.subjectName) ?? '', // Nikos ansvarig för framtida buggar\n 'Teacher (7104)': teachers ?.map(x => x?.signature ).filter(Boolean).join(','),\n 'Group (7105)': groups ?.map(x => x?.displayName).filter(Boolean).join(','),\n 'Room (7107)': locations?.map(x => x?.displayName).filter(Boolean).join(','),\n 'Period (7108)': '',\n 'Week (7109)': '',\n 'ActualWeeks (7167)': actualWeeks\n };\n }) ?? [];\n csv += `${papaOptions.newline}Lesson (7100)${papaOptions.newline}[Rows]${papaOptions.newline}`;\n if (e.length) {\n csv += Papa.unparse(e, papaOptions);\n } else {\n csv += ['PK (7100)', 'GUID (5800)', 'DayOfWeek (7101)', 'Starttime (7102)', 'Length (7115)', 'Course (7106)', 'Subject (7103)', 'Period (7108)', 'Week (7109)', 'ActualWeeks (7167)'].join(papaOptions.delimiter);\n }\n\n return csv;\n};"],"mappings":"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"}
@@ -18,10 +18,9 @@ function startAndEnd(lesson) {
18
18
  const hours = dateTimeDate.get("hours");
19
19
  const minutes = dateTimeDate.get("minutes");
20
20
  const start = generateDate(lesson.DayOfWeek, hours, minutes);
21
- const end = start.clone().add(lesson.Length, "minute");
22
21
  return {
23
22
  start,
24
- end,
23
+ end: start.clone().add(lesson.Length, "minute"),
25
24
  parked: false
26
25
  };
27
26
  }
@@ -207,12 +206,11 @@ function course_and_events_default(groups, lessons, meta, groupPlansMap, planMap
207
206
  const courses = [...courseMap].filter(([k]) => populatedCourses.has(k));
208
207
  courseMap = new Map(courses);
209
208
  }
210
- const keys = [
209
+ for (const key of [
211
210
  "groups",
212
211
  "teachers",
213
212
  "locations"
214
- ];
215
- for (const key of keys) courseMap.forEach((c, courseKey) => {
213
+ ]) courseMap.forEach((c, courseKey) => {
216
214
  const events = eventMap.get(courseKey.toString());
217
215
  const eventEntries = makeChainable(events ?? []).chain((x) => x.map((e) => e[key] ?? c[key]).filter((x$1) => x$1 != null), (x) => uniqBy(x, (x$1) => x$1.map((x$2) => "to" in x$2 ? x$2.to : x$2.locations[0]).sort().join("."))).value;
218
216
  if (eventEntries.length != 1) return;
@@ -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,QACzB,KAAI,OAAM;EACT,KAAa,EAAE,GAAG;EAClB,aAAa,EAAE;EACf,SAAa"}
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 +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"}
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 +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;EAClB,aAAa,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,UAAU;EAC5B,aAAa,EAAE;EAChB,EAAE"}
@@ -1,14 +1,15 @@
1
1
  import { InternalIdKey } from "../../../core/types/common/index.js";
2
2
  import { Types } from "../../../core/types/index.js";
3
+ import "../../../core/index.js";
3
4
  import { Types as Types$1 } from "../types/index.js";
4
5
 
5
6
  //#region src/Skola24/mdb/from/schedule.d.ts
6
7
  declare namespace OutTypes {
7
- type location = Omit<Types.serialized.location, InternalIdKey>;
8
- type teacher = Omit<Types.serialized.teacher, InternalIdKey>;
9
- type group = Omit<Types.serialized.group, InternalIdKey>;
10
- type course = Omit<Types.serialized.course, InternalIdKey>;
11
- type event = Omit<Types.serialized.event, InternalIdKey>;
8
+ type location = Omit<Types.Serialized.Location, InternalIdKey>;
9
+ type teacher = Omit<Types.Serialized.Teacher, InternalIdKey>;
10
+ type group = Omit<Types.Serialized.Group, InternalIdKey>;
11
+ type course = Omit<Types.Serialized.Course, InternalIdKey>;
12
+ type event = Omit<Types.Serialized.Event, InternalIdKey>;
12
13
  }
13
14
  type Out = {
14
15
  locations: OutTypes.location[];
@@ -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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"}