Коллеги, добрый вечер!
Давно не писал под СРМ, хотелось бы узнать какое решение выбрать.
Пытаемся внедрить ITIL, используем базовую сущность - Обращение (Incident).
Добавил три кастомных поля: Факт. реакция, Дата Завершения и Затраченное время.
Так вот, js заполняю поле Факт. реакция, а дату Завершения и Затраченное время
устанавливаю в процессе закрытия обращения плагином
- Message: Update
- Primary entity: Incident
- Stage of execution: Post-operation
- Execution mode: Synchronous
- Execution order: 1
Наскольо я понял надо вешать плагин на SetState
X++:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xrm.Sdk;
using Microsoft.Crm.Sdk.Messages;
using Microsoft.Xrm.Sdk.Query;
using System.ServiceModel.Description;
using System.ServiceModel;
using System.Globalization;
namespace AmicaPackage.SetCaseDurationPlugin
{
public class SetFactDuration : IPlugin
{
//Resolved
public readonly int problemResolved = 5;
public readonly int infoGranted = 1000;
public void Execute(IServiceProvider ServiceProvider)
{
IPluginExecutionContext Context = (IPluginExecutionContext)ServiceProvider.GetService(typeof(IPluginExecutionContext));
IOrganizationServiceFactory ServiceFactory = (IOrganizationServiceFactory)ServiceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService Service = ServiceFactory.CreateOrganizationService(Context.UserId);
ITracingService tracingService = (ITracingService)ServiceProvider.GetService(typeof(ITracingService));
if (Context.PostEntityImages.Contains("PostImage") && Context.PostEntityImages["PostImage"] is Entity)
{
if (Context.Depth > 1) return;
Entity incident = (Entity)Context.PostEntityImages["PostImage"];
var startDate = incident.GetAttributeValue<DateTime>("new_factreaction");
var dueDate = DateTime.Now;
var statusCode = ((OptionSetValue)incident["statuscode"]).Value;
if (statusCode == problemResolved || statusCode == infoGranted)
{
if (startDate != null)
{
var minutes = Math.Abs(Math.Round(((startDate - dueDate).TotalMinutes), 2));
incident.Attributes.Add("new_facttime", dueDate);
incident.Attributes.Add("new_duedate", dueDate);
incident.Attributes.Add("new_timediff", minutes);
}
}
Service.Update(incident);
}
}
}
}
Так вот, проблема, что плагин пытается редактировать завершенное обращение, а оно только ReadOnly
Как правильно апдейтить поля после завершения кейса?