package br.com.centralit.citcorpore.negocio; import java.sql.Date; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.List; import javax.servlet.http.HttpServletRequest; import br.com.centralit.citajax.html.DocumentHTML; import br.com.centralit.citcorpore.bean.CalculoJornadaDTO; import br.com.centralit.citcorpore.bean.CalendarioDTO; import br.com.centralit.citcorpore.bean.ExcecaoCalendarioDTO; import br.com.centralit.citcorpore.bean.JornadaTrabalhoDTO; import br.com.centralit.citcorpore.bean.RecursoDTO; import br.com.centralit.citcorpore.bean.ServicoContratoDTO; import br.com.centralit.citcorpore.bean.TipoLiberacaoDTO; import br.com.centralit.citcorpore.bean.TipoMudancaDTO; import br.com.centralit.citcorpore.integracao.CalendarioDao; import br.com.centralit.citcorpore.integracao.ExcecaoCalendarioDao; import br.com.centralit.citcorpore.integracao.FeriadoDao; import br.com.centralit.citcorpore.integracao.JornadaTrabalhoDao; import br.com.centralit.citcorpore.integracao.RecursoDao; import br.com.centralit.citcorpore.integracao.ServicoContratoDao; import br.com.centralit.citcorpore.integracao.TipoLiberacaoDAO; import br.com.centralit.citcorpore.integracao.TipoMudancaDAO; import br.com.centralit.citcorpore.util.Util; import br.com.citframework.integracao.CrudDAO; import br.com.citframework.integracao.TransactionControler; import br.com.citframework.service.CrudServiceImpl; import br.com.citframework.util.UtilDatas; import br.com.citframework.util.UtilI18N; public class CalendarioServiceEjb extends CrudServiceImpl implements CalendarioService { public static final String HORA_INICIO_CALCULADA = "IC"; public static final String HORA_TERMINO_CALCULADA = "TC"; public static final String HORA_INICIO_JORNADA = "IJ"; public static final String HORA_TERMINO_JORNADA = "TJ"; public static final String FOLGA = "F"; public static final String TRABALHO = "T"; private TransactionControler transactionControler; private <DAO extends CrudDAO> void setTransacaoDao(final DAO dao) throws Exception { if (transactionControler != null) { this.getDao().setTransactionControler(transactionControler); } } private void setTransacao(final TransactionControler transactionControler) throws Exception { this.transactionControler = transactionControler; } private CalendarioDao dao; @Override protected CalendarioDao getDao() { if (dao == null) { dao = new CalendarioDao(); } return dao; } /** * Determina a Data Hora final, ou seja, o Prazo Limite. * * @param calculoDto * @param bCalculaHoraInicio * @return CalculoJornadaDTO * @throws Exception */ public CalculoJornadaDTO calculaDataHoraFinal(final CalculoJornadaDTO calculoDto, final boolean bCalculaHoraInicio, final TransactionControler tc) throws Exception { if (calculoDto.getIdCalendario() == null) { throw new Exception("ID do calend�rio n�o informado para c�lculo da data e hora"); } if (calculoDto.getDataHoraInicial() == null) { throw new Exception("Data e hora inicial n�o informadas para c�lculo da data e hora"); } if (calculoDto.getPrazoHH() == null) { throw new Exception("Prazo em horas n�o informado para c�lculo da data e hora"); } if (calculoDto.getPrazoMM() == null) { throw new Exception("Prazo em minutos n�o informado para c�lculo da data e hora"); } this.setTransacao(tc); final CalendarioDTO calendarioDto = this.recuperaCalendario(calculoDto.getIdCalendario()); if (calendarioDto == null) { throw new Exception("Servi�o Contrato sem calend�rio. Por favor selecione Calend�rio em Servi�o Contrato!"); } final double slaDefinido = calculoDto.getPrazoHH() + new Double(calculoDto.getPrazoMM()).doubleValue() / 60; final Timestamp dataHoraInicioSla = this.calculaDataHoraJornada(calendarioDto, calculoDto.getDataHoraInicial(), HORA_INICIO_CALCULADA, true); final double dataHoraInicioSlaDbl = Util.getHoraDbl(UtilDatas.getHoraHHMM(dataHoraInicioSla)); double prazoDisponivel = this.calculaCargaHoraria(calendarioDto, dataHoraInicioSla); double cargaHoraria = prazoDisponivel; int difDias = 0; Timestamp dataHoraTermino = this.calculaDataHoraJornada(calendarioDto, dataHoraInicioSla, HORA_TERMINO_JORNADA, false); while (prazoDisponivel < slaDefinido) { dataHoraTermino = this.incrementaDias(dataHoraTermino, 1); dataHoraTermino = this.calculaDataHoraJornada(calendarioDto, dataHoraTermino, HORA_TERMINO_JORNADA, false); cargaHoraria = this.calculaCargaHorariaTotal(calendarioDto, dataHoraTermino); prazoDisponivel += cargaHoraria; difDias++; } if (prazoDisponivel > slaDefinido) { double hora = 0; if (difDias > 0) { double diferenca = cargaHoraria - (prazoDisponivel - slaDefinido); final JornadaTrabalhoDTO jornadaDto = this.recuperaJornada(calendarioDto, new Date(dataHoraTermino.getTime()), -1); final double inicio[] = jornadaDto.getInicio(); final double termino[] = jornadaDto.getTermino(); int i = 1; while (i <= 5 && inicio[i] != 99 && diferenca > 0) { final double ch = termino[i] - inicio[i]; if (diferenca > ch) { diferenca = diferenca - (termino[i] - inicio[i]); if (diferenca < 0) { diferenca = 0; } hora = inicio[i] + diferenca; } else { hora = inicio[i] + diferenca; diferenca = 0; } i++; } } else { double diferenca = cargaHoraria - (prazoDisponivel - slaDefinido); final JornadaTrabalhoDTO jornadaDto = this.recuperaJornada(calendarioDto, new Date(dataHoraTermino.getTime()), -1); final double inicio[] = jornadaDto.getInicio(); final double termino[] = jornadaDto.getTermino(); int i = 1; while (i <= 5 && inicio[i] != 99 && diferenca > 0) { if (dataHoraInicioSlaDbl >= inicio[i] && dataHoraInicioSlaDbl <= termino[i]) { hora = Util.getHoraDbl(UtilDatas.getHoraHHMM(dataHoraInicioSla)) + diferenca; for (int j = i; j <= 5; j++) { if (termino[j] != 0.0 && hora > termino[j] && inicio[j + 1] != 99.9) { hora += inicio[j + 1] - termino[j]; diferenca = 0; } } } i++; } } final Date dataRef = new Date(dataHoraTermino.getTime()); dataHoraTermino = Timestamp.valueOf(UtilDatas.dateToSTRWithFormat(dataRef, "yyyy-MM-dd") + " " + Util.getHoraFmtStr(hora) + ":00"); } calculoDto.setDataHoraFinal(dataHoraTermino); return calculoDto; } /** * Realiza o c�lculo de Tempo Decorrido de acordo com a data hora atual informada e o calend�rio. * * @param calculoDto * - Instancia de CalculoJornadaDTO que dever� ser instanciada utilizando o construtor sobrecarregado que recebe o ID do Calend�rio e a Data Hora inicial. * @param dataHoraAtual * - Timestamp da data hora atual. * @return CalculoJornadaDTO - DTO de CalculoJornada com os atributos TempoDecorridoHH e TempoDecorridoMM * @throws Exception * @author carlos.santos * @version 1.0 de 03.07.2013 por valdoilo.damasceno */ public CalculoJornadaDTO calculaPrazoDecorrido(final CalculoJornadaDTO calculoDto, final Timestamp dataHoraAtual, final TransactionControler tc) throws Exception { if (calculoDto.getIdCalendario() == null) { throw new Exception("ID do calend�rio n�o informado para c�lculo da data e hora"); } if (calculoDto.getDataHoraInicial() == null) { throw new Exception("Data e hora inicial n�o informadas para c�lculo da data e hora"); } this.setTransacao(tc); final CalendarioDTO calendarioDto = this.recuperaCalendario(calculoDto.getIdCalendario()); if (calculoDto.getDataHoraInicial().compareTo(dataHoraAtual) > 0) { throw new Exception("Data e Hora Inicial maior que Data e Hora Final"); } Timestamp dataHoraInicial = this.calculaDataHoraJornada(calendarioDto, calculoDto.getDataHoraInicial(), HORA_INICIO_CALCULADA, true); double prazoDecorrido = 0.00; int difDias = this.calculaDiferencaDias(dataHoraAtual, dataHoraInicial); boolean bMaisDeUmDia = difDias > 0; if (difDias > 0) { prazoDecorrido += this.calculaCargaHoraria(calendarioDto, dataHoraInicial); while (difDias > 0) { dataHoraInicial = this.incrementaDias(dataHoraInicial, 1); dataHoraInicial = this.calculaDataHoraJornada(calendarioDto, dataHoraInicial, HORA_INICIO_JORNADA, false); difDias = this.calculaDiferencaDias(dataHoraAtual, dataHoraInicial); if (difDias > 0) { prazoDecorrido += this.calculaCargaHorariaTotal(calendarioDto, dataHoraInicial); } else { bMaisDeUmDia = false; } } } if (difDias == 0) { final JornadaTrabalhoDTO jornadaDto = this.recuperaJornada(calendarioDto, new Date(dataHoraInicial.getTime()), -1); final double horaAtual = Util.getHoraDbl(UtilDatas.getHoraHHMM(dataHoraAtual)); final double inicio[] = jornadaDto.getInicio(); if (inicio[1] < horaAtual) { boolean bCalculou = false; final double termino[] = jornadaDto.getTermino(); for (int i = 1; i <= 5; i++) { if (inicio[i] == 99) { break; } if (inicio[i] <= horaAtual && termino[i] > horaAtual) { int p = i; if (bMaisDeUmDia) { while (p > 1) { prazoDecorrido += termino[p] - inicio[p]; // Acumula turnos da jornada - OBS VALDOILO - ISSO S� FUNCIONA QUANDO O N�MERO DE DIAS � MAIOR QUE 1 p = p - 1; } } if (horaAtual < termino[i]) { double hrInicio = inicio[i]; if (bMaisDeUmDia) { prazoDecorrido += horaAtual - hrInicio; // Acumula o tempo decorrido dentro do turno - OBS. VALDO�LO - ISSO S� FUNCIONA QUANDO O N�MERO DE DIAS � // MAIOR QUE 1 } else { hrInicio = Util.getHoraDbl(UtilDatas.getHoraHHMM(dataHoraInicial)); prazoDecorrido += horaAtual - hrInicio; double intervalo = 0; for (int j = 1; j <= 5; j++) { if (jornadaDto.getTermino(j) != null && jornadaDto.getInicio(j + 1) != null) { final double hrTermino = Util.getHoraDbl(jornadaDto.getTermino(j)); if (horaAtual > hrTermino && hrTermino > hrInicio) { intervalo += Util.calculaDuracao(jornadaDto.getTermino(j), jornadaDto.getInicio(j + 1)); } } } if (intervalo < prazoDecorrido) { prazoDecorrido -= intervalo; } } } else { prazoDecorrido += termino[i] - inicio[i]; // Acumula turno integral da jornada } bCalculou = true; } } if (!bCalculou) { // Ocorre quando a hora do tsRef est� acima do hor�rio de t�rmino da jornada final double ch = this.calculaCargaHorariaTotal(calendarioDto, dataHoraInicial); if (bMaisDeUmDia) { // Quando � mais de um dia, acumula a jornada total prazoDecorrido += this.calculaCargaHorariaTotal(calendarioDto, dataHoraInicial); } else { final double horaInicioSlaDbl = Util.getHoraDbl(UtilDatas.getHoraHHMM(dataHoraInicial)); if (this.verificarSeHoraEstaForaDaJornadaDeTrabalho(jornadaDto, horaAtual)) { // Verifica se a hora do tsRef est� num intervalo da jornada prazoDecorrido = this.retornaProximaHoraTerminoJornada(jornadaDto, horaInicioSlaDbl) - horaInicioSlaDbl; } else { dataHoraInicial = Timestamp.valueOf(UtilDatas.dateToSTRWithFormat(new Date(dataHoraInicial.getTime()), "yyyy-MM-dd") + " " + Util.getHoraFmtStr(horaAtual) + ":00"); prazoDecorrido = ch - this.calculaCargaHoraria(calendarioDto, dataHoraInicial); } } } } } calculoDto.setTempoDecorridoHH(new Integer(Util.getHora(prazoDecorrido))); calculoDto.setTempoDecorridoMM(new Integer(Util.getMinuto(prazoDecorrido))); return calculoDto; } public CalculoJornadaDTO calculaPrazoDecorridoNovo(final CalculoJornadaDTO calculoDto, final Timestamp dataHoraAtual, final TransactionControler tc) throws Exception { if (calculoDto.getIdCalendario() == null) { throw new Exception("ID do calend�rio n�o informado para c�lculo da data e hora"); } if (calculoDto.getDataHoraInicial() == null) { throw new Exception("Data e hora inicial n�o informadas para c�lculo da data e hora"); } this.setTransacao(tc); final CalendarioDTO calendarioDto = this.recuperaCalendario(calculoDto.getIdCalendario()); if (calculoDto.getDataHoraInicial().compareTo(dataHoraAtual) > 0) { throw new Exception("Data e Hora Inicial maior que Data e Hora Final"); } Timestamp dataHoraInicial = this.calculaDataHoraJornadaNovo(calendarioDto, calculoDto.getDataHoraInicial(), HORA_INICIO_CALCULADA, true); final Calendar calendarDataHoraAtual = Calendar.getInstance(); calendarDataHoraAtual.setTimeInMillis(dataHoraAtual.getTime()); final Calendar calendarDataHoraInicial = Calendar.getInstance(); calendarDataHoraInicial.setTimeInMillis(dataHoraInicial.getTime()); calendarDataHoraAtual.add(Calendar.SECOND, -calendarDataHoraInicial.get(Calendar.SECOND)); final int segundos = calendarDataHoraAtual.get(Calendar.SECOND); double prazoDecorrido = 0.00; int difDias = this.calculaDiferencaDias(dataHoraAtual, dataHoraInicial); boolean bMaisDeUmDia = difDias > 0; if (difDias > 0) { prazoDecorrido += this.calculaCargaHoraria(calendarioDto, dataHoraInicial); while (difDias > 0) { dataHoraInicial = this.incrementaDias(dataHoraInicial, 1); dataHoraInicial = this.calculaDataHoraJornadaNovo(calendarioDto, dataHoraInicial, HORA_INICIO_JORNADA, false); difDias = this.calculaDiferencaDias(dataHoraAtual, dataHoraInicial); if (difDias > 0) { prazoDecorrido += this.calculaCargaHorariaTotal(calendarioDto, dataHoraInicial); } else { bMaisDeUmDia = false; } } } if (difDias == 0) { final JornadaTrabalhoDTO jornadaDto = this.recuperaJornada(calendarioDto, new Date(dataHoraInicial.getTime()), -1); final double horaAtual = Util.getHoraDbl(UtilDatas.getHoraHHMM(dataHoraAtual)); final double inicio[] = jornadaDto.getInicio(); if (inicio[1] < horaAtual) { boolean bCalculou = false; final double termino[] = jornadaDto.getTermino(); for (int i = 1; i <= 5; i++) { if (inicio[i] == 99) { break; } if (inicio[i] <= horaAtual && termino[i] > horaAtual) { int p = i; if (bMaisDeUmDia) { while (p > 1) { prazoDecorrido += termino[p] - inicio[p]; // Acumula turnos da jornada - OBS VALDOILO - ISSO S� FUNCIONA QUANDO O N�MERO DE DIAS � MAIOR QUE 1 p = p - 1; } } if (horaAtual < termino[i]) { double hrInicio = inicio[i]; if (bMaisDeUmDia) { prazoDecorrido += horaAtual - hrInicio; // Acumula o tempo decorrido dentro do turno - OBS. VALDO�LO - ISSO S� FUNCIONA QUANDO O N�MERO DE DIAS � // MAIOR QUE 1 } else { hrInicio = Util.getHoraDbl(UtilDatas.getHoraHHMM(dataHoraInicial)); prazoDecorrido += horaAtual - hrInicio; double intervalo = 0; for (int j = 1; j <= 5; j++) { if (jornadaDto.getTermino(j) != null && jornadaDto.getInicio(j + 1) != null) { final double hrTermino = Util.getHoraDbl(jornadaDto.getTermino(j)); if (horaAtual > hrTermino && hrTermino > hrInicio) { intervalo += Util.calculaDuracao(jornadaDto.getTermino(j), jornadaDto.getInicio(j + 1)); } } } if (intervalo < prazoDecorrido) { prazoDecorrido -= intervalo; } } } else { prazoDecorrido += termino[i] - inicio[i]; // Acumula turno integral da jornada } bCalculou = true; } } if (!bCalculou) { // Ocorre quando a hora do tsRef est� acima do hor�rio de t�rmino da jornada final double ch = this.calculaCargaHorariaTotal(calendarioDto, dataHoraInicial); if (bMaisDeUmDia) { // Quando � mais de um dia, acumula a jornada total prazoDecorrido += this.calculaCargaHorariaTotal(calendarioDto, dataHoraInicial); } else { final double horaInicioSlaDbl = Util.getHoraDbl(UtilDatas.getHoraHHMM(dataHoraInicial)); if (this.verificarSeHoraEstaForaDaJornadaDeTrabalho(jornadaDto, horaAtual)) { // Verifica se a hora do tsRef est� num intervalo da jornada prazoDecorrido = this.retornaProximaHoraTerminoJornada(jornadaDto, horaInicioSlaDbl) - horaInicioSlaDbl; } else { dataHoraInicial = Timestamp.valueOf(UtilDatas.dateToSTRWithFormat(new Date(dataHoraInicial.getTime()), "yyyy-MM-dd") + " " + Util.getHoraFmtStr(horaAtual) + ":00"); prazoDecorrido = ch - this.calculaCargaHoraria(calendarioDto, dataHoraInicial); } } } } } calculoDto.setTempoDecorridoHH(new Integer(Util.getHora(prazoDecorrido))); calculoDto.setTempoDecorridoMM(new Integer(Util.getMinuto(prazoDecorrido))); calculoDto.setTempoDecorridoSS(segundos); return calculoDto; } private int calculaDiferencaDias(final Timestamp tsFinal, final Timestamp tsInicial) throws Exception { if (tsFinal.compareTo(tsInicial) < 0) { return -1; } int i = 0; final SimpleDateFormat spd = new SimpleDateFormat("yyyyMMdd"); Date dataRef = new Date(tsInicial.getTime()); String dataRefInv = spd.format(dataRef).trim(); final String dataFinalInv = spd.format(new Date(tsFinal.getTime())).trim(); while (dataRefInv.compareTo(dataFinalInv) < 0) { dataRef = new Date(UtilDatas.incrementaDiasEmData(dataRef, 1).getTime()); dataRefInv = spd.format(dataRef).trim(); i++; } return i; } public Timestamp incrementaDias(final Timestamp ts, final int qtdeDias) throws Exception { Date dataRef = new Date(ts.getTime()); dataRef = new Date(UtilDatas.incrementaDiasEmData(dataRef, qtdeDias).getTime()); return Timestamp.valueOf(UtilDatas.dateToSTRWithFormat(dataRef, "yyyy-MM-dd") + " " + "00:00:00"); } private Timestamp calculaDataHoraJornada(final CalendarioDTO calendarioDto, final Timestamp dataHoraRef, final String tipoCalculoHora, final boolean bUtilizaHorarioTimestamp) throws Exception { final JornadaTrabalhoDTO jornadaDto = this.verificaDiaUtil(calendarioDto, dataHoraRef, bUtilizaHorarioTimestamp); if (jornadaDto == null) { throw new Exception("N�o existem jornadas configuradas para este calend�rio nos pr�ximos 30 dias"); } final double hora = Util.getHoraDbl(UtilDatas.getHoraHHMM(jornadaDto.getDataHoraInicial())); double horaUtil = hora; if (tipoCalculoHora.equalsIgnoreCase(HORA_INICIO_CALCULADA)) { horaUtil = this.calculaHoraUtilInicial(jornadaDto, hora); } else if (tipoCalculoHora.equalsIgnoreCase(HORA_INICIO_JORNADA)) { horaUtil = this.retornaHoraInicioJornada(jornadaDto); } else if (tipoCalculoHora.equalsIgnoreCase(HORA_TERMINO_JORNADA)) { horaUtil = this.retornaHoraTerminoJornada(jornadaDto); } else { horaUtil = this.calculaHoraUtilFinal(jornadaDto, hora); } final Date dataRef = new Date(jornadaDto.getDataHoraInicial().getTime()); return Timestamp.valueOf(UtilDatas.dateToSTRWithFormat(dataRef, "yyyy-MM-dd") + " " + Util.getHoraFmtStr(horaUtil) + ":00"); } private Timestamp calculaDataHoraJornadaNovo(final CalendarioDTO calendarioDto, final Timestamp dataHoraRef, final String tipoCalculoHora, final boolean bUtilizaHorarioTimestamp) throws Exception { final JornadaTrabalhoDTO jornadaDto = this.verificaDiaUtilNovo(calendarioDto, dataHoraRef, bUtilizaHorarioTimestamp); if (jornadaDto == null) { throw new Exception("N�o existem jornadas configuradas para este calend�rio nos pr�ximos 30 dias"); } final Calendar calendarDataHoraInicial = Calendar.getInstance(); calendarDataHoraInicial.setTimeInMillis(jornadaDto.getDataHoraInicial().getTime()); final int segundos = calendarDataHoraInicial.get(Calendar.SECOND); final double hora = Util.getHoraDbl(UtilDatas.getHoraHHMM(jornadaDto.getDataHoraInicial())); double horaUtil = hora; if (tipoCalculoHora.equalsIgnoreCase(HORA_INICIO_CALCULADA)) { horaUtil = this.calculaHoraUtilInicial(jornadaDto, hora); } else if (tipoCalculoHora.equalsIgnoreCase(HORA_INICIO_JORNADA)) { horaUtil = this.retornaHoraInicioJornada(jornadaDto); } else if (tipoCalculoHora.equalsIgnoreCase(HORA_TERMINO_JORNADA)) { horaUtil = this.retornaHoraTerminoJornada(jornadaDto); } else { horaUtil = this.calculaHoraUtilFinal(jornadaDto, hora); } final Date dataRef = new Date(jornadaDto.getDataHoraInicial().getTime()); return Timestamp.valueOf(UtilDatas.dateToSTRWithFormat(dataRef, "yyyy-MM-dd") + " " + Util.getHoraFmtStr(horaUtil) + ":" + UtilDatas.adicionaZeroAEsquerda(segundos)); } public JornadaTrabalhoDTO verificaDiaUtil(final CalendarioDTO calendarioDto, final Timestamp dataHoraRef, final boolean bUtilizaHorarioTimestamp) throws Exception { double horaRef = Util.getHoraDbl(UtilDatas.getHoraHHMM(dataHoraRef)); Date dataRef = new Date(dataHoraRef.getTime()); double horaCalculo = -1; if (bUtilizaHorarioTimestamp) { horaCalculo = horaRef; } JornadaTrabalhoDTO jornadaDto = this.recuperaJornada(calendarioDto, dataRef, horaCalculo); int i = 0; while (jornadaDto == null && i < 30) { dataRef = new Date(UtilDatas.incrementaDiasEmData(dataRef, 1).getTime()); jornadaDto = this.recuperaJornada(calendarioDto, dataRef, -1); if (jornadaDto != null) { horaRef = this.retornaHoraInicioJornada(jornadaDto); } i++; } if (jornadaDto != null) { final double horaInicio = this.retornaHoraInicioJornada(jornadaDto); if (horaRef > horaInicio) { jornadaDto.setDataHoraInicial(Timestamp.valueOf(UtilDatas.dateToSTRWithFormat(dataRef, "yyyy-MM-dd") + " " + Util.getHoraFmtStr(horaRef) + ":00")); } else { jornadaDto.setDataHoraInicial(Timestamp.valueOf(UtilDatas.dateToSTRWithFormat(dataRef, "yyyy-MM-dd") + " " + Util.getHoraFmtStr(horaInicio) + ":00")); } } return jornadaDto; } public JornadaTrabalhoDTO verificaDiaUtilNovo(final CalendarioDTO calendarioDto, final Timestamp dataHoraRef, final boolean bUtilizaHorarioTimestamp) throws Exception { final Calendar calendarDataHoraRef = Calendar.getInstance(); calendarDataHoraRef.setTimeInMillis(dataHoraRef.getTime()); final int segundos = calendarDataHoraRef.get(Calendar.SECOND); double horaRef = Util.getHoraDbl(UtilDatas.getHoraHHMM(dataHoraRef)); Date dataRef = new Date(dataHoraRef.getTime()); double horaCalculo = -1; if (bUtilizaHorarioTimestamp) { horaCalculo = horaRef; } JornadaTrabalhoDTO jornadaDto = this.recuperaJornada(calendarioDto, dataRef, horaCalculo); int i = 0; while (jornadaDto == null && i < 30) { dataRef = new Date(UtilDatas.incrementaDiasEmData(dataRef, 1).getTime()); jornadaDto = this.recuperaJornada(calendarioDto, dataRef, -1); if (jornadaDto != null) { horaRef = this.retornaHoraInicioJornada(jornadaDto); } i++; } if (jornadaDto != null) { final double horaInicio = this.retornaHoraInicioJornada(jornadaDto); if (horaRef > horaInicio) { jornadaDto.setDataHoraInicial(Timestamp.valueOf(UtilDatas.dateToSTRWithFormat(dataRef, "yyyy-MM-dd") + " " + Util.getHoraFmtStr(horaRef) + ":" + UtilDatas.adicionaZeroAEsquerda(segundos))); } else { jornadaDto.setDataHoraInicial(Timestamp.valueOf(UtilDatas.dateToSTRWithFormat(dataRef, "yyyy-MM-dd") + " " + Util.getHoraFmtStr(horaInicio) + ":" + UtilDatas.adicionaZeroAEsquerda(segundos))); } } return jornadaDto; } public JornadaTrabalhoDTO recuperaJornada(final CalendarioDTO calendarioDto, final Date dataRef, final double horaRef) throws Exception { final JornadaTrabalhoDTO jornadaDto = this.recuperaJornada(calendarioDto, dataRef); if (jornadaDto == null) { return null; } if (horaRef < 0) { return jornadaDto; } final double horaFinal = this.retornaHoraTerminoJornada(jornadaDto); if (horaFinal < horaRef) { return null; } // double horaInicial = retornaHoraInicioJornada(jornadaDto); // if (horaInicial > horaRef) // return null; return jornadaDto; } @Override public CalendarioDTO recuperaCalendario(final Integer idCalendario) throws Exception { if (transactionControler != null && transactionControler.isStarted() == true) { this.getDao().setTransactionControler(transactionControler); } final CalendarioDTO calendarioDto = new CalendarioDTO(); calendarioDto.setIdCalendario(idCalendario); return (CalendarioDTO) this.getDao().restore(calendarioDto); } @Override public JornadaTrabalhoDTO recuperaJornada(final CalendarioDTO calendarioDto, final Date dataRef) throws Exception { Integer idJornada = calendarioDto.getIdJornada(dataRef); final ExcecaoCalendarioDTO excecaoDto = this.getExcecaoCalendarioDAO().findByIdCalendarioAndData(calendarioDto.getIdCalendario(), dataRef); if (excecaoDto != null && excecaoDto.getTipo().equalsIgnoreCase(TRABALHO)) { idJornada = excecaoDto.getIdJornada(); } if (excecaoDto != null && excecaoDto.getTipo().equalsIgnoreCase(FOLGA)) { return null; } if (idJornada == null) { return null; } boolean bFeriado = false; if (calendarioDto.getConsideraFeriados() != null && calendarioDto.getConsideraFeriados().equalsIgnoreCase("S")) { bFeriado = this.getFeriadoDAO().isFeriado(dataRef, null, null); } if (bFeriado) { return null; } JornadaTrabalhoDTO jornadaDto = new JornadaTrabalhoDTO(); jornadaDto.setIdJornada(idJornada); jornadaDto = (JornadaTrabalhoDTO) this.getJornadaTrabalhoDAO().restore(jornadaDto); return jornadaDto; } private double calculaHoraUtilInicial(final JornadaTrabalhoDTO jornadaDto, final double horaRef) throws Exception { if (jornadaDto == null) { return 0.0; } final double[] hrInicio = new double[] {99, 99, 99, 99, 99, 99}; final double[] hrTermino = new double[] {0, 0, 0, 0, 0, 0}; for (int i = 1; i <= 5; i++) { if (jornadaDto.getInicio(i) != null) { hrInicio[i] = Util.getHoraDbl(jornadaDto.getInicio(i)); hrTermino[i] = Util.getHoraDbl(jornadaDto.getTermino(i)); } } double horaUtilDbl = 0.0; int i = 1; while (horaUtilDbl == 0.0 && i <= 5) { if (hrInicio[i] != 99 && (hrInicio[i] <= horaRef || i > 1) && hrTermino[i] >= horaRef) { horaUtilDbl = hrInicio[i]; } i++; } if (horaUtilDbl > horaRef) { return horaUtilDbl; } else { return horaRef; } } private double calculaHoraUtilFinal(final JornadaTrabalhoDTO jornadaDto, final double horaRef) throws Exception { if (jornadaDto == null) { return 0.0; } final double[] hrInicio = new double[] {99, 99, 99, 99, 99, 99}; final double[] hrTermino = new double[] {0, 0, 0, 0, 0, 0}; for (int i = 1; i <= 5; i++) { if (jornadaDto.getInicio(i) != null) { hrInicio[i] = Util.getHoraDbl(jornadaDto.getInicio(i)); hrTermino[i] = Util.getHoraDbl(jornadaDto.getTermino(i)); } } double horaUtilDbl = 99; int i = 1; while (horaUtilDbl == 99 && i <= 5) { if (hrTermino[i] != 99 && hrTermino[i] >= horaRef) { horaUtilDbl = hrTermino[i]; } i++; } if (horaUtilDbl > horaRef) { return horaUtilDbl; } else { return horaRef; } } private double retornaHoraTerminoJornada(final JornadaTrabalhoDTO jornadaDto) throws Exception { double horaFinalDbl = -1; if (jornadaDto.getTermino5() != null && jornadaDto.getTermino5().trim().length() > 0) { horaFinalDbl = Util.getHoraDbl(jornadaDto.getTermino5()); } else if (jornadaDto.getTermino4() != null && jornadaDto.getTermino4().trim().length() > 0) { horaFinalDbl = Util.getHoraDbl(jornadaDto.getTermino4()); } else if (jornadaDto.getTermino3() != null && jornadaDto.getTermino3().trim().length() > 0) { horaFinalDbl = Util.getHoraDbl(jornadaDto.getTermino3()); } else if (jornadaDto.getTermino2() != null && jornadaDto.getTermino2().trim().length() > 0) { horaFinalDbl = Util.getHoraDbl(jornadaDto.getTermino2()); } else if (jornadaDto.getTermino1() != null && jornadaDto.getTermino1().trim().length() > 0) { horaFinalDbl = Util.getHoraDbl(jornadaDto.getTermino1()); } return horaFinalDbl; } private double retornaHoraInicioJornada(final JornadaTrabalhoDTO jornadaDto) throws Exception { double horaInicialDbl = -1; if (jornadaDto.getInicio1() != null && jornadaDto.getInicio1().trim().length() > 0) { horaInicialDbl = Util.getHoraDbl(jornadaDto.getInicio1()); } else if (jornadaDto.getInicio2() != null && jornadaDto.getInicio2().trim().length() > 0) { horaInicialDbl = Util.getHoraDbl(jornadaDto.getInicio2()); } else if (jornadaDto.getInicio3() != null && jornadaDto.getInicio3().trim().length() > 0) { horaInicialDbl = Util.getHoraDbl(jornadaDto.getInicio3()); } else if (jornadaDto.getInicio4() != null && jornadaDto.getInicio4().trim().length() > 0) { horaInicialDbl = Util.getHoraDbl(jornadaDto.getInicio4()); } else if (jornadaDto.getInicio5() != null && jornadaDto.getInicio5().trim().length() > 0) { horaInicialDbl = Util.getHoraDbl(jornadaDto.getInicio5()); } return horaInicialDbl; } private double calculaIntervalos(final JornadaTrabalhoDTO jornadaDto, final double horaInicial) throws Exception { double intervalo = 0; for (int i = 1; i <= 5; i++) { if (jornadaDto.getTermino(i) != null && jornadaDto.getInicio(i + 1) != null) { final double hr = Util.getHoraDbl(jornadaDto.getTermino(i)); if (hr >= horaInicial) { intervalo += Util.calculaDuracao(jornadaDto.getTermino(i), jornadaDto.getInicio(i + 1)); } } } return intervalo; } /** * Verifica se a hora informada est� fora da Jornada de trabalho. Ou seja, fora de um intervalo v�lido na Jornada. * * @param jornadaDto * @param hora * @return true - Est� fora da Jornada de Trabalho. * @throws Exception * @author valdoilo.damasceno */ private boolean verificarSeHoraEstaForaDaJornadaDeTrabalho(final JornadaTrabalhoDTO jornadaDto, final double hora) throws Exception { boolean result = true; final double inicio[] = jornadaDto.getInicio(); final double termino[] = jornadaDto.getTermino(); for (int i = 1; i <= 5; i++) { if (hora >= inicio[i] && hora <= termino[i]) { result = false; break; } } return result; } private double calculaCargaHoraria(final CalendarioDTO calendarioDto, final Timestamp ts) throws Exception { final Date dataRef = new Date(ts.getTime()); final JornadaTrabalhoDTO jornadaDto = this.recuperaJornada(calendarioDto, dataRef); if (jornadaDto == null) { return 0.0; } final double horaInicial = Util.getHoraDbl(UtilDatas.getHoraHHMM(ts)); final double horaFinal = this.retornaHoraTerminoJornada(jornadaDto); final double result = horaFinal - horaInicial - this.calculaIntervalos(jornadaDto, horaInicial); if (result > 0) { return result; } return 0; } private double calculaCargaHorariaTotal(final CalendarioDTO calendarioDto, final Timestamp ts) throws Exception { final Date dataRef = new Date(ts.getTime()); final JornadaTrabalhoDTO jornadaDto = this.recuperaJornada(calendarioDto, dataRef); if (jornadaDto == null) { return 0.0; } final double horaInicial = this.retornaHoraInicioJornada(jornadaDto); final double horaFinal = this.retornaHoraTerminoJornada(jornadaDto); final double result = horaFinal - horaInicial - this.calculaIntervalos(jornadaDto, horaInicial); if (result > 0) { return result; } else { return 0; } } @Override public boolean jornadaDeTrabalhoEmUso(final JornadaTrabalhoDTO jornadaTrabalhoDTO) throws Exception { boolean resp = false; final Integer idJornada = jornadaTrabalhoDTO.getIdJornada(); resp = this.getDao().verificaJornada(idJornada); return resp; } @Override public boolean verificaSeExisteCalendario(final CalendarioDTO calendarioDTO) throws Exception { return this.getDao().verificaSeExisteCalendario(calendarioDTO); } /** * retorna o fim de um jornada proxima a hora passada * * @param jornadaDto * @param hora * @return */ private double retornaProximaHoraTerminoJornada(final JornadaTrabalhoDTO jornadaDto, final double hora) { final double termino[] = jornadaDto.getTermino(); for (int i = 1; i <= 5; i++) { if (termino[i] == 0) { break; } if (termino[i] != 0 && termino[i] >= hora) { return termino[i]; } } return 0; } /** * @author euler.ramos * @param idCalendario * @return * @throws Exception */ @Override public Object verificaSePermiteExcluir(final DocumentHTML document, final HttpServletRequest request, final CalendarioDTO calendario) throws Exception { String resultado = "excluir"; /* * Tabelas que se relacionam com calendario: * RECURSO * SERVICOCONTRATO * TIPOLIBERACAO * TIPOMUDANCA */ final List<RecursoDTO> listaRecursos = this.getRecursoDAO().findByIdCalendario(calendario.getIdCalendario()); if (listaRecursos != null && listaRecursos.size() > 0) { resultado = UtilI18N.internacionaliza(request, "calendario.naoExDevidoRecursos"); } else { final List<ServicoContratoDTO> listaservicoContrato = this.getServicoContratoDAO().findByIdCalendario(calendario.getIdCalendario()); if (listaservicoContrato != null && listaservicoContrato.size() > 0) { resultado = UtilI18N.internacionaliza(request, "calendario.naoExDevidoServicoContrato"); } else { final List<TipoLiberacaoDTO> listaTipoLiberacao = this.getTipoLiberacaoDAO().findByIdCalendario(calendario.getIdCalendario()); if (listaTipoLiberacao != null && listaTipoLiberacao.size() > 0) { resultado = UtilI18N.internacionaliza(request, "calendario.naoExDevidoTipoLiberacao"); } else { final List<TipoMudancaDTO> listaTipoMudanca = this.getTipoMudancaDAO().findByIdCalendario(calendario.getIdCalendario()); if (listaTipoMudanca != null && listaTipoMudanca.size() > 0) { resultado = UtilI18N.internacionaliza(request, "calendario.naoExDevidoTipoMudanca"); } } } } return resultado; } private ExcecaoCalendarioDao excecaoCalendarioDAO; private ExcecaoCalendarioDao getExcecaoCalendarioDAO() throws Exception { if (excecaoCalendarioDAO == null) { excecaoCalendarioDAO = new ExcecaoCalendarioDao(); this.setTransacaoDao(excecaoCalendarioDAO); } return excecaoCalendarioDAO; } private FeriadoDao feriadoDAO; private FeriadoDao getFeriadoDAO() throws Exception { if (feriadoDAO == null) { feriadoDAO = new FeriadoDao(); this.setTransacaoDao(feriadoDAO); } return feriadoDAO; } private JornadaTrabalhoDao jornadaTrabalhoDAO; private JornadaTrabalhoDao getJornadaTrabalhoDAO() throws Exception { if (jornadaTrabalhoDAO == null) { jornadaTrabalhoDAO = new JornadaTrabalhoDao(); this.setTransacaoDao(jornadaTrabalhoDAO); } return jornadaTrabalhoDAO; } private RecursoDao recursoDAO; private RecursoDao getRecursoDAO() throws Exception { if (recursoDAO == null) { recursoDAO = new RecursoDao(); this.setTransacaoDao(recursoDAO); } return recursoDAO; } private ServicoContratoDao servicoContratoDao; private ServicoContratoDao getServicoContratoDAO() throws Exception { if (servicoContratoDao == null) { servicoContratoDao = new ServicoContratoDao(); this.setTransacaoDao(servicoContratoDao); } return servicoContratoDao; } private TipoLiberacaoDAO tipoLiberacaoDAO; private TipoLiberacaoDAO getTipoLiberacaoDAO() throws Exception { if (tipoLiberacaoDAO == null) { tipoLiberacaoDAO = new TipoLiberacaoDAO(); this.setTransacaoDao(tipoLiberacaoDAO); } return tipoLiberacaoDAO; } private TipoMudancaDAO tipoMudancaDAO; private TipoMudancaDAO getTipoMudancaDAO() throws Exception { if (tipoMudancaDAO == null) { tipoMudancaDAO = new TipoMudancaDAO(); this.setTransacaoDao(tipoMudancaDAO); } return tipoMudancaDAO; } }