<%@ language = "JavaScript" %>
<% /*
     $Revision$
     $Id$

    File:        pda/mld_list.asp
    Description: Toont een beknopte meldingenlijst voor op de pda, dat zijn de aan mij
                 geautoriseerde actieve meldingen op de plaats waar ik ben plus die zonder plaatsgegevens
    Parameters:  -
    Context:     -

    Note:        Gestripte versie van mld/mld_list.inc

*/
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/discx3d.inc" -->
<!-- #include file="./resultset_table.inc" -->
<!-- #include file="../Shared/getkenmerksql.inc" -->
<!-- #include file="./mobile.inc" -->
<!-- #include file="./iface.inc" -->
<!-- #include file="../mld/mld.inc" -->

<%
perform=false; // ???? JGL: MLD.INC gebruikt deze illegaal globaal TODO!
frontend=false;

var ruimte_key = getQParamInt("ruimte_key", -1);
var res_ruimte_key = getQParamInt("res_ruimte_key", -1);
var ins_key = getQParamInt("ins_key", -1);
var self = getQParamInt("self", -1);
var status = getQParamIntArray("status", []);

var locatie_key = getQParamInt("locatie_key", user.alg_locatie_key({withcurrent:true})); // Locatie
var gebouw_key = getQParamInt("gebouw_key", user.alg_gebouw_key({withcurrent:true})); // Gebouw, kan -1 zijn, dan niet gebruiken
var verdieping_key = getQParamInt("verdieping_key", user.alg_verdieping_key({withcurrent:true}));
var qrc = getQParamInt("qrc", 0) != 0;

var grp_sel = getQParam("grp", "");

var subject = L("lcl_mobile_meldingen");
var ruimteKeyArr = [];

// Reserveerbare ruimte: bepaal de alg_ruimte(s) en omschrijving
if (res_ruimte_key > -1 && ruimte_key == -1)
{
  var sql = "SELECT res_ruimte_nr plaats "
          + "  FROM res_ruimte"
          + " WHERE res_ruimte_key = " + res_ruimte_key
  var oRs = Oracle.Execute(sql);
  subject += " " + oRs("plaats").Value;

  var sql = "SELECT alg_ruimte_key "
          + "  FROM res_alg_ruimte rag"
          + " WHERE rag.res_ruimte_key = " + res_ruimte_key
          + " AND rag.res_alg_ruimte_verwijder IS NULL";
  var oRs = Oracle.Execute(sql);
  while (!oRs.eof) {
    ruimte_key = oRs("alg_ruimte_key").value;  // pak er maar eentje, meestal is het er maar een
    ruimteKeyArr.push(oRs("alg_ruimte_key").value);
    oRs.MoveNext();
  }
}
// Gewone ruimte: bepaal de omschrijving
if (ruimte_key > -1 && res_ruimte_key == -1)
{
  var sql = "SELECT aog.alg_gebouw_code || '-' || aog.alg_verdieping_code || '-' || aog.alg_ruimte_nr plaats "
          + "  FROM alg_v_onroerendgoed_gegevens aog"
          + " WHERE aog.alg_ruimte_key = " + ruimte_key;
  var oRs = Oracle.Execute(sql);

  subject += " " + oRs("plaats").Value;
}
// Object: bepaal de omschrijving
if (ins_key > -1)
{
  var sql = " SELECT ins_deel_omschrijving"
          + "   FROM ins_deel id"
          + "  WHERE id.ins_deel_key = " + ins_key;
  var oRs = Oracle.Execute(sql);
  subject += " " + oRs("ins_deel_omschrijving").Value;
}

// Wat zijn de criteria voor de meldingslijst?
// Standaard lopende meldingen (0,2,3,4,7)
var urole  = getQParamSafe("urole", "bo");
var params = { urole: urole };

