/**
* 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.service.batch;
import java.util.List;
import javax.persistence.Query;
import org.joda.time.LocalDateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.axelor.apps.base.service.administration.GeneralService;
import com.axelor.apps.crm.db.Event;
import com.axelor.apps.crm.db.EventReminder;
import com.axelor.apps.crm.db.IEventReminder;
import com.axelor.apps.crm.db.repo.EventRepository;
import com.axelor.apps.crm.exception.IExceptionMessage;
import com.axelor.apps.crm.message.MessageServiceCrmImpl;
import com.axelor.apps.crm.service.EventReminderService;
import com.axelor.apps.message.db.Message;
import com.axelor.apps.message.service.MailAccountService;
import com.axelor.apps.message.service.MessageService;
import com.axelor.db.JPA;
import com.axelor.exception.AxelorException;
import com.axelor.exception.db.IException;
import com.axelor.exception.service.TraceBackService;
import com.axelor.i18n.I18n;
import com.axelor.inject.Beans;
import com.google.inject.Inject;
public class BatchEventReminder extends BatchStrategy {
private static final Logger LOG = LoggerFactory.getLogger(BatchEventReminder.class);
private boolean stop = false;
private LocalDateTime today;
@Inject
private EventRepository eventRepo;
@Inject
public BatchEventReminder(EventReminderService eventReminderService, MessageServiceCrmImpl messageServiceCrmImpl, MailAccountService mailAccountService) {
super(eventReminderService, messageServiceCrmImpl, mailAccountService);
this.today = Beans.get(GeneralService.class).getTodayDateTime().toLocalDateTime();
}
@Override
protected void start() throws IllegalArgumentException, IllegalAccessException, AxelorException {
super.start();
}
@Override
protected void process() {
this.markEventReminderProcess();
this.generateMessageProcess();
}
protected void markEventReminderProcess() {
if(!stop) {
int i = 0;
List<? extends EventReminder> eventReminderList = eventReminderRepo.all().fetch();
for(EventReminder eventReminder : eventReminderList) {
try {
eventReminder = eventReminderRepo.find(eventReminder.getId());
if(this.isExpired(eventReminder)) {
eventReminder.setIsReminded(true);
updateEventReminder(eventReminder);
i++;
}
} catch (Exception e) {
TraceBackService.trace(new Exception(String.format(I18n.get(IExceptionMessage.BATCH_EVENT_REMINDER_1),
eventReminderRepo.find(eventReminder.getId()).getEvent().getSubject()), e), IException.CRM, batch.getId());
incrementAnomaly();
LOG.error("Bug(Anomalie) généré(e) pour le rappel de l'évènement {}", eventReminderRepo.find(eventReminder.getId()).getEvent().getSubject());
} finally {
if (i % 1 == 0) { JPA.clear(); }
}
}
}
}
private boolean isExpired(EventReminder eventReminder) {
LocalDateTime startDateTime = eventReminder.getEvent().getStartDateTime();
int durationTypeSelect = eventReminder.getDurationTypeSelect();
switch (durationTypeSelect) {
case IEventReminder.DURATION_MINUTES:
if((startDateTime.minusMinutes(eventReminder.getDuration())).isBefore(today)) {
return true;
}
break;
case IEventReminder.DURATION_HOURS:
if((startDateTime.minusHours(eventReminder.getDuration())).isBefore(today)) {
return true;
}
break;
case IEventReminder.DURATION_DAYS:
if((startDateTime.minusDays(eventReminder.getDuration())).isBefore(today)) {
return true;
}
break;
case IEventReminder.DURATION_WEEKS:
if((startDateTime.minusWeeks(eventReminder.getDuration())).isBefore(today)) {
return true;
}
break;
}
return false;
}
protected void generateMessageProcess() {
if(!stop) {
int i = 0;
Query q = JPA.em().createQuery("select event FROM EventReminder as er WHERE er.isReminded = true and ?1 MEMBER OF er.batchSet");
q.setParameter(1, batch);
@SuppressWarnings("unchecked")
List<Event> eventList = q.getResultList();
for(Event event : eventList) {
try {
Message message = messageServiceCrmImpl.createMessage( event );
message = Beans.get(MessageService.class).sendByEmail(message);
} catch (Exception e) {
TraceBackService.trace(new Exception(String.format(I18n.get("Event")+" %s",
eventRepo.find(event.getId()).getSubject()), e), IException.CRM, batch.getId());
incrementAnomaly();
LOG.error("Bug(Anomalie) généré(e) pour l'évènement {}", eventRepo.find(event.getId()).getSubject());
} finally {
if (i % 1 == 0) { JPA.clear(); }
}
}
}
}
/**
* As {@code batch} entity can be detached from the session, call {@code Batch.find()} get the entity in the persistant context.
* Warning : {@code batch} entity have to be saved before.
*/
@Override
protected void stop() {
String comment = I18n.get(IExceptionMessage.BATCH_EVENT_REMINDER_2);
comment += String.format("\t* %s "+I18n.get(IExceptionMessage.BATCH_EVENT_REMINDER_3)+"\n", batch.getDone());
comment += String.format(I18n.get(com.axelor.apps.base.exceptions.IExceptionMessage.ALARM_ENGINE_BATCH_4), batch.getAnomaly());
super.stop();
addComment(comment);
}
}