Saltar a contenido

Procesos programados

El dominio depende de procesos que corren fuera del ciclo de una petición HTTP: nada del ciclo de vida de una reserva o una publicación avanza por sí solo, alguien tiene que barrer periódicamente el estado vencido. Cada uno se implementará como una función de servicio invocada por un comando de gestión programado, no como trigger de base de datos, porque no hay evento de escritura que los dispare. Cada barrido se apoya en el índice que declara la ficha de la tabla correspondiente, para no recorrerla completa en cada corrida. El mecanismo de scheduling en sí (cron del sistema, u otro) no lo fija este documento.

Ninguno de estos procesos valida nada por su cuenta. Cada uno hace la escritura que le toca y los triggers de la tabla imponen las reglas, igual que si la escritura viniera de una petición: el barrido de expiración mueve estado_id y trg_reserva_transicion_valida comprueba que el par sea legal, trg_reserva_ajustar_stock decide si libera inventario y trg_reserva_sancion_automatica evalúa el incumplimiento. Un proceso que tuviera que repetir esas comprobaciones sería un segundo lugar donde la regla puede divergir.

Proceso Frecuencia Origen Función de servicio Índice de apoyo
Liberar retenciones vencidas 15-30 s RF-U-29 expirar_retenciones_vencidas idx_reserva_retencion
Publicar publicaciones programadas1 1 min RF-C-25 Pendiente, ver nota Publicacion.reservable_desde_at2
Cerrar reservas por corte de ventana1 1 min RF-C-26 Pendiente, ver nota idx_publicacion_cierre
Expirar reservas no validadas 1 min RF-U-36
RF-C-47
expirar_reserva idx_reserva_expiracion
Generar publicaciones del día Por comercio RF-C-23 generar_publicaciones_del_dia n/a3
Enviar notificaciones pendientes Continua RF-U-44 enviar_pendientes idx_notificacion_cola
Calcular indicadores de cumplimiento Diaria RF-C-51
RF-A-44
calcular_indicadores_diarios unq_comercioindicador_comercio_ventana_fecha
Evaluar alertas de cumplimiento Diaria RF-A-44 evaluar_alertas_cumplimiento n/a4
Evaluar alertas por incidencias sin movimiento (48h) Periódica RF-A-32 evaluar_alertas_antiguedad idx_incidencia_abierta_movimiento
Recordar publicación faltante1 Diaria RF-C-56 Pendiente, ver nota Comercio.ultima_publicacion_at2
Vencer solicitudes de afiliación1 Diaria RF-A-10 Pendiente, ver nota SolicitudAfiliacion.vence_at2
Retener notificaciones antiguas Mensual RF-A-59 n/a5 brin_notificacion_createdat

  1. Proceso vigente sin función de servicio nombrada todavía. La columna donde vive la marca temporal que lo sostiene ya existe en el modelo. La función queda por escribir en el los servicios de su módulo, siguiendo el mismo patrón que el resto de esta tabla (recorrer el índice/columna, mover el estado con la validación de transición correspondiente). ↩↩↩↩

  2. Columna sin índice dedicado todavía, un barrido diario sobre un volumen bajo de filas (publicaciones/solicitudes/comercios activos) no lo necesita a esta escala, pero documentarlo aquí dejaría claro dónde agregarlo si el volumen crece. ↩↩↩

  3. No hay un índice de barrido, el proceso no recorre una tabla buscando filas vencidas, se dispara una vez por comercio según su propia regla de generación (Comercio.hora_generacion_publicacion o horas_antes_generacion). ↩

  4. Recorre ComercioIndicador recién calculado por el proceso anterior, en la misma corrida diaria; no necesita su propio índice de barrido. ↩

  5. La purga es un DELETE por lotes acotados sobre el rango que cubre el índice BRIN, no una función de dominio. ↩