<% /*
     $Revision$
     $Id$

     File:               RES/res_flexkenmerk.inc
     Description:        Functie die html code genereert voor de presentatie van de flexvelden
     Parameters:         urole                Rol van de gebruiker (frontend, frontoffice, backoffice, management info)
                         act_key              Activiteit
                         act_change           Activiteit is gewijzigd
                         reado                Readonly
                         advanced             Geadvanceerd
                         reqId                Perslid key
                         defaults             { bsn: "12345678", plaats: "Enschede", postcode:"1234AB" } altijd lowercase namen
     Context:            Functie wordt aangeroepen door
                         1) res/load_kenmerk.asp
                         2) res/res_edit_rsv_ruimte.asp die initieel serverside deze html code invoegd.
     Note:
*/ %>
<!-- #include file="../Shared/kenmerk_common.inc" -->
<%
function generateFlexKenmerkBlock(params)
{
      var urole = params.urole;
      var fronto = (urole == "fo");
      var backo = (urole == "bo");
      var minfo = (urole == "mi");
      var frontend = (urole == "fe" || (!fronto && !backo && !minfo));
      var disc_key = params.disc_key; // Res discipline key
      //var act_key_arr = params.act_key_arr; // Activiteit keys
      var act_key_arr = (params.act_key_arr) || []; // Activiteit keys
      var act_change = params.act_change; // Activiteit is gewijzigd
      var rsv_ruimte_key = params.rsv_ruimte_key; // Rsv ruimte key
      var serie = params.serie; // Serie reservering
      var reado = params.reado; // Readonly
      var readofe = params.readofe;
      var advanced = params.advanced; // Geavanceerd
      var reqId = params.reqId; // Perslid key (!search && multiMode)
      var hasfilter = params.hasfilter? params.hasfilter : null;
      var autfunction = "";
      switch(urole)
      {
        case "fe": autfunction = "WEB_RESUSE";
                   break;
        case "fo": autfunction = "WEB_RESFOF";
                   break;
        case "bo": autfunction = "WEB_RESBOF";
                   break;
        case "mi": autfunction = "WEB_RESBAC";
                   break;
      }

      // De functie checkAutorisation(autfunction) geeft een Response.End indien er geen autorisatie voor autfunction wordt gevonden
      var authparams = user.checkAutorisation(autfunction);

      var disc_key_arr = [];
      if (disc_key > 0)
          disc_key_arr.push(disc_key);
      else
      {
        var sql = "SELECT DISTINCT ra.res_discipline_key"
                + "  FROM res_rsv_artikel rra"
                + "     , res_artikel ra"
                + " WHERE rra.res_artikel_key = ra.res_artikel_key"
                + "   AND rra.res_rsv_ruimte_key = " + rsv_ruimte_key
                + " UNION " // geen dubbelen nodig
                + "SELECT rd.res_discipline_key"
                + "  FROM res_deel rd"
                + "     , res_rsv_deel rrd"
                + " WHERE rd.res_deel_key = rrd.res_deel_key"
                + "   AND rd.res_discipline_key <> " + S("vis_parking_key") // Een gereserveerde parkeerplaats moet ik niet toevoegen.
                + "   AND rrd.res_rsv_ruimte_key = " + rsv_ruimte_key
                + " UNION " // geen dubbelen nodig
                + "SELECT rr.res_discipline_key"
                + "  FROM res_ruimte rr"
                + "     , res_ruimte_opstelling ro"
                + "     , res_rsv_ruimte rrr"
                + " WHERE rr.res_ruimte_key = ro.res_ruimte_key"
                + "   AND ro.res_ruimte_opstel_key = rrr.res_ruimte_opstel_key"
                + "   AND rrr.res_rsv_ruimte_key = " + rsv_ruimte_key;

        var oRs = Oracle.Execute(sql);
        while (!oRs.eof)
        {
          // Dicipline toevoegen
          disc_key_arr.push(oRs("res_discipline_key").Value);
          oRs.MoveNext();
        }
        oRs.Close();
      }

      var my_resrechten = user.func_enabled2("RES", {ins_discipline_key: disc_key_arr.join(",")}); // res.func_enabled(rsv_ruimte_key) is overkill?

      // Mag ik de kenmerken *niet* wijzigen?
      function isReadonly (oRs)
      {
        // Als meegegeven dan altijd readonly
        if (reado) return true;
        var rolcode = oRs("kenmerk_rolcode").value;

        var canWrite = ( ((rolcode&1) && !readofe)
                      || ((rolcode&2) && my_resrechten.canWrite("WEB_RESFOF"))
                      || ((rolcode&4) && my_resrechten.canWrite("WEB_RESBOF")));

        return !canWrite;  // readonly
      }

      if (act_change)
        sql_waarde = " (SELECT MAX(CASE WHEN t.res_srtkenmerk_kenmerktype = 'M'"
                   + "                  THEN NULL"
                   + "                  ELSE v.res_kenmerkreservering_waarde"
                   + "                  END)"
                   + " FROM res_kenmerkwaarde v"
                   + "    , res_kenmerk vk"
                   + " WHERE v.res_rsv_ruimte_key = " + rsv_ruimte_key
                   + "   AND v.res_kenmerk_key = vk.res_kenmerk_key"
                   + "   AND vk.res_srtkenmerk_key = k.res_srtkenmerk_key"
                   // Ik kan een flexkenmerk twee keer aanmaken onder een ander groep. Dan is res_srtkenmerk_key niet meer uniek. Daarom goep ook meenemen.
                   + "   AND vk.res_kenmerk_groep = k.res_kenmerk_groep"
                   + "   AND vk.res_kenmerk_key = v.res_kenmerk_key"
                   + "   AND v.res_kenmerkwaarde_verwijder IS NULL)";
      else
        sql_waarde = " (SELECT MAX(CASE WHEN t.res_srtkenmerk_kenmerktype = 'M'"
                   + "                  THEN NULL"
                   + "                  ELSE v.res_kenmerkreservering_waarde"
                   + "                  END)"
                   + " FROM res_kenmerkwaarde v"
                   + " WHERE v.res_rsv_ruimte_key = " + rsv_ruimte_key
                   + "   AND v.res_kenmerk_key = k.res_kenmerk_key" // res_kenmerk_key is uniek
                   + "   AND v.res_kenmerkwaarde_verwijder IS NULL)";

      var myreadrolcode = 0;
      // Wat mag ik op  basis van mijn autorisatie (potentieel) zien, bepaal mijn rolcode-masker
      // Met WEB_RESBAC mag ik alles zien
      if (my_resrechten.canRead("WEB_RESBAC")) {
        myreadrolcode = 7;
      } else {
        myreadrolcode = 0 + (my_resrechten.canRead("WEB_RESUSE") ? 1 : 0)
                          + (my_resrechten.canRead("WEB_RESFOF") ? 2 : 0)
                          + (my_resrechten.canRead("WEB_RESBOF") ? 4 : 0);
      }

      // Voor *nieuwe* reserveringen negeren we RESBOF nog even.
      // Omdat we (meestal) nog geen catalogus/discipline hebben op dit moment zie je anders
      // als je maar *ergens* RESBOF voor hebt al te veel kenmerken
      if (rsv_ruimte_key < 0 && !params.advanced)  // kennelijk niet bij zoeken
        myreadrolcode = myreadrolcode - 4;

      sql = "SELECT k.res_kenmerk_key                 kenmerk_key"
          + "     , 1                                 kenmerk_key_count"
          + "     , t.res_srtkenmerk_key              srtkenmerk_key"
          + "     , COALESCE (" + lcl.xsql("k.res_kenmerk_omschrijving", "k.res_kenmerk_key")
          + "              ,  " + lcl.xsql("t.res_srtkenmerk_omschrijving", "t.res_srtkenmerk_key") + ") kenmerk_omschrijving"
          + "     , t.res_srtkenmerk_kenmerktype            kenmerk_kenmerktype"
          + "     , t.fac_kenmerkdomein_key                 kenmerkdomein_key"
          + "     , t.res_srtkenmerk_lengte                 kenmerk_lengte"
          + "     , t.res_srtkenmerk_dec                    kenmerk_dec"
          + "     , t.res_srtkenmerk_nmin                   kenmerk_nmin"
          + "     , t.res_srtkenmerk_nmax                   kenmerk_nmax"
          + "     , t.res_srtkenmerk_systeem                kenmerk_systeem"
          + (rsv_ruimte_key > 0 && !serie
            ? "   , " + sql_waarde
            : "   , " + lcl.xsql("k.res_kenmerk_default", "k.res_kenmerk_key")
               ) + "                                        kenmerk_waarde"
          + "     , k.res_kenmerk_volgnummer                kenmerk_volgnr"
          + "     , k.res_kenmerk_rolcode                   kenmerk_rolcode"
          + "     , " + lcl.xsql("t.res_srtkenmerk_dimensie", "t.res_srtkenmerk_key") + " kenmerk_dimensie"
          + "     , " + lcl.xsql("k.res_kenmerk_hint", "k.res_kenmerk_key") + " kenmerk_hint"
          + "     , " + lcl.xsql("k.res_kenmerk_default", "k.res_kenmerk_key") + " kenmerk_default"
          + "     , k.res_kenmerk_show_expr         	      kenmerk_show_expr"
          + "     , k.res_kenmerk_verplicht                 kenmerk_verplicht"
          + "     , k.res_kenmerk_groep                     kenmerk_groep"
          + "     , NULL otherpath"
          + "     , k.res_kenmerk_toonbaar                  kenmerk_toonbaar"
          + "     , k.res_kenmerk_uniek                     kenmerk_uniek"
          + "     , k.res_kenmerk_regexp                    kenmerk_regexp"
          + "     , k.fac_functie_key"
          + "  FROM res_srtkenmerk t"
          + "     , res_kenmerk k"
          + "     , res_activiteit s"
          + " WHERE (    k.res_activiteit_key = s.res_activiteit_key"
          + "        AND k.res_kenmerk_niveau = 'A')"
          + (act_key_arr.length
            ? " AND s.res_activiteit_key IN (" + act_key_arr.join(',') + ")"
            : "")
          + "   AND k.res_kenmerk_verwijder IS NULL"
          + "   AND k.res_srtkenmerk_key = t.res_srtkenmerk_key"
          + "   AND t.res_srtkenmerk_verwijder IS NULL"
          + "   AND BITAND(k.res_kenmerk_rolcode, " + myreadrolcode + ") > 0 "
          + " ORDER BY k.res_kenmerk_volgnummer"
          + "        , UPPER( COALESCE (" + lcl.xsql("k.res_kenmerk_omschrijving", "k.res_kenmerk_key")
          + "                        ,  " + lcl.xsql("t.res_srtkenmerk_omschrijving", "t.res_srtkenmerk_key") + "))";

  if (advanced) // Nog harder de dubbelen er uit filteren. Een kenmerk kan bijvoorbeeld bij verschillende
  {             // objectsoorten een ander volgnummer hebben en dat interesseert ons echt niet.
                // Kenmerken van dezelfde kenmerksoort kunnen afwijkende labels (benamingen) hebben (FCLT#57667). Daarom niet het MIN nemen van kenmerk_omschrijving.
    sql = "SELECT MIN(kenmerk_key) kenmerk_key"
        + "     , count(kenmerk_key) kenmerk_key_count"
        + "     , srtkenmerk_key"
        // + "     , MIN(mld_kenmerk_niveau)   mld_kenmerk_niveau"
        + "     , kenmerk_omschrijving      kenmerk_omschrijving"
        + "     , MIN(kenmerk_kenmerktype ) kenmerk_kenmerktype"
        + "     , MIN(kenmerkdomein_key   ) kenmerkdomein_key"
        + "     , MIN(kenmerk_lengte      ) kenmerk_lengte"
        + "     , MIN(kenmerk_dec         ) kenmerk_dec"
        + "     , MIN(kenmerk_nmin        ) kenmerk_nmin"
        + "     , MIN(kenmerk_nmax        ) kenmerk_nmax"
        + "     , MIN(kenmerk_systeem     ) kenmerk_systeem"
        + "     , MIN(kenmerk_waarde      ) kenmerk_waarde"
        + "     , MIN(kenmerk_volgnr      ) kenmerk_volgnr"
        + "     , MIN(kenmerk_rolcode     ) kenmerk_rolcode"
        + "     , MIN(kenmerk_groep       ) kenmerk_groep"
        + "     , MIN(kenmerk_dimensie    ) kenmerk_dimensie"
        + "     , MIN(kenmerk_hint        ) kenmerk_hint"
        + "     , MIN(kenmerk_default     ) kenmerk_default"
        + "     , MIN(otherpath           ) otherpath"
        + "     , MIN(kenmerk_verplicht   ) kenmerk_verplicht"
        + "     , MIN(kenmerk_toonbaar    ) kenmerk_toonbaar"
        + "     , MIN(kenmerk_uniek       ) kenmerk_uniek"
        + "     , MIN(kenmerk_regexp      ) kenmerk_regexp"
        + "     , MIN(kenmerk_show_expr   ) kenmerk_show_expr"
        + "     , MIN(fac_functie_key     ) fac_functie_key"
        + "  FROM (" + sql + ")"
        + " GROUP BY srtkenmerk_key"
        + "        , kenmerk_omschrijving";
  }


      listKenmerk(sql,
                  "RES",
                  rsv_ruimte_key,
                  {
                    kenmerk_search: advanced,
                    defaults: params.defaults,
                    fnIsReadonly: isReadonly,
                    prs_key: reqId, // reqId is the old prs_key
                    reado: reado,
                    mobile: params.mobile,
                    hideVervallen: rsv_ruimte_key<0,
                    parentKey: rsv_ruimte_key,
                    hasfilter: hasfilter
                  }
                 );
} %>
