From 93ed902edb0a0c82a20dba76830de9e10e3dc00c Mon Sep 17 00:00:00 2001 From: Kheireddine Mehdi Date: Mon, 11 Nov 2024 10:47:42 +0100 Subject: [PATCH] add send meeting details to guests --- .../src/main/resources/domains/AppBase.xml | 2 +- .../apps/crm/exception/IExceptionMessage.java | 6 ++++ .../axelor/apps/crm/service/EventService.java | 19 ++++++++++ .../apps/crm/service/EventServiceImpl.java | 35 +++++++++++++++++++ .../axelor/apps/crm/web/EventController.java | 34 ++++++++++++++++++ .../service/TemplateMessageService.java | 6 ++++ .../service/TemplateMessageServiceImpl.java | 28 ++++++++++++++- 7 files changed, 128 insertions(+), 2 deletions(-) diff --git a/modules/axelor-open-suite/axelor-base/src/main/resources/domains/AppBase.xml b/modules/axelor-open-suite/axelor-base/src/main/resources/domains/AppBase.xml index dc245a11..274486a4 100644 --- a/modules/axelor-open-suite/axelor-base/src/main/resources/domains/AppBase.xml +++ b/modules/axelor-open-suite/axelor-base/src/main/resources/domains/AppBase.xml @@ -79,7 +79,7 @@ - + diff --git a/modules/axelor-open-suite/axelor-crm/src/main/java/com/axelor/apps/crm/exception/IExceptionMessage.java b/modules/axelor-open-suite/axelor-crm/src/main/java/com/axelor/apps/crm/exception/IExceptionMessage.java index c78429ea..c8794856 100644 --- a/modules/axelor-open-suite/axelor-crm/src/main/java/com/axelor/apps/crm/exception/IExceptionMessage.java +++ b/modules/axelor-open-suite/axelor-crm/src/main/java/com/axelor/apps/crm/exception/IExceptionMessage.java @@ -58,6 +58,12 @@ public interface IExceptionMessage { static final String EVENT_SAVED = /*$$(*/ "Please save the event before setting the recurrence" /*)*/; + static final String EVENT_MEETING_INVITATION_1 = /*$$(*/ + "No PERSON IS INVITED TO THIS MEETING" /*)*/; + + static final String USER_EMAIL_1 = /*$$(*/ + "No email address associated to %s" /*)*/; + /** Lead controller */ static final String LEAD_1 = /*$$(*/ "Please select the Lead(s) to print." /*)*/; diff --git a/modules/axelor-open-suite/axelor-crm/src/main/java/com/axelor/apps/crm/service/EventService.java b/modules/axelor-open-suite/axelor-crm/src/main/java/com/axelor/apps/crm/service/EventService.java index 7b8b31f2..322f9c8a 100644 --- a/modules/axelor-open-suite/axelor-crm/src/main/java/com/axelor/apps/crm/service/EventService.java +++ b/modules/axelor-open-suite/axelor-crm/src/main/java/com/axelor/apps/crm/service/EventService.java @@ -23,10 +23,14 @@ import com.axelor.apps.crm.db.RecurrenceConfiguration; import com.axelor.apps.message.db.EmailAddress; import com.axelor.auth.db.User; import com.axelor.exception.AxelorException; +import java.io.IOException; +import javax.mail.MessagingException; import com.axelor.meta.CallMethod; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Map; +import java.util.List; +import java.util.Set; public interface EventService { @@ -74,4 +78,19 @@ public interface EventService { void generateRecurrentEvents(Event event, RecurrenceConfiguration conf) throws AxelorException; public EmailAddress getEmailAddress(Event event); + + /** + * Processs changed user password. + * + * @param Set + * @throws ClassNotFoundException + * @throws InstantiationException + * @throws IllegalAccessException + * @throws MessagingException + * @throws IOException + * @throws AxelorException + */ + + void sendEmailMeetingInvitation(Event event,Set users) throws ClassNotFoundException, InstantiationException, IllegalAccessException, + MessagingException, IOException, AxelorException; } diff --git a/modules/axelor-open-suite/axelor-crm/src/main/java/com/axelor/apps/crm/service/EventServiceImpl.java b/modules/axelor-open-suite/axelor-crm/src/main/java/com/axelor/apps/crm/service/EventServiceImpl.java index 73b9dd7a..43113eb0 100644 --- a/modules/axelor-open-suite/axelor-crm/src/main/java/com/axelor/apps/crm/service/EventServiceImpl.java +++ b/modules/axelor-open-suite/axelor-crm/src/main/java/com/axelor/apps/crm/service/EventServiceImpl.java @@ -17,6 +17,9 @@ */ package com.axelor.apps.crm.service; + +import com.axelor.apps.base.db.AppBase; +import com.axelor.apps.base.service.app.AppBaseService; import com.axelor.apps.base.db.Address; import com.axelor.apps.base.db.ICalendarUser; import com.axelor.apps.base.db.Partner; @@ -34,8 +37,11 @@ import com.axelor.apps.message.db.EmailAddress; import com.axelor.apps.message.db.repo.EmailAddressRepository; import com.axelor.apps.message.service.MessageService; import com.axelor.apps.message.service.TemplateMessageService; +import com.axelor.apps.message.db.Template; import com.axelor.auth.db.User; import com.axelor.exception.AxelorException; +import javax.mail.MessagingException; +import java.io.IOException; import com.axelor.exception.db.repo.TraceBackRepository; import com.axelor.i18n.I18n; import com.axelor.inject.Beans; @@ -54,6 +60,7 @@ import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAdjusters; import java.util.HashMap; import java.util.List; +import java.util.Set; import java.util.Map; import java.util.function.BiFunction; import java.util.function.Function; @@ -655,4 +662,32 @@ public class EventServiceImpl implements EventService { } return emailAddress; } + + @Override + public void sendEmailMeetingInvitation(Event event, Set users) throws ClassNotFoundException, InstantiationException, IllegalAccessException, + MessagingException, IOException, AxelorException { + AppBase appBase = Beans.get(AppBaseService.class).getAppBase(); + Template template = appBase.getSendMailToInvitedPersonInMeetingTemplate(); + + if (template == null) { + throw new AxelorException( + appBase, + TraceBackRepository.CATEGORY_NO_VALUE, + I18n.get("Template for sending meeting invitation is missing.") + ); + } + + TemplateMessageService templateMessageService = Beans.get(TemplateMessageService.class); + + try { + templateMessageService.generateAndSendMessageToBulkUsers(event, template, users); + } catch (MessagingException e) { + throw new AxelorException( + TraceBackRepository.CATEGORY_NO_VALUE, + I18n.get("Failed to send meeting invitation email."), + e + ); + } + } + } diff --git a/modules/axelor-open-suite/axelor-crm/src/main/java/com/axelor/apps/crm/web/EventController.java b/modules/axelor-open-suite/axelor-crm/src/main/java/com/axelor/apps/crm/web/EventController.java index 9bfcef7c..1c67c317 100644 --- a/modules/axelor-open-suite/axelor-crm/src/main/java/com/axelor/apps/crm/web/EventController.java +++ b/modules/axelor-open-suite/axelor-crm/src/main/java/com/axelor/apps/crm/web/EventController.java @@ -63,6 +63,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; +import java.util.Set; import java.util.Map; import org.apache.commons.math3.ode.events.EventState; @@ -604,4 +605,37 @@ public class EventController { response.setView(ActionView.define(eventName).add("html", fileLink).map()); } + public void sendMailToGuests(ActionRequest request, ActionResponse response) throws AxelorException { + + Event event = request.getContext().asType(Event.class); + event = Beans.get(EventRepository.class).find(event.getId()); + + Set users = event.getGuestList(); + if (event.getUser() != null) + users.add(event.getUser()); + users.add(event.getCreatedBy()); + + if (!users.isEmpty()) { + // Check if all users have an email address + for (User user : users) { + if (user.getEmail() == null) { + response.setFlash(I18n.get(String.format(IExceptionMessage.USER_EMAIL_1, user.getName()))); + return; // Exit the method if any user lacks an email + } + } + + // All users have emails; proceed to send emails + try { + Beans.get(EventService.class).sendEmailMeetingInvitation(event,users); + } catch (Exception e) { + LOG.error(e.getMessage()); + return; // Exit if any email fails to send + } + + response.setFlash(I18n.get("Emails successfully sent to all guests.")); + + } else { + response.setFlash(I18n.get(IExceptionMessage.EVENT_MEETING_INVITATION_1)); + } + } } diff --git a/modules/axelor-open-suite/axelor-message/src/main/java/com/axelor/apps/message/service/TemplateMessageService.java b/modules/axelor-open-suite/axelor-message/src/main/java/com/axelor/apps/message/service/TemplateMessageService.java index dab2f798..2660821d 100644 --- a/modules/axelor-open-suite/axelor-message/src/main/java/com/axelor/apps/message/service/TemplateMessageService.java +++ b/modules/axelor-open-suite/axelor-message/src/main/java/com/axelor/apps/message/service/TemplateMessageService.java @@ -26,6 +26,8 @@ import com.axelor.tool.template.TemplateMaker; import java.io.IOException; import java.util.Set; import javax.mail.MessagingException; +import com.axelor.auth.db.User; +import java.util.List; public interface TemplateMessageService { @@ -41,6 +43,10 @@ public interface TemplateMessageService { throws MessagingException, IOException, AxelorException, ClassNotFoundException, InstantiationException, IllegalAccessException; + public Message generateAndSendMessageToBulkUsers(Model model, Template template, Set users) + throws MessagingException, IOException, AxelorException, ClassNotFoundException, + InstantiationException, IllegalAccessException; + public Set getMetaFiles(Template template) throws AxelorException, IOException; public TemplateMaker initMaker(long objectId, String model, String tag, boolean isJson) diff --git a/modules/axelor-open-suite/axelor-message/src/main/java/com/axelor/apps/message/service/TemplateMessageServiceImpl.java b/modules/axelor-open-suite/axelor-message/src/main/java/com/axelor/apps/message/service/TemplateMessageServiceImpl.java index 179bb09e..06b7f254 100644 --- a/modules/axelor-open-suite/axelor-message/src/main/java/com/axelor/apps/message/service/TemplateMessageServiceImpl.java +++ b/modules/axelor-open-suite/axelor-message/src/main/java/com/axelor/apps/message/service/TemplateMessageServiceImpl.java @@ -53,10 +53,13 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.ArrayList; import java.util.Set; +import java.util.HashSet; import javax.mail.MessagingException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.axelor.auth.db.User; public class TemplateMessageServiceImpl implements TemplateMessageService { @@ -197,7 +200,10 @@ public class TemplateMessageServiceImpl implements TemplateMessageService { message.setTemplate(Beans.get(TemplateRepository.class).find(template.getId())); - message = Beans.get(MessageRepository.class).save(message); + // Save message if it's not related to the USER model + if (!"com.axelor.auth.db.User".equals(model)) { + message = Beans.get(MessageRepository.class).save(message); + } messageService.attachMetaFiles(message, getMetaFiles(template)); @@ -215,6 +221,26 @@ public class TemplateMessageServiceImpl implements TemplateMessageService { return message; } + @Override + public Message generateAndSendMessageToBulkUsers(Model model, Template template, Set users) + throws MessagingException, IOException, AxelorException, ClassNotFoundException, + InstantiationException, IllegalAccessException { + + Message message = this.generateMessage(model, template); + Set emailAddresses = new HashSet<>(); + for (User user : users) { + emailAddresses.add(getEmailAddress(user.getEmail())); + } + + // Set recipients as sets + message.setToEmailAddressSet(emailAddresses); + message.setCcEmailAddressSet(emailAddresses); + + messageService.sendMessage(message); + + return message; + } + @Override public Set getMetaFiles(Template template) throws AxelorException, IOException {