<% /*
    $Revision$
    $Id$

    Geef een Qlikview ticket uit

    qvw_enabled geeft het maximum aan (CUST01, CUST02, CUST03 etc)

    Voorkeur is altijd het ticket waar jou prs_perslid_key ingevuld staat.

    Bij iemand met schrijfrechten op xxxx wordt bij uitgifte qvw_ticket_flags=1 gezet
    zodat de ticket voor hem gereserveerd is ('named user': hij zal nooit aan iemand
    anders worden uitgegeven.

    Andere gebruikers krijgen het oudste niet-gereserveerde ticket
*/

function get_qv_ticket(qvRoot, qvauth)
{
    var authparams = user.checkAutorisation("WEB_MGTRAP");

    // 'Vrijgeven' alle gereserveerde tickets van personen die ondertussen
    // geen schrijfrechten meer hebben. Gebeurt misschien nog niet eens
    // per jaar maar zo hebben wij er minder beheer aan.
    var sql = "UPDATE fac_qvw_ticket qt"
            + "   SET fac_qvw_ticket_flags = BITAND(fac_qvw_ticket_flags, 255-1)" // reset 'reserved' flag
            + " WHERE NOT EXISTS"
            + "     (SELECT qt.prs_perslid_key FROM fac_v_webgebruiker fw"
            + "       WHERE fw.prs_perslid_key = qt.prs_perslid_key"
            + "         AND fac_functie_key = " + authparams.autfunctionkey
            + "         AND fac_gebruiker_alg_level_write = 9 AND fac_gebruiker_prs_level_write = 9)";
    Oracle.Execute(sql);

    var ticket_id;
    var sql = "SELECT fac_qvw_ticket_userid"
            + "  FROM fac_qvw_ticket "
            + " WHERE prs_perslid_key = " + user_key;
    var oRs = Oracle.Execute(sql);
    if (!oRs.Eof)
    {   // Onze 'eigen' ticket heeft altijd de voorkeur
        ticket_id = oRs("fac_qvw_ticket_userid").Value;
    }
    else // Nieuw ticket bepalen
    {
        var sql = "SELECT count(*) aantal"
                + "  FROM fac_qvw_ticket ";
        var oRs = Oracle.Execute(sql);
        var cnt = oRs("aantal").Value;
        if (cnt < S("qvw_enabled"))
        {   // Ticket er bij aanmaken
            // Default is qv_ticket_prefix leeg maar AA zet hem op AAXX zodat
            // ze netto als minder licenties tellen
            if (S("qv_ticket_prefix") != "")
                ticket_id = S("qv_ticket_prefix") + "_" + user.oslogin(); // Dan (ook) hard koppelen aan oslogin
            else
                ticket_id = customerId + padout(cnt);
            var sql = "INSERT INTO fac_qvw_ticket (fac_qvw_ticket_userid, prs_perslid_key)"
                    + "  VALUES(" + safe.quoted_sql(ticket_id) + ", " + user_key + ")";
            Oracle.Execute(sql);
        }
        else // Eén van de floating tickets hergebruiken
        {    // Let op: we pakken de oudste maar het kan zo zijn dat iemand daar nu nog mee
             // bezig is. Die wordt zonder waarschuwing door Qlikview server er 'uitgegooid'
            var sql = "SELECT fac_qvw_ticket_userid"
                    + "  FROM fac_qvw_ticket "
                    + " WHERE BITAND(fac_qvw_ticket_flags, 1) = 0" // Alleen floating
                    + " ORDER BY fac_qvw_ticket_uitgifte"; // Oudste eerst
            oRs = Oracle.Execute(sql);
            if (!oRs.Eof)
            {
                ticket_id = oRs("fac_qvw_ticket_userid").Value;
            }
            else
            {
                __DoLog("Out of FACILITOR Qlikview licenses");
                shared.simpel_page("Out of FACILITOR Qlikview licenses");
            }
        }
    }

    // altijd de (nieuwe) ticket ophalen bij Qlikview
    var ticketUrl = qvRoot+"GetTicket.aspx?";  // Ticket provider

    // Ticket request bouwen
    var xmlhttp = Server.CreateObject("WinHTTP.WinHTTPRequest.5.1");
    xmlhttp.open("POST", ticketUrl, false);
    // Zonder deze header werkt 't niet
    xmlhttp.setRequestHeader("Authorization", qvauth );
    xmlhttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
    var req = "<Global method='GetTicket'><UserId>" + escape(ticket_id) + "</UserId></Global>"
    __Log("ticketUrl: " + ticketUrl)
    xmlhttp.send(req);

    // Ticket uit de response-XML peuteren
    var ticketResponse = Server.CreateObject("Msxml2.DOMDocument.6.0");
    ticketResponse.loadXML(xmlhttp.ResponseText); // for parsing

    var ticket_code;
    if  (ticketResponse)
    {
        var retv = ticketResponse.getElementsByTagName('_retval_');
        if (retv.length)
            ticket_code = ticketResponse.getElementsByTagName('_retval_')[0].firstChild.text;
    }
    if (!ticket_code)
    {
        __DoLog("Could not get Qlikview Ticket", "#FFFF00");
        __DoLog("U: " + ticketUrl);
        __SafeDoLog("R: " + Server.HTMLEncode(req));
        __DoLog("QV S: " + xmlhttp.status);
        __SafeDoLog("QV T: " + Server.HTMLEncode(xmlhttp.responseText));
        shared.simpel_page("Could not get Qlikview Ticket");
    }

    var flag = 0; // Shard
    if (authparams.ALGwritelevel < 9 && authparams.PRSwritelevel < 9)
        flag = 1; // Reserved

    sql = "UPDATE fac_qvw_ticket "
        + "   SET fac_qvw_ticket_uitgifte = SYSDATE"
        + "     , prs_perslid_key = " + user_key
        + "     , fac_qvw_ticket_flags = BITAND(fac_qvw_ticket_flags, 255-1) + " + flag
        + " WHERE fac_qvw_ticket_userid = " + safe.quoted_sql(ticket_id);
    oRs = Oracle.Execute(sql);

    return ticket_code;
}
%>