Como bloquear extensiones al final del día (cerrar extensión cuando el trabajador se retira)

3 Dic

En ocasiones en nuestras oficinas (sobretodo en grandes corporativos), estamos sujetos a presupuestos de llamadas por mes. Esto quiere decir que recibimos una bolsa de minutos a ciertos destinos (para control de gastos) y debemos cuidarlos, ya que si nos los agotamos tendremos que hacer solicitudes de “crédito” interno y ante nuestros superiores parecería como que estamos desperdiciando dinero (llamadas) de la empresa.

Contemplando escenarios similares a este, podemos configurar Asterisk para que las extensiones de cada persona sean bloqueadas al momento en que la persona se retira a su casa. De esta manera, si alguien se queda cercano a su área de trabajo no podrá tomar su teléfono y hacer llamadas al exterior, reduciendo el crédito del trabajador que ya se fue (y ahorrándose el suyo). Al día siguiente, cuando el trabajador regresa, marca un código de desbloqueo junto con su contraseña y su teléfono vuelve a estar habilitado.

¿Cómo hacer eso?

Partiremos de los siguientes supuestos:

  • El contexto al que mis extensiones “normales” tienen derecho es el from-internal.
  • El código para bloquear la extensión (cuando el trabajador se va), será *51.
  • El código para desbloquear la extensión (cuando el trabajador regresa por la mañana), será *52.
  • Todas las extensiones deben tener un buzón asignado. El número de buzón debe ser el mismo que el de la extensión.
  • La marcación que negaremos será solamente la que corresponda a llamadas locales, larga distancia, celulares e internaciones (es decir, todas las que cuesten).
  • La sintaxis que estoy ocupando (same =>) es para Asterisk 1.6.2 o superior.

Toda la magia viene en el archivo extensions.conf (si usas Trixbox/Elastix/FreePBX, debes de hacerlo dentro del archivo extensions_custom.conf)

[from-internal-custom]
; Estos son los patrones para hacer las llamadas
; Si necesitas cerrar más patrones, agrégalos siguiendo el mismo formato
exten => _ZXXXXXXX,1,Macro(permitir)
same => n,Goto(from-internal-additional,${EXTEN},1)
exten => _04[45]ZXXXXXXXXX,1,Macro(permitir)
same => n,Goto(from-internal-additional,${EXTEN},1)
exten => _01ZXXXXXXXXX,1,Macro(permitir)
same => n,Goto(from-internal-additional,${EXTEN},1)
exten => _00ZXXXXXXXX.,1,Macro(permitir)
same => n,Goto(from-internal-additional,${EXTEN},1)

; Este es el código de bloqueo. Es lo que el trabajador marca antes de retirarse
exten => *51,1,Noop(Bloqueando ${CALLERID(num)})
;same => n,VMAuthenticate(${CALLERID(num)})     ; Descomenta esta línea si quieres pedir contraseña también al bloquear
same => n,Set(DB(bloqueo/${CALLERID(num)})=1)
same => n,Playback(vm-goodbye)
same => n,Hangup
; Este es el código de desbloqueo. Es lo que marca a la mañana siguiente
exten => *52,1,Answer
same => n,VMAuthenticate(${CALLERID(num)})
same => n,Noop(${DB_DELETE(bloqueo/${CALLERID(num)})})
same => n,Playback(auth-thankyou)
same => n,Hangup

; El macro-permitir es lo que valida si una extensión tiene o no activada el bloqueo
[macro-permitir]
exten => s,1,Noop(Revisando permisos de ${CALLERID(num)})
same => n,GotoIf($[${DB_EXISTS(bloqueo/${CALLERID(num)})}]?Bloquear:Permitir)
same => n(Bloquear),Noop(Deteniendo el paso de ${CALLERID(num)})
same => n,Playback(pbx-invalid)  ; Reemplazar por cualquier archivo de sonido deseado
same => n,Congestion()
same => n(Permitir),Noop(Permitiendo el paso de ${CALLERID(num)} --> ${MACRO_EXTEN})

