Indice | Filosofía | Tablas | Setup | Interf Internas | Interf Externas | Adaptación


Configuración de Monitores
Automatizando Acciones en N2C

¿Quién no se ha topado con la necesidad de enviar un correo electrónico todas las noches a aquellos clientes que deben realizar un pago? ¿O enviar un mensaje interno a los asesores cuando haya que tomar una acción urgente porque hay n unidades a las que hay que reestablecerles el combustible? ¿O cambiar el estatus de una solicitud de viaje a Perdido si la fecha en que debía ser el viaje ya ha pasado y el cliente nunca respondió?

Seguro alguna vez has tenido la necesidad de realizar acciones periódicas y automáticas en alguna aplicación que estás desarrollando... Y seguro ha sido un desarrollo largo y complicado, o al menos tedioso... Y seguro lo has tenido que hacer muchas veces... Esta situación puede ser muy frustrante.

Por eso es que ahora Net2Client incorpora una nueva funcionalidad en la que puedes programar estas soluciones de una manera muy fácil. A continuación verás un ejemplo que te ayudará a utilizarlo. Más adelante podrás ver un [archivo completo] del ejemplo que te damos junto con una [tabla] que te explica una a una las etiquetas que se pueden utilizar en este archivo de configuración.

Ejemplo

Primeros pasos

Lo primero que debes hacer es colocar las etiquetas que van a englobar los distintos monitores que necesites configurar:

<monitorConfiguration>
	<monitors>
	
	</monitors>
</monitorConfiguration>

Se crea la etiqueta adicional <monitors> para dejar abierta la opción de colocar otras propiedades a la configuración de monitores que puedan hacer falta si aumentan los requerimientos de esta funcionalidad.

Puedes incluir la etiqueta <debug> que te ayudará a probar la configuración de tu monitor sin que ocasiones comportamientos extraños en tu aplicación. Cuando indicas el valor SI en esta etiqueta se ejecuta el programa de monitores imprimiendo las acciones que estas planificando realizar sin llevarlas a cabo. Esto te permite ir viendo si el monitor se está comportando como tu lo deseas.

<monitorConfiguration>
	<debug>SI</debug>
	<monitors>
	
	</monitors>
</monitorConfiguration>

Por otro lado, si quieres que tu monitor muestre los resultados de lo que está ejecutando puedes incluir la etiqueta <trace> que te permitirá ir imprimiendo las acciones a medida que las va llevando a cabo.

<monitorConfiguration>
	<trace>SI</trace>
	<monitors>
	
	</monitors>
</monitorConfiguration>

A continuación, coloca las etiquetas entre las que se va a definir un monitor. En este ejemplo configuraremos un sólo monitor, pero puedes configurar todos los monitores que te hagan falta. Podrías necesitar configurar más ya que un monitor te permite revisar una sóla condición. Es posible hacer una unión de tablas para obtener tu conjunto de datos, siempre y cuando recuerdes incluir las condiciones por las que se van a unir las mismas.

<monitorConfiguration>
	<monitors>
		<monitor0>
		
		</monitor0>
	</monitors>
</monitorConfiguration>

Obteniendo tu conjunto de datos

Luego debes incluir tres etiquetas que te permitirán escoger el conjunto con el que vas a realizar las diferentes acciones.

Para poder colocar el < en la condición debes hacerlo utilizando el código html del símbolo, que en este caso es &lt; (lt = less than/menor que), ya que de la manera tradicional XML lo procesará como el inicio de una etiqueta. De la misma manera debes utilizar el símbolo &gt;(gt = greater than/mayor que) para indicar el >.

<monitor0>
	<table>900EVE</table>
	<condition>EVELista3= 'Esperando Cliente' AND EVEFecha2 &lt;= *HOY*</condition>
	<fields>EVECodigo, EVEEnlaceP, EVECodAgente</fields>
</monitor0>

