AXForum  
Вернуться   AXForum > Microsoft Dynamics CRM > Dynamics CRM: Разработка
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.05.2015, 00:28   #1  
GetLucky is offline
GetLucky
Участник
Лучший по профессии 2014
 
99 / 13 (1) ++
Регистрация: 03.09.2013
Incident Resolution In CRM Online 2013
Коллеги, добрый вечер!

Давно не писал под СРМ, хотелось бы узнать какое решение выбрать.

Пытаемся внедрить 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

Как правильно апдейтить поля после завершения кейса?

Последний раз редактировалось GetLucky; 22.05.2015 в 00:42.
Старый 22.05.2015, 08:52   #2  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Никак. Закрытую запись редактировать есть только 2 варианта - Открыть, отредактировать, закрыть.

Пересмотрев ваш вопрос ещё раз - переделывайте плагин на Pre-Operation и будет вам счастье.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit

Последний раз редактировалось a33ik; 22.05.2015 в 11:37.
Старый 22.05.2015, 09:40   #3  
Borisvil is offline
Borisvil
Участник
 
123 / 36 (2) +++
Регистрация: 03.06.2011
Адрес: Санкт-Петербург
Это можно реализовать процессом (которые раньше бизнес-процессами назывались), регистрировать на Условие запуска - Перед - Изменение статуса записи, Обновить сущность и устанавливаете нужные поля. Работает.
Старый 22.05.2015, 15:25   #4  
GetLucky is offline
GetLucky
Участник
Лучший по профессии 2014
 
99 / 13 (1) ++
Регистрация: 03.09.2013
Цитата:
Сообщение от Borisvil Посмотреть сообщение
Это можно реализовать процессом (которые раньше бизнес-процессами назывались), регистрировать на Условие запуска - Перед - Изменение статуса записи, Обновить сущность и устанавливаете нужные поля. Работает.
Ок, Спасибо, только не вижу это условие

Старый 22.05.2015, 15:52   #5  
-O_o- is offline
-O_o-
Еда - топливо, Одежда - н
Аватар для -O_o-
Лучший по профессии 2015
Лучший по профессии 2014
 
727 / 80 (4) ++++
Регистрация: 11.05.2012
Адрес: Киев
есть такое понятие как преобразование процесса в риалтайм. Кнопочка сверху.
По сути это синхронный плагин )
__________________
Все что вам нужно - это мозК
Еда - топливо... Одежда - необходимость...
Старый 22.05.2015, 16:26   #6  
GetLucky is offline
GetLucky
Участник
Лучший по профессии 2014
 
99 / 13 (1) ++
Регистрация: 03.09.2013
Цитата:
Сообщение от -O_o- Посмотреть сообщение
есть такое понятие как преобразование процесса в риалтайм. Кнопочка сверху.
По сути это синхронный плагин )
Я в курсе, я не вижу условие запуска
Цитата:
Условие запуска - Перед - Изменение статуса записи
Старый 22.05.2015, 16:53   #7  
-O_o- is offline
-O_o-
Еда - топливо, Одежда - н
Аватар для -O_o-
Лучший по профессии 2015
Лучший по профессии 2014
 
727 / 80 (4) ++++
Регистрация: 11.05.2012
Адрес: Киев
Цитата:
Сообщение от GetLucky Посмотреть сообщение
Я в курсе, я не вижу условие запуска
вот
Изображения
 
__________________
Все что вам нужно - это мозК
Еда - топливо... Одежда - необходимость...
Старый 22.05.2015, 21:50   #8  
GetLucky is offline
GetLucky
Участник
Лучший по профессии 2014
 
99 / 13 (1) ++
Регистрация: 03.09.2013
Цитата:
Сообщение от -O_o- Посмотреть сообщение
вот
На самом деле надо перевести БП в синхронный режим.
Старый 22.05.2015, 22:21   #9  
GetLucky is offline
GetLucky
Участник
Лучший по профессии 2014
 
99 / 13 (1) ++
Регистрация: 03.09.2013
Нашел более правильное решение, т.к. Case переводиться в состояния закрыто с использованием сущности IncidentResolution, то вполне логично повесить на создание этой сущности плагин, который на Post-operation будет апдейтить Кейс.

