<% /*
     $Revision$
     $Id$

     File:               FGII/WPFunctions.asp
     Description:        Generieke serverside werkplek functies
     Parameters:
     Context:
     Result:
     Note:               Voornamelijk gebruikt voor S("prs_werkplek_implicit")==1 en binnen FGII
*/

/************************************************************\
 * Kijk of we schrijfrechten (WEB_PRSBOF) hebben op werkplekken
 * op een bepaalde verdieping
 * Result: false: ik mag niet schrijven
 *         true: ik mag wel schrijven
 *         Veronderstel dat autorisatie minimaal verdieping is, ruimte wordt niet ondersteund
\************************************************************/
function WPCanWrite(vKey)
{
    // Hebben we wel schrijfrechten op deze werkplek op deze verdieping?
    var sql =  "SELECT MIN(fac_gebruiker_alg_level_write) lvl"
             + "  FROM fac_v_webgebruiker w, fac_functie f"
             + " WHERE w.fac_functie_key = f.fac_functie_key "
             + "   AND w.prs_perslid_key = " + user_key
             + "   AND fac_functie_code = 'WEB_PRSBOF'";
    var oRs = Oracle.Execute(sql);
    if (oRs.eof)
        return false; // Geen rechten

    var ALGWriteLevel = oRs("lvl").value;
    if (ALGWriteLevel == 9)
        return false; // Geen rechten

    if (ALGWriteLevel < 0)
        return true; // Alle rechten

    var fac_v_my_disc_onrgoed_write = ""
         + "SELECT a.alg_ruimte_key"
         + "  FROM alg_v_onrgoed_familie a,"
         + "       alg_v_onrgoed_familie aa,"
         + "       alg_v_my_room mr"
         + " WHERE mr.alg_ruimte_key = aa.alg_ruimte_key"
         + "   AND mr.prs_perslid_key = " + user_key
         + "   AND a.alg_onrgoed_elder_key = aa.alg_onrgoed_elder_key"
         + "   AND aa.niveau = a.niveau" // Noodzakelijk want ALG_LOCATIE heeft eigen sequence
         + "   AND aa.niveau >= " + ALGWriteLevel

    var rsql = " SELECT 1"   // plaatsgebonden en gebruiker heeft een plaats (werkplek)
            + "   FROM ("+fac_v_my_disc_onrgoed_write+") oga, alg_ruimte ar"
            + "  WHERE oga.alg_ruimte_key = ar.alg_ruimte_key"
            + "    AND ar.alg_verdieping_key = " + vKey

    return !(Oracle.Execute(rsql).eof);
}

function WPnextvolg(room_key)
{
    var sql = "SELECT MIN (prs_werkplek_volgnr + 1) "
            + "  FROM prs_werkplek pw "
            + " WHERE prs_alg_ruimte_key = " + room_key
            + "   AND NOT EXISTS ( "
            + "          SELECT * "
            + "            FROM prs_werkplek pw2 "
            + "           WHERE prs_alg_ruimte_key = " + room_key
            + "             AND pw2.prs_werkplek_volgnr = pw.prs_werkplek_volgnr + 1)"
    var oRs = Oracle.Execute(sql);
    if (oRs.Eof || oRs(0).Value == null)
        return 1;
    else
        return oRs(0).value;
}

/************************************************************\
 * Verplaats een PERSLIDWERKPLEK naar een andere ruimte door zijn
 * PRS_WERKPLEK over te zetten naar die nieuwe ruimte
\************************************************************/
function WPMove_PRS_PERSLIDWERKPLEK(prswp_key, room_key)
{
    var sql = "SELECT prs_werkplek_key FROM prs_perslidwerkplek"
            + " WHERE prs_perslidwerkplek_key = " + prswp_key;
    var oRs = Oracle.Execute(sql);
    var wp_key = oRs(0).Value;
    WPMove_PRS_WERKPLEK(wp_key, room_key);
}

