<% /*
     $Revision$
     $Id$

    File:        mld_groep_list.inc
    Description: Definieert de serverside functie mld_groep_list() die een lijst van aantal meldingen/opdrachten toont die
                 voldoen aan de gegeven parameters/criteria, binnen de readautorisaties van de user.
    Parameters:  -
    Context:     -

    Note:        Note gekopieerd van mld_list.inc
                 Dit bestand verzorgt de groeperings variant van de meldinglijst (maninfo)

*/ %>
<!-- #include file="../Shared/discx3d.inc" -->
<!-- #include file="../Shared/json2.js" -->
<!-- #include file="../Shared/status.inc" -->
<!-- #include file="../Shared/resultset_table_v2.inc" -->
<!-- #include file="../Shared/getkenmerksql.inc" -->
<!-- #include file="../Shared/rater.inc" -->
<!-- #include file="mld.inc" -->

<%
FCLTHeader.Requires({plugins:["suggest","jQuery"],
                     js: ["../mld/mld_list.js", "jquery-ui.js"]});

function mld_groep_list (pautfunction, params)
{ // VALIDATE AND PREPARE
  // Als een parameter niet gedefinieerd of null is, dan doet-ie niks
  // anders wordt die verondersteld een zinvolle waarde te hebben
  // NB: -1 is vaak geen zinvolle waarde; null had het dan moeten zijn!

  // Valid and supported parameters are:
  // params.urole         : the usuals two-letter lowercase string
  // params.outputmode    : print to 0 = screen, 1 = printer, 2 = excel, etc.
  // params.showall       : boolean
  // params.perform       : boolean
  // params.mld_key       : key
  // params.opdr_key      : key
  // params.mldstatus_str : String met keys (e.g. "3,4,5")
  // params.opdrstatus_str: String met keys (e.g. "3,4,5")
  // params.caller_key    : key
  // params.comp_key      : key
  // params.org_key       : key
  // params.reg_key       : key
  // params.dist_key      : key
  // params.loc_key       : key
  // params.bld_key       : key
  // params.flr_key       : key
  // params.room_key      : key
  // params.behandel_key  : key
  // params.srtdisc_key   : key
  // params.disc_key_str  : String met keys (e.g. "3,4,5")
  // params.grp_key_str   : String met keys (e.g. "3,4,5")
  // params.stdm_key_str  : String met keys (e.g. "3,4,5")
  // params.kp            : wildcard string
  // params.handler_key   : key
  // params.contact_key   : key
  // params.opdrtype_key  : key
  // params.searchtekst   : wildcard string
  // params.omschr        : wildcard string
  // params.disc_key      : key
  // params.insgroup_key  : key
  // params.ins_srtdeel_key_str: String met keys (e.g. "3,4,5")
  // params.groepering_key: key
  // params.chkAcceptEx   : boolean
  // params.chkRunEx      : boolean
  // params.chkSpoed      : boolean
  // params.chkAfgerond   : boolean
  // params.datefrom      : date
  // params.dateto        : date

  // params.dienst_key    : key
  // cnt_key: contract,
  // params.deel_key      : ins_deel_key

  // Statuses:
  //   params.mldstpen = 1  (0): true | false
  //   params.mldstrej = 1  (1): true | false
  //   params.mldstnew = 1  (2): true | false
  //   params.mldsting = 1  (3): true | false
  //   params.mldstacc = 1  (4): true | false
  //   params.mldstuit = 1  (7): true | false
  //   params.mldstafm = 1  (5): true | false
  //   params.mldstver = 1  (6): true | false
  // afdel =
  // kp = kostenplaats (wildcard)
  //
  // if a parameters has a value of -1, then it is assumed not to be set and to be ignored.

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

  var urole = params.urole;
  var fronto = (urole == "fo");
  var backo = (urole == "bo");
  var minfo = (urole == "mi"); // NOT APPLICABLE?
  var frontend = (urole == "fe" || (!fronto & !backo & !minfo));
  params.minfo = minfo;

  // AUTORISATIES
  // Ik zoek wat zaken van de huidige gebruiker uit, die gevolgen kunnen hebben voor met name de actions
  // Bepaling MLDFOF write rechten, dan kan ik nl. ongeacht de overige rechten ook (iets) toevoegen
  // Autorisatie check is al gedaan in mld_search_list.asp
  if (fronto) {
    var locauthparams = user.checkAutorisation("WEB_MLDFOF", true);
    var mldfof_write = !(locauthparams.PRSwritelevel == 9 && locauthparams.ALGwritelevel==9);
  }
  else {
    var mldfof_write = false;
  }

  //// Dit lijkt me om te kunnen bepalen of ik uberhaupt naar de PRS-autorisatie hoef te kijken
  //var add_prs_restrict = prshasrestrict(pautfunction);


  // Voor resulttable de globalen zetten; zou ng anders moeten.
  var outputmode = params.outputmode; // print to 0 = screen, 1 = printer, 2 = excel, etc.
  var print = (outputmode == 1 || outputmode == 5);
  var excel = (outputmode == 2 || outputmode == 6);
  var showall = params.showall;

  var perform = params.perform;
  var mld_key = params.mld_key;
  var disc_key_str = params.disc_key_str;
  var groepering_key = params.groepering_key;
  var toon_opdr_overz = (groepering_key == 10 || groepering_key == 11 || groepering_key == 17);
%>
  <html>
    <head>
<%
      FCLTHeader.Generate({ outputmode: outputmode });
%>
      <script type="text/javascript">
        // Text strings used by mld_list.js
        var urole = "<%=urole%>";
      </script>
    </head>

    <body id="listbody">
<%
      sqln = "SELECT " + (toon_opdr_overz? "" : "DISTINCT")
           + " m.mld_melding_key mld_key"
           + ", m.mld_melding_satisfaction"
           + (groepering_key == 3
             ? ", m.mld_melding_status"
             : "")
           + (groepering_key == 7
             ? ", (SELECT " + S("prs_kpn_string")
               + " FROM prs_kostenplaats k"
               + " WHERE k.prs_kostenplaats_key = m.prs_kostenplaats_key) kostenplaats"
             : "")
           + (groepering_key == 5
             ? ", (SELECT COUNT(o.mld_opdr_key)"
               + " FROM mld_opdr o"
               + " WHERE o.mld_melding_key = m.mld_melding_key) opdr_key"
             : "")
           + (groepering_key == 4 || groepering_key == 5 || groepering_key == 6 || groepering_key == 13 || groepering_key == 14
             ? ", (SELECT " + lcl.xsqla('sd.ins_srtdiscipline_omschrijving', 'ins_srtdiscipline_key')
               + " FROM ins_srtdiscipline sd"
               + " WHERE sd.ins_srtdiscipline_key = md.ins_srtdiscipline_key) vakgroeptype"
             : "")
           + (groepering_key == 5 || groepering_key == 6 || groepering_key == 13 || groepering_key == 14
             ? ", "+ lcl.xsql('md.ins_discipline_omschrijving', 'md.ins_discipline_key')+" vakgroep"
             : "")
           + (groepering_key == 6
             ? ", (SELECT " + lcl.xsqla('sm.mld_stdmelding_omschrijving','sm.mld_stdmelding_key')
               + " FROM mld_stdmelding sm"
               + " WHERE sm.mld_stdmelding_key = m.mld_stdmelding_key) melding"
             : "")
           + (groepering_key == 9 || groepering_key == 8
             ? ", di.alg_district_upper district"
             : "")
           + ((groepering_key == 9)
             ? ", l.alg_locatie_code locatie"
             : "")
           + (groepering_key == 10
             ? ", o.mld_statusopdr_key"
             : "")
           + (groepering_key == 11
             ? ", (SELECT naam"
               + " FROM mld_v_uitvoerende u"
               + " WHERE u.mld_uitvoerende_key = o.mld_uitvoerende_keys) uitvoerende"
             : "")
           + (groepering_key == 17
             ? ", (SELECT mld_typeopdr_omschrijving"
               + " FROM mld_typeopdr ot"
               + " WHERE ot.mld_typeopdr_key = o.mld_typeopdr_key) opdrachttype"
             : "")
           + (groepering_key == 12
             ? ", COALESCE((SELECT ks.prs_kostensoort_oms"
               + "            FROM prs_kostensoort ks"
               + "               , mld_stdmelding sm"
               + "           WHERE sm.mld_stdmelding_key = m.mld_stdmelding_key"
               + "             AND sm.prs_kostensoort_key = ks.prs_kostensoort_key),"
               + "         (SELECT ks.prs_kostensoort_oms"
               + "            FROM prs_kostensoort ks"
               + "           WHERE md.prs_kostensoort_key = ks.prs_kostensoort_key)) kostensoort"
             : "")
           + (groepering_key == 13
             ? ", (SELECT d.alg_district_omschrijving"
               + " FROM alg_locatie ll"
               + ", alg_district d"
               + " WHERE l.alg_locatie_key = ll.alg_locatie_key"
               + " AND ll.alg_district_key = d.alg_district_key) district"
             : "")

           + (groepering_key == 14
             ? ", (SELECT ll.alg_locatie_omschrijving"
               + " FROM alg_locatie ll"
               + ", alg_district d"
               + " WHERE l.alg_locatie_key = ll.alg_locatie_key"
               + " AND ll.alg_district_key = d.alg_district_key) locatie"
             : "")
           + (!perform
             ? ", COALESCE((SELECT SUM(f.fin_factuur_totaal)"
               + " FROM fin_factuur f"
               + (toon_opdr_overz
                 ? " WHERE f.mld_opdr_key = o.mld_opdr_key"
                   + "   AND   fin_factuur_statuses_key <> 1"
                   + "   AND   fin_factuur_verwijder IS NULL), 0) werkelijke_kosten"
                 : " , mld_opdr o2"
                   + " WHERE f.mld_opdr_key = o2.mld_opdr_key"
                   + "   AND   fin_factuur_statuses_key <> 1"
                   + "   AND   fin_factuur_verwijder IS NULL"
                   + " AND o2.mld_melding_key = m.mld_melding_key), 0) werkelijke_kosten")
             : "")
           + (groepering_key == 15
             ? ", COALESCE((SELECT " + lcl.xsql('ksg.prs_kostensoortgrp_oms','ksg.prs_kostensoortgrp_key')
               + "            FROM prs_kostensoortgrp ksg"
               + "               , prs_kostensoort ks"
               + "               , mld_stdmelding sm"
               + "           WHERE sm.mld_stdmelding_key = m.mld_stdmelding_key"
               + "             AND sm.prs_kostensoort_key = ks.prs_kostensoort_key"
               + "             AND ks.prs_kostensoortgrp_key = ksg.prs_kostensoortgrp_key),"
               + "         (SELECT "+ lcl.xsql('ksg.prs_kostensoortgrp_oms','ksg.prs_kostensoortgrp_key')
               + "            FROM prs_kostensoort ks"
               + "               , prs_kostensoortgrp ksg"
               + "           WHERE ks.prs_kostensoortgrp_key = ksg.prs_kostensoortgrp_key"
               + "             AND md.prs_kostensoort_key = ks.prs_kostensoort_key), '') kostensoortgroep"
             : "")
           + (groepering_key == 18
             ? ", (SELECT " + lcl.xsqla('smg.mld_stdmeldinggroep_naam','smg.mld_stdmeldinggroep_key')
               + " FROM mld_stdmeldinggroep smg"
               + " WHERE smg.mld_stdmeldinggroep_key = std.mld_stdmeldinggroep_key) groep"
             : "")
           + (groepering_key == 19
             ? ", (SELECT " + lcl.xsqla('sd.ins_srtdiscipline_omschrijving', 'ins_srtdiscipline_key')
               + " FROM ins_srtdiscipline sd"
               + " WHERE sd.ins_srtdiscipline_key = md.ins_srtdiscipline_key) vakgroeptype"
               + ", (SELECT "+lcl.xsqla('sm.mld_stdmeldinggroep_naam','sm.mld_stdmeldinggroep_key')
               + " FROM mld_stdmeldinggroep sm"
               + " WHERE sm.mld_stdmeldinggroep_key = std.mld_stdmeldinggroep_key) groep"
             : "")
           + (groepering_key == 20
             ? ", (SELECT " + lcl.xsqla('sm.mld_stdmeldinggroep_naam','sm.mld_stdmeldinggroep_key')
               + " FROM mld_stdmeldinggroep sm"
               + " WHERE sm.mld_stdmeldinggroep_key = std.mld_stdmeldinggroep_key) groep"
               + ", (SELECT " + S("prs_kpn_string")
               + " FROM prs_kostenplaats k"
               + " WHERE k.prs_kostenplaats_key = m.prs_kostenplaats_key) kostenplaats"
             : "")
           + (groepering_key == 21
             ? ", (SELECT " + lcl.xsqla('mb.mld_meldbron_omschrijving', 'mb.mld_meldbron_key')
               + "  FROM mld_meldbron mb"
               + "  WHERE mb.mld_meldbron_key = m.mld_meldbron_key) meldbron"
             : "")
           + (groepering_key == 22
             ? ", mld_melding_spoed"
             : "");

      if (!perform)
      {
          if (toon_opdr_overz)
          {
            sqln += ", COALESCE((SELECT SUM(topdr.mld_opdr_kosten)"
                  + " FROM mld_opdr topdr"
                  + ", mld_typeopdr ty"
                  + " WHERE topdr.mld_opdr_key = o.mld_opdr_key"
                  + " AND topdr.mld_typeopdr_key = ty.mld_typeopdr_key"
                  + " AND ty.mld_typeopdr_kosten = 1"
                  + " GROUP BY o.mld_opdr_key), 0) kosten";
          }
          else
          {
            sqln += ", COALESCE((SELECT SUM(topdr.mld_opdr_kosten)"
                  + " FROM mld_opdr topdr"
                  + ", mld_typeopdr ty"
                  + " WHERE topdr.mld_melding_key = m.mld_melding_key"
                  + " AND topdr.mld_typeopdr_key = ty.mld_typeopdr_key"
                  + " AND ty.mld_typeopdr_kosten = 1"
                  + " GROUP BY m.mld_melding_key), 0) kosten";
          }
      }

      sql_on_time_accept = " CASE WHEN mld_melding_acceptdatum_std < "
                         + "           COALESCE(fac.gettrackingdate('MLDREJ', m.mld_melding_key), COALESCE(fac.gettrackingdate('MLDACP', m.mld_melding_key), sysdate))"
                         + "      THEN 0"
                         + "      ELSE 1"
                         + " END";

      sql_on_time_run_sla = " CASE"
                          + " WHEN std.mld_stdmelding_slabewaken = 0 OR m.mld_melding_indult = 1 THEN NULL" // Als "SLA bewaken" niet is gezet, dan niet meerekenen.
                          + " ELSE CASE WHEN gau.actualuitvoertijd.tijdsduur / CASE"
                          + "                                                  WHEN gau.actualuitvoertijd.eenheid = 'U'"
                          + "                                                  THEN 24"
                          + "                                                  ELSE 1"
                          + "                                                  END"
                          + "                <= "
                          + "                (CASE"
                          + "                WHEN m.mld_melding_t_uitvoertijd.eenheid = 'U'"
                          + "                THEN m.mld_melding_t_uitvoertijd.tijdsduur / 24"
                          + "                ELSE m.mld_melding_t_uitvoertijd.tijdsduur"
                          + "                END + CASE"
                          + "                      WHEN m.mld_melding_t_respijt.tijdsduur IS NULL"
                          + "                      THEN 0"
                          + "                      WHEN m.mld_melding_t_respijt.eenheid = 'U'"
                          + "                      THEN m.mld_melding_t_respijt.tijdsduur / 24"
                          + "                      ELSE m.mld_melding_t_respijt.tijdsduur"
                          + "                      END)"
                          + "           THEN 1"     // op tijd
                          + "           ELSE 0"
                          + "      END"
                          + " END";

      sql_on_time_run_afspraak = " CASE WHEN m.mld_melding_einddatum >="
                               + "      COALESCE(fac.gettrackingdate('MLDAFM', m.mld_melding_key), fac.gettrackingdate('MLDREJ', m.mld_melding_key), sysdate)"
                                + "       THEN 1"    // op tijd
                                + "       ELSE 0"
                               + " END";

      sql_on_time_accept_opd = "0";  // Unsupported yet, er is nog geen accept-SLA voor opdrachten

      sql_on_time_run_afspraak_opd = " CASE"
                                   + " WHEN fac.gettrackingdate('ORDREJ', o.mld_opdr_key) IS NOT NULL"
                                   + " THEN 1" // Rejected is altijd op tijd uitgevoerd.
                                   + " ELSE CASE WHEN o.mld_opdr_einddatum >="
                                   + "                COALESCE(fac.gettrackingdate('ORDAFM', o.mld_opdr_key), fac.gettrackingdate('ORDCAN', o.mld_opdr_key), sysdate)"
                                    + "          THEN 1"    // op tijd
                                    + "          ELSE 0"
                                    + "     END"
                                   + " END";

      if (perform)
        if (toon_opdr_overz)
          sqln += ", " + sql_on_time_accept_opd + " acceptoptijd"
                + ", 0 uitvoeringoptijd_sla" // Deze doet voor SLA-opdrachten niet mee.
                + ", " + sql_on_time_run_afspraak_opd + " uitvoeringoptijd_afspraak";
        else
          sqln += ", " + sql_on_time_accept + " acceptoptijd"
                + ", " + sql_on_time_run_sla + " uitvoeringoptijd_sla"
                + ", " + sql_on_time_run_afspraak + " uitvoeringoptijd_afspraak";

      // Voeg aan de sql het FROM en WHERE gedeelte toe
      sqln += mld.getfromwherelist_sql(pautfunction, params);
      if (minfo)
      {
        sqln += (params.ingevoerd == "fe" ? " AND m.prs_perslid_key = invoerder.prs_perslid_key" : "");
        sqln += (params.ingevoerd == "fo" ? " AND m.prs_perslid_key <> invoerder.prs_perslid_key" : "");
      } // minfo only

      // 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",
                      pautfunction,
                      (!mld_key && disc_key_str ? String(disc_key_str): ""),
                      2);

      var keyColumn = "";
      var caption = "";
      var content = "";
      var sql_perform = (perform
                        ? ", SUM(acceptoptijd) acceptoptijd"
                          + ", SUM(uitvoeringoptijd_sla) uitvoeringoptijd_sla"
                          + ", COUNT(uitvoeringoptijd_sla) cnt_uitvoeringoptijd_sla"
                          + ", SUM(uitvoeringoptijd_afspraak) uitvoeringoptijd_afspraak"
                        : ", SUM(kosten) totaal_kosten"
                          + ", SUM(werkelijke_kosten) werkelijke_totaal_kosten")
                      + ", SUM (mld_melding_satisfaction) sum_satisfaction"
                      + ", COUNT (mld_melding_satisfaction) cnt_satisfaction"
                      + ", AVG (mld_melding_satisfaction) oordeel";

      if (groepering_key == 3)
      { // melding status
        sqln = "SELECT mld_melding_status"
             + ", COUNT(mld_key) aantal_meldingen"
             + sql_perform
             + " FROM (" + sqln + ")"
             + " GROUP BY mld_melding_status";
        keyColumn = "mld_melding_status";
        caption = L("lcl_mld_mldstatus");
        content = fncolMldStatus;
      }
      else if (groepering_key == 4)
      { // vakgroeptype
        sqln = "SELECT vakgroeptype"
             + ", COUNT(mld_key) aantal_meldingen"
             + sql_perform
             + " FROM (" + sqln + ")"
             + " GROUP BY vakgroeptype";
        keyColumn = "vakgroeptype";
        caption = L("lcl_mld_vakgroeptype");
        content = "vakgroeptype";
      }
      else if (groepering_key == 5)
      { // vakgroeptype - vakgroep
        sqln = "SELECT vakgroeptype || ' - ' || vakgroep vgt_vg"
             + ", COUNT(mld_key) aantal_meldingen"
             + ", SUM(opdr_key) aantal_opdrachten"
             + sql_perform
             + " FROM (" + sqln + ")"
             + " GROUP BY vakgroeptype || ' - ' || vakgroep";
        keyColumn = "vgt_vg";
        caption = L("lcl_mld_vakgroeptype") + " - " + L("lcl_mld_vakgroep");
        content = "vgt_vg";
      }
      else if (groepering_key == 13)
      { // district - vakgroeptype - vakgroep
        sqln = "SELECT district || ' - ' || vakgroeptype || ' - ' || vakgroep d_vgt_vg"
             + ", COUNT(mld_key) aantal_meldingen"
             + sql_perform
             + " FROM (" + sqln + ")"
             + " GROUP BY district, vakgroeptype, vakgroep";
        keyColumn = "d_vgt_vg";
        caption = L("lcl_district") + " - " + L("lcl_mld_vakgroeptype") + " - " + L("lcl_mld_vakgroep");
        content = "d_vgt_vg";
      }
      else if (groepering_key == 14)
      { // district - vakgroeptype - vakgroep
        sqln = "SELECT locatie || ' - ' || vakgroeptype || ' - ' || vakgroep l_vgt_vg"
             + ", COUNT(mld_key) aantal_meldingen"
             + sql_perform
             + " FROM (" + sqln + ")"
             + " GROUP BY locatie, vakgroeptype, vakgroep";
        keyColumn = "l_vgt_vg";
        caption = L("lcl_location") + " - " + L("lcl_mld_vakgroeptype") + " - " + L("lcl_mld_vakgroep");
        content = "l_vgt_vg";
      }
      else if (groepering_key == 6)
      { // vakgroeptype - vakgroep - stdmelding
        sqln = "SELECT vakgroeptype || ' - ' || vakgroep || ' - ' || melding vgt_vg_m"
             + ", COUNT(mld_key) aantal_meldingen"
             + sql_perform
             + " FROM (" + sqln + ")"
             + " GROUP BY vakgroeptype || ' - ' || vakgroep || ' - ' || melding";
        keyColumn = "vgt_vg_m";
        caption = L("lcl_mld_vakgroeptype") + " - " + L("lcl_mld_vakgroep") + " - " + L("lcl_complain");
        content = "vgt_vg_m";
      }
      else if (groepering_key == 12)
      { // kostensoort
        sqln = "SELECT kostensoort"
             + ", COUNT(mld_key) aantal_meldingen"
             + sql_perform
             + " FROM (" + sqln + ")"
             + " GROUP BY kostensoort";
        keyColumn = "kostensoort";
        caption = L("lcl_charge_type");
        content = "kostensoort";
      }
      else if (groepering_key == 15)
      { // kostensoortgroep
        sqln = "SELECT kostensoortgroep"
             + ", COUNT(mld_key) aantal_meldingen"
             + sql_perform
             + " FROM (" + sqln + ")"
             + " GROUP BY kostensoortgroep";
        keyColumn = "kostensoortgroep";
        caption = L("lcl_charge_type_group");
        content = "kostensoortgroep";
      }
      else if (groepering_key == 7)
      { // kostenplaats
        sqln = "SELECT kostenplaats"
             + ", COUNT(mld_key) aantal_meldingen"
             + sql_perform
             + " FROM (" + sqln + ")"
             + " GROUP BY kostenplaats";
        keyColumn = "kostenplaats";
        caption = L("lcl_account");
        content = "kostenplaats";
      }
      else if (groepering_key == 8)
      { // plaats district
        sqln = "SELECT district"
             + ", COUNT(mld_key) aantal_meldingen"
             + sql_perform
             + " FROM (" + sqln + ")"
             + " GROUP BY district";
        keyColumn = "district";
        caption = L("lcl_district");
        content = "district";
      }
      else if (groepering_key == 9)
      { // plaats locatie
        sqln = "SELECT district || ' - ' || locatie dis_loc"
             + ", COUNT(mld_key) aantal_meldingen"
             + sql_perform
             + " FROM (" + sqln + ")"
             + " GROUP BY district || ' - ' || locatie";
        keyColumn = "dis_loc";
        caption = L("lcl_district") + " - " + L("lcl_location");
        content = "dis_loc";
      }
      else if (groepering_key == 10)
      { // opdracht status

        sqln = "SELECT mld_statusopdr_key"
             + ", COUNT(mld_key) aantal_opdrachten"
             + sql_perform
             + " FROM (" + sqln + ")"
             + " GROUP BY mld_statusopdr_key";
        keyColumn = "mld_statusopdr_key";
        caption = L("lcl_mld_opdrachtstatus");
        content = fncolOpdrStatus;
      }
      else if (groepering_key == 11)
      { // uitvoerende
        sqln = "SELECT uitvoerende"
             + ", COUNT(mld_key) aantal_opdrachten"
             + sql_perform
             + " FROM (" + sqln + ")"
             + " GROUP BY uitvoerende";
        keyColumn = "uitvoerende";
        caption = L("lcl_handler");
        content = "uitvoerende";
      }
      else if (groepering_key == 17)
      { // opdrachttype
        sqln = "SELECT opdrachttype"
             + ", COUNT(mld_key) aantal_opdrachten"
             + sql_perform
             + " FROM (" + sqln + ")"
             + " GROUP BY opdrachttype";
        keyColumn = "opdrachttype";
        caption = L("lcl_mld_typeopdr");
        content = "opdrachttype";
      }
      else if (groepering_key == 18)
      { // meldinggroep
        sqln = "SELECT groep"
             + ", COUNT(mld_key) aantal_meldingen"
             + sql_perform
             + " FROM (" + sqln + ")"
             + " GROUP BY groep";
        keyColumn = "groep";
        caption = L("lcl_mld_meldinggroep");
        content = "groep";
      }
      else if (groepering_key == 19)
      { // vakgroeptype - meldinggroep
        sqln = "SELECT vakgroeptype || ' - ' || groep vgt_g"
             + ", COUNT(mld_key) aantal_meldingen"
             + sql_perform
             + " FROM (" + sqln + ")"
             + " GROUP BY vakgroeptype || ' - ' || groep";
        keyColumn = "vgt_g";
        caption = L("lcl_mld_vakgroeptype") + " - " + L("lcl_mld_meldinggroep");
        content = "vgt_g";
      }
      else if (groepering_key == 20)
      { // meldinggroep
        sqln = "SELECT groep || ' - ' || kostenplaats g_kp"
             + ", COUNT(mld_key) aantal_meldingen"
             + sql_perform
             + " FROM (" + sqln + ")"
             + " GROUP BY groep || ' - ' || kostenplaats";
        keyColumn = "g_kp";
        caption = L("lcl_mld_meldinggroep") + " - " + L("lcl_mld_kosten");
        content = "g_kp";
      }
      else if (groepering_key == 21)
      { // meldbron
        sqln = "SELECT meldbron"
             + ", COUNT(mld_key) aantal_meldingen"
             + sql_perform
             + " FROM (" + sqln + ")"
             + " GROUP BY meldbron";
        keyColumn = "meldbron";
        caption = L("lcl_mld_meldbron");
        content = "meldbron";
      }
      else if (groepering_key == 22)
      { // prioriteit
        sqln = "SELECT mld_melding_spoed"
             + ", COUNT(mld_key) aantal_meldingen"
             + sql_perform
             + " FROM (" + sqln + ")"
             + " GROUP BY mld_melding_spoed";
        keyColumn = "mld_melding_spoed";
        caption = L("lcl_mld_urg");
        content = fncolMldPriotext;
      };

      sqln += " ORDER BY 1";

      /**********************************
       * Callback functies ResultsetTable
       *********************************/
      function fnendText()
      {
        var endText = "";
        if (no_old_closed_calls && (isNaN(mldnum)))
          endText = L("lcl_newrows1") + S("mld_max_history") + L("lcl_newrows2");
        return endText;
      }

      function fncolMldStatus(oRs)
      {
        return mld.getmldstatustext(oRs("mld_melding_status").Value);
      }

      function fncolOpdrStatus(oRs)
      {
        return status.getopdrstatustext(oRs("mld_statusopdr_key").Value);
      }

      function fnacceptopTijdP(oRs)
      {
        var procentueel = oRs("acceptoptijd").Value / oRs(toon_opdr_overz? "aantal_opdrachten" : "aantal_meldingen").Value * 100;
        return safe.curr(procentueel);
      }

      function fnUitvoeringOpTijdSlaP(oRs)
      {
        var procentueel = oRs("cnt_uitvoeringoptijd_sla").Value > 0? oRs("uitvoeringoptijd_sla").Value / oRs("cnt_uitvoeringoptijd_sla").Value * 100 : "";
        return safe.curr(procentueel);
      }

      function fnUitvoeringOpTijdAfspraakP(oRs)
      {
        var procentueel = oRs("uitvoeringoptijd_afspraak").Value / oRs(toon_opdr_overz? "aantal_opdrachten" : "aantal_meldingen").Value * 100;
        return safe.curr(procentueel);
      }

      function fncolMldPriotext(oRs)
      {
        return mld.getpriotext(oRs("mld_melding_spoed").Value);
      }

      var totaal_kosten = 0;
      var werkelijke_totaal_kosten = 0;
      var tot_aantal_mld = 0;
      var tot_aantal_opdr = 0;
      var tot_acceptoptijd = 0;
      var tot_uitvoeringoptijd_sla = 0;
      var tot_cnt_uitvoeringoptijd_sla = 0;
      var tot_uitvoeringoptijd_afspraak = 0;
      var sum_satisfaction = 0;
      var cnt_satisfaction = 0;
      function fntotalCalc(oRs)
      {
        if (!toon_opdr_overz)
          tot_aantal_mld += oRs("aantal_meldingen").Value;
        if (toon_opdr_overz || groepering_key == 5)
          tot_aantal_opdr += oRs("aantal_opdrachten").Value;

        if (!perform)
        {
          totaal_kosten += oRs("totaal_kosten").Value;
          werkelijke_totaal_kosten += oRs("werkelijke_totaal_kosten").Value;
        }
        else
        {
          tot_acceptoptijd += oRs("acceptoptijd").Value;
          tot_uitvoeringoptijd_sla += oRs("uitvoeringoptijd_sla").Value;
          tot_cnt_uitvoeringoptijd_sla += oRs("cnt_uitvoeringoptijd_sla").Value;
          tot_uitvoeringoptijd_afspraak += oRs("uitvoeringoptijd_afspraak").Value;
        }

        // Totaal oordeel is alle cijfers opgeteld gedeeld door het aantal beoordelingen.
        sum_satisfaction += oRs("sum_satisfaction").Value;
        cnt_satisfaction += oRs("cnt_satisfaction").Value;
      }

      var percentage_teller = 0;
      function fntotalShow(column, nrlines)
      {
        function doOordeel(cnt_satisfaction, sum_satisfaction)
        {
          var result = cnt_satisfaction > 0? sum_satisfaction/cnt_satisfaction : 0;
          if (excel)
            result = (result!=0? safe.displayfloat(sum_satisfaction/cnt_satisfaction, 1) : "");
          else
            result = rater(result, {readonly: true});
          return result;
        }

        var result = "";
        switch (column.caption)
        {
          case L("lcl_mld_aantal_meldingen")         : result = tot_aantal_mld; break;
          case L("lcl_mld_oordeel")                  : result = doOordeel(cnt_satisfaction, sum_satisfaction); break;
          case L("lcl_mld_aantal_opdrachten")        : result = tot_aantal_opdr; break;
          case L("lcl_mld_accepted_in_time")         : result = tot_acceptoptijd; break;
          case L("lcl_mld_handled_in_time_sla")      : result = tot_cnt_uitvoeringoptijd_sla > 0? safe.curr((tot_uitvoeringoptijd_sla / tot_cnt_uitvoeringoptijd_sla) * 100) : ""; break;
          case L("lcl_mld_handled_in_time_agreement"): result = safe.curr((tot_uitvoeringoptijd_afspraak / (toon_opdr_overz ? tot_aantal_opdr : tot_aantal_mld)) * 100); break;
          case L("lcl_mld_percentage")               : result = safe.curr((tot_acceptoptijd / (toon_opdr_overz ? tot_aantal_opdr : tot_aantal_mld)) * 100);
                                                       percentage_teller++;
                                                       break;
          case L("lcl_mld_totaal_kosten")            : result = safe.curr(totaal_kosten); break;
          case L("lcl_mld_werkelijke_kosten")        : result = safe.curr(werkelijke_totaal_kosten); break;
        }

        return result;
      }

      function fnOordeel(oRs)
      {
        var result = null;
        var displ_val = oRs("oordeel").Value;
        if (displ_val && displ_val != 0)
        {
          if (excel)
            result = "<span id='oordeel' style='text-align:right'>" + displ_val + "</span>";
          else
            result = rater(displ_val, {readonly: true}); // deze bevat al een span
        }
        return result;
      }

      // MGE: TODO: Als je als backo geen fronto rechten hebt dan hoeft de toevoeg button ook niet getoond te worden toch??. Inderdaad-PF
      var addurl = "appl/mld/mld_melding.asp?urole=" + (backo ? "fo" : urole);  // backo mag niet toevoegen
      addurl += buildTransitParam(["loc_key", "bld_key", "flr_key", "room_key"], params)  // TODO: welke allemaal?

      var rst = new ResultsetTable({ keyColumn: keyColumn,
                                     sql: sqln,
                                     ID: "complainstable",
                                     rowClass: "",
                                     filterParams: params,
                                     outputmode: outputmode,
                                     title: (toon_opdr_overz ? L("lcl_orders"): L("lcl_complains")),
                                     endText: fnendText,
                                     showAll: showall,
                                     totalCalc: ((groepering_key > 2 && groepering_key < 16) || groepering_key >= 17)? fntotalCalc : null,
                                     totalShow: ((groepering_key > 2 && groepering_key < 16) || groepering_key >= 17)? fntotalShow : null,
                                     buttons: [] // niet toevoegen in PPI
                                    });

      rst.addColumn(new Column({caption: caption, content: content}));
      if (toon_opdr_overz)
        rst.addColumn(new Column({caption: L("lcl_mld_aantal_opdrachten"), content: "aantal_opdrachten", datatype: "number", total: true}));
      else
      {
        rst.addColumn(new Column({caption: L("lcl_mld_aantal_meldingen"), content: "aantal_meldingen", datatype: "number", total: true}));
      }
      if (groepering_key == 5)
        rst.addColumn(new Column({caption: L("lcl_mld_aantal_opdrachten"), content: "aantal_opdrachten", datatype: "number", total: true}));
      if (!perform)
      {
        rst.addColumn(new Column({caption: L("lcl_mld_totaal_kosten"), content: "totaal_kosten", datatype: "currency", total: true}));
        rst.addColumn(new Column({caption: L("lcl_mld_werkelijke_kosten"), content: "werkelijke_totaal_kosten", datatype: "currency", total: true}));
      }
      else
      {
        if (!toon_opdr_overz)
        {
          rst.addColumn(new Column({caption: L("lcl_mld_accepted_in_time"), content: "acceptoptijd", datatype: "number", total: true}));
          rst.addColumn(new Column({caption: L("lcl_mld_percentage"), content: fnacceptopTijdP, datatype: "float", total: true}));
          rst.addColumn(new Column({caption: L("lcl_mld_handled_in_time_sla"), content: fnUitvoeringOpTijdSlaP, datatype: "float", total: true}));
        }
        rst.addColumn(new Column({caption: L("lcl_mld_handled_in_time_agreement"), content: fnUitvoeringOpTijdAfspraakP, datatype: "float", total: true}));
      }
      if (!toon_opdr_overz)  // alleen voor meldingen
        rst.addColumn(new Column({caption: L("lcl_mld_oordeel"), content: fnOordeel, datatype: "float", decimals: 1, total: true}));

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