Files
Facilitor/APPL/API/api_opdrsoap.asp
2018-08-28 13:20:45 +00:00

1013 lines
42 KiB
Plaintext
Raw Blame History

<%@ language = "JavaScript" %>
<% /*
$Revision$
$Id$
File: api_opdrsoap.asp
Description: API voor ORD-soap berichten
Interpreteert een bericht zodanig dat een opdracht wordt aangemaakt
(incl. evt. bovenliggende melding) of aangepast.
Dat is: qua omschrijving (voortgang), kosten of status.
Als een status wordt meegegeven, dan is ook vereist dat dat een
geldige statusovergang is, anders wordt het hele bericht genegeerd.
Parameters: Een xml
Context:
Notes:
*/
DOCTYPE_Disable = 1;
THIS_FILE = "appl/api/api_opdrsoap.asp";
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/xml_converter.inc" -->
<!-- #include file="../Shared/save2db.inc" -->
<!-- #include file="../Shared/kenmerk_common.inc" -->
<!-- #include file="../Shared/upload.inc" -->
<!-- #include file="../api/api.inc" -->
<!-- #include file="../mld/mld.inc" -->
<%
// We sturen het antwoord in UTF-8.
Session.Codepage = 65001;
Response.Charset = 'utf-8';
var API = new API_func();
var MLDremark = 0; // 0= negeer, 1=append bij autoorder, 2=overwrite bij autoorder, 5=append altijd, 6=overwrite altijd
var ORDremark = 2; //
/* API options voorbeeld:
{
MLDremark: 0,
ORDremark: 2
}
*/
API.apidata.options = API.apidata.options || {};
if ("MLDremark" in API.apidata.options)
MLDremark = API.apidata.options["MLDremark"];
if ("ORDremark" in API.apidata.options)
ORDremark = API.apidata.options["ORDremark"];
//user.checkAutorisation("WEB_MLDUSE"); // Dit is nog ongeacht de melding.
var tsql = "-"; // Voor tijdelijke statement.
var sql = "-"; // De uiteindelijke insert/update-sql.
var xmlReq = Server.CreateObject("MSXML2.DOMDocument.6.0");
//if (API.apidata.loglevel) __Log2File(Request, API.APIname + "_IN1");
if (API.apidata.stylesheet)
{
var iXsl = Server.CreateObject("MSXML2.DOMDocument.6.0");
iXsl.resolveExternals = true; // XSL kan includes hebben
if( ! iXsl.load(Server.MapPath(API.apidata.stylesheet)) )
{
API.error("Could not load XSL " + API.apidata.stylesheet + "\n" + iXsl.parseError.reason);
}
var inputXML = Server.CreateObject("MSXML2.DOMDocument.6.0");
inputXML.load(Request);
if (inputXML.parseError.errorCode != 0)
{
__DoLog( "Error loading XML: "
+ inputXML.parseError.errorCode
+ "\n" + inputXML.parseError.reason
+ " regel " + inputXML.parseError.line
+ "(" + inputXML.parseError.linepos + ")"
, "#ff0000");
}
if (API.apidata.loglevel) __Log2File(inputXML.xml, API.APIname + "_IN");
inputXML.transformNodeToObject(iXsl, xmlReq);
}
else
{
xmlReq.load(Request);
if (xmlReq.parseError.errorCode != 0)
{
__DoLog( "Error loading XML: "
+ xmlReq.parseError.errorCode
+ "\n" + xmlReq.parseError.reason
+ " regel " + xmlReq.parseError.line
+ "(" + xmlReq.parseError.linepos + ")"
, "#ff0000");
}
}
if (API.apidata.loglevel) __Log2File(xmlReq.xml, API.APIname + "_TUSSEN");
var xmlResp = new ActiveXObject("MSXML2.DOMDocument.6.0");
xmlResp.appendChild(xmlResp.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"utf-8\""))
// The response.
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 = {
// file: String(Request.ServerVariables("SCRIPT_NAME")).toLowerCase(),
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 detected ="?";
// Dit is de opdrachtenloop (mochten er ooit nog anderen gaan volgen).
var opdrachten = xmlReq.getElementsByTagName("opdracht");
var wasMLDremark = MLDremark;
var wasORDremark = ORDremark;
for (i=0; i < opdrachten.length; i++)
{
MLDremark = wasMLDremark; // Resetten voor elke opdracht. Tweede opdracht hoeft namelijk geen autoorder te zijn
ORDremark = wasORDremark;
var resultcode = -1; /* Zolang deze -1 is, is het nog goed. Uiteindelijk eindigt het met 0 (als goed). */
var resulttekst = "";
// Lees per node de (optionele) tags en waarden.
var opdrid = opdrachten[i].getAttribute("key"); // UPD
var opdraction = opdrachten[i].getAttribute("type").toLowerCase(); // NEW/UPD
var externnr = XMLval(opdrachten[i], "externnr"); // NEW
var externopdrnr = XMLval(opdrachten[i], "externopdrnr");
var plandatum = XMLval(opdrachten[i], "plandatum", true);
if (S("mld_use_plandate2") & 2) // Otherwise ignore 'plandatum2'
var plandatum2 = XMLval(opdrachten[i], "plandatum2", true);
var halt = XMLval(opdrachten[i], "halt") == 1; // onderbreken.
var resume = XMLval(opdrachten[i], "resume") == 1; // Hervatten.
var voor_key = parseInt(XMLval(opdrachten[i], "voor"), 10); // NEW
var voor_email = XMLval(opdrachten[i], "voor_email"); // NEW
var stdm_key = parseInt(XMLval(opdrachten[i], "stdmelding_key"), 10); // NEW
var topdr_key = parseInt(XMLval(opdrachten[i], "typeopdr_key"), 10); // NEW
var uitv_key = parseInt(XMLval(opdrachten[i], "bedrijf_key"), 10); // NEW
var opdrachttekst = XMLval(opdrachten[i], "opdrachttekst"); // NEW
var meldingtekst = XMLval(opdrachten[i], "meldingtekst"); // NEW
var onderwerp = XMLval(opdrachten[i], "onderwerp"); // NEW
var opdr_kpn = XMLval(opdrachten[i], "kostenplaats");
var flag = parseInt(XMLval(opdrachten[i], "flag"), 10);
var txt_mut_datum = XMLval(opdrachten[i], "mut_datum"); // UPD
var opdrstatus = XMLval(opdrachten[i], "status"); // UPD
var opdropmerking = XMLval(opdrachten[i], "opmerking"); // UPD
var opdrgereed = XMLval(opdrachten[i], "datumgereed"); // NEW/UPD
var opdrkosten = XMLval(opdrachten[i], "kosten"); // NEW/UPD
var opdrkenmerken = (opdrachten[i].getElementsByTagName("kenmerk")); // NEW/UPD
var kpn_key = -1;
var mld_key = -1; // Maken we aan of bepalen we uit de melding/volgnr.
var opdrvolgnr = -1; // Maken we aan of bepalen we uit de melding/volgnr.
var opdr_key = -1; // Maken we aan of bepalen we uit de melding/volgnr.
var oldstatus = -1;
var mld_fields = []; // Bij te werken velden.
var opdr_fields = []; // Bij te werken velden.
if (opdrid == null)
{ // Voorkom problemen als key-attribuut ontbreekt/leeg!
opdrid = '';
}
if (externnr == null)
{ // Voorkom problemen als externnr-node ontbreekt/leeg!
externnr = '';
}
if (externopdrnr == null)
{ // Voorkom problemen als externopdrnr-node ontbreekt/leeg!
externopdrnr = '';
}
if (voor_email == null)
{ // Voorkom problemen als het emailadres ontbreekt/leeg!
voor_email = '';
}
// Zoek de voorkey op aan de hand van het emailadres
tsql = "SELECT prs_perslid_key "
+ " FROM prs_v_aanwezigperslid "
+ " WHERE UPPER(prs_perslid_email) = UPPER(" + safe.quoted_sql(voor_email) + ")";
var oRs = Oracle.Execute(tsql);
if (!oRs.eof)
{
voor_key = oRs("prs_perslid_key").Value;
}
oRs.Close();
// Kijk of er een opdracht bestaat met dit externe opdracht nummer.
// Ben je bang dat het nummer vaker voorkomt dan kun je deze prefixen in de xsl
tsql = "SELECT MIN(mld_opdr_key) mld_opdr_key, COUNT(*) aantal"
+ " FROM mld_opdr"
+ " WHERE mld_opdr_id ="+ safe.quoted_sql(externopdrnr);
var oRs = Oracle.Execute(tsql);
if (oRs("aantal").Value == 1)
{
tsql = "SELECT mld_melding_key || '/' || mld_opdr_bedrijfopdr_volgnr mld_opdr_nr"
+ " FROM mld_opdr"
+ " WHERE mld_opdr_key ="+ oRs("mld_opdr_key").Value;
var oRs = Oracle.Execute(tsql);
opdrid = oRs("mld_opdr_nr").Value;
// Als het externe opdracht nummer al bestaat weten we zeker dat het om een update gaat.
opdraction = "update";
}
oRs.Close();
if (opdraction == "insert")
{
// Let op: mld_melding_externnr is niet gegarandeerd uniek: meerdere externe systemen
// kunnen dezelfde (externe) nummering gebruiken
// TODO: Bepalen meldingen beperken tot alleen die meldingen die zijn aangemaakt door betreffende API-user!
// Of beter: WHERE ORDBOF schrijfrechten op de melding
// Wel: verderop controleren we al wel of je canAddOpdr hebt
tsql = "SELECT MIN(mld_melding_key) mld_melding_key, COUNT(*) aantal"
+ " FROM mld_melding"
+ " WHERE mld_melding_externnr="+ safe.quoted_sql(externnr);
var oRs = Oracle.Execute(tsql);
switch (oRs("aantal").Value)
{
case 0: // Automatisch melding aanmaken.
// We ondersteunen hier alleen extreem simpele meldingen (alles default).
// Wil je meer? Dan maak je maar zelf een melding aan via de MLDAPI.
if (stdm_key && stdm_key > 0)
{
tsql = "SELECT sm.mld_stdmelding_t_uitvoertijd.tijdsduur tijdsduur"
+ " , sm.mld_stdmelding_t_uitvoertijd.eenheid eenheid"
+ " FROM mld_stdmelding sm"
+ " WHERE sm.mld_stdmelding_key = " + stdm_key
+ " AND sm.mld_stdmelding_verwijder IS NULL";
oRs = Oracle.Execute(tsql);
if (oRs.eof)
{
resultcode = 3;
resulttekst = "Undefined stdmelding " + stdm_key;
}
if (isNaN(voor_key))
{
resultcode = 3;
resulttekst = "Undefined 'voor': " + voor_email;
}
// Hier heb ik een geldige stdm_key.
if (resultcode == -1) // Nog steeds geen fouten.
{ // Bepaal kostenplaats via voor-user
// Als die voor exact <20><>n kostenplaats is gemandateerd dan gebruiken
// we die kostenplaats. Anders laten we de kostenplaats gewoon leeg.
sql = "SELECT pk.prs_kostenplaats_key, prs_kostenplaats_nr"
+ " FROM prs_perslidkostenplaats ppk,"
+ " prs_kostenplaats pk"
+ " WHERE pk.prs_kostenplaats_key = ppk.prs_kostenplaats_key"
+ " AND ppk.prs_perslid_key = " + voor_key
+ " AND prs_kostenplaats_verwijder IS NULL"
+ " AND prs_perslidkostenplaats_boeken = 1";
var oRs = Oracle.Execute(sql);
if (!oRs.Eof)
{
kpn_key = oRs("prs_kostenplaats_key").Value || -1; // Kan leeg zijn als voor alles gemandateerd
kpn_nr = oRs("prs_kostenplaats_nr").Value;
oRs.MoveNext();
if (!oRs.Eof) // Er zijn er meerdere
{
kpn_key = -1;
__Log("Gemandateerd voor meerdere kostenplaatsen dus genegeerd.");
}
else
__Log("Uitsluitend gemandateerd voor kostenplaats: " + kpn_nr);
}
}
if (opdr_kpn && opdr_kpn != "")
{
tsql = "SELECT prs_kostenplaats_key"
+ " FROM prs_kostenplaats"
+ " WHERE prs_kostenplaats_verwijder IS NULL"
+ " AND (prs_kostenplaats_begin IS NULL"
+ " OR prs_kostenplaats_begin < SYSDATE)"
+ " AND (prs_kostenplaats_eind IS NULL"
+ " OR prs_kostenplaats_eind > SYSDATE)"
+ " AND prs_kostenplaats_upper = " + safe.quoted_sql_upper(opdr_kpn); // Unique
oRs = Oracle.Execute(tsql);
if (!oRs.EoF)
{
var opdr_kpn_key = oRs("prs_kostenplaats_key").Value;
tsql = "SELECT ''"
+ " FROM prs_perslidkostenplaats"
+ " WHERE prs_perslidkostenplaats_boeken = 1"
+ " AND (prs_kostenplaats_key = " + opdr_kpn_key
+ " OR prs_kostenplaats_key IS NULL)" // Mandated for all
+ " AND prs_perslid_key = " + voor_key;
oRs = Oracle.Execute(tsql);
if (!oRs.EoF) // persoon gemandateerd voor gegeven kostenplaats
kpn_key = opdr_kpn_key;
}
}
if (resultcode == -1) // Nog steeds geen fouten.
{
var meld_oms = "Automatisch aangemaakte melding tbv. werkzaamheden ge<67>nitieerd in extern systeem met referentie: "+ externnr;
if (meldingtekst != null)
{
meld_oms = meld_oms + "\n" + meldingtekst;
}
mld_key = mld.insertmelding(stdm_key,
{
kostenplaats_key: kpn_key,
perslid_key: voor_key,
fields: [{ dbs: "mld_melding_externnr", typ: "varchar", val: externnr },
{ dbs: "mld_melding_omschrijving", typ: "varchar", val: meld_oms },
{ dbs: "mld_melding_onderwerp", typ: "varchar", val: onderwerp }
]
});
// mld.insertmelding heeft al op status 2 (nieuw) gezet
mld.setmeldingstatus(mld_key, 4);
}
}
break;
case 1:
mld_key = oRs("mld_melding_key").Value;
break;
default:
{
// Te veel kunnen we nog niet echt aan?
}
}
oRs.Close();
if (mld_key < 0)
{ // Tja, dan wordt het lastig?
resultcode = 7;
resulttekst = "Melding '{0}' cannot be identified uniquely".format(externnr);
}
if (resultcode == -1) // Nog steeds geen fouten.
{
var this_melding = mld.func_enabled_melding(mld_key);
if (!this_melding.canAddOpdr)
{
resultcode = 4;
resulttekst = "Not authorized";
}
}
// Hier heb ik een geldige mld_key (nieuw of bestaand).
if (resultcode == -1) // Nog steeds geen fouten.
{ // Bepaal opdrachttype.
tsql = "SELECT mld_typeopdr_key"
+ " FROM mld_typeopdr"
+ " WHERE mld_typeopdr_key="+ topdr_key;
var oRs = Oracle.Execute(tsql);
if (oRs.eof)
{
resultcode = 8;
resulttekst = "Undefined opdrachttype "+ topdr_key;
}
oRs.Close();
}
// Hier heb ik een geldige topdr_key.
if (resultcode == -1) // Nog steeds geen fouten.
{ // Bepaal uitvoerende.
tsql = "SELECT prs_bedrijf_key"
+ " FROM prs_bedrijf"
+ " WHERE prs_bedrijf_key="+ uitv_key
+ " AND prs_bedrijf_verwijder IS NULL";
var oRs = Oracle.Execute(tsql);
if (oRs.eof)
{
resultcode = 8;
resulttekst = "Undefined uitvoerende "+ uitv_key;
}
oRs.Close();
}
// Hier heb ik een geldige uitv_key.
if (resultcode == -1) // Nog steeds geen fouten.
{ // Alvast de nieuwe opdracht aanmaken. Rest komt later.
var mld_info = mld.mld_melding_info(mld_key);
var fields = [ { dbs: "mld_opdr_key", typ: "key", seq: "mld_s_mld_opdr_key" },
{ dbs: "mld_opdr_module", typ: "varchar", val: "MLD" },
{ dbs: "mld_melding_key", typ: "key", val: mld_key },
{ dbs: "prs_kostenplaats_key", typ: "key", val: mld_info.kostenpl_key },
{ dbs: "mld_uitvoerende_keys", typ: "key", val: uitv_key },
{ dbs: "mld_typeopdr_key", typ: "key", val: topdr_key },
{ dbs: "mld_opdr_bedrijfopdr_volgnr", typ: "sql", val: "mld.bepaalopdrmeldingvolgnr(" + mld_key +")" },
{ dbs: "mld_opdr_datumbegin", typ: "datetime", val: new Date() }
];
if (opdrachttekst != null)
{
fields.push({ dbs: "mld_opdr_omschrijving", typ: "varchar", val: opdrachttekst, len: 4000 });
}
// Flag, ignore if invalid
if (!isNaN(flag) && flag >= 0 && flag < S("mld_opdracht_flags"))
{
fields.push({ dbs: "mld_opdr_flag", typ: "number", val: flag });
}
var mldIns = buildInsert("mld_opdr", fields, { noValidateToken: true });
var sql = mldIns.sql;
var err = Oracle.Execute(sql, true);
if (err.friendlyMsg)
{
resultcode = 9;
resulttekst = "Database error: "+ err.friendlyMsg;
}
opdr_key = mldIns.sequences["mld_opdr_key"]; // Hier heb ik de geldige opdr_key (igv. insert).
tsql = "UPDATE mld_opdr"
+ " SET mld_opdr_id = " + safe.quoted_sql(externopdrnr)
+ " WHERE mld_opdr_key=" + opdr_key;
Oracle.Execute(tsql);
mld.setopdrachtstatus (opdr_key, 5);
mld.updatemeldingstatus (mld_key, 0);
}
}
else if (opdraction == "update" || opdraction == "note")
{ // Bestaande opdracht zoeken
var idarr = opdrid.split('/');
mld_key = parseInt(idarr[0], 10);
opdrvolgnr = parseInt(idarr[1], 10);
if (isNaN (mld_key) || isNaN (opdrvolgnr))
{
resultcode = 2;
resulttekst = "Invalid opdracht id (key="+ opdrid +")";
}
else
{
tsql = "SELECT mld_opdr_key"
+ " FROM mld_opdr"
+ " WHERE mld_melding_key="+ mld_key
+ " AND mld_opdr_bedrijfopdr_volgnr="+ opdrvolgnr;
var oRs = Oracle.Execute(tsql);
if (oRs.eof)
{
resultcode = 5;
resulttekst = "Non existent opdracht";
}
else
{ // Hier heb ik de geldige opdr_key (igv. update).
opdr_key = oRs("mld_opdr_key").Value;
}
oRs.Close();
}
if (resultcode == -1 && opdraction == "note")
{
tsql = "INSERT INTO mld_opdr_note(mld_opdr_key, prs_perslid_key, mld_opdr_note_omschrijving)"
+ " VALUES (" + opdr_key + "," + user_key + "," + safe.quoted_sql(opdropmerking) + ")";
Oracle.Execute(tsql);
resultcode = 0; // we zijn klaar.
}
}
else
{
resultcode = 2;
resulttekst = "Undefined operation (type="+ opdraction +")";
}
if (resultcode == -1)
{ // Hier heb ik een geldige opdr_key.
var this_opdr = mld.func_enabled_opdracht(opdr_key);
if (!this_opdr.canChange)
{
resultcode = 4;
resulttekst = "Not authorized";
}
var mld_opdr = mld.mld_opdr_info(opdr_key); // Bevat alle info van de opdracht.
var stdm_info = mld.mld_stdmeldinginfo(mld_opdr.stdm_key);
// Initialiseer (nog eens) enkele opdrachtgegevens tbv. de response of vervolg.
opdrid = mld_key + "/" + mld_opdr.mld_opdr_bedrijfopdr_volgnr;
oldstatus = mld_opdr.opdr_status;
topdr_key = mld_opdr.opdr_type;
var autoorder = stdm_info.autoorder;
if (autoorder)
{
if (MLDremark > 0)
MLDremark |= 4; // 'Altijd' bitje zetten
if (ORDremark > 0)
ORDremark |= 4; // 'Altijd' bitje zetten
}
var mut_datum = new Date();
if (txt_mut_datum && mld_opdr.typeopdr_afmeldmarge>0)
{
var mut_datum = XMLtoJsDate(txt_mut_datum);
var maxmarge = new Date();
maxmarge.setDate(maxmarge.getDate() - mld_opdr.typeopdr_afmeldmarge);
if (mut_datum < maxmarge)
mut_datum = maxmarge; // te lang geleden
}
// Dit zijn de wijzigingen, die voeren we alleen uit bij een geldige statuswijziging
// of geen statuswijziging
if (opdropmerking != null)
{ // opmerking bij de opdracht
var new_opm = opdropmerking;
if (ORDremark == 5) // Append
{
sql = "SELECT mld_opdr_opmerking"
+ " FROM mld_opdr"
+ " WHERE mld_opdr_key = " + opdr_key;
oRs = Oracle.Execute(sql);
if (oRs("mld_opdr_opmerking").Value)
new_opm = oRs("mld_opdr_opmerking").Value + "\n" + new_opm;
oRs.Close();
}
if (ORDremark == 5 || ORDremark == 6)
{
opdr_fields.push({ dbs: "mld_opdr_opmerking", typ: "varchar", val: new_opm, track: L("lcl_mld_inf_Opmerking"), len: 4000 });
}
// opmerking bij de melding
var new_mld_opm = opdropmerking;
if (MLDremark == 5) // Append
{
sql = "SELECT mld_melding_opmerking"
+ " FROM mld_melding"
+ " WHERE mld_melding_key = " + mld_opdr.mld_key;
oRs = Oracle.Execute(sql);
if (oRs("mld_melding_opmerking").Value)
new_mld_opm = oRs("mld_melding_opmerking").Value + "\n" + new_mld_opm;
oRs.Close();
}
if (MLDremark == 5 || MLDremark == 6)
{
mld_fields.push({ dbs: "mld_melding_opmerking", typ: "varchar", val: new_mld_opm, track: L("lcl_mld_inf_Opmerking"), len: 4000 });
}
}
if (opdrkosten != null)
opdr_fields.push({ dbs: "mld_opdr_kosten", typ: "float", val: opdrkosten, track: L("lcl_total_cost") });
var ins_srtdiscipline_prefix = mld.mld_prefix(mld_key);
var formattedID = ins_srtdiscipline_prefix + opdrid;
var orddat_tracking = "";
if (opdrgereed != null)
{
var old_einddatum = mld_opdr.mld_opdr_einddatum;
var new_einddatum = XMLtoJsDate(opdrgereed);
if (old_einddatum == null || old_einddatum.midnight().getTime() != new_einddatum.midnight().getTime()) // Difference? (Check Date only)
{
opdr_fields.push({ dbs: "mld_opdr_einddatum", typ: "date", val: new_einddatum });
orddat_tracking = L("lcl_ord_is_orddattrack").format(formattedID) + ": " + buildTrackText("date", old_einddatum, new_einddatum);
}
if (autoorder) // Ooit: net als appendRemark via json configureerbaar maken?
mld_fields.push({ dbs: "mld_melding_einddatum", typ: "datetime", val: new_einddatum, track: L("lcl_mld_enddate") });
}
// Plandatum wordt apart getracked want deze heeft zijn eigen tracking code (ORDPLD)
var ordpld_tracking = "";
if (plandatum != null)
{
var new_plandatum;
if (plandatum == "")
{
new_plandatum = null;
}
else
{
new_plandatum = XMLtoJsDate(plandatum);
}
var old_plandatum = mld_opdr.mld_opdr_plandatum;
if ((old_plandatum != null || new_plandatum != null) &&
(old_plandatum == null || new_plandatum == null || old_plandatum.getTime() != new_plandatum.getTime())) // Difference?
{
opdr_fields.push({ dbs: "mld_opdr_plandatum", typ: "datetime", val: new_plandatum });
ordpld_tracking = L("lcl_ord_is_ordpldtrack").format(formattedID) + ": " + buildTrackText("datetime", old_plandatum, new_plandatum);
}
}
// Plandatum2 wordt apart getracked want deze heeft zijn eigen tracking code (ORDPL2)
var ordpl2_tracking = "";
if (S("mld_use_plandate2") & 2 && plandatum2 != null)
{
var new_plandatum2;
if (plandatum2 == "")
{
new_plandatum2 = null;
}
else
{
new_plandatum2 = XMLtoJsDate(plandatum2);
}
var old_plandatum2 = mld_opdr.mld_opdr_plandatum2;
if ((old_plandatum2 != null || new_plandatum2 != null) &&
(old_plandatum2 == null || new_plandatum2 == null || old_plandatum2.getTime() != new_plandatum2.getTime())) // Difference?
{
opdr_fields.push({ dbs: "mld_opdr_plandatum2", typ: "datetime", val: new_plandatum2 });
ordpl2_tracking = L("lcl_ord_is_ordpl2track").format(formattedID) + ": " + buildTrackText("datetime", old_plandatum2, new_plandatum2);
}
}
if ((this_opdr.canHervatten && resume) || (this_opdr.canOnderbreken && halt))
{
mld.opdr_hltrsm(opdr_key, { halt: halt, resume: resume }); // Zorgt voor het zetten van de mld_opdr.mld_opdr_halted waarde en het tracken van "ORDHLT" of "ORDRSM".
}
else if (resume || halt)
{
resultcode = 4;
if (!this_opdr.canHervatten && resume)
resulttekst = "Not authorized for ORDRSM";
else if (!this_opdr.canOnderbreken && halt)
resulttekst = "Not authorized for ORDHLT";
}
if (S("mld_use_plandate2") & 2)
{
var latest_pld = new_plandatum || mld_opdr.mld_opdr_plandatum;
var latest_pl2 = new_plandatum2 || mld_opdr.mld_opdr_plandatum2;
if (latest_pld != null && latest_pl2 != null // We have a plan-start-date and a plan-end-date
&& (new_plandatum || new_plandatum2) // and at least 1 of them is new
&& latest_pld.getTime() > latest_pl2.getTime()) // plan-start-date is later than plan-end-date
{
resultcode = 6;
resulttekst = L("lcl_opdr_plandate") + " (" + latest_pld + ") later than " + L("lcl_opdr_plandate2") + " (" + latest_pl2 + ")";
}
}
// Flag, ignore if invalid
if (!isNaN(flag) && flag >= 0 && flag < S("mld_opdracht_flags"))
{
opdr_fields.push({ dbs: "mld_opdr_flag", typ: "number", val: flag });
}
// We weten nu de updates, straks voeren we deze pas uit
// Eerst de eventuele statuswijzigingen
var newstatus = -1;
if (opdrstatus != null)
{ // Er is dus wel een status meegegeven
switch (opdrstatus)
{
case 'ORDACP' :
if (this_opdr.canAccept) {
if (oldstatus == 5) {
newstatus = 8;
} else {
resultcode = 2;
resulttekst = "Invalid status change";
}
} else {
resultcode = 4;
resulttekst = "Not authorized for ORDACP";
}
break;
case 'ORDCAN' :
if (this_opdr.canCancel) {
if (oldstatus == 5 || oldstatus == 8) {
newstatus = 1;
} else {
resultcode = 2;
resulttekst = "Invalid status change";
}
} else {
resultcode = 4;
resulttekst = "Not authorized for ORDCAN";
}
break;
case 'ORDAFM' :
if (this_opdr.canClose) {
if (oldstatus == 5 || oldstatus == 8 ) {
newstatus = 6;
} else {
resultcode = 2;
resulttekst = "Invalid status change";
}
} else {
resultcode = 4;
resulttekst = "Not authorized for ORDAFM";
}
break;
case 'ORDAFR' :
if (this_opdr.canFinish) {
if (oldstatus == 6 ) {
newstatus = 9;
} else {
resultcode = 2;
resulttekst = "Invalid status change";
}
} else {
resultcode = 4;
resulttekst = "Not authorized for ORDAFR";
}
break;
default:
resultcode = 3;
resulttekst = "Invalid status";
} // switch
}
if (resultcode == -1)
{ // Nog steeds geen fouten
// Construct the update
if (this_opdr.canChange)
{
if (opdr_fields.length>0)
{
var mldUpd = buildTrackingUpdate("mld_opdr", "mld_opdr_key = " + opdr_key, opdr_fields, { noValidateToken: true });
Oracle.Execute(mldUpd.sql);
mld.trackopdrachtupdate(opdr_key, L("lcl_ord_is_updatedbysoap") + "\n" + mldUpd.trackarray.join("\n"));
if (mut_datum) // Antedateren voor SLA rapportages.
{
var sql = "BEGIN fac.backtrackaction('ORDUPD', " + opdr_key + ", " + user_key + ", " + mut_datum.toSQL(true) +"); END;"
Oracle.Execute(sql);
}
// Tracken en notificeren van de einddatum (ORDDAT) (notificeren aan de gebouwverantwoordelijke van het betreffende gebouw van de onderliggende melding).
if (orddat_tracking != "")
{
mld.trackopdreinddatumupdate(opdr_key, orddat_tracking);
}
// Tracken en notificeren van de geplande aanvang datum (ORDPLD) (notificeren aan interne contactpersoon).
if (ordpld_tracking != "")
{
mld.trackopdrplandatumupdate(opdr_key, ordpld_tracking);
}
// Tracken en notificeren van de geplande einddatum (ORDPL2) (notificeren aan interne contactpersoon).
if (S("mld_use_plandate2") & 2 && ordpl2_tracking != "")
{
mld.trackopdrplandatum2update(opdr_key, ordpl2_tracking);
}
}
}
var this_mld = mld.func_enabled_melding(mld_opdr.mld_key);
// mag ik de melding ook aanpassen?
if (this_mld.canClose && (autoorder || MLDremark > 0))
{
if (mld_fields.length>0)
{
var mldUpd = buildTrackingUpdate("mld_melding", "mld_melding_key = " + mld_opdr.mld_key, mld_fields, { noValidateToken: true });
Oracle.Execute(mldUpd.sql);
var formattedID = stdm_info.ins_srtdiscipline_prefix+mld_opdr.mld_key + " ("+ stdm_info.discipline_omschrijving + "/"+ stdm_info.stdmelding_omschrijving +")";
mld.trackmeldingupdate(mld_opdr.mld_key, L("lcl_mld_is_updatedbysoap").format(formattedID) + "\n" + mldUpd.trackarray.join("\n"));
if (mut_datum) // Antedateren voor SLA rapportages.
{
var sql = "BEGIN fac.backtrackaction('MLDUPD', " + mld_opdr.mld_key + ", " + user_key + ", " + mut_datum.toSQL(true) +"); END;"
Oracle.Execute(sql);
}
}
}
//Response.Write("lengte:"+ opdrkenmerken.length);
for (j=0; j < opdrkenmerken.length; j++)
{
var kenmerk_attr_key = parseInt(opdrkenmerken[j].getAttribute("key"), 10);
var kenmerk_attr_code = opdrkenmerken[j].getAttribute("code");
var kenmerk_naam = opdrkenmerken[j].getAttribute("naam");
// default srtkenmerk on name
var srtkenmerk_key_code_omschr = " AND sk.mld_srtkenmerk_upper = " + safe.quoted_sql_upper(kenmerk_naam);
if (kenmerk_attr_key > 0)
srtkenmerk_key_code_omschr = " AND sk.mld_srtkenmerk_key = " + kenmerk_attr_key;
else if (kenmerk_attr_code)
srtkenmerk_key_code_omschr = " AND UPPER(sk.mld_srtkenmerk_code) = " + safe.quoted_sql_upper(kenmerk_attr_code);
if (opdrkenmerken[j].childNodes.length > 0)
var kenmerk_waarde = opdrkenmerken[j].childNodes[0].nodeValue;
else
var kenmerk_waarde = "";
//Response.Write(kenmerk_naam);
//Response.Write(kenmerk_waarde);
ksql = "SELECT k.mld_kenmerk_key, sk.mld_srtkenmerk_kenmerktype, sk.mld_srtkenmerk_lengte, sk.fac_kenmerkdomein_key "
+ " FROM mld_kenmerk k, mld_srtkenmerk sk "
+ " WHERE k.mld_typeopdr_key = " + topdr_key
+ " AND k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key "
+ " AND k.mld_kenmerk_verwijder IS NULL "
+ srtkenmerk_key_code_omschr;
var oRs = Oracle.Execute(ksql);
if (!oRs.eof)
{
var kenmerk_key = oRs("mld_kenmerk_key").Value;
var kenmerk_type = oRs("mld_srtkenmerk_kenmerktype").Value;
var kenmerk_lengte = oRs("mld_srtkenmerk_lengte").Value;
var kenmerkdomein_key = oRs("fac_kenmerkdomein_key").Value;
ksql = "SELECT ko.mld_kenmerkopdr_key "
+ " FROM mld_kenmerkopdr ko "
+ " WHERE ko.mld_opdr_key = " + opdr_key
+ " AND ko.mld_kenmerk_key = " + kenmerk_key;
var oRs = Oracle.Execute(ksql);
switch (kenmerk_type)
{
case 'R':
case 'S':
{
// read reference fields
if (kenmerk_waarde != "") {
var kenmerk_ref = opdrkenmerken[j].getAttribute("ref");
if (kenmerk_ref) {
kenmerk_waarde = getKenmerkKeyByRef(kenmerkdomein_key, kenmerk_ref, kenmerk_waarde);
}
}
}
case 'C':
case 'X':
case 'N':
{ // We ondersteunen alleen nog maar karakter- en bestandsnaam-velden.
// AEG: Maar wat maakt een nummer nu anders dan een karakter ?
if (!oRs.eof)
{
var kenmerkopdr_key = oRs("mld_kenmerkopdr_key").Value;
if (kenmerk_waarde == "") {
// delete characteristic when empty
ksql = "DELETE FROM mld_kenmerkopdr WHERE mld_kenmerkopdr_key = " + kenmerkopdr_key;
} else {
ksql = "UPDATE mld_kenmerkopdr SET mld_kenmerkopdr_waarde = " + safe.quoted_sql(kenmerk_waarde) + " WHERE mld_kenmerkopdr_key = " + kenmerkopdr_key;
}
Oracle.Execute(ksql);
} else {
if (kenmerk_waarde != "") {
// write a new characteristic with a value only
ksql = "INSERT INTO mld_kenmerkopdr (mld_kenmerk_key, mld_opdr_key, mld_kenmerkopdr_waarde) "
+ "VALUES (" + kenmerk_key + ", " + opdr_key + ", " + safe.quoted_sql(kenmerk_waarde) + ")";
Oracle.Execute(ksql);
}
}
}
case "M": // Folder met bijlagen
{ //Response.Write(kenmerk_naam);
var bijlagen = opdrkenmerken[j].getElementsByTagName("bijlage");
var bi;
__Log ('bijlagen.length:' + bijlagen.length);
for (bi = 0; bi < bijlagen.length; bi++)
{
var Attachment = XMLval(bijlagen[bi], "attachment");
var Name = XMLval(bijlagen[bi], "name");
var Size = XMLval(bijlagen[bi], "size");
//Response.Write("Name: " + Name + " size: " + Size);
if (Attachment && Name && Size)
{
var SafeName = safe.filename(Name);
var params = flexProps("MLD", opdr_key, String(kenmerk_key), "O");
if (!params.isAllowedName(SafeName))
{
__DoLog("Unsafe SOAP file '{0}' ignored.".format(SafeName), "#FFFF00");
}
else
{
__Log("Start saving: " + params.AttachPath + SafeName);
CreateFullPath(params.AttachPath);
encodedString2File(params.AttachPath + SafeName, Attachment, "bin.hex");
__Log("Done saving: " + params.AttachPath + SafeName);
}
}
}
}
}
}
}
if (newstatus != -1)
{
mld.setopdrachtstatus(opdr_key, newstatus);
// Hier terugchecken van de status
tsql = "SELECT mld_statusopdr_key FROM mld_opdr"
+ " WHERE mld_opdr_key="+ opdr_key;
oRs = Oracle.Execute(tsql);
if (oRs("mld_statusopdr_key").Value == newstatus)
{
resulttekst = "Status set to " + opdrstatus;
if (newstatus == 8)
{ // Opdracht is geaccepteerd ("ORDACP").
// Ik kan hier zelf bepalen of de actieve opdracht onderbroken moet worden (hltactive).
// Als de opdrachten niet sequentieel uitgevoerd moeten worden, dan wordt er ook geen actieve opdracht gevonden.
if (mld_opdr.contactpers_key < 0)
var activeopdr = mld.getactiveopdracht(opdr_key, user_key, mld_opdr.uitvoerende_key); // Haal de actieve opdracht op.
else
var activeopdr = mld.getactiveopdracht(opdr_key); // Haal de actieve opdracht op.
var activeopdr_key = activeopdr.opdr_key;
var activeopdracht = activeopdr.opdracht;
var hltactive = (activeopdr_key > 0);
var onHold = ((mld_opdr.typeopdr_sequential & 4) == 4); // Staat "Onderbroken starten" aan?
if (hltactive)
{ // Er is 1 actieve opdracht die onderbroken moet worden. Dit doen we door een "ORDHLT" tracking op die actieve opdracht te doen.
Oracle.Execute("UPDATE mld_opdr SET mld_opdr_halted = 1 WHERE mld_opdr_key = " + activeopdr.opdr_key);
shared.trackaction("ORDHLT", activeopdr.opdr_key);
}
else if (onHold)
{ // Als "Onderbroken starten" aan staat dan deze opdracht op "On Hold" zetten. Dan geen "ORDHLT" tracking genereren.
Oracle.Execute("UPDATE mld_opdr SET mld_opdr_halted = 1 WHERE mld_opdr_key = " + opdr_key);
}
}
if (mut_datum && opdrstatus) // Tracking antedateren voor SLA rapportages.
{ // 'Toevallig' loopt opdrstatus 1-op-1 met onze trackingcodes
var sql = "BEGIN fac.backtrackaction("+safe.quoted_sql(opdrstatus)+", " + opdr_key + ", " + user_key + ", " + mut_datum.toSQL(true) +"); END;"
Oracle.Execute(sql); // Statuswijzigingen wel even tracken
var txt = { "ORDAFM": L("lcl_ord_is_ordafm"),
"ORDACP": L("lcl_ord_is_ordacp"),
"ORDAFR": L("lcl_ord_is_ordafr")
}[opdrstatus];
mld.trackopdrachtupdate(opdr_key, L("lcl_ord_is_ordupd") + "\n" + txt + L("lcl_trackto") + toDateTimeString(mut_datum));
}
// Zijn er nog lopende opdrachten
tsql = "SELECT COUNT ( * ) lopend FROM mld_opdr"
+ " WHERE mld_melding_key = " + mld_key
+ " AND mld_statusopdr_key NOT IN (1, 2, 6, 7, 9)"; // (1=afgewezen, 2=niet akkoord, 6=afgemeld, 7=verwerkt en 9=afgerond)
oRs = Oracle.Execute(tsql);
if (oRs("lopend").Value == 0)
{ // Er zijn alleen opdrachten met status 1 (Afgewezen) of 6/9 (Afgemeld/Afgerond)
// Check of setting bij opdrachttype automatisch sluiten ALTIJD (= 2) toestaat.
tsql = "SELECT mld_typeopdr_sluitmelding FROM mld_typeopdr"
+ " WHERE mld_typeopdr_key = " + topdr_key;
var oRs = Oracle.Execute(tsql);
// Afhankelijk van sluitmelding nu melding status zetten (0=nooit, 1=vragen en 2=altijd)
// Als de laatste opdracht een cancel was dan wordt de melding niet afgemeld.
if ((oRs("mld_typeopdr_sluitmelding").Value == 2 || oRs("mld_typeopdr_sluitmelding").Value == 1)
&& this_mld.canClose
&& opdrstatus != 'ORDCAN')
{
mld.setmeldingstatus (mld_key, 5); // Afgemeld
var sql = "BEGIN fac.backtrackaction('MLDAFM', " + mld_key + ", " + user_key + ", " + mut_datum.toSQL(true) +"); END;"
Oracle.Execute(sql); // Statuswijzigingen wel even tracken
mld.trackmeldingupdate(mld_key, L("lcl_mld_is_mldupd") + "\n" + L("lcl_mld_is_mldafm") + L("lcl_trackto") + toDateTimeString(mut_datum));
}
else
// Dan zetten we de Melding hier terug naar Geaccepteerd indien die Uitgegeven was
// Zodat die bij de FO weer onder Inbehandeling valt.
mld.setmeldingstatus (mld_key, 4); // Geaccepteerd
}
// else status van de melding niet aanpassen.
resultcode = 0;
}
else
{
resultcode = 1;
resulttekst = "Status not set to "+opdrstatus+" (is "+oRs("mld_statusopdr_key").Value+")";
}
}
}
}
if (resultcode == -1) // Nog steeds geen fouten.
{
resultcode = 0; // Ik heb gedaan wat ik moest en mocht doen voor deze opdracht.
}
else if (resultcode > 0)
{
__DoLog("api_opdrsoap fail.\nResultcode: {0}\nReturntekst: {1}".format(resultcode, resulttekst), "#00FF00");
}
var binfo = {
returncode: resultcode,
returntekst: resulttekst,
// executed:sql, // debug
datum: nowtxt,
externnr: externnr
}
var FCLTBody = xmlResp.createElement("opdracht"); // type=response
FCLTBody.setAttribute('key', opdrid);
FCLTBody.setAttribute('type', 'response');
for (param in binfo)
{
var FCLTdata = xmlResp.createElement(param);
FCLTdata.appendChild(xmlResp.createTextNode(binfo[param]));
FCLTBody.appendChild(FCLTdata);
}
FCLTElement.appendChild(FCLTBody);
} // end for
// Alle opdracht-nodes zijn behandeld.
xmlResp.appendChild(FCLTElement);
Response.ContentType = "text/xml";
if (API.apidata.stylesheet)
{ // Niet super efficient dat we eerst naar tekstuele xml gaan maar ach...
STR2Stream(xmlResp.xml, API.apidata.stylesheet, Response, {});
}
else
{
Response.Write(xmlResp.xml)
}
%>