Files
Facilitor/APPL/EXP/topdesk.asp
Jos Groot Lipman fbdac726de FCLT#90168 Iets betere topdesk logging
svn path=/Website/branches/v2025.3/; revision=70673
2025-10-21 09:26:15 +00:00

616 lines
30 KiB
Plaintext

<%@ language = "JavaScript" %>
<% /*
$Revision$
$Id$
File: topdesk.asp
Description: Conversie van xml naar json voor TOPdesk koppeling
Parameters:
Context:
Notes: Informatie m.b.t. Topdesk API : https://developers.topdesk.com/
*/
var JSON_Result = true;
ANONYMOUS_Allowed = 1;
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/save2db.inc" -->
<!-- #include file="../Shared/xml_converter.inc" -->
<%
var ll = getQParamInt("logging", 0);
if (ll > 0)
__Logging = ll; // Voor de rest van dit bestand
function connectTopdesk(methode, actie, params)
{
var topdesk_aut = params.info.api_key;
var topdesk_baseurl = params.info.base_url;
var topdesk_url = "";
var missing_id = false;
var contenttype = "application/json";
var topdesk_conn= { aut: params.info.api_key
, baseurl: params.info.base_url
, url: ""
, contenttype: "application/json"
, methode: methode
, actie: actie
};
switch (actie) // Gebruik hier de parameter uit de aanroep. Topdesk_conn.actie wordt gewijzigd in attachment-POST door incident-POST en change-POST als params.info.boundary bestaat.
{
case "incident": topdesk_url = "/tas/api/incidents";
switch (methode)
{
case "POST": if (params.info.boundary) // Dus voor attachment.
{
missing_id = (params.info.get_id ? false : true);
topdesk_conn.url = topdesk_url + "/id/" + params.info.get_id + "/attachments";
topdesk_conn.methode = "POST";
topdesk_conn.actie = "attachment";
topdesk_conn.contenttype = "multipart/form-data;boundary=" + params.info.boundary;
}
else
{
topdesk_conn.url = topdesk_url;
}
break;
case "PUT":
case "PATCH": if (params.info.get_id) topdesk_conn.url = topdesk_url + "/id/" + params.info.get_id;
if (params.info.get_number) topdesk_conn.url = topdesk_url + "/number/" + params.info.get_number;
break;
case "GET": topdesk_conn.url = topdesk_url + ( params.inc_id
? "/id/" + params.info.get_id
: (params.start ? "?start="+params.start : "") // start is offset vanaf welk recordnr de volgende 10 records worden getoond.
);
break;
default: topdesk_conn.methode = "";
}
break;
case "call_types": topdesk_conn.url = "/tas/api/incidents/call_types";
break;
case "categories": topdesk_conn.url = "/tas/api/incidents/categories";
break;
case "subcategories": topdesk_conn.url = "/tas/api/incidents/subcategories";
break;
case "person": topdesk_url = "/tas/api/persons?query=";
switch (methode)
{
case "GET": topdesk_conn.url = topdesk_url + ((params.lookup && params.lookup.qparams) ? params.lookup.qparams : "");
break;
default: topdesk_conn.methode = "";
}
break;
case "change": topdesk_url = "/tas/api/operatorChanges";
switch (methode)
{
case "POST": if (params.info.boundary) // Dus voor attachment.
{
missing_id = (params.info.get_id ? false : true);
topdesk_conn.url = topdesk_url + "/" + params.info.get_id + "/attachments";
topdesk_conn.methode = "POST";
topdesk_conn.actie = "attachment";
topdesk_conn.contenttype = "multipart/form-data;boundary=" + params.info.boundary;
}
else
{
topdesk_conn.url = topdesk_url;
}
break;
case "PATCH": missing_id = (params.info.get_id ? false : true);
topdesk_conn.url = topdesk_url + "/" + params.info.get_id;
topdesk_conn.contenttype = "application/json-patch+json";
break;
case "GET": topdesk_conn.url = topdesk_url + (params.info.get_id ? "/" + params.info.get_id : "");
break;
default: topdesk_conn.methode = "";
}
break;
}
if (missing_id)
{
__Logging = 3;
__Log({"missing_id": { "paramsinfo": params.info
, "connection": topdesk_conn
}
});
}
else
{
__Log({"connectiondata": topdesk_conn});
}
topdesk_url = topdesk_conn.baseurl + topdesk_conn.url;
__Log("URL to TOPdesk: " + topdesk_url);
__Log({"body_data": params.data});
var errmsg = "";
var status = -1;
var data = {};
if (topdesk_conn.methode != "" && !missing_id)
{
try
{
var http_request = Server.CreateObject("WinHTTP.WinHTTPRequest.5.1");
http_request.open(topdesk_conn.methode, topdesk_url, false); // Synchroon
if (topdesk_conn.methode == "POST")
{
if (topdesk_conn.actie == "incident")
{
var body_data = params.data;
http_request.setRequestHeader("Authorization", topdesk_aut);
http_request.setRequestHeader("Accept", "application/json");
http_request.setRequestHeader("Content-Type", topdesk_conn.contenttype);
http_request.send(JSON.stringify(body_data));
}
else if (topdesk_conn.actie == "change")
{
var body_data = params.data;
http_request.setRequestHeader("Authorization", topdesk_aut);
http_request.setRequestHeader("Accept", "application/json");
http_request.setRequestHeader("Content-Type", topdesk_conn.contenttype);
http_request.send(JSON.stringify(body_data));
}
else if (topdesk_conn.actie == "attachment")
{
http_request.setRequestHeader("Authorization", topdesk_aut);
http_request.setRequestHeader("Content-Type", topdesk_conn.contenttype);
http_request.setRequestHeader("Accept","application/json");
http_request.setRequestHeader("Content-Transfer-Encoding", "base64");
http_request.Send(params.data);
}
}
else if (topdesk_conn.methode == "PATCH")
{
var body_data = (topdesk_conn.actie == "change"? [params.data] : params.data);
http_request.setRequestHeader("Authorization", topdesk_aut);
http_request.setRequestHeader("Accept", "application/json");
http_request.setRequestHeader("Content-Type", topdesk_conn.contenttype);
http_request.send(JSON.stringify(body_data));
}
else if (methode == "GET")
{
http_request.setRequestHeader("Authorization", topdesk_aut);
http_request.setRequestHeader("Accept", "application/json");
http_request.send();
}
//
status = http_request.status;
var status_ok = "200,201,204,206";
if (status_ok.indexOf(status) == -1)
{
errmsg = "TOPdesk error. Status: " + http_request.status + " " + http_request.statusText
+ ":\n" + http_request.responseText;
}
else
{
if (http_request.responseText)
{
data = JSON.parse( http_request.responseText);
}
else
data = {};
}
}
catch (e)
{
errmsg = "TOPdesk connection error: " + e.description;
}
}
else
{
errmsg = (missing_id ? "unknown id in " : "No method found for executing ") + topdesk_url;
}
var connect_result = { status: status
, message: errmsg
, data: data
};
if (missing_id)
{
__Log({"connect_result": connect_result});
}
return connect_result;
} // connectTopdesk
function load_headerdata()
{
if (debug == 1)
{
function loadMSXML(x)
{
var fso = new ActiveXObject("Scripting.FileSystemObject");
var file_ext = x.file.slice(-4);
var ForReading = 1;
var f1 = fso.OpenTextFile(x.file, ForReading );
var text = f1.ReadAll();
f1.Close();
text = text.substr(text.indexOf("<facilitor>")); // Verwijder alles totdat je de <facilitor> tag tegenkomt.
if ((text.substr(0,14) != "<?xml version=") && (file_ext == ".xml"))
{ // Bij ontbreken van encoding in de xml-file treedt de fout
// "An invalid character was found in the text content"
// op als er diakritische tekens in het xml-bestand staan.
// Voeg daarom encoding toe.
text = "<?xml version='1.0' encoding='windows-1250'?>" + "\n\r" + text;
}
x.doc = new ActiveXObject("MSXML2.DOMDocument.6.0");
x.doc.async = false;
x.doc.loadXML(text);
x.err_code = x.doc.parseError.errorCode;
x.err_msg = (x.doc.parseError.errorCode != 0 ? x.doc.parseError.reason : "");
return x;
}
var custpath = "../../CUST/PNBR";
var loader = { success: false
, status: -1
, xml: { file: Server.MapPath(custpath + "/xsl/" + "mld_434135_1_transformed.xml") }
, xsl: { file: Server.MapPath(custpath + "/xsl/" + "zendesk.xsl") }
};
loader.xml = loadMSXML(loader.xml);
var objreq = xmlToJson(loader.xml.doc);
//__Log(objreq);
__Log({"headerdata": {"melding": objreq.melding, "topdesk": {"info": objreq.facilitor.topdesk.info, "data": objreq.facilitor.topdesk.data}}});
return objreq.facilitor;
}
else
{
// Lees de xml-data uit de html-header.
var xmlReq = Server.CreateObject("MSXML2.DOMDocument.6.0");
xmlReq.load(Request);
// Converteer de xml naar json-dataobject.
var objreq = xmlToJson(xmlReq);
if (objreq && objreq.facilitor && objreq.facilitor.melding && objreq.facilitor.topdesk.info && objreq.facilitor.topdesk.data)
{
__Log({"headerdata": {"melding": objreq.facilitor.melding, "topdesk": {"info": objreq.facilitor.topdesk.info, "data": objreq.facilitor.topdesk.data}}});
}
return objreq.facilitor;
}
} // load_headerdata
function getTypeOf(value)
{
if (typeof value === "string" || value instanceof String) return "isString";
if (typeof value === "number" && isFinite(value)) return "isNumber";
if (typeof value === "boolean") return "isBoolean";
if (typeof value === "symbol") return "isSymbol";
if (typeof value === "undefined") return "isUndefined";
if (typeof value === "function") return "isFunction";
if (value === null) return "isNull";
if (value && typeof value === "object" && value.constructor === Array) return "isArray";
if (value && typeof value === "object" && value.constructor === Object) return "isObject";
if (value && typeof value === "object" && value.constructor === RegExp) return "isRegExp";
if (value instanceof Error && typeof value.message !== "undefined") return "isError";
if (value instanceof Date) return "isData";
return "isUnknown";
} // getTypeOf
function resolve_obj(methode, src, path, value)
{
//__Log("resolve_obj " + path);
var methode = (methode == "PATCH" ? "PATCH" : "GET");
var result = src;
var found = true;
var path_arr = path.split(".");
var last_index = path_arr.length;
for (var i = 0; i < last_index; i++)
{
var indx = -1;
var node = path_arr[i];
if (node.indexOf("[") > 0)
{
node = path_arr[i].split("[")[0];
indx = path_arr[i].split("[")[1].replace("[","").replace("]","");
}
var t = getTypeOf(result[node]);
//__Log("__> " + node + ": "+ t + (indx != -1 ? " ["+indx+"]" : ""));
switch (t)
{
case "isObject":
case "isString": if (methode == "PATCH" && (i == last_index-1))
result[node] = value;
else
result = result[node];
break;
case "isArray": if (result[node].length && indx >= 0 && indx < result[node].length)
{
if (methode == "PATCH" && (i == last_index-1))
result[node][indx] = value;
else
result = result[node][indx];
}
else
{
found = false;
}
break;
default: found = false;
}
if (!found)
break;
}
//
__Log(path + (found?"":" not") + " resolved with methode " + methode);
__Log({"resolve_result": result});
//
return ((found && methode == "GET") ? result : null);
} // resolve_obj
function replaceLookups(p_obj_topdesk)
{
if (p_obj_topdesk.info.methode == "POST" || p_obj_topdesk.info.methode == "GET")
{
// Haal eerst de foreign-keys op de je nodig hebt in het data-object.
var lookup_list = p_obj_topdesk.info.lookup_list;
// Als er maar 1 lookup gedefinieerd is zal deze als een object in lookup_list staan.
// Dit moet echter ook in een array staan, net zoals gebeurd als er meer dan 1 lookup gedefinieerd is.
if (getTypeOf(lookup_list.lookup) != "isArray")
{
if (!lookup_list.lookup)
{
lookup_list.lookup = [];
}
else
{
var obj_lookup = lookup_list.lookup;
delete lookup_list.lookup;
lookup_list.lookup = [obj_lookup];
}
}
for (var i = 0; i < lookup_list.lookup.length; i++)
{
var z_info = lookup_list.lookup[i];
__Log({"lookup_info": z_info}); // Wat zoek ik waar op en waar zet ik het resultaat weer neer.
p_obj_topdesk.lookup = lookup_list.lookup[i]; // Maak een nieuwe node lookup aan met de parameters voor het opzoeken.
// doe een connectTopdesk met een aanvraag voor gegevens (lookup is altijd GET!)
var z_result = connectTopdesk("GET", z_info.actie, p_obj_topdesk);
__Log({"lookup_result": z_result});
if (z_result.message == "" && z_result.data.length == 1)
{
// voeg het resultaat toe op de aangewezen plek in p_obj_topdesk
__Log("Resultaat lookup van " + z_info.actie);
var z_waarde = resolve_obj("GET", z_result, z_info.src);
resolve_obj("PATCH", p_obj_topdesk, z_info.dest, z_waarde);
}
else
{
if (z_result.status == -1)
__Log(z_result.message);
else
__Log("Lookup heeft geen of meer dan 1 records gevonden");
}
delete p_obj_topdesk.lookup; // Node met parameters voor lookup weer verwijderen.
}
}
} // replaceLookups
function streamdata(params, filedata)
{
var oStream = new ActiveXObject("ADODB.Stream");
oStream.charset = "utf-8";
oStream.Open();
oStream.Type = 2; // adTypeText
oStream.LineSeparator = -1;
// Elke regel van WriteText wordt met CrLf afgesloten. Zet deze niet in de string want dan worden ze als lettertekens beschouwd.
oStream.WriteText("", 1);
oStream.WriteText("--" + params.info.boundary, 1);
oStream.WriteText('Content-Disposition: form-data; name="file"; filename="' + params.info.filename + '"', 1); // LET OP: file en bestandsnaam MOETEN tussen dubbele quotes staan!
oStream.WriteText("Content-Type: application/plain; charset=utf-8", 1);
oStream.WriteText("Content-Transfer-Encoding: base64", 1);
oStream.WriteText("", 1);
oStream.WriteText(filedata, 1);
oStream.WriteText("--" + params.info.boundary + "--", 1);
oStream.Position = 0;
//
return oStream;
} // streamdata
// *************************************************************************
function addAttachments(p_obj_topdesk, p_topdesk_result)
{
__Log("addAttachments: " + p_obj_topdesk.info.methode);
attach_result = [];
if ((p_obj_topdesk.info.methode == "POST" || p_obj_topdesk.info.methode == "PATCH") && (p_obj_topdesk.info.actie == "change" || p_obj_topdesk.info.actie == "incident"))
{
var t = (p_obj_topdesk.bijlagen ? getTypeOf(p_obj_topdesk.bijlagen.bijlage) : "isUnknown");
__Log("bijlagen: " + (t == "isUndefined" ? "<geen>" : t));
switch (t)
{
case "isUndefined": var bijlagen = []; break; // geen bijlagen
case "isObject": var bijlagen = [p_obj_topdesk.bijlagen.bijlage]; break; // 1 bijlage
case "isArray": var bijlagen = p_obj_topdesk.bijlagen.bijlage; break; // 2 of meer bijlagen
default: var bijlagen = [];
}
for (var i=0; i < bijlagen.length; i++)
{
var bijlage = bijlagen[i];
var new_topdesk = { info: p_obj_topdesk.info };
new_topdesk.info.get_id = p_topdesk_result.data.id;
new_topdesk.info.boundary = "eWmWdiyWZVsqRAlEjgwicQsLnvXBJAVw"; // random genoeg, als het maar niet voorkomt in de data
new_topdesk.info.filename = bijlage.name;
new_topdesk.info.filesize = bijlage.size;
__Log({"new_topdesk": new_topdesk});
//
new_topdesk.data = streamdata(new_topdesk, bijlage.attachment);
var result = connectTopdesk("POST", p_obj_topdesk.info.actie, new_topdesk);
//
result.fclt_msg = ( (result.status == 200 || result.status == 201)
? "Attachment " + result.data.fileName + " ("+ result.data.size +") toegevoegd"
: "Attachment " + bijlage.name + " kon niet worden toegevoegd"
);
attach_result.push(result);
}
}
return attach_result;
} // addAttachments
function getResponseStatus(result)
{
var response_ok = "200,201,202,204,206";
var resp_ticket = (result.ticket && (response_ok.indexOf(result.ticket.status) == -1) ? false : true);
var resp_attach = true;
if (result.attach)
{ // Attach komt in result niet voor of is een array van nul of meer status-objecten.
for (var i=0; i<result.attach.length; i++)
{
resp_attach = resp_attach && ((response_ok.indexOf(result.attach[i].status) == -1) ? false : true);
}
}
return (resp_ticket && resp_attach) ? 200 : 400;
} // getResponseStatus
function update_mld(methode, actie, melding, params)
{
mld_key = melding.mld_melding_key || -1;
if (params.ticket)
{
var opm = (methode == "POST" ? "Creating " : "Updating ") + actie + " Topdesk. Status: " + params.ticket.status + (params.ticket.message.length != 0?" Message: " + params.ticket.message:"");
shared.trackaction("#MLDTRK", mld_key, opm);
}
if (params.attach.length)
{
for (i=0; i< params.attach.length; i++)
{
var opm = "Uploading attachment to Topdesk. "
+ ( params.ticket.message.length != 0
? " Message: " + params.ticket.message
+ ( params.attach && params.attach.fclt_msg && params.attach.fclt_msg.length != 0
? "\nFoutmelding: " + params.attach.fclt_msg
: ""
)
: "Status: " + params.attach[i].status
);
shared.trackaction("#MLDTRK", mld_key, opm);
}
}
} // update_mld
function update_mldopdr(methode, actie, melding, params)
{
var opdr_key = melding.opdracht.mld_opdr_key || -1;
if (params.ticket)
{
if (params.ticket.status >= 200 && params.ticket.status < 300)
{
var sql = "";
if (methode == "POST" && (actie == "incident" || actie == "change"))
{
var v_omschr = "\nTOPdesk nr: " + params.ticket.data.number;
var v_id = "Melding naar TOPdesk doorgestuurd. id: " + params.ticket.data.id;
sql = "UPDATE mld_opdr"
+ " SET mld_opdr_externnr = " + safe.quoted_sql(params.ticket.data.id)
+ " , mld_opdr_omschrijving = SUBSTR( mld_opdr_omschrijving"
+ " , GREATEST(LENGTH(mld_opdr_omschrijving)+LENGTH(" + safe.quoted_sql(v_omschr) + ")-3999, 1)"
+ " ) || " + safe.quoted_sql(v_omschr)
+ " WHERE mld_opdr_key = " + opdr_key;
}
if (sql)
Oracle.Execute(sql);
}
var opm = (methode == "POST" ? "Creating " : "Updating ") + actie + " Topdesk. Status: " + params.ticket.status;
shared.trackaction("#ORDTRK", opdr_key, opm);
}
if (params.attach.length)
{
for (i=0; i< params.attach.length; i++)
{
attachment = params.attach[i];
var opm = "Uploading attachment " + attachment.data.fileName + " to Topdesk. Status: " + params.attach[i].status + "\n";
shared.trackaction("ORDTRK", melding.opdracht.mld_opdr_key, opm);
}
}
} // update_mldopdr
// *************************************************************************
function topdesk_main(facilitor)
{
var obj_topdesk = facilitor.topdesk || {};
//
// Zoek eerst de benodigde id's op
replaceLookups(obj_topdesk);
//
// Toevoegen van incident of change
// Deze log staat als commentaar omdat in deze JSON ook de base64 coded bijlage zit. Dat levert te veel logging op.
//__Log(obj_topdesk);
// We gaan alleen een bericht versturen als we een geldige methode hebben. We gebruiken de methode NONE om
// aan te geven dat dit bericht niet verstuurd hoeft te worden. Dit is de mogelijkheid om
// in de stylesheet aan te geven dat je geen bericht wilt versturen op deze notificatie.
if (obj_topdesk.info.methode != 'NONE')
{
var topdesk_result = connectTopdesk(obj_topdesk.info.methode, obj_topdesk.info.actie, obj_topdesk);
__Log({"topdesk_result": topdesk_result});
if (topdesk_result.status != -1)
{ // Nu kunnen de bijlagen verstuurd worden.
if (!topdesk_result.data.id)
{ // Bij bestaande opdracht het topdesk-id overnemen vanuit de info-node.
topdesk_result.data.id = (obj_topdesk.info.get_id ? obj_topdesk.info.get_id : "");
}
var attach_result = addAttachments(obj_topdesk, topdesk_result);
var result = { ticket: topdesk_result
, attach: attach_result
};
if (facilitor.melding.opdracht)
{
update_mldopdr(obj_topdesk.info.methode, obj_topdesk.info.actie, facilitor.melding, result)
}
else if (facilitor.melding)
{
update_mld(obj_topdesk.info.methode, obj_topdesk.info.actie, facilitor.melding, result)
}
else
{
var result = { ticket: { status: 600, message: "Onbekende melding" } };
__DoLog(facilitor);
}
}
else
{
var result = { ticket: { status: 400, message: topdesk_result.message } };
__DoLog(safe.html(result.ticket.message), "ff0000");
}
}
else
{
var result = { ticket: { status: 200, message: "er hoeft geen bericht verstuurd te worden" } };
}
return result;
} // topdesk_main
// *************************************************************************
__Log("*> TOPdesk.api");
var debug = 0;
var facilitor = load_headerdata();
var result = {};
if (facilitor && facilitor.topdesk)
{
result = topdesk_main(facilitor);
}
else
{
result = { ticket: { status: 600, message: "geen topdesk data aanwezig" } };
__DoLog(safe.html(result.ticket.message), "ff0000");
}
result.response_status = getResponseStatus(result);
__Log({"result": result});
__Log("*< TOPdesk.api: " + result.response_status);
Response.Status = result.response_status;
//Response.Write(JSON.stringify(result));
%>
<% ASPPAGE_END(); %>