Fíjate en el ejemplo que en la condición se realizó la comparación de una fecha con el string *HOY*. Este string permite que puedas comparar las fechas que están en la base de datos con la fecha actual. Asimismo, con el string *PROXSEMANA* la fecha utilizada para comparar será 7 días después de la fecha actual.

A continuación puedes ver los tres bloques que puedes utilizar para las diferentes acciones posibles. Para incluir acciones en la base de datos puedes utilizar la etiqueta <DBactions>. Para enviar un mensaje interno puedes utilizar la etiqueta <messages>. Y para enviar un correo electrónico puedes utilizar la etiqueta <emails>. Fíjate como se abrirían los tres bloques.

<monitor0>
	<table>900EVE</table>
	<condition>EVELista3= 'Esperando Cliente' AND EVEFecha2 <= *HOY*</condition>
	<fields>EVECodigo, EVEEnlaceP, EVECodAgente</fields>
	<DBactions>
		/* Aqui irán las acciones en la base de datos.*/
	</DBactions>
	<messages>
		/* Aqui irá el envío de mensajes internos .*/
	</messages>
	<emails>
		/* Aqui irá el envío de correos electrónicos.*/
	</emails>
</monitor0>

¿Como programar una acción en la base de datos?

Actualización

Si quieres que se corra una actualización en la base de datos tomando en cuenta tu conjunto de datos debes indicar que el tipo de acción es update en el atributo type de la etiqueta <DBaction0> tal como puedes notar en el ejemplo a continuación.

En este caso, dentro de la etiqueta de la acción de base de datos se deben definir tres etiquetas adicionales.

<DBactions>
	<DBaction0 type='update' ocurrences='one'>
		<table>900EVE</table>
		<updateFields>
			<updatedField0>EVELista3='Perdido'</updatedField0>
			<updatedField1>EVELista4='No Contesto'</updatedField1>
		</updateFields>
		<where>EVELista3= 'Esperando Cliente' AND EVEFecha2 <= *HOY*</where>
	</DBaction0>
Eliminación

Para eliminar registros de la base de datos necesitas indicar que el tipo de acción es delete. Adicionalmente es necesario que incluyas únicamente dos etiquetas.

	<DBaction1 type='delete' ocurrences='one'>
		<table>900EVE</table>
		<where>EVECodigo='164463'</where>
	</DBaction1>
Ingreso

Para ingresar registros en la base de datos es necesario que incluyas dos etiquetas dentro de <DBactionX>.

	<DBaction2 type='insert' ocurrences='all'>
		<table>900AR2</table>
		<insertFields>
			<insertField0>AR2Lista2='Planificado'</insertField0>
			<insertField1>AR2EnlaceE=*EVECodigo*</insertField1>
			<insertField2>AR2Nombre='Prueba Mila'</insertField2>
		</insertFields>
	</DBaction2>
</DBactions>

¿Como programar el envío de mensajes internos?

Existen dos formas en las que puedes configurar el envío de mensajes internos. El primero lo llamaremos Modo estático ya que no depende de valores en la base de datos, si no de los valores que tu le pongas al archivo de configuración. El segundo lo llamaremos Modo dinámico ya que utilizarás la base de datos para obtener los remitentes y destinatarios del mensaje interno. Es importante notar que puedes poner el remitente dinámico y el destinatario estático o vice versa.

En este primer ejemplo, podrás ver como puedes usar el Modo estático. En la etiqueta <from> escribe el código del agente que quieres colocar como remitente. Asimismo, en la etiqueta <to> escribe los códigos de los agentes que quieres que reciban el mensaje interno. El asunto del mensaje lo puedes colocar dentro de la etiqueta <subject> y el contenido dentro de <content>. Adicionalmente puedes indicar si deseas que esos destinatarios reciban una copia del mensaje por correo electrónico escribiendo SI en la etiqueta <email>. Si colocas la palabra ECHO en la etiqueta <options> se imprimirán los queries asociados al envío del mensaje interno.

<messages>
	<message0 ocurrences='one'>
		<from>42</from>
		<to>42,1</to> 
		<subject>Prueba mensaje</subject>
		<content>Esto es una prueba de la configuracion del monitor</content>
		<email>SI</email>
		<options></options>
	</message0>

