From 40deec62619731792f33b7cfce06478c4512674f Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Fri, 11 Dec 2020 12:55:28 +0100
Subject: [PATCH] OO-5146: only consider closed assignment in report

---
 .../grading/manager/GraderToIdentityDAO.java  | 53 +++++++++++++++++++
 .../model/GradersSearchParameters.java        | 18 +++++++
 .../modules/grading/ui/ReportResource.java    |  4 +-
 3 files changed, 73 insertions(+), 2 deletions(-)

diff --git a/src/main/java/org/olat/modules/grading/manager/GraderToIdentityDAO.java b/src/main/java/org/olat/modules/grading/manager/GraderToIdentityDAO.java
index 2f0de04694c..a770b64178b 100644
--- a/src/main/java/org/olat/modules/grading/manager/GraderToIdentityDAO.java
+++ b/src/main/java/org/olat/modules/grading/manager/GraderToIdentityDAO.java
@@ -253,6 +253,9 @@ public class GraderToIdentityDAO {
 		  .append(" inner join record.grader as rel")
 		  .append(" inner join rel.identity as ident")
 		  .append(" inner join rel.entry as refEntry");
+		if(searchParams.getClosedFromDate() != null && searchParams.getClosedToDate() != null) {
+			sb.append(" left join record.assignment as assignment");
+		}
 
 		applyGradersSearchParameters(sb, searchParams, false);
 		if(searchParams.getGradingFrom() != null) {
@@ -261,6 +264,15 @@ public class GraderToIdentityDAO {
 		if(searchParams.getGradingTo() != null) {
 			sb.and().append("record.dateOfRecord<=:gradingToDate");
 		}
+		
+		if(searchParams.getClosedFromDate() != null && searchParams.getClosedToDate() != null) {
+			sb.and().append("assignment.closingDate>=:closedFromDate and assignment.closingDate<=:closedToDate");
+		} else if(searchParams.getClosedFromDate() != null) {
+			sb.and().append("assignment.closingDate>=:closedFromDate");
+		} else if(searchParams.getClosedToDate() != null) {
+			sb.and().append("assignment.closingDate<=:closedToDate");
+		}
+		
 		sb.append(" group by refEntry.key");
 
 		TypedQuery<Object[]> query = dbInstance.getCurrentEntityManager()
@@ -288,6 +300,9 @@ public class GraderToIdentityDAO {
 			sb.append(" inner join rel.entry as refEntry")
 			  .append(" inner join refEntry.olatResource as refResource");
 		}
+		if(searchParams.getClosedFromDate() != null && searchParams.getClosedToDate() != null) {
+			sb.append(" left join record.assignment as assignment");
+		}
 
 		applyGradersSearchParameters(sb, searchParams, false);
 		if(searchParams.getGradingFrom() != null) {
@@ -296,6 +311,15 @@ public class GraderToIdentityDAO {
 		if(searchParams.getGradingTo() != null) {
 			sb.and().append("record.dateOfRecord<=:gradingToDate");
 		}
+		
+		if(searchParams.getClosedFromDate() != null && searchParams.getClosedToDate() != null) {
+			sb.and().append("assignment.closingDate>=:closedFromDate and assignment.closingDate<=:closedToDate");
+		} else if(searchParams.getClosedFromDate() != null) {
+			sb.and().append("assignment.closingDate>=:closedFromDate");
+		} else if(searchParams.getClosedToDate() != null) {
+			sb.and().append("assignment.closingDate<=:closedToDate");
+		}
+		
 		sb.append(" group by ident.key");
 
 		TypedQuery<Object[]> query = dbInstance.getCurrentEntityManager()
@@ -398,6 +422,21 @@ public class GraderToIdentityDAO {
 			GradingAssignmentDAO.applyAssignmentSearchParameters(sb, searchParams.getGradingFrom(), searchParams.getGradingTo());
 			sb.append(")");
 		}
+		
+		if(applyFromTo && (searchParams.getClosedFromDate() != null || searchParams.getClosedToDate() != null)) {
+			sb.and()
+			  .append(" exists (select closedAssignment from gradingassignment as closedAssignment")
+			  .append("  where closedAssignment.grader.key=rel.key");
+			
+			if(searchParams.getClosedFromDate() != null && searchParams.getClosedToDate() != null) {
+				sb.and().append("closedAssignment.closingDate>=:closedFromDate and closedAssignment.closingDate<=:closedToDate");
+			} else if(searchParams.getClosedFromDate() != null) {
+				sb.and().append("closedAssignment.closingDate>=:closedFromDate");
+			} else if(searchParams.getClosedToDate() != null) {
+				sb.and().append("closedAssignment.closingDate<=:closedToDate");
+			}
+			sb.append(")");
+		}
 	}
 	
 
@@ -471,6 +510,14 @@ public class GraderToIdentityDAO {
 		
 		GradingAssignmentDAO.applyAssignmentSearchParameters(sb, searchParams.getGradingFrom(), searchParams.getGradingTo());
 		
+		if(searchParams.getClosedFromDate() != null && searchParams.getClosedToDate() != null) {
+			sb.and().append("assignment.closingDate>=:closedFromDate and assignment.closingDate<=:closedToDate");
+		} else if(searchParams.getClosedFromDate() != null) {
+			sb.and().append("assignment.closingDate>=:closedFromDate");
+		} else if(searchParams.getClosedToDate() != null) {
+			sb.and().append("assignment.closingDate<=:closedToDate");
+		}
+		
 		sb.append(" group by rel.identity.key");
 		
 		TypedQuery<Object[]> query = dbInstance.getCurrentEntityManager()
@@ -511,6 +558,12 @@ public class GraderToIdentityDAO {
 		if(applyDates && searchParams.getGradingTo() != null) {
 			query.setParameter("gradingToDate", searchParams.getGradingTo(), TemporalType.TIMESTAMP);
 		}
+		if(applyDates && searchParams.getClosedFromDate() != null) {
+			query.setParameter("closedFromDate", searchParams.getClosedFromDate(), TemporalType.TIMESTAMP);
+		}
+		if(applyDates && searchParams.getClosedToDate() != null) {
+			query.setParameter("closedToDate", searchParams.getClosedToDate(), TemporalType.TIMESTAMP);
+		}
 		if(searchParams.getManager() != null) {
 			query.setParameter("managerKey", searchParams.getManager().getKey());
 		}
diff --git a/src/main/java/org/olat/modules/grading/model/GradersSearchParameters.java b/src/main/java/org/olat/modules/grading/model/GradersSearchParameters.java
index accf4b78537..c028c9faf62 100644
--- a/src/main/java/org/olat/modules/grading/model/GradersSearchParameters.java
+++ b/src/main/java/org/olat/modules/grading/model/GradersSearchParameters.java
@@ -36,6 +36,8 @@ public class GradersSearchParameters {
 	
 	private Date gradingTo;
 	private Date gradingFrom;
+	private Date closedToDate;
+	private Date closedFromDate;
 	private Identity grader;
 	private Identity manager;
 	private List<GraderStatus> status;
@@ -56,6 +58,22 @@ public class GradersSearchParameters {
 	public void setGradingFrom(Date gradingFrom) {
 		this.gradingFrom = gradingFrom;
 	}
+	
+	public Date getClosedToDate() {
+		return closedToDate;
+	}
+
+	public void setClosedToDate(Date closedToDate) {
+		this.closedToDate = closedToDate;
+	}
+
+	public Date getClosedFromDate() {
+		return closedFromDate;
+	}
+
+	public void setClosedFromDate(Date closedFromDate) {
+		this.closedFromDate = closedFromDate;
+	}
 
 	public List<GraderStatus> getStatus() {
 		return status;
diff --git a/src/main/java/org/olat/modules/grading/ui/ReportResource.java b/src/main/java/org/olat/modules/grading/ui/ReportResource.java
index cd5494e6648..18a9edbf6eb 100644
--- a/src/main/java/org/olat/modules/grading/ui/ReportResource.java
+++ b/src/main/java/org/olat/modules/grading/ui/ReportResource.java
@@ -164,8 +164,8 @@ public class ReportResource extends OpenXMLWorkbookResource {
 	
 	private void createGradersData(OpenXMLWorksheet gradersSheet, OpenXMLWorkbook workbook) {
 		GradersSearchParameters searchParams = new GradersSearchParameters();
-		searchParams.setGradingFrom(from);
-		searchParams.setGradingTo(to);
+		searchParams.setClosedFromDate(from);
+		searchParams.setClosedToDate(to);
 		searchParams.setManager(manager);
 		searchParams.setGrader(grader);
 		searchParams.setReferenceEntry(referenceEntry);
-- 
GitLab