com.axelor.apps.crm.service.batch.BatchEventReminder.java Source code

Java tutorial

Introduction

Here is the source code for com.axelor.apps.crm.service.batch.BatchEventReminder.java

Source

/**
 * 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.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) gnr(e) pour le rappel de l'vnement {}",
                            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) gnr(e) pour l'vnement {}",
                            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);

    }

}