Para utilizar el Modo dinámico es necesario que incluyas etiquetas que permitan al programa de monitores realizar las búsquedas necesarias para obtener la información de los destinatarios y el remitente.

Para obtener el remitente tienes a tu disposición las siguientes etiquetas:

Para obtener los destinatarios tienes a tu disposición las siguientes etiquetas:

Las etiquetas <subject>, <content>, <email> y <options> las utilizas igual que en el ejemplo anterior.

	<message1 ocurrences='all'>
		<fromTable>900AGE</fromTable>
		<fromFields>AGECodigo</fromFields>
		<fromCondition>AGECodigo = *EVECodAgente*</fromCondition>
		<from>AGECodigo</from>
		<toTable>900PER</toTable>
		<toFields>PERCodigo</toFields>
		<toCondition>PERCodigo = *EVEEnlaceP*</toCondition>
		<to>PERCodigo</to> 
		<subject>Prueba mensaje</subject>
		<content>Esto es una prueba de la configuracion del monitor</content>
		<email>SI</email>
		<options></options>
	</message1>
</messages>

¿Como programar el envío de correos electrónicos?

Al igual que con los mensajes, existen dos formas en las que puedes configurar el envío de correos electrónicos, el Modo estático y el Modo dinámico.

En este primer ejemplo, podrás ver como puedes utilizar el Modo estático en la configuración de correos electrónicos. A diferencia de la configuración de mensajes internos, en este caso debes incluir la etiqueta <fromName> en la que debes indicar el nombre que se le colocará al remitente del correo. En la etiqueta <from> escribe el correo electrónico del remitente. Asimismo, en la etiqueta <to> escribe los correos electrónicos de los destinatarios. Las etiquetas de <subject> y <content> las utilizarás de la misma manera que con los mensajes internos. En este caso no requerirás de las etiquetas <email> ni <options>.

<emails>
	<email0 ocurrences='one'>
		<fromName>Mila</fromName>
		<from>milagro.feijoo@gmail.com</from>
		<to>beatriz.gonzalez@gmail.com</to>
		<subject>Prueba email</subject>
		<content>Prueba de configuracion de monitor</content>
	</email0>

Al igual que con los mensajes internos, para utilizar el Modo dinámico es necesario que incluyas etiquetas que permitan al programa de monitores realizar las búsquedas necesarias para obtener la información de los destinatarios y el remitente. A continuación conseguirás nuevamente la explicación de estas etiquetas, de manera que no tienes que regresar a leerlas en la sección de mensajes.

Para obtener el remitente tienes a tu disposición las siguientes etiquetas:

Para obtener los destinatarios tienes a tu disposición las siguientes etiquetas:

Las etiquetas <subject>, <content>, <email> y <options> las utilizas igual que en el ejemplo anterior.

<emails>
	<email1 ocurrences='all'>
		<fromTable>900AGE</fromTable>
		<fromFields>AGELinea1,AGECodigo, AGEEmail1</fromFields>
		<fromCondition>AGECodigo = *EVECodAgente*</fromCondition>
		<fromName>AGELinea1</fromName>
		<from>AGEEmail1</from>
		<toTable>900PER</toTable>
		<toFields>PERLinea1, PEREmail1</toFields>
		<toCondition>PERCodigo = *EVEEnlaceP*</toCondition>
		<to>PEREmail1</to>
		<subject>Prueba email</subject>
		<content>Prueba de configuracion de monitor</content>
	</email1>
</emails>

¿Cuantas veces se va a ejecutar cada acción?

Esto es algo de lo que debes estar pendiente a la hora de realizar estas configuraciones. Es muy importante que le prestes atención a este asunto ya que de eso va a depender la cantidad de correos electrónicos que reciba alguien. O la cantidad de veces que accedas a la base de datos, a la cual dependiendo de lo que indiques podrías estar accediendo n veces cuando solo es necesaria una vez. Para controlar esto tienes a tu disposición el atributo ocurrences que puedes colocar en las etiquetas <DBactionX>,<messageX> y <emailX>. Por un lado, puedes colocar como valor a este atributo one para que la acción se ejecute una sola vez sin importar la cantidad de registros que conformen tu conjunto de datos.También puedes colocar como valor all para que la acción se ejecute una vez por cada registro de tu conjunto de datos.

