Skip to content

Instantly share code, notes, and snippets.

@handersonbf
Created September 6, 2011 20:35
Show Gist options
  • Select an option

  • Save handersonbf/1198870 to your computer and use it in GitHub Desktop.

Select an option

Save handersonbf/1198870 to your computer and use it in GitHub Desktop.
sessao.java
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