viernes, 2 de octubre de 2020

audio antes de llamar call center ...

 https://forum.issabel.org/d/3008-reproducir-primero-audio-antes-de-sacar-llamada


I don't think you can do it using the GUI, but you can do it through dialplan.

INSTRUCTIONS
1> Find the outbound route you want that message played.

My outbound route name = "international"

2> In "SYSTEM RECORDINGS", create the recording that you would want played.

example "Warning International call being made"

save as "internationalwarning"

3> open /etc/asterisk/extensions_additional.conf

Find your outbound route in this dialplan. Below is an EXAMPLE of what mine looked like.
Yours will be similar, " [OUTRT-XX]; NAME " will be different as will some of the phone numbers.

My example, calls that start with 011 as the number that is called that uses this trunk.

------ example ---------------

[outrt-1] ; international
include => outrt-1-custom
exten => _011.,1,Macro(user-callerid,LIMIT,EXTERNAL,)
exten => _011.,n,Set(MOHCLASS=${IF($["${MOHCLASS}"=""]?default:${MOHCLASS})})
exten => _011.,n,Set(_NODEST=)
exten => _011.,n,Gosub(sub-record-check,s,1(out,${EXTEN},))
exten => _011.,n,Macro(dialout-trunk,2,${EXTEN:3},,off)
exten => _011.,n,Macro(outisbusy,)
;--== end of [outrt-1] ==--;

----- END EXAMPLE ---------------

4> COPY the entire code piece

5> OPEN /etc/asterisk/extensions_override_issabel.conf

PASTE the code into the bottom of this file.

6> You will need to insert a custom code in to play the recorded message.

Put the next line in 2 locations

exten => _011.,n,Playback(./custom/internationalwarning)

My dialplan example uses _011. Yours might be different so you will need to adjust it accordingly

[outrt-1] ; international
include => outrt-1-custom
exten => _011.,1,Macro(user-callerid,LIMIT,EXTERNAL,)
exten => _011.,n,Playback(./custom/internationalwarning)
exten => _011.,n,Set(MOHCLASS=${IF($["${MOHCLASS}"=""]?default:${MOHCLASS})})
exten => _011.,n,Set(_NODEST=)
exten => _011.,n,Gosub(sub-record-check,s,1(out,${EXTEN},))
exten => _011.,n,Macro(dialout-trunk,2,${EXTEN:3},,off)
exten => _011.,n,Playback(./custom/internationalwarning)
exten => _011.,n,Macro(outisbusy,)
;--== end of [outrt-1] ==--;

Save your changes

7> reload the config in asterisk CLI ( asterisk -cvvr then core reload)

TEST!

What will happen is, when asterisk goes to dial the code, it will run this custom code, play the message then continue the dialing.

martes, 22 de septiembre de 2020

dialer con entrada IVR

 FUNCIONA! Consulta estado de un caso mediante DTMF


Funciona!!!

Por fin he dado con ello.

SISTEMA COMPLETO DE ESTADO DE TICKETS USANDO ELASTIX Y OSTICKET.
-----------------------------------------------------------------

En primer lugar, creamos el siguiente archivo:

comprobarticket.php

