From fd84ea9d0623d6526b596f477c76ae66c54e2b86 Mon Sep 17 00:00:00 2001 From: cditcher Date: Tue, 5 May 2026 15:55:22 -0700 Subject: [PATCH 1/2] First minor fix for reqt 19 --- .../ca/bc/gov/educ/api/ruleengine/rule/MinCreditsRule.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinCreditsRule.java b/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinCreditsRule.java index 533fc1e5..ee4035d2 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinCreditsRule.java +++ b/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinCreditsRule.java @@ -12,6 +12,7 @@ import org.springframework.stereotype.Component; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -47,6 +48,9 @@ public RuleData fire() { RuleProcessorRuleUtils.updateCourseLevelForCLC(studentCourses, "12"); + // sorting gives preference to non-projected courses to get assigned grad reqt + studentCourses.sort(Comparator.comparing(StudentCourse::isProjected)); + for (ProgramRequirement gradProgramRule : gradProgramRules) { requiredCredits = Integer.parseInt(gradProgramRule.getProgramRequirementCode().getRequiredCredits().trim()); totalCredits = studentCourses From 030c25f691109ce5b9eeab911c14fdb438af5977 Mon Sep 17 00:00:00 2001 From: cditcher Date: Wed, 6 May 2026 08:50:55 -0700 Subject: [PATCH 2/2] Added precedence for non-projected courses via sorting. This prioritizes actual passed courses before projected ones during tvr processing. Fix applied to min credits and elective (19 and 17) --- .../api/ruleengine/rule/MinCreditsElective12OtherRule.java | 3 +++ .../gov/educ/api/ruleengine/rule/MinCreditsElective12Rule.java | 3 +++ .../ca/bc/gov/educ/api/ruleengine/rule/MinCreditsRule.java | 2 +- .../educ/api/ruleengine/rule/MinElectiveCredits1996Rule.java | 1 + .../educ/api/ruleengine/rule/MinElectiveCredits2023Rule.java | 3 +++ .../api/ruleengine/rule/MinElectiveCreditsFrench1996Rule.java | 3 +++ .../gov/educ/api/ruleengine/rule/MinElectiveCreditsRule.java | 3 +++ 7 files changed, 17 insertions(+), 1 deletion(-) diff --git a/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinCreditsElective12OtherRule.java b/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinCreditsElective12OtherRule.java index e6a44396..4057c57f 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinCreditsElective12OtherRule.java +++ b/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinCreditsElective12OtherRule.java @@ -11,6 +11,7 @@ import org.springframework.stereotype.Component; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -49,6 +50,8 @@ public RuleData fire() { return ruleProcessorData; } + studentCourses.sort(Comparator.comparing(StudentCourse::isProjected)); + List socialStudiesCourseCodeList = ruleProcessorData.getCourseRequirements().stream().filter(cr -> "502".equals(cr.getRuleCode().getCourseRequirementCode())).map(CourseRequirement::getCourseCode).collect(Collectors.toList()); if (socialStudiesCourseCodeList.isEmpty()) { socialStudiesCourseCodeList = List.of(COURSE_CODE_SOCIAL_STUDIES); diff --git a/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinCreditsElective12Rule.java b/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinCreditsElective12Rule.java index 678a11e1..6f38d040 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinCreditsElective12Rule.java +++ b/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinCreditsElective12Rule.java @@ -11,6 +11,7 @@ import org.springframework.stereotype.Component; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -42,6 +43,8 @@ public RuleData fire() { return ruleProcessorData; } + studentCourses.sort(Comparator.comparing(StudentCourse::isProjected)); + for (ProgramRequirement gradProgramRule : gradProgramRules) { requiredCredits = Integer.parseInt(gradProgramRule.getProgramRequirementCode().getRequiredCredits().trim()); // list diff --git a/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinCreditsRule.java b/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinCreditsRule.java index ee4035d2..4fc27e66 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinCreditsRule.java +++ b/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinCreditsRule.java @@ -48,7 +48,7 @@ public RuleData fire() { RuleProcessorRuleUtils.updateCourseLevelForCLC(studentCourses, "12"); - // sorting gives preference to non-projected courses to get assigned grad reqt + // sorting gives preference to non-projected courses GRAD2-3792 studentCourses.sort(Comparator.comparing(StudentCourse::isProjected)); for (ProgramRequirement gradProgramRule : gradProgramRules) { diff --git a/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinElectiveCredits1996Rule.java b/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinElectiveCredits1996Rule.java index 36d7d518..62783762 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinElectiveCredits1996Rule.java +++ b/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinElectiveCredits1996Rule.java @@ -37,6 +37,7 @@ public RuleData fire() { int ldCourseCounter = 0; List tempStudentCourseList = RuleProcessorRuleUtils .getUniqueStudentCourses(ruleProcessorData.getStudentCourses(), ruleProcessorData.isProjected()); + List minCreditGrade12Courses = tempStudentCourseList.stream().filter(StudentCourse::isUsedInMinCreditRule).collect(Collectors.toList()); List minCreditGrade12CoursesWithLeftOverCredits = minCreditGrade12Courses.stream() .filter(sc -> sc.isUsedInMinCreditRule() && (sc.getLeftOverCredits() != null && sc.getLeftOverCredits() > 0)).toList(); diff --git a/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinElectiveCredits2023Rule.java b/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinElectiveCredits2023Rule.java index b6639f98..7aa38bcd 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinElectiveCredits2023Rule.java +++ b/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinElectiveCredits2023Rule.java @@ -13,6 +13,7 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -46,6 +47,8 @@ public RuleData fire() { return ruleProcessorData; } + studentCourses.sort(Comparator.comparing(StudentCourse::isProjected)); + for (ProgramRequirement gradProgramRule : gradProgramRules) { requiredCredits = Integer.parseInt(gradProgramRule.getProgramRequirementCode().getRequiredCredits().trim()); // list for (StudentCourse sc : studentCourses) { diff --git a/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinElectiveCreditsFrench1996Rule.java b/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinElectiveCreditsFrench1996Rule.java index 0e1a049f..9d9ad14c 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinElectiveCreditsFrench1996Rule.java +++ b/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinElectiveCreditsFrench1996Rule.java @@ -11,6 +11,7 @@ import org.springframework.stereotype.Component; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -39,6 +40,8 @@ public RuleProcessorData fire() { List studentCourses = RuleProcessorRuleUtils .getUniqueStudentCourses(ruleProcessorData.getStudentCourses(), ruleProcessorData.isProjected()); + studentCourses.sort(Comparator.comparing(StudentCourse::isProjected)); + logger.debug("Unique Courses: {}",studentCourses.size()); List gradProgramRules = ruleProcessorData diff --git a/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinElectiveCreditsRule.java b/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinElectiveCreditsRule.java index cd8a14ea..a4a23704 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinElectiveCreditsRule.java +++ b/api/src/main/java/ca/bc/gov/educ/api/ruleengine/rule/MinElectiveCreditsRule.java @@ -11,6 +11,7 @@ import org.springframework.stereotype.Component; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -44,6 +45,8 @@ public RuleData fire() { return ruleProcessorData; } + studentCourses.sort(Comparator.comparing(StudentCourse::isProjected)); + for (ProgramRequirement gradProgramRule : gradProgramRules) { requiredCredits = Integer.parseInt(gradProgramRule.getProgramRequirementCode().getRequiredCredits().trim()); // list for (StudentCourse sc : studentCourses) {