Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

Haga lo que aprendimos en aula en el aula:

@Component
public class ValidadorPacienteSinOtraConsulta implements ValidadorDeConsultas {

@Autowired
private ConsultaRepository repository;

public void validar(DatosConsulta datos) {
    var primerHorario = datos.fecha().withHour(7);
    var ultimoHorario = datos.fecha().withHour(18);

    var pacienteTieneOtraConsultaEnElDia = repository
            .existsByPacienteIdAndMotivoCancelamientoIsNullAndFechaBetween(
                    datos.idPaciente(),






                    primerHorario,
                    ultimoHorario
            );

    if (pacienteTieneOtraConsultaEnElDia) {
        throw new ValidacionException(
                "Paciente ya tiene una consulta reservada para ese dia"
        );
    }
}

}

package med.voll.api.domain.consulta;

import org.springframework.data.jpa.repository.JpaRepository;

import java.time.LocalDateTime;

public interface ConsultaRepository extends JpaRepository<Consulta, Long> {

boolean existsByPacienteIdAndMotivoCancelamientoIsNullAndFechaBetween(
        Long idPaciente,
        LocalDateTime primerHorario,
        LocalDateTime ultimoHorario
);

boolean existsByMedicoIdAndFechaAndMotivoCancelamientoIsNull(
        Long idMedico,
        LocalDateTime fecha
);

}

1 respuesta

Hola Alexis, espero que estés bien

Parece que estás trabajando en la implementación de una funcionalidad de cancelación de consultas en tu aplicación. Basándome en el contexto de lo que se hizo en clase, aquí te dejo una sugerencia de cómo podrías implementar esta funcionalidad, teniendo en cuenta las reglas de negocio que mencionaste:

  1. Validación del Motivo de Cancelación:
    Asegúrate de que el motivo de cancelación esté presente y sea uno de los valores permitidos. Puedes hacer esto usando una enumeración (enum) para definir los motivos válidos y luego validar que el motivo proporcionado esté dentro de esta lista.

  2. Validación de Tiempo de Cancelación:
    Antes de permitir la cancelación, verifica que la consulta esté siendo cancelada con al menos 24 horas de antelación. Puedes obtener la fecha y hora actual y compararla con la fecha y hora de la consulta.

Aquí tienes un ejemplo de cómo podrías estructurar el código para estas validaciones:

public class ValidadorCancelacionConsulta {

    @Autowired
    private ConsultaRepository repository;

    public void validarCancelacion(Long consultaId, String motivoCancelacion) {
        // Validar que el motivo de cancelación es válido
        if (!MotivoCancelacion.isValid(motivoCancelacion)) {
            throw new ValidacionException("Motivo de cancelación no válido");
        }

        // Obtener la consulta y verificar el tiempo de cancelación
        var consulta = repository.findById(consultaId)
                .orElseThrow(() -> new ValidacionException("Consulta no encontrada"));

        var ahora = LocalDateTime.now();
        if (consulta.getFecha().isBefore(ahora.plusHours(24))) {
            throw new ValidacionException("La consulta solo se puede cancelar con al menos 24 horas de antelación");
        }

        // Aquí puedes proceder con la cancelación
    }
}

public enum MotivoCancelacion {
    PACIENTE_NO_QUISO_CONTINUAR,
    CANCELACION_DEL_MEDICO,
    OTROS;

    public static boolean isValid(String motivo) {
        try {
            MotivoCancelacion.valueOf(motivo);
            return true;
        } catch (IllegalArgumentException e) {
            return false;
        }
    }
}

Este ejemplo asume que tienes un método findById en tu ConsultaRepository que te permite recuperar la consulta por su ID. También he incluido una enumeración MotivoCancelacion para validar los motivos de cancelación.

Espero que esta orientación te sea útil y te ayude a avanzar en tu proyecto. ¡Bons estudios!