Microsoft CRM – программирование Closed Activity

 

Игорь Кудряшов

Alba Spectrum Technologies

(095) 918-3314, (095) 918-3111, help@albaspectrum.com  

 

 

 

Microsoft CRM - это попытка отвоевать долю рынка у Siebel, Oracle и других традиционных поставщиков Client Relationship Management систем.  Microsoft CRM использует целый спектр новых Microsoft технологий: .Net, MS Exchange, MS Outlook, MS SQL Server, репликация, индексирование, Active Directory, систему безопасности Windows 2000/2003, Web Service, XML, XLTP. Языки программирования C# и VB.Net, а также HTML и  JavaScript.

 

 

Данная статья затрагивает вопросы создания Closed Activity.

 

Одной из функций разработанного нами Exchange Event Handler является создание в MS CRM Close Activity на базе обработанных почтовых сообщений. Взаимодействие с MS CRM осуществляется двумя путями – через использование MS CRM SDK (обработка входных и выходных XML сообщений) и с помощью прямого доступа к базе MS CRM. Давайте рассмотри алгоритм создания Closed Activity:

 

1)     Сначала мы должны определить, для какой сущности мы создаем ActivityAccount, Lead, Contact. Выбор необходимой сущности осуществляется по некоторому условию – в нашем случае это e-mail адрес:

 

   if ((crmAccount = crmConnector.GetAccount(mailboxFrom)) != null) {

}

   else if ((crmContact = crmConnector.GetContact(mailboxFrom)) != null) {

}

else if ((crmLead = crmConnector.GetLead(mailboxFrom)) != null) {

}

 

2)     После этого необходимо получить GUID идентификатор системного пользователя CRM, которому принадлежит эта сущность, например:

 

       crmUser = crmConnector.GetUser(crmAccount.GetOwnerId());

 

 

3)     Следующим шагом будет собственно создание Closed Activity:

 

       emailId = crmConnector.CreateEmailActivity(

              crmUser.GetId(),

              Microsoft.Crm.Platform.Types.ObjectType.otAccount, crmAccount.GetId(),

              Microsoft.Crm.Platform.Types.ObjectType.otSystemUser, crmUser.GetId(),

              crmAccount.GetEmailAddress(), crmUser.GetEmailAddress(), sSubject, sBody);

 

4)     Метод для создания Closed Activity:

 

   public Guid CreateEmailActivity(Guid userId, int fromObjectType, Guid fromObjectId, int toObjectType, Guid toObjectId, string mailFrom, string mailTo, string subject, string body) {

          try    {

                 log.Debug("Prepare for Mail Activity Creating");

 

                 // BizUser proxy object

                 Microsoft.Crm.Platform.Proxy.BizUser bizUser = new Microsoft.Crm.Platform.Proxy.BizUser();

         

                 ICredentials credentials = new NetworkCredential(sysUserId, sysPassword, sysDomain);

 

                 bizUser.Url = crmDir + "BizUser.srf";

                 bizUser.Credentials = credentials;

                 Microsoft.Crm.Platform.Proxy.CUserAuth userAuth = bizUser.WhoAmI();

 

                 // CRMEmail proxy object

                 Microsoft.Crm.Platform.Proxy.CRMEmail email = new Microsoft.Crm.Platform.Proxy.CRMEmail();

                 email.Credentials = credentials;

                 email.Url = crmDir + "CRMEmail.srf";

 

                 // Set up the XML string for the activity

                 string strActivityXml = "<emailactivity>";

                 strActivityXml += "<messagesubject><![CDATA[" + subject + "]]></messagesubject>";

                 strActivityXml += "<messagebody><![CDATA[" + body.Replace("\n", "<br>") + "]]></messagebody>";

                 strActivityXml += "<ownerid type=\"" + Microsoft.Crm.Platform.Types.ObjectType.otSystemUser.ToString() +"\">";

                 strActivityXml += userId.ToString("B") + "</ownerid>";

                 strActivityXml += "</emailactivity>";

 

                 // Set up the XML string for the activity parties

                 string strPartiesXml = "<activityparties>";

                 strPartiesXml += "<activityparty>";

                 strPartiesXml += "<addressused>" + mailTo + "</addressused>";

 

                 if (toObjectType == Microsoft.Crm.Platform.Types.ObjectType.otSystemUser) {

                        strPartiesXml += "<partyobjecttypecode>" + Microsoft.Crm.Platform.Types.ObjectType.otSystemUser.ToString() + "</partyobjecttypecode>";

                 }

                 else if (toObjectType == Microsoft.Crm.Platform.Types.ObjectType.otAccount) {

                        strPartiesXml += "<partyobjecttypecode>" + Microsoft.Crm.Platform.Types.ObjectType.otAccount.ToString() + "</partyobjecttypecode>";

                 }

                 else if (toObjectType == Microsoft.Crm.Platform.Types.ObjectType.otContact) {

                        strPartiesXml += "<partyobjecttypecode>" + Microsoft.Crm.Platform.Types.ObjectType.otContact.ToString() + "</partyobjecttypecode>";

                 }

                 else if (toObjectType == Microsoft.Crm.Platform.Types.ObjectType.otLead) {

                        strPartiesXml += "<partyobjecttypecode>" + Microsoft.Crm.Platform.Types.ObjectType.otLead.ToString() + "</partyobjecttypecode>";

                 }

 

                 strPartiesXml += "<partyid>"+ toObjectId.ToString("B") + "</partyid>";

                 strPartiesXml += "<participationtypemask>";

                 strPartiesXml += Microsoft.Crm.Platform.Types.ACTIVITY_PARTY_TYPE.ACTIVITY_PARTY_TO_RECIPIENT.ToString();

                 strPartiesXml += "</participationtypemask>";

                 strPartiesXml += "</activityparty>";

                 strPartiesXml += "<activityparty>";

                 strPartiesXml += "<addressused>" + mailFrom + "</addressused>";

 

                 if (fromObjectType == Microsoft.Crm.Platform.Types.ObjectType.otSystemUser) {

                        strPartiesXml += "<partyobjecttypecode>" + Microsoft.Crm.Platform.Types.ObjectType.otSystemUser.ToString() + "</partyobjecttypecode>";

                 }

                 else if (fromObjectType == Microsoft.Crm.Platform.Types.ObjectType.otAccount) {

                        strPartiesXml += "<partyobjecttypecode>" + Microsoft.Crm.Platform.Types.ObjectType.otAccount.ToString() + "</partyobjecttypecode>";

                 }

                 else if (fromObjectType == Microsoft.Crm.Platform.Types.ObjectType.otContact) {

                        strPartiesXml += "<partyobjecttypecode>" + Microsoft.Crm.Platform.Types.ObjectType.otContact.ToString() + "</partyobjecttypecode>";

                 }

                 else if (fromObjectType == Microsoft.Crm.Platform.Types.ObjectType.otLead) {

                        strPartiesXml += "<partyobjecttypecode>" + Microsoft.Crm.Platform.Types.ObjectType.otLead.ToString() + "</partyobjecttypecode>";

                 }

 

                 strPartiesXml += "<partyid>"+ fromObjectId.ToString("B") + "</partyid>";

                 strPartiesXml += "<participationtypemask>";

                 strPartiesXml += Microsoft.Crm.Platform.Types.ACTIVITY_PARTY_TYPE.ACTIVITY_PARTY_SENDER.ToString();

                 strPartiesXml += "</participationtypemask>";

                 strPartiesXml += "</activityparty>";

                 strPartiesXml += "</activityparties>";

 

                 log.Debug(strPartiesXml);

 

                 // Create the e-mail object

                 Guid emailId = new Guid(email.Create(userAuth, strActivityXml, strPartiesXml));

                 return emailId;

          }

          catch (System.Web.Services.Protocols.SoapException e)  {

                 log.Debug("ErrorMessage: " + e.Message + " " + e.Detail.OuterXml + " Source: " + e.Source);

          }

          catch (Exception e) {

                 log.Debug(e.Message + "\r\n" + e.StackTrace);

          }

 

          return new Guid();

   }

 

