Issabel ISO (Latest): Download Here
Cloud Services: User Portal - Quick Guide
News: Telegram channel
Become a Patron!
  • General
  • SOLICITUDES DE MEJORAS CODIGO - MODULOS

casoft No te preocupes :D es normal nos pasa a todos :D

ya por fin creo que lo tengo todo terminado y ha quedado creo que muy bien o al menos aparentemente :D

paso en unos minutos todo lo que he modificado para que puedas probarlo y si esta todo ok subirlo para que lo añadan :D o avisarme cualquier fallo y lo vemos.

se puede mejorar mas cosas pero ya poco tiempo libre tengo estos dias y ahora quiero centrarme en una adaptacion que tengo que realizar para un cliente

    bien ya tengo el tiempo para explicarlo todo. Se puede mejorar bastante todavía y ponerlo para todos los idiomas y de más, pero eso ya es mas tiempo que ahora no tengo, invito a todos los que quieran poder modificarlo para que el idioma se ponga directamente según el que se tenga desde el panel y hacerlo mas completo.

    Voy a poner paso a paso todo el código de nuevo modificado para evitar errores.

    modulo campain_monitorign crear carpeta libs y dentro

    libs/PaloSantoBreaks.class.php

    y dentro

    <?php
    / vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4:
    Codificación: UTF-8
    +----------------------------------------------------------------------+
    | Issabel version 0.5 |
    | http://www.issabel.org |
    +----------------------------------------------------------------------+
    | Copyright (c) 2006 Palosanto Solutions S. A. |
    +----------------------------------------------------------------------+
    | The contents of this file are subject to the General Public License |
    | (GPL) Version 2 (the "License"); you may not use this file except in |
    | compliance with the License. You may obtain a copy of the License at |
    | http://www.opensource.org/licenses/gpl-license.php |
    | |
    | Software distributed under the License is distributed on an "AS IS" |
    | basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See |
    | the License for the specific language governing rights and |
    | limitations under the License. |
    +----------------------------------------------------------------------+
    | The Initial Developer of the Original Code is PaloSanto Solutions |
    +----------------------------------------------------------------------+
    $Id: new_campaign.php $
    /

    include_once("libs/paloSantoDB.class.php");

    / Clase que implementa breaks /
    class PaloSantoBreaks
    {
    var $_DB; // instancia de la clase paloDB
    var $errMsg;

    function PaloSantoBreaks(&$pDB)
    {
        // Se recibe como parámetro una referencia a una conexión paloDB
        if (is_object($pDB)) {
            $this->_DB =& $pDB;
            $this->errMsg = $this->_DB->errMsg;
        } else {
            $dsn = (string)$pDB;
            $this->_DB = new paloDB($dsn);
    
            if (!$this->_DB->connStatus) {
                $this->errMsg = $this->_DB->errMsg;
                // debo llenar alguna variable de error
            } else {
                // debo llenar alguna variable de error
            }
        }
    }
    
    /**
     * Procedimiento para obtener la cantidad de los breaks existentes. Si
     * se especifica id, el listado contendrá únicamente el break
     * indicada por el valor. De otro modo, se listarán todas los breaks.
     *
     * @param int       $id_break    Si != NULL, indica el id del break a recoger
     * @param string    $estatus    'I' para breaks inactivos, 'A' para activos,
     *                              cualquier otra cosa para todos los breaks.
     *
     * @return array    Listado de breaks en el siguiente formato, o FALSE en
     *                  caso de error:
     *  array(
     *      array(id,name,description),....,
     *  )
     */
    
    
    function Ver_Agendadas($idcampana)
    {
    $sPeticionSQL = 'SELECT * FROM calls where scheduled = 1 and id_campaign='.$idcampana;

    //die($sPeticionSQL);
    $id_break="";
    $recordset = $this->_DB->fetchTable($sPeticionSQL, FALSE, $paramSQL);
    return $recordset;
    }

    }

    ?>

    ==============================

    crear el fichero libs/cambiar_llamada_agendada.php

    vi libs/crear_llamada_agendada.php

    <?php
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL & ~E_NOTICE);
    /
    CREADO POR HGMNETWORK.COM 31-07-2018 para permitir hacer cambios en las llamadas agendadas en modulo call center estos cambios pueden ser por el cambio de la fecha de la llamada ( fecha inicial, final y horas ) y cambio en el agente que recibe la llamada. Este puede ser SIP/xxx o Agent/xxxx la variable cambio indica lo que se cambia, cambio=fecha o cambio=agente por defecto cambiamos siempre agente y fecha y hora
    /

    $module_name="campaign_monitoring";
    require_once "/var/www/html/modules/$module_name/configs/default.conf.php";

    include_once("/var/www/html/libs/paloSantoDB.class.php");
    // se conecta a la base
    $pDB = new paloDB($arrConfModule['cadena_dsn']);
    if ($pDB->connStatus){ echo "ERR: failed to connect to database: ".$pDB->errMsg; };

    //miramos si agente tiene indicado algo o nulo osea cualquier agente recibira la llamada agendada
    if ($GET['agente'] !="cualquiera") {$sql_agente=" agent='".$GET['agente']."'";} else {$sql_agente=" agent = NULL";};
    switch ($GET['cambio']){
    default:
    $sPeticionSQL = "UPDATE calls set $sql_agente, date_init='".$
    GET['date_init']."',date_end='".$GET['date_end']."', time_init='".$GET['time_init']."',time_end='".$GET['time_end']."' where scheduled = 1 and id ='".$GET['id']."'";
    };
    // $recordset = $pDB->fetchTable($sPeticionSQL, FALSE);
    // $recordset = $pDB->genExec($sPeticionSQL);
    $result = $pDB-> getFirstRowQuery($sPeticionSQL, true);

    echo "Actualizada Llamada ".$GET['id']." al agente ".$GET['agente']."";
    ?>

    ===================================

    luego en index.php

    buscar

    case 'checkStatus':
    $sContenido = manejarMonitoreo_checkStatus($module_name, $smarty, $local_templates_dir);
    break;
    case 'loadPreviousLogEntries':
    $sContenido = manejarMonitoreo_loadPreviousLogEntries($module_name, $smarty, $local_templates_dir);
    break;

    y debajo poner

    case 'ver_agendadas':
    //Genera listado con las llamadas programadas
    $sContenido = ver_agendadas($module_name,$smarty, $local_templates_dir,$pDB,getParameter('idcampana'));
    break;

    justo debajo esta

    default:
        // Página principal con plantilla
        $sContenido = manejarMonitoreo_HTML($module_name, $smarty, $local_templates_dir);
    }
    return $sContenido;

    }

    y añadir la funcion

    function ver_agendadas($module_name,$smarty, $local_templates_dir,$pDB, $idcampana )
    {

    $oBreaks = new PaloSantoBreaks($pDB);
    $oAgentes = new Agentes($pDB);
    $listaAgentes = $oAgentes->getAgentsTodos();

    // print_r($listaAgentes);
    $datos=$oBreaks->Ver_Agendadas($idcampana);

    $micon='[<a href="index.php?menu=campaign_monitoring#/details/outgoing/'. $_GET['idcampana'].'">Monitoreo de Campaña</a>]<br />';

        $micon.='<b>Llamadas agendadas</b><br><br>
    
        <table width="100%">
                <tr style="color: #000000;">
                <td><b>N.TELEFONO</b></td>
                <td><b>AGENTE</b></td>
                <td><b>FECHA PROGRAMADA</b></td>
                <td><b>HORA PROGRAMADA</b></td>
                <td><b>ESTADO</b></td>
                <td><img src="images/telephone_edit.png" width="16" height="16" /></td>
                </tr>';

    $cont = count($datos);
    for ($i=0;$i<=$cont -1;$i++)
    {
    $nag="";
    $issel="";
    $miag="";

    //echo "datos $i es:".print_r($datos[$i])."<hr>";
    foreach (array_keys($listaAgentes) as $k)
    {
    //echo "k es $k<br>2";
    //echo "<hr> Agentes es ".print_r($listaAgentes[$k]);
    //$agnum=explode('/',$datos[$i][19]);
    $tipo=$listaAgentes[$k]['type'];
    $numero=$listaAgentes[$k]['number'];
    $seleccion=$tipo."/".$numero;//ponemos esto para ver si seleccionamos el usuario asi queda SIP/xxx o Agents/xxx
    //$datos[$i][19] nos da el texto que tiene cada extension, si el numero que da en agendada es igual al que se tiene en este se selecciona
    if ($seleccion==$datos[$i][19]){
    $issel="selected";
    } else{
    $issel="";
    };
    $miag.="<option value='$tipo/$numero' $issel>$tipo/$numero</option>";
    }
    // hgmnetwork.com 05-08-2018. creamos esto para que permita tambien asignar a cualquier agente
    $miag.="<option value='cualquiera'";
    if ($datos[$i][19] == null){ $miag.=" selected";};
    $miag.=">Cualquier Agente</option>";
    // hgmnetwork.com 03-08-2018 $datos nos da la info mostramos cual es cada cosa para saberla
    //.$datos[$i][19].
    //$datos[$i][0]=> nos da el id del registro en calls
    //$datos[$i][1]=> nos da el id_campaing del registro en calls
    //$datos[$i][2]=> nos da el numero
    //$datos[$i][3]=> nos da el resultado de la llamada null si no se ha llamado, Success,ShortCall,NoAnswer,Failure,etc
    //$datos[$i][15]=> fecha inicial de llamada el 16 fecha final
    //$datos[$i][17]=> hora inicial de llamada 18 hora final de llamada
    if ($datos[$i][3]==NULL){$resultado_llamada="Sin llamar";} else {$resultado_llamada=$datos[$i][3];};
    $micon.='<tr style="height: 40px;color:#000000">
    <td><strong>'.$datos[$i][2].'</strong></td>
    <td><select class="cambioagendadas" id="agente-'.$datos[$i][0].'">'.$miag.'</select></td>
    <td><input type="date" name="date_init" id="date_init-'.$datos[$i][0].'" value="'.$datos[$i][15].'">/<input type="date" name="date_end" id="date_end-'.$datos[$i][0].'" value="'.$datos[$i][16].'"></td>
    <td><input type="time" name="time_init" id="time_init-'.$datos[$i][0].'" value="'.$datos[$i][17].'">/<input type="time" name="time_end" id="time_end-'.$datos[$i][0].'" value="'.$datos[$i][18].'"></td>
    <td>'.$resultado_llamada .'</td>
    <td><img src="images/time_edit.png" name="actualizar" id="'.$datos[$i][0].'" width="16" height="16" alt="Actualizar Fecha y hora" title="Actualizar Fecha y hora"/></td>
    </tr>';
    }

    $micon.= '</table>
    </div>';

    return $micon;
    }

    ===============================================

    editar el fichero themes/default/informacion_campania.tpl

    vi informacion_campania.tpl

    buscar
    <b>{$ETIQUETA_CAMPANIA}:</b>
    {literal}
    {{view Ember.Select
    contentBinding="content"
    optionValuePath="content.key_campaign"
    optionLabelPath="content.desc_campaign"
    valueBinding="key_campaign" }}
    {/literal}

    {literal}{{outlet}}{/literal}

    </script>

    y añadir justo debajo

    <!--
    creado por hgmnetwork.com 09-07-2018 para pruebas
    funcion para obtener el id de campaña en funcion del hash ejemplo #/details/outgoing/10 nos devuelve 10
    -->
    <script>
    function obtener_idcampania (){
    //alert("entra");
    var URLactual = window.location.hash;
    //alert(URLactual);
    var idcampania = URLactual.replace("#/details/outgoing/", "");
    //console.log(idcampania);
    console.log("el id de campania es " + idcampania);
    document.location.href="index.php?menu=campaign_monitoring&action=ver_agendadas&idcampana=" + idcampania;
    }

    </script>

    [ <a href="javascript:obtener_idcampania();">ver llamadas Agendadas</a> ]

    =======================================

    editar el fichero themes/default/js/javascript.php

    ir al final del fichero nos encontramos esto

    function mostrar_mensaje_error(s)
    {
    $('#issabel-callcenter-error-message-text').text(s);
    $('#issabel-callcenter-error-message').show('slow', 'linear', function() {
    setTimeout(function() {
    $('#issabel-callcenter-error-message').fadeOut();
    }, 5000);
    });
    }

    justo debajo ( al final del fichero añadimos esto)

    //funcion para actualizar las llamadas agendadas hgmnetwork.com 30-07-2018

    $(document).ready(function()
    {

    $("[name=actualizar]").click(function () {
    //alert("Click en actualizar fecha y hora agendada themes/default/js/javascript");
    //alert("Id Llamada " + this.id);
    //alert("Id llamada " + $(".cambioagendadas").attr("id"));
    //alert("Nuevo Agente: "+ $("#agente-"+this.id).val());
    //alert("Fecha nueva inicial "+ $('#date_init-'+this.id).val());
    //alert("Fecha nueva final " + $('#date_end-'+this.id).val());
    //alert("Hora nueva inicial "+ $('#time_init-'+this.id).val());
    //alert("Hora nueva final " + $('#time_end-'+this.id).val());

    $.ajax({
    url: "/modules/campaign_monitoring/libs/cambiar_llamada_agendada.php",
    type: "get", //send it through get method
    data: {
    id: this.id,
    agente: $("#agente-"+this.id).val(),
    date_init: $('#date_init-'+this.id).val(),
    date_end: $('#date_end-'+this.id).val(),
    time_init: $('#time_init-'+this.id).val(),
    time_end: $('#time_end-'+this.id).val(),
    cambio: 'todo'
    },
    success: function(response) {
    //Do Something
    alert(response);
    console.log(response);
    },
    error: function(xhr) {
    //Do Something to handle error
    console.log('error cambiar_llamada_agendada.php');
    console.log(xhr);
    alert("Se ha producido un error al actualizar la llamada agendada.")
    }
    });

    });

    });

    y listo con eso queda completo o deberia. espero lo puedan probar y confirmarme si esta ok tambien de su lado

    creo que ha quedado bastante bien y muy entendible y fácil y sobre todo útil.

    @casoft mil gracias por tu ayuda, ha sido muy util y sin ti no se podria tener esta mejora, estaré encantado de si se te ocurre alguna otra podamos entre ambos realizarla.

      4 days later

      hola a Todosl acabo de hacer un pull request sobre las llamadas agendadas, creo que lo puse todo correcto ya si alguien puede probarlo genial y si falla algo que avise.

      Espero que sea de utilizada para todos ! :D gracias a casoft tambien por su ayuda.

      tambien he añadido otra pequeña mejora que hice hace un tiempo para la lista de campañas salientes ahora la pondre aquí para quienes quieran usarla

        MEJORA MODULO CALL CENTER : LISTADO CAMPAÑAS SALIENTES MOSTRAR TOTAL LLAMADAS, PENDIENTES Y COMPLETADAS

        En el listado de campañas salientes solo aparecia el total de llamadas y me parecia poca información si queria ver cuantas llamadas estaban pendientes para finalizar la campaña tenia que ir una a una mirando.

        cree una pequeña y rapida mejora que muestra el total de llamadas de cada campaña, las pendientes por hacer y las que han sido completadas asi facilmente se ve mas rapido, espero que les sea util y les guste, he solicitado un pull request como mejora para futuras actualizaciones.

        les copio el codigo para quienes quieran usarlo

        ===============
        en el fichero
        /var/www/html/modules/campaign_out/index.php

        buscamos sobre linea 150 creo

        151     if (is_array($arrCampaign)) {
        152         foreach($arrCampaign as $campaign) {

        aqui añadimos esto

        /
        creado por hgmnetwork.com 08-08-2018 para mostrar en el listado de campañas el total total llamadas de cada campaña, las pendientes y las completadas sin tener que revisar una por una
        miramos el total de numeros que tiene cada campaña
        /
        //echo " mirando campaña $campaign[id]<hr>";
        $total_numeros = $pDB->fetchTable("select id from calls WHERE id_campaign ='".$campaign[id]."'"); //obtenemos el total de numeros e n la campaña
        $total_numeros_campana=count($total_numeros);
        /ahora miramos el total de llamadas pendientes de hacer/
        $total_numeros = $pDB->fetchTable("select id from calls WHERE id_campaign ='".$campaign[id]."' AND datetime_originate IS NULL");
        $total_numeros_pendientes=count($total_numeros);

        //echo " total numeros campaña $campaign[id] es:".count($total_numeros)."<hr>";

        luego buscamos la linea un poco mas abajo

        ($campaign['num_completadas'] != "") ? $campaign['num_completadas'] : "N/A",

        y la sustituimos por esta

        ($campaign['num_completadas'] != "") ? "Lla. Total: $total_numeros_campana<br> Pendientes: $total_numeros_pendientes<br> Completadas: ". $campaign['num_completadas'] : "Llam. Total: $total_numeros_campana<br> Pendientes: $total_numeros_pendientes<br> Completadas: 0",

        y listo !!
        ahora les aparecerá el total de llamadas, las pendientes y las completadas por cada campaña :D

          Amigos, buena tarde.
          Tengo una demanda, y me gustaría la ayuda de ustedes cómo implementar esto.
          Siguiente ...
          Necesito cargar el CSV para una Campaña en el siguiente formato:

          TELEFONE,TELEFONE1,TELEFONE2,TELEFONE3,TELEFONE4,TELEFONE5,TELEFONE6,TELEFONE7,TELEFONE8,TELEFONE9,CODIGO,FILTRO,NOME,BANCO,MUNICIPIO,UF

          Necesito que el sistema entienda más teléfono del cliente en la misma línea, y también inserte en el banco para marcar.

          ¿Podría ayudarme a crear? Si quieres cobrar por el servicio, ¡bien!

          Desde ya, gracias.

            wagnerspbh se puede programar pero es algo complicado para hacerlo bien ya que entiendo que si le pones en la campaña reintentos 3 se llamaría a cada número tres veces si no se contacta.

            Si se llama al primero y no responde sería al segundo y así con todos teniendo prioridad el primero. Pero si es shotcall ?

            Por otro lado cuanto estarías dispuesto a pagar para hacerlo? Para que se pueda valorar si merece la pena el tiempo y esfuerzo

              7 days later

              hola hgmnetwork

              al loguearse un call back agent en el listado de los mismos aunque estén logueados salen off line. No he probado campañas pero si se que entran las llamadas a agentes dinamicos logueados. Sin embargo es importante por agentes vagabundos que no se loguean para no recibir llamadas que el supervisor vea el estado.

              Existe el procedimiento para actualizar el estatus? lo realizo manual o si ya por el contrario se resolvió recientemente de pronto es un yum update?
              Estoy con el iso de enero/2018 y actualizado completamente hasta hace un par de semanas.

              gracias de antemano

                Efectivamente si usas agentes callback aparecen desconectados solo está pensado para agentes. Habría que ver cómo modificar el código para hacer que aparezcan. Pero esto requiere de programación y. Tiempo. Es decir un coste por hacerlo o esperar a que alguien lo haga y comparta o se actualice.

                  asternic Hola, hace varios dias subi algunas mejoras para que sean actualizadas, no se si estas de vacaciones o no has podido verlas. En cuanto las revises por favor avisame.

                  Por otro lado seria bueno poner o si tienes algun sitio donde este en changelog para que podamos todos ir viendo las fechas y las cosas que se van mejorando.

                    7 days later

                    @asternic estas operativo ? todavía veo pendientes las mejoras que envié hace ya unas semanas, estoy por enviar en breve otra mejora para en modulo call center realizar escuchas con un click pero me esperaré a que primero pongas las actuales o si están mal o algo no dudes en avisarme.

                      Hola @hgmnetwork. Estoy operativo, pero redondeando el release de una nueva versión, por lo que no van a ir incluidas cosas nuevas. Estamos en un feature freeze hace unos 10 días más o menos. Con respecto a algunos de los pull requests que has hecho, tendré que revisarlos, de una rápida lectura creo que hay algunas cosas incompletas o en lugares incorrectos. Pero eso lo veré luego de lanzado el .iso nuevo y los updates correspondientes en los repositorios.

                      Saludos,

                        asternic Hola, ok en cuanto lancen el nuevo y lo revises avisame si cambia algo y lo veo para ponerlo en los ficheros correctos y poder tener esas opciones para el siguiente :D

                          5 days later

                          Hola, para contar siempre con la ultima versión basta solo con ejecutar ( yum update ) ? o me estaria faltando algo ? Muchas gracias

                            si sabes linux es son las opciones. si no sabea a prender urgente.

                              Hola @hgmnetwork estoy trabajando en adaptar el modulo de callcenter a la versión 13 de asterisk. No soy un desarrolador de profesión, mis conocimientos en esta área los he aprendido por la necesidad y la experiencia. He logrado adaptar algunos scripts para gestionar las colas de atención y escribir el formato correcto de la nueva versión para los agentes, también la pantalla de agent options -> agents, donde se crea, edita o elimina agentes.

                              También he tocado algunos ficheros del modulo ECCP sin embargo me encuentro atascado aquí, puesto que este módulo es sumamente extenso y con multitud de clases. ¿Quizá podemos colaborar para lograr adaptar el callcenter a la nueva versión?

                              Soy bueno con asterisk y herramientas como AGI, AMI. Por lo cual entiendo los conceptos de Actions y Events del AMI para modificar el ECCP.

                              Coméntame por favor: elitatmon@gmail.com

                                etates hola me parece genial y encantadonde ayudar. pero debemos esperar a que saquen la veesion nieva hafe poco indicaron que sadarian cosas nievas y cambiarian variosnficheros de hay que estoy lendiente de esta actuakizaxion para las mejoras que he reakizado. en cuanto la saquen poeemos ver en conjunto el adaptar el xall center a la version 13 ya que seria lo ideal

                                Si creo que eso es lo mejor, con todo guardaré los cambios que ya he hecho para volverlos a implementar en la nueva versión. Ojala salga pronto.

                                hgmnetwork Si van github al proyecto, hay estan los commint con los cambios y como va a quedar.

                                si utilizan github es facil contribuir en el proyecto,

                                  etates Hola, hice un fork con algunos cambios y documentación, puedes clonar y comparar, y si tienes otras cosas hacer un pull request o avanzar en conjunto:

                                  https://github.com/asternic/callcenter

                                  Solo debo aclarar algo. No es tan sencillo como destripar el código y hacerlo andar con Asterisk 13, el mismo debe serguir funcionando con Asterisk 11 en lo posible. Si esto es demasiado trabajo entonces se puede pensar en desdoblar en versiones espcíficas de acuerdo a la versión de Asterisk instalada, pero va en contra de la facilidad de instalación y administración, por lo tanto hay que hacer modificaciones que no sean disruptivas para Asterisk 11.

                                  Saludos,

                                    etates con ese fork, puedes ir revisando los cambios. Si necesitas mi ayuda o revisar codigo o lo que necesites, no dudes en avisarme o ponerlo por aqui y en cuanto tenga un hueco reviso el codigo y hacemos pruebas.

                                    asternic efectivamente lo ideal seria que funcione en ambas versiones, y seria muy buena esa opción, pero si los cambios son facilmente subsanables, si requieren de muchos cambios y complicaciones, veo mejor dejarlo ya para futuras instalaciones con asterisk 13 que con el 11, al igual que ahora no funciona con el 13 quien instale en el futuro el 11 no le funcionaria, pero con el 13 sí.

                                    quedo a su entera disposición para ayudar en lo que pueda @etanes ya me diras como puedo ir ayudandote.

                                    tambien tengo varios cambios y mejoras que he realizado pendiente de saber en el nuevo codigo que sacarán.

                                    He creado un sistema para que un usuario pueda acceder y ver los CDR y el resumen las grabaciones de una o varias extensiones sin problema :D algo creo muy util porque ahora mismo solo permite 1 usuario = 1 extension y no pueden ver el summary ya que si no verian todo.

                                    Otra cosa que estoy terminando en campaing monitorin es con un click realizar escucha al agente que se desee

                                    otra opciónes son las que he subido pendiente de revision

                                    PD: Disculpen si a veces parece que escribo raro, es que si lo hago desde el movil me cambia palabras