From b64ee7125bebdb9db9bb08dcf312c82972cc227a Mon Sep 17 00:00:00 2001
From: uhensler <urs.hensler@frentix.com>
Date: Wed, 8 May 2019 11:55:16 +0200
Subject: [PATCH] OO-4028: Send e-mails of certificate copy with customized
 message

---
 .../manager/CertificatesManagerImpl.java      | 80 ++++++++++++++-----
 .../ui/_i18n/LocalStrings_de.properties       |  4 +-
 .../ui/_i18n/LocalStrings_en.properties       |  2 +
 3 files changed, 64 insertions(+), 22 deletions(-)

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 bf22e2d394b..2e82a76dd4a 100644
--- a/src/main/java/org/olat/course/certificate/manager/CertificatesManagerImpl.java
+++ b/src/main/java/org/olat/course/certificate/manager/CertificatesManagerImpl.java
@@ -30,9 +30,11 @@ import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Collections;
 import java.util.Date;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Properties;
+import java.util.Set;
 import java.util.UUID;
 
 import javax.annotation.Resource;
@@ -83,7 +85,6 @@ import org.olat.core.util.Util;
 import org.olat.core.util.WebappHelper;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.i18n.I18nManager;
-import org.olat.core.util.mail.ContactList;
 import org.olat.core.util.mail.MailBundle;
 import org.olat.core.util.mail.MailManager;
 import org.olat.core.util.mail.MailerResult;
@@ -958,46 +959,83 @@ public class CertificatesManagerImpl implements CertificatesManager, MessageList
 	}
 	
 	private MailerResult sendCertificate(Identity to, RepositoryEntry entry, File certificateFile, CertificateConfig config) {
+		MailerResult mailerResult = sendCertificate(to, entry, certificateFile);
+		sendCertificateCopies(to, entry, certificateFile, config);
+		return mailerResult;
+	}
+
+	private MailerResult sendCertificate(Identity to, RepositoryEntry entry, File certificateFile) {
 		MailBundle bundle = new MailBundle();
 		bundle.setToId(to);
 		bundle.setFrom(WebappHelper.getMailConfig("mailReplyTo"));
 		
+		String[] args = new String[] {
+			entry.getDisplayname(),
+			userManager.getUserDisplayName(to)
+		};
+		
+		String userLanguage = to.getUser().getPreferences().getLanguage();
+		Locale locale = i18nManager.getLocaleOrDefault(userLanguage);
+		Translator translator = Util.createPackageTranslator(CertificateController.class, locale);
+		String subject = translator.translate("certification.email.subject", args);
+		String body = translator.translate("certification.email.body", args);
+		bundle.setContent(subject, body, certificateFile);
+		return mailManager.sendMessage(bundle);
+	}
+	
+	private void sendCertificateCopies(Identity to, RepositoryEntry entry, File certificateFile, CertificateConfig config) {
+		String entryDisplayName = entry.getDisplayname();
+		String toDisplayName = userManager.getUserDisplayName(to);
+		String toUserLanguage = to.getUser().getPreferences().getLanguage();
+
+		List<MailBundle> mailBundles = new ArrayList<>();
 		List<String> bccs = certificatesModule.getCertificatesBccEmails();
-		List<ContactList> contactLists = new ArrayList<>(3);
-		if(config.isSendEmailBcc() && bccs.size() > 0) {
-			ContactList bcc = new ContactList();
-			bccs.forEach(email -> { bcc.add(email); });
-			contactLists.add(bcc);
+		if(config.isSendEmailBcc()) {
+			for (String bcc : bccs) {
+				MailBundle bundle = createCopyMailBundle(certificateFile, toUserLanguage, entryDisplayName, toDisplayName);
+				bundle.setTo(bcc);
+				mailBundles.add(bundle);
+			}
 		}
+		
+		Set<Identity> copiesTo = new HashSet<>();
 		if (config.isSendEmailLinemanager() && certificatesModule.isCertificateLinemanager()) {
 			List<Identity> linemanagers = getLinemanagers(to);
-			ContactList linemanagerContactList = new ContactList();
-			linemanagers.forEach(lm -> { linemanagerContactList.add(lm); });
-			contactLists.add(linemanagerContactList);
+			copiesTo.addAll(linemanagers);
 		}
 		if (config.isSendEmailIdentityRelations() && baseSecurityModule.isRelationRoleEnabled()) {
 			RelationSearchParams searchParams = new RelationSearchParams();
 			RelationRight right = identityRelationshipService.getRelationRightByRight(CertificateEmailRightProvider.RELATION_RIGHT);
 			searchParams.setRight(right);
 			List<IdentityToIdentityRelation> relationTargets = identityRelationshipService.getRelationsAsTarget(to, searchParams);
-			ContactList relationTargetsList = new ContactList();
-			relationTargets.forEach(target -> { relationTargetsList.add( target.getSource()); });
-			contactLists.add(relationTargetsList);
+			relationTargets.forEach(target -> { copiesTo.add( target.getSource()); });
 		}
-		bundle.setContactLists(contactLists);
+		
+		for (Identity copyTo : copiesTo) {
+			String language = copyTo.getUser().getPreferences().getLanguage();
+			MailBundle bundle = createCopyMailBundle(certificateFile, language, entryDisplayName, toDisplayName);
+			bundle.setToId(copyTo);
+			mailBundles.add(bundle);
+		}
+		
+		for (MailBundle mailBundle : mailBundles) {
+			mailManager.sendMessage(mailBundle);
+		}
+	}
 
+	private MailBundle createCopyMailBundle(File certificateFile, String language, String entryDisplayName, String toDisplayName) {
 		String[] args = new String[] {
-			entry.getDisplayname(),
-			userManager.getUserDisplayName(to)
+				entryDisplayName,
+				toDisplayName
 		};
-		
-		String userLanguage = to.getUser().getPreferences().getLanguage();
-		Locale locale = i18nManager.getLocaleOrDefault(userLanguage);
+		MailBundle bundle = new MailBundle();
+		bundle.setFrom(WebappHelper.getMailConfig("mailReplyTo"));
+		Locale locale = i18nManager.getLocaleOrDefault(language);
 		Translator translator = Util.createPackageTranslator(CertificateController.class, locale);
-		String subject = translator.translate("certification.email.subject", args);
-		String body = translator.translate("certification.email.body", args);
+		String subject = translator.translate("certification.email.copy.subject", args);
+		String body = translator.translate("certification.email.copy.body", args);
 		bundle.setContent(subject, body, certificateFile);
-		return mailManager.sendMessage(bundle);
+		return bundle;
 	}
 	
 	private List<Identity> getLinemanagers(Identity identity) {
diff --git a/src/main/java/org/olat/course/certificate/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/certificate/ui/_i18n/LocalStrings_de.properties
index 04037660d32..70e4302fde6 100644
--- a/src/main/java/org/olat/course/certificate/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/course/certificate/ui/_i18n/LocalStrings_de.properties
@@ -60,8 +60,10 @@ upload.wrong.mimetype=Vorlagen k\u00F6nnen nur als ZIP-Datei oder im PDF-Vorlage
 notifications.title=Neue Zertifikate in Kurs "{0}"
 notifications.desc={0} hat ein neues Zertifikat erhalten.
 notifications.header=Neue Zertifikate in Kurs "{0}"
-certification.email.subject=Sie haben ein OpenOLAT-Zertifikat erhalten
 certification.email.body=<h1>Herzliche Gratulation\!</h1>Sie haben ein Zertifikat erhalten.<br/><br/>Als Anhang finden Sie das Zertifikat des Kurses "{0}".<br/><br/>
+certification.email.copy.body=<h1>Zertifikat f\u00FCr {1}</h1>{1} hat ein Zertifikat erhalten.<br/><br/>Als Anhang finden Sie das Zertifikat des Kurses "{0}".<br/><br/>
+certification.email.copy.subject={1} hat ein OpenOLAT-Zertifikat erhalten
+certification.email.subject=Sie haben ein OpenOLAT-Zertifikat erhalten
 confirm.certificate.title=Zertifikat erstellen
 confirm.certificate.text=Es wurde bereits ein Zertifikat ausgestellt und die Wartezeit f\u00FCr die Rezertifizierung ist noch nicht abgelaufen. M\u00F6chten Sie dennoch ein neues Zertifikat erstellen?
 confirm.certificate.template.deleted=Die Vorlage "{0}" wurde gel\u00F6scht.
diff --git a/src/main/java/org/olat/course/certificate/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/certificate/ui/_i18n/LocalStrings_en.properties
index 61423435de1..093c9797157 100644
--- a/src/main/java/org/olat/course/certificate/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/course/certificate/ui/_i18n/LocalStrings_en.properties
@@ -19,6 +19,8 @@ certificates.wizard.overview=Overview
 certificates.wizard.select=Select user
 certificates.wizard.title=Create certificates
 certification.email.body=<h1>Congratulations\!</h1>You have received a certification.<br/><br/>As an attachment you will find the certificate of the course "{0}".<br/><br/>
+certification.email.copy.body=<h1>Certification of {1}</h1>{1} has received a certification.<br/><br/>As an attachment you will find the certificate of the course "{0}".<br/><br/>
+certification.email.copy.subject={1} has received an OpenOLAT certification
 certification.email.subject=You have received an OpenOLAT certification
 error.mail.invalid=Please provide a valid e-mail address.
 choose.title=Select template
-- 
GitLab