Cancelar Cierre
Esta guía te enseñará a cancelar (eliminar) un cierre existente cuando ya no sea necesario. Al cancelar un cierre, los slots bloqueados se liberan inmediatamente y vuelven a estar disponibles para agendar citas.Cuándo Cancelar un Cierre
Cancela un cierre en estas situaciones:1. Cambio de Planes
Escenario: Planificaste vacaciones pero se cancelaron. Ejemplo:- Cierre creado: Vacaciones 1-15 agosto
- Situación nueva: Viaje cancelado, clínica abrirá normalmente
- Acción: Cancelar cierre para liberar disponibilidad
2. Error al Crear
Escenario: Creaste cierre con fechas incorrectas. Ejemplo:- Cierre creado: 1-15 agosto (15 días)
- Error: Debía ser 1-7 agosto (7 días)
- Acción: Cancelar cierre incorrecto, crear nuevo con fechas correctas
3. Proveedor Regresa Antes
Escenario: Proveedor planeó permiso de 5 días pero regresa antes. Ejemplo:- Cierre creado: Dr. García, 3-7 febrero (5 días)
- Situación nueva: Dr. García regresa el 5 febrero
- Acción: Cancelar cierre original, crear nuevo 3-4 febrero (2 días)
4. Cierre Ya No Necesario
Escenario: Cambios en la clínica hacen el cierre obsoleto. Ejemplo:- Cierre creado: Mantenimiento general, 10 febrero
- Situación nueva: Mantenimiento pospuesto indefinidamente
- Acción: Cancelar cierre
Pasos para Cancelar un Cierre
1
Navegar a lista de cierres
Desde el menú principal, ve a:
- Gestión → Cierres → Todos los Cierres
- Click en widget “Próximos Cierres” → Ver cierre específico
- Dashboard → Sección “Próximos Cierres” → Click en cierre
2
Buscar el cierre a cancelar
Usa los filtros disponibles para encontrar el cierre:Filtro por fecha:
- Rango de fechas de inicio
- Ejemplo: Mostrar cierres que empiezan en agosto
- Clinic-wide (toda la clínica)
- Provider-specific (proveedor individual)
- Selecciona proveedor del dropdown
- Solo se muestran cierres de ese proveedor
- Busca por palabra clave en razón
- Ejemplo: “Vacaciones”
3
Click en 'Cancelar' o icono de eliminar
Una vez encontrado el cierre, tienes dos opciones:Opción A: Desde la lista:
- Busca la columna “Acciones”
- Click en icono de eliminar (🗑️)
- Click en el cierre para ver detalles
- Botón “Cancelar Cierre” (rojo)
4
Confirmar cancelación (modal)
El sistema mostrará un modal de confirmación:Mensaje:Opciones:
- Cancelar Cierre (rojo): Proceder con eliminación
- Volver (gris): Abortar, no cancelar
5
Cierre se elimina
Al confirmar, el sistema ejecutará:
- Validación de permisos (solo ADMIN/CLINIC_ADMIN pueden cancelar)
- Eliminación del cierre de la base de datos (DELETE, no soft delete)
- Cancelación de jobs dinámicos (
scheduler.remove_job()) - Invalidación de cache de disponibilidad
- Si cierre estaba activo: Emisión de evento WebSocket
clinic_status_changed - Slots liberados inmediatamente
Resultado de Cancelar un Cierre
Después de cancelar, el sistema habrá realizado:1. Cierre Eliminado de Base de Datos
El cierre se elimina completamente (hard delete): Antes:Hard delete vs Soft delete: A diferencia de las citas (que usan soft delete con status), los cierres se eliminan permanentemente. Esto es intencional para simplificar la gestión y evitar confusiones.
2. Jobs Dinámicos Cancelados
APScheduler elimina automáticamente los 2 jobs asociados: Jobs eliminados:closure_abc_start(DateTrigger para inicio)closure_abc_end(DateTrigger para fin)
3. Availability Cache Invalidated
El sistema invalida toda la cache de disponibilidad: Caches afectadas:get_availability(TTL 3 min) → Invalidada ✅OperationalStatusService(TTL 30 seg) → Invalidada ✅ConfigurationStatusService(TTL 5 min) → Invalidada ✅
4. WebSocket Event Emitido (si cierre estaba activo)
Solo si el cierre YA había empezado (cuandostarts_at es menor o igual a la hora actual):
El sistema emite evento WebSocket inmediatamente:
- Frontends conectados actualizan interfaces automáticamente
- Widget de status cambia de “Cerrado” a “Abierto”
- No requiere refresh manual
Si el cierre NO había empezado aún (starts_at > now), NO se emite evento WebSocket porque el status operacional no cambia (la clínica ya estaba abierta).
5. Slots Liberados Inmediatamente
Los slots bloqueados por el cierre vuelven a estar disponibles: Ejemplo: Antes de cancelar:- Llama a
GET /v1/availability?date=2026-08-01 - Resultado: Slots aparecen disponibles inmediatamente
6. Upcoming Closure Eliminado (si aplicaba)
Si el cierre estaba en upcoming closures (próximos 14 días): Antes:Ejemplos de Cancelación
Ejemplo 1: Vacaciones canceladas (clinic-wide)
Ejemplo 1: Vacaciones canceladas (clinic-wide)
Escenario: Vacaciones planificadas fueron canceladas.Cierre original:
- Tipo: Clinic-wide
- Inicio:
2026-08-01 00:00 - Fin:
2026-08-15 23:59 - Razón: “Vacaciones de verano”
- Slots bloqueados: 300 slots (100% - impacto HIGH)
- Navegar a Upcoming Closures (cierre aparece con countdown “7 días”)
- Click en icono eliminar (🗑️)
- Confirmar cancelación en modal
- Sistema elimina cierre
- Jobs cancelados:
closure_abc_start,closure_abc_end - Cache invalidada ✅
- 300 slots liberados ✅
- Disponibilidad 1-15 agosto restaurada
- Clientes pueden agendar citas para esas fechas
- Upcoming closure ya NO aparece
Ejemplo 2: Fechas incorrectas (provider-specific)
Ejemplo 2: Fechas incorrectas (provider-specific)
Escenario: Creaste cierre con fechas incorrectas.Cierre original (ERROR):
- Tipo: Provider-specific (Dr. García)
- Inicio:
2026-02-01 00:00 - Fin:
2026-02-15 23:59(15 días - INCORRECTO) - Razón: “Permiso médico”
- Cancelar cierre incorrecto (1-15 febrero)
- Navegar a lista de cierres
- Buscar cierre del Dr. García
- Click en eliminar
- Confirmar
- Crear nuevo cierre correcto (1-7 febrero)
- Tipo: Provider-specific (Dr. García)
- Inicio:
2026-02-01 00:00 - Fin:
2026-02-07 23:59(7 días - CORRECTO) - Razón: “Permiso médico”
- Cierre incorrecto eliminado ✅
- Cierre correcto creado ✅
- Disponibilidad 8-15 febrero restaurada (Dr. García disponible) ✅
Ejemplo 3: Proveedor regresa antes (ajuste de fechas)
Ejemplo 3: Proveedor regresa antes (ajuste de fechas)
Escenario: Proveedor planeó 5 días de permiso pero regresa antes.Cierre original:
- Tipo: Provider-specific (Dra. López)
- Inicio:
2026-03-10 00:00 - Fin:
2026-03-14 23:59(5 días) - Razón: “Capacitación externa”
- Cancelar cierre original (10-14 marzo)
- Crear nuevo cierre (10-11 marzo)
- Tipo: Provider-specific (Dra. López)
- Inicio:
2026-03-10 00:00 - Fin:
2026-03-11 23:59(2 días) - Razón: “Capacitación externa (ajustado)”
- Dra. López bloqueada solo 10-11 marzo ✅
- Disponible 12-14 marzo (liberado) ✅
- Clientes pueden agendar con ella 12-14 marzo
Ejemplo 4: Cierre activo (ya empezó)
Ejemplo 4: Cierre activo (ya empezó)
Escenario: Cierre ya empezó pero se cancela prematuramente.Cierre original:
- Tipo: Clinic-wide
- Inicio:
2026-07-01 00:00(hace 2 días) - Fin:
2026-07-05 23:59(faltan 3 días) - Razón: “Mantenimiento eléctrico”
- Navegar a lista de cierres → Filtrar “Cierres activos”
- Buscar cierre de mantenimiento
- Click en eliminar
- Confirmar cancelación
- Cierre eliminado ✅
- Jobs cancelados ✅
- WebSocket emitido ✅ (porque cierre estaba activo):
- Frontend actualiza status: “Cerrado” → “Abierto” (sin refresh)
- Disponibilidad 3-5 julio liberada ✅
Validaciones y Errores Comunes
Error 403: Cannot manage this clinic
Error 403: Cannot manage this clinic
Problema: No tienes permisos para cancelar cierres.Causa: Solo usuarios con rol ADMIN o CLINIC_ADMIN pueden cancelar cierres.Solución:
- Verifica tu rol en la sección de perfil
- Solicita permisos de administrador a un admin existente
- Si eres admin, verifica que estás autenticado correctamente
GET /v1/users/meRespuesta:El role debe ser ADMIN o CLINIC_ADMIN para poder cancelar cierres.
Error 404: Closure not found
Error 404: Closure not found
Problema: El cierre que intentas cancelar no existe.Causas posibles:1. Cierre ya fue cancelado:
- Otro usuario canceló el cierre antes que tú
- Solución: Refrescar la lista de cierres
- Copiaste mal el ID del cierre
- Solución: Verificar ID en la URL o lista
- Estás intentando cancelar un cierre de otra clínica
- Solución: Verificar clinic_id en los filtros
Error 500: Failed to cancel jobs
Error 500: Failed to cancel jobs
Problema: Error al cancelar los jobs dinámicos en APScheduler.Causa: Problema con APScheduler (poco común).Impacto:
- El cierre SE elimina de la base de datos ✅
- Los jobs PUEDEN seguir en el scheduler ❌
- Reportar a soporte con detalles:
- ID del cierre
- Timestamp del error
- Logs del servidor
- Temporary workaround: Admin puede cancelar jobs manualmente:
No puedo cancelar cierre (botón deshabilitado)
No puedo cancelar cierre (botón deshabilitado)
Problema: El botón “Cancelar” está deshabilitado o no aparece.Causas posibles:1. Cierre ya pasó:
- Si
ends_at < now, el cierre ya finalizó - No tiene sentido cancelarlo (ya no está activo)
- Solución: Los cierres pasados no se pueden cancelar
- Solo ADMIN/CLINIC_ADMIN ven el botón
- Solución: Solicitar permisos
- Otro usuario está cancelándolo en este momento
- Solución: Esperar unos segundos, refrescar
Advertencias Importantes
Cancelar vs Modificar fechas:El sistema NO soporta modificar fechas de un cierre existente. Si necesitas cambiar fechas:
- Cancelar cierre original
- Crear nuevo cierre con fechas correctas
Diferencia: Cancelar Cierre vs Crear Cierre Nuevo
Cancelar Cierre (DELETE)
Objetivo: Eliminar un cierre existente que ya no es necesario. Resultado:- Cierre eliminado de DB ✅
- Jobs cancelados ✅
- Slots liberados ✅
- NO requiere crear nuevo
- Cambio de planes (vacaciones canceladas)
- Error al crear
- Cierre ya no necesario
Crear Cierre Nuevo con Fechas Diferentes
Objetivo: Reemplazar un cierre con fechas ajustadas. Resultado:- Cierre original sigue existiendo ❌
- Cierre nuevo creado ✅
- Problema: Dos cierres solapados pueden causar confusión
- NO uses para “modificar” un cierre
- Primero cancela, LUEGO crea nuevo
- Cancelar cierre original
- Crear nuevo cierre con fechas correctas
- Evitas duplicación y confusión