var injector = angular.injector(["ng"]);
var $http = injector.get("$http");
var $q = injector.get("$q");
function RequestData() {
var url = GetUrl();
var action = "RetrieveMultiple";
var data = GetDataRetrieveAccounts();
var promise = GetPromise(url, action, data);
promise.then(function (response) {
var ids = GetIdsAccounts(ParseXml(response.data));
return GetMultiplesPromises(ids);
}).then(function (response) {
var names = Array();
for (id in response) {
var deserializedResponse = ParseXml(response[id].data);
names = names.concat(GetNamesContacts(deserializedResponse))
}
console.log(names);
});
}
function GetNamesContacts(deserializedResponse) {
var nodes = deserializedResponse["s:Envelope"]["s:Body"]["RetrieveMultipleResponse"]["RetrieveMultipleResult"]["a:Entities"]["a:Entity"];
var Names = Array();
if (typeof (nodes) != "undefined") {
for (var i = 0; i < nodes.length; i++) {
var node = nodes[i];
var Name = node["a:Attributes"]["a:KeyValuePairOfstringanyType"][0]["b:value"]["#text"];
Names.push(Name);
}
}
return Names;
}
function GetIdsAccounts(deserializedResponse){
var nodes = deserializedResponse["s:Envelope"]["s:Body"]["RetrieveMultipleResponse"]["RetrieveMultipleResult"]["a:Entities"]["a:Entity"];
var Ids = Array();
for (var i = 0; i < nodes.length; i++) {
var node = nodes[i];
var Id = node["a:Id"]["#text"];
Ids.push(Id);
}
return Ids;
}
function GetMultiplesPromises(ids) {
var objPromises = Object();
angular.forEach(ids, function (id) {
var url = GetUrl();
var action = "RetrieveMultiple";
var data = GetDataRetrieveContact(id);
objPromises[id] = GetPromise(url, action, data);
});
return $q.all(objPromises);;
}
function GetPromise(url, action, data) {
var config = GetConfig(action);
var promise = $http.post(url, data, config);
return promise;
}
function GetConfig(action) {
var config = {
headers: {
'Accept': 'application/xml, text/xml, */*',
'Content-Type': 'text/xml; charset=utf-8',
'SOAPAction': 'http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/' + action
}
}
return config;
}
function GetUrl() {
var url = GetContext().getClientUrl();
return url + "/XRMServices/2011/Organization.svc/web";
}
function GetContext() {
if (typeof (GetGlobalContext) != "undefined")
{
return GetGlobalContext();
}
else {
if (typeof Xrm != "undefined") {
return Xrm.Page.context;
}
else {
console.error("Error accessing context");
}
}
}
function GetDataRetrieveContact(id) {
var request = ["<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">",
"<s:Body>",
"<RetrieveMultiple xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">",
"<query i:type=\"a:QueryExpression\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\">",
"<a:ColumnSet>",
"<a:AllColumns>false</a:AllColumns>",
"<a:Columns xmlns:b=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\">",
"<b:string>fullname</b:string>",
"</a:Columns>",
"</a:ColumnSet>",
"<a:Criteria>",
"<a:Conditions />",
"<a:FilterOperator>And</a:FilterOperator>",
"<a:Filters>",
"<a:FilterExpression>",
"<a:Conditions>",
"<a:ConditionExpression>",
"<a:AttributeName>parentcustomerid</a:AttributeName>",
"<a:Operator>Equal</a:Operator>",
"<a:Values xmlns:b=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\">",
"<b:anyType i:type=\"c:guid\" xmlns:c=\"http://schemas.microsoft.com/2003/10/Serialization/\">" + id + "</b:anyType>",
"</a:Values>",
"<a:EntityName i:nil=\"true\" />",
"</a:ConditionExpression>",
"</a:Conditions>",
"<a:FilterOperator>And</a:FilterOperator>",
"<a:Filters />",
"</a:FilterExpression>",
"</a:Filters>",
"</a:Criteria>",
"<a:Distinct>false</a:Distinct>",
"<a:EntityName>contact</a:EntityName>",
"<a:LinkEntities />",
"<a:Orders />",
"<a:PageInfo>",
"<a:Count>0</a:Count>",
"<a:PageNumber>0</a:PageNumber>",
"<a:PagingCookie i:nil=\"true\" />",
"<a:ReturnTotalRecordCount>false</a:ReturnTotalRecordCount>",
"</a:PageInfo>",
"<a:NoLock>false</a:NoLock>",
"</query>",
"</RetrieveMultiple>",
"</s:Body>",
"</s:Envelope>"].join("");
return request;
}
function GetDataRetrieveAccounts() {
var request = ["<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">",
"<s:Body>",
"<RetrieveMultiple xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">",
"<query i:type=\"a:QueryExpression\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\">",
"<a:ColumnSet>",
"<a:AllColumns>false</a:AllColumns>",
"<a:Columns xmlns:b=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\" />",
"</a:ColumnSet>",
"<a:Criteria>",
"<a:Conditions />",
"<a:FilterOperator>And</a:FilterOperator>",
"<a:Filters>",
"<a:FilterExpression>",
"<a:Conditions>",
"<a:ConditionExpression>",
"<a:AttributeName>name</a:AttributeName>",
"<a:Operator>BeginsWith</a:Operator>",
"<a:Values xmlns:b=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\">",
"<b:anyType i:type=\"c:string\" xmlns:c=\"http://www.w3.org/2001/XMLSchema\">a</b:anyType>",
"</a:Values>",
"<a:EntityName i:nil=\"true\" />",
"</a:ConditionExpression>",
"</a:Conditions>",
"<a:FilterOperator>And</a:FilterOperator>",
"<a:Filters />",
"</a:FilterExpression>",
"</a:Filters>",
"</a:Criteria>",
"<a:Distinct>false</a:Distinct>",
"<a:EntityName>account</a:EntityName>",
"<a:LinkEntities />",
"<a:Orders />",
"<a:PageInfo>",
"<a:Count>0</a:Count>",
"<a:PageNumber>0</a:PageNumber>",
"<a:PagingCookie i:nil=\"true\" />",
"<a:ReturnTotalRecordCount>false</a:ReturnTotalRecordCount>",
"</a:PageInfo>",
"<a:NoLock>false</a:NoLock>",
"</query>",
"</RetrieveMultiple>",
"</s:Body>",
"</s:Envelope>"].join("");
return request;
}
function ParseXml(xml, arrayTags)
{
var dom = null;
if (window.DOMParser)
{
dom = (new DOMParser()).parseFromString(xml, "text/xml");
}
else if (window.ActiveXObject)
{
dom = new ActiveXObject('Microsoft.XMLDOM');
dom.async = false;
if (!dom.loadXML(xml))
{
throw dom.parseError.reason + " " + dom.parseError.srcText;
}
}
else
{
throw "cannot parse xml string!";
}
function isArray(o)
{
return Object.prototype.toString.apply(o) === '[object Array]';
}
function parseNode(xmlNode, result)
{
if(xmlNode.nodeName == "#text" && xmlNode.nodeValue.trim() == "")
{
return;
}
var jsonNode = {};
var existing = result[xmlNode.nodeName];
if(existing)
{
if(!isArray(existing))
{
result[xmlNode.nodeName] = [existing, jsonNode];
}
else
{
result[xmlNode.nodeName].push(jsonNode);
}
}
else
{
if(arrayTags && arrayTags.indexOf(xmlNode.nodeName) != -1)
{
result[xmlNode.nodeName] = [jsonNode];
}
else
{
//Modified by Daniel Díaz 31/01/2017
if (xmlNode.nodeName == "#text") {
result[xmlNode.nodeName] = xmlNode.nodeValue;
} else {
result[xmlNode.nodeName] = jsonNode;
}
}
}
if(xmlNode.attributes)
{
var length = xmlNode.attributes.length;
for(var i = 0; i < length; i++)
{
var attribute = xmlNode.attributes[i];
jsonNode[attribute.nodeName] = attribute.nodeValue;
}
}
var length = xmlNode.childNodes.length;
for(var i = 0; i < length; i++)
{
parseNode(xmlNode.childNodes[i], jsonNode);
}
}
var result = {};
if(dom.childNodes.length)
{
parseNode(dom.childNodes[0], result);
}
return result;
}