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

hgmnetwork es muy cierto, revisare como listar las extensiones de CallBack.
Ti me puedes regalar un pantallaso de la tabla
SELECT * FROM calls where scheduled='1'
Donde se vea la tabla agent para ver como las esta guardando issabel!
Con esto reviso como hacerlo y de una lo incluimos

    casoft en el campo de agent sale SIP/xxxx donde xxxx es la extension del agente como tal( por ejemplo SIP/1234). Eso si esta asignada a un agente, si no sale null.

    si necesitas alguna otra cosa avisame y te la envio y la pruebo :D
    intenté subir un pantallazo pero aqui no me deja subir imagenes si te hace falta mañana lo subo a la web y te lo envio

      hgmnetwork excelente, entonces resulta más sencillo de lo que creí.
      Ahora más tarde realizaré la actualización correspondiente.

      Gracias

        genial ! :D asi reviso el codigo y pruebo y lo actualizo al mio. Espero entre el domingo y lunes tener un poco de tiempo y ver como hacerte lo del script que necesitas para cambiar al agente. si actualizas el codigo y me avisas lo pruebo e intenteo hacer el script para que ejecute el cambio y te aviso para que puedas realizarlo :D

          Me di cuenta de que las llamadas que se originan por el módulo de Call Center en Issabel no se guardan. ¿Tiene corrección para eso? ¿Alguien me puede ayudar con esta información?

            5 days later

            casoft No debes copiarlas, si las librerias existen y estan en cierta ubicación, hay que requerirlas de esa ubicación. Saludos,

            casoft Hola Casoft, siento la tardanza pero ando bastante liado hoy he tenido alguna hora libre y he podido revisar el código y ponerme con ello.

            He modificado algunas cosas ya que en el listado que añadiste nuevo ( muy bueno eso por cierto :D ), pasaba lo mismo, solo salían los Agentes (Agents) y no los call back, así que he modificado algunas cosas del código para que se muestren los agentes y los Call back también.

            También aparecía debajo la casilla de agentes vacía y lo he modificado para que salga bien ( simplemente en el index.php de campaign monitoring es cambiar esto
            $cont = count($datos);
            for ($i=0;$i<=$cont;$i++)

            por
            //le restamos 1 al total para evitar que añadia fila ultima sin datos hgmnetwork.com 29-07-2018
            for ($i=0;$i<=$cont -1;$i++)

            con los cambios que he realizado solo queda hacer que al cambiar de agente lo almacene en la db que esto ya lo dejo para otro dia porque hoy ni tiempo , pero ya va teniendo mas forma :D

            esta quedando muy bien creo :D.

            Te digo los cambios que he realizado, para que puedas hacerlos y ver los resultados y comentar que te parecen

            y a los demás que lo tengan para pruebas tambien.

            modulo /var/www/html/modules/campaign_monitoring/index.php

            vi /var/www/html/modules/campaign_monitoring/index.php

            modifique el index.php y busque esto

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

            y cambie por

            $oBreaks = new PaloSantoBreaks($pDB);
            $oAgentes = new Agentes($pDB);
            //modificamos getAgenttodos para obtener agentes y calback hgmnetwork.com 29-07-2018
            $listaAgentes = $oAgentes->getAgentsTodos();

            luego en esa misma pagina

            buscar debajo

            foreach (array_keys($listaAgentes) as $k)
            {


                $agnum=split('/',$datos[$i][19]);
                $nag=$listaAgentes[$k]['number']; 
                if ($nag==$agnum[1])
                    $issel="selected";
                else
                    $issel="";
                $miag.="<option value='$nag' $issel>Agent/$nag</option>";
            }

            y cambiar por

            foreach (array_keys($listaAgentes) as $k)
            {
            $tipo=$listaAgentes[$k]['type'];
            $numero=$listaAgentes[$k]['number'];
            if ($listaAgentes[$k]['number']==$numero)
            $issel="selected";
            else
            $issel="";
            $miag.="<option value='$tipo/$numero' $issel>$tipo/$numero</option>";
            }

            luego en
            /var/www/html/modules/agents/libs

            vi /var/www/html/modules/agents/libs/Agentes.class.php

            cree la función de agentes todos es básicamente una replica de la otra pero evitando mostrar solo Agentes así muestro todos agentes y Call back Activos y añadiendo el tipo de agente SIP o Agent y añado el tipo de agente ( type).

            //funcion creada para obtener todos los agentes y extensiones call back loging hgmnetwork.com 29-07-2018

            function getAgentsTodos($id=null)
            {
            // CONSULTA DE LA BASE DE DATOS LA INFORMACIÓN DE LOS AGENTES
            $paramQuery = array(); $where = array("estatus = 'A'"); $sWhere = '';
            if (!is_null($id)) {
            $paramQuery[] = $id;
            $where[] = 'number = ?';
            }
            if (count($where) > 0) $sWhere = 'WHERE '.join(' AND ', $where);
            $sQuery =
            "SELECT id, number, name, password, estatus, eccp_password,type ".
            "FROM agent $sWhere ORDER BY number";
            echo " query: $sQuery";
            $arr_result =& $this->DB->fetchTable($sQuery, true, $paramQuery);
            if (is_array($arr_result)) {
            if (is_null($id) || count($arr_result) <= 0) {
            return $arr_result;
            } else {
            return $arr_result[0];
            }
            } else {
            $this->errMsg = 'Unable to read agent information - '.$this->
            DB->errMsg;
            return NULL;
            }
            }

            y listo ya obtenemos los agentes ( Agents y los callback login :D )

            otro pequeño cambio fue en lo que tenias

            cambie

            $agnum=split('/',$datos[$i][19]);

            por

            $agnum=explode('/',$datos[$i][19]);

            ya que split esta obsoleto a partir de php 5 para evitar errores futuros

            espero que sea de ayuda y guste :D espero en estos dias tener un hueco para poder hacer lo del cambio con jquery si puedes ir haciendo tu un php o similar que se le pueda pasar por get valores como el id y el agente por ejemplo para actualizar la tabla de llamadas y que quede cambiado seria genial :D

            lo mismo para cambiar la fecha y hora de la llamada, espero en estos dias poder hacerlo, asi entre los dos lo dejamos terminado o al menos funcional al completo :D

              Hola a todos, ya tengo echo el cambio pero tengo un problema que no he podido resolver a ver si me echan un cable.

              Ya hice que al cambiar el agente llame a una pagina por jquery y ajax que meti dentro de libs

              esa pagina al llamarla por get le paso el id de la llamada y el agente nuevo a cambiar

              lo que no consigo hacer es que me ejecute un query me da error al conectar

              tengo esto

              require_once "../configs/default.conf.php";

              include_once("/var/www/html/libs/paloSantoDB.class.php");
              // se conecta a la base
              $pDB = new paloDB($arrConfModule['cadena_dsn']);

              $sPeticionSQL = "UPDATE calls set agent='".$GET['agente']."' where scheduled = 1 and id ='".$GET['id']."'";
              };
              $recordset = $this->DB->fetchTable($sPeticionSQL, FALSE, $paramSQL);
              // $recordset = $this->
              DB->genExec(($sPeticionSQL,FALSE );

              el problema que tengo es que me da error 500 y no tengo forma en cuanto le hago el

              $pDB = new paloDB($arrConfModule['cadena_dsn']);

              que la variable seria algo asi

              $pDB = new paloDB(mysql://asterisk:asterisk@localhost/call_center);

              en cuanto activo esa opcion me da error 500

              y luego

              no se si esta bien
              $recordset = $this->DB->fetchTable($sPeticionSQL, FALSE);
              fetchTable para ejecutar el query
              o
              // $recordset = $this->
              DB->genExec(($sPeticionSQL,FALSE );

              gen Exec

              o cual usar para hacer el update

              si alguien me puede echar un cable en esto lo termino pronto :D si no tendre que esperar a que tenga mas tiempo libre para ver como solucionarlo

                he cambiado algunas cosas el problema lo tengo al conectar a la db que no se como hacerlo

                tengo esto

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

                include_once("/var/www/html/modules/$module_name/libs/paloSantoDB.class.php");
                echo " cadena destino: ". $arrConfModule['cadena_dsn'];
                // se conecta a la base
                // $pDB = new paloDB($arrConfModule['cadena_dsn']);
                $this->_pDB = new paloDB($arrConfModule['cadena_dsn']);

                tanto si uso $pDB = new paloDB($arrConfModule['cadena_dsn']);
                como $this->_pDB = new paloDB($arrConfModule['cadena_dsn']);

                no me conecta y el script se para en esa parte

                a ver si alguien me echa un cable para poder hacerlo funcionar :D

                  Hoy he tenido mas tiempo a entender el funcionamiento, les adelanto que ya consigo hacer el cambio sin problema del agente agendado y he añadido otra mejora para volver al campaign monitoring

                  espero poder en estos dias y avisar los cambios finales

                  tambien mejore algunas cosas, ahora muestra la fecha programada de la llamada la inicial y la final y la hora programada inicial y la final

                  y en el resultado de llamada si no se habia realizado no salia nada ahora lo detecta y pondrá Sin Llamar, pero se puede indicar cualquier otro texto similar.

                  queda basicamente asi

                  [Monitoreo de Campaña] <-------- esto lo añadi nuevo para poder ir de llamadas agendadas al monitoreo y va a la misma campaña que tenemos en agendadas.

                  Llamadas agendadas

                  N.TELEFONO AGENTE FECHA PROGRAMADA HORA PROGRAMADA ESTADO
                  xxxxxxxxxx yyyy 2018-07-18/2018-07-26 16:00:00/17:00:59 Sin llamar
                  xxxxxxxxxx yyyy 2018-08-22/2018-08-31 10:00:00/19:00:59 NoAnswer

                  donde pone yyy en los agentes es el select con el agente seleccionado y todos los que se tengan, tambien añadi la opcion de cualquier Agente para poder no tener que forzar a un determinado agente.

                  asi creo que queda mas completo.

                  espero mañana poder hacer el boton de cambio de fecha y horas y con eso creo que quedaría muy completo :D

                  si lo tengo listo mañana o el lunes pasaré el codigo para que lo vean y si les parece bien hago un commint para que lo añadan

                    si a ver que tal queda, ya va quedando menos en cuanto tenga un hueco lo intento terminar.

                    tengo otras ideas de mejora como es en el modulo call center en campañas salientes poder indicar un callerid por cada campaña ya que ahora solo usa el caller id para todas las campañas que se indique en el sip trunk y eso a veces es complicado seria muy bueno poder indicar a cada campaña que caller id saliente se quiere poner y poderlo cambiar facilmente.

                    Tambien hoy mismo he visto por el telegram en el grupo el modulo bsmart que permite ver las llamadas activas y desconectar las llamadas via web, he conseguido el codigo para ver como funciona ya que esta para elastix lo he puesto en el foro para quien quiera y pueda seria bueno si algun otro ingeniero puede revisarlo y adaptarlo a issabel.

                    Hay muchas cosas que se pueden mejorar a nivel de software lo unico que hace falta que varios ingenieros echen una mano y ayuden aunque sea con parte del codigo.

                    Gracias a @casoft que hizo la parte principal de las llamadas agendadas he podido hacer yo el resto y entre los dos tener otra mejora. A Ver si mas ayudan con estas cosas y asi hacemos de issabel un software mas util, mejor y mas práctico para todos.

                      @hgmnetwork perdon la desconexion pero he estado con demaciado trabajo. Exceñente todos los avances logrados, sin falta espero esta semana cojer lo que has montado y integrarlo en el codigo que tenia para dejarlo listo en el git.
                      Igualmente revisare lo que comentas para mirar y probar.

                        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