Te estarás preguntando: ¿y cómo hago que esto funcione?

En primer lugar debes subir el archivo de configuración que acabas de construir al espacio de tu aplicación. Luego, debes crear un programa php, como el que ves un poco más abajo, en el que debes indicar el nombre del archivo que acabas de construir con la configuración de los monitores. Si dejas esta variable en blanco, el valor que se tomará por defecto será monitorConfiguration.xml. Adicionalmente, debes indicar la base de datos ($BD) en la cual está tu aplicación, en el ejemplo es la 04 y de la misma manera el número de la aplicación ($EEE), que en este caso es 900. Adicionalmente es necesario que indiques si estas trabajando en el directorio new o en el directorio sis, valor que pondrás en la variable $NoS. Por último debes realizar el require del programa monitor.php, que ejecuta las funciones configuradas y se encuentra en la ruta "rutinas/monitor.php".

<?php
	$FileName="monitorConfiguration.xml";
	$BD="04"; $EEE="900";
	$NoS = "new";
	require("../../../../$NoS/rutinas/monitor.php");
?>

Tienes dos maneras de ejecutar estos monitores. En primer lugar, si incluyes un boton o un link en tu aplicación que ejecute el programa php que tu escribiste, se puede ejecutar manualmente cada vez que una persona haga click en este. Sin embargo, es probable que necesites que estas acciones se ejecuten automáticamente cada cierto tiempo, por ejemplo cada hora o cada noche. Para esto debes solicitar al administrador que configure un crontab en el que indiques el programa php que tu escribiste y la frecuencia con la que debe ejecutarse.

Cuando no te sirve el uso estandar...

En ciertas ocasiones podrías necesitar escribir un programa que genere el XML de configuración, ya sea porque las condiciones para saber a quienes enviar el mensaje son muy complicadas, porque necesitas que el asunto tenga un campo variable que calculas en un programa php o porque necesitas mostrarle resultados a un usuario por pantalla. Para tu tranquilidad, también pensamos en eso y el programa de monitores es suficientemente flexible como para permitir que lo uses a tu manera. En primer lugar, puedes tener un programa php que realice los cálculos y acciones necesarias y vaya construyendo una variable string en la cual estará contenido el XML. Para que el programa entienda, debes llamar a esta variable $StringXML. Al finalizar esta construcción colocas el require del programa monitor.php como te indicamos anteriormente y se ejecutará tu configuración. Si necesitas mostrar algún mensaje con resultados en pantalla tienes a tu disposición el arreglo $monitors que contiene todo el árbol de XML. Para averiguar que contiene te sugerimos escribir el siguiente código luego del require de monitor.php.

echo "<pre>";
print_r($monitors);
echo "</pre>";

Archivo de Configuración [subir]

Aqui tienes el archivo de configuración completo. Te sugerimos que lo copies y lo pegues en tu archivo y que hagas los cambios necesarios para que se adapte a lo que estás programando

