<% /*
     $Revision$
     $Id$

    File:               SLE/slecil_list.inc
    Description:        Show an overview of sleutels and cilinders in list-form.
                        which meets with the given requirements
                        User can select on or more lines and edit/delete them
    Parameters:
        ins_srtdeel_key ins_srtdeel_key
        outputmode      behave in an output mode, print to 0 = screen, 1 = printer, 2 = excel, etc.
        showall         show all objects which meets with the given requirements
        loc_key         search for objects with the given location key
        bld_key         search for objects with the given building key
        flr_key         search for objects with the given floor key
        room_key        search for objects with the given room key
        dep_key         search for objects with the given department key
        persoon_key     search for objects with the given persoon key
    Context:            - SLE/sle_list.js (Search action from bes_search.asp form)
                        - Self (when printing)
    Note:

*/ %>

<!-- #include file="../Shared/json2.js" -->
<!-- #include file="../Shared/resultset_table_v2.inc" -->
<!-- #include file="../Shared/getkenmerksql.inc" -->
<!-- #include file="../Shared/discx3d.inc" -->
<!-- #include file="../INS/ins.inc" -->
<!-- #include file="./sle.inc" -->

<%
FCLTHeader.Requires({ plugins:["jQuery"],
                      js: ["../sle/slecil_list.js"]
                    });

