<% /*
     $Revision$
     $Id$

     File:               PRS/prs_flexkenmerk.inc
     Description:        Functie die html code genereert voor de presentatie van de flexvelden
     Parameters:         reado          Readonly
                         link_key       prs_key, afd_key
                         srt_key        prs_srt_key
                         niveau         "P",
                         includepublic   als true dan alle kenmerken met _toonbaar&2 ongeacht autorisatie
                         prsauthparams  (resultaat van prs.checkAutorisation voor writeman e.d., alleen personen)

     Context:            Functie wordt aangeroepen door
                         1) load_kenmerk.asp
                         2) prs_edit_xxx.asp die initieel serverside deze html code invoegt.

     Note:               Kenmerken met kenmerk_rolcode&4 luisternen naar WEB_PROFIL/WEB_EXTREL voor persoonsgegevens,
                         dus read/write als het om je EIGEN gegevens gaat.
                         Dit is de denkbare ambitie maar alleen de P is echt ondersteund
                         - persoon P-link_key = user_key
                         - afdeling A-link_key = user_key.afdeling_key
                         - bedrijf B-link_key = user_key.afdeling_key.bedrijf_key
                         - bedrijf C-link_key = contactpersoon_key[user_key]
                         De *MAN en *USE autorisatie van de betreffende entiteit wordt gebruikt om onderscheid obv de rolcodes te kunnen gebruiken.
*/ %>
<!-- #include file="../Shared/kenmerk_common.inc" -->
<%
function generateFlexKenmerkCode(params)
{
    var link_key  = params.link_key;  // organisatieding-key (B/A/C/P-key)
    var srt_key   = params.srt_key;   // soort perslid
    var niveau    = params.niveau;    // Onroerendgoed niveau (B/A/C/P)
    var advanced  = params.advanced;  // Geavanceerd
    var reqId     = params.reqId;     // Perslid key (!search && multiMode)
    var reado     = params.reado;     // Readonly
    var hasfilter = params.hasfilter ? params.hasfilter : null;

    // Om de een of andere reden wordt deze voor P al meegegeven, verderop kijken we zelf als dat niet zo is.
    //if (niveau=="P")
    //  var params.prsauthparams = prs.checkAutorisation(prs_key);

    // Voor het kunnen zien/editen van "eigen" kenmerken kijken we naar de PROFIL-autorisatie
    var prsauthparams = {}
    var itsmine = ( (niveau=="P" && link_key == user_key)
                 || (niveau=="A" && link_key == user.prs_afdeling_key())
                 || (niveau=="B" && link_key == user.afdeling().prs_bedrijf_key())
                 //|| (niveau=="C" && link_key == user.isBedrijfContact(xxx))  // Dit zoeken we straks uit
                 );

    var authparamsSELF = {PRSreadlevel: 9, PRSwritelevel: 9};  // eerst maar eens: je mag niks, tenzij
    if (niveau == "P")
        authparamsSELF= user.checkAutorisation("WEB_PROFIL", true)||{PRSreadlevel: 9};

    prsauthparams.readself =  itsmine && (authparamsSELF.PRSreadlevel < 9 || authparamsSELF.ALGreadlevel < 9);
    prsauthparams.writeself = itsmine && (authparamsSELF.PRSwritelevel < 9 || authparamsSELF.ALGwritelevel < 9);

    // Voor afdelingen en contactpersonen zijn we heel flexibel. Waarom?
    // Mogelijk omdat we hier alleen komen als we al minstens (lees) autorisatie hadden?


    if (niveau=="A")
    {
        var authparamsUSE = user.checkAutorisation("WEB_PRSUSE", true)||{PRSreadlevel: 9};
        var authparamsMAN = user.checkAutorisation("WEB_PRSMAN", true)||{PRSreadlevel: 9};
        params.prsauthparams = { writeman:  authparamsMAN.PRSwritelevel<9,
                                 writeuse:  authparamsUSE.PRSwritelevel<9,
                                 readman:   authparamsMAN.PRSreadlevel<9,
                                 readuse:   authparamsUSE.PRSreadlevel<9,
                                 readself:  prsauthparams.readself,
                                 writeself: prsauthparams.writeself }
    }
    else if (niveau=="C")
    {
        var authparamsUSE = user.checkAutorisation("WEB_RELUSE", true)||{PRSreadlevel: 9};
        var authparamsMAN = user.checkAutorisation("WEB_RELMAN", true)||{PRSreadlevel: 9};

        // IK [6822] moet extrel hebben om de onderhavige persoon te editen als DIE (ook) contactpersoon is van mijn bedrijf
        // de "link_key" is de prs_contactpersoon_key [6343]
        // die werkt bij het bedrijf waarvan ik ook contactpersoon ben [6821]
        if (link_key === -1) {
          itsmine = user.iamContact(); // In dit geval kan ik alleen maar contactpersonen bij mijn bedrijf aanmaken
        } else {
          var sql = "SELECT ''"
                  + "  FROM prs_contactpersoon"
                  + " WHERE prs_contactpersoon_key = " + link_key
                  + "   AND prs_contactpersoon_verwijder IS NULL"
                  + "   AND prs_bedrijf_key IN (SELECT cp.prs_bedrijf_key FROM prs_contactpersoon cp WHERE prs_contactpersoon_verwijder IS NULL AND cp.prs_perslid_key = " + user_key + ")";
          var oRs = Oracle. Execute(sql);
          itsmine = !oRs.Eof;
          oRs.Close();
        }

        if (itsmine)
        {
          __Log('Contactpersoon van mijn bedrijf.');
          authparamsSELF = user.checkAutorisation("WEB_EXTREL", true)||{PRSreadlevel: 9, PRSwritelevel: 9};
        }
        params.prsauthparams = { writeman:  authparamsMAN.PRSwritelevel<9,
                                 writeuse:  authparamsUSE.PRSwritelevel<9,
                                 readman:   authparamsMAN.PRSreadlevel<9,
                                 readuse:   authparamsUSE.PRSreadlevel<9,
                                 readself:  authparamsSELF.PRSreadlevel<9,
                                 writeself: authparamsSELF.PRSwritelevel<9 }
    }
    else if (niveau=="B")
    {
        if (params.intern == 1) // intern
        {
          var authparamsUSE = user.checkAutorisation("WEB_PRSUSE", true)||{PRSreadlevel: 9};
          var authparamsMAN = user.checkAutorisation("WEB_PRSMAN", true)||{PRSreadlevel: 9};
        }
        else // extern of systeem
        {
          var authparamsUSE = user.checkAutorisation("WEB_RELUSE", true)||{PRSreadlevel: 9};
          var authparamsMAN = user.checkAutorisation("WEB_RELMAN", true)||{PRSreadlevel: 9};
        }
        // Een eenvoudig contactpersoon mag de MAN-kenmerken niet zien, maar eigen kenmerken wel
        // dat eerste gebeurt nu intrinsiek door (het gebrek aan) RELMAN-autorisatie
        authparamsSELF = {PRSreadlevel: 9, PRSwritelevel: 9};
        if (user.iamContact(link_key))
        {
          authparamsSELF = user.checkAutorisation("WEB_EXTREL", true)||{PRSreadlevel: 9, PRSwritelevel: 9};
        }
        params.prsauthparams = { writeman:  authparamsMAN.PRSwritelevel<9,
                                 writeuse:  authparamsUSE.PRSwritelevel<9,
                                 readman:   authparamsMAN.PRSreadlevel<9,
                                 readuse:   authparamsUSE.PRSreadlevel<9,
                                 readself:  authparamsSELF.PRSreadlevel<9,
                                 writeself: authparamsSELF.PRSwritelevel<9 }
    }
    else if (niveau =="P" && !params.prsauthparams) // flex search en profiel
    {
       params.prsauthparams = { readman: true, readuse: true, readself: prsauthparams.readself, writeself: prsauthparams.writeself }
       var authparamsUSE = user.checkAutorisation("WEB_PRSUSE", true)||{PRSreadlevel: 9};
       var authparamsMAN = user.checkAutorisation("WEB_PRSMAN", true)||{PRSreadlevel: 10};
       // Als authparamsMAN en authparamsUSE verschillen zou het heel ingewikkeld worden.
       // Daarom tonen we dan voor de veiligheid geen MAN meer. Beetje lomp
       if (authparamsMAN.PRSreadlevel > -1 && authparamsMAN.PRSreadlevel != authparamsUSE.PRSreadlevel)
            params.prsauthparams.readman = false;
       if (authparamsUSE.PRSreadlevel > -1)
            params.prsauthparams.readuse = false;
    }
     __Log(params.prsauthparams)

    // Van jezelf mag je vanalles zien. -> dit gaat nu vanzelf met rolcode, die je kunt combineren

    function isReadonly (oRs)
    {
        if ( params.reado )
            return true;

        var rolcode = oRs("kenmerk_rolcode").value;
        var canWrite = (   ((rolcode&1) && params.prsauthparams.writeman)
                        || ((rolcode&2) && params.prsauthparams.writeuse)
                        || ((rolcode&4) && params.prsauthparams.writeself)
                       );

        return !canWrite;  // readonly
    }

    // Merk op dat het deel dat helemaal nooit zichtbaar kan zijn al door de query is uitgefilterd
    function isInvisible(oRs)
    {
        var rolcode = oRs("kenmerk_rolcode").value;
        var canRead = (    ((rolcode&1) && params.prsauthparams.readman)
                        || ((rolcode&2) && params.prsauthparams.readuse) /* incl readself */
                        || ((rolcode&4) && (params.prsauthparams.readself))
                        || params.includepublic  // dan sowieso wel *visible* op profielpagina, ongeacht autorisatie
                      );
        return !canRead;  // invisible
    }

    // Wat mag ik op  basis van mijn autorisatie (potentieel) zien, bepaal mijn rolcode-masker
    var myreadrolcode = 0 + (params.prsauthparams.readman ? 1 : 0)
                          + (params.prsauthparams.readuse ? 2 : 0)
                          + (params.prsauthparams.readself? 4 : 0);


    var sql = "SELECT k.prs_kenmerk_key              kenmerk_key"
            + "     , 1                              kenmerk_key_count"
            + "     , NULL                           srtkenmerk_key"
            + "     , " + lcl.xsql("k.prs_kenmerk_omschrijving", "k.prs_kenmerk_key") + " kenmerk_omschrijving"
            + "     , k.prs_kenmerk_kenmerktype      kenmerk_kenmerktype"
            + "     , k.fac_kenmerkdomein_key        kenmerkdomein_key"
            + "     , k.prs_kenmerk_lengte           kenmerk_lengte"
            + "     , k.prs_kenmerk_dec              kenmerk_dec"
            + "     , k.prs_kenmerk_nmin             kenmerk_nmin"
            + "     , k.prs_kenmerk_nmax             kenmerk_nmax"
            + "     , k.prs_kenmerk_systeem          kenmerk_systeem"
            + (link_key > 0
              ? "   , (SELECT MAX(CASE WHEN k.prs_kenmerk_kenmerktype = 'M'"
                + "                    THEN NULL"
                + "                    ELSE v.prs_kenmerklink_waarde"
                + "                    END)"
                + "      FROM prs_kenmerklink v"
                + "     WHERE v.prs_link_key = " + link_key
                + "       AND v.prs_kenmerklink_niveau = " + safe.quoted_sql(niveau)
                + "       AND v.prs_kenmerk_key = k.prs_kenmerk_key"
                + "       AND v.prs_kenmerklink_verwijder IS NULL)"
              : "   , " + lcl.xsql("k.prs_kenmerk_default", "k.prs_kenmerk_key")
              ) + "                                  kenmerk_waarde"
            + "     , k.prs_kenmerk_volgnr           kenmerk_volgnr"
            + "     , k.prs_kenmerk_rolcode          kenmerk_rolcode"
            + "     , " + lcl.xsql("k.prs_kenmerk_dimensie", "k.prs_kenmerk_key") + " kenmerk_dimensie"
            + "     , " + lcl.xsql("k.prs_kenmerk_hint", "k.prs_kenmerk_key") + " kenmerk_hint"
            + "     , " + lcl.xsql("k.prs_kenmerk_default", "k.prs_kenmerk_key") + " kenmerk_default"
            + "     , k.prs_kenmerk_show_expr        kenmerk_show_expr"
            + "     , k.prs_kenmerk_verplicht        kenmerk_verplicht"
            + "     , k.prs_kenmerk_groep            kenmerk_groep"
            + "     , NULL otherpath"
            + "     , k.prs_kenmerk_toonbaar         kenmerk_toonbaar"
            + "     , k.prs_kenmerk_uniek            kenmerk_uniek"
            + "     , k.prs_kenmerk_regexp           kenmerk_regexp"
            + "     , k.fac_functie_key"
            + "    FROM prs_kenmerk k "
            + "   WHERE k.prs_kenmerk_niveau = " + safe.quoted_sql(niveau)
            + "     AND k.prs_kenmerk_verwijder IS NULL "
            //+ "     AND BITAND(prs_kenmerk_systeem,4) = 0 " // deze zijn vertrouwelijk: wordt niet ondersteund
            + "     AND (BITAND(k.prs_kenmerk_rolcode, " + myreadrolcode + ") > 0 "
              + (params.includepublic
                ?  "    OR BITAND(k.prs_kenmerk_toonbaar, 2) = 2 "
                : ""
                )
              + ") "
            + "     AND (k.prs_srtperslid_key IS NULL "
            + ((niveau=="P" && srt_key > 0)
              ? " OR k.prs_srtperslid_key = "+ srt_key +")"
              : ")"
              )
            + " ORDER BY k.prs_kenmerk_volgnr"
            + "        , " + lcl.xsql("k.prs_kenmerk_omschrijving", "k.prs_kenmerk_key");

    listKenmerk(sql,
                "PRS", // Module
                link_key,
                {
                  kenmerk_search: advanced,
                  fnIsReadonly: isReadonly,
                  reado: reado,
                  fnIsInvisible: isInvisible,
                  parentKey: link_key, // PF: deze begrijp ik niet
                  hideVervallen: link_key<0,
                  niveau: niveau,
                  kenmerk_module: niveau,
                  multiMode: params.multi,
                  mobile: params.mobile,
                  hasfilter: hasfilter
                }
               );
} %>
