From 2f5dbe56920715fba81bd1eec2d075bcef8da6bb Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Tue, 19 Mar 2019 21:02:39 +0100
Subject: [PATCH] OO-3978: recalculate the passed value with manual scoring and
 cut value

---
 .../java/org/olat/ims/qti21/QTI21StatisticsManager.java  | 2 +-
 .../ims/qti21/manager/QTI21StatisticsManagerImpl.java    | 7 ++++++-
 .../ui/statistics/QTI21StatisticResourceResult.java      | 9 ++++++++-
 3 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/src/main/java/org/olat/ims/qti21/QTI21StatisticsManager.java b/src/main/java/org/olat/ims/qti21/QTI21StatisticsManager.java
index e60bd2e7755..fc9af0c7403 100644
--- a/src/main/java/org/olat/ims/qti21/QTI21StatisticsManager.java
+++ b/src/main/java/org/olat/ims/qti21/QTI21StatisticsManager.java
@@ -66,7 +66,7 @@ public interface QTI21StatisticsManager {
 	 * @param resSubPath
 	 * @return
 	 */
-	public StatisticAssessment getAssessmentStatistics(QTI21StatisticSearchParams searchParams);
+	public StatisticAssessment getAssessmentStatistics(QTI21StatisticSearchParams searchParams, Double cutValue);
 	
 	
 	public StatisticsItem getAssessmentItemStatistics(String itemRefIdent, double maxScore, QTI21StatisticSearchParams searchParams);
diff --git a/src/main/java/org/olat/ims/qti21/manager/QTI21StatisticsManagerImpl.java b/src/main/java/org/olat/ims/qti21/manager/QTI21StatisticsManagerImpl.java
index 195aa68057b..6fc8aaed6b7 100644
--- a/src/main/java/org/olat/ims/qti21/manager/QTI21StatisticsManagerImpl.java
+++ b/src/main/java/org/olat/ims/qti21/manager/QTI21StatisticsManagerImpl.java
@@ -166,7 +166,7 @@ public class QTI21StatisticsManagerImpl implements QTI21StatisticsManager {
 	}
 
 	@Override
-	public StatisticAssessment getAssessmentStatistics(QTI21StatisticSearchParams searchParams) {
+	public StatisticAssessment getAssessmentStatistics(QTI21StatisticSearchParams searchParams, Double cutValue) {
 		StringBuilder sb = new StringBuilder();
 		sb.append("select asession.score, asession.manualScore, asession.passed, asession.duration from qtiassessmenttestsession asession ");
 		decorateRSet(sb, searchParams, true);
@@ -188,6 +188,8 @@ public class QTI21StatisticsManagerImpl implements QTI21StatisticsManager {
 		double minDuration = Double.MAX_VALUE;
 		double maxDuration = 0d;
 		
+		BigDecimal cutBigValue = cutValue == null ? null : BigDecimal.valueOf(cutValue.doubleValue());
+		
 		int dataPos = 0;
 		boolean hasScore = false;
 		for(Object[] rawData:rawDatas) {
@@ -208,6 +210,9 @@ public class QTI21StatisticsManagerImpl implements QTI21StatisticsManager {
 			}
 			
 			Boolean passed = (Boolean)rawData[pos++];
+			if(cutBigValue != null && score != null) {
+				passed = score.compareTo(cutBigValue) >= 0;
+			}
 			if(passed != null) {
 				if(passed.booleanValue()) {
 					numOfPassed++;
diff --git a/src/main/java/org/olat/ims/qti21/ui/statistics/QTI21StatisticResourceResult.java b/src/main/java/org/olat/ims/qti21/ui/statistics/QTI21StatisticResourceResult.java
index 080b614f0cd..f28262382cd 100644
--- a/src/main/java/org/olat/ims/qti21/ui/statistics/QTI21StatisticResourceResult.java
+++ b/src/main/java/org/olat/ims/qti21/ui/statistics/QTI21StatisticResourceResult.java
@@ -46,6 +46,7 @@ import org.olat.ims.qti21.QTI21Service;
 import org.olat.ims.qti21.QTI21StatisticsManager;
 import org.olat.ims.qti21.model.QTI21QuestionType;
 import org.olat.ims.qti21.model.QTI21StatisticSearchParams;
+import org.olat.ims.qti21.model.xml.QtiNodesExtractor;
 import org.olat.repository.RepositoryEntry;
 
 import uk.ac.ed.ph.jqtiplus.node.item.AssessmentItem;
@@ -136,11 +137,17 @@ public class QTI21StatisticResourceResult implements StatisticResourceResult {
 	
 	public StatisticAssessment getQTIStatisticAssessment() {
 		if(statisticAssessment == null) {
-			statisticAssessment = qtiStatisticsManager.getAssessmentStatistics(searchParams);
+			Double cutValue = getCutValue();
+			statisticAssessment = qtiStatisticsManager.getAssessmentStatistics(searchParams, cutValue);
 		}
 		return statisticAssessment;
 	}
 	
+	public Double getCutValue() {
+		AssessmentTest assessmentTest = resolvedAssessmentTest.getRootNodeLookup().extractIfSuccessful();
+		return QtiNodesExtractor.extractCutValue(assessmentTest);
+	}
+	
 	public File getAssessmentItemFile(AssessmentItemRef itemRef) {
 		URI itemUri = resolvedAssessmentTest.getSystemIdByItemRefMap().get(itemRef);
 		return new File(itemUri);
-- 
GitLab