Una breve explicación de lo que hace cada cosa:

  • Los patrones de ZXXXXXXX, 01ZXXXXXXXXX, 04[45]ZXXXXXXXXX y 00ZXXXXXX. son para controlar las llamadas locales, larga distancia nacional, celulares y LD internacional respectivamente. Si tienes más patrones de marcación o destinos que desees bloquear (por ejemplo, alguna marcación corta por telular), necesitas agregar el patrón correspondiente siguiendo el mismo formato (tras cada patrón debe haber una continuación same => n,Goto(from-internal-additional,${EXTEN},1) que te permite continuar con el contexto from-internal-additional.
  • *51 y *52 son, como habíamos comentado, los códigos para bloqueo/desbloqueo respectivamente. Puedes reemplazar los Playbacks por lo que tu elijas para dar diferentes mensajes
  • El [macro-permitir] es el que checa el contenido del Asterisk DB. Si la familia bloqueo/CALLERID existe, entonces no se le permiten las llamadas. Si no existe, el macro permite el paso y la llamada continúa de manera normal.
  • Las autenticaciones se hacen con la misma contraseña del buzón de voz, así cada quien tiene la suya, es actualizable por el usuario y solo funciona dentro de su mismo teléfono.
  • Si deseas desbloquear manualmente alguna extensión (ej. alguien olvidó su contraseña), solo debes ejecutar database del bloqueo <ext> dentro del *CLI.

Con esto lograremos que al cierre del turno, el trabajador pueda bloquear su teléfono y reactivarlo a la mañana siguiente con solo ingresar su contraseña.

Debo agregar que funciona tan bien que anoche que lo implementé dejé cerrada mi extensión y hoy no me permitía hacer llamadas, hasta que marqué *52 e introduje mi contraseña nuevamente.

¡Suerte!

Christian Cabrera

Soy un ingenieron en comunicaciones con especial interés en el área de voz sobre IP y tecnologías sobre información. He usado Asterisk de manera diaria desde hace más de 12 años.En el 2011 co-fundé Enlaza Comunicaciones, una empresa que se especializa en brindar servicios profesionales de consultoría sobre voz sobre IP basadas en Asterisk.

  • Efrain

    interesante me gusto gracias christian aunque en mi caso entregarle esa responsabilidad al usuario no siempre es bueno ya que o se le olvida o por alguna circunstancia no podria bloquearla igual seria buena opcion usar algo como :
    exten => *13,1,Noop(example-gotoiftime)
    same => n,GotoIfTime(08:00-20:00,mon-sat,*,*?open)
    same => n(closed),Festival(Estas Fuera De horario)
    same => n,Playback(vm-goodbye)
    same => n,Hangup()
    same => n(open),Playback(welcome)
    same => n,Hangup()

    para mis extensiones de salida como respaldo gracias por la info.

    oye una duda tome contigo el curso pero estoy sobre asterisk 1.8 me recomiendas migrar a la version 11?

    Saludos Christian.

    • Hola Efrain,

      En efecto es posible cerrarlas por horario fijo. Como menciono siempre, Asterisk es demasiado extenso, por lo que algunas personas tendrán una necesidad y otros otra. Si no quieres darle la libertal al usuario entonces si, necesidas hacerlo por horarios como comentas.

      Asterisk 11 aún lo veo un tanto verde para producción. Si tienes el tiempo y la disponibilidad para estar revisando que el sistema esté estable y arriba en todo momendo, usa el 11. Si quieres algo más estable, usa el 1.8, aunque sacrifiques algunas de las nuevas funcionalidades que salieron con el 11.

      Saludos,

      • isabel

        hola,tengo ciertas dudas con esto, cuando colocas “${DB_EXISTS(bloqueo/${CALLERID(num)})}” eso es habiendo creado una tabla en la base de datos llamada “bloqueo”? me puedes explicar esa partecita ademas de si tengo un contexto asignado a una extension habria alguna forma que el cambio se realice cuando el usuario digite ese *51?