X++:
public class CaseResolution : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            #region must to have
 
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
 
            IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
 
            // Create service with context of current user
            IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
 
            //create tracing service
            ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
 
            #endregion
 
            #region Variable
 
            Entity targetCase = new Entity("incident");
            string strResolution = string.Empty;
            int intTotalTime = -1;
            int intTotalBillableTime = -1;
            string strRemarks = string.Empty;
 
            #endregion
 
            if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
            {
 
                //create entity context
                Entity entity = (Entity)context.InputParameters["Target"];
 
                if (entity.LogicalName != "incidentresolution")
                    return;
 
                try
                {
                    if (entity.Contains("incidentid"))
                    {
                        //get the related Case
                        targetCase.Id = ((EntityReference)entity["incidentid"]).Id;
                         
                        //capture the Case Resolution Fields                      
                        strResolution = entity.Contains("subject") ? entity["subject"].ToString() : string.Empty;
                        intTotalBillableTime = entity.Contains("timespent") ? (Int32)entity["timespent"] : 0;   
                        strRemarks = entity.Contains("description") ? 
                            (entity["description"] != null ? entity["description"].ToString() : string.Empty) : 
                            string.Empty;
 
                        //get the total time from Activities
                        intTotalTime = GetTotalTime(service, targetCase.Id);
                         
                        //update Case with the fields
                        targetCase["new_resolution"] = strResolution;
                        targetCase["new_totalbillabletime"] = intTotalBillableTime;
                        targetCase["new_totaltime"] = intTotalTime;
                        targetCase["new_remark"] = strRemarks;
                        service.Update(targetCase);
                    }
                }
                catch (Exception ex)
                {
                    throw new InvalidPluginExecutionException(ex.Message);
                }
 
            }
        }
 
        private int GetTotalTime(IOrganizationService service, Guid guidRelatedCaseId)
        {
            //count the Activity Actual Duration Minutes for this Case
            //need to sum time spent of each activity (cannot directly using the actualtdurationminutes) 
 
            int intSumTotalTime = 0;
 
            //Retrieve all related Activities by Case
            QueryExpression query = new QueryExpression("activitypointer");
            query.ColumnSet.AddColumns("actualdurationminutes");
 
            query.Criteria = new FilterExpression();
            query.Criteria.AddCondition("regardingobjectid", ConditionOperator.Equal, guidRelatedCaseId);
 
            // Execute the Query 
            EntityCollection results = service.RetrieveMultiple(query);
 
            foreach (Entity entity in results.Entities)
            {
                int intActivityTime = 0;
                intActivityTime = entity.Contains("actualdurationminutes") ? (Int32)entity["actualdurationminutes"] : 0;
                intSumTotalTime = intSumTotalTime + intActivityTime;
            }
 
            return intSumTotalTime;
        }
    }

Последний раз редактировалось GetLucky; 22.05.2015 в 22:55.
Старый 24.05.2015, 17:16   #10  
-O_o- is offline
-O_o-
Еда - топливо, Одежда - н
Аватар для -O_o-
Лучший по профессии 2015
Лучший по профессии 2014
 
727 / 80 (4) ++++
Регистрация: 11.05.2012
Адрес: Киев
На самом деле, в 2013 уже есть такая тема, как подсчет затраченного времени.
В контрактах учитывается и в "entitlement" не знаю как это на русском объяснить
Посмотрите стандартный функционал, и ненадо писать плагины.
__________________
Все что вам нужно - это мозК
Еда - топливо... Одежда - необходимость...
Старый 24.05.2015, 21:55   #11  
GetLucky is offline
GetLucky
Участник
Лучший по профессии 2014
 
99 / 13 (1) ++
Регистрация: 03.09.2013
Цитата:
Сообщение от -O_o- Посмотреть сообщение
На самом деле, в 2013 уже есть такая тема, как подсчет затраченного времени.
В контрактах учитывается и в "entitlement" не знаю как это на русском объяснить
Посмотрите стандартный функционал, и ненадо писать плагины.
У клиента свой процесс, поэтому в нашем use case надо было именно так сделать
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
crminthefield: Podcast and Overview: Microsoft Dynamics CRM 2011 Update Rollup 15 Blog bot Dynamics CRM: Blogs 1 10.02.2016 10:26
Leon's CRM Musings: Book Review: Microsoft Dynamics CRM 2013 Unleashed Blog bot Dynamics CRM: Blogs 0 31.10.2014 10:11
crminthefield: Podcast and Overview: Microsoft Dynamics CRM 2011 Update Rollup 17 Blog bot Dynamics CRM: Blogs 0 10.05.2014 06:30
crminthefield: Podcast and Overview: Microsoft Dynamics CRM 2013 Update Rollup 2 Blog bot Dynamics CRM: Blogs 0 15.04.2014 01:15
crminthefield: Podcast and Overview: Microsoft Dynamics CRM 2011 Update Rollup 16 Blog bot Dynamics CRM: Blogs 0 23.01.2014 03:15

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 05:55.