How to capture case resolution information on case record when the case resolved in MS CRM
Few days ago, a requirement came to me in which we have to store the resolution data filled in resolution dialog while resolving the case.
When user click resolve button on a case, a dialog box appears as shown below in which user fills the resolution details:
This information is not stored over case entity but is stored in incident resolution entity which is a backend entity in CRM and is not available to directly interact through CRM screen.
Each time a case is resolved, a record in incient resolution entity is created having refrene to the case resolved.
(It is possible to have more than 1 reord for same case is incident resolution if case is resolved and reopened multiple time.)
At first i thought of writing some server side code on resolve of case, but the problem was that after case us resolved the case record get deactivated. That means we can't update the record by any means, be it CRM screen or service udpate request.
So writing a server-side logic on resolution of case was out of scope.
After some digging, i found out that if we run a server-side logic on creation of record of incident resolution entity, the solution would work and it will update the case before it get freezed.
I write a plugin to get the details filled by user in resolution dialog box from the incident resolution record created.
I then updated this information on 3 custom fields on case form. The output of the solution on case form is as shown below image:
Below is the code snippet of the logic::
Plugin Step Details:
Message : Create
Primary Entity : IncidentResolution
Registered on : Post event
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public class TrackTimeonCase : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
#region Setup
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
IOrganizationService service = ((IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory))).CreateOrganizationService(new Guid?(context.UserId));
ITracingService tracing = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
#endregion
tracing.Trace("0.0");
Entity targetCase = new Entity("incident");
if ((context.InputParameters.Contains("Target")) && (context.InputParameters["Target"] is Entity) & context.Depth < 3)
{
Entity entity = (Entity)context.InputParameters["Target"];
if (entity.LogicalName != "incidentresolution")
return;
try
{
if (entity.Contains("incidentid"))
{
targetCase.Id = ((EntityReference)entity["incidentid"]).Id;
Entity ResolveCase = service.Retrieve("incident", targetCase.Id, new ColumnSet("new_billablemintotal"));
int timespent = entity.Contains("timespent") ? entity.GetAttributeValue<int>("timespent") : 0;
targetCase["new_resolutiondescription"] = entity.Contains("description") ? (entity["description"] != null ? entity["description"].ToString() : string.Empty) : string.Empty;
targetCase["new_resolutionsubject"] = entity.Contains("subject") ? entity["subject"].ToString() : string.Empty;
if (ResolveCase.Contains("new_billablemintotal"))
{
timespent = timespent + ResolveCase.GetAttributeValue<int>("new_billablemintotal");
}
targetCase["new_billablemintotal"] = timespent;
targetCase["new_billablehrs"] = ((decimal)timespent / 60);
service.Update(targetCase);
}
}
catch (Exception ex)
{
throw new InvalidPluginExecutionException(ex.Message);
}
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Hope this was helpful...!!!