#!/usr/bin/php -q
<?php
//llamamos a las librerías de phpagi
require("phpagi.php");
//activamos la bandera de enviar todo lo que se realice a consola como modo depuracion
error_reporting(E_ALL);
//creamos una instancia de la clase AGI
$agi = new AGI();
//generamos el comando Answer de Asterisk, este comando siempre lo ejecutamos al inicio de un AGI
$agi->answer();
//Este demo consultará información en una base de datos y regresará la información de forma hablada por lo que generamos una conexion a la base de datos de sql
$conexion = mysql_connect("LaIpDeTuServidorMysql","TuNombreDeUsuario","TuPass") or die("Error: El servidor no puede conectar con la base de datos");
//Referenciamos el cursor a la base de datos
mysql_select_db("NombreDeTuBBDD",$conexion);
//Reproducimos el archivo de audio que solicita que introduzca el número de ticket de soporte, del cual conocer su estado.
//El archivo de audio lo hemos grabado previamente desde elastix, y se almacena en /var/lib/asterisk/sounds/
//y viene a decir algo como: Despues del pitido, introduzca su número de ticket de soporte para conocer su estado actual, o marque 0 para salir.
$agi->exec(Playback,"introduceticket");
do {
//enviamos un beep y esperamos 25 segundos en la espera de una respuesta. Podemos cambiar el 'beep', por "Archivo_de_audio_propio"
$_result = $agi->get_data('beep', 3000, 25);
//obtenemos la información introducida desde el telefono
$numticket = $_result['result'];
//si introdujo un valor el cliente entonces creamos el string la consulta sql y la ejecutamos
if($numticket!=""){
$query = "select status from ost_ticket where ticketID=\"$numticket\" ";
$_result = mysql_query($query, $conexion);
//verificamos si existe un resultado
if($_re = mysql_fetch_array($_result)) {
//Comprobamos si el estado recuperado de la BBD es open
if ($_re[status] == "open") {
//y si es así, reproduzco un audio pregrabado llamado abierta que dice algo como: Su incidencia aún está en situación de resolverse. Vuelva a consultar su estado pasado pasadas unas horas.
$agi->exec(Playback,"abierta");
}
//Comprobamos si el estado recuperado de la BBD es closed
if ($_re[status] == "closed") {
//y si es así, reproduzco un audio pregrabado llamado cerrada que dice algo como: Su incidencia está resuelta. Puede recoger su equipo cuando desee.
$agi->exec(Playback,"cerrada");
}

}else{
//de lo contrario enviamos un mensaje de que el ticket no pudo ser encontrado
if ($numticket!='0'){
$agi->exec(Playback,"noencontrado");
}

}
if ($numticket!='0'){
$agi->exec(Playback,"introduceticket");
}
}

} while($numticket != '0'); //Continuamos solicitando números de ticket mientras el cliente no marque 0 para salir

//Reproducimos el archivo de audio de despedida, agradeciendo el uso del sistema.
//El archivo de audio lo hemos grabado previamente desde elastix, y se almacena en /var/lib/asterisk/sounds/
//y viene a decir algo como: Gracias por utilizar el sistema de control de tickets.
$agi->exec(Playback,"despedida");
//al finalizar el script del AGI siempre es recomendable ejecutar esta función para no dejar el canal abierto.
$agi->hangup();
?>

Una vez echo esto, subirlo al servidor mediante WinSCP o similar a la ruta /var/lib/asterisk/agi-bin/

A continuación, es importante que cambies los permisos del archivo a 775

Cread los archivos de audio. Para ello, leed los comentarios del archivo php creado.

Ahora, hay que crear la llamada al AGI de la siguiente manera:
Editar el archivo extensions_custom.conf y crea el siguiente contexto:

[custom-agiphp]
exten => 101,1,Answer
exten => 101,2,AGI(/var/lib/asterisk/agi-bin/comprobarticket.php)
exten => 101,3,Hangup

y añadirlo en

[from-internal-custom]
exten => 1234,1,Playback(demo-congrats) ; extensions can dial 1234
exten => 1234,2,Hangup()
exten => h,1,Hangup()
include => agentlogin
include => conferences
include => calendar-event
include => weather-wakeup
include => custom-agiphp

Salvamos.

Si llamamos a la extensión 101, ya debería funcionar.

Ahora, si queremos que funcione mediante el uso de IVR, tan solo hay que ir a MISC DESTINATIONS, y crear uno que sea, por ejemplo:

Descripción: tickets
Marcar: 101

Creamos el IVR con las opciones que queramos, entre ellas una que solicite acceder al sistema de control de tickets, en la cual, seleccionaremos como destino:

Misc Destinations: tickets.

Salvar.

Recomiendo reiniciar elastix y a funcionar.

Revisad bien la conexión a la BBDD y que seguramente tendréis que mover los audios creados de la carpeta /var/lib/asterisk/sounds/custom a /var/lib/asterisk/sounds/, si no, no oireis nada más que el beep.

Tienes varias opciones:

1. Accedes a la consola de tu elastix mediante la aplicación Putty, eso si, logueandote como root, y escribes lo siguiente:

cd /var/lib/asterisk/agi-bin (pulsas intro)
chmod 775 comprobarticket.php (pulsas intro)

Y ya está.

Opción 2. Hacer lo mismo, pero desde la consola local de la máquina, siempre y cuando tengas un teclado y pantalla conectado a tu elastix. En ese caso no necesitarías acceder mediante putty

Opción 3. Acceder a tu elastix mediante filezilla como root, e ir a la dirección /var/lib/asterisk/agi-bin. Una vez ahí veras el listado de archivos que la carpeta agi-bin contiene. Te posicionas sobre el archivo comprobarticket.php y pulsas botón derecho. Seleccionas cambiar permisos, y en el cuadro de abajo, borrar los números que vengan por defecto y escribes 775. Pulsas intro o guardar y listo.

viernes, 18 de septiembre de 2020

