Hola a todos, estos días he visto que varios e incluso yo mismo querían poder configurar el sobre colocar llamadas en el modulo call center según los agentes libres.
El problema es que si tienes 1 agente libre lo normal es que se haga 1 o 2 llamadas a lo sumo, y estas son a veces muy pocas.
Aporto este código para que puedan testearlo ( yo lo he probado en producción y me funciona muy bien) y cualquier anomalía o sugerencia será bienvenida.
Con este código podrán configurar a tiempo real cuantas llamadas se desean sobre colocar por agente libre
por ejemplo si se configura para 2, el dialer realizará 3 llamadas ( la que el calcula + 2 extras) por agente.
tengan cuidado no poner muchas ya que las llamadas se hacen exponenciales.
Una vez me confirmen varios que les funciona todo bien lo subire para actualizarlo y que venga por defecto en la instalación del call center.
para hacer estos cambios les recomiendo hacer copia de seguridad previamente de todos los ficheros y que tengan conocimientos de php o bien que no lo hagan en servidores en producción.
1.- editar el formulario de configuración del modulo call center
vi /var/www/html/modules/callcenter_config/themes/default/form.tpl
buscar donde pone
<tr class="letra12"><td>{$asterisk_astpass_1.LABEL}:</td></tr>
<tr class="letra12"><td>{$asterisk_astpass_1.INPUT}</td></tr>
<tr class="letra12"><td>{$asterisk_astpass_2.LABEL}:</td></tr>
<tr class="letra12"><td>{$asterisk_astpass_2.INPUT}</td></tr>
<tr class="letra12"><td>{$asterisk_duracion_sesion.LABEL}:</td></tr>
<tr class="letra12"><td>{$asterisk_duracion_sesion.INPUT}</td></tr>
y poner al final
<tr class="letra12"><td>{$dialer_forzar_sobrecolocar.LABEL}:</td></tr>
<tr class="letra12"><td>{$dialer_forzar_sobrecolocar.INPUT}</td></tr>
quedaria asi
<tr class="letra12"><td>{$asterisk_astpass_1.LABEL}:</td></tr>
<tr class="letra12"><td>{$asterisk_astpass_1.INPUT}</td></tr>
<tr class="letra12"><td>{$asterisk_astpass_2.LABEL}:</td></tr>
<tr class="letra12"><td>{$asterisk_astpass_2.INPUT}</td></tr>
<tr class="letra12"><td>{$asterisk_duracion_sesion.LABEL}:</td></tr>
<tr class="letra12"><td>{$asterisk_duracion_sesion.INPUT}</td></tr>
<tr class="letra12"><td>{$dialer_forzar_sobrecolocar.LABEL}:</td></tr>
<tr class="letra12"><td>{$dialer_forzar_sobrecolocar.INPUT}</td></tr>
luego editar el fichero
vi /var/www/html/modules/callcenter_config/index.php
y buscar donde pone
// print_r($listaConf);
$camposConocidos = array(
'asterisk.asthost' => 'asterisk_asthost',
'asterisk.astuser' => 'asterisk_astuser',
'asterisk.astpass' => 'asterisk_astpass_1',
'asterisk.duracion_sesion' => 'asterisk_duracion_sesion',
'dialer.llamada_corta' => 'dialer_llamada_corta',
'dialer.tiempo_contestar' => 'dialer_tiempo_contestar',
'dialer.debug' => 'dialer_debug',
'dialer.allevents' => 'dialer_allevents',
'dialer.overcommit' => 'dialer_overcommit',
'dialer.qos' => 'dialer_qos',
'dialer.predictivo' => 'dialer_predictivo',
'dialer.timeout_originate' => 'dialer_timeout_originate',
'dialer.timeout_inactivity' => 'dialer_timeout_inactivity',
);
y poner al final
$valoresForm = array(
'asterisk_asthost' => '127.0.0.1',
'asterisk_astuser' => '',
'asterisk_astpass_1' => '',
'asterisk_astpass_2' => '',
'asterisk_duracion_sesion' => '0',
'dialer_llamada_corta' => '10',
'dialer_tiempo_contestar' => '8',
'dialer_debug' => 'off',
'dialer_allevents' => 'off',
'dialer_overcommit' => 'off',
'dialer_qos' => '0.97',
'dialer_predictivo' => 'on',
'dialer_timeout_originate' => '0',
'dialer_timeout_inactivity' => '15',
'dialer_forzar_sobrecolocar' => '0',
);
luego en la db de call center tabla valor_config ( no es necesario añadir el campo aqui al cambiar lo demas y guardar un valor lo añade a la db si no lo forzaoms
añadimos el nuevo valor
añadimos en config_key dialer.forzar_sobrecolocar y en config_value ponemos 1 ( 1 seria 1 llamada mas por agente 0 actuaria normal segun agentes libres)
config_blob null
luego
vi /var/www/html/modules/callcenter_config/index.php
buscar donde pone
'dialer_timeout_inactivity'=> array(
'LABEL' => _tr('Agent inactivity timeout'),
'REQUIRED' => 'yes',
'INPUT_TYPE' => 'TEXT',
'VALIDATION_TYPE' => 'ereg',
'INPUT_EXTRA_PARAM' => '',
'VALIDATION_EXTRA_PARAM' => '^[[:digit:]]+$',
),
y añadir debajo
'dialer_forzar_sobrecolocar'=> array(
'LABEL' => _tr('force more calls per agent'),
'REQUIRED' => 'yes',
'INPUT_TYPE' => 'TEXT',
'VALIDATION_TYPE' => 'ereg',
'INPUT_EXTRA_PARAM' => '',
'VALIDATION_EXTRA_PARAM' => '^[[:digit:]]+$',
),
Luego ir a lang
vi /var/www/html/modules/callcenter_config/lang/eng.lang
dentro editar eng.lang
buscar
'Enable overcommit of outgoing calls' => 'Enable overcommit of outgoing calls',
'AMI Session Duration' => 'AMI Session Duration (0 for persistent session)',
'Service percent' => 'Service percent',
'Enable predictive dialer behavior' => 'Enable predictive dialer behavior',
'Per-call dial timeout' => 'Per-call dial timeout',
'Agent inactivity timeout' => 'Agent inactivity timeout',
);
y añadir
'Agent inactivity timeout' => 'Agent inactivity timeout',
'Force more calls per agent' => 'Force more calls per agent',
);
luego al idioma "es" por si lo tenemos en español y con el resto igual en el idioma que tengamos activado
y buscar o ir al final del array
"Per-call dial timeout" => "Espera máxima por llamada marcada",
"Agent inactivity timeout" => "Espera máxima de inactividad de agente",
"Asterisk Connection" => "Conexión de Asterisk",
"Dialer Parameters" => "Parámetros del Dialer",
);
y añadir
"Asterisk Connection" => "Conexión de Asterisk",
"Dialer Parameters" => "Parámetros del Dialer",
'Force more calls per agent' => 'Forzar más llamadas por Agente',
);
y asi con todos los idiomas para tenerlo en todos
ahora via web accedemos al panel de configuracion del modulo de call center y nos aparecerá la opcion de forzar más llamadas por Agente
hay indicamos las que queramos (0) para tantas como agentes no forzar mas. 1 seria 1 llamada mas por agente libre es decir si hay 1 serian 2 si hay 2 serian 3, etc.
ahora vamos a
vi /opt/issabel/dialer/ConfigDB.class.php
en ConfigDB.class.php
añadir donde pone
),
'predictivo' => array(
'descripcion' => 'predicción de llamadas por terminar',
'regex' => '^(0|1)$',
'valor_omision' => 1,
'valor_viejo' => NULL,
'valor_actual' => NULL,
'mostrar_valor' => TRUE,
'cast' => 'bool',
),
'timeout_originate' => array(
'descripcion' => 'tiempo de espera de marcado de llamadas',
'regex' => '^\d+$',
'valor_omision' => 0,
'valor_viejo' => NULL,
'valor_actual' => NULL,
'mostrar_valor' => TRUE,
'cast' => 'int',
),
añadir la opcion nueva
),
'predictivo' => array(
'descripcion' => 'predicción de llamadas por terminar',
'regex' => '^(0|1)$',
'valor_omision' => 1,
'valor_viejo' => NULL,
'valor_actual' => NULL,
'mostrar_valor' => TRUE,
'cast' => 'bool',
),
'timeout_originate' => array(
'descripcion' => 'tiempo de espera de marcado de llamadas',
'regex' => '^\d+$',
'valor_omision' => 0,
'valor_viejo' => NULL,
'valor_actual' => NULL,
'mostrar_valor' => TRUE,
'cast' => 'int',
),
'forzar_sobrecolocar' => array(
'descripcion' => 'Forzar Más llamadas por agente',
'regex' => '^\d+$',
'valor_omision' => 0,
'valor_viejo' => NULL,
'valor_actual' => NULL,
'mostrar_valor' => TRUE,
'cast' => 'int',
),
Luego de eso editamos el fichero
vi /opt/issabel/dialer/CampaignProcess.class.php
buscar
$resumenPrediccion = ($this->_configDB->dialer_predictivo && ($infoCampania['num_completadas'] >= MIN_MUESTRAS))
? $oPredictor->predecirNumeroLlamadas($infoCola,
$this->_configDB->dialer_qos,
$infoCampania['promedio'],
$this->_leerTiempoContestar($infoCampania['id']))
: $oPredictor->predecirNumeroLlamadas($infoCola);
if ($this->DEBUG) {
$this->_log->output('DEBUG: '.__METHOD__." (campania {$infoCampania['id']} ".
"cola {$infoCampania['queue']}): resumen de predicción:\n".
"\tagentes libres.........: {$resumenPrediccion['AGENTES_LIBRES']}\n".
"\tagentes por desocuparse: {$resumenPrediccion['AGENTES_POR_DESOCUPAR']}\n".
"\tclientes en espera.....: {$resumenPrediccion['CLIENTES_ESPERA']}");
}
$iMaxPredecidos = $resumenPrediccion['AGENTES_LIBRES'] + $resumenPrediccion['AGENTES_POR_DESOCUPAR'] - $resumenPrediccion['CLIENTES_ESPERA'];
if ($iMaxPredecidos < 0) $iMaxPredecidos = 0;
if (is_null($iNumLlamadasColocar) || $iNumLlamadasColocar > $iMaxPredecidos)
$iNumLlamadasColocar = $iMaxPredecidos;
// TODO: colocar código de detección de conflicto de agentes
if ($iNumLlamadasColocar > 0) {
/* El valor de llamadas predichas no toma en cuenta las llamadas que han
aqui esta el truco
if (is_null($iNumLlamadasColocar) || $iNumLlamadasColocar > $iMaxPredecidos)
$iNumLlamadasColocar = $iMaxPredecidos;
le añadi esto
//añadido por hgm para pruebas sobre colocar 25-06-2018
$this->_log->output('DEBUG: '.__METHOD__." (campania {$infoCampania['id']} ".
"cola {$infoCampania['queue']}): resumen de predicción:\n".
"\tagentes libres.........: {$resumenPrediccion['AGENTES_LIBRES']}\n".
"\tagentes por desocuparse: {$resumenPrediccion['AGENTES_POR_DESOCUPAR']}\n".
"\tllamadas simultaneas realizar: {$iNumLlamadasColocar}\n".
"\tllamadas extras a forzar: ".$this->_configDB->dialer_forzar_sobrecolocar."\n".
"\tclientes en espera.....: {$resumenPrediccion['CLIENTES_ESPERA']}");
//añadido por hgmnetwork.com 26-06-2018 para forzar mas llamadas por agente
//miramos si como mínimo hay 1 llamada por hacer que fuerce mas, si es 0 llamadas ignora para no hacer llamadas sin agentes libres o apunto
if ($iNumLlamadasColocar>0){
$iNumLlamadasColocar= $iNumLlamadasColocar + $this->_configDB->dialer_forzar_sobrecolocar;
};
y si miramos el log cuando estamos logueados nos sale esto
2018-06-25 23:32:12 PID= 31083 : (ECCPWorkerProcess-0) DEBUG: ECCPConn::do_eccprequest: requerimiento logout procesado luego de (sec): 5.4836273193359E-5
2018-06-25 23:32:14 PID= 31078 : (CampaignProcess) DEBUG: CampaignProcess::_actualizarLlamadasCampania verificando agentes libres...
2018-06-25 23:32:14 PID= 31077 : (AMIEventProcess) DEBUG: AMIEventProcess::rpc_infoPrediccionCola recibido: Array
(
[0] => 890
)
2018-06-25 23:32:14 PID= 31077 : (AMIEventProcess) DEBUG: QueueShadow::infoPrediccionCola: cola 890 no ha recibido eventos que indiquen activación de eventwhencalled y eventmemberstatus
2018-06-25 23:32:14 PID= 31078 : (CampaignProcess) DEBUG: CampaignProcess::actualizarLlamadasCampania (campania 8 cola 890): resumen de predicción:
agentes libres.........: 1
agentes por desocuparse: 0
clientes en espera.....: 0
2018-06-25 23:32:14 PID= 31078 : (CampaignProcess) DEBUG: CampaignProcess::actualizarLlamadasCampania (campania 8 cola 890): resumen de predicción:
agentes libres.........: 1
agentes por desocuparse: 0
llamadas simultaneas realizar: 1
llamadas extras a forzar: 53
clientes en espera.....: 0
segun los agentes libres pone llamadas simultaneas, hay podemos forzar al numero 1 + 53 (sale 53 porque en la web hemos puesto 53 por probar para verificar)
y justo debajo se pone la suma
//añadido por hgmnetwork.com 26-06-2018 para forzar mas llamadas por agente
//miramos si como mínimo hay 1 llamada por hacer que fuerce mas, si es 0 llamadas ignora para no hacer llamadas sin agentes libres o apunto
if ($iNumLlamadasColocar>0){
$iNumLlamadasColocar= $iNumLlamadasColocar + $this->_configDB->dialer_forzar_sobrecolocar;
};
//ponemos el log para ver cuantas realiza finalmente
$this->_log->output('DEBUG: '.METHOD." (campania {$infoCampania['id']} ".
"cola {$infoCampania['queue']}): resumen de predicción:\n".
"\tLlamadas a realizar finalmente.........: {$iNumLlamadasColocar}\n");
// TODO: colocar código de detección de conflicto de agentes
if ($iNumLlamadasColocar > 0) {
/* El valor de llamadas predichas no toma en cuenta las llamadas que han
y listo con eso ya debería marcar tantas llamadas extras como se le indiquen según los agentes
espero les ayude y colaboren con las pruebas para mejorarlo.
gracias!