Spring Boot 3: doc, test y prep. para impl.: Cancelar consulta
This commit is contained in:
parent
a51a1cc54b
commit
cef7520584
@ -3,14 +3,16 @@ package med.voll.api.controller;
|
|||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
import med.voll.api.domain.consulta.AgendaDeConsultaService;
|
import med.voll.api.domain.consulta.AgendaDeConsultaService;
|
||||||
import med.voll.api.domain.consulta.DatosAgendarConsulta;
|
import med.voll.api.domain.consulta.DatosAgendarConsulta;
|
||||||
|
import med.voll.api.domain.consulta.DatosCancelarConsulta;
|
||||||
|
import med.voll.api.domain.consulta.DatosDetalleConsulta;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.data.domain.Page;
|
||||||
|
import org.springframework.data.domain.Pageable;
|
||||||
|
import org.springframework.data.web.PageableDefault;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
|
||||||
|
|
||||||
@Controller
|
@Controller
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
@ -28,4 +30,19 @@ public class ConsultaController {
|
|||||||
|
|
||||||
return ResponseEntity.ok(response);
|
return ResponseEntity.ok(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetMapping
|
||||||
|
public ResponseEntity<Page<DatosDetalleConsulta>> listar(
|
||||||
|
@PageableDefault(size = 10, sort = {"fecha"}) Pageable paginacion) {
|
||||||
|
var response = service.consultar(paginacion);
|
||||||
|
return ResponseEntity.ok(response);
|
||||||
|
}
|
||||||
|
|
||||||
|
@DeleteMapping
|
||||||
|
@Transactional
|
||||||
|
public ResponseEntity cancelar(@RequestBody @Valid DatosCancelarConsulta dados) {
|
||||||
|
service.cancelar(dados);
|
||||||
|
return ResponseEntity.noContent().build();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,14 @@
|
|||||||
package med.voll.api.domain.consulta;
|
package med.voll.api.domain.consulta;
|
||||||
|
|
||||||
import med.voll.api.domain.consulta.validaciones.ValidadorDeConsultas;
|
import med.voll.api.domain.consulta.validaciones.ValidadorDeConsultas;
|
||||||
|
import med.voll.api.domain.consulta.validaciones_cancelacion.ValidadorDeCancelacionDeConsulta;
|
||||||
import med.voll.api.domain.medico.Medico;
|
import med.voll.api.domain.medico.Medico;
|
||||||
import med.voll.api.domain.medico.MedicoRepository;
|
import med.voll.api.domain.medico.MedicoRepository;
|
||||||
import med.voll.api.domain.paciente.PacienteRepository;
|
import med.voll.api.domain.paciente.PacienteRepository;
|
||||||
import med.voll.api.infra.errores.ValidacionDeIntegridad;
|
import med.voll.api.infra.errores.ValidacionDeIntegridad;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.data.domain.Page;
|
||||||
|
import org.springframework.data.domain.Pageable;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -23,6 +26,9 @@ public class AgendaDeConsultaService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
List<ValidadorDeConsultas> validadores;
|
List<ValidadorDeConsultas> validadores;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
List<ValidadorDeCancelacionDeConsulta> validadoresDeCancelacion;
|
||||||
|
|
||||||
public DatosDetalleConsulta agendar(DatosAgendarConsulta datos) {
|
public DatosDetalleConsulta agendar(DatosAgendarConsulta datos) {
|
||||||
|
|
||||||
if (!pacienteRepository.findById(datos.idPaciente()).isPresent()) {
|
if (!pacienteRepository.findById(datos.idPaciente()).isPresent()) {
|
||||||
@ -39,7 +45,7 @@ public class AgendaDeConsultaService {
|
|||||||
if (medico == null) {
|
if (medico == null) {
|
||||||
throw new ValidacionDeIntegridad("No hay especialistas disponibles para este horario");
|
throw new ValidacionDeIntegridad("No hay especialistas disponibles para este horario");
|
||||||
}
|
}
|
||||||
var consulta = new Consulta(null, medico, paciente, datos.fecha());
|
var consulta = new Consulta(medico, paciente, datos.fecha());
|
||||||
consultaRepository.save(consulta);
|
consultaRepository.save(consulta);
|
||||||
|
|
||||||
return new DatosDetalleConsulta(consulta);
|
return new DatosDetalleConsulta(consulta);
|
||||||
@ -54,4 +60,19 @@ public class AgendaDeConsultaService {
|
|||||||
}
|
}
|
||||||
return medicoRepository.seleccionarMedicoConEspecialidadEnFecha(datos.especialidad(), datos.fecha());
|
return medicoRepository.seleccionarMedicoConEspecialidadEnFecha(datos.especialidad(), datos.fecha());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void cancelar(DatosCancelarConsulta datos) {
|
||||||
|
if (!consultaRepository.existsById(datos.idConsulta())) {
|
||||||
|
throw new ValidacionDeIntegridad("Id de consulta inexistente");
|
||||||
|
}
|
||||||
|
validadoresDeCancelacion.forEach(v -> v.validar(datos));
|
||||||
|
|
||||||
|
var consulta = consultaRepository.getReferenceById(datos.idConsulta());
|
||||||
|
consulta.cancelar(datos.motivo());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Page<DatosDetalleConsulta> consultar(Pageable paginacion) {
|
||||||
|
return consultaRepository.findAll(paginacion).map(DatosDetalleConsulta::new);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -32,4 +32,17 @@ public class Consulta {
|
|||||||
|
|
||||||
private LocalDateTime fecha;
|
private LocalDateTime fecha;
|
||||||
|
|
||||||
|
@Column(name ="motivo_cancelacion")
|
||||||
|
@Enumerated(EnumType.STRING)
|
||||||
|
private MotivoCancelacion motivo;
|
||||||
|
|
||||||
|
public Consulta(Medico medico, Paciente paciente, LocalDateTime fecha) {
|
||||||
|
this.medico=medico;
|
||||||
|
this.paciente=paciente;
|
||||||
|
this.fecha=fecha;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void cancelar(MotivoCancelacion motivo) {
|
||||||
|
this.motivo = motivo;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
package med.voll.api.domain.consulta;
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
|
||||||
|
public record DatosCancelarConsulta(@NotNull Long idConsulta,
|
||||||
|
@NotNull MotivoCancelacion motivo) {
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package med.voll.api.domain.consulta;
|
||||||
|
|
||||||
|
public enum MotivoCancelacion {
|
||||||
|
PACIENTE_DESISTE,
|
||||||
|
MEDICO_CANCELA,
|
||||||
|
OTRO;
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package med.voll.api.domain.consulta.validaciones_cancelacion;
|
||||||
|
|
||||||
|
import med.voll.api.domain.consulta.DatosAgendarConsulta;
|
||||||
|
import med.voll.api.domain.consulta.DatosCancelarConsulta;
|
||||||
|
|
||||||
|
public interface ValidadorDeCancelacionDeConsulta {
|
||||||
|
void validar(DatosCancelarConsulta datos);
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
package med.voll.api.domain.consulta.validaciones_cancelacion;
|
||||||
|
|
||||||
|
import jakarta.validation.ValidationException;
|
||||||
|
import med.voll.api.domain.consulta.ConsultaRepository;
|
||||||
|
import med.voll.api.domain.consulta.DatosCancelarConsulta;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.time.Duration;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
@Component("ValidadorHorarioAnticipacion")
|
||||||
|
public class ValidadorHorarioAnticipacionCancelacion implements ValidadorDeCancelacionDeConsulta {
|
||||||
|
@Autowired
|
||||||
|
private ConsultaRepository repository;
|
||||||
|
@Override
|
||||||
|
public void validar(DatosCancelarConsulta datos) {
|
||||||
|
var consulta = repository.getReferenceById(datos.idConsulta());
|
||||||
|
var ahora = LocalDateTime.now();
|
||||||
|
var diferenciaEnHoras = Duration.between(ahora, consulta.getFecha()).toHours();
|
||||||
|
|
||||||
|
if (diferenciaEnHoras < 24) {
|
||||||
|
throw new ValidationException("La consulta solo se puede cancelar con 24 horas de anticipación");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
alter table consultas add motivo_cancelacion varchar(100);
|
Loading…
Reference in New Issue
Block a user