Files
Facilitor/APPL/API/api_bezsoap.asp
Jos Groot Lipman 2aa489e0c7 FCLT#Recordsets die niet gesloten zijn beter detecteren
svn path=/Website/trunk/; revision=47235
2020-06-24 15:42:24 +00:00

293 lines
11 KiB
Plaintext

<%@ language = "JavaScript" %>
<% /*
$Revision$
$Id$
File: api_bezsoap.asp
Description: API voor BEZ-soap berichten
Parameters: Een xml
Status:
Context:
Notes:
Onderstaand het voorstel van RWSN/MOOP. Wij doen XML ipv JSON, daar moet getransformeerd worden
(2) Versturen van de bezoekersregistraties
Voor het versturen van de registraties stel ik voor om een HTTP-POST service te maken, deze is bijvoorbeeld te bereiken op ~/visitations
In de request header geef ik de Api Key mee:
Api-Key: 'te_bepalen_door_facilitor'
In de body stel ik voor één key-value pair mee te geven met de naam jsonData waarin de hele json van de bezoekersregistratie in verwerkt zit:
json_data={
"start":"Fri, 03 Aug 2012 10:09:39 +0200", //begindatum in RFC2822 formaat
"end":"HH:MM",
"host_id":2934, //id van de ingelogde gebruiker
"building_id":4712, //id van gekozen locatie
"visitors":
[
{
"name":"Pietje Puk",
"company":"RUG"
},
{
"name":"Jan Janssen",
"company":"Achmea"
},
{...}
]
}
Bij een juiste verwerking wordt http status code 201 teruggegeven met enkel een succes json:
{
"success":true,
}
Anders een 4xx of 5xx code met daarin een json geformatteerde fout:
{
"success":false,
"errors":
[
{
"description":"start is not a valied RFC2822 format"
},
{
"description":"building_id cannot be null"
},
{...}
]
}
*/
DOCTYPE_Disable = 1;
THIS_FILE = "appl/api/api_bezsoap.asp";
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/xml_converter.inc" -->
<!-- #include file="../Shared/save2db.inc" -->
<!-- #include file="../api/api.inc" -->
<%
// We sturen het antwoord in UTF-8.
Session.Codepage = 65001;
Response.Charset = 'utf-8';
var API = new API_func();
// XML Omzetten naar equivalente JSON
// var xmlReq = Server.CreateObject("MSXML2.DOMDocument.6.0");
// xmlReq.load(Request);
// The response.
var xmlResp = new ActiveXObject("MSXML2.DOMDocument.6.0");
xmlResp.appendChild(xmlResp.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"utf-8\""))
var FCLTElement = xmlResp.createElement("facilitor");
// The response header.
var now = new Date();
var nowtxt = now.getFullYear() + '-' + padout(now.getMonth() + 1) + '-' + padout(now.getDate()) + ' '
+ padout(now.getHours()) + ':' + padout(now.getMinutes()) + ':' + padout(now.getSeconds());
var elmHeader = xmlResp.createElement("header");
var headerinfo = {datum: nowtxt,
naam: user.naam(),
custId: customerId,
language: user.lang()
}
for (param in headerinfo)
{
var FCLTdata = xmlResp.createElement(param);
FCLTdata.appendChild(xmlResp.createTextNode(headerinfo[param]));
elmHeader.appendChild(FCLTdata);
}
FCLTElement.appendChild(elmHeader);
// Hier zou het echte werk moeten gebeuren nav. xmlReq
// en FCLTElement moeten we uitbreiden met antwoorden.
//var afspraken = xmlReq.getElementsByTagName("afspraak");
user.checkAutorisation("WEB_BEZUSE"); // Dit is nog ongeacht de bestelling
var resultcode = -1; /* Zolang deze -1 is, is het nog goed. Uiteindelijk eindigt het met 0 (als goed). */
var resulttekst = "";
var json_txt = Request.Form;
var json_data = JSON.parse(json_txt);
SaveOneAfspraak(json_data); // The one and only
// TODO: onderstaande code moet een generieke bez.afspraak_create (of afspraak_save) worden
// en ook gebruikt worden door bez_edit_afspraak_save.asp. Zo ver zijn we nog niet...
function SaveOneAfspraak(json_data)
{
var afspr_key;
var bez_actie;
var alg_locatie_key;
var alg_onrg_key;
var date_to;
var date_from = new Date(json_data.start);
if (json_data.start == "undefined" || typeof date_from != "object" || isNaN(date_from))
{
resultcode = 2;
resulttekst = "Undefined aankomst datum";
}
else
{
date_to = date_from;
date_to = new Date(date_from.getTime());
var time_end = json_data.end;
if (json_data.time_end != "undefined" && typeof time_end == "string")
var time_end = time_end.split(":");
date_to.setHours(time_end[0], time_end[1]);
if (time_end.length != 2 || typeof date_to != "object" || isNaN(date_to))
{
resultcode = 2;
resulttekst = "Undefined vertrek tijd";
}
else if (date_to < date_from)
{
resultcode = 2;
resulttekst = "Vertrek tijd voor aankomst tijd";
}
else
{
// Standaard actie voor mobile: Opbellen en op laten halen.
var sql = " SELECT bez_actie_key FROM bez_actie WHERE bez_actie_omschrijving LIKE 'Op laten halen (bellen)'"
var oRs = Oracle.Execute(sql);
bez_actie = oRs("bez_actie_key").Value;
var alg_gebouw_key = json_data.building_id;
if (!alg_gebouw_key || alg_gebouw_key < 0)
{
resultcode = 2;
resulttekst = "Undefined alg_gebouw_key";
}
else if (S("vis_afspraak_onrgoed_uses_keys") == 0)
{
sql = "SELECT SUBSTR (alg_plaatsaanduiding, 1, 30) plaats"
+ " FROM alg_v_plaatsaanduiding_all"
+ " WHERE alg_onroerendgoed_keys = " + alg_gebouw_key
+ " AND alg_onroerendgoed_type <> 'L'";
if (!oRs.eof)
var plaats = oRs("plaats").Value;
else
{
resultcode = 5;
resulttekst = "Building_id not found";
}
}
else
{
sql = "SELECT alg_locatie_key FROM alg_gebouw WHERE alg_gebouw_key = " + alg_gebouw_key;
oRs = Oracle.Execute(sql);
alg_locatie_key = oRs("alg_locatie_key").Value;
if (!alg_locatie_key || alg_locatie_key < 0)
{
resultcode = 2;
resulttekst = "Undefined alg_locatie_key";
}
else
{
var fields = []; // Bij te werken velden.
// Altijd nieuwe afspraak vooralsnog
fields.push({ dbs: "bez_afspraak_key", typ: "key", seq: "bez_s_bez_afspraak_key" });
fields.push({ dbs: "bez_afspraak_opmerking", typ: "varchar", val: "Created by mobile", len: 320 });
// Deze velden altijd opslaan (geen bez_afspraak_telefoonnr)
var fields = [ { dbs: "prs_perslid_key", typ: "key", val: user_key /* invoerder, notrack */ },
{ dbs: "bez_afspraak_datum", typ: "datetime", val: date_from, track: L("lcl_vis_start_date") },
{ dbs: "bez_actie_key", typ: "key", val: bez_actie, track: L("lcl_action"), foreign: "bez_actie" },
{ dbs: "bez_afspraak_eind", typ: "datetime", val: date_to, track: L("lcl_vis_end_date") },
{ dbs: "alg_locatie_key", typ: "key", val: alg_locatie_key, track: true /* afzonderlijke tracking, wel oldjsval */ },
{ dbs: "bez_afspraak_contact_key", typ: "key", val: user_key, track: L("lcl_vis_contactperson"), foreign: "prs_perslid" }
];
if (S("vis_afspraak_host_uses_keys") == 0)
fields.push({ dbs: "bez_afspraak_gastheer", typ: "varchar", val: user.naam(), track: L("lcl_vis_visit") });
else
fields.push({ dbs: "bez_afspraak_host_key", typ: "key", val: user_key, track: L("lcl_vis_visit"), foreign: "prs_perslid" });
if (S("vis_afspraak_onrgoed_uses_keys") == 0)
{
fields.push({ dbs: "bez_afspraak_ruimte", typ: "varchar", val: plaats, track: true /* afzonderlijke tracking, wel oldjsval */ });
}
else
{
alg_onrg_key = alg_gebouw_key; // Building_id is meegegeven
fields.push({ dbs: "alg_onrgoed_keys", typ: "key", val: alg_onrg_key, track: true /* afzonderlijke tracking, wel oldjsval */ });
}
fields.push({ dbs: "bez_afspraak_key", typ: "key", seq: "bez_s_bez_afspraak_key" });
var bezIns = buildInsert("bez_afspraak", fields, { noValidateToken: true });
afspr_key = bezIns.sequences["bez_afspraak_key"];
Oracle.Execute(bezIns.sql);
for (var i = 0; i < json_data.visitors.length; i++)
{
var visitor_data = json_data.visitors[i];
var naam = visitor_data.name;
var bedrijf = visitor_data.company;
// Geen prs_contactpersoon_key, prs_perslid_key en bez_bezoekers_pasnr
var bezfields = [ { dbs: "bez_afspraak_key", typ: "key", val: afspr_key },
{ dbs: "bez_afspraak_naam", typ: "varchar", val: naam, track: L("lcl_vis_name"), len: 30 },
{ dbs: "bez_afspraak_bedrijf", typ: "varchar", val: bedrijf, track: L("lcl_vis_company") + (S("bez_sel_internpersoon") == 1? "/" + L("lcl_department") : ""), len: 60 }
];
bezfields.push({ dbs: "bez_bezoekers_key", typ: "key", seq: "bez_s_bez_bezoekers_key" });
// Niet door BO aangemeld. Niet direct 'in' boeken.
var bezIns = buildInsert("bez_bezoekers", bezfields, { noValidateToken: true });
var bez_key = bezIns.sequences["bez_bezoekers_key"];
Oracle.Execute(bezIns.sql);
//var bezUpd = {trackarray: [L("lcl_bez_is_bezadd") + ": " + naam + "/" + bedrijf]};
}
shared.trackaction("BEZMUT", afspr_key);
}
}
}
}
if (resultcode == -1) // nog steeds geen fouten
resultcode = 0; // Ik heb gedaan wat ik moest en mocht doen voor deze reservering.
var ainfo = {returncode: resultcode,
returntekst: resulttekst,
// executed:sql, // debug
user_key: user_key,
afspr_key: afspr_key,
bez_afspraak_datum: date_from, // TODO: Beter ook xml-datum???
bez_afspraak_eind: date_to,
bez_actie_key: bez_actie,
alg_locatie_key: alg_locatie_key,
alg_onrgoed_keys: alg_onrg_key
}
if (S("vis_afspraak_host_uses_keys") == 0)
ainfo.gastheer = user.naam();
else
ainfo.host_key = user_key;
var FCLTBody = xmlResp.createElement("afspraak"); // type=response
FCLTBody.setAttribute('key', afspr_key);
FCLTBody.setAttribute('type', 'response');
for (param in ainfo)
{
var FCLTdata = xmlResp.createElement(param);
FCLTdata.appendChild(xmlResp.createTextNode(ainfo[param]));
FCLTBody.appendChild(FCLTdata);
}
FCLTElement.appendChild(FCLTBody);
}
xmlResp.appendChild(FCLTElement);
Response.ContentType = "text/xml";
Response.Write(xmlResp.xml)
%><% ASPPAGE_END(); %>