<% /*
     $Revision$
     $Id$

    File:        opdr_list.inc
    Description: Definieert de serverside functie opdr_list() die een lijst van opdrachten toont die
                 voldoen aan de gegeven parameters/criteria.
                 Zoals altijd wordt hierbij wel autorisatie betrokken,
                 maar verder geen contextafhankelijke zaken; dat behoort de aanroeper te doen.
    Parameters:  -
    Context:     Word sinds 5.3.1 ook gebruikt vanuit Maninfo als je groepering 2 (opdrachten)
                 of 16 (opdrachten-->kosten) kiest. Overigens is deze laatste geen andere groepering maar
                 toont hij alleen iets meer kolommen dan 2
    Note:        -
*/ %>

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

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

function opdr_list (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.print         : true | false
  // params.excel         : true | false
  // params.org_key       : key
  // params.reg_key       : key
  // params.dist_key      : key
  // params.loc_key       : key
  // params.behandel_key  : key
  // params.bld_key       : key
  // params.handler_key   : key
  // params.opdrtype_key  : key
  // params.cnt_key       : key
  // params.caller_key    : key
  // params.srtdisc_key   : key
  // params.disc_key_arr  : Array met keys (e.g. [3, 4, 5])
  // params.stdm_key_arr  : Array met keys (e.g. [3, 4, 5])
  // params.searchtekst   : wildcard string
  // params.opdrtype_key  : key
  // params.bes           : true | false
  // params.offerte(s)       : -1, 0 or 1

  // 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
  //   params.mldnieto = 1 (99): true | false  (substatus van 4)
  // Opdrachtstatussen:
  // params.opdrstuit:
  // params.opdrstafm:
  // params.opdrstver:

  // afdel =
  // kp = kostenplaats (wildcard)
  //
  // if a parameters has a value of -1, then it is assumed not to be set and to be ignored.

  ///     Deze functie toont de opdrachten, en kan op diverse manieren gebruikt worden:
  ///
  ///     a. als overzicht van opdrachten die IK uit moet voeren (En kan aanpassen en afmelden).
  ///        urole == 'fe', interne uitvoerder
  ///
  ///     b. als overzicht van opdrachten die decentraal door mij afgemeld kunnen worden
  ///        urole=b2, interne uitvoerder decentraal of externe uitvoerdr
  ///        dit zijn dan opdrachten met opdrachttype.decentraal = 1 die binnen mijn WEB_ORDBOF scope vallen
  ///        (melding.ins_discipline: afdeling in PRS scope en plaats in ALG scope)
  ///
  ///     c. als overzicht van opdrachten die centraal door mij beheerd (ingevoerd en/of afgemeld) kunnen worden
  ///        urole == 'bo'
  ///        dit zijn opdrachten die binnen mijn WEB_ORDBOF scope vallen
  ///        Om een opdracht te kunnen maken moet de melding aan mijn MLDBOF [en ORDBOF] scope voldoen
  ///        de minima van beides scope gelden hier dan
  ///
  ///     d. tiny: Als passief overzicht (geen event op rows) van opdrachten behorende bij melding, geen headers en dergelijke
  ///        inline: samen met tiny: Dit is een inline overzicht, Samen met tiny, ook geen headers en dergelijke
  ///

  var urole = params.urole;
  var fronto = (urole == "fo");
  var backo = (urole == "bo");
  var frontend  = (urole == "fe");

  // 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 mld_key = params.mld_key;
  var opdr_key = params.opdr_key; // opdracht nummer is voor de gebruiker hetzelfde als mld_key
  var behandel_key = params.behandel_key;
  var srtdisc_key = params.srtdisc_key;
  var searchtekst = params.searchtekst;
  var reg_key = params.reg_key;
  var dist_key = params.dist_key;
  var adr_key = params.adr_key;
  var loc_key = params.loc_key;
  var bld_key = params.bld_key;
  var verantw_key = params.verantw_key;
  var caller_key = params.caller_key;
  var org_key = params.org_key;
  var srtdisc_key = params.srtdisc_key;
  var disc_key_arr = params.disc_key_arr; // Array met keys (e.g. [3, 4, 5])
  var meldinggrp_key = params.meldinggrp_key;
  var behandelgrp_key = params.behandelgrp_key;
  var stdm_key_arr = params.stdm_key_arr;
  var kp = params.kp;
  var handler_key = params.handler_key;
  var mldstatus_arr = params.mldstatus_arr;
  var opdrstatus_arr = params.opdrstatus_arr;
  var chkAcceptEx = params.chkAcceptEx;
  var chkRunEx = params.chkRunEx;
  var chkSpoed = params.chkSpoed;
  var chkAfgerond = params.chkAfgerond;
  var datefrom = params.datefrom;
  var dateto = params.dateto;
  var opdrtype_key = params.opdrtype_key
  var contract = params.contract
  var cnt_key = params.cnt_key;
  var offerte = params.offerte; // Opdrachttype is een offerteaanvraag. Kan -1:don't care, 0:niet, 1:wel zijn.
  if (params.offertes) // Helaas geeft mld_search_list.asp het meervoud door
    offerte = 1;
  // Er kunen twee contract keys meegegeven worden. Een extra contract key die bij contract hoort.
  // Als cnt_key en contract_key verschillen kun het nooit een resultaat opleveren
  if (contract > 0)
    cnt_key = cnt_key + (cnt_key != ""? ", " : "") + contract;

  var bes = params.bes;
  var tiny = params.tiny;
  var inline = params.inline;
  //var justClose = params.justClose;
  // close_only is vervangen door (pautfunction == "WEB_ORDBO2"): Als je die rechten hebt mag je ook afmelden
  var mldstpen = params.mldstpen;
  var mldstnew = params.mldstnew;
  var mldsting = params.mldsting;
  var mldstacc = params.mldstacc;
  var mldstuit = params.mldstuit;
  var mldstrej = params.mldstrej;
  var mldstafm = params.mldstafm;
  var mldstver = params.mldstver;
  var mldnieto = params.mldnieto;
  var mldopdrstrej = params.mldopdrstrej;
  var mldopdrstnak = params.mldopdrstnak;
  var mldopdrsttfi = params.mldopdrsttfi;
  var mldopdrstfia = params.mldopdrstfia;
  var mldopdrstuit = params.mldopdrstuit;
  var mldopdrstafm = params.mldopdrstafm;
  var mldopdrstver = params.mldopdrstver;
  var mldopdrstacp = params.mldopdrstacp;
  var mldopdrstafr = params.mldopdrstafr;
  var mldopdrstgoe = params.mldopdrstgoe;

  var showstatus = "";
  if (mldstpen)  showstatus = (showstatus == ""? "" : showstatus + ",") + "0";
  if (mldstrej)  showstatus = (showstatus == ""? "" : showstatus + ",") + "1";
  if (mldstnew)  showstatus = (showstatus == ""? "" : showstatus + ",") + "2";
  if (mldsting)  showstatus = (showstatus == ""? "" : showstatus + ",") + "3";
  if (mldstacc)  showstatus = (showstatus == ""? "" : showstatus + ",") + "4";
  if (mldstafm)  showstatus = (showstatus == ""? "" : showstatus + ",") + "5";
  if (mldstver)  showstatus = (showstatus == ""? "" : showstatus + ",") + "6";
  if (mldstuit)  showstatus = (showstatus == ""? "" : showstatus + ",") + "7";
  if (mldnieto)  showstatus = (showstatus == ""? "" : showstatus + ",") + "99";
  var from_mld = (showstatus != "");

  var showopdrstatus = "";
  if (mldopdrstrej) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "1";
  if (mldopdrstnak) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "2";
  if (mldopdrsttfi) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "3"; // Verderop wordt wel bepaald of 'b2' status 3 mag zien
  if (mldopdrstfia) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "4";
  if (mldopdrstuit) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "5";
  if (mldopdrstafm) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "6";
  if (mldopdrstver) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "7";
  if (mldopdrstacp) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "8";
  if (mldopdrstafr) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "9";
  if (mldopdrstgoe) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "10"; // Verderop wordt wel bepaald of 'b2' status 10 mag zien

  var groepering_key = params.groepering_key; // Voor maninfo. 2 en 16 ondersteund

  var uitvoerder = false;
  if (frontend)
  {
    // Dan zijn het alleen opdrachten van *mijn* meldingen waarop ik MLDUSE-read rechten heb
    // en van het type waarbij mld_typeopdr_zichtbaarfe = 1  als ik een mld_key heb
    // Omdat uitsluitend vanuit subframe van mld_melding wordt aangeroepen in deze mode veronderstellen we dat geregeld.
    // OF het zijn de opdrachten waarvan ik uitvoerende ben (MLDORD)
    if (params.mld_key)
        var pautfunction = "WEB_MLDUSE";
    else
    {
        var pautfunction = "WEB_MLDORD";
        uitvoerder = true;
    }
  }
  else if (from_mld)
    var pautfunction = ["WEB_ORDBO2","WEB_ORDBOF"];
  else if (urole == 'b2')
    var pautfunction = "WEB_ORDBO2";
  else
    var pautfunction = "WEB_ORDBOF";

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

  // AUTORISATIES
  // Autorisatie check is al gedaan in mld_search_list.asp
  // Dit lijkt me om te kunnen bepalen of ik uberhaupt naar de PRS-autorisatie hoef te kijken
  var add_prs_restrict = prshasrestrict(pautfunction);

  if (mld_key)
  { // Bestaat de gezochte melding?
    var sql = "SELECT '1' FROM mld_melding WHERE mld_melding_key = " + mld_key;
    oRs = Oracle.Execute(sql);
    if (!oRs.eof)
    { // Melding bestaat. Dan kan de info opgevraagd worden.
      var mld_melding = mld.mld_melding_info(mld_key);
      lcl.set_dialect(mld_melding.srtdisc, "MLD_SRTDISCIPLINE_KEY");
      // Moet hier eigenlijk niet ook gecontroleerd worden of ik de opdrachten van deze melding wel mag zien?
      // var this_mld = mld.func_enabled_melding(mld_key, {verynew: verynew}); // Wat heb ik zoal aan rechten op deze specifieke melding
      // var hasFOBOread = this_mld.canFOread || this_mld.canBOread;
    }
  }


%>
  <html>
    <head>
<%
      if (!params.inline)
        FCLTHeader.Generate({ outputmode: params.outputmode });
%>
      <script type="text/javascript">
        // Text strings used by opdr_list.js
        var urole = "<%=urole%>";
        var setting_mld_accept_confirm = <%=S("mld_accept_confirm")?1:0%>;
      </script>
    </head>

    <body id="listbody">
<%
      var prefix = ';-)';  // even if no result it must have a value


      if (from_mld)
      {
        var functiecode = "'WEB_MLDBOF'";
        for (var i = 0; i < pautfunction.length; i++)
        {
          functiecode += "," + safe.quoted_sql(pautfunction[i]);
        }
      }
      else
        var functiecode = safe.quoted_sql(pautfunction);
      // check if user has a building or lower scope. If so we have to include onroerendgoed view.
      sql2  = "SELECT fac_groeprechten_key "
            + "  FROM fac_functie f"
            + "     , fac_groeprechten gr"
            + "     , fac_gebruikersgroep gg"
            + " WHERE gg.prs_perslid_key = " + user_key
            + "   AND gr.fac_groep_key = gg.fac_groep_key"
            + "   AND gr.fac_functie_key = f.fac_functie_key"
            + "   AND (f.fac_functie_code IN (" + functiecode + "))"
            + "   AND (   (    gr.fac_gebruiker_alg_level_read < 9 "
            + "            AND gr.fac_gebruiker_alg_level_read > 2 "
            + "           ) "
            + "       OR (    gr.fac_gebruiker_alg_level_write < 9 "
            + "            AND gr.fac_gebruiker_alg_level_write > 2 "
            + "           ) "
            + "       ) ";

      bld_scope = false;
      oRs2 = Oracle.Execute(sql2);
      if (!oRs2.eof)
      {
        bld_scope = true;
      }

      sqltrack = (groepering_key == 2 || groepering_key == 16 // Minfo groepering Opdracht(2) en Opdracht + Kosten(16).
                 ? ", TO_DATE('01-01-1970', 'DD-MM-YYYY')"
                 : ", (SELECT MAX(t.fac_tracking_datum)"
                   + "     FROM fac_tracking t"
                   + "        , fac_srtnotificatie sn"
                   + "    WHERE t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key"
                   + "      AND t.fac_tracking_refkey = o.mld_opdr_key" // opdracht key uit "sql"
                   + "      AND sn.fac_srtnotificatie_xmlnode = 'opdracht')")
               + " recentdatum";

      var whereUs = ""; // straks voor de statussen
      sql = "SELECT o.mld_melding_key"
          + "     , o.mld_opdr_bedrijfopdr_volgnr"
          + "     , o.mld_opdr_id"
          + "     , o.mld_opdr_einddatum"
          + "     , l.alg_locatie_code "
            + "     ||(SELECT DECODE(v.alg_plaatsaanduiding, '', ' ('||l.alg_locatie_omschrijving||')',"
                                                                 + " '-'||v.alg_plaatsaanduiding || DECODE(v.alg_plaatsomschrijving, '','' ,"
                                                                 + "' (' || v.alg_plaatsomschrijving || ')'))"
            + "        FROM alg_v_allonrgoed_gegevens v"
            + "       WHERE m.mld_alg_onroerendgoed_keys = v.alg_onroerendgoed_keys"
            + "         AND rownum = 1"
            + "     ) plaatsmelding"
          + "     , l.alg_locatie_adres"
          + (S("mld_print_loc_address") == 2
            ? "   , (SELECT geg.alg_gebouw_naam"
              + "      FROM alg_v_allonrgoed_gegevens geg"
              + "     WHERE geg.alg_onroerendgoed_keys = m.mld_alg_onroerendgoed_keys) alg_gebouw_naam"
            : "")
          + "     , di.alg_district_omschrijving"
          + "     , (SELECT u.naam FROM mld_v_uitvoerende u WHERE U.mld_uitvoerende_key = O.mld_uitvoerende_keys) naam"
          + "     , (SELECT " + S("prs_pers_string")
            + "        FROM prs_perslid p"
            + "       WHERE p.prs_perslid_key = o.prs_perslid_key) behandelaar"
          + "     , (SELECT " + S("prs_kpn_string")
            + "        FROM prs_kostenplaats k"
            + "       WHERE k.prs_kostenplaats_key = o.prs_kostenplaats_key) kpstring"
          + "     , o.mld_opdr_key"
          + "     , c.cnt_contract_key"
          + "     , c.cnt_contract_nummer"
          + "     , c.cnt_contract_nummer_intern"
          + "     , c.cnt_contract_versie"
          + "     , o.mld_opdr_datumbegin"
          + "     , o.mld_opdr_plandatum"
          + "     , " + lcl.xsqla('t.mld_typeopdr_omschrijving', 't.mld_typeopdr_key')
          + "     , t.mld_typeopdr_decentraal"
          + "     , t.mld_typeopdr_afmelden_extern"
          + "     , sd.ins_srtdiscipline_prefix"
          + "     , sd.ins_srtdiscipline_omschrijving"
          + "     , " + lcl.xsqla('std.mld_stdmelding_omschrijving','std.mld_stdmelding_key')
          + "     , " + S("prs_pers_string")+ " melder"
          + "     , SYSDATE nu"
          + "     , o.mld_opdr_kosten"
          + (urole == 'mi'
            ? "   , COALESCE((SELECT SUM(f.fin_factuur_totaal)"
              + "               FROM fin_factuur f"
              + "              WHERE f.mld_opdr_key = o.mld_opdr_key "
              + "                AND f.fin_factuur_statuses_key <> 1"
              + "                AND f.fin_factuur_verwijder IS NULL), 0) gefactureerd"
            : "")
          + "     , o.mld_opdr_uren"
          + "     , o.mld_opdr_materiaal"
          + "     , o.mld_opdr_uurloon"
          + "     , o.mld_opdr_kosten - ((mld_opdr_uren * mld_opdr_uurloon) + mld_opdr_materiaal) correctie"
          + "     , o.mld_opdr_opmerking"
          + "     , (SELECT " + S("prs_pers_string")
            + "        FROM prs_perslid p"
            + "       WHERE p.prs_perslid_key = m.prs_perslid_key_voor) aanvrager"
          + "     , COALESCE((SELECT 'B'"
          + "                  FROM prs_bedrijf"
          + "                  WHERE prs_bedrijf_key = o.mld_uitvoerende_keys)"
          + "              , (SELECT 'P'"
          + "                  FROM prs_perslid"
          + "                  WHERE prs_perslid_key = o.mld_uitvoerende_keys)) B_OF_P"
          + "     , m.mld_melding_spoed"
          + "     , m.mld_melding_acceptdatum_std"
          + "     , m.mld_melding_einddatum_std"
          + "     , m.mld_melding_status"
          + "     , m.mld_melding_einddatum"
          + "     , std.mld_stdmelding_slabewaken"
          + "     , m.mld_melding_indult"
          + "     , m.mld_melding_parentkey"
          + "     , (SELECT COUNT(o1.mld_opdr_key)"
            + "        FROM mld_opdr o1"
            + "       WHERE o1.mld_melding_key = m.mld_melding_key) nrOrders"
          + "     , (SELECT COUNT(o2.mld_statusopdr_key)"
            + "        FROM mld_opdr o2"
            + "       WHERE o2.mld_melding_key = m.mld_melding_key"
            + "         AND o2.mld_statusopdr_key NOT IN (1, 2, 6, 7, 9)) nrActief"
          + "     , o.mld_opdr_omschrijving"
          + "     , o.mld_statusopdr_key"
          + "     , o.mld_opdr_verzonden"
          + "     , t.mld_typeopdr_key" // Voor flexGroupId
          + "     , " + lcl.xsqla('md.ins_discipline_omschrijving', 'md.ins_discipline_key')
          + "     , pfiat.prs_perslid_naam_full fiatteur"
          + "     , (SELECT COUNT (o.mld_opdr_key)"
          + "          FROM mld_opdr o  "
          + "         WHERE o.mld_melding_key = mld_melding_key"
          + "           AND o.fac_activiteit_key IS NOT NULL) opdr_action"
          + "     , m.fac_activiteit_key mld_action"
          + "     , t.mld_typeopdr_kosten"
          + "     , t.mld_typeopdr_isofferte"
          + "     , t.mld_typeopdr_matchtype"
          + "     , t.mld_typeopdr_kosten_verplicht"
          + "     , mdp.mld_disc_params_opdr_kosten"
          + sqltrack
          + "     , m.mld_melding_t_respijt.tijdsduur tijdsduur"
          + "     , m.mld_melding_t_respijt.eenheid eenheid"
          + "     , std.mld_stdmelding_key"
          + "     , (SELECT COUNT(f.fin_factuur_key)"
            + "        FROM fin_factuur f"
            + "       WHERE f.mld_opdr_key = o.mld_opdr_key"
            + "         AND f.fin_factuur_verwijder IS NULL) aantal_facturen"
          + "  FROM mld_opdr o"
          + "     , cnt_v_aanwezigcontract c"
          + "     , mld_stdmelding std"
          + "     , mld_melding m"
          + (bld_key || bld_scope || verantw_key
            ? "   , alg_v_allonrgoed_gegevens g"
            : "")
          + "     , alg_locatie l"
          + (verantw_key ? ", alg_gebouw gg" : "")
          + "     , alg_district di"
          + "     , mld_discipline md"
          + "     , mld_disc_params mdp"
          + "     , ins_srtdiscipline sd"
          + ((add_prs_restrict)
            ? "   ,    prs_v_afdeling_boom b"
            : "")
          // and more here
          + "     , mld_typeopdr t"
          + "     , prs_v_perslid_fullnames_all pfiat"
          + "     , prs_perslid p" // de melder
          + " WHERE m.mld_melding_key = o.mld_melding_key"
          + "   AND pfiat.prs_perslid_key(+) = prs.getkpverantwoordelijke(o.prs_kostenplaats_key, "+S("prs_approvemethod")+", -1)"
          + "   AND m.mld_alg_locatie_key = l.alg_locatie_key(+)"
          + "   AND l.alg_district_key = di.alg_district_key(+)"
          + "   AND std.mld_ins_discipline_key = md.ins_discipline_key"
          + "   AND md.ins_discipline_key = mdp.mld_ins_discipline_key"
          + "   AND o.fac_activiteit_key IS NULL"
          + "   AND o.cnt_contract_key = c.cnt_contract_key(+)"
          + "   AND m.mld_stdmelding_key = std.mld_stdmelding_key"
          + "   AND p.prs_perslid_key = m.prs_perslid_key"
          + "   AND sd.ins_srtdiscipline_key = md.ins_srtdiscipline_key"
          + "   AND o.mld_typeopdr_key = t.mld_typeopdr_key";

      if (add_prs_restrict)
        sql += " AND p.prs_afdeling_key = b.prs_afdeling_key";

      if (bld_key || bld_scope || verantw_key)
        sql += " AND m.mld_alg_onroerendgoed_keys = g.alg_onroerendgoed_keys(+)";

      if (urole == 'b2')
        sql += " AND (o.mld_statusopdr_key NOT IN (3, 10) OR o.mld_statusopdr_key_refiat IS NOT NULL)"

      if (frontend && params.mld_key)
        sql += " AND t.mld_typeopdr_zichtbaarfe = 1";

      if (mld_key)
      {
        sql += " AND o.mld_melding_key = " + mld_key;
      }
      else if (opdr_key)
      {
        sql += " AND o.mld_melding_key = " + opdr_key; // opdracht nummer is voor de gebruiker hetzelfde als mld_key
      }
      else
      { //
        if (offerte >= 0)
          sql += " AND t.mld_typeopdr_isofferte = " + offerte;

        // --------- De statussen ------
        // Meldingstatus
        if (mldstatus_arr && ((mldstatus_arr.length > 1) || (mldstatus_arr != -1)))
        {
          mldstatus_arr = mldstatus_arr.join(",");
        }
        else
        {
          mldstatus_arr = showstatus;
        }
        var sql_status = mld.getStatusSql(mldstatus_arr, "m");
        if (sql_status)
          sql += " AND" + sql_status;
        // Opdrachtstatus
        if (opdrstatus_arr && ((opdrstatus_arr.length > 1) || (opdrstatus_arr != -1)))
        {
          sql += " AND o.mld_statusopdr_key IN (" + opdrstatus_arr.join(",") + ")";
        } else {
            if (showopdrstatus != "")
                sql += " AND o.mld_statusopdr_key IN (" + showopdrstatus + ")";
        }
        // Spoed
        if (chkSpoed)
          sql += " AND m.mld_melding_spoed < 3";
        // Afgerond
        if (chkAfgerond)
          sql += " AND m.mld_melding_afgerond = 1";

        // Actie/door
        sql += mld.getwhereSrttracking(params);
        sql += mld.getwherePrstracking(params);
        //
        // Overschrijding acceptatietijd
        if (chkAcceptEx)
        {
          whereUs += " WHERE " + mld.getwhere_to_late_accept_sql("us") + " = 1";
        }
        // Overschijding doorlooptijd
        if (chkRunEx)
        {
          whereT = mld.getwhere_to_late_run_sql("us", "us", "O") + " = 1";
          if (whereUs.length > 0)
            whereUs += " AND " + whereT;
          else
            whereUs = " WHERE " + whereT;
        }

        if (S("mld_max_history") > 0 && (mldopdrstafm || mldopdrstver)) // was alleen als je in de history keek
          sql += " AND (o.mld_opdr_datumbegin >= SYSDATE - " + S("mld_max_history") + ")";

        // Hier wordt gezocht in de omschrijving, opmerking en de eventuele (tekst-)kenmerken
        // Dit is een potentieel en onvermijdelijk dure zoekactie.
        // Conform meldingen
        if (searchtekst)
          sql += " AND (UPPER(mld_opdr_omschrijving) LIKE " + safe.quoted_sql_wild("%" + searchtekst + "%")
               + " OR UPPER(mld_opdr_opmerking) LIKE " + safe.quoted_sql_wild("%" + searchtekst + "%")
               + " OR UPPER(mld_opdr_id) LIKE " + safe.quoted_sql_wild("%" + searchtekst + "%")
                    +  " OR EXISTS (SELECT mld_opdr_key"
                    +  "              FROM mld_kenmerkopdr ko"
                    +  "             WHERE ko.mld_opdr_key = o.mld_opdr_key"
                    +  "               AND ko.mld_kenmerkopdr_verwijder IS NULL"
                    +  "               AND UPPER(ko.mld_kenmerkopdr_waarde) LIKE " + safe.quoted_sql_wild("%" + searchtekst + "%") + "))";

        if (bld_key)
          sql += " AND (g.alg_gebouw_key = " + bld_key + " OR g.alg_terreinsector_key = " + bld_key + ")";
        else if (loc_key)
          sql += " AND m.mld_alg_locatie_key = " + loc_key;
        else if (dist_key)
          sql +=  " AND di.alg_district_key = " + dist_key;
        else if (reg_key)
          sql +=  " AND di.alg_regio_key = " + reg_key;

        if (adr_key)
        { // opdrachten van een bepaald afleveradres
          sql += " AND m.mld_adres_key = " + adr_key;
        }

        if (kp)
          sql += " AND o.prs_kostenplaats_key IN"
                 + " (SELECT k.prs_kostenplaats_key"
                 + " FROM prs_kostenplaats k"
                 + " WHERE (UPPER(k.prs_kostenplaats_omschrijving) LIKE " + safe.quoted_sql_wild(kp+"%")
                 + " OR UPPER(k.prs_kostenplaats_nr) LIKE " + safe.quoted_sql_wild(kp+"%") + "))";

        if (org_key)
          sql += " AND p.prs_afdeling_key IN"
               + " (SELECT a.prs_afdeling_key"
               + " FROM prs_v_afdeling_familie a"
               + " WHERE a.prs_afdeling_elder_key = " + org_key + ")";

        if (verantw_key)
           sql += " AND g.alg_gebouw_key = gg.alg_gebouw_key(+)"
                + " AND (gg.prs_perslid_key_verantw = " + verantw_key
                + "  OR gg.prs_perslid_key_verantw2 = " + verantw_key + ")";

        if (caller_key)
          sql += " AND m.prs_perslid_key = " + caller_key;

        if (behandel_key)
          sql += " AND o.prs_perslid_key = " + behandel_key;

        if (opdrtype_key)
          sql += " AND o.mld_typeopdr_key = " + opdrtype_key;

        // Soort melding, productgroep, melding (stdmelding), meldinggroep
        if (stdm_key_arr || meldinggrp_key)
        {
          if (stdm_key_arr)
            sql += " AND m.mld_stdmelding_key IN (" + stdm_key_arr.join(",") + ")";
          if (meldinggrp_key)
            sql += " AND std.mld_stdmeldinggroep_key IN (" + meldinggrp_key + ")";
        }
        else if (disc_key_arr)
          sql += " AND std.mld_ins_discipline_key IN (" + disc_key_arr.join(",") + ")" ;
        else if (srtdisc_key)
          sql += " AND sd.ins_srtdiscipline_key IN (" + srtdisc_key + ") ";

         // Behandelgroep
        if (behandelgrp_key)
          sql += " AND mdp.mld_behandelgroep_key = " + behandelgrp_key;

        if (cnt_key)
          sql += " AND o.cnt_contract_key IN (" +  cnt_key + ")";

        if (urole == 'b2') // decentraal
          sql += " AND t.mld_typeopdr_decentraal <> 0";

        if (bes)
          sql += " AND sd.ins_srtdiscipline_bes = 1";

        if (datefrom)
        {
          sql += " AND o.mld_opdr_datumbegin >= " + datefrom.beginToSQL();
        }
        if (dateto)
        {
          sql += " AND o.mld_opdr_datumbegin < " + dateto.endToSQL();
        }

        if (offerte >= 0)
          sql += " AND t.mld_typeopdr_isofferte = " + offerte;
      }

      // Als ik uitvoerder ben dan mag ik de aan mij toegekende opdrachten zien.
      if (uitvoerder)
      { // Ben ik misschien nog plaatsvervanger
        var prsKeys = user.collegakeylist();
        sql += " AND o.mld_uitvoerende_keys IN (" + prsKeys + ")";
      }

      // Setting mld_typeopdr_afmelden_extern: Afmelder (ORDBO2) mag externe opdrachten (0=Niet zien, 1=Zien, 2=Afmelden)
      // Als ik een interne (decentraal/intern) uitvoerder ben mag ik de externe opdrachten niet zien als mld_typeopdr_afmelden_extern==0.
      // De voorwaarde geldt niet als
      // 1) de opdracht toegekend is aan een persoon. Eigen opdrachten mag ik altijd zien.
      // 2) de opdracht toegekend is aan het eigen bedrijf. Opdrachten van het eigen bedrijf mag ik altijd zien.
      // 3) ik de contactpersoon ben van het uitvoerende externe bedrijf. Opdrachten van eigen bedrijf mag ik altijd zien.
      // Let op!!! Deze voorwaarde geldt dus alleen voor de WEB_ORDBO2 rechten.
      var exhandler = mld.iamContact(); // Later nodig voor bepaling eClose.

      if (exhandler) // Dan mag ik *echt* alleen opdrachten toegekend aan mijn bedrijf zien
      {              // De andere helft van deze if is dan niet genoeg en bovendien *extreem* traag (FSN#29867)
          sql_extern = " AND EXISTS (SELECT 'X' " // Ben ik contactpersoon van het uitvoerende externe bedrijf
                     + "               FROM prs_contactpersoon"
                     + "              WHERE prs_perslid_key = " + user_key
                     + "                AND prs_contactpersoon_verwijder IS NULL"
                     + "                AND prs_bedrijf_key = o.mld_uitvoerende_keys)";
      }
      else
      {
          sql_extern = " AND (mld_typeopdr_afmelden_extern IN (1, 2)"
                     + "         OR EXISTS (SELECT 'X'" // Toegekend aan een persoon
                     + "                      FROM prs_perslid"
                     + "                     WHERE prs_perslid_key = o.mld_uitvoerende_keys)"
                     + "         OR EXISTS (SELECT 'X'" // Toegekend aan het EIGEN interne bedrijf
                     + "                      FROM prs_bedrijf b"
                     + "                         , prs_perslid p"
                     + "                         , prs_v_afdeling a"
                     + "                     WHERE b.prs_bedrijf_key = a.prs_bedrijf_key"
                     + "                       AND p.prs_afdeling_key = a.prs_afdeling_key"
                     + "                       AND b.prs_bedrijf_intern = 1"
                     + "                       AND b.prs_bedrijf_key = o.mld_uitvoerende_keys"
                     + "                       AND p.prs_perslid_key = " + user_key + ")"
                     + "         OR EXISTS (SELECT 'X'" // Ben ik contactpersoon van het uitvoerende externe bedrijf
                     + "                      FROM prs_contactpersoon"
                     + "                     WHERE prs_perslid_key = " + user_key
                     + "                       AND prs_contactpersoon_verwijder IS NULL"
                     + "                       AND prs_bedrijf_key = o.mld_uitvoerende_keys)"
                     + "     )";
      }

      // Hier zijn nu alle meegegeven condities verwerkt, dat is:
      // Ofwel het nummer, ofwel de andere criteria.
      // We weten echter ook dat uitvoerende kan worden gehanteerd als een soort autorisatie
      // dus moeten we die ook checken, zelfs als er een nummer werd opgegeven.
      // De 3D autorisatie komt daar nog eens overheen.
      if (handler_key)
        sql = sql + " AND o.mld_uitvoerende_keys = " + handler_key;


      sql += getKenmerkSql("OPD", "o.mld_opdr_key");

      var sqlA = sql;
      if (from_mld)
      { // Dan moeten we het opdracht overzicht tonen voor het meldingen backoffice overzicht "Afhandelen Meldingen".
        // Dan wil ik alleen die opdrachten zien van de meldingen waar ik rechten voor heb. Dan moet ik WEB_MLDBOF rechten hebben voor de meldingen
        // apply 3D authorization to the locations and to the organisations (both ALG and PRS)
        sqlA = discx3d (sql,
                        "md.ins_discipline_key",
                        "di.alg_regio_key",
                        "l.alg_district_key",
                        "l.alg_locatie_key",
                        "g.alg_gebouw_key",
                        "g.alg_verdieping_key",
                        "g.alg_ruimte_key",
                        "b.prs_bedrijf_key",
                        "b.prs_afdeling_key",
                        "WEB_MLDBOF",
                        (!mld_key && disc_key_arr ? disc_key_arr.join(",") : ""),
                        2);
      }
      // Indien sqlA uit meerdere delen (UNION ALL) bestaat dan al deze delen combineren met de pautfunction rechten.
      sqlA = sqlA.split("UNION ALL");

      if (typeof pautfunction != "object" || !(pautfunction instanceof Array))
        // Maak van de String een Array
        pautfunction = [pautfunction];

      var sqlAB = "";
      for (var jj = 0; jj < sqlA.length; jj++)
      {
        // pautfunction is nu altijd een Array met webfuncties
        for (var ii = 0; ii < pautfunction.length; ii++)
        {
          // Voorwaarde sql_extern t.b.v. setting mld_typeopdr_afmelden_extern alleen toevoegen voor WEB_ORDBO2 rechten.
          var sql3d = sqlA[jj] + (pautfunction[ii] == "WEB_ORDBO2"? sql_extern : "");
          // apply 3D authorization to the locations and to the organisations (both ALG and PRS)
          // if "disc == 0" or disc is not defined then disc should be ""
          // otherwise de 3d authorization adds a "AND (1=0)" line to the query and you will have never a result
          sqlB = (ii > 0? sqlB + " UNION " : "") + discx3d (sql3d,
                                                            "md.ins_discipline_key",
                                                            "di.alg_regio_key",
                                                            "l.alg_district_key",
                                                            "l.alg_locatie_key",
                                                            "g.alg_gebouw_key",
                                                            "g.alg_verdieping_key",
                                                            "g.alg_ruimte_key",
                                                            "b.prs_bedrijf_key",
                                                            "b.prs_afdeling_key",
                                                            pautfunction[ii],
                                                            (!(mld_key || opdr_key) && disc_key_arr ? disc_key_arr.join(",") : ""),
                                                            (add_prs_restrict ? 2 : 0)
                                                           );
        }
        sqlAB = sqlAB + (jj > 0? " UNION " : "") + sqlB;
      }

      if (pautfunction.length > 1)
      { // We hebben dan rechten van meerdere autorisatie functies. Daardoor kan door discx3d() " UNION ALL " gebruikt worden om verschillende SELECT aan elkaar te plakken.
        // In dat geval krijgen we dan dubbele resultataten.
        // We moeten daarom deze UNION ALL's vervangen door UNION's.
        sqlAB = sqlAB.replace(/UNION ALL/g, "UNION");
      }

      // Voeg laatste tracking datum toe
      sql = "SELECT * FROM (" + sqlAB + ") us"
          + whereUs
          + " ORDER BY" // ins_discipline_omschrijving is hier al vertaald
          + (excel? " UPPER(ins_discipline_omschrijving), mld_typeopdr_key," : "") // Flexkenmerken verschillen per opdrachttype (mld_typeopdr_key)
          + " mld_opdr_einddatum, mld_opdr_bedrijfopdr_volgnr";

      var status_oms = new Array();
      var status_cnt = new Array();

      /**********************************
       * Callback functies ResultsetTable
       *********************************/
      var recent = new Date();
      recent.setMinutes(recent.getMinutes() - S("mld_opdracht_recent"));
      function fnrowClass(oRs)
      {
        if (oRs("mld_opdr_einddatum").Value > oRs("nu").Value ||
            oRs("mld_statusopdr_key").Value == 1 ||
            oRs("mld_statusopdr_key").Value == 2 ||
            oRs("mld_statusopdr_key").Value == 6 ||
            oRs("mld_statusopdr_key").Value == 7 ||
            oRs("mld_statusopdr_key").Value == 9)
        { // Alleen open opdrachten kunnen een rode kleur krijgen.
          class1 = "";
      	}
      	else
      	{
          class1 = " expired2";
      	}
        var mld_recent = new Date(oRs("recentdatum").Value);
        if (mld_recent > recent)
        {
          class1 += " updated";
        }

        return class1;
      }

      // Extra data voor de client om daar dynamisch buttons te kunnen activeren.
      function fnrowData(oRs)
      {
        var mldKey = oRs("mld_melding_key").Value;
        var mldPrefix = oRs("ins_srtdiscipline_prefix").Value ? oRs("ins_srtdiscipline_prefix").Value : "";
        var mldVolgnr = oRs("mld_opdr_bedrijfopdr_volgnr").Value;
        var data = {mldKey: mldKey, mldPrefix: mldPrefix, mldVolgnr: mldVolgnr};

        return JSON.stringify(data);
      }

      // Opdracht rechten.
      var my_mldrechten = user.func_enabled("MLD");
      var canWriteORDBOF = my_mldrechten.canWrite("WEB_ORDBOF");
      var canWriteORDAFR = my_mldrechten.canWrite("WEB_ORDAFR");
      // Factuur rechten.
      var authparamsFINUSE = user.checkAutorisation("WEB_FINUSE", true);
      var authparamsFINFOF = user.checkAutorisation("WEB_FINFOF", true);
      var authparamsFINBOF = user.checkAutorisation("WEB_FINBOF", true);
      // Alleen PRSreadlevel en PRSwritelevel van belang want fac_functie_min_level = 7 (lezen en schrijven organisatie)
      // Alleen FE (als contactpersoon) of FO kan aanmaken.
      var hasAddFactuurRights = ((authparamsFINUSE && authparamsFINUSE.PRSwritelevel < 9) || (authparamsFINFOF && authparamsFINFOF.PRSwritelevel));
      var hasListFactuurRights = (authparamsFINUSE || authparamsFINFOF || authparamsFINBOF || user.isBudgethouder());

      function fnrowActionEnabler(oRs)
      {
        var o_stat = oRs("mld_statusopdr_key").Value;

        eAdd = (urole == 'bo') && canWriteORDBOF /* && TODO melding binnen scope daarvan maar dat maakt de query erg ingewikkeld */;

        var eClose  = (o_stat == 5 || o_stat == 8) && authparams.ALGwritelevel < 9;
        // Afmelden van opdrachten toegekend aan bedrijven mag ik alleen als
        // mld_typeopdr_afmelden_extern == 2 of als je contactpersoon bent
        // Dus: ik ben interne uitvoerder en mld_typeopdr_afmelden_extern == 2, of
        // ik ben externe uitvoerder (contactpersoon van dit bedrijf)
        if (urole == 'b2' && oRs("mld_typeopdr_afmelden_extern").Value < 2 && oRs("B_OF_P").Value == 'B' && !exhandler)
            eClose = false;

        if (urole == 'bo' && oRs("mld_typeopdr_decentraal").Value == 2)
            eClose = false; // Exclusief decentraal

        // Als kosten bij afmelden verplicht zijn:
        var matchtype = oRs("mld_typeopdr_matchtype").Value;
        var req_type  = oRs("mld_typeopdr_kosten_verplicht").Value;
        var req_opdr  = oRs("mld_disc_params_opdr_kosten").Value || 0;
        var kosten_verplicht_afm = (matchtype != 4 && (req_type & 2 || (req_type == 0 && req_opdr & 2))? 1 : 0) == 1;
        var opdr_kosten = oRs("mld_opdr_kosten").Value;
        if (kosten_verplicht_afm && opdr_kosten == null)
            eClose = false;

        // Voor het accepteren van meldingen gelden bijna dezelfde conditites als voor het sluiten
        // Alleen mag dat natuurlijk niet als een melding al is geaccepteerd.
        var eAccept = eClose && o_stat == 5;

        var eCopy   = eAdd;

        var isofferte = oRs("mld_typeopdr_isofferte").Value == 1;
        var typehas_cost = oRs("mld_typeopdr_kosten").Value == 1;
        var is_planned_action = oRs("mld_action").Value != null || oRs("opdr_action").Value > 0;

        var eFinish  = (o_stat == 6 && // Opdracht status Afgemeld(6)
                        !isofferte &&
                        typehas_cost &&
                        canWriteORDAFR &&
                        !is_planned_action);

        var has_facturen = oRs("aantal_facturen").Value > 0; // De opdracht heeft facturen.
        var eAddFactuur = typehas_cost && !has_facturen && hasAddFactuurRights; // Kan rechtstreeks vanuit deze opdracht een factuur aanmaken.
        var eListFactuur = typehas_cost && has_facturen && hasListFactuurRights; // Mag lijst met facturen zien die bij deze opdracht horen.

        var data = {eAdd: eAdd, eClose: eClose, eCopy: eCopy, eAccept: eAccept, eFinish: eFinish, eAddFactuur: eAddFactuur, eListFactuur: eListFactuur};
        return data;
      }

      function fncolSpoed(oRs)  // exacte kopie vanuit mld_list.inc
      {
        var displ = mld.getpriotext(oRs("mld_melding_spoed").Value);
        var hprio = "<div style='display:none'>"+oRs("mld_melding_spoed").Value+"</div>";  // for sorting i presume
        if (outputmode ==0) {  // maak er dan nog leuke plaatjes van
            switch (oRs("mld_melding_spoed").Value)
            {
              case 1:  displ = "<span class='fa fa-exclamation-triangle fa-lg fa-fw' id='urg_kritiek1' title='" + displ+"'>"+hprio+"</span>"; break;
              case 2:  displ = "<span class='fa fa-exclamation-triangle fa-lg fa-fw' id='urg_hoog1' title='" + displ+"'>"+hprio+"</span>"; break;
              case 3:  displ = "<span id='urg_normaal1' title='" + displ + "'>"+hprio+"</span>"; break;
              case 4:  displ = "<span class='fa fa-arrow-circle-o-down fa-lg  fa-fw' id='urg_laag1' title='" + displ+"'>"+hprio+"</span>"; break;
              case 5:  displ = "<span class='fa fa-pause-circle-o fa-lg fa-fw' id='urg_hold1' title='" + displ+"'>"+hprio+"</span>"; break;
            }
        }
        return displ;
      }

      function fncolKey(oRs)
      {
        return oRs("ins_srtdiscipline_prefix") + oRs("mld_melding_key") + "/" + oRs("mld_opdr_bedrijfopdr_volgnr");
      }

      function fnMldStatus(oRs)
      {
        if (oRs("mld_melding_parentkey").Value > 0)
            return L("lcl_mld_parent_status").format(oRs("mld_melding_parentkey").Value); // default leeg

        var mldStatus = parseInt(oRs("mld_melding_status").Value);
        var nrOrders = oRs("nrOrders").Value;
        var nrActief = oRs("nrActief").Value;
        // Een melding is nog niet opgelost als er opdrachten/offertes zijn bij de melding en waarvan er geen enkele meer actief is.
        // De status voor deze meldingen is geaccepteerd(4).
        var not_solved = nrOrders > 0 && oRs("nrActief").Value == 0 && backo && mldStatus == 4;
        if (not_solved)
        { // Checkt bij status 4 of dat nieuw(4) of oud(99) is
          var mldkey = oRs("mld_melding_key").Value;
          mldStatus = mld.getextendedmldstatus(mldStatus, mldkey)
        }
        var mld_status = mld.getmldstatustext(mldStatus);

        return mld_status;
      }

      function fnOpdrStatus(oRs)
      {
        var txt = status.getopdrstatustext(oRs("mld_statusopdr_key").Value);
        if (oRs("mld_opdr_verzonden").Value == null && L("lcl_mld_opdr_notyetsent"))
            txt += "<br>" + L("lcl_mld_opdr_notyetsent");
        return txt;
      }

      var summaryParams = { status_oms: new Array(),
                            status_cnt : new Array()
                          };

      function fnsummaryCalc(oRs)
      {
        with (summaryParams)
        {
          var opd_status = status.getopdrstatustext(oRs("mld_statusopdr_key").Value);
          var order = oRs("mld_statusopdr_key").Value;

          if (status_oms[order])
          {
            status_cnt[order] = status_cnt[order] + 1;
          }
          else
          {
            status_oms[order] = opd_status;
            status_cnt[order] = 1;
          }
        }
        return;
      }

      function fnsummaryShow()
      {
        with (summaryParams)
        {
          status_row = "";
          status_row += (status_oms[10] != undefined? ", " + status_oms[10] + " <b>" + status_cnt[10] + "</b>" : "");
          status_row += (status_oms[3] != undefined? ", " + status_oms[3] + " <b>" + status_cnt[3] + "</b>" : "");
          status_row += (status_oms[4] != undefined? ", " + status_oms[4] + " <b>" + status_cnt[4] + "</b>" : "");
          status_row += (status_oms[5] != undefined? ", " + status_oms[5] + " <b>" + status_cnt[5] + "</b>" : "");
          status_row += (status_oms[8] != undefined? ", " + status_oms[8] + " <b>" + status_cnt[8] + "</b>" : "");
          status_row += (status_oms[6] != undefined? ", " + status_oms[6] + " <b>" + status_cnt[6] + "</b>" : "");
          status_row += (status_oms[9] != undefined? ", " + status_oms[9] + " <b>" + status_cnt[9] + "</b>" : "");
          status_row += (status_oms[7] != undefined? ", " + status_oms[7] + " <b>" + status_cnt[7] + "</b>" : "");
          status_row += (status_oms[1] != undefined? ", " + status_oms[1] + " <b>" + status_cnt[1] + "</b>" : "");
          status_row += (status_oms[2] != undefined? ", " + status_oms[2] + " <b>" + status_cnt[2] + "</b>" : "");
          status_row = status_row.substr(2);
        }
        return status_row;
      }

      function fnendText()
      {
        var endText = "";
        if (S("mld_max_history") > 0 && (mldopdrstrej || mldopdrstafm || mldopdrstver) && !mld_key)
          endText = L("lcl_newrows1") + S("mld_max_history") + L("lcl_newrows2");
        return endText;
      }

      var buttons = [];
      var addallowed = false;
      if (mld_key)
      {
        var sqlm = "SELECT COUNT(*) aantal FROM mld_melding WHERE mld_melding_key = " + mld_key;
        var oRs3 = Oracle.Execute(sqlm);
        if (oRs3("aantal").Value == 1) // De mld_key moet ook echt bestaan.
        {
          var this_mld = mld.func_enabled_melding(mld_key);
          addallowed = this_mld.canAddOpdr;
        }
        oRs3.Close();

        if (addallowed)
        {
          var addurl = "appl/mld/mld_opdr.asp?urole=bo&mld_key=" + mld_key;
          if (!inline)
              buttons.push({ icon: "page_refresh.png", title: L("lcl_refresh"), action: "FcltMgr.reload()" });
          // else ooit eens testen/ netjes
          //    buttons.push({ icon: "page_refresh.png", title: L("lcl_refresh"), action: "parent.$('#tdinline').load(window.location.href, resizeWhenInIFrame);" });
          buttons.push({ icon: "plus.png", title: L("lcl_add"), action: "FcltMgr.openDetail('" + addurl + "', '" + L("lcl_add") + "')" });
        }
      }

      // Een kalender met opdrachten tonen; dit is niet zinvol als ik embedded ben
      // Je kunt dit bv afmeten aan tiny of aan het gedefinieerd zijn van een meldingkey
      // In b2 mode zie je minder opdrachten (alleen waar je ORDBO2 voor hebt), dan is de relatie
      // met de kalender verwarrend, dus dan ook liever weg.
      if (!mld_key && urole != 'b2' && urole != 'mi') {
          // Dit is het OCP filter van de persoonselector: *ik* kan een interne contactpersoon zijn
          // Dan is er een kalenderknop om mijn lopende in een overzicht te zien
          // Goedkoper is wellicht of er een exist is van mld_opdr.prs_perslid_key = me
          var csql = "SELECT prs_perslid_key"
                 + " FROM fac_v_webgebruiker f"
                 + ", fac_functie ff"
                 + " WHERE f.fac_functie_key = ff.fac_functie_key"
                 + "   AND prs_perslid_key = " + user_key
                 + "   AND (fac_functie_code = 'WEB_MLDBOF' OR fac_functie_code = 'WEB_MLDBO3')"
                 + "   AND f.fac_gebruiker_prs_level_write <9"
                 + "   AND f.fac_gebruiker_alg_level_write <9";
           var coRs = Oracle.Execute(csql);
           if (!coRs.eof) {
              var calendarurl = 'appl/shared/fullcalendar.asp?worker=opdrlist';
              buttons.push ({ icon: "calendar_1.png", title: L("lcl_calendar"), action: "FcltMgr.openDetail('" + calendarurl + "', '" + L("lcl_mld_opdr_lopende") + "')" });
           }
       }

       if (!frontend)
         buttons.push({ icon: "legenda.png",  title: L("lcl_mld_legenda"), action: "openLegenda()" });

      function fncolFiatteur(oRs)
      {
        if (oRs("mld_statusopdr_key").Value == 3)
          return oRs("fiatteur").Value;
        else
          return "";
      }

      function fncolContractnr(oRs)
      {
        var cnt_nr = oRs("cnt_contract_nummer_intern").Value;
        if (oRs("cnt_contract_versie").Value)
          cnt_nr += "."+oRs("cnt_contract_versie").Value;
        return safe.html(cnt_nr);
      }

      // We really need to suppress columns that are obviously irrelevant for this configuration
      // Fast check to see if we have anything to do with geographics
      var algsql= "SELECT COUNT(*) FROM ins_srtdiscipline WHERE ins_srtdiscipline_alg > 0 AND ins_srtdiscipline_verwijder IS NULL";
      var algoRs = Oracle.Execute(algsql);
      var anyalg = algoRs(0).value > 0;
      algoRs.close();

      // Fast check to see if we have just one opdrachttype
      var otsql= "SELECT COUNT(*) FROM mld_typeopdr";
      var otoRs = Oracle.Execute(otsql);
      var singleOT = otoRs(0).value == 1;
      otoRs.close();

      var rst = new ResultsetTable({ keyColumn: "mld_opdr_key",
                                     ID: "opdrtable",
                                     rowClass: fnrowClass,
                                     rowData: fnrowData,
                                     rowActionEnabler: fnrowActionEnabler,
                                     sql: sql,
                                     flexModule: "OPDR",
                                     flexId: "mld_opdr_key",
                                     flexGroupId: "mld_typeopdr_key", // Flexkenmerken verschillen per opdrachttype (mld_typeopdr_key)
                                     filterParams: params,
                                     outputmode: outputmode,
                                     title: L("lcl_orders"),
                                     inline: inline,
                                     summaryCalc: (!tiny ? fnsummaryCalc : null),
                                     summaryShow: (!tiny ? fnsummaryShow : null),
                                     summaryId : (!tiny && mld_key ? mld_key : null),
                                     endText: fnendText,
                                     showAll: showall,
                                     buttons: buttons
                                  });

      // Gebruik (!tiny) om bepaalde kolommen in compacte mode niet te tonen
      rst.addColumn(new Column({caption: "!", content: fncolSpoed}));
      var nrtooltip = (!tiny ?  "mld_typeopdr_omschrijving" : null);
      rst.addColumn(new Column({caption: L("lcl_shared_order"), content: fncolKey, tooltip: nrtooltip, hasActions: true }));
      rst.addColumn(new Column({caption: L("lcl_opdr_id"), content: "mld_opdr_id", combine:true}));
      if (!singleOT)
      {
        rst.addColumn(new Column({caption: L("lcl_mld_typeopdr"), content: "mld_typeopdr_omschrijving"}));
      }
      if (anyalg)
      {
          rst.addColumn(new Column({caption: L("lcl_district"), content: "alg_district_omschrijving", purpose: PRINTING_ONLY}));
          rst.addColumn(new Column({caption: L("lcl_place"), content: "plaatsmelding"}));
          if (S("mld_print_loc_address") == 1)
            rst.addColumn(new Column({caption: L("lcl_location_address"), content: "alg_locatie_adres", purpose: PRINTING_ONLY}));
    	    if (S("mld_print_loc_address") == 2)
            {
                rst.addColumn(new Column({caption: L("lcl_location_address"), content: "alg_locatie_adres", combine: false}));
                rst.addColumn(new Column({caption: L("lcl_estate_gebouw_man_name"), content: "alg_gebouw_naam", combine: true}));
            }
      }
      if (excel)
      {
        rst.addColumn(new Column({caption: L("lcl_vakgroup_type"), content: "ins_srtdiscipline_omschrijving"}));
        rst.addColumn(new Column({caption: L("lcl_vakgroup"),      content: "ins_discipline_omschrijving"}));
      }

      rst.addColumn(new Column({caption: (cnt_key? L("lcl_cnt_service_name") : L("lcl_complain")), content: "mld_stdmelding_omschrijving"}));
      if (!tiny) {
        rst.addColumn(new Column({caption: L("lcl_mld_opdr_description"), content: "mld_opdr_omschrijving", combine:true}));
      }
      rst.addColumn(new Column({caption: L("lcl_orderdate"), content: "mld_opdr_datumbegin", datatype: "date", nowrap: true}));
      rst.addColumn(new Column({caption: L("lcl_time"), content: "mld_opdr_datumbegin", datatype: "time", combine: true, nomidnight: true}));

      var hasMLD = user.has(["WEB_MLDBOF","WEB_MLDFOF"]);
      if (hasMLD)
      {
        rst.addColumn(new Column({caption: L("lcl_mld_mldstatus"), content: fnMldStatus}));
      }
      rst.addColumn(new Column({caption: L("lcl_mld_opdr_status"), content: fnOpdrStatus, combine: hasMLD}));

      if (S("mld_plandate_in_list") == 1) {
          rst.addColumn(new Column({caption: L("lcl_opdr_plandate"), content: "mld_opdr_plandatum", datatype: "date", nowrap: true}));
          rst.addColumn(new Column({caption: L("lcl_time"), content: "mld_opdr_plandatum", datatype: "time", combine: true, nomidnight: true}));
      }
      rst.addColumn(new Column({caption: L("lcl_opdr_enddate"), content: "mld_opdr_einddatum", datatype: "date", nowrap: true}));
      rst.addColumn(new Column({caption: L("lcl_time"), content: "mld_opdr_einddatum", datatype: "time", combine: true, nomidnight: true}));
      rst.addColumn(new Column({caption: L("lcl_handler"), content: "naam"}));
      if (!tiny)
        if (bes)
            rst.addColumn(new Column({caption: L("lcl_mld_inf_name"), content: "melder"}));
        else
            rst.addColumn(new Column({caption: L("lcl_mld_behandelaar"), content: "behandelaar", combine: true}));
      rst.addColumn(new Column({caption: L("lcl_requestor"), content: "aanvrager", purpose: PRINTING_ONLY}));

      if (cnt_key)
      {
          rst.addColumn(new Column({caption: L("lcl_cnt_contractnr"), content: "cnt_contract_nummer"}));
          rst.addColumn(new Column({caption: L("lcl_cnt_intern_nr"), content: fncolContractnr}));
      }
      if (!tiny && S("mld_show_order_details"))
          rst.addColumn(new Column({caption: L("lcl_mld_inf_Opmerking"), content: "mld_opdr_opmerking"}));   // INKORTEN als niet print??

      if (groepering_key == 2 || groepering_key == 16)
      {
        rst.addColumn(new Column({caption: L("lcl_account"), content: "kpstring"}));
      }

      if (!tiny)
         rst.addColumn(new Column({caption: L("lcl_opdr_kosten") + "&nbsp;(" + L("lcl_valutasign") + ")", content: "mld_opdr_kosten", datatype: "currency", total: true}));
      if (fronto || backo)
         rst.addColumn(new Column({caption: L("lcl_mld_approver"), content: fncolFiatteur}));

      if (groepering_key == 16)
      {
        rst.addColumn(new Column({caption: L("lcl_hours"), content: "mld_opdr_uren", datatype: "currency", total: true}));
        rst.addColumn(new Column({caption: L("lcl_hour_rate") + "&nbsp;(" + L("lcl_valutasign") + ")", content: "mld_opdr_uurloon", datatype: "currency", total: true}));
        rst.addColumn(new Column({caption: L("lcl_mater_cost") + "&nbsp;(" + L("lcl_valutasign") + ")", content: "mld_opdr_materiaal", datatype: "currency", total: true}));
        rst.addColumn(new Column({caption: L("lcl_correct") + "&nbsp;(" + L("lcl_valutasign") + ")", content: "correctie", datatype: "currency", total: true}));
      }
      if (groepering_key == 2 || groepering_key == 16)
      {
        rst.addColumn(new Column({caption: L("lcl_mld_invoiced") + "&nbsp;(" + L("lcl_valutasign") + ")", content: "gefactureerd", datatype: "currency", total: true}));
      }

      // actions conditioneel maken?
      rst.addAction({ action: "opdr_edit", caption: L("lcl_details"), isDefault: true });
      if (urole=="fo" || urole =="bo" || urole =="b2")
      {
        if (!mld_key || addallowed)
            rst.addAction({ action: "opdr_copy", caption: L("lcl_mld_copy"), enabler: "eCopy" });
        if (S("mld_opdr_close") == 0)
        {
          if (tiny)
            rst.addAction({ action: "opdr_close_one", caption: L("lcl_close"), enabler: "eClose", multi: false });
          else
            rst.addAction({ action: "opdr_close", caption: L("lcl_close"), enabler: "eClose", multi: true, multiOnce: true });
        }
        rst.addAction({ action: "opdr_accept", caption: L("lcl_accept"), enabler: "eAccept", multi: true, multiOnce: true });
        rst.addAction({ action: "opdr_finish", caption: L("lcl_opdr_closekosten"), enabler: "eFinish", multi: true, multiOnce: true });
      }
      rst.addAction({ action: "opdr_add_invoice", caption: L("lcl_mld_invoicing"), enabler: "eAddFactuur" });
      rst.addAction({ action: "opdr_list_invoice", caption: L("lcl_mld_invoicing"), enabler: "eListFactuur" });

      var count = rst.processResultset();

    if (!excel && !print)
    {
%>
      <!-- LEGENDA  -->
      <script type="text/javascript">
        function openLegenda()
        {
            params = { width: 250,
                       minWidth: 250,
                       //height: 130,
                       minHeight: 10,
                       resizable: false,
                       position: {my: "right top", at: "right top+30"},
                       title: "<%=L("lcl_mld_legenda")%>"
                     }
            $('div#legenda').dialog(params).dialog('open');
            FcltMgr.resized();
        }
      </script>
    <div id="legenda" style="display:none; line-height: 30px;">
      <table id="opdrachtlegenda">
        <tr>
          <td title="<%= L("lcl_mld_legenda_normal_tt") %>"><%= L("lcl_mld_legenda_normal") %></td>
        </tr>
        <tr class="expired2">
          <td title="<%= L("lcl_mld_legenda_expired2_tt") %>"><%= L("lcl_mld_legenda_expired2") %></td>
        </tr>
        <tr class="updated">
          <td title="<%= L("lcl_mld_legenda_updated_tt") %>"><%= L("lcl_mld_legenda_updated") %></td>
        </tr>
        <tr class="expired2 updated">
          <td title="<%= L("lcl_mld_legenda_expired2_tt") %>/<%= L("lcl_mld_legenda_updated_tt")%>"><%= L("lcl_mld_legenda_expired2") %>/<%= L("lcl_mld_legenda_updated") %></td>
        </tr>
      </table>
      <!-- Geen flags -->
    </div>
<%
    }
%>
    </body>
  </html>
<%
}
%>
