br.com.hslife.orcamento.task.AgendamentoTask.java Source code

Java tutorial

Introduction

Here is the source code for br.com.hslife.orcamento.task.AgendamentoTask.java

Source

/***
      
 Copyright (c) 2012 - 2020 Hrcules S. S. Jos
    
Este arquivo  parte do programa Oramento Domstico.
    
    
Oramento Domstico  um software livre; voc pode redistribui-lo e/ou 
    
modific-lo dentro dos termos da Licena Pblica Geral Menor GNU como 
    
publicada pela Fundao do Software Livre (FSF); na verso 2.1 da 
    
Licena.
    
    
Este programa  distribudo na esperana que possa ser til, 
    
mas SEM NENHUMA GARANTIA; sem uma garantia implcita de ADEQUAO a 
    
qualquer MERCADO ou APLICAO EM PARTICULAR. Veja a Licena Pblica 
    
Geral Menor GNU em portugus para maiores detalhes.
    
    
Voc deve ter recebido uma cpia da Licena Pblica Geral Menor GNU sob o 
    
nome de "LICENSE.TXT" junto com este programa, se no, acesse o site do
    
projeto no endereco https://github.com/herculeshssj/orcamento ou escreva 
    
para a Fundao do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, 
    
Boston, MA  02110-1301, USA.
    
    
Para mais informaes sobre o programa Oramento Domstico e seu autor entre  
    
em contato pelo e-mail herculeshssj@outlook.com, ou ainda escreva para 
    
Hrcules S. S. Jos, Av. Ministro Lafaeyte de Andrade, 1683 - Bl. 3 Apt 404, 
    
Marco II - Nova Iguau, RJ, Brasil.
      
***/

package br.com.hslife.orcamento.task;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import br.com.hslife.orcamento.component.EmailComponent;
import br.com.hslife.orcamento.component.OpcaoSistemaComponent;
import br.com.hslife.orcamento.entity.Agenda;
import br.com.hslife.orcamento.entity.LancamentoConta;
import br.com.hslife.orcamento.enumeration.StatusLancamentoConta;
import br.com.hslife.orcamento.enumeration.TipoAgendamento;
import br.com.hslife.orcamento.facade.IAgenda;
import br.com.hslife.orcamento.facade.ILancamentoConta;
import br.com.hslife.orcamento.model.CriterioAgendamento;
import br.com.hslife.orcamento.model.CriterioBuscaLancamentoConta;

@Component
@Transactional(propagation = Propagation.SUPPORTS)
public class AgendamentoTask {

    private static final Logger logger = LogManager.getLogger(AgendamentoTask.class);

    @Autowired
    private EmailComponent emailComponent;

    @Autowired
    private OpcaoSistemaComponent opcaoSistemaComponent;

    @Autowired
    private IAgenda service;

    @Autowired
    private ILancamentoConta lancamentoContaService;

    public ILancamentoConta getLancamentoContaService() {
        return lancamentoContaService;
    }

    public EmailComponent getEmailComponent() {
        return emailComponent;
    }

    public OpcaoSistemaComponent getOpcaoSistemaComponent() {
        return opcaoSistemaComponent;
    }

    public IAgenda getService() {
        return service;
    }

