Quantcast
Channel: CRM Development forum
Viewing all articles
Browse latest Browse all 8223

Dynamic CRM 2013 Online how to execute Report, generate PDF and email

$
0
0

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



Viewing all articles
Browse latest Browse all 8223

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>