293 lines
11 KiB
Plaintext
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(); %>
|