Java tutorial
/** * Axelor Business Solutions * * Copyright (C) 2015 Axelor (<http://axelor.com>). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.axelor.apps.crm.web; import java.io.IOException; import java.text.ParseException; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import javax.mail.MessagingException; import net.fortuna.ical4j.model.ValidationException; import org.joda.time.DateTimeConstants; import org.joda.time.Duration; import org.joda.time.LocalDate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.axelor.apps.base.db.IAdministration; import com.axelor.apps.base.db.Partner; import com.axelor.apps.base.ical.ICalendarException; import com.axelor.apps.base.service.MapService; import com.axelor.apps.base.service.administration.SequenceService; import com.axelor.apps.crm.db.Event; import com.axelor.apps.crm.db.IEvent; import com.axelor.apps.crm.db.Lead; import com.axelor.apps.crm.db.RecurrenceConfiguration; import com.axelor.apps.crm.db.repo.EventRepository; import com.axelor.apps.crm.db.repo.LeadRepository; import com.axelor.apps.crm.db.repo.RecurrenceConfigurationRepository; import com.axelor.apps.crm.exception.IExceptionMessage; import com.axelor.apps.crm.service.EventService; import com.axelor.apps.crm.service.LeadService; import com.axelor.apps.crm.service.config.CrmConfigService; import com.axelor.apps.message.db.EmailAddress; import com.axelor.apps.message.db.Template; import com.axelor.apps.message.db.repo.EmailAddressRepository; import com.axelor.auth.AuthUtils; import com.axelor.auth.db.User; import com.axelor.exception.AxelorException; import com.axelor.exception.db.IException; import com.axelor.i18n.I18n; import com.axelor.inject.Beans; import com.axelor.rpc.ActionRequest; import com.axelor.rpc.ActionResponse; import com.google.inject.Inject; import com.google.inject.persist.Transactional; public class EventController { private static final Logger LOG = LoggerFactory.getLogger(EventController.class); @Inject private EventRepository eventRepo; @Inject private EventService eventService; @Inject private LeadRepository leadRepo; @Inject private LeadService leadService; public void computeFromStartDateTime(ActionRequest request, ActionResponse response) { Event event = request.getContext().asType(Event.class); LOG.debug("event : {}", event); if (event.getStartDateTime() != null) { if (event.getDuration() != null && event.getDuration() != 0) { response.setValue("endDateTime", eventService.computeEndDateTime(event.getStartDateTime(), event.getDuration().intValue())); } else if (event.getEndDateTime() != null && event.getEndDateTime().isAfter(event.getStartDateTime())) { Duration duration = eventService.computeDuration(event.getStartDateTime(), event.getEndDateTime()); response.setValue("duration", eventService.getDuration(duration)); } } } public void computeFromEndDateTime(ActionRequest request, ActionResponse response) { Event event = request.getContext().asType(Event.class); LOG.debug("event : {}", event); if (event.getEndDateTime() != null) { if (event.getStartDateTime() != null && event.getStartDateTime().isBefore(event.getEndDateTime())) { Duration duration = eventService.computeDuration(event.getStartDateTime(), event.getEndDateTime()); response.setValue("duration", eventService.getDuration(duration)); } else if (event.getDuration() != null) { response.setValue("startDateTime", eventService.computeStartDateTime(event.getDuration().intValue(), event.getEndDateTime())); } } } public void computeFromDuration(ActionRequest request, ActionResponse response) { Event event = request.getContext().asType(Event.class); LOG.debug("event : {}", event); if (event.getDuration() != null) { if (event.getStartDateTime() != null) { response.setValue("endDateTime", eventService.computeEndDateTime(event.getStartDateTime(), event.getDuration().intValue())); } else if (event.getEndDateTime() != null) { response.setValue("startDateTime", eventService.computeStartDateTime(event.getDuration().intValue(), event.getEndDateTime())); } } } public void computeFromCalendar(ActionRequest request, ActionResponse response) { Event event = request.getContext().asType(Event.class); LOG.debug("event : {}", event); if (event.getStartDateTime() != null && event.getEndDateTime() != null) { Duration duration = eventService.computeDuration(event.getStartDateTime(), event.getEndDateTime()); response.setValue("duration", eventService.getDuration(duration)); } } public void setSequence(ActionRequest request, ActionResponse response) throws AxelorException { Event event = request.getContext().asType(Event.class); if (event.getTicketNumberSeq() == null && event.getTypeSelect() == IEvent.TICKET) { String seq = Beans.get(SequenceService.class).getSequenceNumber(IAdministration.EVENT_TICKET); if (seq == null) throw new AxelorException(I18n.get(IExceptionMessage.EVENT_1), IException.CONFIGURATION_ERROR); else response.setValue("ticketNumberSeq", seq); } } //TODO : replace by XML action public void saveEventTaskStatusSelect(ActionRequest request, ActionResponse response) throws AxelorException { Event event = request.getContext().asType(Event.class); Event persistEvent = eventRepo.find(event.getId()); persistEvent.setTaskStatusSelect(event.getTaskStatusSelect()); eventService.saveEvent(persistEvent); } //TODO : replace by XML action public void saveEventTicketStatusSelect(ActionRequest request, ActionResponse response) throws AxelorException { Event event = request.getContext().asType(Event.class); Event persistEvent = eventRepo.find(event.getId()); persistEvent.setTicketStatusSelect(event.getTicketStatusSelect()); eventService.saveEvent(persistEvent); } public void viewMap(ActionRequest request, ActionResponse response) { Event event = request.getContext().asType(Event.class); if (event.getLocation() != null) { Map<String, Object> result = Beans.get(MapService.class).getMap(event.getLocation()); if (result != null) { Map<String, Object> mapView = new HashMap<String, Object>(); mapView.put("title", "Map"); mapView.put("resource", result.get("url")); mapView.put("viewType", "html"); response.setView(mapView); } else response.setFlash( String.format(I18n.get(com.axelor.apps.base.exceptions.IExceptionMessage.ADDRESS_5), event.getLocation())); } else response.setFlash(I18n.get(IExceptionMessage.EVENT_2)); } public void addLeadAttendee(ActionRequest request, ActionResponse response) { Lead lead = request.getContext().asType(Lead.class); if (lead != null) { Event event = request.getContext().getParentContext().asType(Event.class); if (event != null) { Beans.get(EventService.class).addLeadAttendee(event, lead, null); response.setReload(true); } } } public void assignToMeLead(ActionRequest request, ActionResponse response) { if (request.getContext().get("id") != null) { Lead lead = leadRepo.find((Long) request.getContext().get("id")); lead.setUser(AuthUtils.getUser()); if (lead.getStatusSelect() == 1) lead.setStatusSelect(2); leadService.saveLead(lead); } else if (!((List) request.getContext().get("_ids")).isEmpty()) { for (Lead lead : leadRepo.all().filter("id in ?1", request.getContext().get("_ids")).fetch()) { lead.setUser(AuthUtils.getUser()); if (lead.getStatusSelect() == 1) lead.setStatusSelect(2); leadService.saveLead(lead); } } response.setReload(true); } public void assignToMeEvent(ActionRequest request, ActionResponse response) { if (request.getContext().get("id") != null) { Event event = eventRepo.find((Long) request.getContext().get("id")); event.setUser(AuthUtils.getUser()); eventService.saveEvent(event); } else if (!((List) request.getContext().get("_ids")).isEmpty()) { for (Event event : eventRepo.all().filter("id in ?1", request.getContext().get("_ids")).fetch()) { event.setUser(AuthUtils.getUser()); eventService.saveEvent(event); } } response.setReload(true); } public void checkModifications(ActionRequest request, ActionResponse response) throws ClassNotFoundException, InstantiationException, IllegalAccessException, AxelorException, IOException, MessagingException { Event event = request.getContext().asType(Event.class); Long idEvent = event.getId(); Template deletedGuestsTemplate = Beans.get(CrmConfigService.class) .getCrmConfig(event.getUser().getActiveCompany()).getMeetingGuestDeletedTemplate(); Template addedGuestsTemplate = Beans.get(CrmConfigService.class) .getCrmConfig(event.getUser().getActiveCompany()).getMeetingGuestAddedTemplate(); Template changedDateTemplate = Beans.get(CrmConfigService.class) .getCrmConfig(event.getUser().getActiveCompany()).getMeetingDateChangeTemplate(); if (deletedGuestsTemplate == null && addedGuestsTemplate == null && changedDateTemplate == null) { response.setFlash(String.format(I18n.get(IExceptionMessage.CRM_CONFIG_TEMPLATES_NONE), event.getUser().getActiveCompany().getName())); } else if (deletedGuestsTemplate == null || addedGuestsTemplate == null || changedDateTemplate == null) { throw new AxelorException(String.format(I18n.get(IExceptionMessage.CRM_CONFIG_TEMPLATES), event.getUser().getActiveCompany().getName()), IException.CONFIGURATION_ERROR); } else { if (idEvent != null && idEvent > 0) { Event previousEvent = eventRepo.find(event.getId()); event = eventService.checkModifications(event, previousEvent); } else { eventService.sendMails(event); } } } public void addUserGuest(ActionRequest request, ActionResponse response) throws ClassNotFoundException, InstantiationException, IllegalAccessException, AxelorException, MessagingException, IOException, ICalendarException, ValidationException, ParseException { Event event = request.getContext().asType(Event.class); if (request.getContext().containsKey("guestPartner")) { User user = (User) request.getContext().get("guestUser"); if (user != null) { event = eventRepo.find(event.getId()); eventService.addUserGuest(user, event); } } response.setReload(true); } public void addPartnerGuest(ActionRequest request, ActionResponse response) throws ClassNotFoundException, InstantiationException, IllegalAccessException, AxelorException, MessagingException, IOException, ICalendarException, ValidationException, ParseException { Event event = request.getContext().asType(Event.class); if (request.getContext().containsKey("guestPartner")) { Partner partner = (Partner) request.getContext().get("guestPartner"); if (partner != null) { event = eventRepo.find(event.getId()); eventService.addPartnerGuest(partner, event); } } response.setReload(true); } public void addEmailGuest(ActionRequest request, ActionResponse response) throws ClassNotFoundException, InstantiationException, IllegalAccessException, AxelorException, MessagingException, IOException, ICalendarException, ValidationException, ParseException { Event event = request.getContext().asType(Event.class); if (request.getContext().containsKey("guestEmail")) { Map<String, Object> email = (LinkedHashMap<String, Object>) request.getContext().get("guestEmail"); String id = email.get("id").toString(); if (email != null) { EmailAddressRepository emailAddressRepo = Beans.get(EmailAddressRepository.class); EmailAddress emailAddress = emailAddressRepo.find(new Long(id)); event = eventRepo.find(event.getId()); eventService.addEmailGuest(emailAddress, event); } } response.setReload(true); } @Transactional public void generateRecurrentEvents(ActionRequest request, ActionResponse response) throws AxelorException { Long eventId = new Long(request.getContext().get("_idEvent").toString()); Event event = eventRepo.find(eventId); RecurrenceConfiguration conf = request.getContext().asType(RecurrenceConfiguration.class); RecurrenceConfigurationRepository confRepo = Beans.get(RecurrenceConfigurationRepository.class); conf = confRepo.save(conf); event.setRecurrenceConfiguration(conf); event = eventRepo.save(event); if (request.getContext().get("recurrenceType") == null) { throw new AxelorException(String.format(I18n.get(IExceptionMessage.RECURRENCE_RECURRENCE_TYPE)), IException.CONFIGURATION_ERROR); } int recurrenceType = new Integer(request.getContext().get("recurrenceType").toString()); if (request.getContext().get("periodicity") == null) { throw new AxelorException(String.format(I18n.get(IExceptionMessage.RECURRENCE_PERIODICITY)), IException.CONFIGURATION_ERROR); } int periodicity = new Integer(request.getContext().get("periodicity").toString()); if (periodicity < 1) { throw new AxelorException(String.format(I18n.get(IExceptionMessage.RECURRENCE_PERIODICITY)), IException.CONFIGURATION_ERROR); } boolean monday = (boolean) request.getContext().get("monday"); boolean tuesday = (boolean) request.getContext().get("tuesday"); boolean wednesday = (boolean) request.getContext().get("wednesday"); boolean thursday = (boolean) request.getContext().get("thursday"); boolean friday = (boolean) request.getContext().get("friday"); boolean saturday = (boolean) request.getContext().get("saturday"); boolean sunday = (boolean) request.getContext().get("sunday"); Map<Integer, Boolean> daysMap = new HashMap<Integer, Boolean>(); Map<Integer, Boolean> daysCheckedMap = new HashMap<Integer, Boolean>(); if (recurrenceType == 2) { daysMap.put(DateTimeConstants.MONDAY, monday); daysMap.put(DateTimeConstants.TUESDAY, tuesday); daysMap.put(DateTimeConstants.WEDNESDAY, wednesday); daysMap.put(DateTimeConstants.THURSDAY, thursday); daysMap.put(DateTimeConstants.FRIDAY, friday); daysMap.put(DateTimeConstants.SATURDAY, saturday); daysMap.put(DateTimeConstants.SUNDAY, sunday); for (Integer day : daysMap.keySet()) { if (daysMap.get(day)) { daysCheckedMap.put(day, daysMap.get(day)); } } if (daysMap.isEmpty()) { throw new AxelorException(String.format(I18n.get(IExceptionMessage.RECURRENCE_DAYS_CHECKED)), IException.CONFIGURATION_ERROR); } } int monthRepeatType = new Integer(request.getContext().get("monthRepeatType").toString()); int endType = new Integer(request.getContext().get("endType").toString()); int repetitionsNumber = 0; if (endType == 1) { if (request.getContext().get("repetitionsNumber") == null) { throw new AxelorException(String.format(I18n.get(IExceptionMessage.RECURRENCE_REPETITION_NUMBER)), IException.CONFIGURATION_ERROR); } repetitionsNumber = new Integer(request.getContext().get("repetitionsNumber").toString()); if (repetitionsNumber < 1) { throw new AxelorException(String.format(I18n.get(IExceptionMessage.RECURRENCE_REPETITION_NUMBER)), IException.CONFIGURATION_ERROR); } } LocalDate endDate = new LocalDate(); if (endType == 2) { if (request.getContext().get("endDate") == null) { throw new AxelorException(String.format(I18n.get(IExceptionMessage.RECURRENCE_END_DATE)), IException.CONFIGURATION_ERROR); } endDate = new LocalDate(request.getContext().get("endDate").toString()); if (endDate.isBefore(event.getStartDateTime()) && endDate.isEqual(event.getStartDateTime())) { throw new AxelorException(String.format(I18n.get(IExceptionMessage.RECURRENCE_END_DATE)), IException.CONFIGURATION_ERROR); } } switch (recurrenceType) { case 1: eventService.addRecurrentEventsByDays(event, periodicity, endType, repetitionsNumber, endDate); break; case 2: eventService.addRecurrentEventsByWeeks(event, periodicity, endType, repetitionsNumber, endDate, daysCheckedMap); break; case 3: eventService.addRecurrentEventsByMonths(event, periodicity, endType, repetitionsNumber, endDate, monthRepeatType); break; case 4: eventService.addRecurrentEventsByYears(event, periodicity, endType, repetitionsNumber, endDate); break; default: break; } response.setCanClose(true); response.setReload(true); } @Transactional public void deleteThis(ActionRequest request, ActionResponse response) throws AxelorException { Long eventId = new Long(request.getContext().get("_idEvent").toString()); Event event = eventRepo.find(eventId); Event child = eventRepo.all().filter("self.parentEvent.id = ?1", event.getId()).fetchOne(); if (child != null) { child.setParentEvent(event.getParentEvent()); } eventRepo.remove(event); response.setCanClose(true); response.setReload(true); } @Transactional public void deleteNext(ActionRequest request, ActionResponse response) throws AxelorException { Long eventId = new Long(request.getContext().get("_idEvent").toString()); Event event = eventRepo.find(eventId); Event child = eventRepo.all().filter("self.parentEvent.id = ?1", event.getId()).fetchOne(); while (child != null) { child.setParentEvent(null); eventRepo.remove(event); event = child; child = eventRepo.all().filter("self.parentEvent.id = ?1", event.getId()).fetchOne(); } response.setCanClose(true); response.setReload(true); } @Transactional public void deleteAll(ActionRequest request, ActionResponse response) throws AxelorException { Long eventId = new Long(request.getContext().get("_idEvent").toString()); Event event = eventRepo.find(eventId); Event child = eventRepo.all().filter("self.parentEvent.id = ?1", event.getId()).fetchOne(); Event parent = event.getParentEvent(); while (child != null) { child.setParentEvent(null); eventRepo.remove(event); event = child; child = eventRepo.all().filter("self.parentEvent.id = ?1", event.getId()).fetchOne(); } while (parent != null) { Event nextParent = parent.getParentEvent(); eventRepo.remove(parent); parent = nextParent; } response.setCanClose(true); response.setReload(true); } @Transactional public void changeAll(ActionRequest request, ActionResponse response) throws AxelorException { Long eventId = new Long(request.getContext().get("_idEvent").toString()); Event event = eventRepo.find(eventId); Event child = eventRepo.all().filter("self.parentEvent.id = ?1", event.getId()).fetchOne(); Event parent = event.getParentEvent(); child.setParentEvent(null); Event eventDeleted = child; child = eventRepo.all().filter("self.parentEvent.id = ?1", eventDeleted.getId()).fetchOne(); while (child != null) { child.setParentEvent(null); eventRepo.remove(eventDeleted); eventDeleted = child; child = eventRepo.all().filter("self.parentEvent.id = ?1", eventDeleted.getId()).fetchOne(); } while (parent != null) { Event nextParent = parent.getParentEvent(); eventRepo.remove(parent); parent = nextParent; } RecurrenceConfiguration conf = request.getContext().asType(RecurrenceConfiguration.class); RecurrenceConfigurationRepository confRepo = Beans.get(RecurrenceConfigurationRepository.class); conf = confRepo.save(conf); event.setRecurrenceConfiguration(conf); event = eventRepo.save(event); if (conf.getRecurrenceType() == null) { throw new AxelorException(String.format(I18n.get(IExceptionMessage.RECURRENCE_RECURRENCE_TYPE)), IException.CONFIGURATION_ERROR); } int recurrenceType = conf.getRecurrenceType(); if (conf.getPeriodicity() == null) { throw new AxelorException(String.format(I18n.get(IExceptionMessage.RECURRENCE_PERIODICITY)), IException.CONFIGURATION_ERROR); } int periodicity = conf.getPeriodicity(); if (periodicity < 1) { throw new AxelorException(String.format(I18n.get(IExceptionMessage.RECURRENCE_PERIODICITY)), IException.CONFIGURATION_ERROR); } boolean monday = conf.getMonday(); boolean tuesday = conf.getTuesday(); boolean wednesday = conf.getWednesday(); boolean thursday = conf.getThursday(); boolean friday = conf.getFriday(); boolean saturday = conf.getSaturday(); boolean sunday = conf.getSunday(); Map<Integer, Boolean> daysMap = new HashMap<Integer, Boolean>(); Map<Integer, Boolean> daysCheckedMap = new HashMap<Integer, Boolean>(); if (recurrenceType == 2) { daysMap.put(DateTimeConstants.MONDAY, monday); daysMap.put(DateTimeConstants.TUESDAY, tuesday); daysMap.put(DateTimeConstants.WEDNESDAY, wednesday); daysMap.put(DateTimeConstants.THURSDAY, thursday); daysMap.put(DateTimeConstants.FRIDAY, friday); daysMap.put(DateTimeConstants.SATURDAY, saturday); daysMap.put(DateTimeConstants.SUNDAY, sunday); for (Integer day : daysMap.keySet()) { if (daysMap.get(day)) { daysCheckedMap.put(day, daysMap.get(day)); } } if (daysMap.isEmpty()) { throw new AxelorException(String.format(I18n.get(IExceptionMessage.RECURRENCE_DAYS_CHECKED)), IException.CONFIGURATION_ERROR); } } int monthRepeatType = conf.getMonthRepeatType(); int endType = conf.getEndType(); int repetitionsNumber = 0; if (endType == 1) { if (conf.getRepetitionsNumber() == null) { throw new AxelorException(String.format(I18n.get(IExceptionMessage.RECURRENCE_REPETITION_NUMBER)), IException.CONFIGURATION_ERROR); } repetitionsNumber = conf.getRepetitionsNumber(); if (repetitionsNumber < 1) { throw new AxelorException(String.format(I18n.get(IExceptionMessage.RECURRENCE_REPETITION_NUMBER)), IException.CONFIGURATION_ERROR); } } LocalDate endDate = new LocalDate(); if (endType == 2) { if (conf.getEndDate() == null) { throw new AxelorException(String.format(I18n.get(IExceptionMessage.RECURRENCE_END_DATE)), IException.CONFIGURATION_ERROR); } endDate = new LocalDate(conf.getEndDate()); if (endDate.isBefore(event.getStartDateTime()) && endDate.isEqual(event.getStartDateTime())) { throw new AxelorException(String.format(I18n.get(IExceptionMessage.RECURRENCE_END_DATE)), IException.CONFIGURATION_ERROR); } } switch (recurrenceType) { case 1: eventService.addRecurrentEventsByDays(event, periodicity, endType, repetitionsNumber, endDate); break; case 2: eventService.addRecurrentEventsByWeeks(event, periodicity, endType, repetitionsNumber, endDate, daysCheckedMap); break; case 3: eventService.addRecurrentEventsByMonths(event, periodicity, endType, repetitionsNumber, endDate, monthRepeatType); break; case 4: eventService.addRecurrentEventsByYears(event, periodicity, endType, repetitionsNumber, endDate); break; default: break; } response.setCanClose(true); response.setReload(true); } public void applyChangesToAll(ActionRequest request, ActionResponse response) { Event thisEvent = eventRepo.find(new Long(request.getContext().get("_idEvent").toString())); Event event = eventRepo.find(thisEvent.getId()); eventService.applyChangesToAll(event); response.setCanClose(true); response.setReload(true); } }