@royalschedule/maps 4.0.32 → 4.0.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) hide show
  1. package/dist/Additio/from/courses.js.map +1 -1
  2. package/dist/Additio/from/events.js.map +1 -1
  3. package/dist/Additio/from/groups.js.map +1 -1
  4. package/dist/Additio/from/index.js.map +1 -1
  5. package/dist/Additio/from/locations.js.map +1 -1
  6. package/dist/Additio/from/persons.js.map +1 -1
  7. package/dist/Additio/from/schedules.d.ts +1 -0
  8. package/dist/Additio/from/schedules.js +2 -4
  9. package/dist/Additio/from/schedules.js.map +1 -1
  10. package/dist/Additio/from/teachers.js.map +1 -1
  11. package/dist/Additio/to/index.d.ts +2 -0
  12. package/dist/Additio/to/schedules.js +2 -4
  13. package/dist/Additio/to/schedules.js.map +1 -1
  14. package/dist/Admentum/from/courses.js.map +1 -1
  15. package/dist/Admentum/from/events.js.map +1 -1
  16. package/dist/Admentum/from/groups.js.map +1 -1
  17. package/dist/Admentum/from/index.js.map +1 -1
  18. package/dist/Admentum/from/locations.js.map +1 -1
  19. package/dist/Admentum/from/persons.js.map +1 -1
  20. package/dist/Admentum/from/schedules.d.ts +1 -0
  21. package/dist/Admentum/from/schedules.js +3 -6
  22. package/dist/Admentum/from/schedules.js.map +1 -1
  23. package/dist/Admentum/from/teachers.js.map +1 -1
  24. package/dist/Admentum/to/index.d.ts +1 -0
  25. package/dist/Admentum/to/schedules.js +4 -7
  26. package/dist/Admentum/to/schedules.js.map +1 -1
  27. package/dist/Excel/index.d.ts +4 -3
  28. package/dist/Excel/v1/from/index.js +1 -1
  29. package/dist/Excel/v1/from/index.js.map +1 -1
  30. package/dist/Excel/v1/index.d.ts +1 -0
  31. package/dist/Excel/v2/from/index.js +45 -54
  32. package/dist/Excel/v2/from/index.js.map +1 -1
  33. package/dist/Excel/v2/index.d.ts +1 -0
  34. package/dist/IdunSoft/from/courses.js.map +1 -1
  35. package/dist/IdunSoft/from/events.js +1 -2
  36. package/dist/IdunSoft/from/events.js.map +1 -1
  37. package/dist/IdunSoft/from/groups.js.map +1 -1
  38. package/dist/IdunSoft/from/index.js.map +1 -1
  39. package/dist/IdunSoft/from/locations.js.map +1 -1
  40. package/dist/IdunSoft/from/schedules.d.ts +1 -0
  41. package/dist/IdunSoft/from/schedules.js.map +1 -1
  42. package/dist/IdunSoft/from/teachers.js.map +1 -1
  43. package/dist/IdunSoft/to/index.d.ts +1 -0
  44. package/dist/IdunSoft/to/schedules.js +3 -6
  45. package/dist/IdunSoft/to/schedules.js.map +1 -1
  46. package/dist/InfoMentor/to/index.d.ts +1 -0
  47. package/dist/InfoMentor/to/schedules.js +1 -2
  48. package/dist/InfoMentor/to/schedules.js.map +1 -1
  49. package/dist/PlanDigital/from/index.js.map +1 -1
  50. package/dist/PlanDigital/from/schedules.js +9 -11
  51. package/dist/PlanDigital/from/schedules.js.map +1 -1
  52. package/dist/PlanDigital/index.d.ts +1 -0
  53. package/dist/Quiculum/file/to/index.d.ts +1 -0
  54. package/dist/Quiculum/file/to/schedules.js +5 -9
  55. package/dist/Quiculum/file/to/schedules.js.map +1 -1
  56. package/dist/RS/from/division.d.ts +1 -0
  57. package/dist/RS/from/division.js +1 -2
  58. package/dist/RS/from/division.js.map +1 -1
  59. package/dist/RS/from/index.js.map +1 -1
  60. package/dist/RS/from/schedules.d.ts +1 -0
  61. package/dist/RS/from/schedules.js.map +1 -1
  62. package/dist/RS/make-connected.d.ts +3 -1
  63. package/dist/RS/make-connected.js +34 -42
  64. package/dist/RS/make-connected.js.map +1 -1
  65. package/dist/RS/to/index.js.map +1 -1
  66. package/dist/RS/to/initial-configuration.js +4 -6
  67. package/dist/RS/to/initial-configuration.js.map +1 -1
  68. package/dist/RS/to/input/collections.js.map +1 -1
  69. package/dist/RS/to/input/default.js +1 -2
  70. package/dist/RS/to/input/default.js.map +1 -1
  71. package/dist/RS/to/input/dependencies.js +1 -2
  72. package/dist/RS/to/input/dependencies.js.map +1 -1
  73. package/dist/RS/to/input/dynamic-locked-times.js +1 -2
  74. package/dist/RS/to/input/dynamic-locked-times.js.map +1 -1
  75. package/dist/RS/to/input/events.js.map +1 -1
  76. package/dist/RS/to/input/groups.js.map +1 -1
  77. package/dist/RS/to/input/individuals.js +1 -2
  78. package/dist/RS/to/input/individuals.js.map +1 -1
  79. package/dist/RS/to/input/input.js +1 -2
  80. package/dist/RS/to/input/input.js.map +1 -1
  81. package/dist/RS/to/input/intervals.js +2 -4
  82. package/dist/RS/to/input/intervals.js.map +1 -1
  83. package/dist/RS/to/input/periods.js +2 -4
  84. package/dist/RS/to/input/periods.js.map +1 -1
  85. package/dist/RS/to/input/settings.js.map +1 -1
  86. package/dist/RS/to/input/teachers.js +1 -1
  87. package/dist/RS/to/input/teachers.js.map +1 -1
  88. package/dist/RS/to/input/util/attach-locked-times.js.map +1 -1
  89. package/dist/RS/to/input/util/parse-days.js.map +1 -1
  90. package/dist/RS/to/input/util/parse-group-references.js.map +1 -1
  91. package/dist/RS/to/input/util/parse-intervals.js +2 -4
  92. package/dist/RS/to/input/util/parse-intervals.js.map +1 -1
  93. package/dist/RS/to/input/util/parse-location-references.js +1 -2
  94. package/dist/RS/to/input/util/parse-location-references.js.map +1 -1
  95. package/dist/RS/to/input/util/parse-max-working-hours.js.map +1 -1
  96. package/dist/RS/to/input/util/parse-minimum-break-length.js.map +1 -1
  97. package/dist/RS/to/input/util/util.js +1 -2
  98. package/dist/RS/to/input/util/util.js.map +1 -1
  99. package/dist/RS/to/schedules.js.map +1 -1
  100. package/dist/RS/types/to.d.ts +1 -0
  101. package/dist/SS12000/from/activities.js +1 -2
  102. package/dist/SS12000/from/activities.js.map +1 -1
  103. package/dist/SS12000/from/calendar-events.js.map +1 -1
  104. package/dist/SS12000/from/duties.js.map +1 -1
  105. package/dist/SS12000/from/groups.js.map +1 -1
  106. package/dist/SS12000/from/index.js.map +1 -1
  107. package/dist/SS12000/from/persons.js.map +1 -1
  108. package/dist/SS12000/from/resources.js.map +1 -1
  109. package/dist/SS12000/from/rooms.js.map +1 -1
  110. package/dist/SS12000/from/syllabuses.js.map +1 -1
  111. package/dist/SS12000/index.d.ts +236 -201
  112. package/dist/SS12000/to/activities.js.map +1 -1
  113. package/dist/SS12000/to/calendar-events.js.map +1 -1
  114. package/dist/SS12000/to/common.js.map +1 -1
  115. package/dist/SS12000/to/duties.js.map +1 -1
  116. package/dist/SS12000/to/groups.js.map +1 -1
  117. package/dist/SS12000/to/index.d.ts +1 -0
  118. package/dist/SS12000/to/persons.js.map +1 -1
  119. package/dist/SS12000/to/resources.js.map +1 -1
  120. package/dist/SS12000/to/rooms.js.map +1 -1
  121. package/dist/SS12000/to/syllabuses.js.map +1 -1
  122. package/dist/SchoolSoft/api/from/index.js.map +1 -1
  123. package/dist/SchoolSoft/api/from/schedules.js +8 -12
  124. package/dist/SchoolSoft/api/from/schedules.js.map +1 -1
  125. package/dist/SchoolSoft/api/index.d.ts +1 -0
  126. package/dist/SchoolSoft/file/from/index.js.map +1 -1
  127. package/dist/SchoolSoft/file/from/schedules.js +83 -87
  128. package/dist/SchoolSoft/file/from/schedules.js.map +1 -1
  129. package/dist/SchoolSoft/file/index.d.ts +1 -0
  130. package/dist/SchoolSoft/file/to/index.d.ts +1 -0
  131. package/dist/SchoolSoft/file/to/schedules.js +1 -2
  132. package/dist/SchoolSoft/file/to/schedules.js.map +1 -1
  133. package/dist/SchoolSoft/index.d.ts +1 -0
  134. package/dist/Schoolity/txt/to/index.d.ts +1 -0
  135. package/dist/Schoolity/txt/to/schedules.js +5 -12
  136. package/dist/Schoolity/txt/to/schedules.js.map +1 -1
  137. package/dist/Skola24/mdb/from/course-and-events.js +3 -5
  138. package/dist/Skola24/mdb/from/course-and-events.js.map +1 -1
  139. package/dist/Skola24/mdb/from/groups.js.map +1 -1
  140. package/dist/Skola24/mdb/from/index.js.map +1 -1
  141. package/dist/Skola24/mdb/from/locations.js.map +1 -1
  142. package/dist/Skola24/mdb/from/schedule.d.ts +1 -0
  143. package/dist/Skola24/mdb/from/schedule.js.map +1 -1
  144. package/dist/Skola24/mdb/from/teachers.js.map +1 -1
  145. package/dist/Skola24/txt/from/calendar-exceptions.js +1 -2
  146. package/dist/Skola24/txt/from/calendar-exceptions.js.map +1 -1
  147. package/dist/Skola24/txt/from/division.js.map +1 -1
  148. package/dist/Skola24/txt/from/index.js.map +1 -1
  149. package/dist/Skola24/txt/from/period.js +31 -34
  150. package/dist/Skola24/txt/from/period.js.map +1 -1
  151. package/dist/Skola24/txt/from/schedules.d.ts +1 -0
  152. package/dist/Skola24/txt/from/schedules.js +6 -10
  153. package/dist/Skola24/txt/from/schedules.js.map +1 -1
  154. package/dist/Skola24/txt/from/util.js.map +1 -1
  155. package/dist/Skola24/txt/index.d.ts +1 -0
  156. package/dist/Skola24/txt/to/index.d.ts +1 -0
  157. package/dist/Skola24/txt/to/schedules.js +5 -12
  158. package/dist/Skola24/txt/to/schedules.js.map +1 -1
  159. package/dist/common/constants.js.map +1 -1
  160. package/dist/common/functions.js.map +1 -1
  161. package/dist/common/get-date.js.map +1 -1
  162. package/dist/common/make-chainable/index.js.map +1 -1
  163. package/dist/common/types.d.ts +1 -3
  164. package/dist/core/from/configurations.js.map +1 -1
  165. package/dist/core/from/courses.js.map +1 -1
  166. package/dist/core/from/events.js.map +1 -1
  167. package/dist/core/from/exceptions.js.map +1 -1
  168. package/dist/core/from/groups.js.map +1 -1
  169. package/dist/core/from/index.js.map +1 -1
  170. package/dist/core/from/locations.js.map +1 -1
  171. package/dist/core/from/locked-times.js.map +1 -1
  172. package/dist/core/from/overlap-groups.js.map +1 -1
  173. package/dist/core/from/periods.js.map +1 -1
  174. package/dist/core/from/persons.js.map +1 -1
  175. package/dist/core/from/root-intervals.js.map +1 -1
  176. package/dist/core/from/schedules.js.map +1 -1
  177. package/dist/core/from/settings.js.map +1 -1
  178. package/dist/core/from/syllabuses.js.map +1 -1
  179. package/dist/core/from/teachers.js.map +1 -1
  180. package/dist/core/index.d.ts +1 -0
  181. package/dist/core/interfaces/index.d.ts +23 -0
  182. package/dist/core/interfaces/other/companies.d.ts +1 -0
  183. package/dist/core/interfaces/other/companies.js.map +1 -1
  184. package/dist/core/interfaces/other/index.d.ts +6 -0
  185. package/dist/core/interfaces/other/operations.d.ts +1 -0
  186. package/dist/core/interfaces/vertices/companies.d.ts +1 -0
  187. package/dist/core/interfaces/vertices/configurations.d.ts +1 -0
  188. package/dist/core/interfaces/vertices/courses.d.ts +1 -0
  189. package/dist/core/interfaces/vertices/division-settings.d.ts +2 -0
  190. package/dist/core/interfaces/vertices/divisions.d.ts +1 -0
  191. package/dist/core/interfaces/vertices/events.d.ts +1 -0
  192. package/dist/core/interfaces/vertices/exceptions.d.ts +1 -0
  193. package/dist/core/interfaces/vertices/generations.d.ts +2 -0
  194. package/dist/core/interfaces/vertices/groups.d.ts +1 -0
  195. package/dist/core/interfaces/vertices/index.d.ts +1 -0
  196. package/dist/core/interfaces/vertices/locations.d.ts +1 -0
  197. package/dist/core/interfaces/vertices/locked-times.d.ts +2 -0
  198. package/dist/core/interfaces/vertices/overlap-groups.d.ts +1 -0
  199. package/dist/core/interfaces/vertices/periods.d.ts +3 -0
  200. package/dist/core/interfaces/vertices/persons.d.ts +1 -0
  201. package/dist/core/interfaces/vertices/properties/belongs-to.d.ts +1 -0
  202. package/dist/core/interfaces/vertices/properties/coalesced.d.ts +1 -0
  203. package/dist/core/interfaces/vertices/root-intervals.d.ts +2 -0
  204. package/dist/core/interfaces/vertices/syllabuses.d.ts +1 -0
  205. package/dist/core/interfaces/vertices/teachers.d.ts +1 -0
  206. package/dist/core/interfaces/vertices/threads.d.ts +6 -4
  207. package/dist/core/interfaces/vertices/users.d.ts +1 -0
  208. package/dist/core/interfaces/vertices/util/custom-vertex-export/index.d.ts +6 -6
  209. package/dist/core/interfaces/vertices/util/custom-vertex-export/util.d.ts +4 -4
  210. package/dist/core/interfaces/vertices/util/deep-vertex-export/index.d.ts +9 -9
  211. package/dist/core/interfaces/vertices/util/edges.d.ts +7 -7
  212. package/dist/core/interfaces/vertices/util/index.d.ts +6 -0
  213. package/dist/core/interfaces/vertices/util/util.d.ts +20 -24
  214. package/dist/core/interfaces/vertices/util/vertex-query/index.d.ts +11 -11
  215. package/dist/core/interfaces/vertices/util/vertex.d.ts +1 -1
  216. package/dist/core/interfaces/vertices/vertex-query.d.ts +27 -26
  217. package/dist/core/interfaces/vertices/vertex-query.js.map +1 -1
  218. package/dist/core/to/configurations.js +1 -2
  219. package/dist/core/to/configurations.js.map +1 -1
  220. package/dist/core/to/courses.js +1 -2
  221. package/dist/core/to/courses.js.map +1 -1
  222. package/dist/core/to/division.js.map +1 -1
  223. package/dist/core/to/events.js +1 -2
  224. package/dist/core/to/events.js.map +1 -1
  225. package/dist/core/to/exceptions.js +1 -2
  226. package/dist/core/to/exceptions.js.map +1 -1
  227. package/dist/core/to/groups.js +1 -2
  228. package/dist/core/to/groups.js.map +1 -1
  229. package/dist/core/to/locations.js +1 -2
  230. package/dist/core/to/locations.js.map +1 -1
  231. package/dist/core/to/locked-times.js +1 -2
  232. package/dist/core/to/locked-times.js.map +1 -1
  233. package/dist/core/to/overlap-groups.js +1 -2
  234. package/dist/core/to/overlap-groups.js.map +1 -1
  235. package/dist/core/to/periods.js +1 -2
  236. package/dist/core/to/periods.js.map +1 -1
  237. package/dist/core/to/persons.js +1 -2
  238. package/dist/core/to/persons.js.map +1 -1
  239. package/dist/core/to/root-intervals.js +1 -2
  240. package/dist/core/to/root-intervals.js.map +1 -1
  241. package/dist/core/to/schedules.d.ts +1 -0
  242. package/dist/core/to/schedules.js.map +1 -1
  243. package/dist/core/to/settings.js +1 -2
  244. package/dist/core/to/settings.js.map +1 -1
  245. package/dist/core/to/syllabuses.js +1 -2
  246. package/dist/core/to/syllabuses.js.map +1 -1
  247. package/dist/core/to/teachers.js +1 -2
  248. package/dist/core/to/teachers.js.map +1 -1
  249. package/dist/core/to/util.d.ts +2 -0
  250. package/dist/core/to/util.js +1 -2
  251. package/dist/core/to/util.js.map +1 -1
  252. package/dist/core/types/index.d.ts +1 -0
  253. package/dist/core/util.js +1 -2
  254. package/dist/core/util.js.map +1 -1
  255. package/dist/identify/constants/index.js.map +1 -1
  256. package/dist/identify/index.js +1 -2
  257. package/dist/identify/index.js.map +1 -1
  258. package/dist/sdui/from/classes.js.map +1 -1
  259. package/dist/sdui/from/courses.js.map +1 -1
  260. package/dist/sdui/from/holidays.js.map +1 -1
  261. package/dist/sdui/from/index.js.map +1 -1
  262. package/dist/sdui/from/lessons.js.map +1 -1
  263. package/dist/sdui/from/rooms.js.map +1 -1
  264. package/dist/sdui/from/schedules.d.ts +2 -0
  265. package/dist/sdui/from/schedules.js.map +1 -1
  266. package/dist/sdui/from/school-years.js.map +1 -1
  267. package/dist/sdui/from/substitution-plans.js.map +1 -1
  268. package/dist/sdui/from/teachers.js.map +1 -1
  269. package/dist/sdui/to/classes.js.map +1 -1
  270. package/dist/sdui/to/courses.js.map +1 -1
  271. package/dist/sdui/to/holidays.js.map +1 -1
  272. package/dist/sdui/to/hours.js.map +1 -1
  273. package/dist/sdui/to/index.d.ts +2 -0
  274. package/dist/sdui/to/lessons.js.map +1 -1
  275. package/dist/sdui/to/rooms.js.map +1 -1
  276. package/dist/sdui/to/schedules.js.map +1 -1
  277. package/dist/sdui/to/school-years.js.map +1 -1
  278. package/dist/sdui/to/substitution-plans.js +3 -6
  279. package/dist/sdui/to/substitution-plans.js.map +1 -1
  280. package/dist/sdui/to/teachers.js.map +1 -1
  281. package/dist/vKlass/from/index.js.map +1 -1
  282. package/dist/vKlass/from/schedule.d.ts +1 -0
  283. package/dist/vKlass/from/schedule.js.map +1 -1
  284. package/dist/vKlass/to/schedules.js +6 -17
  285. package/dist/vKlass/to/schedules.js.map +1 -1
  286. package/package.json +1 -1
