miércoles, 9 de septiembre de 2009

Campos spare en Witness CSCM de Avaya sin Viewer.

No me gusta el Viewer.
Y quiero usar los campos spare para añadir datos.

Veamos, queremos hacer grabación bajo demanda en Witness (de eso hablaré en otra entrada) y ya que hacemos la grabación, queremos aprovechar para guardar datos junto a ésta (como por ejemplo el número de expediente asociado a la llamada). Para esto existen unos campos "spare" en los que podemos meter la información que queramos (en realidad podemos crear los nombres que nos de la gana, no tienen por que llamarse spare). Pero queremos ver los campos spare en el CSCM sin necesidad de usar el Viewer que no me gusta nada.

Como hemos encontrado la solución voy a ponerla aquí para el que desee hacer lo mismo.

Antes de nada supongo que todos sabemos que el Contact Store corre sobre una máquina Linux, en concreto Avaya se empeña en instalarlo sobre una Red Hat. Supongo que para automatizar instalaciones y quitarse problemas.

La base de datos es Postgress, así que si sabemos lo que hay que modificar podremos ver en nuestras consultas en el CSCM los campos spare (o los nombres que nos de la gana no tienen porqué ser spare como dije antes) que queramos, para ello lo que tenemos que hacer es lo siguiente:

En la base de datos hay creada una vista que se llama browse, esta vista está construida de la siguiente manera:

SELECT inum, startedat, duration, recmodeid, callid, direction, svcnum, svcname, tarid, previnum, callparty,
"owner", parties_name_number(inum) AS partynames, parties_agent_name(inum) AS partyagentnames,
party_name_number(svcname::text, svcnum::text) AS vdn, callset_names(inum) AS csnames
FROM calls
NATURAL JOIN owners
WHERE callparty <> 2;

Contiene los campos que son accesibles desde el layout, por lo tanto deberemos crear campos en la vista para poder acceder a ellos desde éste.

Los campos spare (o los que sean, podemos poner el nombre que queramos como dije antes) están en las tablas udfs y udfnames, que se componen de los siguientes campos:

udfs: inum, udfid, udfval
udfnames: udfid, udfname

Los nombres de los spares estan en udfnames y están relacionados con la tabla udfs a través del campo udfid, por lo que para poder seleccionar los campos que nos interesan deberemos crear una función de la siguiente manera:

CREATE FUNCTION RecogeSpares(bigint, text) RETURNS text
AS 'select udfval from udfs where inum=$1 and udfid=(select udfid from udfnames where udfname=$2)'
LANGUAGE 'SQL';

Tras esto deberemos modificar la vista. Para no tocar la original lo que he hecho es crear una nueva y luego cambiar los nombres de la siguiente manera:

CREATE VIEW browsetmp AS
SELECT inum, startedat, duration, recmodeid, callid, direction, svcnum, svcname, tarid, previnum, callparty, "owner", parties_name_number(inum) AS partynames, parties_agent_name(inum) AS partyagentnames, party_name_number(svcname::text, svcnum::text) AS vdn, callset_names(inum) AS csnames, RecogeSpares(inum,'spare1') as Spare1, RecogeSpares(inum,'spare2') as Spare2, RecogeSpares(inum,'spare3') as Spare3, RecogeSpares(inum,'spare4') as Spare4, RecogeSpares(inum,'spare5') as Spare5, RecogeSpares(inum,'spare6') as Spare6, RecogeSpares(inum,'spare7') as Spare7, RecogeSpares(inum,'spare8') as Spare8
FROM calls
NATURAL JOIN owners
WHERE callparty <> 2;

Acabamos de crear la vista, podemos comprobar que funciona haciendo un

SELECT * from browsetmp where inum= 'numero que tiene spares para prueba';

Tras ver que todo funciona correctamente hacemos el cambio.

ALTER TABLE browse RENAME TO browse_original;
ALTER TABLE browsetmp RENAME TO browse;

Ahora ya tenemos la vista enviandonos las columnas que queremos, solo nos resta modificar el layout para que CSCM nos muestre las nuevas columnas. Para ello haremos lo siguiente:

Deberemos ir al directorio en el que se encuentran los layouts, es decir:
/opt/witness/properties/layouts
Modificamos el archivo lcscm.xml para incluir la columna, en mi caso queda de la siguiente manera (en negrita la linea que hay que añadir):

<?xml version="1.0" encoding="UTF-8"?>

<layout name="cscm" display="ldefault">

<view>browse</view>

<filters>
<filter type="date" dbName="startedat" display="fdate"/>
<filter type="string" dbName="partynames" display="fparty"/>
<filter type="string" dbName="partyagentnames" display="fagent"/>
<filter type="duration" dbName="duration" display="fduration"/>
<filter type="string" dbName="vdn" display="fvdn"/>
<filter type="ucid" dbName="callid" display="fcallid"/>
<filter type="callset" dbName="csnames" display="fcallset"/>
</filters>

<columns>
<column dbName="startedat" columnWidth="" formatType="DATE" display="cdate"/>
<column dbName="duration" columnWidth="" formatType="TIME" display="cduration"/>
<column dbName="partyagentnames" columnWidth="" formatType="" display="cagent"/>
<column dbName="partynames" columnWidth="" formatType="" display="cparty"/>
<column dbName="vdn" columnWidth="" formatType="" display="cvdn"/>
<column dbName="Spare1" columnWidth="" formatType="UCID" display="cspare1"/>
<column dbName="callid" columnWidth="" formatType="UCID" display="ccallid" enableLikeSearch="true"/>
</columns>

</layout>

Si añadiesemos otra linea en filters podríamos hacer búsquedas por número de expediente que en mi caso es el spare1.
Tras esto modificamos el archivo idefault.xml para poner el nombre de columan que queremos que nos aparezca en la página web. (solo muestro el trozo de código para español que es el que nos interesa y en negrita la linea a añadir).

<language lang="es">
<token tid="ldefault">Diseño predeterminado</token>
<token tid="fdate">Intervalo de inicio de llamada</token>
<token tid="fparty">Interlocutores</token>
<token tid="fagent">Agente</token>
<token tid="fduration">Longitud</token>
<token tid="fvdn">Servicio</token>
<token tid="fcallid">ID de llamada</token>
<token tid="fcallset">Conjunto de llamadas</token>
<token tid="cdate">Inicio de llamada</token>
<token tid="cduration">Long.</token>
<token tid="cagent">Agente</token>
<token tid="cparty">Interlocutores</token>
<token tid="cvdn">Servicio</token>
<token tid="cspare1">Expediente</token>
<token tid="ccallid">ID de llamada</token>
</language>


Ya tendremos en nuestras consultas de grabaciones un nuevo campo con el nombre Expediente que nos muestra los valores del campo spare1.

Bueno, espero que os sirva.