// Self overruled de setting S("mld_restrict_mobile_to_me").
if (self > -1)
{
  if (self == 0 || ruimte_key > -1 || ins_key > -1)
  { // De actieve meldingen binnen scope (impliceert status 4|7).
    if (status.length > 0)
    { // Er is/zijn (een) status(sen) meegegeven.
      if (status.join(",").indexOf("0") >= 0) params.mldstpen = true; // Status "Pending(0)".
      if (status.join(",").indexOf("2") >= 0) params.mldstnew = true; // Status "Ingevoerd(2)".
      if (status.join(",").indexOf("3") >= 0) params.mldsting = true; // Status "Ingezien(3)".
      if (status.join(",").indexOf("4") >= 0) params.mldstacc = true; // Status "Geaccepteerd(4)".
      if (status.join(",").indexOf("7") >= 0) params.mldstuit = true; // Status "Uitgegeven(7)".
    }
    else
    {
      params.mldstacc = true; // Status "Geaccepteerd(4)".
      params.mldstuit = true; // Status "Uitgegeven(7)".
    }
  }
  else
  { // De actieve meldingen van mij (impliceert status 4|7).
    params.behandel_key = user_key; // De meldingen waarvan ik de behandelaar ben.
    params.mldstacc = true; // Status "Geaccepteerd(4)".
    params.mldstuit = true; // Status "Uitgegeven(7)".
  }
}
else if (S("mld_restrict_mobile_to_me") == 1 && ruimte_key == -1 && ins_key == -1)
{ // Alleen die actieve meldingen waarvan ik de behandelaar ben binnen scope.
  // Dit is goed en logisch en handig voor de handymen.
  // In hun actielijst, maar als ik de meldingen op een ruimte/object wil zien,
  // vind ik (PF) dat niet logisch. Daarom: alleen als ik geen context meekreeg.
  params.behandel_key = user_key;
  params.mldstacc = true; // Status "Geaccepteerd(4)".
  params.mldstuit = true; // Status "Uitgegeven(7)".
}
else
{ // De meldingen binnen scope (standaard lopende meldingen (0,2,3,4,7)).
  params.mldstpen = true; // Status "Pending(0)".
  params.mldstnew = true; // Status "Ingevoerd(2)".
  params.mldsting = true; // Status "Ingezien(3)".
  params.mldstacc = true; // Status "Geaccepteerd(4)".
  params.mldstuit = true; // Status "Uitgegeven(7)".
}

autfunction = ["WEB_MLDBOF", "WEB_MLDBO2"];
// De functie checkAutorisation(autfunction) geeft een Response.End indien er geen autorisatie voor autfunction wordt gevonden
var authparams = user.checkAutorisation(autfunction);
%>
<html>
  <head>
    <% FCLTMHeader.Generate({}); %>
  </head>
  <body>