function slecil_list (params)
{
  var buttons = [];

  var ins_srtdeel_key = params.ins_srtdeel_key;
  var loc_key = params.loc_key;
  var bld_key = params.bld_key;
  var terr_key = params.terr_key;
  var flr_key = params.flr_key;
  var room_key = params.room_key;
  var insgroep_key = params.insgroep_key;
  var dep_key = params.dep_key;
  var prs_key = params.prs_key;
  var deel = params.deel;

  sql = "SELECT s.ins_srtgroep_key"
      + " FROM ins_v_aanwezigsrtdeel s"
      + " WHERE s.ins_srtdeel_key = " + ins_srtdeel_key;
  oRs = Oracle.Execute(sql);
  var sleType = (oRs("ins_srtgroep_key").value == S("sle_ins_srt_groep_key")? "S" : "C");

  // De functie checkAutorisation(autfunction) geeft een Response.End indien er geen autorisatie voor autfunction wordt gevonden
  var authparams = user.checkAutorisation(sleType == "S"? ["WEB_SLEBOF", "WEB_SLEFOF"] : ["WEB_SLEBOF"]);

  // WEB_SLEBOF: PRSread/PRSwrite: Niet van belang.
  // WEB_SLEBOF: ALGread: Hiermee kan ik sleutels/cilinders zien (met eventuale autorisatie op ruimte).
  // WEB_SLEBOF: ALGwrite: Hiermee kan ik cilinders koppelen aan/van een ruimte en kan ik sleutels en cilinders aan elkaar koppelen.
  var authparamsSLEBOF = user.checkAutorisation("WEB_SLEBOF", true);
  // WEB_SLEFOF: PRSread: NIET VAN BELANG (als iemand mijn sleutel (FOF-ALG-scope) heeft, en ik heb FOF-rechten, dan mag ik ook zien Wie)
  // WEB_SLEFOF: PRSwrite: Hiermee kan ik sleutels uitgeven aan een persoon binnen de PRS-scope
  // WEB_SLEFOF: ALGread: Hiermee kan ik sleutels zien (met eventuele autorisatie op ruimte).
  // WEB_SLEFOF: ALGwrite: Sleutels die vallen in deze scope mag ik uitgeven/innemen
  var authparamsSLEFOF = user.checkAutorisation("WEB_SLEFOF", true);
%>

  <html>
    <head>
<%
      FCLTHeader.Generate({ outputmode: params.outputmode });
%>

    </head>
    <body id="listbody">

<%    // =======================================================
      // All header information been emitted. Now start building
      // the SQL-queries to do actual data retrieval
      // =======================================================


      if (sleType == "S")
      { // Sleutels
        // WEB_SLEFOF: ALGread: Kan eigen sleutels zien die ik uitgegeven heb of die nog op mijn bureau liggen (met scope op eigen ruimte (alg_ruimte_key/alg_ruimte_key_org))
        // Niet uitgegeven sleutels
        var sqlSleutels = " SELECT dl.ins_deel_key"
                        + "      , s.ins_srtdeel_omschrijving"
                        + "      , s.ins_srtdeel_code"
                        + "      , dl.ins_deel_omschrijving"
                        + "      , dl.ins_alg_ruimte_key_org"
                        + "      , " + safe.quoted_sql("[" + L("lcl_sle_available") + "]") + " pname"
                        + "      , dl.ins_deel_actief"
                        + " FROM ins_v_aanwezigdeel dl"
                        + "    , ins_v_aanwezigsrtdeel s"
                        + " WHERE s.ins_srtdeel_key = dl.ins_srtdeel_key"
                        + "   AND s.ins_srtgroep_key = " + S("sle_ins_srt_groep_key")
                        + "   AND dl.ins_srtdeel_key = " + ins_srtdeel_key
                        + " AND dl.ins_alg_ruimte_type = 'R'"
                        + " AND dl.ins_alg_ruimte_key_org IS NULL"
                        + " AND dl.ins_alg_ruimte_type_org IS NULL"
                        + (authparamsSLEFOF&&authparamsSLEFOF.ALGreadlevel > -1
                          ? " AND EXISTS"
                            + " (SELECT alg_ruimte_key FROM fac_v_my_rooms"
                            + " WHERE prs_perslid_key = " + user_key
                            + " AND niveau = " + authparamsSLEFOF.ALGreadlevel
                            + " AND alg_ruimte_key = dl.ins_alg_ruimte_key"
                            + ")" // Er is een scope-beperking van kracht
                          : "");
        // Uitgegeven sleutels
        sqlSleutels += " UNION "
                     + " SELECT dl.ins_deel_key"
                     + "      , s.ins_srtdeel_omschrijving"
                     + "      , s.ins_srtdeel_code"
                     + "      , dl.ins_deel_omschrijving"
                     + "      , dl.ins_alg_ruimte_key_org"
                     + ", CASE WHEN dl.ins_alg_ruimte_key_org IS NULL"
                     + "     THEN " + safe.quoted_sql("[" + L("lcl_sle_available") + "]")
                     + "     ELSE p.prs_perslid_naam_full"
                     + "     END pname"
                     + "    , dl.ins_deel_actief"
                     + " FROM ins_v_aanwezigdeel dl"
                     + "    , ins_v_aanwezigsrtdeel s"
                     + "    , prs_v_perslid_fullnames_all p"
                     + "    , prs_v_aanwezigperslid p1"
                     + " WHERE s.ins_srtdeel_key = dl.ins_srtdeel_key"
                     + "   AND s.ins_srtgroep_key = " + S("sle_ins_srt_groep_key")
                     + "   AND dl.ins_srtdeel_key = " + ins_srtdeel_key
                     + " AND dl.ins_alg_ruimte_type_org = 'R'"
                     + " AND dl.ins_alg_ruimte_key = p.prs_perslid_key"
                     + " AND p.prs_perslid_key = p1.prs_perslid_key"
                     + (authparamsSLEFOF&&authparamsSLEFOF.ALGreadlevel > -1
                       ? " AND EXISTS"
                         + " (SELECT alg_ruimte_key FROM fac_v_my_rooms"
                         + " WHERE prs_perslid_key = " + user_key
                         + " AND niveau = " + authparamsSLEFOF.ALGreadlevel
                         + " AND alg_ruimte_key = dl.ins_alg_ruimte_key_org"
                         + ")" // Er is een scope-beperking van kracht
                       : "");

        // WEB_SLEBOF: ALGread: Kan sleutels zien die passen op mijn scope van ruimten of die nog op mij bureau liggen (alg_ruimte_key/alg_ruimte_key_org)
        // Dus kijken naar de scope van de cilinders. Welke sleutel passen daarop.
        sqlBasis = " SELECT dl2.ins_deel_key"
                 + "      , s2.ins_srtdeel_omschrijving"
                 + "      , s2.ins_srtdeel_code"
                 + "      , dl2.ins_deel_omschrijving"
                 + "      , dl2.ins_alg_ruimte_key_org"
                 + "      , CASE WHEN dl2.ins_alg_ruimte_key_org IS NULL"
                   + "           THEN " + safe.quoted_sql("[" + L("lcl_sle_available") + "]")
                   + "           ELSE p.prs_perslid_naam_full"
                   + "           END pname"
                 + "      , dl2.ins_deel_actief"
                 + " FROM ins_v_aanwezigdeel dl1"
                 + "    , ins_v_aanwezigdeel dl2"
                 + "    , ins_v_aanwezigsrtdeel s1"
                 + "    , ins_v_aanwezigsrtdeel s2"
                 + "    , ins_srtdeel_srtdeel ss"
                 + "    , prs_v_perslid_fullnames_all p"
                 + "    , prs_v_aanwezigperslid p1"
                 + " WHERE s1.ins_srtdeel_key = dl1.ins_srtdeel_key"
                 + "   AND s2.ins_srtdeel_key = dl2.ins_srtdeel_key"
                 + "   AND s1.ins_srtgroep_key = " + S("cil_ins_srt_groep_key")
                 + "   AND s2.ins_srtgroep_key = " + S("sle_ins_srt_groep_key")
                 + "   AND ss.ins_srtdeel_key_1 = s1.ins_srtdeel_key" // cillinder
                 + "   AND ss.ins_srtdeel_key_2 = s2.ins_srtdeel_key" // Sleutel
                 + "   AND dl2.ins_srtdeel_key = " + ins_srtdeel_key;

        // Sleutels die passen op niet uitgegeven cilinders
        // Gedeelte: AND ((dl2.ins_alg_ruimte_key = p.prs_perslid_key AND p.prs_perslid_key = p1.prs_perslid_key) OR dl2.ins_alg_ruimte_key IS NULL)
        // gesplits t.b.v. performance
        sqlSleutels += " UNION "
                    + sqlBasis
                    + " AND dl1.ins_alg_ruimte_type_org IS NULL"
                    + " AND dl1.ins_alg_ruimte_type = 'R'"
                    // Gesplitst.
                    + " AND dl2.ins_alg_ruimte_key = p.prs_perslid_key"
                    + " AND p.prs_perslid_key = p1.prs_perslid_key"
                    + (authparamsSLEBOF&&authparamsSLEBOF.ALGreadlevel > -1
                      ? " AND EXISTS"
                        + " (SELECT alg_ruimte_key FROM fac_v_my_rooms"
                        + " WHERE prs_perslid_key = " + user_key
                        + " AND niveau = " + authparamsSLEBOF.ALGreadlevel
                        + " AND alg_ruimte_key = dl1.ins_alg_ruimte_key"
                        + ")" // Er is een scope-beperking van kracht
                      : "")
                    + " UNION "
                    + sqlBasis
                    + " AND dl1.ins_alg_ruimte_type_org IS NULL"
                    + " AND dl1.ins_alg_ruimte_type = 'R'"
                    // Gesplitst.
                    + " AND dl2.ins_alg_ruimte_key IS NULL"
                    + (authparamsSLEBOF&&authparamsSLEBOF.ALGreadlevel > -1
                      ? " AND EXISTS"
                        + " (SELECT alg_ruimte_key FROM fac_v_my_rooms"
                        + " WHERE prs_perslid_key = " + user_key
                        + " AND niveau = " + authparamsSLEBOF.ALGreadlevel
                        + " AND alg_ruimte_key = dl1.ins_alg_ruimte_key"
                        + ")" // Er is een scope-beperking van kracht
                      : "");

        // Sleutels die passen op uitgegeven cilinders
        sqlSleutels += " UNION "
                     + sqlBasis
                     + " AND dl1.ins_alg_ruimte_type_org = 'R'"
                     + " AND dl2.ins_alg_ruimte_key = p.prs_perslid_key"
                     + " AND p.prs_perslid_key = p1.prs_perslid_key"
                     + (authparamsSLEBOF&&authparamsSLEBOF.ALGreadlevel > -1
                       ? " AND EXISTS"
                         + " (SELECT alg_ruimte_key FROM fac_v_my_rooms"
                         + " WHERE prs_perslid_key = " + user_key
                         + " AND niveau = " + authparamsSLEBOF.ALGreadlevel
                         + " AND alg_ruimte_key = dl1.ins_alg_ruimte_key_org"
                         + ")" // Er is een scope-beperking van kracht
                       : "");

        var sql = sqlSleutels
                //+ " UNION ALL "
                //+ sqlOwner
                + " ORDER BY 2, 3";
      }
      else if (authparamsSLEBOF)
      { // Cilinders
        // Cilinders zijn aan een ruimte of terrein gekoppeld. Cilinders die ergens anders aan zijn gekoppeld niet weergeven

        // WEB_SLEBOF: ALGread: Kan cilinders zien die in de deur zitten van mijn scope van ruimten of die nog op mij bureau liggen (alg_ruimte_key/alg_ruimte_key_org)
        // Uitgegeven en niet uitgegeven cilinders in een hek van een terrein
        var sqlCilinders = "SELECT dl.ins_deel_key"
                         + "     , s1.ins_srtdeel_key"
                         + "     , s1.ins_srtdeel_omschrijving"
                         + "     , s1.ins_srtdeel_code"
                         + "     , dl.ins_deel_omschrijving"
                         + "     , CASE WHEN dl.ins_alg_ruimte_key_org IS NULL"
                           + "     THEN " + safe.quoted_sql("[" + L("lcl_sle_available") + "]")
                           + "     ELSE l.alg_locatie_code || ' - ' || t.alg_terreinsector_omschrijving"
                           + "     END loc"
                         + "     , dl.ins_alg_ruimte_key_org"
                         + "     , dl.ins_deel_actief"
                         + " FROM alg_v_aanweziglocatie l"
                         + "    , ins_v_aanwezigdeel dl"
                         + "    , ins_srtdeel s1"
                         + "    , alg_terreinsector t"
                         + " WHERE s1.ins_srtdeel_key = dl.ins_srtdeel_key"
                         + " AND s1.ins_srtgroep_key = " + S("cil_ins_srt_groep_key")
                         + " AND l.alg_locatie_key = t.alg_locatie_key"
                         + " AND s1.ins_srtdeel_key = " + ins_srtdeel_key
                         + " AND dl.ins_alg_ruimte_key = t.alg_terreinsector_key"
                         + " AND dl.ins_alg_ruimte_type = 'T'"
                         + (authparamsSLEBOF.ALGreadlevel > -1
                           ? " AND EXISTS"
                             + " (SELECT alg_locatie_key FROM fac_v_my_locations"
                             + " WHERE prs_perslid_key = " + user_key
                             + "   AND alg_locatie_key = t.alg_locatie_key"
                             + " AND niveau = " + authparamsSLEBOF.ALGreadlevel
                             + ")" // Er is een scope-beperking van kracht
                           : "");

        var sqlBasis = " SELECT dl.ins_deel_key"
                     + "      , s1.ins_srtdeel_key"
                     + "      , s1.ins_srtdeel_omschrijving"
                     + "      , s1.ins_srtdeel_code"
                     + "      , dl.ins_deel_omschrijving "
                     + "      , CASE WHEN dl.ins_alg_ruimte_key_org IS NULL"
                       + "           THEN " + safe.quoted_sql("[" + L("lcl_sle_available") + "]")
                       + "           ELSE r.alg_locatie_code || ' - ' || r.alg_ruimte_aanduiding || ' (' || " + lcl.xsql("r.alg_srtruimte_omschrijving", "r.alg_srtruimte_key") + " || ')'"
                       + "           END loc"
                     + "     , dl.ins_alg_ruimte_key_org"
                     + "     , dl.ins_deel_actief"
                     + " FROM ins_v_aanwezigdeel dl"
                     + "    , ins_v_aanwezigsrtdeel s1"
                     + "    , alg_v_ruimte_gegevens r"
                     + " WHERE s1.ins_srtdeel_key = dl.ins_srtdeel_key"
                     + " AND s1.ins_srtgroep_key = " + S("cil_ins_srt_groep_key")
                     + " AND s1.ins_srtdeel_key = " + ins_srtdeel_key
                     + " AND dl.ins_alg_ruimte_key = r.alg_ruimte_key";

        // Uitgegeven cilinders in een deur van een ruimte binnen mijn scope en niet uitgegeven cilinders op mijn bureau
        sqlCilinders += " UNION "
                      + sqlBasis
                      + " AND dl.ins_alg_ruimte_type = 'R'"
                      + " AND dl.ins_alg_ruimte_key = r.alg_ruimte_key"
                      + (authparamsSLEBOF&&authparamsSLEBOF.ALGreadlevel > -1
                        ? " AND EXISTS"
                          + " (SELECT alg_ruimte_key FROM fac_v_my_rooms"
                          + " WHERE prs_perslid_key = " + user_key
                          + " AND niveau = " + authparamsSLEBOF.ALGreadlevel
                          + " AND alg_ruimte_key = dl.ins_alg_ruimte_key"
                          + ")" // Er is een scope-beperking van kracht
                        : "");

        // Uitgegeven cilinders die ik uitgegeven heb wil ik ook zien (Mijn eigen cilinders)
        sqlCilinders += " UNION "
                      + sqlBasis
                      + " AND dl.ins_alg_ruimte_type_org = 'R'"
                      + (authparamsSLEBOF&&authparamsSLEBOF.ALGreadlevel > -1
                        ? " AND EXISTS"
                          + " (SELECT alg_ruimte_key FROM fac_v_my_rooms"
                          + " WHERE prs_perslid_key = " + user_key
                          + " AND niveau = " + authparamsSLEBOF.ALGreadlevel
                          + " AND alg_ruimte_key = dl.ins_alg_ruimte_key_org"
                          + ")" // Er is een scope-beperking van kracht
                        : "");

        var sql = sqlCilinders
                + " ORDER BY 4, 3";
      }


      /***********************************************
       * Callback functies ResultsetTable for FO en BO
       **********************************************/

      function fnrowActionEnabler(oRs)
      {
        var this_sle = sle.func_enabled_slecil(oRs("ins_deel_key").value);
        var eUitgeven = this_sle.canUitgeven;
        var eInnemen = this_sle.canInnemen;
        var eEdit = this_sle.canBOWrite;
        var eDelete = this_sle.canBOWrite;

        var data = {eUitgeven: eUitgeven, eInnemen: eInnemen, eEdit: eEdit, eDelete: eDelete};
        return data;
      }

      function fncolOmschrijving(oRs)
      { // Als omschrijving met de srtdeel_code begint dan alleen omschrijving zonder srtdeel_code tonen (alleen volgnummer)
        var srtdeel_code = oRs("ins_srtdeel_code").value;
        var ins_deel_oms = oRs("ins_deel_omschrijving").value;
        var indexof = ins_deel_oms.toUpperCase().indexOf(srtdeel_code.toUpperCase());

        if (indexof == 0)
          return ins_deel_oms.substr(srtdeel_code.length);
        else
          return ins_deel_oms;
      }

      function fncolActief(oRs)
      {
        return (oRs("ins_deel_actief").Value == 1 ? L("lcl_ins_active") : L("lcl_ins_not_active"));
      }

      var addurl = "appl/ins/ins_deel.asp?urole=bo"
                 + "&sort=" + ins_srtdeel_key;
      if (authparamsSLEBOF && authparamsSLEBOF.ALGwritelevel < 9 && authparamsSLEBOF.PRSwritelevel < 9)
      {
        buttons.push({ icon: "page_refresh.png", title: L("lcl_refresh"), action: "FcltMgr.reload()" });
        buttons.push({ icon: "plus.png", title: L("lcl_add"), action: "FcltMgr.openDetail('" + addurl + "', '" + L("lcl_add") + "')" });
      }

      /***************************************************
       * End callback functies ResultsetTable for FO en BO
       **************************************************/
      var rst = new ResultsetTable({ keyColumn: "ins_deel_key",
                                     sql: sql,
                                     ID: "instable",
                                     rowActionEnabler: fnrowActionEnabler,
                                     flexModule: "INS",
                                     flexId: "ins_deel_key",
                                     multiple: true,
                                     filterParams: params,
                                     outputmode: params.outputmode,
                                     title: (sleType == "S"? L("lcl_sle_sleutels") : L("lcl_cil_cilinders")),
                                     showAll: params.showall,
                                     buttons: buttons
                                   });

      // Kolommen
      rst.addColumn(new Column({caption: (sleType == "S"? L("lcl_sleprs_name") : L("lcl_cil_locaties")), content: (sleType == "S"? "pname" : "loc"), hasActions: true}));
      rst.addColumn(new Column({caption: (sleType == "S"? L("lcl_sle_sleutel_omsch") : L("lcl_cil_cilinder_omsch")), content: fncolOmschrijving}));
      rst.addColumn(new Column({caption: L("lcl_ins_active"), content: fncolActief }));

      // Acties
      rst.addAction({ action: "sleEdit", caption: L("lcl_change"), isDefault: true});
      rst.addAction({ action: "sleDelete", caption: L("lcl_delete"), enabler: "eDelete", single: false, multi: !params.tiny, multiOnce: true});
      rst.addAction({ action: "sleCheckOut", caption: (sleType == "S"? L("lcl_sle_uitgifte") : L("lcl_cil_uitgifte")), enabler: "eUitgeven"});
      rst.addAction({ action: "sleCheckIn",  caption: (sleType == "S"? L("lcl_sle_inname") : L("lcl_cil_inname")),   enabler: "eInnemen"});

      var count = rst.processResultset();
%>
    </body>
  </html>
<%
}
%>