<monitorConfiguration>
	<debug>ON</debug>
	<trace>OFF</trace>
	<monitors>
		<monitor0>
			<table>900EVE</table>
			<condition>EVELista3= 'Esperando Cliente' AND EVEFecha2 &lt;= *HOY*</condition>
			<fields>EVECodigo, EVEEnlaceP, EVECodAgente</fields>
			<DBactions>
				<DBaction0 type='update' ocurrences='one'>
					<table>900EVE</table>
					<updateFields>
						<updatedField0>EVELista3='Perdido'</updatedField0>
						<updatedField1>EVELista4='No Contesto'</updatedField1>
					</updateFields>
					<where>EVELista3= 'Esperando Cliente' 
						AND EVEFecha2 <= *HOY* </where>
				</DBaction0>
				<DBaction1 type='delete' ocurrences='one'>
					<table>900EVE</table>
					<where>EVECodigo='164463'</where>
				</DBaction1>
				<DBaction2 type='insert' ocurrences='all'>
					<table>900AR2</table>
					<insertFields>
						<insertField0>AR2Lista2='Planificado'</insertField0>
						<insertField1>AR2EnlaceE=*EVECodigo*</insertField1>
						<insertField2>AR2Nombre='Prueba Mila'</insertField2>
					</insertFields>
				</DBaction2>
			</DBactions>
			<messages>
				<message0 ocurrences='one'>
					<from>42</from>
					<to>42,1</to> 
					<subject>Prueba mensaje</subject>
					<content>Esto es una prueba de la configuracion del monitor</content>
					<email>SI</email>
					<options></options>
				</message0>
				<message1 ocurrences='all'>
					<fromTable>900AGE</fromTable>
					<fromFields>AGECodigo</fromFields>
					<fromCondition>AGECodigo = *EVECodAgente*</fromCondition>
					<from>AGECodigo</from>
					<toTable>900PER</toTable>
					<toFields>PERCodigo</toFields>
					<toCondition>PERCodigo = *EVEEnlaceP*</toCondition>
					<to>PERCodigo</to> 
					<subject>Prueba mensaje</subject>
					<content>Esto es una prueba de la configuracion del monitor</content>
					<email>SI</email>
					<options></options>
				</message1>
			</messages>
			<emails>
				<email0 ocurrences='one'>
					<fromName>Mila</fromName>
					<from>milagro.feijoo@gmail.com</from>
					<to>beatriz.gonzalez@gmail.com</to>
					<subject>Prueba email</subject>
					<content>Prueba de configuracion de monitor</content>
				</email0>
				<email1 ocurrences='all'>
					<fromTable>900AGE</fromTable>
					<fromFields>AGELinea1,AGECodigo, AGEEmail1</fromFields>
					<fromCondition>AGECodigo = *EVECodAgente*</fromCondition>
					<fromName>AGELinea1</fromName>
					<from>AGEEmail1</from>
					<toTable>900PER</toTable>
					<toFields>PERLinea1, PEREmail1</toFields>
					<toCondition>PERCodigo = *EVEEnlaceP*</toCondition>
					<to>PEREmail1</to>
					<subject>Prueba email</subject>
					<content>Prueba de configuracion de monitor</content>
				</email1>
			</emails>
		</monitor0>
	</monitors>
</monitorConfiguration>

Etiquetas [subir]

