Tecno Dgs Blog

Publicado el: 14 de Septiembre, 2006, 16:00

Es este ejemplo, la idea es mostrar como, hacer una encuesta, que se comunique con CRM, por medio de los WebServices y que a partir de la respuesta de la misma, pueda cerrar el caso ( incident ) , además de almacenar los resultados en una tabla ( en una base separada ) para luego hacer estadísticas sobre el resultado de las mismas.

Es una pagina asp.net que recibe como parámetro el "Nro de Caso" (ticketnumber) de un caso (incident).  Muestra el Cliente, el Titulo y la Descripción del caso. Para ello se conecta al WebService y hace un Query con el nro de caso y los ítems a elegir de la encuesta. (En este caso en particular son 4 preguntas con 4 opciones cada una) y un Botón "Enviar".

Al "Enviar" (dependiendo del parámetro "CerrarEncuesta")  crea una resolución de caso, la asocia al caso, y envía la petición de resolución por medio del servicio. Poniendo como descripción de la resolución, la respuesta de la encuesta. Además, graba un registro en la tabla de datos de la encuesta.

El código:

Esta función, devuelve una instancia del WebService, usando las credenciales correspondientes.

Private Function Login() As CrmService

    ' función Login ()
    ' Toma los parametros del Web.config, y se loguea en el webservice

    Dim MyService As New CrmService

    Dim CRMServiceUser As String = ConfigurationSettings.AppSettings("CRMServiceUser")
    Dim CRMServicePass As String = ConfigurationSettings.AppSettings("CRMServicePass")
    Dim CRMServiceDominio As String = ConfigurationSettings.AppSettings("CRMServiceDominio")

    ' Si el parametro CRMServiceUser esta vacio,
    ' utiliza las credenciales del usuario que lo está corriendo
    If IsNothing(CRMServiceUser) Then
        MyService.Credentials = System.Net.CredentialCache.DefaultCredentials
    Else
        MyService.Credentials = New System.Net.NetworkCredential(CRMServiceUser, CRMServicePass, CRMServiceDominio)
    End If
    Return MyService
End Function

Esta función, retorna un caso (incident) a partir del Nro de Caso (string)

Private Function GetCaso(ByVal NroCaso As String) As incident
    ' función GetCaso ()
    ' Parametros : Numero de caso ( ticketnumber ) del caso que se quiere mostrar
    ' Retorna : un Caso ( incident )

    ' DEfinir las columnas a recibir
    Dim cols As New ColumnSet
    cols.Attributes = New String() {"title", "description", "customerid", "ticketnumber", "ownerid", "statecode"}
    ' Definir las Condiciones
    Dim condition As New ConditionExpression
    condition.AttributeName = "ticketnumber"
    condition.Operator = ConditionOperator.Like
    condition.Values = New String() {NroCaso}

    ' Armar el filtro con las condiciones
    Dim filter As New FilterExpression
    filter.FilterOperator = LogicalOperator.And
    filter.Conditions = New ConditionExpression() {condition}
    
    ' Crear el Query con las Columnas y el filtro
    Dim query As New QueryExpression
    query.EntityName = EntityName.incident.ToString
    query.ColumnSet = cols
    query.Criteria = filter
    
    Try
        ' Ejecutar el query
        Dim Casos As BusinessEntityCollection = service.RetrieveMultiple(query)
    
        If Casos.BusinessEntities.Length = 1 Then
            Dim caso As incident
            caso = Casos.BusinessEntities(0)
            Return caso
        Else
            Return Nothing
        End If
    Catch e As Exception
        Return Nothing
        'Stop
    End Try
End Function

Esta función, recibe por parámetro el caso (incident) y el texto que ira en la descripción. Retorna Verdadero, si pudo cerrar el caso.  Podría no poder hacerlo si se encuentra Actividades pendientes, en el caso. O si es caso ya estuviera cerrado.

Private Function CloseCaso(ByVal caso As incident, ByVal TxtEncuesta As String) As Boolean
    ' función CloseCaso ()
    ' Parametros :  Caso ( incident ) que se quiere cerrar
    '               TxtEncuesta : texto que se va a incluir
    '                       como descripcion del cierre del caso (incidentresolution)
    ' Retorna : True si OK

    If caso.statecode.Value <> IncidentState.Activo Then
        Return False
    Else

        Dim activity As New incidentresolution
        activity.incidentid = New Lookup
        activity.incidentid.type = EntityName.incident.ToString()
        activity.incidentid.Value = caso.incidentid.Value
        activity.ownerid = New Owner
        activity.ownerid.type = EntityName.systemuser.ToString()
        activity.ownerid.Value = caso.ownerid.Value
        activity.subject = SUBJECT_RESULUCION_CASO
        activity.description = TxtEncuesta.ToString

        Dim closeReq As New CloseIncidentRequest
        closeReq.IncidentResolution = activity
        closeReq.Status = -1

        ' Cierra el caso
        Try
            Dim stateSet As CloseIncidentResponse = CType(service.Execute(closeReq), CloseIncidentResponse)
            Return True
        Catch e As Exception
            'Stop
            Return False

        End Try

    End If

End Function
Por dgsosa, en: MS-CRM 3.0