20/2/08

Cerrar automáticamente actividades de una campaña

Este problema ha surgido varias veces y hasta ahora no se me había ocurrido una solución satisfactoria. Cuando creamos una campaña (express o no) de marketing, si usamos un canal como cartas o tareas, tenemos que tener a una persona (o varias) que vayan cerrando las actividades cerradas. Esto está bien para un telemarketing o una distribución de trabajos entre varias personas.

¿Pero qué pasa si lo que estamos haciendo es un envío masivo de cartas que envía una sola persona y de una sola vez? ¿Le obligamos a irlas cerrando una por una? No existe el Cerrar masivocomo existe la edición masiva. Tampoco podemos lanzar un workflow sobre un conjunto de actividades. Tampoco parece buena opción ni siquiera registrar la acción, al fin y al cabo para eso tenemos la herramienta en un entorno de marketing.

¿Qué se me ha ocurrido? Suena un poco chapuza: crear una regla de Workflow sobre las cartas que, cuando detecta que están asociadas a una campaña, las cierra automáticamente al cabo de un cierto tiempo. ¿Y cómo las detecta? Sólo se me ocurre poner alguna marca en la categoría, por ejemplo MAILING.



Así quedaría una regla de este tipo. Habría que hacer lo mismo para los otros tipos de actividades que lo requieran. Y aleccionar a los usuarios para que se use bien, claro.

1/2/08

Uso de ObjectDataSource contra CRM


Imaginemos que queremos llegar a esto: una página ASPX que permita leer y modificar datos de CRM, por ejemplo de una cuenta de cliente. Hay mil maneras de hacerlo, sólo que esta a mi me parece especialmente elegante por el poco código que hay que añadir. Es una solución al estilo ASP.NET 2.0, así que vamos a trabajar con Visual Studio 2005 (o 2008).
Lo primero es crear el código del componente de datos, que actuará de intermediario entre el control ObjectDataSource y el web service de CRM. La clase se llama Cuenta y representa la capa de lógica de negocio especializada en operaciones sobre cuentas de cliente. Por cierto, ¿alguien sabe cómo colorear sintaxis (facilmente) en Blogger?


using System;
using System.ComponentModel;
using CrmNetLib.CrmSdk;

namespace CrmNetLib
{

[DataObject]
public class Cuenta
{
private CrmService crm;

public Cuenta()
{
crm = new CrmService();
crm.Credentials = System.Net.CredentialCache.DefaultCredentials;
}

[DataObjectMethod(DataObjectMethodType.Select, true)]
public account Buscar(Guid id)
{
return (account)crm.Retrieve(EntityName.account.ToString(),
id, new AllColumns());
}

[DataObjectMethod(DataObjectMethodType.Update, true)]
public void Actualizar(account cuenta)
{
crm.Update(cuenta);
}



}
}




Fijaos en los atributos DataObject y DataObjectMethod. Sirven para que el asistente del ObjectDataSource que pondremos en la página reconozca el objeto como candidato a fuente de datos. Y ahora vamos a la página aspx: lo primero que hacemos es añadir un objeto ObjectDataSource configurando su fuente al objeto comercial (=de lógica de negocio) Cuenta. En mi caso lo he definido en un proyecto aparte de nombre CrmNetLib, pero podría estar en el mismo proyecto, por ejemplo dentro de la carpeta App_Code.




En la siguiente pantalla del asistente, configuramos los métodos de búsqueda y actualización para que apunten a los métodos Buscar y Actualizar de nuestra clase. En un caso más completo, sólo nos faltaría mapear también los métodos de borrado e inserción.









Como el método de búsqueda tiene un parámetro (el id de la cuenta), tenemos que relacionarlo con algún valor de entrada. Escogemos el QueryString de la página, con lo que la URL de acceso tendrá el siguiente aspecto:



http://www.servidor.com/aplicacion/editarcuenta.aspx?id=//GUID de la cuenta//




Por otro lado, el método de actualización recibe un parámetro de tipo account sacado directamente de la SDK de CRM que representa una cuenta con todos sus atributos. También podríamos usar un método que tuviera como parámetros los atributos del objeto, en este caso id, nombre, teléfono y fax.



Ahora sólo queda añadir el control DetailsView para ver los datos de la cuenta. Una vez en la zona del diseñador, escogemos el ObjectDataSource como fuente de datos. Aparecerán todos los campos de la clase account(o sea, muchos campos(.





Para reducirlos a un número manejable, sólo tenemos que escoger la opción Editar campos... Decido quedarme con nombre, teléfono y fax. Si además habilitamos la edición del control, ya habremos terminado en un tiempo record una página de edición de cuentas.

Este es el aspecto final de la página en el diseñador de Visual Studio: