diff --git a/src/main/java/org/fenixedu/academic/task/EventNotificationTask.java b/src/main/java/org/fenixedu/academic/task/EventNotificationTask.java index 85a0af6fc93..29ee1a84489 100644 --- a/src/main/java/org/fenixedu/academic/task/EventNotificationTask.java +++ b/src/main/java/org/fenixedu/academic/task/EventNotificationTask.java @@ -2,7 +2,9 @@ import java.math.BigDecimal; import java.util.HashMap; +import java.util.Locale; import java.util.Map; +import java.util.Optional; import java.util.stream.Stream; import org.fenixedu.academic.domain.Person; @@ -10,9 +12,12 @@ import org.fenixedu.academic.domain.accounting.calculator.DebtInterestCalculator; import org.fenixedu.academic.domain.organizationalStructure.Party; import org.fenixedu.bennu.core.domain.Bennu; +import org.fenixedu.bennu.core.domain.User; +import org.fenixedu.bennu.core.domain.UserProfile; import org.fenixedu.bennu.core.groups.Group; import org.fenixedu.bennu.scheduler.CronTask; import org.fenixedu.bennu.scheduler.annotation.Task; +import org.fenixedu.commons.i18n.I18N; import org.fenixedu.messaging.core.domain.Message; import org.fenixedu.messaging.core.domain.MessageTemplate; import org.fenixedu.messaging.core.template.DeclareMessageTemplate; @@ -75,8 +80,8 @@ private Map paramMap(final Event event, final String key, final return params; } - private String createMessage(final String templateKey, final Event event, final String paramKey, final String paramValue) { - return MessageTemplate.get(templateKey).getCompiledTextBody(paramMap(event, paramKey, paramValue)).getContent(); + private String createMessage(final String templateKey, final Event event, final String paramKey, final String paramValue, final Locale locale) { + return MessageTemplate.get(templateKey).getCompiledTextBody(paramMap(event, paramKey, paramValue)).getContent(locale); } @Override @@ -91,36 +96,45 @@ public void runTask() throws Exception { } private void process(final Party party, final DateTime now, final LocalDate afterTomorrow, final LocalDate yesterday) { - FenixFramework.atomic(() -> { - if (party.isPerson()) { - final Person person = (Person) party; + try { + FenixFramework.atomic(() -> { + if (party.isPerson()) { + final Person person = (Person) party; + final User user = person.getUser(); + if (user != null) { + final Locale locale = getLocale(person); - final String message = person.getEventsSet().stream() - .flatMap(e -> generateNotifications(e, now, afterTomorrow, yesterday)) - .reduce("", String::concat); - if (!message.isEmpty()) { - Message.fromSystem() - .to(Group.users(person.getUser())) - .template("event.notifications") - .parameter("notificationMessage", message) - .and() - .wrapped() - .send(); + final String message = person.getEventsSet().stream() + .flatMap(e -> generateNotifications(e, now, afterTomorrow, yesterday, locale)) + .reduce("", String::concat); + if (!message.isEmpty()) { + Message.fromSystem() + .preferredLocale(locale) + .to(Group.users(person.getUser())) + .template("event.notifications") + .parameter("notificationMessage", message) + .and() + .wrapped() + .send(); + } + } } - } - }); + }); + } catch (final Throwable t) { + taskLog("Unable to process party: %s - %s%n", party.getExternalId(), t.getMessage()); + } } - private Stream generateNotifications(final Event event, final DateTime now, final LocalDate afterTomorrow, final LocalDate yesterday) { + private Stream generateNotifications(final Event event, final DateTime now, final LocalDate afterTomorrow, final LocalDate yesterday, final Locale locale) { try { final DebtInterestCalculator calculator = event.getDebtInterestCalculator(now); if (event.getWhenOccured().toLocalDate().equals(yesterday) && calculator.getDueAmount().signum() == 1) { - return Stream.of(createMessage("event.notification.new.event", event, "debtAmount", calculator.getDebtAmount().toPlainString())); + return Stream.of(createMessage("event.notification.new.event", event, "debtAmount", calculator.getDebtAmount().toPlainString(), locale)); } final Stream dueAmountNotifications = calculator.getDebtsOrderedByDueDate().stream() .filter(d -> d.isOpen() && d.getDueDate().equals(afterTomorrow)) - .map(d -> createMessage("event.notification.due.event", event, "dueAmount", d.getAmount().toPlainString())); + .map(d -> createMessage("event.notification.due.event", event, "dueAmount", d.getAmount().toPlainString(), locale)); final BigDecimal totalUnusedAmount = calculator.getTotalUnusedAmount(); if (totalUnusedAmount.signum() == 1) { @@ -129,7 +143,7 @@ private Stream generateNotifications(final Event event, final DateTime n .max((dt1, dt2) -> dt1.compareTo(dt2)) .orElse(null); if (lastPaymentDate != null && lastPaymentDate.toLocalDate().equals(yesterday)) { - return Stream.concat(dueAmountNotifications, Stream.of(createMessage("event.notification.unused.amount", event, "totalUnusedAmount", totalUnusedAmount.toPlainString()))); + return Stream.concat(dueAmountNotifications, Stream.of(createMessage("event.notification.unused.amount", event, "totalUnusedAmount", totalUnusedAmount.toPlainString(), locale))); } } return dueAmountNotifications; @@ -139,4 +153,8 @@ private Stream generateNotifications(final Event event, final DateTime n } } + private static Locale getLocale(final Person person) { + return Optional.ofNullable(person.getProfile()).map(UserProfile::getPreferredLocale).orElseGet(I18N::getLocale); + } + }