{"id":1250,"date":"2017-07-16T22:04:49","date_gmt":"2017-07-16T21:04:49","guid":{"rendered":"http:\/\/diablo.craem.net\/?p=1250"},"modified":"2017-07-16T22:04:49","modified_gmt":"2017-07-16T21:04:49","slug":"custom-app-pickup-asterisk-11","status":"publish","type":"post","link":"https:\/\/diablo.craem.net\/?p=1250","title":{"rendered":"Custom APP pickup asterisk 11"},"content":{"rendered":"<p>Aqu\u00ed tenemos otra entrada, que ha sido un <em>marr\u00f3n<\/em> con todas las de la ley.<br \/>\n<em>Asterisk<\/em> es un producto que me encanta, pero a medida que crece en volumen, su comportamiento es <em>\u00aberr\u00e1tico\u00bb<\/em>&#8230;. es decir, a medida que crece en extensiones \/ usuarios o intentas hacer algo \u00abmultitenant\u00bb, te vas llevando sorpresa tras sorpresa, pero durante el camino a migrar a otra soluci\u00f3n, tienes que ir parcheando y salir del paso como puedas.<br \/>\nTambi\u00e9n he de decir que, me desagrada much\u00edsimo los paneles tipo freepbx \/ elastix y derivados, ya que limitan much\u00edsimo sus funcionalidades.<br \/>\nEstos d\u00edas, me pas\u00f3 que ten\u00ed\u00ada que habilitar en una empresa, m\u00e1s de 64 grupos de pickup a \u00abciegas\u00bb y corregir que el default del \u00abfeatures\u00bb se comporta de manera err\u00e1tica; intentas capturar una extensi\u00f3n de tu grupo y, en funci\u00f3n de las alineaciones estelares, posici\u00f3n de la luna o si pasa alg\u00fan cometa cerca, acabas capturando algo que no toca y, \u00abcapturas\u00bb tambi\u00e9n el cabreo del cliente.<br \/>\nEn esta pbx, tengo dividida las extensiones de la siguiente manera:<br \/>\nCompras:<br \/>\n200<br \/>\n201<br \/>\n202<br \/>\n203<br \/>\n204<br \/>\n205<br \/>\n..<br \/>\n220<br \/>\nFacturaci\u00f3n:<br \/>\n230<br \/>\n231<br \/>\n232<br \/>\n233<br \/>\n234<br \/>\n235<br \/>\n236<br \/>\n..<br \/>\n250<br \/>\nContabilidad:<br \/>\n260<br \/>\n261<br \/>\n262<br \/>\n263<br \/>\nFormaci\u00f3n:<br \/>\n270<br \/>\n271<br \/>\n272<br \/>\n273<br \/>\ny as\u00ed un n\u00famero &#8216;N&#8217; de departamentos.<br \/>\nme hice una BBDD con ello, tipo<br \/>\n<code><br \/>\ntabla: extensionesempresa<br \/>\nid | extension | departamento<br \/>\n-----------------------------<br \/>\n1   200          compras<br \/>\n2   201          compras<br \/>\n3   202          compras<br \/>\n4   203          compras<br \/>\n5   204          compras<br \/>\n..<br \/>\n40  320          administracion<br \/>\n41  321          administracion<br \/>\n..<br \/>\n..<br \/>\nN<br \/>\n<\/code><br \/>\nLuego en el func_odbc, la consulta<br \/>\n<code><br \/>\n[uverdepartamento]<br \/>\ndsn=asterisk<br \/>\nreadsql=select departamento from extensionesempresa where extension='${ARG1}'<\/code><br \/>\n<code><code><\/code><\/code><br \/>\n[ucontarextensiones]<br \/>\ndsn=asterisk<br \/>\nreadsql=select count(extension),extension from extensionesempresa where departamento=&#8217;${ARG1}&#8217;<br \/>\n<code><br \/>\n<\/code><br \/>\n<code><\/code><br \/>\nY ahora el c\u00f3digo de app_pickup custom<br \/>\n<code><\/code><br \/>\n<code><code><\/code><\/code><br \/>\n[app_pickup]<br \/>\nexten =&gt; _*8,1,NoOP(&#8230;. custom pickup &#8230;&#8230;&#8230;.)<br \/>\nexten =&gt; _*8,n,Set(empresa=${ODBC_uverdepartamento(${CALLERID(num)})})<br \/>\nexten =&gt; _*8,n,NoOP(&#8230; la empresa es ${empresa} &#8230;&#8230;&#8230;..)<br \/>\nexten =&gt; _*8,n,Set(HASH(uno)=${ODBC_ucontarextensiones(${empresa})})<br \/>\nexten =&gt; _*8,n,NoOP( ${HASH(uno)} )<br \/>\nexten =&gt; _*8,n,Set(variable=${HASH(uno)})<br \/>\nexten =&gt; _*8,n,Set(exteninicial=${CUT(variable,\\,,1)})<br \/>\nexten =&gt; _*8,n,Set(numextensions=${CUT(variable,\\,,2)})<br \/>\nexten =&gt; _*8,n,NoOP(&#8230;. ${exteninicial} ${numextensiones} &#8230;&#8230; )<br \/>\nexten =&gt; _*8,n,NoOP(&#8230;. bucle while &#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;)<br \/>\nexten =&gt; _*8,n,Set(contador=1)<br \/>\nexten =&gt; _*8,n,Set(extenIni=${exteninicial})<br \/>\nexten =&gt; _*8,n,While($[${contador} &lt; ${numextensions}]) exten =&gt; _*8,n,NoOP(extenIni: ${extenIni} contador: ${contador} &#8230;)<br \/>\nexten =&gt; _*8,n,GotoIf($[\u00ab${DEVICE_STATE(SIP\/${extenIni})}\u00bb=\u00bbRINGING\u00bb]?pickup)<br \/>\nexten =&gt; _*8,n,Set(extenIni=$[${extenIni} + 1])<br \/>\nexten =&gt; _*8,n,Set(contador=$[${contador} + 1])<br \/>\nexten =&gt; _*8,n,EndWhile<br \/>\nexten =&gt; _*8,n(pickup),NoOP(&#8230;. hacemos el pickup a ${extenIni}&#8230;&#8230;..)<br \/>\nexten =&gt; _*8,n(pickup),Set(PICKUPMARK=${extenIni})<br \/>\nexten =&gt; _*8,n(pickup),Set(GLOBAL(PICKUPMARK)=${extenIni})<br \/>\nexten =&gt; _*8,n(pickup),PickupChan(SIP\/${extenIni})<br \/>\nexten =&gt; _*8,n,Hangup<br \/>\n<code><br \/>\n<\/code><br \/>\n<code><\/code><br \/>\nEn la primera parte, sacamos el departamento:<br \/>\n<code><br \/>\nexten =&gt; _*8,1,NoOP(.... custom pickup ..........)<br \/>\nexten =&gt; _*8,n,Set(empresa=${ODBC_uverdepartamento(${CALLERID(num)})})<br \/>\nexten =&gt; _*8,n,NoOP(... la empresa es ${empresa} ...........)<br \/>\n<\/code><br \/>\nLuego sacamos la extensi\u00f3n inicial y contamos las extensiones que tiene el departamento:<br \/>\n<code><br \/>\nexten =&gt; _*8,n,Set(HASH(uno)=${ODBC_ucontarextensiones(${empresa})})<br \/>\nexten =&gt; _*8,n,NoOP( ${HASH(uno)}  )<br \/>\nexten =&gt; _*8,n,Set(variable=${HASH(uno)})<br \/>\nexten =&gt; _*8,n,Set(exteninicial=${CUT(variable,\\,,1)})<br \/>\nexten =&gt; _*8,n,Set(numextensions=${CUT(variable,\\,,2)})<br \/>\n<\/code><br \/>\nCon el <em>While<\/em> hacemos el bucle y miramos si la extensi\u00f3n est\u00e1 en \u00abRINGINNG\u00bb mediante la funci\u00f3n \u00abdevstate\u00bb&#8230; si es as\u00ed, usamos la funci\u00f3n <strong>PickupChan<\/strong>.<br \/>\nY ya la tenemos funcionando \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Aqu\u00ed tenemos otra entrada, que ha sido un marr\u00f3n con todas las de la ley. Asterisk es un producto que me encanta, pero a medida que crece en volumen, su comportamiento es \u00aberr\u00e1tico\u00bb&#8230;. es decir, a medida que crece en extensiones \/ usuarios o intentas hacer algo \u00abmultitenant\u00bb, te vas llevando sorpresa tras sorpresa, pero [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[28,141],"class_list":["post-1250","post","type-post","status-publish","format-standard","hentry","category-asterisk","tag-asterisk-2","tag-pickup"],"_links":{"self":[{"href":"https:\/\/diablo.craem.net\/index.php?rest_route=\/wp\/v2\/posts\/1250","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/diablo.craem.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/diablo.craem.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/diablo.craem.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/diablo.craem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1250"}],"version-history":[{"count":0,"href":"https:\/\/diablo.craem.net\/index.php?rest_route=\/wp\/v2\/posts\/1250\/revisions"}],"wp:attachment":[{"href":"https:\/\/diablo.craem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1250"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/diablo.craem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1250"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/diablo.craem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1250"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}