Разработка
01
Мар
6

Подсчитываем количество звонков с помощью плагина

Сегодня будет более-менее «реальная» притянутая за уши задача по плагиностроению 🙂 … А именно – подсчитаем количество завершенных Звонков привязанных (по полю «В отношении») к какой-либо записи Бизнес-партнера. И это количество будет заноситься в специально созданное для этого поле Количество звонков (new_totalnumberofcalls) на форме Бизнес-партнера, которое отображается только для чтения.

  • Для начала создайте новое поле для объекта Бизнес-партнер, с именем new_totalnumberofcalls типом integer. Поместите его на форму и поставьте галку «только для чтения»;
  • Создайте новый плагин и повесьте на него такой код:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using Microsoft.Crm.Sdk;
    using Microsoft.Crm.SdkTypeProxy;
    using Microsoft.Crm.Sdk.Query;
    using System.Collections;
    using System.Data;
    using System.Data.SqlClient;
    
    namespace Microsoft.Crm.Sdk.UpdatingAccount
    {
        public class endless : IPlugin
        {
            // Назначаем дефолтное значение для количества звонков
            int NumberOfCalls= 1;
            
            public void Execute(IPluginExecutionContext context)
            {
                // Проверяем, что плагин выполняется для объекта Звонок и содержит необходимые свойства
                if (
                    context.PrimaryEntityName == EntityName.phonecall.ToString() && 
                    context.InputParameters.Properties.Contains("EntityMoniker") && 
                    context.InputParameters.Properties.Contains("State")
                )
                {
                    // Получаем ID текущего Звонка и его статус
                    Guid PhoneCallId = ((Moniker)context.InputParameters.Properties["EntityMoniker"]).Id;
                    PhoneCallState stateCode = (PhoneCallState)Enum.Parse(
                        typeof(PhoneCallState), 
                        ((string)context.InputParameters.Properties["State"])
                    );
                    
                    // Если Звонок имеет статус completed, обновляем поле связанной записи Бизнес-партнера
                    if (stateCode == PhoneCallState.Completed)
                    {
                        ICrmService service = context.CreateCrmService(false);
                        phonecall myphonecall = (phonecall)service.Retrieve(
                            EntityName.phonecall.ToString(),
                            PhoneCallId, new AllColumns()
                        );
                        
                        string regardingType = myphonecall.regardingobjectid.type;
                        Guid regardingId = myphonecall.regardingobjectid.Value;
                        
                        // Если не тот тип клиента указан в Звонке (т.е. не Бизнес-партнер), то прекращаем работу плагина
                        if (regardingType != EntityName.account.ToString())
                        {
                            return;
                        }
                        
                        // Задаем параметры возвращаемого Бизнес-партнера (указанного в поле клиент)
                        TargetRetrieveAccount target = new TargetRetrieveAccount();
                        target.EntityId = regardingId;
                        
                        RetrieveRequest getAccount = new RetrieveRequest(); 
                        getAccount.ReturnDynamicEntities = true;
                        getAccount.Target = target;
                        getAccount.ColumnSet = new AllColumns();
                        
                        // Отправляем запрос в CRM  Service и получаем результат
                        RetrieveResponse retrieved = (RetrieveResponse)service.Execute(getAccount);
                        DynamicEntity regardingAccount = (DynamicEntity)retrieved.BusinessEntity;
                        
                        // Если поле new_callnumber существует, то обновляем его, увелививая на на единицу
                        if (regardingAccount.Properties.Contains("new_totalnumberofcalls"))
                        {
                            ((CrmNumber)regardingAccount.Properties["new_totalnumberofcalls"]).Value += NumberOfCalls;
                        }
                        else
                        {
                            regardingAccount.Properties.Add(new CrmNumberProperty("new_totalnumberofcalls", new CrmNumber(NumberOfCalls)));
                        }
                        
                        // Отправляем запрос на обновление в CRM
                        service.Update(regardingAccount);
                    }
                }
            }
        }
    }
    
  • Зарегистрируйте плагин на событие SetStateDynamicEntity для объекта phonecall;
  • Тестируем: создайте несколько звонков, в поле «В отношении» которых укажите какого-либо Бизнес-партнера. Затем откройте этого Бизнес-партнера и посмотрите, как изменится поле Количество звонков.




Комментарии (6)
  • a33ik 01.03.2010

    Если поле regarding не будет заполнено — плагин обвалится с исключением.

    Лучше не получать данные из CRM, а воспользоваться имаджами.

    Не учитываются ситуации повторого открытия звонка, удаления звонков…

  • mc707 01.03.2010

    Доброго времени суток!

    Не подскажете ли, есть ли у Вас наработки по поводу организации всплывающих подсказок по назначенным задачам (как в outlook)? Говорят, что это можно организовать только с помощью плагинов.

  • slivka_83 01.03.2010

    Боюсь что нет. Где то видел как задействовать функционал Outlook’а по уведомлениям для CRM задач (но это при использовании Outlook клиента). Но сейчас чего-то не найду…

  • mc707 01.03.2010

    Нет, спасибо, но мы специально не хотим использовать outlook-клиент. Возьмусь тогда сам за написание плагина, который на post-стадии будет по COM-объектам записывать задачу в Outlook.

  • Sergey_M 01.03.2010

    Здравствуйте. Скажите, была ли похожая задача: посчитать количество совершенных звоноков по каждому менеджеру? И, например, вывести их в какой-то рейтинг или отчет?

  • slivka_83 01.03.2010

    Здравствуйте.
    В отчете такое просто реализовать.

*

code