<%@ language = "JavaScript" %>
<% /*
     $Revision$
     $Id$

    File:           api_perslid.asp

    Description:    API om een perslid te kunnen muteren.
    Parameters:     apiname, apikey
    Context:        Door een remote systeem (geen persoon) om info uit FACILITOR te halen aan te roepen

    Notes:

     Status:
*/
    DOCTYPE_Disable = 1;
    LCL_Disable = 1
    THIS_FILE = "appl/api/api_perslid.asp";
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../api/api.inc" -->
<!-- #include file="../Shared/json2.js" -->
<!-- #include file="../Shared/save2db.inc"-->
<%
    Session.Codepage = 65001;
    Response.Charset = 'utf-8';
    Session.Abandon(); // Voor de zekerheid

try
{
    var API = new API_func();   // Valideert ook

    var asJSON = getQParam("json","0")!="0";

    var params = RequestJSON();
    if (!params)
        API.error("Error parsing input JSON");

    // FAC_API_OPTIONS_JSON
    var urole = "fe"; // Altijd?
    var autfunction = urole == "fe"? "WEB_RESUSE" : "WEB_RESFOF";
    params.authparams = user.checkAutorisation(autfunction, null, null, true); // pessimistisch

/*
    params = {
               externId: "AAFM_12345", // Zelf zorgen dat het uniek is in het doel-systeem
               voornaam: "Jos",
               achternaam: "Groot Lipman",
               email: "user@example.com",
               telefoon: "053-1234567",
               mobiel: "06-12345678"
              };
*/
    warning = "";
    // TODO: Autorisatie
    prs_key = -1;
    switch (params.request)
    {
        case "select": // zoekt een persoon op basis van params.externId
            var sql = "SELECT prs_perslid_key"
                    + "  FROM prs_perslid"
                    + " WHERE prs_perslid_oslogin = " + safe.quoted_sql("_" + params.externId);
            var oRs = Oracle.Execute(sql);
            if (!oRs.Eof)
            {
                prs_key = oRs("prs_perslid_key").Value;
            }
            oRs.Close();
            break;
        case "update": // doet desnoods een insert
            var fields = [];

            if ("voornaam" in params)
                fields.push({ dbs: "prs_perslid_voornaam", typ: "varchar",  val: params.voornaam });
            if ("achternaam" in params)
                fields.push({ dbs: "prs_perslid_naam", typ: "varchar",  val: params.achternaam });
            if ("tussenvoegsel" in params)
                fields.push({ dbs: "prs_perslid_tussenvoegsel", typ: "varchar",  val: params.tussenvoegsel });
            if ("email" in params)
                fields.push({ dbs: "prs_perslid_email", typ: "varchar",  val: params.email });
            if ("geslacht" in params)
                fields.push({ dbs: "geslacht", typ: "varchar",  val: params.geslacht });
            if ("prs_perslid_mobiel" in params)
                fields.push({ dbs: "prs_perslid_mobiel", typ: "varchar",  val: params.mobiel });

            var sql = "SELECT prs_perslid_key"
                    + "  FROM prs_perslid"
                    + " WHERE prs_perslid_oslogin = " + safe.quoted_sql("_" + params.externId);
            var oRs = Oracle.Execute(sql);
            if (!oRs.Eof)
            {
                prs_key = oRs("prs_perslid_key").Value;
                sql = buildUpdate("prs_perslid", fields, { noValidateToken: true })
                    + "     prs_perslid_key = " + prs_key;
                var err = Oracle.Execute(sql, true);
                if (err.friendlyMsg)
                    warning = err.friendlyMsg;
                //else
                //    shared.trackaction("PRSUPD", prs_key);
            }
            else // Nieuwe
            {   /// TODO: Speciale flags?
                /// TODO: _default groep (door de trigger) is te veel. Misschien _defaultextern?
                fields.push({ dbs: "prs_perslid_key",     typ: "key",     seq: "prs_s_prs_alluitvoerende_keys" });
                fields.push({ dbs: "prs_perslid_oslogin", typ: "varchar", val: "_" + params.externId }); // De underscore voorkomt nagenoeg volledig dat ze ergens in beeld komen
                fields.push({ dbs: "prs_afdeling_key",    typ: "key",     val: user.prs_afdeling_key() }); // Vooralsnog altijd zelfde als de API-user!
                fields.push({ dbs: "prs_srtperslid_key",  typ: "key",     val: user.prs_srtperslid_key() });
                fields.push({ dbs: "prs_perslid_ingids",  typ: "check",   val: 0 });

                var prsIns = buildInsert("prs_perslid", fields, { noValidateToken: true });
                prs_key = prsIns.sequences["prs_perslid_key"];
                var err = Oracle.Execute(prsIns.sql, true);
                if (err.friendlyMsg)
                    warning = err.friendlyMsg;
                else
                {
                    shared.trackaction("PRSNEW", prs_key);
                    // We willen niet in authgroep _default maar in _defaultextern
                    var sql = "DELETE FROM fac_gebruikersgroep"
                            + " WHERE prs_perslid_key = " + prs_key;
                    Oracle.Execute(sql);
                    var sql = " INSERT INTO fac_gebruikersgroep"
                            + "          (fac_groep_key, prs_perslid_key)"
                            + " SELECT fac_groep_key, " + prs_key
                            + "   FROM fac_groep"
                            + "  WHERE fac_groep_upper = '_DEFAULTEXTERN'";
                    Oracle.Execute(sql);
                }
            }
            oRs.Close();
            break;
        default:
            API.error("Unknown API request");
    }
    // We hebben nu een prs_key

    Response.ContentType = "application/json";
    Response.AddHeader("Access-Control-Allow-Origin", "*"); // Opdat FireFox cross-domain toestaat

    var result = { success: true };
    if (warning)
        result = { succes: false, error: warning };
    else
    {
        result.prs_key = prs_key;
        if (prs_key > 0)
        {   // plak prs_auth achter een deeplink en deze gebruiker kan daarmee (vandaag) inloggen
            result.prs_auth = "userauth=" + prs_key + "&userhmac=" + safe.url(protectHMAC.create(String(prs_key)));
        }
    }

    var antwoord = JSON.stringify(result, null, getQParam("pretty","0")=="1"?2:0);

    var oCrypto = new ActiveXObject("SLNKDWF.Crypto");
    var eTag = '"' + oCrypto.hex_sha1(antwoord).toLowerCase() + '"';
    Response.AddHeader("ETag", eTag);
    if (Request.ServerVariables("HTTP_IF_NONE_MATCH") == eTag)
    {   // We hebben een match!
        Response.Clear();
        Response.Status = "304 Not modified";
        Response.End;
    }
    if (API.apidata.loglevel) __Log2File(antwoord, API.APIname + "_OUT");
    Response.write(antwoord);
}
catch (e)
{
    API.error(typeof e == "string"? e : "API_error: " + e.description);
}
%>