<% /*
     $Revision$
     $Id$

     File:               CNT/cnt_flexkenmerk.inc
     Description:        Functie die html code genereert voor de presentatie van de flexvelden
     Parameters:         cnt_key              Contract key
                         disc_key_arr         Contractsoort key array
                         reado                Readonly
                         advanced             Geadvanceerd
                         reqId                Perslid key
     Context:            Functie wordt aangeroepen door
                         1) load_kenmerk.asp
                         2) cnt_edit.asp die initieel serverside deze html code invoegt.
     Note:
*/ %>

<!-- #include file="../Shared/kenmerk_common.inc" -->
<%
function getFlexKenmerkCodeSql(params)
{
  var cnt_key = params.cnt_key; // Contract key
  var disc_key_arr = params.disc_key_arr; // Contractsoort key
  var reado = params.reado; // Readonly
  var advanced = params.advanced; // Geavanceerd
  var reqId = params.reqId; // Perslid key (!search && multiMode)
  var hasfilter = params.hasfilter? params.hasfilter : null;
  var multiEdit = params.multiEdit? params.multiEdit : false;

  if (cnt_key > -1)
    var this_cnt = params.this_cnt || cnt.func_enabled_contract(cnt_key);
  else
    var this_cnt = cnt.func_enabled_cnt(disc_key_arr.join(",")); // Disciplines als multi string meegeven.

  function isReadonly (oRs)
  {
    var isBijlage = inArray(oRs("kenmerk_kenmerktype").Value, ["E", "F", "M"]);
    if (params.reado && !(params.mobile && isBijlage))
        return true;

    var rolcode = oRs("kenmerk_rolcode").value;
    var canWrite = (this_cnt.canMANwrite && (rolcode&1)) || (this_cnt.canUSEwrite && (rolcode&2));
    return !canWrite;  // readonly
  }

  function isInvisible(oRs) // MGE: In de search mode (overzichtscherm) zien we altijd alle flexkenmerken?? Deze functie wordt dan niet gebruikt.
  {
    var rolcode = oRs("kenmerk_rolcode").value;
    var canRead = (   ((rolcode&1) && this_cnt.canMANread)
                   || ((rolcode&2) && this_cnt.canUSEread /* incl readself */)
                  )
    return !canRead;  // invisible
  }

  if (cnt_key > 0)
  {
    var sql = "SELECT ins_discipline_key FROM cnt_contract WHERE cnt_contract_key = " + cnt_key;
    var loRs = Oracle.Execute(sql);
    var disc_key_arr = [loRs("ins_discipline_key").value];
  }

  // Wat mag ik op  basis van mijn autorisatie (potentieel) zien, bepaal mijn rolcode-masker
  var myreadrolcode = 0 + (this_cnt.canMANread ? 1 : 0)
                        + (this_cnt.canUSEread ? 2 : 0);

  sql = "SELECT DISTINCT k.cnt_kenmerk_key kenmerk_key"
      + "     , 1                          kenmerk_key_count"
      + "     , k.cnt_srtkenmerk_key       srtkenmerk_key"
      + "     , COALESCE (" + lcl.xsql("k.cnt_kenmerk_omschrijving", "k.cnt_kenmerk_key")
      + "              ,  " + lcl.xsql("t.cnt_srtkenmerk_omschrijving", "t.cnt_srtkenmerk_key") + ") kenmerk_omschrijving"
      + "     , t.cnt_srtkenmerk_kenmerktype        kenmerk_kenmerktype"
      + "     , t.fac_kenmerkdomein_key             kenmerkdomein_key"
      + "     , t.cnt_srtkenmerk_lengte             kenmerk_lengte"
      + "     , t.cnt_srtkenmerk_dec                kenmerk_dec"
      + "     , t.cnt_srtkenmerk_nmin               kenmerk_nmin"
      + "     , t.cnt_srtkenmerk_nmax               kenmerk_nmax"
      + "     , t.cnt_srtkenmerk_systeem            kenmerk_systeem"
      + (cnt_key > 0
        ? "   , (SELECT MAX(CASE WHEN t.cnt_srtkenmerk_kenmerktype = 'M'"
          + "                    THEN NULL"
          + "                    ELSE v.cnt_kenmerkcontract_waarde"
          + "                    END)"
          + "      FROM cnt_kenmerkcontract v"
          + "     WHERE v.cnt_contract_key = " + cnt_key
          + "       AND v.cnt_kenmerk_key = k.cnt_kenmerk_key"
          + "       AND v.cnt_kenmerkcontract_verwijder IS NULL)"
        : "   , " + lcl.xsql("k.cnt_kenmerk_default", "k.cnt_kenmerk_key")
        ) + "                                       kenmerk_waarde"
      + "     , k.cnt_kenmerk_volgnummer            kenmerk_volgnr"
      + "     , k.cnt_kenmerk_rolcode               kenmerk_rolcode"
      + "     , " + lcl.xsql("t.cnt_srtkenmerk_dimensie", "t.cnt_srtkenmerk_key") + " kenmerk_dimensie"
      + "     , " + lcl.xsql("k.cnt_kenmerk_hint", "k.cnt_kenmerk_key") + " kenmerk_hint"
      + "     , " + lcl.xsql("k.cnt_kenmerk_default", "k.cnt_kenmerk_key") + " kenmerk_default"
      + "     , k.cnt_kenmerk_show_expr         	  kenmerk_show_expr"
      + "     , k.cnt_kenmerk_verplicht             kenmerk_verplicht"
      + "     , k.cnt_kenmerk_groep                 kenmerk_groep"
      + "     , NULL otherpath"
      + "     , k.cnt_kenmerk_toonbaar              kenmerk_toonbaar"
      + "     , k.cnt_kenmerk_uniek                 kenmerk_uniek"
      + "     , k.cnt_kenmerk_regexp                kenmerk_regexp"
      + "     , k.fac_functie_key"
      + "  FROM cnt_srtkenmerk t"
      + "     , cnt_kenmerk k"
      + "     , cnt_discipline s"
      + " WHERE k.cnt_srtcontract_key = s.ins_discipline_key(+)"
      + "   AND k.cnt_kenmerk_verwijder IS NULL"
      + "   AND k.cnt_srtkenmerk_key = t.cnt_srtkenmerk_key"
      + "   AND t.cnt_srtkenmerk_verwijder IS NULL"
      + "   AND BITAND(k.cnt_kenmerk_rolcode, " + myreadrolcode + ") > 0 "
      + (disc_key_arr.length > 0
        ? " AND (s.ins_discipline_key IN (" + disc_key_arr.join(",") + ") OR s.ins_discipline_key IS NULL)"
        : "")
      + (multiEdit
        ? "  AND t.cnt_srtkenmerk_kenmerktype NOT IN ('Q','L','l','F','M','E','X')"
        : "")
      + ( (params.kenmerk_keys && params.kenmerk_keys.length) // Specifieke kenmerk_keys opgevraagd?
        ? "  AND k.cnt_kenmerk_key IN (" + params.kenmerk_keys.join(",") + ")"
        : "")
      + " ORDER BY k.cnt_kenmerk_volgnummer"
      + "        , UPPER( COALESCE (" + lcl.xsql("k.cnt_kenmerk_omschrijving", "k.cnt_kenmerk_key")
      + "                        ,  " + lcl.xsql("t.cnt_srtkenmerk_omschrijving", "t.cnt_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.
    sql = "SELECT MIN(kenmerk_key) kenmerk_key"
        + "     , count(kenmerk_key) kenmerk_key_count"
        + "     , srtkenmerk_key"
        + "     , 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_dimensie    ) kenmerk_dimensie"
        + "     , MIN(kenmerk_hint        ) kenmerk_hint"
        + "     , MIN(kenmerk_default     ) kenmerk_default"
        + "     , MIN(otherpath           ) otherpath"
        + "     , MIN(kenmerk_verplicht   ) kenmerk_verplicht"
        + "     , MIN(kenmerk_groep       ) kenmerk_groep"
        + "     , 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"
        + " ORDER BY kenmerk_volgnr"
        + "        , UPPER (kenmerk_omschrijving)"
  }


  listkenmerk_params = { kenmerk_search: advanced
                       , hideVervallen: cnt_key<0
                       , fnIsReadonly: isReadonly
                       , reado: reado
                       , mobile: params.mobile
                       , fnIsInvisible: isInvisible
                       , parentKey: cnt_key
                       , hasfilter: hasfilter
                       , multiEdit: multiEdit
                       };
  return { sql: sql
         , key: cnt_key
         , list_params: listkenmerk_params
         };

}

function generateFlexKenmerkCode(params)
{
  var block_params = getFlexKenmerkCodeSql(params);

  listKenmerk(block_params.sql,
              "CNT",
              block_params.key,
              block_params.list_params
             );
}
%>