Etiqueta Uso
<monitorConfiguration></monitorConfiguration> Etiqueta general que identifica al archivo como configuración XML para los monitores.
<monitors></monitors> Indica el comienzo y el fin del bloque de monitores.
<monitorX></monitorX> Etiqueta que contiene la definición de un monitor, siendo X el número que la identifica (i.e. monitor0, monitor1). Nota: la numeración debe empezar en 0.
<table></table> Si es hija de <monitorX> indica la lista de tablas, separadas por coma, a utilizar en la búsqueda de los registros a revisar (i.e. 900PER). Si es hija de <DBactionX> indica las tablas a utilizar para los ingresos, las actualizaciones o las eliminaciones.
<condition></condition> Indica la condición que se utilizará en la búsqueda para determinar los registros sobre los que se desea actuar. Nota: Si se coloca *HOY* en la condición se utilizará la fecha de hoy para comparar. De igual manera, si se coloca *PROXSEMANA* la fecha utilizada para comparar será 7 días después de la fecha actual.
<fields></fields> Lista de campos que se deben seleccionar separados por coma.
<DBactions></DBactions> Indica el comienzo y el fin del bloque de las acciones en base de datos.
<DBactionX></DBactionX> Etiqueta que contiene la definición de una acción en BD, siendo X el número que la identifica (i.e. DBaction0, Dbaction1). Se debe incluir en esta etiqueta el atributo type que puede tener los siguientes valores: update, delete o insert.
<updateFields></updateFields> Etiqueta particular utilizada cuando el tipo de DBaction es update. Indica el comienzo y el fin del bloque de los campos que deben ser actualizados.
<updatedFieldX></updatedFieldX> Los campos que deben ser actualizados. Debe escribirse Campo = 'Valor'.
<insertFields></insertFields> Etiqueta particular utilizada cuando el tipo de DBaction es insert. Indica el comienzo y el fin del bloque de los campos que deben ser seteados al ingresar el registro.
<insertFieldX></insertFieldX> Los campos que deben ser seteados al ingresar el registro. Debe escribirse Campo = 'Valor'.
<where></where> La condición utilizada para las actualizaciones y eliminaciones de registros.
<messages></messages> Indica el comienzo y el fin del bloque de los mensajes internos.
<messageX></messageX> Etiqueta que contiene la definición de un mensaje interno, siendo X el número que lo identifica (i.e. message0, message1).
<emails></emails> Indica el comienzo y el fin del bloque de correos electrónicos.
<emailX></emailX> Etiqueta que contiene la definición de un correo electrónico, siendo X el número que lo identifica (i.e. email0, email1).
<fromTable></fromTable> Tabla utilizada para obtener la información del remitente del mensaje interno o correo electrónico.
<fromFields></fromFields> Lista de campos separados por comas que se utilizaran para obtener la información necesaria del remitente para enviar el mensaje interno o el correo electrónico. Si es un correo electrónico se deben incluir los nombres internos de los campos de Código, Nombre y Email. Si es un mensaje interno sólo es necesario el campo de Código.
<fromCondition></fromCondition> La condición utilizada para obtener el remitente del correo electrónico o mensaje interno. Si se desea comparar algún campo con los registros obtenidos en la búsqueda general del monitor se debe colocar Campo = *campoGlobal* (i.e. PERCodigo = *EVEEnlaceP*).
<from></from> Si esta etiqueta es hija de <messageX> representa el código del agente que envía el mensaje. Si es hija de <emailX> representa la dirección de correo que se utilizará para como remitente. Si se establece un valor para <fromTable>, <fromFields> y <fromCondition> representa el nombre interno del campo que contiene el correo electrónico.
<toTable></toTable> Tabla utilizada para obtener la información del destinatario del mensaje interno o correo electrónico.
<toFields></toFields> Lista de campos separados por comas que se utilizaran para obtener la información necesaria del destinatario para enviar el mensaje interno o el correo electrónico. Si es un correo electrónico se deben incluir los nombres internos de los campos de Código y Email. Si es un mensaje interno sólo es necesario el campo de Código.
<toCondition></toCondition> La condición utilizada para obtener el destinatario del correo electrónico o mensaje interno. Si se desea comparar algún campo con los registros obtenidos en la búsqueda general del monitor se debe colocar Campo = *campoGlobal* (i.e. PERCodigo = *EVEEnlaceP*).
<to></to> Si esta etiqueta es hija de <messageX> representa los códigos de agente de las personas a quienes se les envía el mensaje separados por coma. Si es hija de <emailX> representa las direcciones de correo a las que se les va a enviar el correo electrónico. Si se establece un valor para <toTable>, <toFields> y <toCondition> representa el nombre interno del campo que contiene el correo electrónico.
<subject></subject> Se puede utilizar para las acciones de envío de mensaje interno y correo electrónico. Representa el asunto del mensaje interno o correo electrónico.
<content></content> Se puede utilizar para las acciones de envío de mensaje interno y correo electrónico. Representa el contenido del mensaje interno o correo electrónico.
<email></email> Etiqueta hija de mensajeX. Si se coloca en esta etiqueta el valor 'SI', se envía una copia del mensaje como correo electrónico al receptor de la información.
<errors></errors> Etiqueta hija de mensajeX. Variable donde se almacenan los mensajes de error.
<options></options> Etiqueta hija de mensaje X. La opción ECHO imprime cada query.