<%
    var sqln = "SELECT m.mld_melding_key"
             + "     , m.mld_melding_einddatum"
             + "     , mld_melding_status"
             + "     , mld_melding_spoed"
             + "     , mld_melding_omschrijving"
             + "     , v.alg_gebouw_code ||"
               + "     NVL2(v.alg_verdieping_code, '-' || v.alg_verdieping_code, '') ||"
               + "     NVL2(v.alg_ruimte_nr, '-' || v.alg_ruimte_nr, '') ||"
               + "     NVL2(v.alg_terreinsector_code, '-' || v.alg_terreinsector_code, '') plaatsmelding"
             + "     , CASE "
               + "     WHEN COALESCE(sd.ins_srtdiscipline_prefix, '@') = '@'"
               + "     THEN ''"
               + "     ELSE sd.ins_srtdiscipline_prefix END ins_srtdiscipline_prefix"
             + "     , " + lcl.xsqla('md.ins_discipline_omschrijving', 'md.ins_discipline_key')
             + "     , " + lcl.xsqla('std.mld_stdmelding_omschrijving', 'std.mld_stdmelding_key');

    // Voeg aan de sql het FROM en WHERE gedeelte toe
    params.track_mldnew = false; // fac_tracking op MLDNEW niet gebruiken
    sqln += mld.getfromwherelist_sql(autfunction, params);

    sqln += " AND mld_melding_parentkey IS NULL";  // child-meldingen hoef ik mobiel niet te zien.

    if (ruimte_key > -1 && ruimteKeyArr.length <= 1)
    {
      sqln += " AND (l.alg_locatie_key IS NULL OR v.alg_ruimte_key = " + ruimte_key + ")";  // PF: ik denk dat plaatsloze meldingen niet getoond hoeven worden als ruimtekey is gegeven, maar het staat er vast niet voor niks
    }
    if (ruimteKeyArr.length > 1)
    {
      sqln += " AND v.alg_ruimte_key IN (" + ruimteKeyArr.join(',') + ")";
    }
    if (ins_key > -1)
    {
      sqln += " AND m.mld_melding_key IN"
            + " (SELECT mld_melding_key FROM mld_melding_object WHERE mld_melding_object_verwijder IS NULL AND ins_deel_key = " + ins_key + ")";
    }
    if (ins_key == -1 && ruimte_key == -1 && ruimteKeyArr.length == 0) { // die lagere keys zijn sterker, ook als ik evt niet ter plaatse ben
        if (gebouw_key > -1)
        {
          sqln += " AND (l.alg_locatie_key IS NULL OR v.alg_gebouw_key = " + gebouw_key + ")";
        }
        if (locatie_key > -1)
        {
          sqln += " AND (l.alg_locatie_key IS NULL OR l.alg_locatie_key = " + locatie_key + ")";
        }
        if (verdieping_key > -1)
        {
          sqln += " AND (l.alg_locatie_key IS NULL OR v.alg_verdieping_key = " + verdieping_key + ")";
        }
    }
    // apply 3D authorization to the locations and to the organisations (both ALG and PRS)
    sqln = "("
         + discx3d (sqln,
                    "md.ins_discipline_key",
                    "di.alg_regio_key",
                    "l.alg_district_key",
                    "l.alg_locatie_key",
                    "v.alg_gebouw_key",
                    "v.alg_verdieping_key",
                    "v.alg_ruimte_key",
                    "b.prs_bedrijf_key",
                    "b.prs_afdeling_key",
                    autfunction[0],
                    "",
                    2)
         + ") UNION ("
         + discx3d (sqln,
                    "md.ins_discipline_key",
                    "di.alg_regio_key",
                    "l.alg_district_key",
                    "l.alg_locatie_key",
                    "v.alg_gebouw_key",
                    "v.alg_verdieping_key",
                    "v.alg_ruimte_key",
                    "b.prs_bedrijf_key",
                    "b.prs_afdeling_key",
                    autfunction[1],
                    "",
                    2)
         + ")";

    // Alleen groepering toepassen indien er 3 of meer vakgroepen zijn en meer dan 10 meldingen.
    // Bepaal aantal vakgroepen en aantal meldingen.
    var cnt_vakgr = 0; // Aantal vakgroepen.
    var cnt_mld = 0; // Aantal meldingen.
    var show_vakgroepen = false;
    // PF: Dit is wel een hele dure query (net zo als de echte) die je wilt voorkomen wanneer het kan zeg!
    //     Bijvoorbeeld niet als ik specifieke parameters gebruik, maar liever nog minder vaak
    if (ruimte_key == -1 && ins_key == 1) {
        var sqln_count = "SELECT COUNT(ins_discipline_omschrijving) nr_vakgr"
                       + "     , ins_discipline_omschrijving vakgroep"
                       + "  FROM (" + sqln + ") rec2"
                       + " GROUP BY ins_discipline_omschrijving";
        var oRs = Oracle.Execute(sqln_count);
        while (!oRs.eof)
        {
          cnt_vakgr++;
          cnt_mld += oRs("nr_vakgr").Value;
          oRs.MoveNext();
        }
        if (cnt_vakgr > 2 && cnt_mld > 10)
          show_vakgroepen = true;
    }

    // PF: lijkt me ook niet altijd goed: wat is nou mogelijk zinvol?
    sqln = "SELECT * FROM (" + sqln + ") rec2"
         + (grp_sel == ""
           ? ""
           : " WHERE ins_discipline_omschrijving = " + safe.quoted_sql(grp_sel))
         + " ORDER BY"
         + (grp_sel == ""
           ? " ins_discipline_omschrijving,"
           : "")  // is dus al vertaald
         + (S("mld_bo_sort_descending") == 0
           ? " mld_melding_einddatum"
           : " mld_melding_key DESC");   //ORDER BY mld_melding_key

    function fnUrgentie(oRs)
    {
      var displ = "";
      switch (oRs("mld_melding_spoed").Value)
      {
        case 1 : displ = L("lcl_mld_urg_kritiek1"); break;
        case 2:  displ = L("lcl_mld_urg_hoog1"); break;
        //case 3:  displ = L("lcl_mld_urg_normaal1"); break; // Heeft geen plaatje.
        case 4:  displ = L("lcl_mld_urg_laag1"); break;
        case 5:  displ = L("lcl_mld_urg_hold1"); break;
      }
      displ = (oRs("mld_melding_status").Value == 2? L("lcl_new") : "") + displ;
      return displ;
    }

    function fncolLink(oRs)
    {
      var url = "";
      if ((grp_sel == "") && show_vakgroepen)
      {
        url = "../pda/mld_list.asp?grp=" + safe.url(oRs("ins_discipline_omschrijving").Value)
            + (self > -1? "&self=" + self : "")
            + (status.length > 0? "&status=" + status.join(",") : "")
            + (ruimte_key > -1? "&ruimte_key=" + ruimte_key : "")
            + (ins_key > -1? "&ins_key=" + ins_key : "");
      }
      else
      {
        url = "../pda/melding.asp?mld_key=" + oRs("mld_melding_key").Value;
      }
      return url;
    };

    function fncolGroup(oRs)
    {
      return safe.html(oRs("ins_discipline_omschrijving").Value);
    };

    function fncolHeader(oRs)
    {
      return (oRs("ins_srtdiscipline_prefix").Value || "") + oRs("mld_melding_key").Value;
    };

    function fncolSubHeader(oRs)
    {
      return "<div class='listbodykop'>" +(oRs("plaatsmelding").Value? safe.html(oRs("plaatsmelding").Value) + "<br>" : "")
           + L("lcl_mld_enddate") + ": " + toDateTimeString(oRs("mld_melding_einddatum").Value, false, false, true) + "</div>"
           + (oRs("mld_melding_omschrijving").Value? "<div class='listbodytext'>" + safe.html(shorttxt(oRs("mld_melding_omschrijving").Value, S("rs_mobile_maxchar"))) + "</div>" : "");
    };

    function fncolStatus(oRs)
    {
      var mldStatus = parseInt(oRs("mld_melding_status").Value);
      var mld_status = mld.getmldstatustext(mldStatus);

      return mld_status;
    }

    PAGE_START();
    HEADER({title: subject,
            back: !qrc,
            addaction: "../pda/melding.asp?mld_key=-1" + (ins_key > -1? "&ins_key=" + ins_key : "") + (ruimte_key > -1? "&ruimte_key=" + ruimte_key : "")});
    CONTENT_START();

    var rst = new ResultsetTable({sql: sqln,
                                  keyColumn: "mld_melding_key",
                                  groupColumn: (grp_sel == ""? fncolGroup : null),
                                  groupSelect: show_vakgroepen? grp_sel : null,
                                  linkColumn: fncolLink,
                                  headerColumn: fncolHeader,
                                  detailColumn: "mld_stdmelding_omschrijving",
                                  asideColumn: fnUrgentie,
                                  subheaderColumn: fncolSubHeader,
                                  ID: "complainstable",
                                  showAll: true
                                  });

    var cnt = rst.processResultset();

    CONTENT_END();
    FOOTER();
    PAGE_END();
%>
  </body>
</html>
