Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.betha.saude.model.agenda;
- import com.betha.bfc.enterprise.querydsl.Sort;
- import com.betha.bfc.security.UserAccessHolder;
- import com.betha.bfc.util.CollectionsBuilder;
- import com.betha.saude.enterprise.AbstractService;
- import com.betha.saude.enterprise.BasicRepository;
- import com.betha.saude.enterprise.grupo.GrupoDto;
- import com.betha.saude.enterprise.grupo.GrupoService;
- import com.betha.saude.model.agendamento.AgendamentoService;
- import com.betha.saude.message.AgendaDisponivel;
- import com.betha.saude.model.agenda.ausencia.Ausencia;
- import com.betha.saude.model.agenda.ausencia.AusenciaService;
- import com.betha.saude.model.agendamento.Agendamento;
- import com.betha.saude.model.agendamento.QAgendamento;
- import com.betha.saude.model.classificacao.Classificacao;
- import com.betha.saude.model.classificacao.ClassificacaoService;
- import com.betha.saude.model.commons.enums.TipoClassificacao;
- import com.betha.saude.model.feriado.*;
- import com.betha.saude.model.programacaoorcamentaria.convenio.cota.ConvenioCotaUnidadeConsumidoraService;
- import com.betha.saude.util.SaudeUtil;
- import com.mysema.query.BooleanBuilder;
- import javax.ejb.TransactionAttribute;
- import javax.inject.Inject;
- import javax.validation.ValidationException;
- import java.time.LocalDate;
- import java.time.LocalTime;
- import java.time.format.DateTimeFormatter;
- import java.time.temporal.ChronoUnit;
- import java.time.temporal.WeekFields;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Locale;
- import static com.betha.saude.model.agenda.Agenda.QNT_SEMANAS_CALCULO;
- import static javax.ejb.TransactionAttributeType.REQUIRED;
- public class AgendaService extends AbstractService {
- @Inject
- private BasicRepository basicRepository;
- @Inject
- private AgendamentoService agendamentoService;
- @Inject
- private ClassificacaoService classificacaoService;
- @Inject
- private FeriadoService feriadoService;
- @Inject
- private AusenciaService ausenciaService;
- @Inject
- private ConvenioCotaUnidadeConsumidoraService convenioCotaUnidadeConsumidoraService;
- @Inject
- private GrupoService grupoService;
- @Inject
- private UserAccessHolder userAccessHolder;
- @TransactionAttribute(REQUIRED)
- public Agenda save(Agenda agenda) {
- if(agenda.getId() != null){
- if (agenda.getPeriodoFinal() != null) {
- String periodoFinal = agenda.getPeriodoFinal().toString();
- agendamentoService.cancelAgendamentosDeAgendaDisponiveisParaCancelamento(agenda.getId(), periodoFinal, agenda.getQuantidadeVagaEletivo());
- /// Olhar aqui ->
- teste(agenda);
- }
- return basicRepository.merge(agenda);
- }
- return basicRepository.persist(agenda);
- }
- private void teste(Agenda agenda) {
- /// Olhar aqui ->
- for (AgendaHorario a: agenda.getAgendaHorario()) {
- getHorariosByAgendaHorario(a, agenda.getQuantidadeVagaEletivo() + agenda.getQuantidadeVagaUrgencia());
- }
- }
- @TransactionAttribute(REQUIRED)
- public Agenda cancel(Agenda agenda) {
- if(agenda != null) {
- save(agenda);
- agendamentoService.cancelAgendamentosDeAgendaDisponiveisParaCancelamento(agenda.getId(), null, agenda.getQuantidadeVagaEletivo());
- }
- return agenda;
- }
- @TransactionAttribute(REQUIRED)
- public Agenda delete(Long profissionalAgendaId) {
- Agenda agenda = basicRepository.find(Agenda.class, profissionalAgendaId);
- if(agenda != null){
- return save(Agenda.Builder.from(agenda).excluido(true).skipValidate().build());
- }
- throw new ValidationException(String.format("Nenhuma agenda de profissional encontrada para o identificador %s.", profissionalAgendaId));
- }
- public BooleanBuilder filterAgendaByUserAccess(BooleanBuilder filter, String accessId){
- List<GrupoDto> gruposAccess = grupoService.getGruposByAccessId(accessId);
- List<String> grupoIds = CollectionsBuilder.createDefaultArrayList();
- for (GrupoDto grupoDto:gruposAccess) {
- grupoIds.add(grupoDto.getId());
- }
- QAgenda qAgenda = QAgenda.agenda;
- Classificacao classificacaoAgendaEspecialidade = classificacaoService.getClassificacaoByAtributo1(TipoClassificacao.TIPO_AGENDA, Agenda.TIPO_AGENDA_ESPECIALIDADE);
- filter.and(qAgenda.classificacaoTipoAgenda().id.eq(classificacaoAgendaEspecialidade.getId()));
- filter.and(qAgenda.excluido.isFalse());
- filter.and(qAgenda.cancelado.isFalse());
- filter.and(qAgenda.bloquearUso.isFalse());
- filter.and((qAgenda.periodoInicial.loe(LocalDate.now()).and(qAgenda.periodoFinal.goe(LocalDate.now()))).or(qAgenda.periodoFinal.isNull()));
- if(grupoIds.size() > 0){
- filter.and(qAgenda.agendaConfiguracao().limitarAgendamentoUsuarioEspecifico.eq(Boolean.TRUE)
- .and(qAgenda.agendaConfiguracao().agendaConfiguracaoUsuario.any().usuarioId.eq(userAccessHolder.get().getUserId()).or(qAgenda.agendaConfiguracao().agendaConfiguracaoUsuario.any().grupoId.in(grupoIds)))
- .or(qAgenda.agendaConfiguracao().limitarAgendamentoUsuarioEspecifico.eq(Boolean.FALSE)));
- } else {
- filter.and(qAgenda.agendaConfiguracao().limitarAgendamentoUsuarioEspecifico.eq(Boolean.TRUE)
- .and(qAgenda.agendaConfiguracao().agendaConfiguracaoUsuario.any().usuarioId.eq(userAccessHolder.get().getUserId()))
- .or(qAgenda.agendaConfiguracao().limitarAgendamentoUsuarioEspecifico.eq(Boolean.FALSE)));
- }
- return filter;
- }
- void validateAgendaConcomitant(Agenda agenda){
- List<List<AgendaHorario>> agendaHorarioWeeks = getAgendaHorarioWeeks(agenda);
- getAgendasConcomitantByAgenda(agenda).forEach(agendaConcomitant -> validateAgendaWeek(agendaHorarioWeeks, agendaConcomitant));
- }
- public AgendaDisponivel getProximaAgendaDisponivel(String tipoAgenda, Long idEspecialidade, Long idConvenio, Long idUnidadePrestadora, Long idProfissional, LocalDate periodoInicial){
- periodoInicial = periodoInicial != null ? periodoInicial : LocalDate.now();
- List<Agenda> agendas = getAgendasByParams(tipoAgenda, idEspecialidade, idConvenio, idUnidadePrestadora, idProfissional, periodoInicial);
- AgendaDisponivel agendaDisponivel = new AgendaDisponivel();
- for (Agenda agenda:agendas) {
- LocalDate nextDate = periodoInicial;
- List<Agendamento> agendamentos = agendamentoService.findAllAgendamentoByAgenda(agenda, nextDate);
- List<Feriado> feriados = feriadoService.findAllFeriadosByDataUnidade(nextDate, agenda.getUnidadePrestadora().getId());
- List<Ausencia> ausencias = ausenciaService.findAllAusencia(nextDate, agenda.getUnidadePrestadora().getId(), agenda.getProfissional().getId());
- while (hasBeforeDate(nextDate, agendaDisponivel) &&
- (agenda.getPeriodoFinal() == null || agenda.getPeriodoFinal().isAfter(nextDate) || agenda.getPeriodoFinal().equals(nextDate))){
- if(!feriadoService.existsFeriadoByDate(feriados,nextDate)){
- AgendaHorario agendaHorario = getHorarioWork(agenda, nextDate);
- if(agendaHorario != null){
- setProximoHorarioAgenda(agendaDisponivel, nextDate, agendaHorario, agenda, agendamentos, feriados, ausencias);
- }
- }
- nextDate = nextDate.plusDays(1);
- }
- }
- return agendaDisponivel;
- }
- private boolean hasBeforeDate(LocalDate nextDate, AgendaDisponivel proximoHorarioAgenda){
- return proximoHorarioAgenda == null ||
- proximoHorarioAgenda.getDataAgendamentoEletivo() == null || nextDate.isBefore(proximoHorarioAgenda.getDataAgendamentoEletivo()) ||
- proximoHorarioAgenda.getDataAgendamentoUrgencia() == null || nextDate.isBefore(proximoHorarioAgenda.getDataAgendamentoUrgencia());
- }
- private void setProximoHorarioAgenda(AgendaDisponivel proximasVagaAgenda, LocalDate nextDate, AgendaHorario agendaHorario, Agenda agenda, List<Agendamento> agendamentos, List<Feriado> feriados, List<Ausencia> ausencias){
- long totalVagasAgenda = agenda.getQuantidadeVagaEletivo() + agenda.getQuantidadeVagaUrgencia();
- List<LocalTime> horariosAgenda = getHorariosByAgendaHorario(agendaHorario, totalVagasAgenda);
- List<LocalTime> horariosDisponiveis = getHorariosDisponiveis(horariosAgenda, nextDate, agendamentos, feriados, ausencias);
- LocalTime proximoHorarioDisponivel = (!horariosDisponiveis.isEmpty()) ? horariosDisponiveis.get(0) : null;
- if(proximoHorarioDisponivel != null){
- if((horariosDisponiveis.size() > agenda.getQuantidadeVagaUrgencia() &&
- (proximasVagaAgenda.getDataAgendamentoEletivo() == null || nextDate.isBefore(proximasVagaAgenda.getDataAgendamentoEletivo())) ||
- (nextDate.equals(proximasVagaAgenda.getDataAgendamentoEletivo()) &&
- (proximasVagaAgenda.getHorariosEletivosDisponiveis().isEmpty() || proximoHorarioDisponivel.isBefore(proximasVagaAgenda.getHorariosEletivosDisponiveis().get(0)))))) {
- proximasVagaAgenda.setIdAgenda(agenda.getId());
- proximasVagaAgenda.setQuantidadeVagasEletivo(horariosDisponiveis.size() - agenda.getQuantidadeVagaUrgencia());
- proximasVagaAgenda.setDataAgendamentoEletivo(nextDate);
- proximasVagaAgenda.setHorarios(horariosAgenda);
- proximasVagaAgenda.setHorariosEletivosDisponiveis(horariosDisponiveis);
- }
- if((horariosDisponiveis.size() <= totalVagasAgenda &&
- (proximasVagaAgenda.getDataAgendamentoUrgencia() == null || nextDate.isBefore(proximasVagaAgenda.getDataAgendamentoUrgencia())))){
- proximasVagaAgenda.setQuantidadeVagasUrgencia(totalVagasAgenda - ( horariosDisponiveis.size() + (agenda.getQuantidadeVagaEletivo() - horariosDisponiveis.size())));
- proximasVagaAgenda.setDataAgendamentoUrgencia(nextDate);
- }
- }
- }
- private List <LocalTime> getHorariosDisponiveis(List<LocalTime> horariosAgenda, LocalDate dataAgendamento, List<Agendamento> agendamentos, List<Feriado> feriados, List<Ausencia> ausencias){
- List <LocalTime> horariosDisponiveis = CollectionsBuilder.createDefaultArrayList();
- for (LocalTime horario: horariosAgenda) {
- if(!agendamentoService.existAgendamentoByAgendaHorario(dataAgendamento, horario, agendamentos) &&
- !ausenciaService.existAusenciaByAgendaHorario(dataAgendamento, horario, ausencias) &&
- !feriadoService.existsPontoFacultativoByAgenda(dataAgendamento, horario, feriados)){
- horariosDisponiveis.add(horario);
- }
- }
- return horariosDisponiveis;
- }
- private List<LocalTime> getHorariosByAgendaHorario(AgendaHorario agendaHorario, long totalVagas){
- List<LocalTime> horarios = CollectionsBuilder.createDefaultArrayList();
- double totalMinutosSegundoPeriodo = 0;
- double totalMinutosPrimeiroPeriodo = 0;
- if(agendaHorario.getPrimeiroPeriodoHoraInicio() != null && agendaHorario.getPrimeiroPeriodoHoraFim() != null){
- totalMinutosPrimeiroPeriodo = ChronoUnit.MINUTES.between(agendaHorario.getPrimeiroPeriodoHoraInicio(),agendaHorario.getPrimeiroPeriodoHoraFim());
- }
- if(agendaHorario.getSegundoPeriodoHoraInicio() != null && agendaHorario.getSegundoPeriodoHoraFim() != null){
- totalMinutosSegundoPeriodo = ChronoUnit.MINUTES.between(agendaHorario.getSegundoPeriodoHoraInicio(),agendaHorario.getSegundoPeriodoHoraFim());
- }
- long intervaloMinutos = Math.round((totalMinutosPrimeiroPeriodo + totalMinutosSegundoPeriodo) / totalVagas);
- createHorariosAgendaByIntevalo(agendaHorario.getPrimeiroPeriodoHoraInicio(), agendaHorario.getPrimeiroPeriodoHoraFim(), intervaloMinutos, horarios);
- createHorariosAgendaByIntevalo(agendaHorario.getSegundoPeriodoHoraInicio(), agendaHorario.getSegundoPeriodoHoraFim(), intervaloMinutos, horarios);
- return horarios;
- }
- private void createHorariosAgendaByIntevalo(LocalTime horaInicio, LocalTime horaFim, long intervaloMinutos, List<LocalTime> horarios){
- if(horaInicio != null && horaFim!= null){
- LocalTime proximoHorarioPrimeiroPeriodo = horaInicio;
- while (ChronoUnit.MINUTES.between(proximoHorarioPrimeiroPeriodo, horaFim) >= intervaloMinutos) {
- horarios.add(proximoHorarioPrimeiroPeriodo);
- proximoHorarioPrimeiroPeriodo = proximoHorarioPrimeiroPeriodo.plusMinutes(intervaloMinutos);
- }
- }
- }
- private AgendaHorario getHorarioWork(Agenda agenda, LocalDate day){
- long weekAgenda = getWeekFromAgendaPeriodoInicial(agenda, null);
- long weekFromAgendaDate = getWeekFromAgendaPeriodoInicial(agenda, day);
- long weekYear = weekFromAgendaDate - weekAgenda;
- for (AgendaHorario agendaHorario : agenda.getAgendaHorario()) {
- String agendaHorarioWeek = agendaHorario.getClassificacaoDiaSemana().getAtributo1();
- if(day.getDayOfWeek().name().equals(agendaHorarioWeek) && !isAgendaHorarioAtivaByWeek(agendaHorario, weekYear, day)){
- return agendaHorario;
- }
- }
- return null;
- }
- private List<Agenda> getAgendasByParams(String tipoAgenda, Long idEspecialidade, Long idConvenio, Long idUnidadePrestadora, Long idProfissional, LocalDate apartirDe){
- Classificacao classificacaoTipoAgenda = classificacaoService.getClassificacaoByAtributo1(TipoClassificacao.TIPO_AGENDA, tipoAgenda);
- QAgenda qAgenda = QAgenda.agenda;
- BooleanBuilder filter = new BooleanBuilder();
- filter.and(qAgenda.excluido.isFalse());
- filter.and(qAgenda.cancelado.isFalse());
- filter.and(qAgenda.classificacaoTipoAgenda().eq(classificacaoTipoAgenda));
- filter.and((qAgenda.periodoInicial.loe(apartirDe).and(qAgenda.periodoFinal.goe(apartirDe))).or(qAgenda.periodoFinal.isNull()));
- filter.and((qAgenda.agendaHorario.any().primeiroPeriodoHoraInicio.isNotNull()
- .or(qAgenda.agendaHorario.any().segundoPeriodoHoraInicio.isNotNull()))
- .and(qAgenda.agendaHorario.any().inativo.ne(Boolean.TRUE)));
- if(idConvenio != null){
- filter.and(qAgenda.convenio.id.eq(idConvenio));
- }
- if(idUnidadePrestadora != null){
- filter.and(qAgenda.unidadePrestadora.id.eq(idUnidadePrestadora));
- }
- if(idEspecialidade != null){
- filter.and(QAgenda.agenda.especialidade().id.eq(idEspecialidade));
- }
- if(idProfissional != null){
- filter.and(QAgenda.agenda.profissional().id.eq(idProfissional));
- }
- return basicRepository.findAll(Agenda.class, Sort.of(qAgenda.periodoInicial.asc()), filter);
- }
- private List<Agenda> getAgendasConcomitantByAgenda(Agenda agenda){
- QAgenda qAgenda = QAgenda.agenda;
- BooleanBuilder filter = new BooleanBuilder();
- filter.and(qAgenda.excluido.isFalse());
- filter.and(qAgenda.cancelado.isFalse());
- filter.and(qAgenda.periodoFinal.goe(LocalDate.now()).or(qAgenda.periodoFinal.isNull()));
- if(agenda.getPeriodoFinal() != null){
- filter.and(qAgenda.periodoInicial.between(agenda.getPeriodoInicial(), agenda.getPeriodoFinal())
- .or(qAgenda.periodoInicial.loe(agenda.getPeriodoInicial()).and(qAgenda.periodoFinal.goe(agenda.getPeriodoFinal())))
- .or((qAgenda.periodoFinal.between(agenda.getPeriodoInicial(), agenda.getPeriodoFinal())).or(qAgenda.periodoFinal.isNull())));
- } else {
- filter.and(qAgenda.periodoInicial.between(agenda.getPeriodoInicial(), agenda.getPeriodoFinal())
- .or((qAgenda.periodoFinal.between(agenda.getPeriodoInicial(), agenda.getPeriodoFinal())).or(qAgenda.periodoFinal.isNull())));
- }
- if(Agenda.TIPO_AGENDA_ESPECIALIDADE.equals(agenda.getClassificacaoTipoAgenda().getAtributo1())){
- filter.and(qAgenda.profissional().id.eq(agenda.getProfissional().getId()));
- } else if(Agenda.TIPO_AGENDA_PROCEDIMENTO.equals(agenda.getClassificacaoTipoAgenda().getAtributo1())){
- filter.and(qAgenda.convenio().id.eq(agenda.getConvenio().getId()));
- filter.and(qAgenda.unidadePrestadora().id.eq(agenda.getUnidadePrestadora().getId()));
- if(agenda.getAgendaEspecifica()){
- filter.and(qAgenda.procedimento().id.eq(agenda.getProcedimento().getId()));
- }
- }
- if(agenda.getId() != null){
- filter.and(qAgenda.id.ne(agenda.getId()));
- }
- return basicRepository.findAll(Agenda.class, Sort.of(qAgenda.periodoInicial.asc()), filter);
- }
- private void validateAgendaWeek(List<List<AgendaHorario>> agendaHorarioWeeks, Agenda agendaConcomitant){
- List<List<AgendaHorario>> agendaHorarioWeekConcomitant = getAgendaHorarioWeeks(agendaConcomitant);
- for (int i = 0; i < agendaHorarioWeekConcomitant.size(); i++) {
- if(agendaHorarioWeeks.size() > i){
- validateAgendaHorario(agendaHorarioWeeks.get(i), agendaHorarioWeekConcomitant.get((i)));
- }
- }
- }
- public List<List<AgendaHorario>> getAgendaHorarioWeeks(Agenda agenda){
- List<List<AgendaHorario>> agendaHorarioWeeks = createListWeeksYearEmpty();
- LocalDate fistDayOfWeek = agenda.getPeriodoInicial().with(WeekFields.of(Locale.getDefault()).dayOfWeek(), 1);;
- long weekAgenda = getWeekFromAgendaPeriodoInicial(agenda, null);
- long weekAgendaEnd = getWeekFromAgendaPeriodoFinal(agenda);
- long weekAgendaBegin = weekAgenda;
- while(weekAgendaBegin <= weekAgendaEnd){
- int weekMod = (int) (weekAgendaBegin % 12);
- long weekYear = weekAgendaBegin - weekAgenda;
- List<AgendaHorario> agendaHorarios = CollectionsBuilder.createDefaultArrayList();
- for (AgendaHorario agendaHorario:agenda.getAgendaHorario()) {
- agendaHorarios.add(createAgendaHorarioFromValidate(agendaHorario, weekYear, fistDayOfWeek));
- if(fistDayOfWeek.getDayOfWeek().name().equals(agendaHorario.getClassificacaoDiaSemana().getAtributo1())){
- fistDayOfWeek = fistDayOfWeek.plusDays(1);
- }
- }
- agendaHorarioWeeks.set(weekMod, agendaHorarios);
- weekAgendaBegin++;
- }
- return agendaHorarioWeeks;
- }
- private long getWeekFromAgendaPeriodoInicial(Agenda agenda, LocalDate periodoInicial){
- return SaudeUtil.dateFullWeeks(agenda.getPeriodoInicial(), periodoInicial);
- }
- private long getWeekFromAgendaPeriodoFinal(Agenda agenda){
- if(agenda.getPeriodoFinal() != null && agenda.getPeriodoInicial().plusWeeks(QNT_SEMANAS_CALCULO).isAfter(agenda.getPeriodoFinal())){
- return SaudeUtil.dateFullWeeks(agenda.getPeriodoInicial(), agenda.getPeriodoFinal());
- }
- return getWeekFromAgendaPeriodoInicial(agenda, null) + QNT_SEMANAS_CALCULO;
- }
- private void validateAgendaHorario(List<AgendaHorario> agendaHorarioWeek, List<AgendaHorario> agendaHorarioWeekConcomitant){
- for (int i = 0; i < agendaHorarioWeekConcomitant.size(); i++) {
- if(!agendaHorarioWeek.isEmpty()){
- AgendaHorario agendaHorario = agendaHorarioWeek.get(i);
- AgendaHorario agendaHorarioConcomitant = agendaHorarioWeekConcomitant.get(i);
- if(!agendaHorario.getInativo() && !agendaHorarioConcomitant.getInativo()){
- validadeAgendaHorarioPrimeiroPeriodo(agendaHorario, agendaHorarioConcomitant);
- }
- }
- }
- }
- private List<List<AgendaHorario>> createListWeeksYearEmpty(){
- List<List<AgendaHorario>> agendaHorarioWeeks = new ArrayList<>();
- for (int i = 0; i < 12; i++) {
- agendaHorarioWeeks.add(CollectionsBuilder.createDefaultArrayList());
- }
- return agendaHorarioWeeks;
- }
- private AgendaHorario createAgendaHorarioFromValidate(AgendaHorario agendaHorario, long weekYear, LocalDate dayOfMonth){
- return AgendaHorario.Builder.create()
- .agenda(agendaHorario.getAgenda())
- .primeiroPeriodoHoraInicio(agendaHorario.getPrimeiroPeriodoHoraInicio())
- .primeiroPeriodoHoraFim(agendaHorario.getPrimeiroPeriodoHoraFim())
- .segundoPeriodoHoraInicio(agendaHorario.getSegundoPeriodoHoraInicio())
- .segundoPeriodoHoraFim(agendaHorario.getSegundoPeriodoHoraFim())
- .classificacaoDiaSemana(agendaHorario.getClassificacaoDiaSemana())
- .inativo(isAgendaHorarioAtivaByWeek(agendaHorario, weekYear, dayOfMonth))
- .build();
- }
- private Boolean isAgendaHorarioAtivaByWeek(AgendaHorario agendaHorario, long weekYear, LocalDate dayOfMonth){
- if(dayOfMonth.isBefore(agendaHorario.getAgenda().getPeriodoInicial()) || (agendaHorario.getAgenda().getPeriodoFinal() != null && dayOfMonth.isAfter(agendaHorario.getAgenda().getPeriodoFinal()))){
- return true;
- }
- if(Agenda.FREQUENCIA_2_SEMANA.equals(agendaHorario.getAgenda().getClassificacaoFrequencia().getAtributo1()) && !agendaHorario.getInativo()){
- return weekYear % 2 != 0;
- }
- if(Agenda.FREQUENCIA_3_SEMANA.equals(agendaHorario.getAgenda().getClassificacaoFrequencia().getAtributo1()) && !agendaHorario.getInativo()){
- return weekYear % 3 != 0;
- }
- if(Agenda.FREQUENCIA_4_SEMANA.equals(agendaHorario.getAgenda().getClassificacaoFrequencia().getAtributo1()) && !agendaHorario.getInativo()){
- return weekYear % 4 != 0;
- }
- return agendaHorario.getInativo();
- }
- private void validadeAgendaHorarioPrimeiroPeriodo(AgendaHorario agendaHorario, AgendaHorario agendaHorarioConcomitant){
- LocalTime primeiroPeriodoHoraInicio = agendaHorario.getPrimeiroPeriodoHoraInicio();
- LocalTime primeiroPeriodoHorafim = agendaHorario.getPrimeiroPeriodoHoraFim();
- LocalTime segundoPeriodoHoraInicio = agendaHorario.getSegundoPeriodoHoraInicio();
- LocalTime segundoPeriodoHoraFim = agendaHorario.getSegundoPeriodoHoraFim();
- LocalTime concomitantPrimeiroPeriodoHoraInicio = agendaHorarioConcomitant.getPrimeiroPeriodoHoraInicio();
- LocalTime concomitantPrimeiroPeriodoHorafim = agendaHorarioConcomitant.getPrimeiroPeriodoHoraFim();
- LocalTime concomitantSegundoPeriodoHoraInicio = agendaHorarioConcomitant.getSegundoPeriodoHoraInicio();
- LocalTime concomitantSegundoPeriodoHoraFim = agendaHorarioConcomitant.getSegundoPeriodoHoraFim();
- if(concomitantPrimeiroPeriodoHoraInicio.equals(primeiroPeriodoHoraInicio) || concomitantPrimeiroPeriodoHoraInicio.equals(segundoPeriodoHoraInicio)){
- ConcomitantValidationException(agendaHorarioConcomitant, primeiroPeriodoHoraInicio, primeiroPeriodoHorafim);
- }
- if(SaudeUtil.isBetween(concomitantPrimeiroPeriodoHoraInicio, primeiroPeriodoHoraInicio, primeiroPeriodoHorafim)){
- ConcomitantValidationException(agendaHorarioConcomitant, primeiroPeriodoHoraInicio, primeiroPeriodoHorafim);
- }
- if(SaudeUtil.isBetween(concomitantPrimeiroPeriodoHoraInicio, segundoPeriodoHoraInicio, segundoPeriodoHoraFim)){
- ConcomitantValidationException(agendaHorarioConcomitant, segundoPeriodoHoraInicio, segundoPeriodoHoraFim);
- }
- if(SaudeUtil.isBetween(primeiroPeriodoHoraInicio, concomitantPrimeiroPeriodoHoraInicio, concomitantPrimeiroPeriodoHorafim)){
- ConcomitantValidationException(agendaHorarioConcomitant,primeiroPeriodoHoraInicio, primeiroPeriodoHorafim);
- }
- if(SaudeUtil.isBetween(primeiroPeriodoHoraInicio, concomitantSegundoPeriodoHoraInicio, concomitantSegundoPeriodoHoraFim)){
- ConcomitantValidationException(agendaHorarioConcomitant, segundoPeriodoHoraInicio, segundoPeriodoHoraFim);
- }
- }
- private void ConcomitantValidationException(AgendaHorario agendaHorarioConcomitant, LocalTime periodoHoraInicio, LocalTime periodoHoraFim){
- if(agendaHorarioConcomitant.getAgenda().getPeriodoFinal() != null){
- String message = "%s horário de %s às %s está conflitando com outra agenda do profissional no período %s até %s";
- if(Agenda.TIPO_AGENDA_PROCEDIMENTO.equals(agendaHorarioConcomitant.getAgenda().getClassificacaoTipoAgenda().getAtributo1())){
- message = "%s horário de %s às %s está conflitando com outra agenda no período %s até %s";
- }
- throw new ValidationException(String.format(message, agendaHorarioConcomitant.getClassificacaoDiaSemana().getNome(), periodoHoraInicio, periodoHoraFim,
- agendaHorarioConcomitant.getAgenda().getPeriodoInicial().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")),
- agendaHorarioConcomitant.getAgenda().getPeriodoFinal().format(DateTimeFormatter.ofPattern("dd/MM/yyyy"))));
- }
- throw new ValidationException(String.format("%s horário de %s às %s está conflitando com outra agenda do profissional iniciada em %s", agendaHorarioConcomitant.getClassificacaoDiaSemana().getNome(), periodoHoraInicio, periodoHoraFim,
- agendaHorarioConcomitant.getAgenda().getPeriodoInicial().format(DateTimeFormatter.ofPattern("dd/MM/yyyy"))));
- }
- @TransactionAttribute(REQUIRED)
- public Boolean verificaSeAgendamentoTemAgenda(Long agendaId) {
- if (agendaId != null) {
- QAgendamento q = QAgendamento.agendamento;
- BooleanBuilder where = new BooleanBuilder(q.agenda().id.eq(agendaId));
- where.and(q.classificacaoSituacao().atributo1.ne("CANCELADO").or(q.classificacaoSituacao().atributo1.ne("FINALIZADO")));
- return this.basicRepository.exists(Agendamento.class, where);
- } else {
- return false;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement