GotoIfTime
y GosubIfTime
en AsteriskAsterisk 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.
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(
? : )
hh:mm-hh:mm,días_semana,días_mes,meses
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).
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.
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".
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.
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.
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)
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 |
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.