From ef052552a7cce38397f83f037106a02eadff18f2 Mon Sep 17 00:00:00 2001
From: hg <none@none>
Date: Thu, 16 Jun 2016 15:22:23 +0200
Subject: [PATCH] OO-2063 add next recertification date to certificate

---
 .../certificate/CertificatesManager.java      |  8 +++
 .../manager/CertificatePDFFormWorker.java     | 24 +++++++--
 .../manager/CertificatePhantomWorker.java     | 18 +++++--
 .../manager/CertificatesManagerImpl.java      | 53 +++++++++++++------
 4 files changed, 78 insertions(+), 25 deletions(-)

diff --git a/src/main/java/org/olat/course/certificate/CertificatesManager.java b/src/main/java/org/olat/course/certificate/CertificatesManager.java
index d9d8377ca0c..2f177e07609 100644
--- a/src/main/java/org/olat/course/certificate/CertificatesManager.java
+++ b/src/main/java/org/olat/course/certificate/CertificatesManager.java
@@ -148,6 +148,14 @@ public interface CertificatesManager {
 	
 	public boolean isCertificationAllowed(Identity identity, RepositoryEntry entry);
 	
+	/**
+	 * Get the next re-certification date or NULL if no recertification possible
+	 * @param certificate An exiting certificate
+	 * @param entry The repository entry of the course
+	 * @return Date representing the next possible recertification date or NULL if no recertification possible at this time
+	 */
+	public Date getDateNextRecertification(Certificate certificate, RepositoryEntry entry);
+	
 	public File previewCertificate(CertificateTemplate template, RepositoryEntry entry, Locale locale);
 
 	public Certificate uploadCertificate(Identity identity, Date creationDate, OLATResource resource, File certificateFile);
diff --git a/src/main/java/org/olat/course/certificate/manager/CertificatePDFFormWorker.java b/src/main/java/org/olat/course/certificate/manager/CertificatePDFFormWorker.java
index e0cc995f86f..6f866c6b426 100644
--- a/src/main/java/org/olat/course/certificate/manager/CertificatePDFFormWorker.java
+++ b/src/main/java/org/olat/course/certificate/manager/CertificatePDFFormWorker.java
@@ -68,6 +68,7 @@ public class CertificatePDFFormWorker {
 
 	private Date dateCertification;
 	private Date dateFirstCertification;
+	private Date dateNextRecertification;
 
 	private final Locale locale;
 	private final UserManager userManager;
@@ -75,7 +76,7 @@ public class CertificatePDFFormWorker {
 
 	public CertificatePDFFormWorker(Identity identity, RepositoryEntry entry,
 			Float score, Boolean passed, Date dateCertification,
-			Date dateFirstCertification, Locale locale,
+			Date dateFirstCertification, Date dateNextRecertification, Locale locale,
 			UserManager userManager, CertificatesManagerImpl certificatesManager) {
 		this.entry = entry;
 		this.score = score;
@@ -84,6 +85,7 @@ public class CertificatePDFFormWorker {
 		this.identity = identity;
 		this.dateCertification = dateCertification;
 		this.dateFirstCertification = dateFirstCertification;
+		this.dateNextRecertification = dateNextRecertification;
 		this.userManager = userManager;
 		this.certificatesManager = certificatesManager;
 	}
@@ -201,10 +203,11 @@ public class CertificatePDFFormWorker {
 		if(dateCertification == null) {
 			fillField("dateCertification", "", acroForm);
 		} else {
-			String formattedDateCertification= format.formatDate(dateCertification);
+			String formattedDateCertification = format.formatDate(dateCertification);
 			fillField("dateCertification", formattedDateCertification, acroForm);
-			String formattedDateCertificationLong= format.formatDateLong(dateCertification);
-			fillField("dateCertificationLong", formattedDateCertificationLong, acroForm);		}
+			String formattedDateCertificationLong = format.formatDateLong(dateCertification);
+			fillField("dateCertificationLong", formattedDateCertificationLong, acroForm);		
+		}
 		
 		if(dateFirstCertification == null) {
 			fillField("dateFirstCertification", "", acroForm);
@@ -212,7 +215,18 @@ public class CertificatePDFFormWorker {
 			String formattedDateFirstCertification = format.formatDate(dateFirstCertification);
 			fillField("dateFirstCertification", formattedDateFirstCertification, acroForm);
 			String formattedDateFirstCertificationLong = format.formatDate(dateFirstCertification);
-			fillField("dateFirstCertificationLong", formattedDateFirstCertificationLong, acroForm);		}
+			fillField("dateFirstCertificationLong", formattedDateFirstCertificationLong, acroForm);		
+		}
+		
+		if(dateNextRecertification == null) {
+			fillField("dateNextRecertification", "", acroForm);
+		} else {
+			String formattedDateNextRecertification = format.formatDate(dateNextRecertification);
+			fillField("dateNextRecertification", formattedDateNextRecertification, acroForm);
+			String formattedDateNextRecertificationLong = format.formatDateLong(dateNextRecertification);
+			fillField("dateNextRecertificationLong", formattedDateNextRecertificationLong, acroForm);
+		}		
+
 	}
 	
 	private void fillAssessmentInfos(PDAcroForm acroForm) throws IOException {
diff --git a/src/main/java/org/olat/course/certificate/manager/CertificatePhantomWorker.java b/src/main/java/org/olat/course/certificate/manager/CertificatePhantomWorker.java
index 2c938cbeca4..d8fc9696503 100644
--- a/src/main/java/org/olat/course/certificate/manager/CertificatePhantomWorker.java
+++ b/src/main/java/org/olat/course/certificate/manager/CertificatePhantomWorker.java
@@ -68,6 +68,7 @@ public class CertificatePhantomWorker {
 
 	private Date dateCertification;
 	private Date dateFirstCertification;
+	private Date dateNextRecertification;
 
 	private final Locale locale;
 	private final UserManager userManager;
@@ -75,7 +76,7 @@ public class CertificatePhantomWorker {
 
 	public CertificatePhantomWorker(Identity identity, RepositoryEntry entry,
 			Float score, Boolean passed, Date dateCertification,
-			Date dateFirstCertification, Locale locale,
+			Date dateFirstCertification, Date nextRecertificationDate, Locale locale,
 			UserManager userManager, CertificatesManagerImpl certificatesManager) {
 		this.entry = entry;
 		this.score = score;
@@ -84,6 +85,7 @@ public class CertificatePhantomWorker {
 		this.identity = identity;
 		this.dateCertification = dateCertification;
 		this.dateFirstCertification = dateFirstCertification;
+		this.dateNextRecertification = nextRecertificationDate;
 		this.userManager = userManager;
 		this.certificatesManager = certificatesManager;
 	}
@@ -215,9 +217,9 @@ public class CertificatePhantomWorker {
 		if(dateCertification == null) {
 			context.put("dateCertification", "");
 		} else {
-			String formattedDateCertification= format.formatDate(dateCertification);
+			String formattedDateCertification = format.formatDate(dateCertification);
 			context.put("dateCertification", formattedDateCertification);
-			String formattedDateCertificationLong= format.formatDateLong(dateCertification);
+			String formattedDateCertificationLong = format.formatDateLong(dateCertification);
 			context.put("dateCertificationLong", formattedDateCertificationLong);
 			context.put("dateCertificationRaw", dateCertification);
 		}
@@ -231,6 +233,16 @@ public class CertificatePhantomWorker {
 			context.put("dateFirstCertificationLong", formattedDateFirstCertificationLong);
 			context.put("dateFirstCertificationRaw", dateFirstCertification);
 		}
+
+		if(dateNextRecertification == null) {
+			context.put("dateNextRecertification", "");
+		} else {
+			String formattedDateNextRecertification = format.formatDate(dateNextRecertification);
+			context.put("dateNextRecertification", formattedDateNextRecertification);
+			String formattedDateNextRecertificationLong = format.formatDateLong(dateNextRecertification);
+			context.put("dateNextRecertificationLong", formattedDateNextRecertificationLong);
+			context.put("dateNextRecertificationRaw", dateNextRecertification);
+		}		
 	}
 	
 	private void fillAssessmentInfos(VelocityContext context) {
diff --git a/src/main/java/org/olat/course/certificate/manager/CertificatesManagerImpl.java b/src/main/java/org/olat/course/certificate/manager/CertificatesManagerImpl.java
index 3c734242043..35aeb436178 100644
--- a/src/main/java/org/olat/course/certificate/manager/CertificatesManagerImpl.java
+++ b/src/main/java/org/olat/course/certificate/manager/CertificatesManagerImpl.java
@@ -518,24 +518,14 @@ public class CertificatesManagerImpl implements CertificatesManager, MessageList
 			ICourse course = CourseFactory.loadCourse(entry);
 			CourseConfig config = course.getCourseEnvironment().getCourseConfig();
 			if(config.isRecertificationEnabled()) {
-				int time = config.getRecertificationTimelapse();
-				RecertificationTimeUnit timeUnit = config.getRecertificationTimelapseUnit();
 				Certificate certificate =  getLastCertificate(identity, entry.getOlatResource().getKey());
 				if(certificate == null) {
 					allowed = true;
 				} else {
-					Date date = certificate.getCreationDate();
 					Calendar cal = Calendar.getInstance();
 					Date now = cal.getTime();
-					cal.setTime(date);
-					switch(timeUnit) {
-						case day: cal.add(Calendar.DATE, time); break;
-						case week: cal.add(Calendar.DATE, time * 7); break;
-						case month: cal.add(Calendar.MONTH, time); break;
-						case year: cal.add(Calendar.YEAR, time); break;
-					}
-					Date nextCertification = cal.getTime();
-					allowed = nextCertification.before(now);
+					Date nextCertificationDate = getDateNextRecertification(certificate, config);
+					allowed = (nextCertificationDate != null ? nextCertificationDate.before(now) : false);
 				}
 			} else {
 				allowed = !hasCertificate(identity, entry.getOlatResource().getKey());
@@ -546,6 +536,34 @@ public class CertificatesManagerImpl implements CertificatesManager, MessageList
 		return allowed;
 	}
 	
+	@Override
+	public Date getDateNextRecertification(Certificate certificate, RepositoryEntry entry) {
+		ICourse course = CourseFactory.loadCourse(entry);
+		CourseConfig config = course.getCourseEnvironment().getCourseConfig();
+		return getDateNextRecertification(certificate, config);
+	}
+
+	private Date getDateNextRecertification(Certificate certificate, CourseConfig config) {
+		if(config.isRecertificationEnabled() && certificate != null) {
+			int time = config.getRecertificationTimelapse();
+			RecertificationTimeUnit timeUnit = config.getRecertificationTimelapseUnit();
+			Date date = certificate.getCreationDate();
+			Calendar cal = Calendar.getInstance();
+			cal.setTime(date);
+			switch(timeUnit) {
+				case day: cal.add(Calendar.DATE, time); break;
+				case week: cal.add(Calendar.DATE, time * 7); break;
+				case month: cal.add(Calendar.MONTH, time); break;
+				case year: cal.add(Calendar.YEAR, time); break;
+			}
+			Date nextCertification = cal.getTime();
+			return nextCertification;
+		} else {
+			return null;
+		}		
+	}
+
+	
 	@Override
 	public void deleteCertificate(Certificate certificate) {
 		File certificateFile = getCertificateFile(certificate);
@@ -678,15 +696,15 @@ public class CertificatesManagerImpl implements CertificatesManager, MessageList
 		File dirFile = new File(WebappHelper.getTmpDir(), UUID.randomUUID().toString());	
 		if(template == null) {
 			CertificatePDFFormWorker worker = new CertificatePDFFormWorker(identity, entry, 2.0f, true,
-					new Date(), new Date(), locale, userManager, this);
+					new Date(), new Date(), new Date(), locale, userManager, this);
 			certificateFile = worker.fill(null, dirFile, "Certificate.pdf");
 		} else if(template.getPath().toLowerCase().endsWith("pdf")) {
 			CertificatePDFFormWorker worker = new CertificatePDFFormWorker(identity, entry, 2.0f, true,
-					new Date(), new Date(), locale, userManager, this);
+					new Date(), new Date(), new Date(), locale, userManager, this);
 			certificateFile = worker.fill(template, dirFile, "Certificate.pdf");
 		} else {
 			CertificatePhantomWorker worker = new CertificatePhantomWorker(identity, entry, 2.0f, true,
-					new Date(), new Date(), locale, userManager, this);
+					new Date(), new Date(),new Date(),  locale, userManager, this);
 			certificateFile = worker.fill(template, dirFile, "Certificate.pdf");
 		}
 		return certificateFile;
@@ -815,6 +833,7 @@ public class CertificatesManagerImpl implements CertificatesManager, MessageList
 		Boolean passed = workUnit.getPassed();
 		Date dateCertification = certificate.getCreationDate();
 		Date dateFirstCertification = getDateFirstCertification(identity, resource.getKey());
+		Date dateNextRecertification = getDateNextRecertification(certificate, entry);
 		
 		File certificateFile;
 		StringBuilder sb = new StringBuilder();
@@ -825,7 +844,7 @@ public class CertificatesManagerImpl implements CertificatesManager, MessageList
 		String filename = FileUtils.normalizeFilename(sb.toString()) + ".pdf";
 		if(template == null || template.getPath().toLowerCase().endsWith("pdf")) {
 			CertificatePDFFormWorker worker = new CertificatePDFFormWorker(identity, entry, score, passed,
-					dateCertification, dateFirstCertification, locale, userManager, this);
+					dateCertification, dateFirstCertification, dateNextRecertification, locale, userManager, this);
 			certificateFile = worker.fill(template, dirFile, filename);
 			if(certificateFile == null) {
 				certificate.setStatus(CertificateStatus.error);
@@ -834,7 +853,7 @@ public class CertificatesManagerImpl implements CertificatesManager, MessageList
 			}
 		} else {
 			CertificatePhantomWorker worker = new CertificatePhantomWorker(identity, entry, score, passed,
-					dateCertification, dateFirstCertification, locale, userManager, this);
+					dateCertification, dateFirstCertification, dateNextRecertification, locale, userManager, this);
 			certificateFile = worker.fill(template, dirFile, filename);
 			if(certificateFile == null) {
 				certificate.setStatus(CertificateStatus.error);
-- 
GitLab