Custom APP pickup asterisk 11

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 😉