From 8d478876b5ad1548a715c2868261b1e79840a90c Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Mon, 7 Dec 2015 13:16:42 +0100
Subject: [PATCH] OO-1593: assessment entry for structure course element

---
 .../manager/AssessmentToolManagerImpl.java    | 46 +++++++++++--------
 .../ui/tool/_i18n/LocalStrings_de.properties  |  4 +-
 .../course/run/scoring/ScoreAccounting.java   |  4 +-
 3 files changed, 32 insertions(+), 22 deletions(-)

diff --git a/src/main/java/org/olat/course/assessment/manager/AssessmentToolManagerImpl.java b/src/main/java/org/olat/course/assessment/manager/AssessmentToolManagerImpl.java
index 822d2be3041..d2122885023 100644
--- a/src/main/java/org/olat/course/assessment/manager/AssessmentToolManagerImpl.java
+++ b/src/main/java/org/olat/course/assessment/manager/AssessmentToolManagerImpl.java
@@ -72,7 +72,7 @@ public class AssessmentToolManagerImpl implements AssessmentToolManager {
 		entry.setNumOfAssessedIdentities(numOfAssessedIdentites);
 
 		//retrive statistcis about efficicency statements
-		efficiencyStatementsStatistics(coach, params, entry);
+		assessmentEntryStatistics(coach, params, entry);
 		
 		//retrieve statistcs in user course infos
 		userCourseInfosStatistics(coach, params, entry);
@@ -125,28 +125,35 @@ public class AssessmentToolManagerImpl implements AssessmentToolManager {
 		}
 	}
 	
