package br.com.centralit.citcorpore.regras; import java.io.Serializable; import java.util.Calendar; import java.util.HashMap; import br.com.centralit.citcorpore.bean.ProgramacaoAtividadeDTO; import br.com.centralit.citcorpore.integracao.FeriadoDao; import br.com.centralit.citcorpore.util.Enumerados.TipoAgendamento; import br.com.centralit.citcorpore.util.Util; import br.com.citframework.excecao.LogicException; import br.com.citframework.util.UtilDatas; public abstract class RegraProgramacaoAtividade implements Serializable { public static RegraProgramacaoAtividade getRegraFromDto(ProgramacaoAtividadeDTO programacaoAtividadeDto) throws Exception { return (RegraProgramacaoAtividade) Class.forName(RegraProgramacaoAtividade.class.getName()+"_"+programacaoAtividadeDto.getTipoAgendamento()).newInstance(); } public static java.util.Date getDataProximaExecucao(ProgramacaoAtividadeDTO programacaoAtividadeDto, java.util.Date dataRef) throws Exception { return getRegraFromDto(programacaoAtividadeDto).calculaProximaExecucao(programacaoAtividadeDto, dataRef); } public static Integer[] getDiasUteis(int mes, int ano) throws Exception { FeriadoDao feriadoDao = new FeriadoDao(); Integer[] diasUteis = new Integer[100]; for (int i = 0; i < diasUteis.length; i++) diasUteis[i] = new Integer(0); int m = 1; java.util.Date dataRef = Util.getData(1, mes, ano); while (UtilDatas.getMonth(dataRef) == mes) { int diaSemana = Util.getDiaSemana(dataRef); if (diaSemana != 1 && diaSemana != 7 && !feriadoDao.isFeriado(new java.sql.Date(dataRef.getTime()), null, null)) { diasUteis[m] = Util.getDay(dataRef); m++; } dataRef = UtilDatas.alteraData(dataRef, 1, Calendar.DAY_OF_MONTH); } diasUteis[99] = diasUteis[m-1]; return diasUteis; } public static HashMap getSemanas(int mes, int ano) throws Exception { Integer[] contSemanas = new Integer[] {0,0,0,0,0,0,0,0}; HashMap<Integer,Integer[]> mapSemanas = new HashMap(); mapSemanas.put(new Integer(1), new Integer[]{0,0,0,0,0,0,0}); mapSemanas.put(new Integer(2), new Integer[]{0,0,0,0,0,0,0}); mapSemanas.put(new Integer(3), new Integer[]{0,0,0,0,0,0,0}); mapSemanas.put(new Integer(4), new Integer[]{0,0,0,0,0,0,0}); mapSemanas.put(new Integer(5), new Integer[]{0,0,0,0,0,0,0}); mapSemanas.put(new Integer(6), new Integer[]{0,0,0,0,0,0,0}); mapSemanas.put(new Integer(7), new Integer[]{0,0,0,0,0,0,0}); java.util.Date dataRef = Util.getData(1, mes, ano); while (UtilDatas.getMonth(dataRef) == mes) { int diaSemana = Util.getDiaSemana(dataRef); contSemanas[diaSemana] = contSemanas[diaSemana].intValue() + 1; int semana = contSemanas[diaSemana].intValue(); Integer[] dias = mapSemanas.get(diaSemana); dias[semana] = Util.getDay(dataRef); dataRef = UtilDatas.alteraData(dataRef, 1, Calendar.DAY_OF_MONTH); } return mapSemanas; } public static void validaProgramacao(ProgramacaoAtividadeDTO programacaoAtividadeDto) throws Exception { if (programacaoAtividadeDto.getTipoAgendamento() == null) throw new LogicException("Tipo de agendamento n�o foi informado"); if (programacaoAtividadeDto.getDataInicio() == null) throw new LogicException("Data de in�cio n�o foi informada"); if (programacaoAtividadeDto.getHoraInicio() == null || programacaoAtividadeDto.getHoraInicio().length() < 4) throw new LogicException("Hora de in�cio n�o foi informada"); if (!Util.isHoraValida(programacaoAtividadeDto.getHoraInicio())) throw new LogicException("Hora de in�cio inv�lida"); if (programacaoAtividadeDto.getDuracaoEstimada() == null) throw new LogicException("Dura��o estimada n�o foi informada"); if (programacaoAtividadeDto.getDataFim() != null && programacaoAtividadeDto.getDataFim().compareTo(programacaoAtividadeDto.getDataInicio()) < 0) throw new LogicException("A data de t�rmino � maior que a data de in�cio"); if (programacaoAtividadeDto.getRepeticao() == null) programacaoAtividadeDto.setRepeticao("N"); if (programacaoAtividadeDto.getRepeticao().equals("S")) { if (programacaoAtividadeDto.getRepeticaoIntervalo() == null) throw new LogicException("Intervalo de repeti��o n�o foi informado"); if (programacaoAtividadeDto.getRepeticaoTipoIntervalo() == null) throw new LogicException("Tipo de intervalo da repeti��o n�o foi informado"); if (programacaoAtividadeDto.getHoraFim() == null || programacaoAtividadeDto.getHoraFim().length() < 4) throw new LogicException("Hora de t�rmino da repeti��o n�o foi informada"); if (!Util.isHoraValida(programacaoAtividadeDto.getHoraFim())) throw new LogicException("Hora de t�rmino da repeti��o inv�lida"); } RegraProgramacaoAtividade regraImpl = getRegraFromDto(programacaoAtividadeDto); regraImpl.valida(programacaoAtividadeDto); setDescricao(programacaoAtividadeDto); } public static void setDescricao(ProgramacaoAtividadeDTO programacaoAtividadeDto) throws Exception { RegraProgramacaoAtividade regraImpl = getRegraFromDto(programacaoAtividadeDto); programacaoAtividadeDto.setTipoAgendamentoDescr(TipoAgendamento.valueOf(programacaoAtividadeDto.getTipoAgendamento()).getDescricao()); programacaoAtividadeDto.setDetalhamento(regraImpl.getDetalhamento(programacaoAtividadeDto)); programacaoAtividadeDto.setRepeticaoDescr(regraImpl.getRepeticaoDescr(programacaoAtividadeDto)); programacaoAtividadeDto.setDuracaoEstimadaDescr(programacaoAtividadeDto.getDuracaoEstimada().intValue()+" minuto(s)"); } public String getRepeticaoDescr(ProgramacaoAtividadeDTO programacaoAtividadeDto) throws Exception { String descricao = ""; if (programacaoAtividadeDto.getRepeticao().equals("S")) { descricao = "A cada "+programacaoAtividadeDto.getRepeticaoIntervalo().intValue(); if (programacaoAtividadeDto.getRepeticaoTipoIntervalo().equals("M")) descricao += " minuto(s)"; else descricao += " hora(s)"; descricao += " at� "+programacaoAtividadeDto.getHoraFim(); } return descricao; } public abstract java.util.Date calculaProximaExecucao(ProgramacaoAtividadeDTO programacaoAtividadeDto, java.util.Date dataRef) throws Exception; public abstract String getDetalhamento(ProgramacaoAtividadeDTO programacaoAtividadeDto) throws Exception; public abstract void valida(ProgramacaoAtividadeDTO programacaoAtividadeDto) throws Exception; }