<?xml version="1.0"?>
<component>
<?component error="true" debug="true"?>
<registration
	description="custfunctions"
	progid="custfunction.wsc"
	version="1.00"
	classid="{4F51571C-1DFC-4769-B8DD-37B356378F12}"
>
</registration>

<public>

<!-- properties -->
	<property name="Oracle">
		<put/>
	</property>
	<property name="__Log">
		<put/>
	</property>
	<property name="__DoLog">
		<put/>
	</property>
	<property name="safe">
		<put/>
	</property>

<!-- methods -->
	<method name="bez_postsave">
		<PARAMETER name="bezkeyArr"/>
	</method>
	<method name="res_postsave">
		<PARAMETER name="rsv_ruimte_key"/>
	</method>
	<method name="mld_postsave">
		<PARAMETER name="melding_key"/>
	</method>
	<method name="API_PHONEBOOK">
		<PARAMETER name="prs_key"/>
		<PARAMETER name="data"/>
	</method>
	<method name="bes_punch_receive">
		<PARAMETER name="RequestForm"/>
		<PARAMETER name="bes_srtdeel_key"/>
		<PARAMETER name="item"/>
	</method>
</public>

<script language="javascript">
<![CDATA[

/*	properties	*/
function put_Oracle(newValue)	{Oracle		= newValue};
function put___Log(newValue)	{__Log		= newValue};
function put___DoLog(newValue)	{__DoLog	= newValue};
function put_safe(newValue)	    {safe		= newValue};

/*	methods	*/
/*
    $Revision$
    $Id$

    File:   UWVAcustfunction.wsc

*/

/* Dit zijn de enige drie functies die je mag gebruiken */
var Oracle;
var __Log;
var __DoLog;
var safe;

// ARO
var ARO_RootUrl = "https://www.agressieregistratieoverheid.nl/services/";
var ARO_User = "ARO-facilitor@uwv.nl";
var ARO_Pass = "G<9k3k)1";
var ARO_bez_bsn_key = 1;      // bez flex to perform ARO-BSN-Check against
//var ARO_bez_warn_key = 2;     // bez flex to register ARO-BSN-Check-result (if true)
var ARO_bsnsrt_key = 3;       // res srtflex to perform ARO-BSN-Check against
var ARO_warnsrt_key = 41;     // res srtflex to register ARO-BSN-Check-result (if true)
//var ARO_mld_bsnsrt_key = 105; // mld srtflex to perform ARO-BSN-Check against
var ARO_mld_bsn_key = 109;    // mld flex to perform ARO-BSN-Check against (SpoBiLo)
//var ARO_mld_warnsrt_key = 11; // mld srtflex to register ARO-BSN-Check-result (if true)
var ARO_mld_warn_key = 115;   // mld flex to register ARO-BSN-Check-result (if true)

  UWVA_ARO =
  {
      http_get: function _http_get(url)
      {
          var http_request = new ActiveXObject("MSXML2.ServerXMLHTTP.6.0");
          // Het mag niet te lang duren!
          var lResolve = 1 * 1000;
          var lConnect = 1 * 1000;
          var lSend = 1 * 1000;
          var lReceive = 2 * 1000; // 1 seconde wordt in de praktijk te vaak overschreden
          http_request.setTimeouts(lResolve, lConnect, lSend, lReceive);
          http_request.open("GET", url, false); // Synchroon nog even
          //http_request.setRequestHeader("Content-Type", "application/json; charset=utf-8");
          __Log("Getting ARO: " + url);
          http_request.send();
          if (http_request.status != 200)
          {
              __DoLog("ARO: " + http_request.status + "<br>" + http_request.statusText, "#FF0000");
              return null;
          }

          __Log("Returning: " + http_request.responseText);
          return http_request.responseText;
      },

      Check: function _Check(bsn, RootUrl, User, Pass)
      {
        try
        {
          var tokentxt = UWVA_ARO.http_get(RootUrl + "AuthenticationService.svc/RequestToken?username=" + User + "&password=" + Pass);
          if (!tokentxt)
              return false;
          var token = eval('(' + tokentxt + ')').d;

          var tmstart = (new Date).getTime();
          var lookuptxt = UWVA_ARO.http_get(RootUrl + "IncidentService.svc/TokenizedRegistratieLookupByBsn?bsn="+bsn+"&guid="+token);
          var tmend = (new Date).getTime();
          if (tmend - tmstart > 1000)
            __DoLog("Slow ARO check took " + (tmend - tmstart) + "ms", "#FFFF00");
          if (!lookuptxt)
              return false;
          var lookup = eval('(' + lookuptxt + ')').d;
          UWVA_ARO.http_get(RootUrl + "AuthenticationService.svc/ExpireToken?guid="+token);
          return lookup;
        }
        catch (e)
        {
            __DoLog("ARO Controle mislukt: " + e.description, "#FF0000");
            return false;
        }
      }
  }

bez_postsave = function (bezkeyArr, pResult)
{
    for (var i = 0; i < bezkeyArr.length; i++)
    {
      var sql = "SELECT bkw.bez_kenmerkwaarde_waarde"
              + "     , bkw.bez_kenmerkwaarde_aanmaak"
              + "  FROM bez_kenmerkwaarde bkw"
              + " WHERE bkw.bez_kenmerk_key = " + ARO_bez_bsn_key // BSN-nummer
              + "   AND bkw.bez_bezoekers_key = " + bezkeyArr[i];
      var oRs = Oracle.Execute(sql);
      if (!oRs.Eof)
      {
        var bsn = oRs("bez_kenmerkwaarde_waarde").Value;
        var aanmaak = new Date(oRs("bez_kenmerkwaarde_aanmaak").Value);
        var expire = new Date();
        expire.setMinutes(expire.getMinutes() - 5);
        if (aanmaak < expire)
        {
            __Log("BSN " + bsn + " niet opnieuw controleren, is al gebeurd om: " + aanmaak);
            continue; // Volgende bezoeker
        }
        var chk = UWVA_ARO.Check(bsn, ARO_RootUrl, ARO_User, ARO_Pass);
        if (chk == null)
          break; // De (eerste) bezoeker geeft een timeout. Dan de rest niet meer doen.
        var sql = "UPDATE bez_bezoekers SET bez_afspraak_opmerking = NULL WHERE bez_bezoekers_key = " + bezkeyArr[i];
        Oracle.Execute(sql);
        if (chk)
        {
            // UWVA#30245: Opmerking vullen ipv. kenmerk 'ARO_bez_warn_key' zoals voorheen!
            var sql = "UPDATE bez_bezoekers SET bez_afspraak_opmerking = 'LET OP: BSN staat in ARO [' ||  TO_CHAR(SYSDATE, 'DD-MM-YYYY') || ']' WHERE bez_bezoekers_key = " + bezkeyArr[i];
            Oracle.Execute(sql);
        }
      }
      else
      { // Waarde van kenmerk "bsn" (niet verplicht) is niet ingevuld.
        // Omdat deze net leeg gemaakt kan zijn kan Opmerking nog gevuld zijn. Deze voor de zekerheid wissen.
        // UWVA#30245: Opmerking wissen ipv. kenmerk 'ARO_bez_warn_key' zoals voorheen!
        var sql = "UPDATE bez_bezoekers SET bez_afspraak_opmerking = NULL WHERE bez_bezoekers_key = " + bezkeyArr[i];
        Oracle.Execute(sql);
      }
      oRs.Close();
    }
    return true;
}

res_postsave = function (rsv_ruimte_key, pResult)
{
    if (ARO_warnsrt_key < 0)
        return true;
    var sql = "SELECT rk.res_kenmerk_key"
            + "  FROM res_kenmerk rk, res_rsv_ruimte rrr"
            + " WHERE rk.res_srtkenmerk_key = " + ARO_warnsrt_key // Waarschuwing flex kenmerk
            + "   AND rrr.res_rsv_ruimte_key = " + rsv_ruimte_key
            + "   AND rrr.res_activiteit_key = rk.res_activiteit_key";
    var oRs = Oracle.Execute(sql);
    if (oRs.Eof) // deze activiteit heeft geen ARO-waarschuwing-kenmerk
    {
        oRs.Close();
        return true;
    }
    var warn_key = oRs("res_kenmerk_key").Value;
    var sql = "SELECT LPAD(rkw.res_kenmerkreservering_waarde,9,'0') res_kenmerkreservering_waarde"
            + "  FROM res_kenmerk rk, res_kenmerkwaarde rkw"
            + " WHERE rk.res_srtkenmerk_key = " + ARO_bsnsrt_key // BSN-nummer
            + "   AND rk.res_kenmerk_key = rkw.res_kenmerk_key"
            + "   AND rkw.res_rsv_ruimte_key = " + rsv_ruimte_key;
    var oRs = Oracle.Execute(sql);
    if (!oRs.Eof)
    {
      var bsn = oRs("res_kenmerkreservering_waarde").Value;
      var chk = UWVA_ARO.Check(bsn, ARO_RootUrl, ARO_User, ARO_Pass);
      var sql = "DELETE FROM res_kenmerkwaarde rkw"
            + "   WHERE rkw.res_rsv_ruimte_key = " + rsv_ruimte_key
            + "     AND rkw.res_kenmerk_key = " + warn_key;
      Oracle.Execute(sql);
      if (chk)
      {
          var sql = "INSERT INTO res_kenmerkwaarde(res_rsv_ruimte_key, res_kenmerk_key, res_kenmerkreservering_waarde) "
                + "   VALUES (" + rsv_ruimte_key + ", " + warn_key + ", TO_CHAR(SYSDATE, 'DD-MM-YYYY'))";
          Oracle.Execute(sql);
      }
    }
    oRs.Close();

    // Flex naar bezoekers synchroniseren
    var sql = "BEGIN "
            +     "  res.follow_afspraak (" + rsv_ruimte_key + ", " + 7 /*res_copy_to_bez*/ + "); " // flex overnemen verplaatsen
            + "END;";
    Oracle.Execute(sql);
    return true;
}

mld_postsave = function (melding_key, pResult)
{
    if (ARO_mld_warn_key < 0)
        return true;
    var sql = "SELECT mk.mld_kenmerk_key"
            + "  FROM mld_kenmerk mk, mld_melding m"
            + " WHERE mk.mld_kenmerk_key = " + ARO_mld_warn_key // Waarschuwing flex kenmerk
            + "   AND m.mld_melding_key = " + melding_key
            + "   AND m.mld_stdmelding_key = mk.mld_stdmelding_key"
            + "   AND mk.mld_kenmerk_niveau = 'S'";
    var oRs = Oracle.Execute(sql);
    if (oRs.Eof) // deze stdmelding heeft geen ARO-waarschuwing-kenmerk
    {
        oRs.Close();
        return true;
    }
    var sql = "SELECT km.mld_kenmerkmelding_waarde"
            + "  FROM mld_kenmerk mk, mld_kenmerkmelding km"
            + " WHERE mk.mld_kenmerk_key = " + ARO_mld_bsn_key // BSN-nummer
            + "   AND mk.mld_kenmerk_key = km.mld_kenmerk_key"
            + "   AND km.mld_melding_key = " + melding_key;
    var oRs = Oracle.Execute(sql);
    if (!oRs.Eof)
    {
      var bsn = oRs("mld_kenmerkmelding_waarde").Value;
      var chk = UWVA_ARO.Check(bsn, ARO_RootUrl, ARO_User, ARO_Pass);
      var sql = "DELETE FROM mld_kenmerkmelding km"
            + "   WHERE km.mld_melding_key = " + melding_key
            + "     AND km.mld_kenmerk_key = " + ARO_mld_warn_key;
      Oracle.Execute(sql);
      if (chk)
      {
          var sql = "INSERT INTO mld_kenmerkmelding(mld_melding_key, mld_kenmerk_key, mld_kenmerkmelding_waarde) "
                + "   VALUES (" + melding_key + ", " + ARO_mld_warn_key + ", TO_CHAR(SYSDATE, 'DD-MM-YYYY'))";
          Oracle.Execute(sql);
      }
    }
    oRs.Close();
    return true;
}

API_PHONEBOOK =
function (prs_key, data)
{
    var result = {};
    //
    // Toestel
    //
    var sql = "SELECT prs_kenmerklink_waarde"
            + "  FROM prs_kenmerklink"
            + " WHERE prs_link_key = " + prs_key
            + "   AND prs_kenmerklink_niveau = 'P'"
            + "   AND prs_kenmerklink_verwijder IS NULL"
            + "   AND prs_kenmerk_key = 1160"; // toestel
    var oRs = Oracle.Execute(sql);
    if (!oRs.Eof)
    {
        result.uwva_toestel = safe.html(oRs("prs_kenmerklink_waarde").Value);
    }
    oRs.Close();
    //
    // Mobiel verkort
    //
    var sql = "SELECT prs_kenmerklink_waarde"
            + "  FROM prs_kenmerklink"
            + " WHERE prs_link_key = " + prs_key
            + "   AND prs_kenmerklink_niveau = 'P'"
            + "   AND prs_kenmerklink_verwijder IS NULL"
            + "   AND prs_kenmerk_key = 1175"; // mobiel verkort
    var oRs = Oracle.Execute(sql);
    if (!oRs.Eof)
    {
        result.uwva_mobielverkort = safe.html(oRs("prs_kenmerklink_waarde").Value);
    }
    oRs.Close();
    //
    // Alt afdeling
    //
    result.uwva_afdeling = data.afdeling;
    var sql = "SELECT d.prs_afdeling_naam4 afd"
            + "  FROM prs_kenmerklink, uwva_v_alt_afdeling d"
            + " WHERE prs_link_key = " + prs_key
            + "   AND prs_kenmerklink_niveau = 'P'"
            + "   AND prs_kenmerklink_verwijder IS NULL"
            + "   AND prs_kenmerk_key = 1173" // Alternatieve afdeling
            + "   AND fac.safe_to_number(prs_kenmerklink_waarde) = prs_afdeling_key"
    var oRs = Oracle.Execute(sql);
    if (!oRs.Eof)
    {
        result.uwva_afdeling = safe.html(oRs("afd").Value);
    }
    oRs.Close();
    //
    // Alt functie
    //
    result.uwva_functie = data.prs_srtperslid;
    var sql = "SELECT prs_srtperslid_omschrijving fnc"
            + "  FROM prs_kenmerklink, prs_srtperslid"
            + " WHERE prs_link_key = " + prs_key
            + "   AND prs_kenmerklink_niveau = 'P'"
            + "   AND prs_kenmerklink_verwijder IS NULL"
            + "   AND prs_kenmerk_key = 1192" // Alternatieve functie
            + "   AND fac.safe_to_number(prs_kenmerklink_waarde) = prs_srtperslid_key"
    var oRs = Oracle.Execute(sql);
    if (!oRs.Eof)
    {
        result.uwva_functie = safe.html(oRs("fnc").Value);
    }
    oRs.Close();
    //
    // Werklocatie
    //
    if (data.werklocatie.alg_locatie_key)
    {
      var wl = (!data.werklocatie.alg_gebouw_key? data.werklocatie.alg_locatie_code : "")
             + (data.werklocatie.alg_gebouw_key? data.werklocatie.alg_gebouw_code : "")
             + (data.werklocatie.alg_verdieping_key? ", etage " + data.werklocatie.alg_verdieping_code : "")
             + (data.werklocatie.alg_ruimte_key? ", kamer " + data.werklocatie.alg_ruimte_nr: "")
             + (data.werklocatie.prs_werkplek_key? "/" + data.werklocatie.prs_werkplek_volgnr: "");
      result.uwva_werklocatie = safe.html(wl);

      // Werklocatieadres
      var sql = " SELECT alg_locatie_omschrijving"
              + ",       alg_locatie_adres"
              + ",       alg_locatie_postcode"
              + ",       alg_locatie_plaats"
              + ",       alg_locatie_land"
              + ",       l.alg_locatie_omschrijving || ' (' || l.alg_locatie_code || ')'  locatie_string"
              + "   FROM alg_locatie l"
              + "  WHERE l.alg_locatie_key = " + data.werklocatie.alg_locatie_key;
      var oRs = Oracle.Execute(sql);
      result.uwva_werklocatieadres = safe.html(oRs("alg_locatie_omschrijving").value) + "<br>"
                                   + safe.html(oRs("alg_locatie_adres").value) + "<br>"
                                   + safe.html(oRs("alg_locatie_postcode").value) + " " + safe.html(oRs("alg_locatie_plaats").value) + "<br>";
      oRs.Close();
    }
    //
    // Hoofdlocatie
    //
    if (data.werkplekken.length)
    {
        var txt = "";
        var wp;
        var wplabel = "Hoofdlocatie:";
        var loc_key = -1;
        for (wp in data.werkplekken)
        {
            if (!data.werkplekken[wp].prs_werkplek_aanduiding.isVirtueel && wp < 1)  // pak er maar eentje, TODO hoofdwerkplek
            {
                txt +=  data.werkplekken[wp].prs_werkplek_aanduiding.substring(0,5)
                    + ", etage "+ data.werkplekken[wp].prs_werkplek_aanduiding.substring(6,8)
                    + ", kamer "+ data.werkplekken[wp].prs_werkplek_aanduiding.substring(9);
                loc_key = data.werkplekken[wp].alg_locatie_key;

            }
        }
        result.uwva_locatie = safe.html(txt);
        // Postadres
        var sql = " SELECT alg_locatie_omschrijving"
                + ",       alg_locatie_post_adres"
                + ",       alg_locatie_post_postcode"
                + ",       alg_locatie_post_plaats"
                + ",       alg_locatie_post_land"
                + ",       l.alg_locatie_omschrijving || ' (' || l.alg_locatie_code || ')'  locatie_string"
                + "   FROM alg_locatie l"
                + "  WHERE l.alg_locatie_key = " + loc_key;
        var oRs = Oracle.Execute(sql);
        result.uwva_postadres = safe.html(oRs("alg_locatie_omschrijving").Value) + "<br>"
                              + safe.html(oRs("alg_locatie_post_adres").Value) + "<br>"
                              + safe.html(oRs("alg_locatie_post_postcode").Value) + " " + safe.html(oRs("alg_locatie_post_plaats").Value) + "<br>";
        oRs.Close();
        // Bezoekadres
        var sql = " SELECT alg_locatie_omschrijving"
                + ",       alg_locatie_adres"
                + ",       alg_locatie_postcode"
                + ",       alg_locatie_plaats"
                + ",       alg_locatie_land"
                + ",       l.alg_locatie_omschrijving || ' (' || l.alg_locatie_code || ')'  locatie_string"
                + "   FROM alg_locatie l"
                + "  WHERE l.alg_locatie_key = " + loc_key;
        var oRs = Oracle.Execute(sql);
        result.uwva_bezoekadres = safe.html(oRs("alg_locatie_omschrijving").Value) + "<br>"
                                + safe.html(oRs("alg_locatie_adres").Value) + "<br>"
                                + safe.html(oRs("alg_locatie_postcode").Value) + " " + safe.html(oRs("alg_locatie_plaats").Value) + "<br>";
        oRs.Close();
    }
    //
    // Klikbaar e-mailadres
    //
    if (data.prs_perslid_email)
    {
         result.uwva_mailto = "<a href='mailto:" + data.prs_perslid_email + "'>" + data.prs_perslid_email + "</a>";
    }

    return result;
};

bes_punch_receive = function (RequestForm, bes_srtdeel_key, item, pResult)
{
  var result = {orderurl: ""};
  var sql = "SELECT sd.prs_bedrijf_key FROM bes_srtdeel sd WHERE sd.bes_srtdeel_key = " + bes_srtdeel_key;
  var oRs = Oracle.Execute(sql);
  var bedr_key = oRs("prs_bedrijf_key").value;
  oRs.Close();

  function punchNVL(nm, n, def)
  {
    var nm = nm.replace('#', n);
    if (RequestForm(nm).Count() == 0)
        return def;
    if (RequestForm(nm) == "")
        return def;
    return RequestForm(nm)(1);
  };

  // Alleen voor leverancier Worldmeetings uitvoeren (prs_bedrijf_key = 69793)
  if (bedr_key == 69793)
  {
    var detail_url = punchNVL("NEW_ITEM-ATTACHMENT[#]", item, "Onbekend");
    if (detail_url != "Onbekend")
    {
      sql = "UPDATE bes_srtdeel"
          + "   SET bes_srtdeel_details_loc = " + safe.quoted_sql(detail_url)
          + " WHERE bes_srtdeel_key = " + bes_srtdeel_key;
      Oracle.Execute(sql);
    }
    var leverdatum = punchNVL("NEW_ITEM-CUST_FIELD1[#]", item, "Onbekend");
    if (leverdatum != "Onbekend")
    {
      sql = "SELECT TO_DATE(" + safe.quoted_sql(leverdatum) + ", 'yyyymmdd') leverdatum FROM DUAL";
      var oRs = Oracle.Execute(sql);
      leverdatum = oRs("leverdatum").value;
      oRs.Close();
      result.orderurl = "&leverdatum=" + (new Date(leverdatum)).getTime();
    }
  }
  return result;
}

]]>
</script>
</component>