5)     Необходимым условием для корректного отображения вновь созданного Activity является установка его кодов в соответствие со стандартами MS CRM:

 

   public void UpdateActivityCodes(Guid emailId) {

          try {

                 OleDbCommand command = conn.CreateCommand();

 

                 command.CommandText = "UPDATE ActivityBase SET DirectionCode = (?), StateCode = (?), PriorityCode = (?) WHERE ActivityId = (?)";

                 command.Prepare();

                 command.Parameters.Add(new OleDbParameter("DirectionCode", Microsoft.Crm.Platform.Types.EVENT_DIRECTION.ED_INCOMING));

                 command.Parameters.Add(new OleDbParameter("StateCode", Microsoft.Crm.Platform.Types.ACTIVITY_STATE.ACTS_CLOSED));

                 command.Parameters.Add(new OleDbParameter("PriorityCode", Microsoft.Crm.Platform.Types.PRIORITY_CODE.PC_MEDIUM));

                 command.Parameters.Add(new OleDbParameter("ActivityId", emailId));

 

                 log.Debug("Prepare to update activity code " + emailId.ToString("B") + " in ActivityBase");

 

                 command.ExecuteNonQuery();

          }

          catch(Exception e) {

                 log.Debug(e.Message + "\r\n" + e.StackTrace);

          }

   }

   public void UpdateActivityQueueCodes(Guid emailId, Guid queueId) {

          try {

                 OleDbCommand command = conn.CreateCommand();

 

                 command.CommandText = "UPDATE QueueItemBase SET Priority = (?), State = (?), QueueId = (?) WHERE ObjectId = (?)";

                 command.Prepare();

                 command.Parameters.Add(new OleDbParameter("Priority", Microsoft.Crm.Platform.Types.PRIORITY_CODE.PC_MEDIUM));

                 command.Parameters.Add(new OleDbParameter("State", Microsoft.Crm.Platform.Types.ACTIVITY_STATE.ACTS_CLOSED));

                 command.Parameters.Add(new OleDbParameter("QueueId", queueId));

                 command.Parameters.Add(new OleDbParameter("ObjectId", emailId));

 

                 log.Debug("Prepare to update activity queue code " + emailId.ToString("B") + " in QueueItemBase");

 

                 command.ExecuteNonQuery();

          }

          catch(Exception e) {

                 log.Debug(e.Message + "\r\n" + e.StackTrace);

          }

   }

 

Желаем вам удачи в процессе настройки Microsoft CRM! Если вам нужна помощь наших специалистов -  мы всегда готовы вам помочь.  Позвоните нам в Москве (095) 918-3314, (095) 918-3111 , в США: 1-866-528-0577 или пишите: help@albaspectrum.com

 

Игорь Кудряшов – ведущий разработчик в Ronix Systems

( http://www.ronix.ru ), европейском подразделении Alba Spectrum Technologies ( http://www.albaspectrum.com ), компании – партнере Microsoft Business Solutions, обслуживающей клиентов по  Российской Федерации, включая города Москва, Санкт-Петербург, Екатеринбург, Казань, Новосибирск и др.