Monday, April 13, 2009

Создаём подпись для электронных писем, отправляемых из MS CRM

Один из вопросов недавно заданных клиентом был - как так... В MS Outlook есть возможность автоматического вставления подписи при создании письма, а в CRM - нет... Надо бы исправить данную оплошность. Последующая статья описывает при помощи чего можно добиться похожего результата и в CRM, т.е. - создание и возможность редактирования подписи человеком прямо в CRM и автоматическая подстановка подписи при создании нового письма в CRM.


Для начала создам хранилище для подписи. Перейдём в карточку пользователя (SystemUser), добавляю новый аттрибут Signature:


Сохраняю аттрибут и открываю на редактирование карточку пользователя, добавляю новую закладку, которую назову Signature, добавляю туда новосозданное поле Signature:


Сохраняю и паблишу карточку.

Открываю на редактирование карточку Электронного письма (email), захожу в обработчик OnLoad, вставляю в него следующий скрипт:

function GetSignature()
{
var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
xmlhttp.open("POST", "/mscrmservices/2007/crmservice.asmx", false);
xmlhttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
xmlhttp.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Fetch");

var xml = "<?xml version='1.0' encoding='utf-8'?>"+
"<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'"+
" xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'"+
" xmlns:xsd='http://www.w3.org/2001/XMLSchema'>"+
GenerateAuthenticationHeader() +
" <soap:Body>" +
"<Fetch xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>"+
"<fetchXml> "+
"&lt;fetch mapping='logical'&gt; " +
"&lt;entity name='systemuser'&gt; " +
"&lt;attribute name='new_signature' /&gt; " +
"&lt;filter type='and'&gt; " +
"&lt;condition attribute='systemuserid' operator='eq-userid'/&gt; " +
"&lt;/filter&gt; " +
"&lt;/entity&gt; " +
"&lt;/fetch&gt;"+
"</fetchXml>"+
"</Fetch>"+
"</soap:Body>"+
"</soap:Envelope>";

xmlhttp.setRequestHeader("Content-Length", xml.length);
xmlhttp.send(xml);

var resultSet = new String(xmlhttp.responseXml.text);

resultSet.replace('&lt;','<');
resultSet.replace('&gt;','>');

var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async=false;
xmlDoc.loadXML(resultSet);

var signature = xmlDoc.selectSingleNode("//resultset/result/new_signature");

if (signature)
return signature.text;
else
return "";
}

function insertSignature()
{
var descrFrame = document.getElementById('descriptionIFrame');

if(descrFrame.readyState != 'complete')
return;

var signature = GetSignature();
var signParts = signature.split("\n");
var newHTML = "";
for (var i=0; i < signParts.length; i++)
newHTML = newHTML + "<br/><b>" + signParts[i] + "</b>";
var descrWindow = document.frames['descriptionIFrame'];
descrWindow.document.body.innerHTML = newHTML;
}


if (crmForm.FormType == 1)
{
var descrFrame = document.getElementById('descriptionIFrame');
descrFrame.attachEvent('onreadystatechange', insertSignature);
}
Сохраняю, паблишу. Перехожу в карточку пользователя от имени которого будут отсылаться письма, ввожу подпись:


Сохраняю карточку пользователя. Нажимаю создать новое Электронное письмо. Результат:



Пытался ещё и картинку туда приделать, как результат - море проблем и т.п. Были идеи, но особо не было времени. Если сделаете или найдёте, как буду благодарен за ссылки.