You are on page 1of 7

using using using using using using using using

System; System.Collections.Generic; System.Linq; System.Text; Microsoft.Xrm.Sdk; Microsoft.Xrm.Sdk.Query; Microsoft.Xrm.Sdk.Messages; Microsoft.Crm.Sdk.Messages;

namespace Microsoft.IT.ConnectedCRM.UEITJapan.Plugin.SLATimeSpentLibrary { public class CalculateSLATimeSpent:IPlugin { public void Execute(IServiceProvider serviceProvider) { Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sd k.IPluginExecutionContext) serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecut ionContext)); ITracingService tracingService = (ITracingService)serviceProvider.Get Service(typeof(ITracingService)); if (tracingService == null) throw new InvalidPluginExecutionException ("Failed to retrieve the tracing service."); try { if (context.MessageName == "Retrieve" && context.OutputParameters.Contains("BusinessEntity")) { //if ((context.Depth > 1)) //{ return; } IOrganizationServiceFactory serviceFactory = (IOrganizationSe rviceFactory) serviceProvider.GetService(typeof(IOrganizationServiceFac tory)); IOrganizationService MyIOrgService = serviceFactory.CreateOrg anizationService(context.UserId); Entity caseEntity = (Entity)context.OutputParameters["Busines sEntity"];//(Entity)context.InputParameters["Target"]; // DateTime createdOn = DateTime.Parse("01/01/1900 00:00:00"); ColumnSet columns = new ColumnSet("ueit_spentslahours", "ueit _casestatus"); // Create query expression. QueryExpression query = new QueryExpression(); query.ColumnSet = columns; query.EntityName = "incident"; query.Criteria = new FilterExpression { FilterOperator = LogicalOperator.And, Conditions = { new ConditionExpression { AttributeName="incidentid", Operator=ConditionOperator.Equal, Values={caseEntity.Id} }

} }; EntityCollection caseEntityCollection = MyIOrgService.Retriev eMultiple(query); if (caseEntityCollection.Entities.Count >= 1) { foreach (Entity incidentRec in caseEntityCollection.Entit ies) { if (incidentRec.Contains("ueit_casestatus") && incide ntRec.Contains("ueit_spentslahours")) { EntityReference caseRef = (EntityReference)incide ntRec["ueit_casestatus"]; if (caseRef.Name.ToLower() != "resolved") { string spentSLAHoursString = incidentRec["uei t_spentslahours"].ToString(); if(spentSLAHoursString.Contains(":")) { spentSLAHoursString= spentSLAHoursString. Replace(":","."); } decimal spentslahours = Convert.ToDecimal(spe ntSLAHoursString); DateTime utcNow = DateTime.Now; decimal elapsedTime = Convert.ToDecimal(Math. Round((utcNow - createdOn).TotalHours, 2)); //ueit_elapsedtime int maxSLAHours = GetMaxSLAHours(MyIOrgServic e, tracingService, caseEntity.Id); string slaHoursString = string.Empty; decimal val = Convert.ToDecimal(maxSLAHours); if (maxSLAHours != 0) { slaHoursString = maxSLAHours.ToString(); } bool slaActivityFlag = GetServiceActivity(cas eEntity.Id, tracingService, MyIOrgService); bool emailReadFlag = GetEmailReadStatus(caseE ntity.Id, tracingService, MyIOrgService); Entity incidentEntity = new Entity(); incidentEntity.LogicalName = "incident"; incidentEntity["ueit_spentslahours"] = spentS LAHours; incidentEntity["ueit_slahours"] = slaHoursStr ing; incidentEntity["ueit_elapsedtime"] = elapsedT ime.ToString(); if (slaActivityFlag == true) { incidentEntity["ueit_serviceactivityflag" ] = true;//open service activities to case. } else {

incidentEntity["ueit_serviceactivityflag" ] = false;//No Open service activites to this case. } if (spentslahours <= val && slaActivityFlag = = false) { incidentEntity["ueit_slastatus"] = new Op tionSetValue(692450000);//Within SLA } else { incidentEntity["ueit_slastatus"] = new Op tionSetValue(692450001);//Overdue } if (emailReadFlag == false)//no unread emails for this case { incidentEntity["ueit_emailstatus"] = new OptionSetValue(692450000);//Read } incidentEntity["incidentid"] = caseEntity.Id; UpdateRequest updatecountreq = new UpdateRequ est() { Target = incidentEntity, }; UpdateResponse res = (UpdateResponse)MyIOrgSe rvice.Execute(updatecountreq); } } } } } } catch (System.TimeoutException ex) { tracingService.Trace("ERROR - Microsoft.IT.ConnectedCRM.UEITJapan .Plugin.SLATimeSpentLibrary: {0}", ex.Message); } catch (InvalidPluginExecutionException ex) { tracingService.Trace("ERROR - Microsoft.IT.ConnectedCRM.UEITJapan .Plugin.SLATimeSpentLibrary: {0}", ex.Message); } catch (Exception ex) { tracingService.Trace("ERROR - Microsoft.IT.ConnectedCRM.UEITJapan .Plugin.SLATimeSpentLibrary: {0}", ex.Message); } } private bool GetEmailReadStatus(Guid caseID, ITracingService tracingServi ce, IOrganizationService MyIOrgService) { ColumnSet columns = new ColumnSet("ueit_emailstatus"); // Create query expression. QueryExpression query = new QueryExpression(); query.ColumnSet = columns; query.EntityName = "email";

query.Criteria = new FilterExpression { FilterOperator = LogicalOperator.And, Conditions = { new ConditionExpression { AttributeName = "regardingobjectid", Operator = ConditionOperator.Equal, Values = { caseID } }, new ConditionExpression { AttributeName="ueit_emailstatus", Operator=ConditionOperator.Equal, Values={true} }, new ConditionExpression { AttributeName="statecode", Operator=ConditionOperator.Equal, Values={0} } } }; EntityCollection activeEmails = MyIOrgService.RetrieveMultiple(query) ; if (activeEmails.Entities.Count >= 1) { return true; } return false; } private int GetMaxSLAHours(IOrganizationService MyIOrgService, ITracingSe rvice tracingService, Guid caseID) { ColumnSet columns = new ColumnSet("ueit_slahours"); // Create query expression. QueryExpression query = new QueryExpression(); query.ColumnSet = columns; query.EntityName = "ueit_serviceactivity"; query.Criteria = new FilterExpression { FilterOperator = LogicalOperator.And, Conditions = { new ConditionExpression("ueit_relatedcase", Condit ionOperator.Equal, caseID) } }; OrderExpression oe = new OrderExpression(); oe.AttributeName = "ueit_slahours"; oe.OrderType = OrderType.Descending; query.Orders.Add(oe); query.PageInfo = new PagingInfo(); query.PageInfo.Count = 1; query.PageInfo.PageNumber = 1; query.PageInfo.PagingCookie = null; EntityCollection serviceActivityCollection = MyIOrgService.RetrieveMu ltiple(query); int slaHoursMax = 0; if (serviceActivityCollection.Entities.Count >= 1)

{ var c = serviceActivityCollection.Entities[0]; slaHoursMax = (int)c["ueit_slahours"]; } return slaHoursMax; } private bool GetServiceActivity(Guid caseID, ITracingService tracingServi ce, IOrganizationService MyIOrgService) { string statusval = "692450000";//In Progress ColumnSet columns = new ColumnSet("ueit_serviceactivityid"); // Create query expression. QueryExpression query = new QueryExpression(); query.ColumnSet = columns; query.EntityName = "ueit_serviceactivity"; query.Criteria = new FilterExpression { FilterOperator = LogicalOperator.And, Conditions = { new ConditionExpression { AttributeName = "ueit_relatedcase", Operator = ConditionOperator.Equal, Values = { caseID } }, new ConditionExpression { AttributeName="ueit_activitystatus", Operator=ConditionOperator.Equal, Values={statusval} }, new ConditionExpression { AttributeName="statecode", Operator=ConditionOperator.Equal, Values={0} } } }; EntityCollection activeEmails = MyIOrgService.RetrieveMultiple(query) ; if (activeEmails.Entities.Count >= 1) { return true; } return false; } private decimal getPendingStatusSLAHours(ITracingService tracingService, IOrganizationService MyIOrgService, Guid caseId) { decimal pendingStatusSLA = 0; ColumnSet columns = new ColumnSet("ueit_spentslatime"); // Create query expression. QueryExpression query = new QueryExpression(); query.ColumnSet = columns; query.EntityName = "ueit_slatracker"; query.Criteria = new FilterExpression {

FilterOperator = LogicalOperator.And, Conditions = { new ConditionExpression { AttributeName="ueit_name", Operator=ConditionOperator.Equal, Values={"Pending"} } } }; EntityCollection slaTrackerCollection = MyIOrgService.RetrieveMultipl e(query); if (slaTrackerCollection.Entities.Count >= 1) { foreach (Entity slaTracker in slaTrackerCollection.Entities) { if (slaTracker.Contains("ueit_spentslatime")) { pendingStatusSLA = (decimal)slaTracker["ueit_spentslatime "]; } } } return pendingStatusSLA; } private Entity RetrieveBusinessDays(IOrganizationService MyIOrgService, I TracingService tracingService) { QueryExpression queryRegion = new QueryExpression("ueit_slaregion"); queryRegion.ColumnSet = new Microsoft.Xrm.Sdk.Query.ColumnSet(); queryRegion.ColumnSet.Columns.Add("ueit_name"); queryRegion.ColumnSet.Columns.Add("ueit_timezone"); queryRegion.ColumnSet.Columns.Add("ueit_starttime"); queryRegion.ColumnSet.Columns.Add("ueit_endtime"); queryRegion.ColumnSet.Columns.Add("ueit_24hourshift"); queryRegion.ColumnSet.Columns.Add("ueit_monday"); queryRegion.ColumnSet.Columns.Add("ueit_tuesday"); queryRegion.ColumnSet.Columns.Add("ueit_wednesday"); queryRegion.ColumnSet.Columns.Add("ueit_thursday"); queryRegion.ColumnSet.Columns.Add("ueit_friday"); queryRegion.ColumnSet.Columns.Add("ueit_saturday"); queryRegion.ColumnSet.Columns.Add("ueit_sunday"); queryRegion.Criteria.AddCondition("ueit_name", ConditionOperator.Equa l, "Japan"); EntityCollection regionColl = (EntityCollection)MyIOrgService.Retriev eMultiple(queryRegion); if (regionColl.Entities.Count > 0) { Entity region = (Entity)regionColl.Entities[0]; return region; } else

return null; } } }

You might also like