Instalar my php admin

 


yum -y install phpmyadmin 

despues modificar 


Ninguna de las configuraciones anteriores funcionó para mí en mi servidor CentOS 7. Después de horas de búsqueda, eso fue lo que funcionó para mí:

Edite el archivo phpMyAdmin.conf

sudo nano /etc/httpd/conf.d/phpMyAdmin.conf

Y reemplace el <Directory> ... </Directory>nodo existente con lo siguiente:

<Directory /usr/share/phpMyAdmin/>
   AddDefaultCharset UTF-8

   <IfModule mod_authz_core.c>
     # Apache 2.4
     <RequireAny>
       #Require ip 127.0.0.1
       #Require ip ::1
       Require all granted
     </RequireAny>
   </IfModule>
   <IfModule !mod_authz_core.c>
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1
     Allow from ::1
   </IfModule>
</Directory>

Campaña Call center 2 parte

 


Bueno ahora cambiamos de carpeta y vamos a Campañas salientes :


Vamos a crear un archivo descargar estos archivos de esta direccion IP y los vamos a cuadrar en la ubicación :

/var/www/html/modules/campaign_out

http://jksistemas.com.co/JK/Descargas/IP-JK/html/modules/campaign_out/campaign_out.tar

Los archivos están comprimidos debemos bajarlos e instalarlos ahí :

Ahora vamos a modificar el archivo ubicado en :

/var/www/html/modules/campaign_out/libs llamado :

paloContactInsert.class.php

Vamos a modificar esta linea :
-------------------------------------------
 'INSERT INTO calls (id_campaign, phone, status, dnc) VALUES (?, ?, NULL, ?)');
----------------------------------------
por esta :
----------------------------------------
 'INSERT INTO calls (id_campaign, phone, status, dnc, principal_contact, contactado, id_contacto) VALUES (?, ?, NULL, ?, ?, ?, ?)');
----------------------------------------


buscamos esta otra 

function insertOneContact($number, $attributes)

y la cambiamos por esta 
function insertOneContact($number, $attributes, $principal_contact, $contactado, $id_contacto)
 
Después esta 
$r = $this->_sth_contact_number->execute(array($this->_id_campaign, $number, $iDNC));

y la cambiamos por

$r = $this->_sth_contact_number->execute(array($this->_id_campaign, $number, $iDNC, $principal_contact, $contactado,$id_contacto));
 
Listo por ese lado ! 

Ahora vamos a modificar un archivo para que funcione y deje subir el archivos CVS con mas de un numero , vamos entonces a :

/var/www/html/modules/campaign_out/uploaders/CSV

Modificamos esto en ese archivo .
Este Reglón :

} elseif (!preg_match('/^([\d#\*])+$/', $tupla[0])) {
Y ponemos este reglón 

} elseif (!preg_match('/^([\d-#\*])+$/', $tupla[0])) {

Después vamos a quitar este  Reglón :


$idCall = $inserter->insertOneContact($numero, $atributos);

Y vamos a poner todo este Código  :

----------------------------------
                if (strpos($numero, '-') !== false) {
                    
                    $numeroarray = explode("-", $numero);
                    //A: principal B: secundario
                    $principal_contact='A';
                    //A: aún no asignado (luego de llamada se pone ID)
                    $id_contacto='A';
                    //P: pendiente E:espera T:terminado C:contactado
                    $contactado='P';
                    $id_contacto_count=1;
                    //Lipiando ID_CALL
                    $idCall='';
                    
                    //error_log(var_export($numeroarray, true));
                    foreach ($numeroarray as $valor) {
                        //error_log(var_export($valor, true));

                        if ($idCall=='' AND $id_contacto_count==1) {
                            $id_contacto_count++;
                            $idCall = $inserter->insertOneContact($valor, $atributos,$principal_contact, $contactado,$id_contacto);
                            //error_log(var_export($valor." y ".$id_contacto, true));
                            $id_contacto=$idCall;
                            $principal_contact='B';
                            $contactado='E';
                            
                        }
                        else{
                            //error_log(var_export($valor." o ".$id_contacto." - ".$id_contacto_count, true));
                            $idCall = $inserter->insertOneContact($valor, $atributos,$principal_contact, $contactado,$id_contacto);
                        }
                    }
                    //error_log(var_export($valor." y ".$id_contacto, true));
                }
                else{
                    $principal_contact='0';
                    $contactado='0';
                    $id_contacto='0';
                    $idCall = $inserter->insertOneContact($numero, $atributos,$principal_contact, $contactado,$id_contacto);
                }

-------------------------------