/** * Axelor Business Solutions * * Copyright (C) 2016 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.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.SocketException; import java.text.ParseException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import com.axelor.apps.base.db.ICalendarUser; import com.axelor.apps.base.db.ImportConfiguration; import com.axelor.apps.base.db.Team; import com.axelor.apps.base.db.repo.ICalendarUserRepository; import com.axelor.apps.base.ical.ICalendarException; import com.axelor.apps.crm.db.Calendar; import com.axelor.apps.crm.db.Event; import com.axelor.apps.crm.db.repo.CalendarRepository; import com.axelor.apps.crm.db.repo.EventRepository; import com.axelor.apps.crm.exception.IExceptionMessage; import com.axelor.apps.crm.service.CalendarService; import com.axelor.auth.AuthUtils; import com.axelor.auth.db.User; import com.axelor.i18n.I18n; import com.axelor.inject.Beans; import com.axelor.meta.MetaFiles; import com.axelor.meta.schema.actions.ActionView; import com.axelor.rpc.ActionRequest; import com.axelor.rpc.ActionResponse; import com.google.common.base.Joiner; import com.google.inject.Inject; import net.fortuna.ical4j.connector.ObjectNotFoundException; import net.fortuna.ical4j.connector.ObjectStoreException; import net.fortuna.ical4j.data.ParserException; import net.fortuna.ical4j.model.ConstraintViolationException; import net.fortuna.ical4j.model.ValidationException; public class CalendarController { @Inject private CalendarService calendarService; public void exportCalendar(ActionRequest request, ActionResponse response) throws IOException, ParserException, ValidationException, ObjectStoreException, ObjectNotFoundException, ParseException { Calendar cal = request.getContext().asType(Calendar.class); calendarService.export(cal); } public void importCalendarFile(ActionRequest request, ActionResponse response) throws IOException, ParserException { ImportConfiguration imp = request.getContext().asType(ImportConfiguration.class); Object object = request.getContext().get("_id"); Calendar cal = null; if(object != null){ Long id = Long.valueOf(object.toString()); cal = Beans.get(CalendarRepository.class).find(id); } if(cal == null){ cal = new Calendar(); } File data = MetaFiles.getPath( imp.getDataMetaFile() ).toFile(); calendarService.importCalendar(cal, data); response.setCanClose(true); response.setReload(true); } public void importCalendar(ActionRequest request, ActionResponse response) throws IOException, ParserException { Calendar cal = request.getContext().asType(Calendar.class); response.setView(ActionView .define(I18n.get(IExceptionMessage.LEAD_5)) .model("com.axelor.apps.base.db.ImportConfiguration") .add("form", "import-calendar-form") .param("popup", "reload") .param("forceEdit", "true") .param("show-toolbar", "false") .param("show-confirm", "false") .param("popup-save", "false") .context("_id", cal.getId()) .map()); } public void testConnect(ActionRequest request, ActionResponse response) throws Exception { Calendar cal = request.getContext().asType(Calendar.class); if (calendarService.testConnect(cal)) response.setValue("isValid", true); else response.setAlert("Login and password do not match."); } public void showMyEvents(ActionRequest request, ActionResponse response){ User user = AuthUtils.getUser(); List<Long> eventIdlist = new ArrayList<Long>(); List<ICalendarUser> userList = Beans.get(ICalendarUserRepository.class).all().filter("self.user.id = ?1", user.getId()).fetch(); List<Event> eventList = Beans.get(EventRepository.class).all().filter("self.user.id = ?1", user.getId()).fetch(); for (Event event : eventList) { eventIdlist.add(event.getId()); } List<Calendar> calList = Beans.get(CalendarRepository.class).all().filter("self.user.id = ?1", user.getId()).fetch(); for (Calendar calendar : calList) { for (Event event : calendar.getEventsCrm()) { eventIdlist.add(event.getId()); } } for (ICalendarUser iCalendarUser : userList) { eventList = Beans.get(EventRepository.class).all().filter("?1 MEMBER OF self.attendees OR self.organizer.id = ?1", iCalendarUser.getId()).fetch(); for (Event event : eventList) { eventIdlist.add(event.getId()); } } response.setView(ActionView .define(I18n.get("My Calendar")) .model(Event.class.getName()) .add("calendar", "event-calendar-color-by-calendar") .add("grid", "event-grid") .add("form", "event-form") .context("_typeSelect", 2) .domain("self.id in ("+Joiner.on(",").join(eventIdlist)+")") .map()); } public void showTeamEvents(ActionRequest request, ActionResponse response){ User user = AuthUtils.getUser(); Team team = user.getActiveTeam(); List<Long> eventIdlist = new ArrayList<Long>(); List<Event> eventList = null; Set<User> userSet = new HashSet<User>(); if(team == null || team.getUserSet() == null || team.getUserSet().isEmpty()){ userSet.add(user); } else{ userSet = team.getUserSet(); } for (User userIt : userSet) { List<ICalendarUser> userList = Beans.get(ICalendarUserRepository.class).all().filter("self.user.id = ?1", userIt.getId()).fetch(); eventList = Beans.get(EventRepository.class).all().filter("self.user.id = ?1", userIt.getId()).fetch(); for (Event event : eventList) { eventIdlist.add(event.getId()); } List<Calendar> calList = Beans.get(CalendarRepository.class).all().filter("self.user.id = ?1", userIt.getId()).fetch(); for (Calendar calendar : calList) { for (Event event : calendar.getEventsCrm()) { eventIdlist.add(event.getId()); } } for (ICalendarUser iCalendarUser : userList) { eventList = Beans.get(EventRepository.class).all().filter("?1 MEMBER OF self.attendees OR self.organizer.id = ?1", iCalendarUser.getId()).fetch(); for (Event event : eventList) { eventIdlist.add(event.getId()); } } } response.setView(ActionView .define(I18n.get("Team Calendar")) .model(Event.class.getName()) .add("calendar", "event-calendar-color-by-user") .add("grid", "event-grid") .add("form", "event-form") .context("_typeSelect", 2) .context("_internalUser", user.getId()) .domain("self.id in ("+Joiner.on(",").join(eventIdlist)+")") .map()); } public void showSharedEvents(ActionRequest request, ActionResponse response){ User user = AuthUtils.getUser(); List<Long> eventIdlist = calendarService.showSharedEvents(user); response.setView(ActionView .define(I18n.get("Shared Calendar")) .model(Event.class.getName()) .add("calendar", "event-calendar-color-by-user") .add("grid", "event-grid") .add("form", "event-form") .context("_typeSelect", 2) .context("_internalUser", user.getId()) .domain("self.id in ("+Joiner.on(",").join(eventIdlist)+")") .map()); } public void synchronizeCalendar(ActionRequest request, ActionResponse response) throws MalformedURLException, SocketException, ObjectStoreException, ObjectNotFoundException, ConstraintViolationException, ICalendarException { Calendar cal = request.getContext().asType(Calendar.class); cal = Beans.get(CalendarRepository.class).find(cal.getId()); calendarService.sync(cal); response.setReload(true); } }