Created
September 6, 2011 20:35
-
-
Save handersonbf/1198870 to your computer and use it in GitHub Desktop.
sessao.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| package br.com.itc.service.impl; | |
| import java.text.SimpleDateFormat; | |
| import java.util.ArrayList; | |
| import java.util.Collection; | |
| import java.util.Collections; | |
| import java.util.Date; | |
| import java.util.HashSet; | |
| import java.util.List; | |
| import java.util.Set; | |
| import javax.persistence.EntityManager; | |
| import javax.persistence.PersistenceContext; | |
| import org.hibernate.Criteria; | |
| import org.hibernate.Query; | |
| import org.hibernate.Session; | |
| import org.joda.time.DateTime; | |
| import org.springframework.beans.factory.annotation.Autowired; | |
| import org.springframework.stereotype.Service; | |
| import br.com.itc.model.CargaHoraria; | |
| import br.com.itc.model.DiaDaSemana; | |
| import br.com.itc.model.Fisioterapeuta; | |
| import br.com.itc.model.Turnos; | |
| import br.com.itc.security.SecurityHelper; | |
| import br.com.itc.service.CargaHorariaService; | |
| import br.com.itc.service.FisioterapeutaService; | |
| import br.com.itc.service.SessaoPacienteService; | |
| import br.com.itc.util.DataSessaoUtil; | |
| import br.com.itc.util.DataUtil; | |
| @Service("sessaoPacienteService") | |
| public class SessaoPacienteServiceImpl implements SessaoPacienteService { | |
| @PersistenceContext | |
| private EntityManager entityManager; | |
| @Autowired | |
| private FisioterapeutaService fisioterapeutaService; | |
| @Autowired | |
| private SecurityHelper securityHelper; | |
| @Autowired | |
| private CargaHorariaService cargaHorariaService; | |
| //FIXME: Resolver esse problema com as variáveis | |
| private List<Date> datasValidas; | |
| private List<SessaoDisponivel> sessoesDisponiveis; | |
| private DateTime dataInicio = null; | |
| private List<Date> horarios = new ArrayList<Date>(); | |
| public void setEntityManager(EntityManager entityManager) { | |
| this.entityManager = entityManager; | |
| } | |
| @SuppressWarnings("unchecked") | |
| public List<CargaHoraria> listarCargaHorariaDisponivel(List<Turnos> turnos, List<Integer> diasSemana) { | |
| StringBuilder sql = new StringBuilder(); | |
| String diasSemanaSql = ""; | |
| sql.append("select distinct c"); | |
| sql.append(" from CargaHoraria c "); | |
| sql.append(" inner join c.fisioterapeuta f"); | |
| if (diasSemana == null) { | |
| sql.append(" left join c.diasDaSemana d "); | |
| } else { | |
| sql.append(" inner join c.diasDaSemana d "); | |
| } | |
| sql.append(" where f.franquiaId = " + securityHelper.getFranquiaIdDoUsuarioLogado() + " and c.ativa = 0"); | |
| if (diasSemana != null) { | |
| String diasDaSemanaCodigos = separaCodigosPorVirgula(diasSemana); | |
| diasSemanaSql = " and d.diaSemana in ( " + diasDaSemanaCodigos + ")"; | |
| } | |
| if (turnos != null) { | |
| for (int i = 0; i < turnos.size(); i++) { | |
| Turnos turno = turnos.get(i); | |
| if (i == 0) { | |
| sql.append(" and (c.horarioInicial between '" + dataToMysql(turno.getHoraInicial()) + "' and '" + dataToMysql(turno.getHoraFinal()) + "'"); | |
| sql.append(" or c.horarioFinal between '" + dataToMysql(turno.getHoraInicial()) + "' and '" + dataToMysql(turno.getHoraFinal()) + "')"); | |
| sql.append(diasSemanaSql); | |
| } | |
| else { | |
| sql.append(" or (c.horarioInicial between '" + dataToMysql(turno.getHoraInicial()) + "' and '" + dataToMysql(turno.getHoraFinal()) + "'"); | |
| sql.append(" or c.horarioFinal between '" + dataToMysql(turno.getHoraInicial()) + "' and '" + dataToMysql(turno.getHoraFinal()) + "')"); | |
| sql.append(diasSemanaSql); | |
| } | |
| } | |
| } | |
| Query query = (Query) getSession().createQuery(sql.toString()); | |
| return query.list(); | |
| } | |
| @SuppressWarnings("deprecation") | |
| public boolean verificaDisponibilidadeCargaHorariaDisponivelComFisioterapeuta(Integer codigoDoFisioterapeuta, Date data) { | |
| StringBuilder sql = new StringBuilder(); | |
| sql.append("select distinct c"); | |
| sql.append(" from CargaHoraria c "); | |
| sql.append(" left join c.fisioterapeuta f "); | |
| sql.append(" inner join c.diasDaSemana d "); | |
| sql.append(" where 1=1"); | |
| sql.append(" and d.diaSemana = " + (data.getDay() + 1)); | |
| sql.append(" and f.id = " + codigoDoFisioterapeuta); | |
| sql.append(" and c.ativa = 0"); | |
| sql.append(" and f.franquiaId = " + securityHelper.getFranquiaIdDoUsuarioLogado()); | |
| Query query = (Query) getSession().createQuery(sql.toString()); | |
| return query.list().size() > 0; | |
| } | |
| @SuppressWarnings("deprecation") | |
| public boolean verificaDisponibilidadeCargaHorariaDisponivelDoFisioterapeuta(Integer codigoDoFisioterapeuta, Date dataInicial, Date horaInicial, Date horaFinal) { | |
| horaInicial.setDate(10); | |
| horaInicial.setMonth(9); | |
| horaInicial.setYear(112); | |
| horaFinal.setDate(10); | |
| horaFinal.setMonth(9); | |
| horaFinal.setYear(112); | |
| StringBuilder sql = new StringBuilder(); | |
| sql.append("select distinct c"); | |
| sql.append(" from CargaHoraria c "); | |
| sql.append(" left join c.fisioterapeuta f "); | |
| sql.append(" inner join c.diasDaSemana d "); | |
| sql.append(" where 1=1"); | |
| sql.append(" and d.diaSemana = :diaSemana"); | |
| sql.append(" and f.id = :codigoDoFisioterapeuta"); | |
| sql.append(" and c.horarioInicial <= :horarioInicial"); | |
| sql.append(" and c.horarioFinal >= :horarioFinal"); | |
| sql.append(" and c.ativa = 0"); | |
| sql.append(" and f.franquiaId = " + securityHelper.getFranquiaIdDoUsuarioLogado()); | |
| Query query = (Query) getSession().createQuery(sql.toString()); | |
| query.setParameter("codigoDoFisioterapeuta", codigoDoFisioterapeuta); | |
| query.setParameter("diaSemana", (dataInicial.getDay() + 1)); | |
| query.setParameter("horarioInicial", horaInicial); | |
| query.setParameter("horarioFinal", horaFinal); | |
| return query.list().size() > 0; | |
| } | |
| @SuppressWarnings("deprecation") | |
| public boolean verificaDisponibilidadeHorarioFisioterapeuta(Fisioterapeuta fisioterapeuta, Date dataInicial, Date dataFinal, Date horarioInicial, Date horarioFinal, Integer codigoEvento) { | |
| StringBuilder sql; | |
| sql = new StringBuilder(); | |
| sql.append("select e "); | |
| sql.append(" from Evento e "); | |
| sql.append(" inner join e.calendario c"); | |
| sql.append(" inner join c.fisioterapeuta f "); | |
| sql.append(" inner join f.cargaHoraria ch "); | |
| sql.append(" where f.id = :codigoFisioterapeuta"); | |
| sql.append(" and e.dataInicial = :dataInicial"); | |
| sql.append(" and e.dataFinal = :dataFinal"); | |
| sql.append(" and ch.ativa = 0"); | |
| sql.append(" and f.franquiaId = " + securityHelper.getFranquiaIdDoUsuarioLogado()); | |
| if (codigoEvento != null) { | |
| sql.append(" and e.codigo <> :codigoEvento"); | |
| } | |
| sql.append(" and (e.horarioInicial = '" + validaData(horarioInicial.getHours()) + ":" + validaData(horarioInicial.getMinutes()) + ":00" + "'"); | |
| sql.append(" or e.horarioInicial < '" + validaData(horarioFinal.getHours()) + ":" + validaData(horarioFinal.getMinutes()) + ":00" + "')"); | |
| sql.append(" and (e.horarioFinal = '" + validaData(horarioFinal.getHours()) + ":" + validaData(horarioFinal.getMinutes()) + ":00" + "'"); | |
| sql.append(" or e.horarioFinal > '" + validaData(horarioInicial.getHours()) + ":" + validaData(horarioInicial.getMinutes()) + ":00" + "')"); | |
| Query query = getSession().createQuery(sql.toString()); | |
| if (codigoEvento != null) { | |
| query.setParameter("codigoEvento", codigoEvento); | |
| } | |
| if (fisioterapeuta != null) { | |
| query.setParameter("codigoFisioterapeuta", fisioterapeuta.getId()); | |
| } | |
| query.setParameter("dataInicial", dataInicial); | |
| query.setParameter("dataFinal", dataFinal); | |
| return query.list().size() == 0; | |
| } | |
| private String validaData(Integer valor) { | |
| if (valor < 10) { | |
| return "0" + valor.toString(); | |
| } | |
| return valor.toString(); | |
| } | |
| public List<SessaoDisponivel> listarCargaHorariaDisponivelComFisioterapeuta(Integer qtde, Integer qtdeInicial, DateTime inicio, Fisioterapeuta fisioterapeuta, List<Turnos> turnos, List<DiaDaSemana> diasDaSemana) { | |
| zeraDatasEHorasValidas(); | |
| buscaDatas(qtde, qtdeInicial, inicio, fisioterapeuta, turnos, diasDaSemana); | |
| for(SessaoDisponivel sd : sessoesDisponiveis){ | |
| List<Date> novaLista = verificaHorariosIguais(sd.getDatas()); | |
| sd.setDatas(novaLista); | |
| } | |
| return sessoesDisponiveis; | |
| } | |
| private List<Date> verificaHorariosIguais(List<Date> listaDatas){ | |
| List<Date> novaListaData = new ArrayList<Date>(); | |
| if(novaListaData.isEmpty()){ | |
| novaListaData.add(listaDatas.get(0)); | |
| } | |
| for(Date data : listaDatas){ | |
| DataUtil dataU = new DataUtil(data, data); | |
| int count=0; | |
| for(Date novaData : novaListaData){ | |
| DataUtil novaDataU = new DataUtil(novaData, novaData); | |
| if((dataU.getDiaDaSemanaDataInicial() == novaDataU.getDiaDaSemanaDataInicial()) | |
| && (dataU.getHorarioDtInicial().compareTo(novaDataU.getHorarioDtInicial()) == 0) | |
| && (dataU.getMesDataInicial() == novaDataU.getMesDataInicial()) | |
| && (dataU.getDiaDataInicial() == novaDataU.getDiaDataInicial())){ | |
| count++; | |
| } | |
| } | |
| if(count == 0){ | |
| novaListaData.add(data); | |
| } | |
| } | |
| return novaListaData; | |
| } | |
| private void zeraDatasEHorasValidas() { | |
| datasValidas = new ArrayList<Date>(); | |
| horarios = new ArrayList<Date>(); | |
| sessoesDisponiveis = new ArrayList<SessaoDisponivel>(); | |
| } | |
| public boolean buscaHorarios(Date data, Fisioterapeuta fisioterapeuta) { | |
| return verificaDisponibilidadeHorarioFisioterapeuta(fisioterapeuta, data, data, data, data, null); | |
| } | |
| private void buscaDatas(Integer qtde, Integer qtdeInicial, | |
| DateTime inicio, Fisioterapeuta fisioterapeuta, List<Turnos> turnos, List<DiaDaSemana> diasDaSemana) { | |
| List<Date> datas = DataSessaoUtil.getDias(qtde, inicio).getDatas(); | |
| if (fisioterapeuta != null) { | |
| if (percorreDatas(fisioterapeuta, datas, diasDaSemana).size() == qtdeInicial) { | |
| datasValidas = percorreDatas(fisioterapeuta, datas, diasDaSemana); | |
| datasValidas = percorreTurnos(datasValidas, fisioterapeuta, turnos); | |
| SessaoDisponivel sessaoDisponivel = new SessaoDisponivel(); | |
| sessaoDisponivel.setDatas(datasValidas); | |
| sessaoDisponivel.setFisioterapeuta(fisioterapeuta); | |
| sessoesDisponiveis.add(sessaoDisponivel); | |
| } else { | |
| buscaDatas((qtde + 1), qtdeInicial, inicio, fisioterapeuta, turnos, diasDaSemana); | |
| } | |
| } else { | |
| List<Fisioterapeuta> fisioterapeutas = fisioterapeutaService.listarFisioterapeutasComCargaHoraria(); | |
| for (Fisioterapeuta fisioterapeutaEncontrado : fisioterapeutas) { | |
| if (percorreDatas(fisioterapeutaEncontrado, datas, diasDaSemana).size() == qtdeInicial) { | |
| datasValidas = percorreDatas(fisioterapeutaEncontrado, datas, diasDaSemana); | |
| datasValidas = percorreTurnos(datasValidas, fisioterapeutaEncontrado, turnos); | |
| SessaoDisponivel sessaoDisponivel = new SessaoDisponivel(); | |
| sessaoDisponivel.setDatas(datasValidas); | |
| sessaoDisponivel.setFisioterapeuta(fisioterapeutaEncontrado); | |
| sessoesDisponiveis.add(sessaoDisponivel); | |
| } else { | |
| buscaDatas((qtde + 1), qtdeInicial, inicio, fisioterapeutaEncontrado, turnos, diasDaSemana); | |
| } | |
| } | |
| } | |
| } | |
| private List<Date> percorreTurnos(List<Date> datasValidas, | |
| Fisioterapeuta fisioterapeuta, List<Turnos> turnos) { | |
| for (Date data : datasValidas) { | |
| for (Turnos turno : turnos) { | |
| List<CargaHoraria> listarCargaHorariaDoFisioterapeuta = cargaHorariaService.listarCargaHorariaDoFisioterapeuta(fisioterapeuta); | |
| for(CargaHoraria c : listarCargaHorariaDoFisioterapeuta){ | |
| if(c.getTurno().getId().intValue() == turno.getId().intValue()){ | |
| percorreTurno(data, turno, fisioterapeuta, c, null); | |
| } | |
| } | |
| } | |
| } | |
| return this.horarios; | |
| } | |
| private List<Date> percorreDatas(Fisioterapeuta fisioterapeuta, | |
| List<Date> datas, List<DiaDaSemana> diasDaSemana) { | |
| List<Date> datasValidas = new ArrayList<Date>(); | |
| for (Date data : datas) { | |
| if (verificaDisponibilidadeCargaHorariaDisponivelComFisioterapeuta(fisioterapeuta.getId(), data) && diaDaSemanaValido(data, diasDaSemana)) { | |
| datasValidas.add(data); | |
| } | |
| } | |
| return datasValidas; | |
| } | |
| @SuppressWarnings("deprecation") | |
| private boolean diaDaSemanaValido(Date data, List<DiaDaSemana> diasDaSemana) { | |
| if (diasDaSemana != null) { | |
| for (DiaDaSemana diaDaSemana : diasDaSemana) { | |
| if (diaDaSemana.getSemana().getId() == data.getDay() + 1) { | |
| return true; | |
| } | |
| } | |
| } else { | |
| return true; | |
| } | |
| return false; | |
| } | |
| @SuppressWarnings({ "deprecation" }) | |
| public void percorreTurno(Date data, Turnos turno, Fisioterapeuta fisioterapeuta, CargaHoraria cargaHoraria, DateTime sessaoInicio) { | |
| DateTime horaInicial = new DateTime(); | |
| DateTime horaFinal = new DateTime(); | |
| DateTime sessaoFim = null; | |
| horaInicial = horaInicial.withDayOfMonth(data.getDate()).withMonthOfYear(data.getMonth()) | |
| .withHourOfDay(turno.getHoraInicial().getHours()).withMinuteOfHour(turno.getHoraInicial().getMinutes()).withSecondOfMinute(0).withMillisOfSecond(0); | |
| horaFinal = horaFinal.withDayOfMonth(data.getDate()).withMonthOfYear(data.getMonth()) | |
| .withHourOfDay(turno.getHoraFinal().getHours()).withMinuteOfHour(turno.getHoraFinal().getMinutes()).withSecondOfMinute(0).withMillisOfSecond(0); | |
| if (sessaoInicio == null) { | |
| sessaoInicio = horaInicial; | |
| } else { | |
| sessaoInicio = sessaoInicio.plusMinutes(cargaHoraria.getTempoSessao().intValue()); | |
| } | |
| sessaoFim = sessaoInicio.plusMinutes(cargaHoraria.getTempoSessao().intValue()); | |
| Date dataValida = null; | |
| boolean valido = false; | |
| boolean isCargaHorariaDisponivel = verificaDisponibilidadeCargaHorariaDisponivelDoFisioterapeuta(fisioterapeuta.getId(), data, sessaoInicio.toDate(), sessaoFim.toDate()); | |
| if (verificaDisponibilidadeHorarioFisioterapeuta(fisioterapeuta, data, data, sessaoInicio.toDate(), sessaoFim.toDate(), null) && isCargaHorariaDisponivel) { | |
| dataValida = new Date(); | |
| dataValida.setDate(data.getDate()); | |
| dataValida.setMonth(data.getMonth()); | |
| dataValida.setYear(data.getYear()); | |
| dataValida.setSeconds(data.getSeconds()); | |
| dataValida.setHours(sessaoInicio.getHourOfDay()); | |
| dataValida.setMinutes(sessaoInicio.getMinuteOfHour()); | |
| valido = true; | |
| } | |
| if (!sessaoFim.isAfter(horaFinal)) { | |
| if (valido) { | |
| horarios.add(dataValida); | |
| } | |
| percorreTurno(data, turno, fisioterapeuta, cargaHoraria, sessaoInicio); | |
| } | |
| } | |
| private String separaCodigosPorVirgula(List<Integer> diasSemana) { | |
| String diasDaSemanaCodigos = null; | |
| for (int i = 0; i < diasSemana.size(); i++) { | |
| Integer diaDaSemana = diasSemana.get(i); | |
| if (diasDaSemanaCodigos != null) { | |
| diasDaSemanaCodigos = diasDaSemanaCodigos + "," + diaDaSemana; | |
| } else { | |
| diasDaSemanaCodigos = diaDaSemana.toString(); | |
| } | |
| } | |
| return diasDaSemanaCodigos; | |
| } | |
| public String dataToMysql(Date data) { | |
| SimpleDateFormat formatador = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); | |
| return formatador.format(data); | |
| } | |
| private Session getSession() { | |
| return ((Session) entityManager.getDelegate()); | |
| } | |
| private Criteria createCriteria(Class<?> clazz) { | |
| return getSession().createCriteria(clazz); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment