From 2510903d63916d2d37d1d1c14e8f1f5e25f7d1bc Mon Sep 17 00:00:00 2001 From: Joonas Ahovalli Date: Thu, 6 Feb 2025 17:01:34 +0200 Subject: [PATCH] [Updater] Add chosen modules to studyplan --- ...add_included_study_modules_to_studyplan.js | 12 ++++++++++++ .../src/db/models/studyplan.js | 4 ++++ .../sis-updater-worker/src/updater/mapper.js | 19 ++++++++++++++++++- .../src/updater/updateStudents/studyPlans.js | 9 +++++++++ 4 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 updater/sis-updater-worker/src/db/migrations/20250302_00_add_included_study_modules_to_studyplan.js diff --git a/updater/sis-updater-worker/src/db/migrations/20250302_00_add_included_study_modules_to_studyplan.js b/updater/sis-updater-worker/src/db/migrations/20250302_00_add_included_study_modules_to_studyplan.js new file mode 100644 index 0000000000..09c24091c0 --- /dev/null +++ b/updater/sis-updater-worker/src/db/migrations/20250302_00_add_included_study_modules_to_studyplan.js @@ -0,0 +1,12 @@ +const { STRING } = require('sequelize') + +module.exports = { + up: async queryInterface => { + await queryInterface.addColumn('studyplan', 'included_modules', { + type: STRING, + }) + }, + down: async queryInterface => { + await queryInterface.removeColumn('studyplan', 'included_modules') + }, +} diff --git a/updater/sis-updater-worker/src/db/models/studyplan.js b/updater/sis-updater-worker/src/db/models/studyplan.js index 9f2ddf521c..085d2bf5dd 100644 --- a/updater/sis-updater-worker/src/db/models/studyplan.js +++ b/updater/sis-updater-worker/src/db/models/studyplan.js @@ -28,6 +28,10 @@ Studyplan.init( included_courses: { type: ARRAY(STRING), }, + includedModules: { + type: ARRAY(STRING), + field: 'included_modules', + }, sisu_id: { type: STRING, }, diff --git a/updater/sis-updater-worker/src/updater/mapper.js b/updater/sis-updater-worker/src/updater/mapper.js index cdc702fb78..1fdc75237d 100644 --- a/updater/sis-updater-worker/src/updater/mapper.js +++ b/updater/sis-updater-worker/src/updater/mapper.js @@ -342,6 +342,7 @@ const studyplanMapper = ( personIdToStudentNumber, programmeModuleIdToCode, + programmeModuleIdToStudyModuleCode, moduleIdToParentModuleCode, courseUnitIdToCode, moduleAttainments, @@ -359,8 +360,10 @@ const studyplanMapper = return studyPlanIdToDegrees[studyplan.id].map(programmeId => { const code = programmeModuleIdToCode[programmeId] if (!code) return null + const graduated = moduleAttainments[programmeId] && moduleAttainments[programmeId][studyplan.user_id] const id = `${studentnumber}-${code}-${studyrightId}` + const courseUnitSelections = studyplan.course_unit_selections .filter(courseUnit => moduleIdToParentModuleCode[courseUnit.parentModuleId]?.has(code)) .filter(({ substituteFor }) => !substituteFor.length) // Filter out CUs used to substitute another CU @@ -368,9 +371,10 @@ const studyplanMapper = if (substitutedBy.length) return courseUnitIdToCode[substitutedBy[0]] return courseUnitIdToCode[courseUnitId] }) + const customCourseUnitSelections = studyplan.custom_course_unit_attainment_selections .filter(({ parentModuleId }) => moduleIdToParentModuleCode[parentModuleId]?.has(code)) - .map(({ customCourseUnitAttainmentId }) => (attainmentIdToAttainment[customCourseUnitAttainmentId] || {}).code) + .map(({ customCourseUnitAttainmentId }) => attainmentIdToAttainment[customCourseUnitAttainmentId]?.code) .map(sanitizeCourseCode) .filter(course => !!course) @@ -446,12 +450,24 @@ const studyplanMapper = .filter(a => !!a), 'id' ) + const completed_credits = calculateTotalCreditsFromAttainments(attainmentsToCalculate) const includedCourses = graduated ? getCourseCodesFromAttainment(moduleAttainments[programmeId][studyplan.user_id]) : courseUnitSelections.concat(customCourseUnitSelections).concat(coursesFromAttainedModules) if (includedCourses.length === 0) return null + + const includedModules = Array.from( + studyplan.module_selections.reduce((modules, { moduleId }) => { + const studyModuleCode = programmeModuleIdToStudyModuleCode[moduleId] + if (studyModuleCode) { + modules.add(studyModuleCode) + } + return modules + }, new Set()) + ) + return { id, studentnumber, @@ -461,6 +477,7 @@ const studyplanMapper = sisu_id: studyplan.id, curriculum_period_id: studyplan.curriculum_period_id, sis_study_right_id: studyrightId, + includedModules, } }) } diff --git a/updater/sis-updater-worker/src/updater/updateStudents/studyPlans.js b/updater/sis-updater-worker/src/updater/updateStudents/studyPlans.js index 21c5c6715c..ea1f91718b 100644 --- a/updater/sis-updater-worker/src/updater/updateStudents/studyPlans.js +++ b/updater/sis-updater-worker/src/updater/updateStudents/studyPlans.js @@ -22,6 +22,7 @@ const updateStudyplans = async (studyplansAll, personIds, personIdToStudentNumbe 'group_id' ) ) + const educationHasStudyRight = Object.keys(groupedStudyRightSnapshots).reduce((acc, k) => { const sorted = groupedStudyRightSnapshots[k] .filter(s => new Date(s.snapshot_date_time) <= new Date()) @@ -102,6 +103,13 @@ const updateStudyplans = async (studyplansAll, personIds, personIdToStudentNumbe return res }, {}) + const programmeModuleIdToStudyModuleCode = programmeModules.reduce((res, mod) => { + if (mod.type === 'StudyModule') { + res[mod.id] = mod.code + } + return res + }, {}) + const courseUnitIdToCode = courseUnits.reduce((res, cur) => { res[cur.id] = cur.code return res @@ -202,6 +210,7 @@ const updateStudyplans = async (studyplansAll, personIds, personIdToStudentNumbe const mapStudyplan = studyplanMapper( personIdToStudentNumber, programmeModuleIdToCode, + programmeModuleIdToStudyModuleCode, moduleIdToParentModuleCode, courseUnitIdToCode, moduleAttainments,