    @Scheduled(fixedDelay = 3600000)
    @SuppressWarnings("deprecation")
    public void enviarEmailNotificacao() {
        try {

            Date inicio = new Date();
            inicio.setHours(0);
            inicio.setMinutes(0);
            inicio.setSeconds(0);

            Date fim = new Date(inicio.getTime());
            fim.setHours(23);
            fim.setMinutes(59);
            fim.setSeconds(59);
            List<Agenda> agendamentos = getService().buscarAgendamentoPorOuDataInicioOuDataFimEAlerta(inicio, fim,
                    true);

            // Itera a lista de agendamentos encontrados, e para cada uma envia um e-mail para o usurio
            for (Agenda a : agendamentos) {
                // Se o usurio marcou para no receber notificao o e-mail no ser enviado
                if (getOpcaoSistemaComponent().getNotificarAgendamentosEmail(a.getUsuario())) {

                    StringBuilder mensagemEmail = new StringBuilder();

                    mensagemEmail.append("Prezado " + a.getUsuario().getNome() + ",\n\n");
                    mensagemEmail.append("O seguinte agendamento foi marcado para notific-lo:\n\n");
                    mensagemEmail.append(a.getDescricao() + "\n");
                    mensagemEmail.append("Tipo: " + a.getTipoAgendamento() + "\n");
                    mensagemEmail.append("Perodo: \n" + a.getDateLabel() + "\n");
                    mensagemEmail.append("Dia inteiro: " + (a.isDiaInteiro() ? "SIM" : "NO") + "\n");
                    mensagemEmail.append("Notas: " + (a.getNotas() == null ? "-" : a.getNotas()) + "\n\n");
                    mensagemEmail.append(
                            "Caso no queira mais receber notificaes a respeito desse evento, desmarque a caixa 'Emitir Alerta' nas propriedades do agendamento.\n\n\n");
                    mensagemEmail.append("Administrador do Sistema");

                    emailComponent.setDestinatario(a.getUsuario().getNome());
                    emailComponent.setEmailDestinatario(a.getUsuario().getEmail());
                    emailComponent.setAssunto("Oramento Domstico - Lembrete de agendamento");
                    emailComponent.setMensagem(mensagemEmail.toString());
                    emailComponent.enviarEmail();
                }
            }

        } catch (Exception e) {
            logger.catching(e);
            e.printStackTrace();
        }
    }

    @Scheduled(fixedDelay = 3600000)
    @SuppressWarnings("deprecation")
    public void executarTarefa() {
        try {

            CriterioAgendamento criterioAgendamento = new CriterioAgendamento();
            criterioAgendamento.setTipo(TipoAgendamento.PREVISAO);

            List<Agenda> agendamentos = getService().buscarPorCriterioAgendamento(criterioAgendamento);
            List<LancamentoConta> lancamentosAtualizados = new ArrayList<>();
            LancamentoConta lancamento;
            Date dataLancamento;

            for (Agenda agenda : agendamentos) {
                Date dataAgenda = new Date(agenda.getInicio().getYear() + 1900, agenda.getInicio().getMonth(),
                        agenda.getInicio().getDate(), 0, 0, 0);
                switch (agenda.getEntity()) {
                case "LancamentoConta":
                    lancamento = getLancamentoContaService().buscarPorID(agenda.getIdEntity());
                    if (lancamento != null) {
                        dataLancamento = new Date(lancamento.getDataPagamento().getYear() + 1900,
                                lancamento.getDataPagamento().getMonth(), lancamento.getDataPagamento().getDate(),
                                0, 0, 0);
                        if (lancamento.getStatusLancamentoConta().equals(StatusLancamentoConta.AGENDADO)
                                && dataLancamento.equals(dataAgenda)) {
                            lancamentosAtualizados.add(lancamento);
                        } else {
                            getService().excluir(agenda);
                        }
                    } else {
                        getService().excluir(agenda);
                    }
                    break;
                default:
                    break;
                }
            }

            CriterioBuscaLancamentoConta criterioBusca = new CriterioBuscaLancamentoConta();
            criterioBusca.setStatusLancamentoConta(new StatusLancamentoConta[] { StatusLancamentoConta.AGENDADO });
            criterioBusca.setDataInicio(new Date());

            List<LancamentoConta> lancamentos = getLancamentoContaService().buscarPorCriterioBusca(criterioBusca);
            lancamentos.removeAll(lancamentosAtualizados);

            for (LancamentoConta l : lancamentos) {
                Agenda agenda = new Agenda();
                agenda.setDescricao(l.getDescricao());
                agenda.setInicio(l.getDataPagamento());
                agenda.setFim(l.getDataPagamento());
                agenda.setDiaInteiro(true);
                agenda.setEmitirAlerta(true);
                agenda.setTipoAgendamento(TipoAgendamento.PREVISAO);
                agenda.setNotas(l.getObservacao());
                agenda.setUsuario(l.getConta().getUsuario());
                agenda.setIdEntity(l.getId());
                agenda.setEntity(l.getClass().getSimpleName());

                getService().cadastrar(agenda);
            }

        } catch (Exception e) {
            logger.catching(e);
            e.printStackTrace();
        }
    }
}