Custom APP pickup asterisk 11

asterisk

Aquí tenemos otra entrada, que ha sido un marrón con todas las de la ley.
Asterisk es un producto que me encanta, pero a medida que crece en volumen, su comportamiento es «errático»…. es decir, a medida que crece en extensiones / usuarios o intentas hacer algo «multitenant», te vas llevando sorpresa tras sorpresa, pero durante el camino a migrar a otra solución, tienes que ir parcheando y salir del paso como puedas.
También he de decir que, me desagrada muchísimo los paneles tipo freepbx / elastix y derivados, ya que limitan muchísimo sus funcionalidades.
Estos días, me pasó que tení­a que habilitar en una empresa, más de 64 grupos de pickup a «ciegas» y corregir que el default del «features» se comporta de manera errática; intentas capturar una extensión de tu grupo y, en función de las alineaciones estelares, posición de la luna o si pasa algún cometa cerca, acabas capturando algo que no toca y, «capturas» también el cabreo del cliente.
En esta pbx, tengo dividida las extensiones de la siguiente manera:
Compras:
200
201
202
203
204
205
..
220
Facturación:
230
231
232
233
234
235
236
..
250
Contabilidad:
260
261
262
263
Formación:
270
271
272
273
y así un número ‘N’ de departamentos.
me hice una BBDD con ello, tipo

tabla: extensionesempresa
id | extension | departamento
-----------------------------
1 200 compras
2 201 compras
3 202 compras
4 203 compras
5 204 compras
..
40 320 administracion
41 321 administracion
..
..
N

Luego en el func_odbc, la consulta

[uverdepartamento]
dsn=asterisk
readsql=select departamento from extensionesempresa where extension='${ARG1}'


[ucontarextensiones]
dsn=asterisk
readsql=select count(extension),extension from extensionesempresa where departamento=’${ARG1}’



Y ahora el código de app_pickup custom


[app_pickup]
exten => _*8,1,NoOP(…. custom pickup ……….)
exten => _*8,n,Set(empresa=${ODBC_uverdepartamento(${CALLERID(num)})})
exten => _*8,n,NoOP(… la empresa es ${empresa} ………..)
exten => _*8,n,Set(HASH(uno)=${ODBC_ucontarextensiones(${empresa})})
exten => _*8,n,NoOP( ${HASH(uno)} )
exten => _*8,n,Set(variable=${HASH(uno)})
exten => _*8,n,Set(exteninicial=${CUT(variable,\,,1)})
exten => _*8,n,Set(numextensions=${CUT(variable,\,,2)})
exten => _*8,n,NoOP(…. ${exteninicial} ${numextensiones} …… )
exten => _*8,n,NoOP(…. bucle while …………………………)
exten => _*8,n,Set(contador=1)
exten => _*8,n,Set(extenIni=${exteninicial})
exten => _*8,n,While($[${contador} < ${numextensions}]) exten => _*8,n,NoOP(extenIni: ${extenIni} contador: ${contador} …)
exten => _*8,n,GotoIf($[«${DEVICE_STATE(SIP/${extenIni})}»=»RINGING»]?pickup)
exten => _*8,n,Set(extenIni=$[${extenIni} + 1])
exten => _*8,n,Set(contador=$[${contador} + 1])
exten => _*8,n,EndWhile
exten => _*8,n(pickup),NoOP(…. hacemos el pickup a ${extenIni}……..)
exten => _*8,n(pickup),Set(PICKUPMARK=${extenIni})
exten => _*8,n(pickup),Set(GLOBAL(PICKUPMARK)=${extenIni})
exten => _*8,n(pickup),PickupChan(SIP/${extenIni})
exten => _*8,n,Hangup



En la primera parte, sacamos el departamento:

exten => _*8,1,NoOP(.... custom pickup ..........)
exten => _*8,n,Set(empresa=${ODBC_uverdepartamento(${CALLERID(num)})})
exten => _*8,n,NoOP(... la empresa es ${empresa} ...........)

Luego sacamos la extensión inicial y contamos las extensiones que tiene el departamento:

exten => _*8,n,Set(HASH(uno)=${ODBC_ucontarextensiones(${empresa})})
exten => _*8,n,NoOP( ${HASH(uno)} )
exten => _*8,n,Set(variable=${HASH(uno)})
exten => _*8,n,Set(exteninicial=${CUT(variable,\,,1)})
exten => _*8,n,Set(numextensions=${CUT(variable,\,,2)})

Con el While hacemos el bucle y miramos si la extensión está en «RINGINNG» mediante la función «devstate»… si es así, usamos la función PickupChan.
Y ya la tenemos funcionando 😉

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *