Esta web utiliza cookies, puedes ver nuestra la política de cookies, aquí Si continuas navegando estás aceptándola
Política de cookies +

Cómo usar GotoIfTime y GosubIfTime en Asterisk

Asterisk es una centralita telefónica de código abierto extremadamente flexible, y una de sus grandes ventajas es la posibilidad de gestionar el flujo de llamadas según condiciones de tiempo. Las aplicaciones GotoIfTime y GosubIfTime permiten crear reglas que dependen de la fecha y la hora, facilitando la implementación de calendarios de festivos y horarios de atención.

¿Qué es GotoIfTime?

GotoIfTime es una aplicación del dialplan de Asterisk que permite redirigir el flujo de una llamada si la fecha y hora actual coinciden con una condición temporal especificada. Su sintaxis es similar a la de GotoIf, pero añade la posibilidad de condicionar el salto a un rango horario, días de la semana, días del mes y meses.

Sintaxis:
GotoIfTime(?:)

Los parámetros aceptan asteriscos (*) para indicar "cualquiera", barras verticales (|) para "o", y guiones (-) para rangos. Los días y meses se escriben en inglés abreviado (ejemplo: mon para lunes, jan para enero).

¿Qué es GosubIfTime?

GosubIfTime funciona igual que GotoIfTime, pero en vez de redirigir el flujo de la llamada, llama a una subrutina (subcontexto) del dialplan. Es ideal para evitar la repetición de código y centralizar acciones comunes.

Ejemplo 1: Calendario de festivos en España 2025

Supongamos que queremos que la centralita no atienda llamadas en los días festivos nacionales de España en 2025. Para ello, podemos crear una lista de condiciones GotoIfTime para cada festivo, redirigiendo la llamada a un mensaje de "cerrado por festivo".

Fragmento de extensions.conf:

; Contexto principal de entrada
[entrada-principal]
exten => s,1,NoOp(Comprobando si hoy es festivo nacional)
; Festivos nacionales 2025 (formato: día, mes abreviado en inglés)
same => n,GotoIfTime(*,*,1,jan?cerrado-festivo,s,1)      ; Año Nuevo
same => n,GotoIfTime(*,*,6,jan?cerrado-festivo,s,1)      ; Reyes
same => n,GotoIfTime(*,*,18,apr?cerrado-festivo,s,1)     ; Viernes Santo
same => n,GotoIfTime(*,*,1,may?cerrado-festivo,s,1)      ; Día del Trabajador
same => n,GotoIfTime(*,*,15,aug?cerrado-festivo,s,1)     ; Asunción
same => n,GotoIfTime(*,*,12,oct?cerrado-festivo,s,1)     ; Fiesta Nacional
same => n,GotoIfTime(*,*,1,nov?cerrado-festivo,s,1)      ; Todos los Santos
same => n,GotoIfTime(*,*,6,dec?cerrado-festivo,s,1)      ; Constitución
same => n,GotoIfTime(*,*,8,dec?cerrado-festivo,s,1)      ; Inmaculada
same => n,GotoIfTime(*,*,25,dec?cerrado-festivo,s,1)     ; Navidad
; Si no es festivo, continuar con el flujo normal
same => n,NoOp(No es festivo, continuar)
same => n,Goto(atencion-horario,s,1)

[cerrado-festivo]
exten => s,1,Answer()
same => n,Playback(custom/cerrado-festivo)
same => n,Hangup()
  

Este ejemplo cubre los festivos nacionales. Si necesitas añadir festivos autonómicos o locales, simplemente añade más líneas GotoIfTime con las fechas correspondientes.

Ejemplo 2: Horario de atención de lunes a viernes, de 9 a 15 horas

Para establecer un horario de atención telefónica de lunes a viernes de 9:00 a 15:00, puedes usar GotoIfTime de la siguiente manera:

[atencion-horario]
exten => s,1,NoOp(Comprobando horario de atención)
same => n,GotoIfTime(09:00-15:00,mon-fri,*,*?atencion,s,1)
same => n,Playback(custom/fuera-horario)
same => n,Hangup()

[atencion]
exten => s,1,Answer()
same => n,Playback(custom/bienvenida)
same => n,Dial(SIP/operadora)
same => n,Hangup()
  

En este ejemplo, si la llamada entra dentro del horario especificado, se dirige al contexto atencion donde se atiende normalmente. Si la llamada entra fuera del horario, se reproduce un mensaje informativo y se cuelga la llamada.

¿Cuándo usar GosubIfTime?

Si varias partes de tu dialplan deben ejecutar la misma lógica según el horario, puedes definir una subrutina y llamarla con GosubIfTime. Así, centralizas el código y facilitas el mantenimiento.

[sub-horario]
exten => s,1,NoOp(Subrutina de horario de atención)
same => n,GotoIfTime(09:00-15:00,mon-fri,*,*?abierto,1)
same => n,Return()

exten => abierto,1,NoOp(Horario correcto, continuar)
same => n,Return()
  

Puedes invocar esta subrutina desde cualquier contexto con:
same => n,GoSub(sub-horario,s,1)

Resumen de formatos para GotoIfTime y GosubIfTime

Parámetro Formato Ejemplo
Hora hh:mm-hh:mm 09:00-15:00
Día de la semana mon|tue|wed|thu|fri|sat|sun mon-fri
Día del mes 1-31 1,6,25
Mes jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec dec

Conclusión

El uso de GotoIfTime y GosubIfTime en Asterisk es fundamental para adaptar el comportamiento de la centralita a los horarios y calendarios de la empresa. Con unos pocos bloques de código, puedes gestionar festivos, horarios de atención y cualquier excepción temporal de manera elegante y centralizada.

Capa Tres Soluciones Tecnológicas es una empresa registrada en la CNMC como operador de telecomunicaciones.

Capa Tres Soluciones Tecnológicas S.L. CIF B63846984. Networkia Bussiness Center. Avda Portal de l'Angel, 36. 08002 Barcelona. Teléfono 935605424. Email comercial@capatres.com. Colloquor es una marca comercial registrada.