Microsoft CRM кастомизация – программирование Closed Activity
Борис Макушкин
Alba Spectrum Technologies
(095) 918-3314, (095) 918-3111, help@albaspectrum.com
Microsoft CRM есть CRM ответ от Микрософта и попытка отвоевать долю рынка у Siebel, Oracle и других традиционных поставщиков Client Relationship Management систем. Microsoft CRM использует целый спектр новых Microsoft технологий: .Net, MS Exchange, MS Outlook, MS SQL Server, репликация, индексирование, Active Directory, Windows 2000/2003 секурити, C#, VB.Net, HTML, XML Web Service, XLTP, Javascript называя несколько примеров.
Сегодняшняя дискуссия затрагивает Activity типа email программирование – обычно вы имеете дело с такими кустомизациями когда вам нужно модифицировать Microsoft Exchange CRM конектор. Как создать закрытую activity?- читайте
Одной из функций разработанного нами Exchange Event Handler является создание в MS CRM Close Activity на базе обработанных почтовых сообщений. Взаимодействие с MS CRM осуществляется двумя путями – через использование MS CRM SDK (обработка входных и выходных XML сообщений) и с помощью прямого доступа к базе MS CRM. Давайте рассмотри алгоритм создания Closed Activity:
1) Сначала мы должны определить, для какой сущности мы создаем Activity – Account, 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);
}
}
Счастливого программирования, имплементации и модификации! Если вы хотите чтобы мы сделали работу – позвоните нам 1-866-528-0577! help@albaspectrum.com
Борис Макушкин – ведущий девелопер в Alba Spectrum Technologies – компании – партнере Microsoft Business Solutions в городах Москва, Петербург, Екатеринбург, Казань, Ростов и обслуживающей всю Российскую Федерацию (www.albaspectrum.com), Борис является Microsoft CRM SDK, C#, VB.Net, SQL, Oracle, Unix девелопером.
Alba Spectrum Technologies