<% /*
     $Revision$
     $Id$

     File:               bes/bes_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)
                         bes_key              Bestelling key
                         disc_key             Catalogus key
                         srtgroup_key         Groep key
                         srtdeel_key          Item key
                         kenmerktype          Kenmerk type (B, I)
                         reado                Readonly
                         advanced             Geadvanceerd
                         prs_key              Perslid key
                         ord                  Via ORD binnengekomen
     Context:            Functie wordt aangeroepen door
                         1) load_kenmerk.asp
                         2) bes_edit_bestelling.asp die initieel serverside deze html code invoegd.
     Note:
*/ %>
<!-- #include file="../Shared/kenmerk_common.inc" -->
<%
function generateFlexKenmerkCode(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 bes_key = params.bes_key; // Bestelling key
      var disc_key = params.disc_key; // Catalogus key
      var srtgroup_key = params.srtgroup_key; // Groep
      var srtdeel_key = params.srtdeel_key; // Item
      var kenmerktype = params.kenmerktype; // Kenmerktype
      var bestelopdracht = params.bestelopdracht; // Bestelopdracht
      var ord = params.ord; // Via ORD binnengekomen
      var reado = params.reado; // Readonly
      var advanced = params.advanced; // Geavanceerd
      var hasfilter = params.hasfilter? params.hasfilter : null;

      var autfunction = "";
      switch(urole)
      {
        case "fe": autfunction = "WEB_BESUSE";
                   break;
        case "fo": autfunction = "WEB_BESFOF";
                   break;
        case "bo": autfunction = "WEB_BESBOF";
                   break;
        case "mi": if (ord)
                     autfunction = "WEB_BESBOR"; // Via ORD binnengekomen dan ook ORD rechten pakken
                   else
                     autfunction = "WEB_BESBAC"; // Via BES binnengekomen dan ook BES rechten pakken
                   break;
      }

      // De functie checkAutorisation(autfunction) geeft een Response.End indien er geen autorisatie voor autfunction wordt gevonden
// TODO: Moeten we echt zo streng zijn? Fiatteur heeft namelijk geen BESUSE rechten
//       var authparams = user.checkAutorisation(autfunction);

      // userhasORDSUP true betekent: user mag flexkenmerken rolcode 4 (voorheen > 900) zien/editen
      var userhasORDSUP = user.has("WEB_ORDSUP");

      if (kenmerktype != "B" && kenmerktype != "I" ||
          kenmerktype != "B" && bestelopdracht)
      {
        %><p><%=L("lcl_internal_error")%></p><%
        Response.End();
      }

      if (bes_key > 0) // Bestaande bestelling. Bij nieuwe bestelling wordt catalogus, groep en item doorgegeven.
      { // Catalogus, groep en item van bestelling opvragen
      	sql = "SELECT DISTINCT bd.ins_discipline_key catalogus"
      	    + "     , isg.bes_srtgroep_key groep"
      	    + "     , isd.bes_srtdeel_key item"
            + "  FROM bes_bestelling_item bi"
            + "     , bes_srtdeel isd"
            + "     , bes_srtgroep isg"
            + "     , bes_discipline bd"
            + " WHERE bi.bes_srtdeel_key = isd.bes_srtdeel_key"
            + "   AND isd.bes_srtgroep_key = isg.bes_srtgroep_key"
            + "   AND isg.ins_discipline_key = bd.ins_discipline_key"
            + "   AND bi.bes_bestelling_key = " + bes_key;
 	      oRs = Oracle.Execute(sql);
        var disc_key = oRs("catalogus").Value;
        var srtgroup_key = oRs("groep").Value;
        var srtdeel_key = oRs("item").Value;
      }

      function isReadonly (oRs)
      {
          // er is dus geen read/write onderscheid op veldniveau
          if (reado) return true;
      }

      // Als we het netjes zouden doen en het zou nuttig zijn, dan zouden we de kenmerkautorisatie
      // ook op deze manier doen: met welke rechten mag ik wat zien. Maar dat laten we eerst maar hoe het was
      //// Wat mag ik op  basis van mijn autorisatie (potentieel) zien, bepaal mijn rolcode-masker
      //var myreadrolcode = 0 + (this_bes.authparams.readman ? 1 : 0)
      //                      + (this_bes.authparams.readuse ? 2 : 0)
      //                      + (userhasORDSUP? 4 : 0);

      var has_disc = (disc_key == -1 || disc_key == "" ? false : true); // Kan disc_key ook een string met bes_srtinstallatie_key s bevatten?
      sql = "SELECT k.bes_kenmerk_key                kenmerk_key"
          + "     , 1                                kenmerk_key_count"
          + "     , sk.bes_srtkenmerk_key            srtkenmerk_key"
          + "     , COALESCE (" + lcl.xsql("k.bes_kenmerk_omschrijving", "k.bes_kenmerk_key")
          + "              ,  " + lcl.xsql("sk.bes_srtkenmerk_omschrijving", "sk.bes_srtkenmerk_key") + ") kenmerk_omschrijving"
          + "     , sk.bes_srtkenmerk_kenmerktype    kenmerk_kenmerktype"
          + "     , sk.fac_kenmerkdomein_key         kenmerkdomein_key"
          + "     , sk.bes_srtkenmerk_lengte         kenmerk_lengte"
          + "     , sk.bes_srtkenmerk_dec            kenmerk_dec"
          + "     , sk.bes_srtkenmerk_nmin           kenmerk_nmin"
          + "     , sk.bes_srtkenmerk_nmax           kenmerk_nmax"
          + "     , sk.bes_srtkenmerk_systeem        kenmerk_systeem"
          + (bes_key > 0
            ? "   , (SELECT MAX(CASE WHEN sk.bes_srtkenmerk_kenmerktype = 'M'"
              + "                    THEN NULL"
              + "                    ELSE v.bes_kenmerkbestell_waarde"
              + "                    END)"
              + "      FROM bes_kenmerkbestell v"
              + "     WHERE v.bes_bestelling_key = " + bes_key
              + "       AND v.bes_kenmerk_key = k.bes_kenmerk_key"
              + "       AND v.bes_kenmerkbestell_verwijder IS NULL)"
            : "   , " +  lcl.xsql("k.bes_kenmerk_default", "k.bes_kenmerk_key")
            ) + "                                    kenmerk_waarde"
          + "     , k.bes_kenmerk_volgnummer         kenmerk_volgnr"
          + "     , k.bes_kenmerk_rolcode            kenmerk_rolcode"
          + "     , " + lcl.xsql("sk.bes_srtkenmerk_dimensie", "sk.bes_srtkenmerk_key") + " kenmerk_dimensie"
          + "     , " + lcl.xsql("k.bes_kenmerk_hint", "k.bes_kenmerk_key") + " kenmerk_hint"
          + "     , " + lcl.xsql("k.bes_kenmerk_default", "k.bes_kenmerk_key") + " kenmerk_default"
          + "     , k.bes_kenmerk_show_expr          kenmerk_show_expr"
          + "     , k.bes_kenmerk_verplicht          kenmerk_verplicht"
          + "     , k.bes_kenmerk_groep              kenmerk_groep"
          + "     , NULL otherpath"
          + "     , k.bes_kenmerk_toonbaar           kenmerk_toonbaar"
          + "     , k.bes_kenmerk_uniek              kenmerk_uniek"
          + "     , k.bes_kenmerk_regexp             kenmerk_regexp"
          + "     , k.fac_functie_key"
          + " FROM bes_srtkenmerk sk"
          + "    , bes_kenmerk k"
          + (kenmerktype == 'I'
            ? " WHERE (" + (has_disc ? "k.bes_srtinstallatie_key = " + disc_key + " AND " : "") + "k.bes_kenmerk_niveau LIKE 'D'"
              + "   OR k.bes_srtinstallatie_key = " + srtgroup_key + " AND k.bes_kenmerk_niveau LIKE 'G'"
              + "   OR k.bes_srtinstallatie_key = " + srtdeel_key + " AND k.bes_kenmerk_niveau LIKE 'S')"
            : " WHERE " + (has_disc ? "k.bes_srtinstallatie_key IN (" + disc_key + ")" : "(1=1)") )
          + (bestelopdracht
            ? " AND BITAND(k.bes_kenmerk_inlijst, 4) = 4"
            : "")
          + "  AND k.bes_kenmerk_verwijder IS NULL"
          + "  AND k.bes_srtkenmerk_key = sk.bes_srtkenmerk_key"
          + "  AND sk.bes_srtkenmerk_verwijder IS NULL"
          + "  AND k.bes_kenmerk_type = " + safe.quoted_sql(kenmerktype)
          + (!userhasORDSUP? " AND BITAND(k.bes_kenmerk_rolcode, 7) <> 4 " : "")  // het ordsup-bit moet niet als enige (4, 100) gezet zijn
          + " ORDER BY k.bes_kenmerk_volgnummer"
          + "        , UPPER( COALESCE (" + lcl.xsql("k.bes_kenmerk_omschrijving", "k.bes_kenmerk_key")
          + "                        ,  " + lcl.xsql("sk.bes_srtkenmerk_omschrijving", "sk.bes_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,
                  "BES",
                  bes_key,
                  {
                    kenmerk_search: advanced,
                    fnIsReadonly: isReadonly,
                    reado: reado,
                    mobile: params.mobile,
                    prs_key: params.prs_key,
                    hideVervallen: bes_key<0,
                    parentKey: bes_key,
                    defaults: params.defaults,
                    hasfilter: hasfilter
                  }
                 );
} %>