/************************************************************\
 * Verplaats een WERKPLEK naar een andere ruimte
\************************************************************/
function WPMove_PRS_WERKPLEK(wp_key, room_key)
{
    var sql = "UPDATE PRS_WERKPLEK"
          + "   SET PRS_ALG_RUIMTE_KEY = " + room_key
          + " WHERE PRS_WERKPLEK_KEY = " + wp_key;
    try
    {
        Oracle.Execute(sql);
    }
    catch (e) // Neem aan dat volgnummer niet goed was, anders snappen we het niet
    {
        __Log("^^^ PRS_U_PRS_WERKPLEK_VOLGNR hierboven is niet erg: we gaan nu een nieuw volgnummer zoeken:");
        var nextvolg = WPnextvolg(room_key)
        sql = "UPDATE PRS_WERKPLEK"
            + "   SET PRS_ALG_RUIMTE_KEY = " + room_key
            + "      ,PRS_WERKPLEK_VOLGNR = " + nextvolg
            + " WHERE PRS_WERKPLEK_KEY = " + wp_key;
        var oRs = Oracle.Execute(sql);
    }
}

/************************************************************\
 * Maak een nieuwe werkplek in een ruimte, eventueel virtueel
 * Lever de nieuwe key op
 * params: bVirtual true of false,
\************************************************************/
function WPMake_WP(room_key, params)
{
    params = params || {};
    __Log("Making WP");
    var nextvolg = WPnextvolg(room_key);

    var sql = "INSERT INTO prs_werkplek w"
            + " (prs_werkplek_volgnr, prs_werkplek_omschrijving, prs_alg_ruimte_key, prs_werkplek_virtueel)"
            + " SELECT " + nextvolg + ", alg_ruimte_nr || '/"+nextvolg+"', " + room_key + ", " + (params.bVirtual?1:0)
            + "   FROM alg_ruimte WHERE alg_ruimte_key = " + room_key;
    Oracle.Execute(sql);
    // Effe terugzoeken
    sql = "SELECT prs_werkplek_key"
        + "  FROM prs_werkplek w"
        + " WHERE w.prs_werkplek_volgnr = " + nextvolg
        + "   AND w.prs_alg_ruimte_key = " + room_key
    var oRs = Oracle.Execute(sql);
    var wp_key = oRs(0).Value;
    oRs.Close();
    return wp_key;
}

/************************************************************\
 * Plaats een persoon (eventueel virtueel) in een ruimte
 * Maak daartoe een nieuwe PRS_WERKPLEK en PRS_PERSLIDWERKPLEK aan
\************************************************************/
function WPPlace_PRS_PERSLID(prs_key, room_key, bVirtual)
{
    __Log("Placing person");
    var wp_key = WPMake_WP(room_key, { bVirtual: bVirtual })
    // Nu PRS_PERSLIDWERKPLEK aanmaken
    var sql = "INSERT INTO prs_perslidwerkplek w"
            + " (prs_werkplek_key, prs_perslid_key)"
            + " VALUES (" + wp_key + ", " + prs_key + ")";
    Oracle.Execute(sql);
}

/************************************************************\
 * Verwijder een persoon uit een ruimte
 * Verwijder daartoe zijn PRS_WERKPLEK en PRS_PERSLIDWERKPLEK
\************************************************************/
function WPRemove_PRS_PERSLID(prs_key, room_key, bVirtual)
{


}

/************************************************************\
 * Verwijder een aantal perslidwerkplekken en automatisch
 * ook de onderliggende werkplekken
 * wpdel is een comma-separated lijst met PERSLIDWERKPLEK key's
\************************************************************/
function WPRemove_PRS_PERSLIDWERKPLEK(pwpdel)
{
    var sql = "select prs_werkplek_key from prs_perslidwerkplek"
            + " where prs_perslidwerkplek_key in ("+pwpdel+")";
    var oRs = Oracle.Execute(sql);
    if (!oRs.Eof)
    {
        //var wpdel = oRs.GetString(2,-1,"column-delim","row-delim","null");
        var wpdel = ""
        do
        {
            wpdel += ","+oRs(0).Value; // Komma gescheiden lijst
            oRs.MoveNext();
        } while (!oRs.Eof);
        wpdel = wpdel.substring(1); // Eerst komma er af

        var sql = "delete prs_perslidwerkplek where prs_perslidwerkplek_key in ("+pwpdel+")";
        Oracle.Execute(sql);
        var sql = "delete prs_werkplek where prs_werkplek_key in ("+wpdel+")";
        Oracle.Execute(sql);
    }
}
%>