-	private void efficiencyStatementsStatistics(Identity coach, SearchAssessedIdentityParams params, CourseStatistics entry) {
+	private void assessmentEntryStatistics(Identity coach, SearchAssessedIdentityParams params, CourseStatistics entry) {
 		RepositoryEntry courseEntry = params.getEntry();
 		try {
 			StringBuilder sf = new StringBuilder();
-			sf.append("select avg(statement.score) as scoreAverage, ")
-			  .append(" sum(case when statement.passed=true then 1 else 0 end) as numOfPassed,")
-			  .append(" sum(case when statement.passed=false then 1 else 0 end) as numOfFailed,")
-			  .append(" sum(case when statement.passed is null then 1 else 0 end) as numOfNotAttempted,")
-			  .append(" sum(statement.key) as numOfStatements,")
+			sf.append("select avg(aentry.score) as scoreAverage, ")
+			  .append(" sum(case when aentry.passed=true then 1 else 0 end) as numOfPassed,")
+			  .append(" sum(case when aentry.passed=false then 1 else 0 end) as numOfFailed,")
+			  .append(" sum(case when aentry.passed is null then 1 else 0 end) as numOfNotAttempted,")
+			  .append(" sum(aentry.key) as numOfStatements,")
 			  .append(" v.key as repoKey")
-			  .append(" from effstatementrepo as statement ")
-			  .append(" inner join statement.repositoryEntry v")
-			  .append(" where v.key=:repoEntryKey and (statement.identity in ");
+			  .append(" from assessmententry aentry ")
+			  .append(" inner join aentry.repositoryEntry v ")
+			  .append(" where v.key=:repoEntryKey and aentry.status is not null and not(aentry.status='").append(AssessmentEntryStatus.notStarted.name()).append("')");
+			if(params.getReferenceEntry() != null) {
+				sf.append(" and aentry.referenceEntry.key=:referenceKey");
+			}
+			if(params.getSubIdent() != null) {
+				sf.append(" and aentry.subIdent=:subIdent");
+			}
+			sf.append(" and (aentry.identity in");
 			if(params.isAdmin()) {
 				sf.append(" (select participant.identity from repoentrytogroup as rel, bgroupmember as participant")
 		          .append("    where rel.entry.key=:repoEntryKey and rel.group=participant.group")
 		          .append("      and participant.role='").append(GroupRoles.participant.name()).append("'")
 		          .append("  )");
 				if(params.isNonMembers()) {
-					sf.append(" or not exists (select membership.identity from repoentrytogroup as rel, bgroupmember as membership")
-			          .append("    where rel.entry.key=:repoEntryKey and rel.group=membership.group and membership.identity=statement.identity")
-			          .append("  )");
+					sf.append(" or aentry.identity not in (select membership.identity from repoentrytogroup as rel, bgroupmember as membership")
+			          .append("    where rel.entry.key=:repoEntryKey and rel.group=membership.group and membership.identity=aentry.identity")
+			          .append(" )");
 				}
 			} else if(params.isBusinessGroupCoach() || params.isRepositoryEntryCoach()) {
 				sf.append(" (select participant.identity from repoentrytogroup as rel, bgroupmember as participant, bgroupmember as coach")
@@ -156,14 +163,19 @@ public class AssessmentToolManagerImpl implements AssessmentToolManager {
 		          .append("  )");
 			}
 			sf.append(" ) group by v.key");
-			
-			
+
 			TypedQuery<Object[]> stats = dbInstance.getCurrentEntityManager()
 				.createQuery(sf.toString(), Object[].class)
 				.setParameter("repoEntryKey", courseEntry.getKey());
 			if(!params.isAdmin()) {
 				stats.setParameter("identityKey", coach.getKey());
 			}
+			if(params.getReferenceEntry() != null) {
+				stats.setParameter("referenceKey", params.getReferenceEntry());
+			}
+			if(params.getSubIdent() != null) {
+				stats.setParameter("subIdent", params.getSubIdent());
+			}
 			
 			List<Object[]> results = stats.getResultList();
 			if(results != null && results.size() > 0) {
@@ -229,9 +241,7 @@ public class AssessmentToolManagerImpl implements AssessmentToolManager {
 		
 		Long identityKey = appendUserSearchByKey(sb, params.getSearchString());
 		String[] searchArr = appendUserSearchFull(sb, params.getSearchString());
-		
-		System.out.println(sb.toString());
-		
+
 		TypedQuery<T> query = dbInstance.getCurrentEntityManager()
 				.createQuery(sb.toString(), classResult)
 				.setParameter("repoEntryKey", params.getEntry().getKey());
diff --git a/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_de.properties
index d09e35b22f2..3c1e85ad5c9 100644
--- a/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_de.properties
@@ -19,8 +19,8 @@ assessment.status.done=Bewertet
 assessment.tool.overview=Ubersicht
 assessment.tool.numOfAssessedIdentities={0} bewertete Benutzer
 assessment.tool.numOfAssessedGroups={0} Gruppe(n)
-assessment.tool.numOfPassed={0} bestandend
-assessment.tool.numOfFailed={0} nicht bestandend
+assessment.tool.numOfPassed={0} bestanden
+assessment.tool.numOfFailed={0} nicht bestanden
 table.entries=Entries
 waiting.review=Pending reviews
 no.certificate=Kein Zertifikat vorhanden
diff --git a/src/main/java/org/olat/course/run/scoring/ScoreAccounting.java b/src/main/java/org/olat/course/run/scoring/ScoreAccounting.java
index 049c4020224..b4928a3723e 100644
--- a/src/main/java/org/olat/course/run/scoring/ScoreAccounting.java
+++ b/src/main/java/org/olat/course/run/scoring/ScoreAccounting.java
@@ -181,10 +181,10 @@ public class ScoreAccounting {
 				Boolean passed = null;
 				AssessmentEntryStatus assessmentStatus = AssessmentEntryStatus.inProgress;
 				ConditionInterpreter ci = userCourseEnvironment.getConditionInterpreter();
-				if (scoreExpressionStr != null) {
+				if (cNode.hasScoreConfigured() && scoreExpressionStr != null) {
 					score = new Float(ci.evaluateCalculation(scoreExpressionStr));
 				}
-				if (passedExpressionStr != null) {
+				if (cNode.hasPassedConfigured() && passedExpressionStr != null) {
 					boolean hasPassed = ci.evaluateCondition(passedExpressionStr);
 					if(hasPassed) {
 						passed = Boolean.TRUE;
-- 
GitLab