Looking pass the bad request, I noticed that you didn't set the SOAPAction in the request header.
xmlhttp.setRequestHeader("SOAPAction", "http://www.niku.com/xog/Object/WriteProject");
I did a little refactor on your script but can not test it as I don't have the ExecuteClarityQueryAsUser and crossBrowserXMLLoad functions.
function ExecuteTaskUpdate(taskID, taskStatus) {
var url = window.document.URL;
var ServerName = url.substring(7, url.indexOf("niku/") - 1);
var xog_url = "https://" + ServerName + "/niku/xog";
var projID = url.substring((url.length-7), url.length);
UserSessionID = window.clarity.session.sessionId;
var TaskQueryCode = "fon_proj_phase_task";
var TaskQueryFilterField = "task_int_id";
var TaskQueryFilterValue = taskID;
var TaskQueryCallback = "";
var Result = ExecuteClarityQueryAsUser(ServerName, TaskQueryCode, TaskQueryFilterField, TaskQueryFilterValue, TaskQueryCallback);
var returnedString = String(Result.responseText);
var xmlobject = crossBrowserXMLLoad(Result.responseText);
var taskitems = xmlobject.getElementsByTagName("Record");
totaltasks = taskitems.length;
for (var i = 0; i < totaltasks; i++) {
var task = taskitems[i];
var projectID = task.getElementsByTagName("project_id")[0].firstChild.nodeValue;
var projectName = task.getElementsByTagName("project_name")[0].firstChild.nodeValue;
var taskCode = task.getElementsByTagName("task_id")[0].firstChild.nodeValue;
var taskName = task.getElementsByTagName("task_name")[0].firstChild.nodeValue;
var taskStart = task.getElementsByTagName("start_date")[0].firstChild.nodeValue;
var taskFinish = task.getElementsByTagName("finish_date")[0].firstChild.nodeValue;
var taskOutline = task.getElementsByTagName("outline_level")[0].firstChild.nodeValue;
var xw = getXogPayload(UserSessionID, projectName, projectID, taskFinish, taskID, taskName, taskOutline, taskStart, taskCode, taskStatus);
var xmlhttp;
var xmlhttp = new XMLHttpRequest();
xmlhttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
xmlhttp.setRequestHeader("SOAPAction", "http://www.niku.com/xog/Object/WriteProject");
xmlhttp.open("POST", xog_url, true);
var xmlDoc = xmlhttp.responseXML;
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
var xmlDoc = xmlhttp.responseXML;
console.log("XML String: " + xmlhttp.responseText);
try {
var xogOutput = xmlDoc.getElementsByTagName("XOGOutput")[0];
xogOutput.parentNode.removeChild(xogOutput);
} catch (err) {
console.log(err.message);
}
console.log(xmlhttp.responseText);
}
}
xmlhttp.send(xw);
}
function getXogPayload(UserSessionID, projectName, projectID, taskFinish, taskID, taskName, taskOutline, taskStart, taskCode, taskStatus) {
var xw = [];
var percComp = "0";
if (taskStatus == 1) percComp = ".99";
if (taskStatus == 2) percComp = "1";
xw.pushxw.push('?<xml version="1.0" encoding="utf-8"?>');
xw.push('<soapenv:Envelope ');
xw.push(' xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" ');
xw.push(' xmlns:core="jelly:core" ');
xw.push(' xmlns:file="jelly:com.niku.union.gel.FileTagLibrary" ');
xw.push(' xmlns:gel="jelly:com.niku.union.gel.GELTagLibrary" ');
xw.push(' xmlns:soap="jelly:com.niku.union.gel.SOAPTagLibrary" ');
xw.push(' xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" ');
xw.push(' xmlns:sql="jelly:sql" ');
xw.push(' xmlns:util="jelly:util" ');
xw.push(' xmlns:xog="http://www.niku.com/xog" ');
xw.push(' xmlns:xsd="http://www.w3.org/2001/XMLSchem" ');
xw.push(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> ');
xw.push(' <soapenv:Header> ');
xw.push(' <xog:Auth> <xog:SessionID>?</xog:SessionID> </xog:Auth> '.replace('?', UserSessionID));
xw.push('</soapenv:Header> ');
xw.push(' <soapenv:Body> ');
xw.push(' <NikuDataBus xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/nikuxog_project.xsd"> ');
xw.push(' <Header action="write" externalSource="NIKU" objectType="project" version="15.2.0.213"/> ');
xw.push(' <Projects> ');
xw.push(' <Project name="?" '.replace('?', projectName));
xw.push(' projectID="?" '.replace('?', projectID));
xw.push(' <Tasks> ');
xw.push(' <Task finish="?" '.replace('?', taskFinish));
xw.push(' internalTaskID="?" '.replace('?', taskID));
xw.push(' name="?" '.replace('?', taskName));
xw.push(' outlineLevel="?" '.replace('?', taskOutline));
xw.push(' percComp="?" ').replace('?', percComp));
xw.push(' start="?" ').replace('?', taskStart));
xw.push(' status="?" ').replace('?', taskStatus.toString()));
xw.push(' taskID="?" /> ').replace('?', taskCode));
xw.push(' </Tasks> ');
xw.push(' </Project> ');
xw.push(' </Projects> ');
xw.push(' </NikuDataBus> ');
xw.push(' </soapenv:Body> ');
xw.push(' <soapenv:Envelope> ');
return xw.join('');
}
}
Maybe if you get a moment, you could see if that works.
V/r,
Gene