Dear All,
I am using Dynamic CRM 2013 online. For quote, I have workflow and Dialogue processes for review process. On approval, I want the system to generate a PDF of quote report, attach the PDF and email it to the Customer.
Better I would like, When approver, clicks on the approve button, the system should auto generate a PDF of quote report, attach the PDF and email it to the Customer, without any further input from the user. If its not possible, I may have to put button on quote form.
I am using the attached code, but facing various issues.
1. Under prepare the SOAP Message coding part, I am not sure what should be the below URL for CRM 2013 Online?
xHReq.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);
2. What should be the emailid here? Is it Recepient Contact id(Guid) ?
var emailid = resultXml.selectSingleNode("//CreateResult").nodeTypedValue; alert("emailid" + emailid.toString());
3. Using this code, not able to create Entity for "ActivityMimeAttachment", I am getting newEntity as undefined.
Below is the code I am using. Please check and help me out, where I am going wrong. Let me know if any better way to implement it. At present, I have put one button on quote form, on click event, below code will get executed.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title></title><script type="text/javascript"> var Xrm; if (window.opener) { Xrm = window.opener.Xrm; } else if (window.parent) { Xrm = window.parent.Xrm; } function getReportingSession() { var reportName = "Quotation_Report"; //set this to the report you are trying to download var reportId = "7C39D18F-1DC6-E311-8986-D89D6765B238"; //set this to the guid of the report you are trying to download var recordid = Xrm.Page.data.entity.getId(); // recordid = recordid.substring(1, 37); //getting rid of curly brackets alert(recordid); var pth = Xrm.Page.context.getServerUrl() + "/CRMReports/rsviewer/reportviewer.aspx"; var retrieveEntityReq = new XMLHttpRequest(); retrieveEntityReq.open("POST", pth, false); retrieveEntityReq.setRequestHeader("Accept", "*/*"); retrieveEntityReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); retrieveEntityReq.send("id=%7B" + reportId + "%7D&uniquename=" + Xrm.Page.context.getOrgUniqueName() + "&iscustomreport=true&reportnameonsrs=&reportName=" + reportName + "&isScheduledReport=false"); var x = retrieveEntityReq.responseText.indexOf("ReportSession="); var ret = new Array(); ret[0] = retrieveEntityReq.responseText.substr(x + 14, retrieveEntityReq.responseText.indexOf("&", x) - x - 14); //the session id x = retrieveEntityReq.responseText.indexOf("ControlID="); ret[1] = retrieveEntityReq.responseText.substr(x + 10, retrieveEntityReq.responseText.indexOf("&", x) - x - 10); //the control id return ret; } function createEntity(ent, entName, upd) { var jsonEntity = JSON.stringify(ent); var createEntityReq = new XMLHttpRequest(); var ODataPath = Xrm.Page.context.getServerUrl() + "XRMServices/2011/OrganizationData.svc"; createEntityReq.open("POST", ODataPath + "/" + entName + "Set" + upd, false); createEntityReq.setRequestHeader("Accept", "application/json"); createEntityReq.setRequestHeader("Content-Type", "application/json; charset=utf-8"); createEntityReq.send(jsonEntity); var newEntity = JSON.parse(createEntityReq.responseText).d; alert("new entity" + newEntity); return newEntity; } function createAttachment() { var params = getReportingSession(); var recordid = Xrm.Page.data.entity.getId(); alert("recordid " + recordid); var orgName = Xrm.Page.context.getOrgUniqueName(); var userID = Xrm.Page.context.getUserId(); //create email record // Prepare the SOAP message. 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'>" +"<soap:Header>" +"</soap:Header>" +"<soap:Body>" +"<Create xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>" +"<entity xsi:type='email'>" +"<regardingobjectid type='quote'>" + recordid + "</regardingobjectid>" +"<subject>" + "Email with Attachment4" + "</subject>" +"</entity>" +"</Create>" +"</soap:Body>" +"</soap:Envelope>"; // Prepare the xmlHttpObject and send the request. var xHReq = new ActiveXObject("Msxml2.XMLHTTP"); xHReq.Open("POST", "/mscrmservices/2007/CrmService.asmx", false); xHReq.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Create"); xHReq.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); xHReq.setRequestHeader("Content-Length", xml.length); xHReq.send(xml); // Capture the result var resultXml = xHReq.responseXML; // alert("resultXml " + resultXml); // Check for errors. var errorCount = resultXml.selectNodes('//error').length; if (errorCount != 0) { alert("ERROR"); var msg = resultXml.selectSingleNode('//description').nodeTypedValue; alert(msg); } var emailid = resultXml.selectSingleNode("//CreateResult").nodeTypedValue; alert("emailid" + emailid.toString()); //var emailid = userID; var post = Object(); post.Body = encodePdf(params); var email = new Array(); email[0] =new Object(); email[0].id = emailid; email[0].entityType ='email'; post.Subject ="File Attachment"; post.AttachmentNumber = 1; post.FileName ="Report.pdf"; post.MimeType ="application/pdf"; post.ObjectId = Object(); post.ObjectId.LogicalName ="email"; post.ObjectId.Id = email[0].id; post.ObjectTypeCode ="email"; alert(post.ObjectId.Id); createEntity(post,"ActivityMimeAttachment", ""); alert("created successfully"); email.Subject = "Your Order"; //Set The current order as the Regarding object email.RegardingObjectId = { Id: Xrm.Page.data.entity.getId(), //Get the current entity Id , here OrderId LogicalName: Xrm.Page.data.entity.getEntityName()//Get the current entity name, here it will be “salesOrder” }; //Create Email Activity SDK.JScriptRESTDataOperations.Create(email, "Email", EmailCallBack, function (error) { alert(error.message); }); } // Email Call Back function function EmailCallBack(result) { email = result; // Set the email to result to use it later in email attachment for retrieving activity Id var activityPartyFrom = new Object(); // Set the From party of the ActivityParty to relate an entity with Email From field activityPartyFrom.PartyId = { Id: customerId, // id of entity you want to associate this activity with. LogicalName: "contact" }; // Set the "activity" of the ActivityParty activityPartyFrom.ActivityId = { Id: result.ActivityId, LogicalName: "email" }; // Now set the participation type that describes the role of the party on the activity). activityPartyFrom.ParticipationTypeMask = { Value: 2 }; // 2 means ToRecipients // Create the from ActivityParty for the email SDK.JScriptRESTDataOperations.Create(activityPartyFrom, "ActivityParty", ActivityPartyFromCallBack, function (error) { alert(error.message); }); var activityPartyTo = new Object(); // Set the From party of the ActivityParty to relate an entity with Email From field activityPartyTo.PartyId = { Id: ownerId, // id of entity you want to associate this activity with. LogicalName: "systemuser" }; // Set the "activity" of the ActivityParty activityPartyTo.ActivityId = { Id: result.ActivityId, LogicalName: "email" }; // Now set the participation type that describes the role of the party on the activity). activityPartyTo.ParticipationTypeMask = { Value: 1 }; // 1 means Sender // Create the from ActivityParty SDK.JScriptRESTDataOperations.Create(activityPartyTo, "ActivityParty", ActivityPartyToCallBack, function (error) { alert(error.message); }); } //ActivityParty From Callback function ActivityPartyFromCallBack(result) { } //ActivityParty To Callback function ActivityPartyToCallBack(result) { } var StringMaker = function () { this.parts = []; this.length = 0; this.append = function (s) { this.parts.push(s); this.length += s.length; } this.prepend = function (s) { this.parts.unshift(s); this.length += s.length; } this.toString = function () { return this.parts.join(''); } } var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; function encode64(input) { var output = new StringMaker(); var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; while (i < input.length) { chr1 = input[i++]; chr2 = input[i++]; chr3 = input[i++]; enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; } output.append(keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4)); } return output.toString(); } var bdy = new Array(); var bdyLen = 0; function concat2Bdy(x) { bdy[bdyLen] = x; bdyLen++; } function encodePdf(params) { bdy = new Array(); bdyLen = 0; var retrieveEntityReq = new XMLHttpRequest(); var pth = Xrm.Page.context.getServerUrl() + "/Reserved.ReportViewerWebControl.axd?ReportSession=" + params[0] + "&Culture=1033&CultureOverrides=True&UICulture=1033&UICultureOverrides=True&ReportStack=1&ControlID=" + params[1] + "&OpType=Export&FileName=Public&ContentDisposition=OnlyHtmlInline&Format=PDF"; retrieveEntityReq.open("GET", pth, false); retrieveEntityReq.setRequestHeader("Accept", "*/*"); retrieveEntityReq.send(); BinaryToArray(retrieveEntityReq.responseBody); return encode64(bdy); }</SCRIPT> <SCRIPT type=text/vbscript> Function BinaryToArray(Binary) Dim i ReDim byteArray(LenB(Binary)) For i = 1 To LenB(Binary) byteArray(i-1) = AscB(MidB(Binary, i, 1)) concat2Bdy(AscB(MidB(Binary, i, 1))) Next BinaryToArray = byteArray End Function </SCRIPT></head><body><input type="button" onclick="createAttachment();" value="Attach Report" /></body></html>Thanks. and waiting for your valuable comments.
- Mittal