@@ -4,8 +4,7 @@ import XLSX from "xlsx";
4
4
 
5
5
  //#region src/vKlass/to/schedules.ts
6
6
  function schedules_default(schedule) {
7
- const did = getVertexId(schedule.division, { idKey: "id" });
8
- if (!did) throw new Error("division id is undefined");
7
+ if (!getVertexId(schedule.division, { idKey: "id" })) throw new Error("division id is undefined");
9
8
  const startDate = moment.utc(schedule.division.start).format("YYYY-MM-DD HH:mm:ss");
10
9
  const endDate = moment.utc(schedule.division.end).format("YYYY-MM-DD HH:mm:ss");
11
10
  const personMap = /* @__PURE__ */ new Map();
@@ -23,8 +22,7 @@ function schedules_default(schedule) {
23
22
  const courses = schedule.courses.map((course) => {
24
23
  const group = validateGroup(course.groups);
25
24
  if (!group) return null;
26
- const teacherIds = course.teachers?.map((t) => getVertexId(t.to, { idKey: "id" })).filter((id) => id != null) ?? [];
27
- const teacherSignatures = teacherIds.map((id) => teacherMap.get(id)).filter((sig) => sig != null);
25
+ const teacherSignatures = (course.teachers?.map((t) => getVertexId(t.to, { idKey: "id" })).filter((id) => id != null) ?? []).map((id) => teacherMap.get(id)).filter((sig) => sig != null);
28
26
  const courseName = course.displayName || "";
29
27
  const subject = course.subject || "";
30
28
  const membersSSNs = group.members.map((id) => {
@@ -72,20 +70,11 @@ function validateGroup(groups) {
72
70
  function formatSSN(ssn) {
73
71
  if (typeof ssn === "number") ssn = ssn.toString();
74
72
  if (typeof ssn !== "string") return "";
75
- const regex10 = /^\d{6}-\d{4}$/;
76
- if (regex10.test(ssn)) return ssn;
73
+ if (/^\d{6}-\d{4}$/.test(ssn)) return ssn;
77
74
  ssn = ssn.replace(/\D/g, "");
78
- if (ssn.length === 12) {
79
- const year = ssn.slice(2, 4);
80
- const month = ssn.slice(4, 6);
81
- const day = ssn.slice(6, 8);
82
- const lastFour = ssn.slice(8);
83
- return `${year}${month}${day}-${lastFour}`;
84
- } else if (ssn.length === 10) {
85
- const datePart = ssn.slice(0, 6);
86
- const lastFour = ssn.slice(6);
87
- return `${datePart}-${lastFour}`;
88
- } else return "";
75
+ if (ssn.length === 12) return `${ssn.slice(2, 4)}${ssn.slice(4, 6)}${ssn.slice(6, 8)}-${ssn.slice(8)}`;
76
+ else if (ssn.length === 10) return `${ssn.slice(0, 6)}-${ssn.slice(6)}`;
77
+ else return "";
89
78
  }
90
79
 
91
80
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"schedules.js","names":["memberIds: string[]"],"sources":["../../../src/vKlass/to/schedules.ts"],"sourcesContent":["import moment from 'moment';\nimport type { Types } from 'mongoose';\nimport XLSX from 'xlsx';\nimport type { Types as CoreTypes } from '../../core/types';\nimport { getVertexId } from '../../core/util';\n\ntype Schedule = {\n division: CoreTypes.Deep.Division;\n teachers: CoreTypes.Deep.Teacher[];\n courses: CoreTypes.Deep.Course[];\n persons: CoreTypes.Deep.Person[];\n};\n\nexport default function (\n schedule: Schedule,\n): XLSX.WorkBook {\n const did = getVertexId(schedule.division, { idKey: 'id' });\n if (!did) throw new Error('division id is undefined');\n\n // get start and end dates from division in format date + time format: 2024-08-15 00:00:00\n const startDate = moment.utc(schedule.division.start).format('YYYY-MM-DD HH:mm:ss');\n const endDate = moment.utc(schedule.division.end).format('YYYY-MM-DD HH:mm:ss');\n\n // Map persons by id to SSN\n const personMap = new Map<string, string>();\n schedule.persons.forEach((p) => {\n const ssn = p.SSN?.value;\n const id = getVertexId(p, { idKey: '_id' });\n if (ssn && id)\n personMap.set(id, ssn);\n });\n\n const teacherMap = new Map<string, string>();\n schedule.teachers.forEach((t) => {\n const signature = t.signature;\n const id = getVertexId(t, { idKey: 'id' });\n if (signature && id)\n teacherMap.set(id, signature);\n });\n\n\n\n const courses = schedule.courses.map((course) => {\n const group = validateGroup(course.groups);\n if (!group) return null;\n\n const teacherIds = course.teachers?.map((t) => getVertexId(t.to, { idKey: 'id' })).filter((id) => id != null) ?? [];\n const teacherSignatures = teacherIds.map((id) => teacherMap.get(id)).filter((sig) => sig != null);\n\n const courseName = course.displayName || '';\n const subject = course.subject || '';\n\n const membersSSNs = group.members.map((id) => {\n return personMap.get(id);\n }).filter((ssn) => !!ssn);\n\n if (membersSSNs.length === 0) return null;\n\n return membersSSNs.map((ssn) => ({\n Personnummer: ssn ? formatSSN(ssn) : '',\n Kurskod: subject,\n Benämning: courseName,\n Undervisningsgrupp: group.displayName || '',\n Lärarsignatur: teacherSignatures ? teacherSignatures.join(',') : '',\n Poäng: 0,\n Startdatum: startDate,\n Slutdatum: endDate\n }));\n\n }).flat().filter(x => x !== null);\n\n const wb = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(courses), 'Kurser');\n\n return wb;\n}\n\n// Validate that the group is valid and has at least one member\nfunction validateGroup (groups: CoreTypes.Deep.Course['groups']): {\n members: string[], // Array of member IDs\n displayName?: string\n} | null {\n const group = groups?.at(0)?.to;\n\n if (!(typeof group === 'object') || !('members' in group)) return null;\n\n if (!group?.members || group.members.length === 0) return null;\n\n const memberIds: string[] = [];\n for (const member of group.members) {\n const id = (typeof member === 'object' && 'id' in member) ? member.id : member;\n memberIds.push((id as unknown as (Types.ObjectId | string)).toString());\n }\n if (memberIds.length === 0) return null;\n\n return { members: memberIds, displayName: group.displayName };\n}\n\n/**\n * Formats a Swedish SSN (personnummer) from the standard 12-digit format (YYYYMMDDXXXX) to the common 10-digit format (YYMMDD-XXXX).\n * If the input is already in the 10-digit format, it is returned as is.\n * If the input is invalid, null is returned.\n *\n * @param ssn - The SSN to format, either as a string or number.\n * @returns The formatted SSN in 10-digit format, or null if invalid.\n */\nfunction formatSSN (ssn: string | number): string {\n if (typeof ssn === 'number') {\n ssn = ssn.toString();\n }\n if (typeof ssn !== 'string') {\n return '';\n }\n\n // Check if already in YYMMDD-XXXX format\n const regex10 = /^\\d{6}-\\d{4}$/;\n if (regex10.test(ssn)) {\n return ssn;\n }\n\n // Remove any non-digit characters\n ssn = ssn.replace(/\\D/g, '');\n\n if (ssn.length === 12) {\n // Convert from YYYYMMDDXXXX to YYMMDD-XXXX\n const year = ssn.slice(2, 4);\n const month = ssn.slice(4, 6);\n const day = ssn.slice(6, 8);\n const lastFour = ssn.slice(8);\n return `${year}${month}${day}-${lastFour}`;\n } else if (ssn.length === 10) {\n // Already in YYMMDDXXXX format, just add the hyphen\n const datePart = ssn.slice(0, 6);\n const lastFour = ssn.slice(6);\n return `${datePart}-${lastFour}`;\n } else {\n // Invalid SSN format\n return '';\n }\n}"],"mappings":";;;;;AAaA,2BACE,UACe;CACf,MAAM,MAAM,YAAY,SAAS,UAAU,EAAE,OAAO;AACpD,KAAI,CAAC,IAAK,OAAM,IAAI,MAAM;CAG1B,MAAM,YAAY,OAAO,IAAI,SAAS,SAAS,OAAO,OAAO;CAC7D,MAAM,UAAU,OAAO,IAAI,SAAS,SAAS,KAAK,OAAO;CAGzD,MAAM,4BAAY,IAAI;AACtB,UAAS,QAAQ,SAAS,MAAM;EAC9B,MAAM,MAAM,EAAE,KAAK;EACnB,MAAM,KAAK,YAAY,GAAG,EAAE,OAAO;AACnC,MAAI,OAAO,GACT,WAAU,IAAI,IAAI;;CAGtB,MAAM,6BAAa,IAAI;AACvB,UAAS,SAAS,SAAS,MAAM;EAC/B,MAAM,YAAY,EAAE;EACpB,MAAM,KAAK,YAAY,GAAG,EAAE,OAAO;AACnC,MAAI,aAAa,GACf,YAAW,IAAI,IAAI;;CAKvB,MAAM,UAAU,SAAS,QAAQ,KAAK,WAAW;EAC/C,MAAM,QAAQ,cAAc,OAAO;AACnC,MAAI,CAAC,MAAO,QAAO;EAEnB,MAAM,aAAa,OAAO,UAAU,KAAK,MAAM,YAAY,EAAE,IAAI,EAAE,OAAO,SAAS,QAAQ,OAAO,MAAM,SAAS;EACjH,MAAM,oBAAoB,WAAW,KAAK,OAAO,WAAW,IAAI,KAAK,QAAQ,QAAQ,OAAO;EAE5F,MAAM,aAAa,OAAO,eAAe;EACzC,MAAM,UAAU,OAAO,WAAW;EAElC,MAAM,cAAc,MAAM,QAAQ,KAAK,OAAO;AAC5C,UAAO,UAAU,IAAI;KACpB,QAAQ,QAAQ,CAAC,CAAC;AAErB,MAAI,YAAY,WAAW,EAAG,QAAO;AAErC,SAAO,YAAY,KAAK,SAAS;GAC/B,cAAoB,MAAM,UAAU,OAAO;GAC3C,SAAoB;GACpB,WAAoB;GACpB,oBAAoB,MAAM,eAAe;GACzC,eAAoB,oBAAoB,kBAAkB,KAAK,OAAO;GACtE,OAAoB;GACpB,YAAoB;GACpB,WAAoB;;IAGrB,OAAO,QAAO,MAAK,MAAM;CAE5B,MAAM,KAAK,KAAK,MAAM;AACtB,MAAK,MAAM,kBAAkB,IAAI,KAAK,MAAM,cAAc,UAAU;AAEpE,QAAO;;AAIT,SAAS,cAAe,QAGf;CACP,MAAM,QAAQ,QAAQ,GAAG,IAAI;AAE7B,KAAI,EAAE,OAAO,UAAU,aAAa,EAAE,aAAa,OAAQ,QAAO;AAElE,KAAI,CAAC,OAAO,WAAW,MAAM,QAAQ,WAAW,EAAG,QAAO;CAE1D,MAAMA,YAAsB;AAC5B,MAAK,MAAM,UAAU,MAAM,SAAS;EAClC,MAAM,KAAM,OAAO,WAAW,YAAY,QAAQ,SAAU,OAAO,KAAK;AACxE,YAAU,KAAM,GAA4C;;AAE9D,KAAI,UAAU,WAAW,EAAG,QAAO;AAEnC,QAAO;EAAE,SAAS;EAAW,aAAa,MAAM;;;;;;;;;;;AAWlD,SAAS,UAAW,KAA8B;AAChD,KAAI,OAAO,QAAQ,SACjB,OAAM,IAAI;AAEZ,KAAI,OAAO,QAAQ,SACjB,QAAO;CAIT,MAAM,UAAU;AAChB,KAAI,QAAQ,KAAK,KACf,QAAO;AAIT,OAAM,IAAI,QAAQ,OAAO;AAEzB,KAAI,IAAI,WAAW,IAAI;EAErB,MAAM,OAAO,IAAI,MAAM,GAAG;EAC1B,MAAM,QAAQ,IAAI,MAAM,GAAG;EAC3B,MAAM,MAAM,IAAI,MAAM,GAAG;EACzB,MAAM,WAAW,IAAI,MAAM;AAC3B,SAAO,GAAG,OAAO,QAAQ,IAAI,GAAG;YACvB,IAAI,WAAW,IAAI;EAE5B,MAAM,WAAW,IAAI,MAAM,GAAG;EAC9B,MAAM,WAAW,IAAI,MAAM;AAC3B,SAAO,GAAG,SAAS,GAAG;OAGtB,QAAO"}
1
+ {"version":3,"file":"schedules.js","names":["memberIds: string[]"],"sources":["../../../src/vKlass/to/schedules.ts"],"sourcesContent":["import moment from 'moment';\nimport type { Types } from 'mongoose';\nimport XLSX from 'xlsx';\nimport type { Types as CoreTypes } from '../../core/types';\nimport { getVertexId } from '../../core/util';\n\ntype Schedule = {\n division: CoreTypes.Deep.Division;\n teachers: CoreTypes.Deep.Teacher[];\n courses: CoreTypes.Deep.Course[];\n persons: CoreTypes.Deep.Person[];\n};\n\nexport default function (\n schedule: Schedule,\n): XLSX.WorkBook {\n const did = getVertexId(schedule.division, { idKey: 'id' });\n if (!did) throw new Error('division id is undefined');\n\n // get start and end dates from division in format date + time format: 2024-08-15 00:00:00\n const startDate = moment.utc(schedule.division.start).format('YYYY-MM-DD HH:mm:ss');\n const endDate = moment.utc(schedule.division.end).format('YYYY-MM-DD HH:mm:ss');\n\n // Map persons by id to SSN\n const personMap = new Map<string, string>();\n schedule.persons.forEach((p) => {\n const ssn = p.SSN?.value;\n const id = getVertexId(p, { idKey: '_id' });\n if (ssn && id)\n personMap.set(id, ssn);\n });\n\n const teacherMap = new Map<string, string>();\n schedule.teachers.forEach((t) => {\n const signature = t.signature;\n const id = getVertexId(t, { idKey: 'id' });\n if (signature && id)\n teacherMap.set(id, signature);\n });\n\n\n\n const courses = schedule.courses.map((course) => {\n const group = validateGroup(course.groups);\n if (!group) return null;\n\n const teacherIds = course.teachers?.map((t) => getVertexId(t.to, { idKey: 'id' })).filter((id) => id != null) ?? [];\n const teacherSignatures = teacherIds.map((id) => teacherMap.get(id)).filter((sig) => sig != null);\n\n const courseName = course.displayName || '';\n const subject = course.subject || '';\n\n const membersSSNs = group.members.map((id) => {\n return personMap.get(id);\n }).filter((ssn) => !!ssn);\n\n if (membersSSNs.length === 0) return null;\n\n return membersSSNs.map((ssn) => ({\n Personnummer: ssn ? formatSSN(ssn) : '',\n Kurskod: subject,\n Benämning: courseName,\n Undervisningsgrupp: group.displayName || '',\n Lärarsignatur: teacherSignatures ? teacherSignatures.join(',') : '',\n Poäng: 0,\n Startdatum: startDate,\n Slutdatum: endDate\n }));\n\n }).flat().filter(x => x !== null);\n\n const wb = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(courses), 'Kurser');\n\n return wb;\n}\n\n// Validate that the group is valid and has at least one member\nfunction validateGroup (groups: CoreTypes.Deep.Course['groups']): {\n members: string[], // Array of member IDs\n displayName?: string\n} | null {\n const group = groups?.at(0)?.to;\n\n if (!(typeof group === 'object') || !('members' in group)) return null;\n\n if (!group?.members || group.members.length === 0) return null;\n\n const memberIds: string[] = [];\n for (const member of group.members) {\n const id = (typeof member === 'object' && 'id' in member) ? member.id : member;\n memberIds.push((id as unknown as (Types.ObjectId | string)).toString());\n }\n if (memberIds.length === 0) return null;\n\n return { members: memberIds, displayName: group.displayName };\n}\n\n/**\n * Formats a Swedish SSN (personnummer) from the standard 12-digit format (YYYYMMDDXXXX) to the common 10-digit format (YYMMDD-XXXX).\n * If the input is already in the 10-digit format, it is returned as is.\n * If the input is invalid, null is returned.\n *\n * @param ssn - The SSN to format, either as a string or number.\n * @returns The formatted SSN in 10-digit format, or null if invalid.\n */\nfunction formatSSN (ssn: string | number): string {\n if (typeof ssn === 'number') {\n ssn = ssn.toString();\n }\n if (typeof ssn !== 'string') {\n return '';\n }\n\n // Check if already in YYMMDD-XXXX format\n const regex10 = /^\\d{6}-\\d{4}$/;\n if (regex10.test(ssn)) {\n return ssn;\n }\n\n // Remove any non-digit characters\n ssn = ssn.replace(/\\D/g, '');\n\n if (ssn.length === 12) {\n // Convert from YYYYMMDDXXXX to YYMMDD-XXXX\n const year = ssn.slice(2, 4);\n const month = ssn.slice(4, 6);\n const day = ssn.slice(6, 8);\n const lastFour = ssn.slice(8);\n return `${year}${month}${day}-${lastFour}`;\n } else if (ssn.length === 10) {\n // Already in YYMMDDXXXX format, just add the hyphen\n const datePart = ssn.slice(0, 6);\n const lastFour = ssn.slice(6);\n return `${datePart}-${lastFour}`;\n } else {\n // Invalid SSN format\n return '';\n }\n}"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@royalschedule/maps",
3
3
  "description": "",
4
- "version": "4.0.32",
4
+ "version": "4.0.33",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",