package br.com.centralit.citcorpore.regras;
import java.util.HashMap;
import br.com.centralit.citcorpore.bean.ProgramacaoAtividadeDTO;
import br.com.centralit.citcorpore.util.Util;
import br.com.citframework.excecao.LogicException;
import br.com.citframework.util.UtilDatas;
public class RegraProgramacaoAtividade_M extends RegraProgramacaoAtividade {
public java.util.Date calculaProximaExecucao(ProgramacaoAtividadeDTO programacaoAtividadeDto, java.util.Date dataRef) throws Exception {
if (programacaoAtividadeDto.getDataFim() != null && programacaoAtividadeDto.getDataFim().compareTo(dataRef) < 0)
return null;
java.util.Date proximaExecucao = null;
java.util.Date dataExecucao = programacaoAtividadeDto.getProximaExecucao();
java.util.Date dataCalc = dataRef;
if (dataCalc.compareTo(programacaoAtividadeDto.getDataInicio()) < 0)
dataCalc = programacaoAtividadeDto.getDataInicio();
if (dataExecucao == null || dataExecucao.compareTo(dataCalc) < 0) {
String[] meses = new String[] {"", programacaoAtividadeDto.getJan(), programacaoAtividadeDto.getFev(), programacaoAtividadeDto.getMar()
, programacaoAtividadeDto.getAbr(), programacaoAtividadeDto.getMai(), programacaoAtividadeDto.getJun()
, programacaoAtividadeDto.getJul(), programacaoAtividadeDto.getAgo(), programacaoAtividadeDto.getSet()
, programacaoAtividadeDto.getOut(), programacaoAtividadeDto.getNov(), programacaoAtividadeDto.getDez()};
int dia = UtilDatas.getDay(dataCalc);
int mes = UtilDatas.getMonth(dataCalc);
int ano = UtilDatas.getYear(dataCalc);
boolean bEncontrou = true;
int diaExec = 0;
int mesExec = mes;
int anoExec = ano;
switch (programacaoAtividadeDto.getPeriodicidadeMensal().intValue()) {
case 1:
if (programacaoAtividadeDto.getDia().intValue() != 99)
diaExec = programacaoAtividadeDto.getDia().intValue();
else
diaExec = UtilDatas.getUltimoDiaMes(Util.getData(1, mesExec, anoExec));
if (!meses[mes].equals("S")) {
bEncontrou = false;
for (int i = mes; i < meses.length; i++) {
if (meses[i].equals("S")) {
mesExec = i;
bEncontrou = true;
break;
}
}
if (!bEncontrou) {
ano ++;
for (int i = 1; i < mes; i++) {
if (meses[i].equals("S")) {
mesExec = i;
bEncontrou = true;
break;
}
}
}
}else if (dia > diaExec) {
bEncontrou = false;
for (int i = mes+1; i < meses.length; i++) {
if (meses[i].equals("S")) {
mesExec = i;
bEncontrou = true;
break;
}
}
}
if (bEncontrou && diaExec <= UtilDatas.getUltimoDiaMes(Util.getData(1, mesExec, anoExec)))
proximaExecucao = Util.getData(diaExec,mesExec,anoExec);
break;
case 2:
if (!meses[mes].equals("S")) {
bEncontrou = false;
for (int i = mes; i < meses.length; i++) {
if (meses[i].equals("S")) {
mesExec = i;
bEncontrou = true;
break;
}
}
if (!bEncontrou) {
ano ++;
for (int i = 1; i < mes; i++) {
if (meses[i].equals("S")) {
mesExec = i;
bEncontrou = true;
break;
}
}
}
}else{
Integer[] diasUteis = getDiasUteis(mesExec, anoExec);
diaExec = diasUteis[programacaoAtividadeDto.getDiaUtil()];
if (dia > diaExec) {
bEncontrou = false;
for (int i = mes+1; i < meses.length; i++) {
if (meses[i].equals("S")) {
mesExec = i;
bEncontrou = true;
break;
}
}
}
}
if (bEncontrou) {
Integer[] diasUteis = getDiasUteis(mesExec, anoExec);
diaExec = diasUteis[programacaoAtividadeDto.getDiaUtil()];
proximaExecucao = Util.getData(diaExec,mesExec,anoExec);
}
break;
case 3:
if (!meses[mes].equals("S")) {
bEncontrou = false;
for (int i = mes; i < meses.length; i++) {
if (meses[i].equals("S")) {
mesExec = i;
bEncontrou = true;
break;
}
}
if (!bEncontrou) {
ano ++;
for (int i = 1; i < mes; i++) {
if (meses[i].equals("S")) {
mesExec = i;
bEncontrou = true;
break;
}
}
}
}else{
HashMap<Integer,Integer[]> mapSemanas = getSemanas(mesExec, anoExec);
Integer[] dias = mapSemanas.get(programacaoAtividadeDto.getDiaSemana().intValue());
int semana = programacaoAtividadeDto.getSeqDiaSemana().intValue();
if (semana == 5) {
while (dias[semana] == 0)
semana = semana - 1;
}
diaExec = dias[semana];
if (dia > diaExec) {
bEncontrou = false;
for (int i = mes+1; i < meses.length; i++) {
if (meses[i].equals("S")) {
mesExec = i;
bEncontrou = true;
break;
}
}
}
}
if (bEncontrou) {
HashMap<Integer,Integer[]> mapSemanas = getSemanas(mesExec, anoExec);
Integer[] dias = mapSemanas.get(programacaoAtividadeDto.getDiaSemana().intValue());
int semana = programacaoAtividadeDto.getSeqDiaSemana().intValue();
if (semana == 5) {
while (dias[semana] == 0)
semana = semana - 1;
}
diaExec = dias[semana];
if (diaExec > 0)
proximaExecucao = Util.getData(diaExec,mesExec,anoExec);
}
break;
}
}else
proximaExecucao = programacaoAtividadeDto.getProximaExecucao();
return proximaExecucao;
}
public void valida(ProgramacaoAtividadeDTO programacaoAtividadeDto) throws Exception {
if (programacaoAtividadeDto.getPeriodicidadeMensal() == null)
throw new LogicException("Periodicidade da programa��o semanal n�o foi informada");
switch (programacaoAtividadeDto.getPeriodicidadeMensal().intValue()) {
case 1:
if (programacaoAtividadeDto.getDia() == null)
throw new LogicException("Dia do m�s n�o foi informado");
break;
case 2:
if (programacaoAtividadeDto.getDiaUtil() == null)
throw new LogicException("Dia �til do m�s n�o foi informado");
break;
case 3:
if (programacaoAtividadeDto.getSeqDiaSemana() == null)
throw new LogicException("Sequ�ncia do dia da semana n�o foi informado");
if (programacaoAtividadeDto.getDiaSemana() == null)
throw new LogicException("Dia da semana n�o foi informado");
break;
}
if (programacaoAtividadeDto.getJan() == null)
programacaoAtividadeDto.setJan("N");
if (programacaoAtividadeDto.getFev() == null)
programacaoAtividadeDto.setFev("N");
if (programacaoAtividadeDto.getMar() == null)
programacaoAtividadeDto.setMar("N");
if (programacaoAtividadeDto.getAbr() == null)
programacaoAtividadeDto.setAbr("N");
if (programacaoAtividadeDto.getMai() == null)
programacaoAtividadeDto.setMai("N");
if (programacaoAtividadeDto.getJun() == null)
programacaoAtividadeDto.setJun("N");
if (programacaoAtividadeDto.getJul() == null)
programacaoAtividadeDto.setJul("N");
if (programacaoAtividadeDto.getAgo() == null)
programacaoAtividadeDto.setAgo("N");
if (programacaoAtividadeDto.getSet() == null)
programacaoAtividadeDto.setSet("N");
if (programacaoAtividadeDto.getOut() == null)
programacaoAtividadeDto.setOut("N");
if (programacaoAtividadeDto.getNov() == null)
programacaoAtividadeDto.setNov("N");
if (programacaoAtividadeDto.getDez() == null)
programacaoAtividadeDto.setDez("N");
if (programacaoAtividadeDto.getJan().equals("N") && programacaoAtividadeDto.getFev().equals("N") &&
programacaoAtividadeDto.getMar().equals("N") && programacaoAtividadeDto.getAbr().equals("N") &&
programacaoAtividadeDto.getMai().equals("N") && programacaoAtividadeDto.getJun().equals("N") &&
programacaoAtividadeDto.getJul().equals("N") && programacaoAtividadeDto.getAgo().equals("N") &&
programacaoAtividadeDto.getSet().equals("N") && programacaoAtividadeDto.getOut().equals("N") &&
programacaoAtividadeDto.getNov().equals("N") && programacaoAtividadeDto.getDez().equals("N"))
throw new LogicException("N�o foi informado nenhum m�s");
}
public String getDetalhamento(ProgramacaoAtividadeDTO programacaoAtividadeDto) throws Exception {
String descricao = "";
String[] seqDiaSemana = new String[] {"","primeira(o)","segunda(o)","terceira(o)","quarta(o)","�ltima(o)"};
String[] diaSemana = new String[] {"","domingo","segunda-feira","ter�a-feira","quarta-feira","quinta-feira","sexta-feira","s�bado"};
descricao = "�s "+programacaoAtividadeDto.getHoraInicio()+" ";
switch (programacaoAtividadeDto.getPeriodicidadeMensal().intValue()) {
case 1:
descricao += " no dia "+programacaoAtividadeDto.getDia();
break;
case 2:
if (programacaoAtividadeDto.getDiaUtil().intValue() != 99)
descricao += " no "+programacaoAtividadeDto.getDiaUtil()+"� dia �til";
else
descricao += " no �ltimo dia �til";
break;
case 3:
descricao += " no(a) "+seqDiaSemana[programacaoAtividadeDto.getSeqDiaSemana()]+" "+diaSemana[programacaoAtividadeDto.getDiaSemana()];
break;
}
String meses = "";
if (programacaoAtividadeDto.getJan().equals("S"))
meses += " janeiro";
if (programacaoAtividadeDto.getFev().equals("S")) {
if (meses.length() > 0)
meses += ",";
meses += " fevereiro";
}
if (programacaoAtividadeDto.getMar().equals("S")) {
if (meses.length() > 0)
meses += ",";
meses += " mar�o";
}
if (programacaoAtividadeDto.getAbr().equals("S")) {
if (meses.length() > 0)
meses += ",";
meses += " abril";
}
if (programacaoAtividadeDto.getMai().equals("S")) {
if (meses.length() > 0)
meses += ",";
meses += " maio";
}
if (programacaoAtividadeDto.getJun().equals("S")) {
if (meses.length() > 0)
meses += ",";
meses += " junho";
}
if (programacaoAtividadeDto.getJul().equals("S")) {
if (meses.length() > 0)
meses += ",";
meses += " julho";
}
if (programacaoAtividadeDto.getAgo().equals("S")) {
if (meses.length() > 0)
meses += ",";
meses += " agosto";
}
if (programacaoAtividadeDto.getSet().equals("S")) {
if (meses.length() > 0)
meses += ",";
meses += " setembro";
}
if (programacaoAtividadeDto.getOut().equals("S")) {
if (meses.length() > 0)
meses += ",";
meses += " outubro";
}
if (programacaoAtividadeDto.getNov().equals("S")) {
if (meses.length() > 0)
meses += ",";
meses += " novembro";
}
if (programacaoAtividadeDto.getDez().equals("S")) {
if (meses.length() > 0)
meses += ",";
meses += " dezembro";
}
descricao += " de "+meses;
return descricao;
}
}