Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
0
respuestas

Haz como yo hice

public record DatosCancelacionConsulta(

    @NotNull
    Long idConsulta,

    @NotNull
    MotivoCancelacion motivo

) {
}

public enum MotivoCancelacion {

PACIENTE_NO_QUISO_CONTINUAR,
CANCELACION_MEDICO,
OTROS

}

public interface ValidadorCancelacionDeConsultas {

void validar(DatosCancelacionConsulta datos);

}

@Component
public class ValidadorCancelacionConAnticipacion implements ValidadorCancelacionDeConsultas {

@Autowired
private ConsultaRepository consultaRepository;

@Override
public void validar(DatosCancelacionConsulta datos) {

    var consulta = consultaRepository.getReferenceById(datos.idConsulta());
    var ahora = LocalDateTime.now();

    if (consulta.getFecha().isBefore(ahora.plusHours(24))) {
        throw new ValidacionException(
                "La consulta solo puede cancelarse con al menos 24 horas de anticipación."
        );
    }
}

}

@Service
public class ReservaDeConsultas {

@Autowired
private ConsultaRepository consultaRepository;

@Autowired
private List<ValidadorCancelacionDeConsultas> validadoresCancelacion;

@Transactional
public void cancelar(DatosCancelacionConsulta datos) {

    if (!consultaRepository.existsById(datos.idConsulta())) {
        throw new ValidacionException("El id de la consulta informado no existe.");
    }

    validadoresCancelacion.forEach(v -> v.validar(datos));

    var consulta = consultaRepository.getReferenceById(datos.idConsulta());
    consulta.cancelar(datos.motivo());
}

alter table consultas add column motivo_cancelacion varchar(100);