<% /*
     $Revision$
     $Id$
     File:               fin_list.inc
     Description:        Show an overview of invoices in list-form,
                         which meets with the given requirements
     Parameters:
         outputmode      behave in an output mode, print to 0 = screen, 1 = printer, 2 = excel, etc.
         showall         show all orders which meets with the given requirements
         findate_from    search for invoices with the given from date
         findate_to      search for invoices with the given to date
         finnum          search for invoices with the given factuurnr
         fin_bron_key    search for invoices with the given invoice source (0,1,2)
         fin_type        search for invoices with the given fin type (O,B,C)
         opdrnr          search for invoices with the given order number (opdracht nummer)
         finstatus       search for invoices with the given fin status
         debtor          search for invoices with the given debtor
         handler_key     search for invoices with the given handler key
         goedkeur_key    search for invoices with the given goedkeurder key
         embedded        list is used embedded, do not give add opportunity
         sumover         search for invoices with a invoice sum over and above the sumover
         sumbelow        search for invoices with a invoice sum below the sumover
     Context:            Search action from fin_search.asp form
     Note:
*/ %>

<!-- #include file="../Shared/resultset_table_v2.inc" -->
<!-- #include file="../Shared/getkenmerksql.inc" -->
<!-- #include file="../Shared/iface.inc" -->
<!-- #include file="../Shared/status.inc" -->
<!-- #include file="fin.inc" -->

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

function fin_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.outputmode    : print to 0 = screen, 1 = printer, 2 = excel, etc.
  // params.showall       : boolean (true | false)
  // params.datefrom      : findate_from
  // params.dateto        : findate_to
  // params.fin_bron_key  : key (0,1,2)
  // params.fin_type      : string ("O", "C" of "B")
  // params.opdrnr        : wildcard string
  // params.finstatus     : key
  // params.debtor        : wildcard string
  // params.handler_key   : key
  // params.goedkeur_key  : key
  // params.budh_key      : key
  // params.kpgrp_key_arr : array met keys
  // params.sumover       : wildcard currency
  // params.sumbelow      : wildcard currency
  // params.fin_actual    : boolean (true | false)
  // params.fin_deleted   : boolean (true | false)
  // params.reg_key       : key
  // params.dis_key       : key
  // params.loc_key       : key
  // params.bld_key       : key
  // params.verantw_key   : key
  // withflex             : display a flex column if there are any

  var urole = "bo"; // urole nodig om opdracht/contract/bestelling in te zien. Dummie waarde.
  // Geen autfunction bepaald. Je komt bij FIN niet binnen met een bepaalde rol (urole).
  // Nieuw/versimpeld: fac_functie_min_level = 3 (lezen en schrijven)
  // Als ik vervanger ben van iemand met meer rechten dan krijg ik niet zijn rechten. Je blijft je eigen meldingen zien.
  var authparamsEXTFIN = user.checkAutorisation("WEB_EXTFIN", true);
  var authparamsFINFOF = user.checkAutorisation("WEB_FINFOF", true);
  var authparamsFINBOF = user.checkAutorisation("WEB_FINBOF", true);
  var authparamsMLDFIN = user.checkAutorisation("WEB_MLDFIN", true);
  var authparamsFINBOFFOF = user.checkAutorisation(["WEB_FINBOF", "WEB_FINFOF"], true);
  var authparamsFINGOE = user.checkAutorisation("WEB_FINGOE", true);

  var canReadAnyFIN = (user.iamContact() && authparamsEXTFIN) ||
                      authparamsFINFOF ||
                      authparamsFINBOF ||
                      user.isBudgethouder();
  var canReadAny = canReadAnyFIN || authparamsMLDFIN;
  user.auth_required_or_abort(canReadAny);

  // Ik ken 2 varianten: allemaal of alleen de mijne
  var alleenmijnkostenplaatsen = (!(user.iamContact() && authparamsEXTFIN) && !authparamsFINFOF && !authparamsFINBOF && !authparamsMLDFIN);  // geen EXTFIN + contactpers, FINFOF, FINBOF of MLDFIN -> budgethouder.

  var asContactpersoon = user.iamContact() && authparamsEXTFIN && !authparamsFINFOF && !authparamsFINBOF;

  // Voor resulttable de globalen zetten; zou nog 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 findate_from  = params.datefrom;
  var findate_to    = params.dateto;
  var finnum        = params.finnum;
  var fin_bron_key  = params.fin_bron_key;
  var fin_type      = params.fin_type;
  var opdrnr        = params.opdrnr;
  var finstatus     = params.finstatus;
  var debtor        = params.debtor;
  var handler_key   = params.handler_key;
  var goedkeur_key  = params.goedkeur_key;
  var embedded      = params.embedded == 1;
  var sumover       = params.sumover;
  var sumbelow      = params.sumbelow;
  var fin_actual    = params.fin_actual;
  var fin_deleted   = params.fin_deleted;
  var flags         = params.flags;
  var budh_key      = params.budh_key;
  var kpgrp_key_arr = params.kpgrp_key_arr;
  var reg_key       = params.reg_key;
  var dis_key       = params.dis_key;
  var loc_key       = params.loc_key;
  var bld_key       = params.bld_key;
  var verantw_key   = params.verantw_key;
  var withflex      = params.withflex;

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

        $(function() {
          $(".clickParent").parent().on("click", function(e) { e.stopPropagation(); $(this).find("> .clickParent").trigger("click"); });
        });
/*
          function scf_reload (json)
          {
              FcltMgr.reload({ appendurl: "scf_highlight=" + json.key});
          }
          function scf_multiedit(rowArray, isMulti)
          {
            var scfKeyString = getKeyString(rowArray);
            var url = "fin_invoices.asp?mode=edit&id={0}".format(scfKeyString) + "&scf_multi=1";
            FcltMgr.openModalDetail(url, scfKeyString.split(",").length + " ", { callback: scf_reload });
          }
*/
</script>
    </head>

    <body id="listbody">
<%    // Lijst van vervangers + user_key opvragen.
      var prsKeys = user.collegakeylist(); // "user_key, vervangers"

      if (withflex && !excel && !print)
      {
       // Fast check to see if we have any listable flex at all, to prevent superfluous column
       var sql = "SELECT DISTINCT(km.fin_kenmerk_key),"
               + "       fin_kenmerk_omschrijving"
               + "  FROM fin_kenmerk km, fin_kenmerkfactuur fk"
               + " WHERE km.fin_kenmerk_key = fk.fin_kenmerk_key"
               + "   AND BITAND(km.fin_kenmerk_inlijst, 1) = 1"
               + "   AND fk.fin_kenmerkfactuur_verwijder IS NULL"
               + "   AND km.fin_kenmerk_verwijder IS NULL";
       var oRs = Oracle.Execute(sql);
       params.anyflex = !oRs.eof;
       if (params.anyflex)
       {
           params.multiflex = false;
           var flexlabel = oRs("fin_kenmerk_omschrijving").Value;
           oRs.MoveNext();
           if (!oRs.Eof)
           {
               params.multiflex = true;
               flexlabel = L("lcl_flexlist");
           }
       }
       oRs.close();
      }

      // Query factuurlijst opbouwen.
      sql = "SELECT f.fin_factuur_key factuurnr_intern"
          + "     , fin_factuur_verwijder"
          + "     , f.fin_factuur_datum factuur_datum"
          + "     , f.fin_factuur_flag"
          + "     , COALESCE(b.prs_bedrijf_naam,"
          + "                (SELECT " + S("prs_dep_string")
          + "                  FROM prs_v_afdeling d"
          + "                  WHERE d.prs_afdeling_key = c.cnt_prs_afdeling_key),"
          + "                (SELECT pf.prs_perslid_naam_full"
          + "                   FROM prs_v_perslid_fullnames_all pf"
          + "                  WHERE pf.prs_perslid_key = c.cnt_prs_perslid_key)) uitvoerende"
          + "     , b.prs_leverancier_nr"
          + "     , fin_factuur_nr factuurnr_extern"
          + "     , f.mld_opdr_key "
          + "     , f.cnt_contract_key "
          + "     , f.bes_bestelopdr_key"
          + "     , " + S("prs_kpn_string") + " kostenplaats"
          + "     , cd.ins_discipline_omschrijving" // als melding
          + "     , (SELECT MIN(ins_discipline_omschrijving)"
          + "          FROM bes_discipline bd, bes_srtgroep bg, bes_srtdeel bs"
          + "         WHERE bs.bes_srtdeel_key = bb.bes_srtdeel_key"
          + "           AND bg.bes_srtgroep_key = bs.bes_srtgroep_key"
          + "           AND bd.ins_discipline_key = bg.ins_discipline_key) bes_discipline_omschrijving"
          + "     , mld_stdmelding_omschrijving" // als opdracht
          + "     , COALESCE(NVL2(f.mld_opdr_key,  ins_srtdiscipline_prefix  || TO_CHAR(o.mld_melding_key) || '/' || o.mld_opdr_bedrijfopdr_volgnr, NULL),"
            + "              NVL2(f.cnt_contract_key, 'C' || cnt_contract_nummer_intern || NVL2(cnt_contract_versie, '.' || cnt_contract_versie, ''), NULL), "
            + "              NVL2(f.bes_bestelopdr_key, bo.bes_bestelopdr_id, NULL), ' ') opdrachtnr"
          + "     , o.mld_statusopdr_key"
          + "     , o.mld_opdr_kosten"
          + "     , f.fin_factuur_bron"
          + "     , f.fin_factuur_totaal + f.fin_factuur_totaal_btw bedrag_incl_BTW"
          + "     , f.fin_factuur_totaal bedrag_excl_BTW"
          + "     , f.fin_factuur_boekmaand"
          + "     , f.fin_factuur_statuses_key"
          + "     , f.fin_factuur_opmerking"
          + "     , fin.matchfactuur(f.fin_factuur_key) roodgroen"
          + "     , budgethouder"
          + "     , (SELECT pf.prs_perslid_naam_full"
            + "        FROM prs_v_perslid_fullnames_all pf"
            + "       WHERE pf.prs_perslid_key = budgethouder) budgethoudernaam"
          + "     , c.prs_perslid_key_eig"
          + "     , prs_perslid_key_goedkeur"
          + "     , (SELECT max(fin_factuur_note_aanmaak)"
            + "        FROM fin_factuur_note fn"
            + "       WHERE fn.fin_factuur_key = f.fin_factuur_key) notitie_datum"
          + "     , (SELECT fn.fin_factuur_note_omschrijving"
            + "        FROM fin_factuur_note fn"
            + "       WHERE fn.fin_factuur_note_key ="
            + "             (SELECT MAX(fk.fin_factuur_note_key)"
            + "                FROM fin_factuur_note fk"
            + "               WHERE fk.fin_factuur_key = f.fin_factuur_key"
            + "             )) notitie_omschr"
          + "     , (SELECT pf.prs_perslid_naam_full"
            + "        FROM prs_v_perslid_fullnames_all pf"
            + "       WHERE pf.prs_perslid_key = bb.prs_perslid_key) besteller"
          + "     , bb.bestelopdr_totaal"
          + "     , bb.bestelopdr_besteld"
          + "     , bb.bestelopdr_geleverd"
          + "     , bo.bes_bestelopdr_status";

      if (params.anyflex)
      {
          sql += ", (SELECT LISTAGG(" + (params.multiflex ? "fin_kenmerk_omschrijving || ':' || CHR(160) || " : "")
                          + "            CASE"
                          + "            WHEN km.fin_kenmerk_kenmerktype = 'R' OR km.fin_kenmerk_kenmerktype = 'r' OR km.fin_kenmerk_kenmerktype = 'S'"
                          + "            THEN flx.getdomeinwaarde (km.fac_kenmerkdomein_key, fk.fin_kenmerkfactuur_waarde)"
                          + "            WHEN km.fin_kenmerk_kenmerktype = 'N'"
                          + "             AND km.fin_kenmerk_lengte = 1 "
                          + "             AND km.fin_kenmerk_nmin = 0 "
                          + "             AND km.fin_kenmerk_nmax = 1 "
                          + "             AND (km.fin_kenmerk_dec = 0 OR km.fin_kenmerk_dec IS NULL) "
                          + "            THEN DECODE (fk.fin_kenmerkfactuur_waarde, "
                          + "                         0, "+safe.qL("lcl_check_0")+", "
                          + "                         1, "+safe.qL("lcl_check_1")+", "
                          + "                         fk.fin_kenmerkfactuur_waarde)"
                          + "            ELSE fk.fin_kenmerkfactuur_waarde"
                          + "            END, CHR(13)) "
                          + "          WITHIN GROUP (ORDER BY fin_kenmerk_volgnr) "
                          + "     FROM fin_kenmerk km, fin_kenmerkfactuur fk"
                          + "    WHERE km.fin_kenmerk_key = fk.fin_kenmerk_key"
                          + "      AND fk.fin_factuur_key = f.fin_factuur_key"
                          + "      AND BITAND(km.fin_kenmerk_inlijst, 1) = 1"
                          + "      AND km.fin_kenmerk_verwijder IS NULL"
                          + "      AND fk.fin_kenmerkfactuur_verwijder IS NULL) flex";
      }


      // merk op: als budgethouder==user_key dan wordt bes_fiat_write later genegeerd.
      if (!authparamsFINBOFFOF)
        sql += ", 0 bes_fiat_write"
      else if (authparamsFINBOFFOF.ALGwritelevel == -1)
        sql += ", 1 bes_fiat_write"
      else sql +=
          ", COALESCE((SELECT 1"
                    + "  FROM mld_v_afleveradres m"
                    + " WHERE bo.mld_adres_key_lev = m.mld_adres_key"
                    + "   AND m.alg_locatie_key IN (SELECT alg_locatie_key"
                                                + "   FROM fac_v_my_locations"
                                                + "  WHERE prs_perslid_key IN (" + prsKeys + ")"
                                                + "    AND niveau = " + authparamsFINBOFFOF.ALGwritelevel + ")),"
                    + " 0) bes_fiat_write";

      if (!authparamsFINBOFFOF)
        sql += ", 0 mld_fiat_write"
      else if (authparamsFINBOFFOF.ALGwritelevel == -1)
        sql += ", 1 mld_fiat_write"
      else
        sql += ", (SELECT CASE WHEN onrg.alg_type = 'R'"
                       + "          AND m.mld_alg_onroerendgoed_keys IN (SELECT alg_ruimte_key"
                                                                      + "  FROM fac_v_my_rooms"
                                                                      + " WHERE prs_perslid_key IN (" + prsKeys + ")"
                                                                      + "   AND niveau = " + authparamsFINBOFFOF.ALGwritelevel + ")"
                       + "       THEN 1"
                       + " WHEN onrg.alg_type = 'V'"
                       + "          AND m.mld_alg_onroerendgoed_keys IN (SELECT alg_verdieping_key"
                                                                      + "  FROM fac_v_my_floors"
                                                                      + " WHERE prs_perslid_key IN (" + prsKeys + ")"
                                                                      + "   AND niveau = " + authparamsFINBOFFOF.ALGwritelevel + ")"
                       + "       THEN 1"
                       + " WHEN onrg.alg_type = 'G'"
                       + "          AND m.mld_alg_onroerendgoed_keys IN (SELECT alg_gebouw_key"
                                                                      + "  FROM fac_v_my_buildings"
                                                                      + " WHERE prs_perslid_key IN (" + prsKeys + ")"
                                                                      + "   AND niveau = " + authparamsFINBOFFOF.ALGwritelevel + ")"
                       + "       THEN 1"
                       + " WHEN onrg.alg_type = 'T'"
                       + "          AND m.mld_alg_onroerendgoed_keys IN (SELECT t.alg_terreinsector_key"
                                                                      + "  FROM fac_v_my_locations l, alg_terreinsector t"
                                                                      + " WHERE t.alg_locatie_key = l.alg_locatie_key"
                                                                      + "   AND l.prs_perslid_key IN (" + prsKeys + ")"
                                                                      + "   AND l.niveau = " + authparamsFINBOFFOF.ALGwritelevel + ")"
                       + "       THEN 1"
                       + " WHEN m.mld_alg_onroerendgoed_keys IS NULL"
                              + " AND m.mld_alg_locatie_key IN (SELECT alg_locatie_key"
                                                             + "  FROM fac_v_my_locations"
                                                             + " WHERE prs_perslid_key IN (" + prsKeys + ")"
                                                             + "   AND niveau = " + authparamsFINBOFFOF.ALGwritelevel + ")"
                       + "       THEN 1"
                       + "  ELSE 0"
                       + " END"
                       + " FROM alg_v_allonroerendgoed onrg"
                         + " WHERE m.mld_alg_onroerendgoed_keys = onrg.alg_onroerendgoed_keys(+)) mld_fiat_write";

      var prsKeys = user.collegakeylist();
      sql += "  FROM (SELECT fin.getfiatteur(f.fin_factuur_key) budgethouder, f.* from fin_factuur f) f"
                      /* Opdrachten */
          + "         LEFT OUTER JOIN mld_opdr o"
          + "            ON f.mld_opdr_key = o.mld_opdr_key"
          + "         LEFT OUTER JOIN mld_melding m"
          + "            ON o.mld_melding_key = m.mld_melding_key"
          + (authparamsMLDFIN && authparamsMLDFIN.PRSreadlevel > -1
            ? "       LEFT OUTER JOIN prs_perslid p"
              + "        ON m.prs_perslid_key = p.prs_perslid_key"
            : "")
          + "         LEFT OUTER JOIN mld_stdmelding sm"
          + "            ON m.mld_stdmelding_key = sm.mld_stdmelding_key"
          + "         LEFT OUTER JOIN mld_discipline d"
          + "            ON sm.mld_ins_discipline_key = d.ins_discipline_key"
          + "         LEFT OUTER JOIN ins_srtdiscipline sd"
          + "            ON d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key"
                      /* Contracten */
          + "         LEFT OUTER JOIN cnt_contract c"
          + "            ON f.cnt_contract_key = c.cnt_contract_key"
          + "         LEFT OUTER JOIN cnt_discipline cd"
          + "            ON c.ins_discipline_key = cd.ins_discipline_key"
                      /* Bestellingen */
          + "         LEFT OUTER JOIN bes_bestelopdr bo"
          + "            ON f.bes_bestelopdr_key = bo.bes_bestelopdr_key"
          + "         LEFT OUTER JOIN (  SELECT boi.bes_bestelopdr_key"
          + "                                 , MIN (bes_srtdeel_key) bes_srtdeel_key"
          + "                                 , MIN (bb.prs_kostenplaats_key) prs_kostenplaats_key"
          + "                                 , MIN (bb.prs_perslid_key) prs_perslid_key"
          + "                                 , SUM(boi.bes_bestelopdr_item_prijs * boi.bes_bestelopdr_item_aantal) bestelopdr_totaal"
          + "                                 , SUM(boi.bes_bestelopdr_item_aantal) bestelopdr_besteld"
          + "                                 , SUM(boi.bes_bestelopdr_item_aantalontv) bestelopdr_geleverd"
          + "                              FROM bes_bestelling bb"
          + "                                 , bes_bestelopdr_item boi"
          + "                                 , bes_bestelling_item bbi"
          + "                             WHERE bbi.bes_bestelling_key = bb.bes_bestelling_key"
          + "                               AND boi.bes_bestelopdr_item_key = bbi.bes_bestelopdr_item_key"
          + "                          GROUP BY boi.bes_bestelopdr_key) bb"
          + "            ON f.bes_bestelopdr_key = bb.bes_bestelopdr_key"
          + "         LEFT OUTER JOIN prs_kostenplaats k"
          + "            ON k.prs_kostenplaats_key = COALESCE(bb.prs_kostenplaats_key, "
          + "                                                 o.prs_kostenplaats_key, "
          + "                                                 m.prs_kostenplaats_key, "
          + "                                                 c.prs_kostenplaats_key)"
          + (kpgrp_key_arr
            ? "       LEFT OUTER JOIN  prs_kostenplaatsgrp kpg"
              + "        ON k.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key"
            : "")
          + "         LEFT OUTER JOIN prs_bedrijf b"
          + "            ON b.prs_bedrijf_key = COALESCE (o.mld_uitvoerende_keys, c.cnt_prs_bedrijf_key, bo.prs_bedrijf_key)"
          + "         LEFT OUTER JOIN alg_v_allonroerendgoed onrg"
          + "            ON m.mld_alg_onroerendgoed_keys = onrg.alg_onroerendgoed_keys"
      sql += " WHERE 1=1"; // Nu de where clause bouwen

      if (asContactpersoon)
      {
        // Ik mag in het factuuroverzicht een factuur zien als:
        // 1) Ik heb ALG write rechten (WEB_EXTFIN) op
        //    a) het afleveradres van de locatie van de bestelling
        //    b) de plaats van de bijbehorende melding van de opdracht OF
        //    c) de plaats van het bijbehorende contract?
        //    De WEB_EXTFIN rechten zijn alleen van belang als ik contactpersoon ben van het externe bedrijf van de bestelling, melding of contract.
        var sqlArrEXTFIN = [];
        // 1a) Heb ik ALG write rechten (WEB_FINBOF) op het afleveradres van de locatie van de bestelling?
        sql1a = " (f.bes_bestelopdr_key IS NOT NULL "
              + "  AND bo.prs_bedrijf_key IN (SELECT cp.prs_bedrijf_key"
              + "                               FROM prs_contactpersoon cp"
              + "                              WHERE cp.prs_perslid_key IN (" + prsKeys + ")"
              + "                                AND cp.prs_contactpersoon_verwijder IS NULL)"
              + (authparamsEXTFIN && authparamsEXTFIN.ALGreadlevel > -1
                ? " AND bo.mld_adres_key_lev IN (SELECT m.mld_adres_key"
                  + "                              FROM mld_v_afleveradres m"
                  + "                             WHERE m.alg_locatie_key IN (SELECT alg_locatie_key"
                  + "                                                           FROM fac_v_my_locations"
                  + "                                                          WHERE prs_perslid_key IN (" + prsKeys + ")"
                  + "                                                            AND niveau = " + authparamsEXTFIN.ALGreadlevel + "))"
                : "")
              + " )";
        sqlArrEXTFIN.push(sql1a);

        // 1b) Heb ik ALG write rechten (WEB_FINBOF) op de plaats van de bijbehorende melding van de opdracht?
        sql1b = " (f.mld_opdr_key IS NOT NULL "
              + "  AND o.mld_uitvoerende_keys IN (SELECT cp.prs_bedrijf_key"
              + "                                FROM prs_contactpersoon cp"
              + "                               WHERE cp.prs_perslid_key IN (" + prsKeys + ")"
              + "                                 AND cp.prs_contactpersoon_verwijder IS NULL)"
              + (authparamsEXTFIN && authparamsEXTFIN.ALGreadlevel > -1
                ? " AND (  (onrg.alg_type = 'R' "
                  + "       AND m.mld_alg_onroerendgoed_keys IN (SELECT alg_ruimte_key"
                  + "                                               FROM fac_v_my_rooms"
                  + "                                              WHERE prs_perslid_key IN (" + prsKeys + ")"
                  + "                                                AND niveau = " + authparamsEXTFIN.ALGreadlevel + "))"
                  + "    OR (onrg.alg_type = 'V'"
                  + "        AND m.mld_alg_onroerendgoed_keys IN (SELECT alg_verdieping_key"
                  + "                                               FROM fac_v_my_floors"
                  + "                                              WHERE prs_perslid_key IN (" + prsKeys + ")"
                  + "                                                AND niveau = " + authparamsEXTFIN.ALGreadlevel + "))"
                  + "    OR (onrg.alg_type = 'G'"
                  + "        AND m.mld_alg_onroerendgoed_keys IN (SELECT alg_gebouw_key"
                  + "                                               FROM fac_v_my_buildings"
                  + "                                              WHERE prs_perslid_key IN (" + prsKeys + ")"
                  + "                                                AND niveau = " + authparamsEXTFIN.ALGreadlevel + "))"
                  + "    OR (onrg.alg_type = 'T'"
                  + "        AND m.mld_alg_onroerendgoed_keys IN (SELECT t.alg_terreinsector_key"
                  + "                                               FROM fac_v_my_locations l, alg_terreinsector t"
                  + "                                              WHERE t.alg_locatie_key = l.alg_locatie_key"
                  + "                                                AND l.prs_perslid_key IN (" + prsKeys + ")"
                  + "                                                AND l.niveau = " + authparamsEXTFIN.ALGreadlevel + "))"
                  + "    OR (m.mld_alg_onroerendgoed_keys IS NULL"
                  + "        AND m.mld_alg_locatie_key IN (SELECT alg_locatie_key"
                  + "                                        FROM fac_v_my_locations"
                  + "                                       WHERE prs_perslid_key IN (" + prsKeys + ")"
                  + "                                         AND niveau = " + authparamsEXTFIN.ALGreadlevel + "))"
                  + "   )"
                : "")
              + " )";
        sqlArrEXTFIN.push(sql1b);

        // 1c) Heb ik ALG write rechten (WEB_FINBOF) op de plaats van het bijbehorende contract?
        sql1c = " (f.cnt_contract_key IS NOT NULL"
              + "  AND c.cnt_prs_bedrijf_key IN (SELECT cp.prs_bedrijf_key"
              + "                                  FROM prs_contactpersoon cp"
              + "                                 WHERE cp.prs_perslid_key IN (" + prsKeys + ")"
              + "                                   AND cp.prs_contactpersoon_verwijder IS NULL)"
              + (authparamsEXTFIN && authparamsEXTFIN.ALGreadlevel > -1
                ? " AND EXISTS (SELECT cp.CNT_ALG_PLAATS_KEY, cp.CNT_ALG_PLAATS_CODE"
                  + "             FROM cnt_v_aanwezigcontract_plaats cp"
                  + "            WHERE cp.cnt_contract_key = f.cnt_contract_key"
                  + "              AND cp.cnt_contract_plaats_key = COALESCE(f.cnt_contract_plaats_key, cp.cnt_contract_plaats_key)"
                  + "              AND ((cp.cnt_alg_plaats_code = 'G'"
                  + "                    AND cp.cnt_alg_plaats_key IN (SELECT alg_gebouw_key"
                  + "                                                    FROM fac_v_my_buildings"
                  + "                                                   WHERE prs_perslid_key IN (" + prsKeys + ")"
                  + "                                                     AND niveau = " + authparamsEXTFIN.ALGreadlevel + "))"
                  + "                   OR (cp.cnt_alg_plaats_code = 'L'"
                  + "                       AND cp.cnt_alg_plaats_key IN (SELECT alg_locatie_key"
                  + "                                                       FROM fac_v_my_locations"
                  + "                                                      WHERE prs_perslid_key IN (" + prsKeys + ")"
                  + "                                                        AND niveau = " + authparamsEXTFIN.ALGreadlevel + "))"
                  + "                  )"
                  + "          )"
                : "")
              + " )";
        sqlArrEXTFIN.push(sql1c);
        if (sqlArrEXTFIN.length)
          sql += " AND (" + sqlArrEXTFIN.join(" OR ") + ")";
      }

      // Als ik FINFOF rechten heb dan mag ik alle facturen zien en/of wijzigen.
      // Als ik geen FINFOF rechten heb, dan moet ik o.a. de ALG FINBOF, EXTFIN en/of de PRS MLDFIN rechten controleren.
      if (!authparamsFINFOF)
      { // Geen FINFOF (Ja/Nee) rechten!

        // Ik mag in het factuuroverzicht een factuur zien als:
        // 1) Ik heb ALG write rechten (WEB_FINBOF) op
        //    a) het afleveradres van de locatie van de bestelling
        //    b) de plaats van de bijbehorende melding van de opdracht OF
        //    c) de plaats van het bijbehorende contract?
        // 2) Ik ben contracteigenaar van het contract OF
        // 3) Ik ben budgethouder van de BrOC-kostenplaats OF
        // 4) Terzijde als type (mld-cnt-bes) niet bekend/gekozen is, dan moet ik volledig rechten hebben
        // 5) Ik PRS read (WEB_MLDFIN) rechten (authparamsMLDFIN) heb om de financiële (factuur) gegevens te zien die bij een eigen melding of opdracht horen?
        var sqlArr = [];

        // Als geen FINFOF maar wel FINBOF moet ik ook de alg-scope controleren.
        if (authparamsFINBOF && authparamsFINBOF.ALGreadlevel > -1)
        {
          // 1a) Heb ik ALG write rechten (WEB_FINBOF) op het afleveradres van de locatie van de bestelling?
          sql1a = " (f.bes_bestelopdr_key IS NOT NULL "
                 + " AND bo.mld_adres_key_lev IN ("
                              + "SELECT m.mld_adres_key"
                              + "  FROM mld_v_afleveradres m"
                              + " WHERE m.alg_locatie_key IN (SELECT alg_locatie_key"
                                                          + "   FROM fac_v_my_locations"
                                                          + "  WHERE prs_perslid_key IN (" + prsKeys + ")"
                                                          + "    AND niveau = " + authparamsFINBOF.ALGreadlevel + ")))";
          sqlArr.push(sql1a);

          // 1b) Heb ik ALG write rechten (WEB_FINBOF) op de plaats van de bijbehorende melding van de opdracht?
          sql1b = " (f.mld_opdr_key IS NOT NULL "
                + " AND (  (onrg.alg_type = 'R' "
                + "         AND m.mld_alg_onroerendgoed_keys IN (SELECT alg_ruimte_key"
                                                               + "  FROM fac_v_my_rooms"
                                                               + " WHERE prs_perslid_key IN (" + prsKeys + ")"
                                                               + "   AND niveau = " + authparamsFINBOF.ALGreadlevel + "))"
                + "      OR (onrg.alg_type = 'V'"
                + "          AND m.mld_alg_onroerendgoed_keys IN (SELECT alg_verdieping_key"
                                                               + "  FROM fac_v_my_floors"
                                                               + " WHERE prs_perslid_key IN (" + prsKeys + ")"
                                                               + "   AND niveau = " + authparamsFINBOF.ALGreadlevel + "))"
                + "      OR (onrg.alg_type = 'G'"
                + "          AND m.mld_alg_onroerendgoed_keys IN (SELECT alg_gebouw_key"
                                                               + "  FROM fac_v_my_buildings"
                                                               + " WHERE prs_perslid_key IN (" + prsKeys + ")"
                                                               + "   AND niveau = " + authparamsFINBOF.ALGreadlevel + "))"
                + "      OR (onrg.alg_type = 'T'"
                + "          AND m.mld_alg_onroerendgoed_keys IN (SELECT t.alg_terreinsector_key"
                                                               + "  FROM fac_v_my_locations l, alg_terreinsector t"
                                                               + " WHERE t.alg_locatie_key = l.alg_locatie_key"
                                                               + "   AND l.prs_perslid_key IN (" + prsKeys + ")"
                                                               + "   AND l.niveau = " + authparamsFINBOF.ALGreadlevel + "))"
                + "      OR (m.mld_alg_onroerendgoed_keys IS NULL"
                + "          AND m.mld_alg_locatie_key IN (SELECT alg_locatie_key"
                + "                                          FROM fac_v_my_locations"
                + "                                         WHERE prs_perslid_key IN (" + prsKeys + ")"
                + "                                           AND niveau = " + authparamsFINBOF.ALGreadlevel + "))"
                + "     )"
                + ")";
          sqlArr.push(sql1b);

          // 1c) Heb ik ALG write rechten (WEB_FINBOF) op de plaats van het bijbehorende contract?
          sql1c = " EXISTS (SELECT cp.CNT_ALG_PLAATS_KEY, cp.CNT_ALG_PLAATS_CODE"
                + "            FROM cnt_v_aanwezigcontract_plaats cp"
                + "           WHERE cp.cnt_contract_key = f.cnt_contract_key"
                + "             AND cp.cnt_contract_plaats_key = COALESCE(f.cnt_contract_plaats_key, cp.cnt_contract_plaats_key)"
                + "             AND ((cp.cnt_alg_plaats_code = 'G'"
                + "                   AND cp.cnt_alg_plaats_key IN (SELECT alg_gebouw_key"
                + "                                                   FROM fac_v_my_buildings"
                + "                                                  WHERE     prs_perslid_key IN (" + prsKeys + ")"
                + "                                                    AND niveau = " + authparamsFINBOF.ALGreadlevel + "))"
                + "                  OR (cp.cnt_alg_plaats_code = 'L'"
                + "                      AND cp.cnt_alg_plaats_key IN (SELECT alg_locatie_key"
                + "                                                      FROM fac_v_my_locations"
                + "                                                     WHERE     prs_perslid_key IN (" + prsKeys + ")"
                + "                                                       AND niveau = " + authparamsFINBOF.ALGreadlevel + "))"
                + "                 )"
                + "         )";
          sqlArr.push(sql1c);

          // 2) Ben ik contracteigenaar van het contract?
          sql2 = " (f.cnt_contract_key IS NOT NULL "
               + "  AND c.prs_perslid_key_eig  IN (" + prsKeys + "))";
          sqlArr.push(sql2);

          // 3) Ben ik budgethouder van de BrOC-kostenplaats?
          sql3 = " (budgethouder IN (" + prsKeys + "))";
          sqlArr.push(sql3);
        }

        // 4) Als type (mld-cnt-bes) niet bekend/gekozen is, dan moet ik volledig rechten hebben
        // sql4 = " (f.mld_opdr_key IS NOT NULL OR f.cnt_contract_key IS NOT NULL OR f.bes_bestelopdr_key IS NOT NULL)";
        //sqlArr.push(sql4);

        // 5) Heb ik PRS read (WEB_MLDFIN) rechten (authparamsMLDFIN) om de financiële (factuur) gegevens te zien die bij een eigen melding of opdracht horen?
        // Ik mag de factuur zien als:
        // 1) Ik WEB_MLDFIN rechten heb en
        // 2) Ik de melder ben van de melding.
        // WEB_MLDFIN rechten: PRS-scope op facturen waarbij de "eigenaar" bepaald wordt via factuur-->opdracht-->melding-->melder-->afdeling(-->bedrijf_key)
        if (authparamsMLDFIN && authparamsMLDFIN.PRSreadlevel == 0)     // WEB_MLDFIN rechten(1).
        {
          sql5 = "   (m.prs_perslid_key IN (" + prsKeys + ")"          // Melder ben van de melding(2).
               + " OR p.prs_afdeling_key IN"
               + "    (SELECT a.prs_afdeling_key FROM prs_v_afdeling a"
        	     + "      WHERE a.prs_bedrijf_key = " + user.afdeling().prs_bedrijf_key() + ")"
               + "   )";
          sqlArr.push(sql5);
        }
        else if (authparamsMLDFIN && authparamsMLDFIN.PRSreadlevel > 0) // WEB_MLDFIN rechten(1).
        {
          sql5 = "   (m.prs_perslid_key IN (" + prsKeys + ")"          // Melder ben van de melding(2).
               + " OR p.prs_afdeling_key IN"
               + "    (SELECT prs_afdeling_key FROM prs_v_afdeling_familie a"
               + "      WHERE a.prs_afdeling_elder_key IN"
               + "        (SELECT aa.prs_afdeling_elder_key"
               + "           FROM prs_v_afdeling_familie aa"
               + "          WHERE aa.prs_afdeling_key = " + user.prs_afdeling_key()
               + "            AND aa.niveau = " + authparamsMLDFIN.PRSreadlevel + "))"
               + "    )";
          sqlArr.push(sql5);
        }

        if (sqlArr.length)
            sql += " AND (" + sqlArr.join(" OR ") + ")";
      }

      if (kpgrp_key_arr)
        sql += " AND kpg.prs_kostenplaatsgrp_key IN (" + kpgrp_key_arr.join(", ") + ")";

      // Het eindlevel van de FCLTplaatsselector is Gebouw(3).
      // Het startlevel kan gekozen zijn (Regio(0), District(1), Locatie(1) of Gebouw(3)).
      // Dus als bld_key een geldige waarde heeft, wil niet zeggen dat loc_key, dis_key en reg_key ook een geldige waarde hebben.
      var dis_key_arr = [];
      var loc_key_arr = [];

      if (bld_key)
      { // Zoek de locatie die bij het gekozen gebouw hoort.
        sqlb = "SELECT l.alg_locatie_key"
             + "  FROM alg_locatie l"
             + "     , alg_gebouw g"
             + " WHERE l.alg_locatie_key = g.alg_locatie_key"
             + "   AND g.alg_gebouw_key = " + bld_key;
        var oRsb = Oracle.Execute(sqlb);
        while (!oRsb.eof)
        {
          loc_key_arr.push(oRsb("alg_locatie_key").Value);
          oRsb.MoveNext();
        }
        oRsb.Close();
      }
      else if (loc_key)
      {
        loc_key_arr.push(loc_key);
      }
      else
      {
        if (dis_key)
        {
          dis_key_arr.push(dis_key);
        }
        else if (reg_key)
        { // Zoek alle districtn die bij het gekozen regio horen.
          sqld = "SELECT alg_district_key"
               + "  FROM alg_district"
               + " WHERE alg_regio_key = " + reg_key;
          var oRsd = Oracle.Execute(sqld);
          while (!oRsd.eof)
          {
            dis_key_arr.push(oRsd("alg_district_key").Value);
            oRsd.MoveNext();
          }
          oRsd.Close();
        }

        if (dis_key_arr.length > 0)
        {
          // Zoek alle locaties die bij het gekozen regio/district horen.
          sqld = "SELECT alg_locatie_key"
               + "  FROM alg_locatie"
               + " WHERE alg_district_key IN (" + dis_key_arr.join(",") + ")";
          var oRsd = Oracle.Execute(sqld);
          while (!oRsd.eof)
          {
            loc_key_arr.push(oRsd("alg_locatie_key").Value);
            oRsd.MoveNext();
          }
          oRsd.Close();
        }
      }

      if (loc_key_arr.length > 0)
      {
        // Als alleen reg_key en/of dis_key bekend is dan zoeken voor alle loc_key bij deze reg_key en/of dis_key.
        // 1) Het afleveradres van de locatie van de bestelling (bld_key is niet bekend/gedefinieerd)
        sql1 = " (f.bes_bestelopdr_key IS NOT NULL "
               + " AND bo.mld_adres_key_lev IN ("
                            + "SELECT m.mld_adres_key"
                            + "  FROM mld_v_afleveradres m"
                            + " WHERE m.alg_locatie_key IN (" + loc_key_arr.join(",") + ")))";

        // 2) De plaats van de bijbehorende melding van de opdracht
        sql2 = " (f.mld_opdr_key IS NOT NULL "
             + " AND EXISTS (SELECT m.mld_melding_key"
                     + "       FROM alg_v_allonroerendgoed onrg"
                     + "      WHERE m.mld_alg_onroerendgoed_keys = onrg.alg_onroerendgoed_keys(+)"
                     + "        AND onrg.alg_locatie_key IN (" + loc_key_arr.join(",") + ")"
                     + (bld_key
                       ? "      AND (  (onrg.alg_gebouw_key = " + bld_key + ")"
                         + "        OR (onrg.alg_terreinsector_key = " + bld_key + ")"
                         + "        )"
                       : "")
                     + "    ))";

        // Locatie/gebouw scope van het contract
        sql3 = " (c.cnt_contract_key IN"
             + "   (SELECT cnt_contract_key"
             + "      FROM cnt_v_aanwezigcontract_plaats"
             + "     WHERE (cnt_alg_plaats_code = 'L' AND cnt_alg_plaats_key IN (" + loc_key_arr.join(",") + "))";
        if (bld_key)
        {
          sql3 += "     OR (cnt_alg_plaats_code = 'G' AND cnt_alg_plaats_key = " + bld_key + ")"
                + "     OR (cnt_alg_plaats_code = 'T' AND cnt_alg_plaats_key = " + bld_key + ")";
        }
        else
        {
          sql3 += "     OR (cnt_alg_plaats_code = 'G' AND cnt_alg_plaats_key IN "
                + "        (SELECT alg_gebouw_key FROM alg_v_aanweziggebouw WHERE alg_locatie_key IN (" + loc_key_arr.join(",") + "))"
                + "     OR cnt_alg_plaats_code = 'T' AND cnt_alg_plaats_key IN "
                + "        (SELECT alg_terreinsector_key FROM alg_v_aanwezigterreinsector WHERE alg_locatie_key IN (" + loc_key_arr.join(",") + ")))";
        }
        sql3 += "     UNION"
              + "    SELECT cnt_contract_key"
              + "      FROM cnt_v_aanwezigcontract_object co"
              + "         , ins_v_aanwezigdeel ad"
              + "     WHERE cnt_ins_deel_key = ad.ins_deel_key AND ad.ins_alg_locatie_key IN (" + loc_key_arr.join(",") + ")))";

        sql += "AND (" + sql1 + " OR " + sql2 + " OR " + sql3 + ")";
      }
      else if (reg_key > 0 || dis_key > 0)
      { // Er is geen enkele locatie die bij het gekozen regio en/of district hoort. Dan kunnen er ook geen resultaten zijn.
        sql += " AND 1=0";
      }

      if (verantw_key)
      {
        // 1) Zijn gebouwen staan op de locatie van het afleveradres van de bestelling.
        sql1 = " (f.bes_bestelopdr_key IS NOT NULL "
             + "  AND bo.mld_adres_key_lev IN"
             + "      (SELECT m.mld_adres_key"
             + "         FROM mld_v_afleveradres m"
             + "        WHERE m.alg_locatie_key IN"
                        + "  ( SELECT g.alg_locatie_key"
                        + "      FROM alg_v_aanweziggebouw g"
                        + "     WHERE g.prs_perslid_key_verantw = " + verantw_key
                        + "        OR g.prs_perslid_key_verantw2 = " + verantw_key
                        + "    UNION"
                        + "    SELECT t.alg_locatie_key"
                        + "      FROM alg_v_aanwezigterreinsector t"
                        + "     WHERE t.prs_perslid_key_verantw = " + verantw_key
                        + "        OR t.prs_perslid_key_verantw2 = " + verantw_key
                        + "  )"
             + "      )"
             + " )";

        // 2) Zijn gebouwen staan op de locatie van de bijbehorende melding van de opdracht.
        sql2 = " (f.mld_opdr_key IS NOT NULL "
             + "  AND EXISTS (SELECT m.mld_melding_key"
                          + "   FROM alg_v_onroerendgoed aog"
                          + "      , alg_v_aanweziggebouw g"
                          + "  WHERE m.mld_alg_onroerendgoed_keys = aog.alg_onroerendgoed_keys(+)"
                          + "    AND aog.alg_gebouw_key = g.alg_gebouw_key"
                          + "    AND (  g.prs_perslid_key_verantw = " + verantw_key
                          + "        OR g.prs_perslid_key_verantw2 = " + verantw_key
                          + "        )"
                          + " UNION"
                          + " SELECT m.mld_melding_key"
                          + "   FROM alg_v_onroerendgoed aog"
                          + "      , alg_v_aanwezigterreinsector t"
                          + "  WHERE m.mld_alg_onroerendgoed_keys = aog.alg_onroerendgoed_keys(+)"
                          + "    AND aog.alg_terreinsector_key = t.alg_terreinsector_key"
                          + "    AND (  t.prs_perslid_key_verantw = " + verantw_key
                          + "        OR t.prs_perslid_key_verantw2 = " + verantw_key
                          + "        )"
                          + ")"
             + ")";

        // 3) Zijn gebouwen staan in de locatie/gebouw (object) scope van het contract.
        sql3 = " (c.cnt_contract_key IN"
                    + " (SELECT cnt_contract_key"
                    + "    FROM cnt_v_aanwezigcontract_plaats ccp"
                    + "       , alg_v_aanweziggebouw g"
                    + "   WHERE (  (   ccp.cnt_alg_plaats_key = g.alg_locatie_key"
                    + "            AND ccp.cnt_alg_plaats_code = 'L'"
                    + "            )"
                    + "         OR (   ccp.cnt_alg_plaats_key = g.alg_gebouw_key"
                    + "            AND cnt_alg_plaats_code = 'G'"
                    + "            )"
                    + "         )"
                    + "     AND (  g.prs_perslid_key_verantw  = " + verantw_key
                    + "         OR g.prs_perslid_key_verantw2 = " + verantw_key
                    + "         )"
                    + "  UNION"
                    + "  SELECT cnt_contract_key"
                    + "    FROM cnt_v_aanwezigcontract_plaats ccp"
                    + "       , alg_v_aanwezigterreinsector t"
                    + "   WHERE (    ccp.cnt_alg_plaats_key = t.alg_terreinsector_key"
                    + "         AND cnt_alg_plaats_code = 'T'"
                    + "         )"
                    + "    AND (  t.prs_perslid_key_verantw  = " + verantw_key
                    + "        OR t.prs_perslid_key_verantw2 = " + verantw_key
                    + "        )"
                    + "  UNION"
                    + "  SELECT cnt_contract_key"
                    + "    FROM cnt_v_aanwezigcontract_object co"
                    + "       , ins_v_aanwezigdeel            ad"
                    + "       , alg_v_allonroerendgoed        aaor"
                    + "       , alg_v_aanweziggebouw          g"
                    + "   WHERE cnt_ins_deel_key = ad.ins_deel_key"
                    + "     AND ad.ins_alg_ruimte_key = aaor.alg_onroerendgoed_keys"
                    + "     AND ad.ins_alg_ruimte_type IN ('R', 'W')"
                    + "     AND aaor.alg_gebouw_key = g.alg_gebouw_key"
                    + "     AND (  g.prs_perslid_key_verantw = "  + verantw_key
                    + "         OR g.prs_perslid_key_verantw2 = " + verantw_key
                    + "         )"
                    + "  UNION"
                    + "  SELECT cnt_contract_key"
                    + "    FROM cnt_v_aanwezigcontract_object co"
                    + "       , ins_v_aanwezigdeel            ad"
                    + "       , alg_v_allonroerendgoed        aaor"
                    + "       , alg_v_aanwezigterreinsector   t"
                    + "   WHERE cnt_ins_deel_key = ad.ins_deel_key"
                    + "     AND ad.ins_alg_ruimte_key = aaor.alg_onroerendgoed_keys"
                    + "     AND ad.ins_alg_ruimte_type IN ('T')"
                    + "     AND aaor.alg_terreinsector_key = t.alg_terreinsector_key"
                    + "     AND (  t.prs_perslid_key_verantw = "  + verantw_key
                    + "         OR t.prs_perslid_key_verantw2 = " + verantw_key
                    + "         )"
                    + " )"
             + " )";

        sql += " AND (" + sql1 + " OR " + sql2 + " OR " + sql3 + ")";
      }

      if (finnum) // mag fin_key of fin_factuur_nr zijn
        sql += " AND (f.fin_factuur_key = fac.safe_to_number(" + safe.quoted_sql(finnum) + ") OR UPPER(f.fin_factuur_nr) LIKE " + safe.quoted_sql_wild(finnum) + ")";

      if (budh_key)
        sql += " AND budgethouder = " + budh_key;

      if (fin_type == "O")
        sql += " AND f.mld_opdr_key IS NOT NULL";
      if (fin_type == "C")
        sql += " AND f.cnt_contract_key IS NOT NULL";
      if (fin_type == "B")
        sql += " AND f.bes_bestelopdr_key IS NOT NULL";

      sql += (fin_bron_key ? " AND f.fin_factuur_bron = " + fin_bron_key : "");

      if (findate_from)
      {
       sql += " AND f.fin_factuur_datum >= " + findate_from.beginToSQL();
      }
      if (findate_to)
      {
        sql += " AND f.fin_factuur_datum < " + findate_to.endToSQL();
      }
      if (opdrnr)
      {
        var subsql=[];
        var ii=0;
        // Je kunt zoeken op dezelfde manier als je invoert of we in de kolom tonen
        // Maar we negeren de sub-aanduidingen (volgnummers, versies)
        var ref_s = opdrnr.split(/[\/\.]/);     // array met het deel voor en na de /, voor mld en bes
        var volgnr = null;
        var ordbase = opdrnr;
        if (ref_s.length > 1)
        {
            ordbase = ref_s[0];
            volgnr = parseInt(ref_s[1]);
        }
        var firstIsDigit = (ordbase.charCodeAt(0) >= 48 && ordbase.charCodeAt(0) <= 57);
        var secondIsDigit = (ordbase.charCodeAt(1) >= 48 && ordbase.charCodeAt(1) <= 57);
        if (!fin_type || fin_type == "O")
        { // Melding opdrachten.
          // Als er geen prefix aanwezig is, dan is het een bestelling of toch een meldingopdracht.
          if (firstIsDigit)
          {
            subsql[ii++] = "(o.mld_melding_key = " + parseInt(ordbase,10)
                         + (volgnr
                           ? " AND o.mld_opdr_bedrijfopdr_volgnr = " + volgnr
                           : "")
                         + ")";
          }
          else
          {
            var prefix = null;
            var sqlvt = "SELECT UPPER(isd.ins_srtdiscipline_prefix) prefix"
                      + "  FROM ins_srtdiscipline isd"
                      + " WHERE isd.ins_srtdiscipline_module = 'MLD'"
                      + " ORDER BY isd.ins_srtdiscipline_prefix DESC";
            var oRs = Oracle.Execute(sqlvt);
            while (!oRs.eof)
            {
              if (oRs("prefix").Value && ordbase.toUpperCase().indexOf(oRs("prefix").Value) == 0) break;
              oRs.MoveNext();
            }
            if (!oRs.eof)
            {
              prefix = oRs("prefix").Value; // prefix is uppercase.
              ordbase = ordbase.substr(prefix.length); // ordbase is nu alleen een getal indien een meldingopdracht is ingevoerd.
            }

            // Als prefix geen waarde heeft (null) dan is er geen ins_srtdiscipline gevonden en is het geen melding.
            if (prefix && parseInt(ordbase,10))
              subsql[ii++] = "(o.mld_melding_key = " + parseInt(ordbase,10) + " AND UPPER(sd.ins_srtdiscipline_prefix) = " + safe.quoted_sql_wild(prefix)
                           + (volgnr
                             ? " AND o.mld_opdr_bedrijfopdr_volgnr = " + volgnr
                             : "")
                           + ")";
          }
        }
        if (!fin_type || fin_type == "C")
        { // Contracten.
          // Het eerste teken moet een 'c' of 'C' zijn en het tweede teken een cijfer.
          if (ordbase.toUpperCase().indexOf('C') == 0 && secondIsDigit)
            subsql[ii++] = " ('C' || c.cnt_contract_nummer_intern LIKE " + safe.quoted_sql_wild(ordbase)
                         + (volgnr
                           ? " AND c.cnt_contract_versie = " + volgnr
                           : "")
                         + ")";
          else
            subsql[ii++] = "1 = 2"; // Geen resultaten weergeven voor contracten.
        }
        if (!fin_type || fin_type == "B")
        { // Bestellingen
          if (firstIsDigit)
            subsql[ii++] = " (bo.bes_bestelopdr_id LIKE " + safe.quoted_sql_wild(opdrnr + "%") + ")";
          else
            subsql[ii++] = "1 = 2"; // Geen resultaten weergeven voor bestellingen.
        }
        if (subsql.length > 0)
          sql += " AND (" + subsql.join(" OR ") + ")";
      }
      if (handler_key)
        sql += " AND b.prs_bedrijf_key = " + handler_key;

      // Maken we gebruik van beperkte relaties?
      lsql= "SELECT 1 FROM prs_bedrijf_bedrijf WHERE ROWNUM = 1";
      loRs = Oracle.Execute(lsql);
      var anybb = !loRs.eof;
      loRs.close();
      if (anybb && !user.has("WEB_FINMSU")) // FINMSU is niet gebonden door bedrijf-scope
      {
          // Dan mogen het alleen facturen zijn van bedrijven waar ik zaken mee doe.
          // Echter: die bedrijven kunnen ook met anderen zaken doen, en die facturen moeten we natuurlijk niet tonen.
          // Gaat dat beide kanten op? Voorbeeld uit de MARX-hoek:
          // 1. als ik als woco inlog zie ik facturen van leveranciers waar ik zaken mee doe *van opdrachten van mijzelf*
          // 2. als ik als leverancier inlog zie ik facturen van mijzelf, maakt niet uit aan wie; dan hoeft het dus niet scherper.
          // Geldt dat eigenlijk niet altijd? Jawel, maar regel je 2 met EXTFIN en 1 is vanzelfsprekend als je het enige bedrijf bent.
          // Is dan dus overbodig en best duur, dus liever vermijden.

          // als ik de leverancier ben: mijn facturen; die route loopt via contactpersoon he.
          // doet hetzelfde als wanneer de default handler_key is meegegeven maar nu sowieso, wat je ook meegeeft.
          var sqlL = "(b.prs_bedrijf_key IN "
                   + "(SELECT cp.prs_bedrijf_key"
                   + "   FROM prs_contactpersoon cp"
                   + "  WHERE cp.prs_perslid_key = " + user_key + "))";

          // anders over zaken waarvoor ik opdracht gaf. Dit baseren we gewoon op de feiten, hier hoeven we prs_bedrijf_bedrijf niet voor te raadplegen
          // er zijn drie routes om tot de BrOC van onszelf te beperken:
          sql1b = " (f.bes_bestelopdr_key IS NOT NULL "
                + " AND (SELECT prs_bedrijf_key FROM prs_v_afdeling_boom dd, prs_perslid pp WHERE dd.prs_afdeling_key = pp.prs_afdeling_key AND pp.prs_perslid_key = bb.prs_perslid_key) = "+ user.afdeling().prs_bedrijf_key() + ")";

          sql1a = " (f.mld_opdr_key IS NOT NULL "
                  + " AND (SELECT prs_bedrijf_key FROM prs_v_afdeling_boom dd, prs_perslid pp WHERE dd.prs_afdeling_key = pp.prs_afdeling_key AND pp.prs_perslid_key = m.prs_perslid_key) = "+ user.afdeling().prs_bedrijf_key() + ")";

          sql2 = " (f.cnt_contract_key IS NOT NULL "
                  + " AND (SELECT prs_bedrijf_key FROM prs_v_afdeling_boom dd, prs_perslid pp WHERE dd.prs_afdeling_key = pp.prs_afdeling_key AND pp.prs_perslid_key = c.prs_perslid_key_eig) = "+ user.afdeling().prs_bedrijf_key() + ")";

          var sqlZ = "(" + sql1a + " OR " + sql1b + " OR " + sql2 + ")";
          sql += " AND (" + sqlL + " OR " + sqlZ + ")";
      }

      if (goedkeur_key)
        sql += " AND f.prs_perslid_key_goedkeur = " + goedkeur_key;

      if (finstatus)
        sql += " AND f.fin_factuur_statuses_key = " + finstatus;

      if (debtor)
        sql += " AND UPPER(f.fin_factuur_debiteur_nr) LIKE " + safe.quoted_sql_wild(debtor);

      if (params.opdr_key)
        sql += " AND f.mld_opdr_key = " + params.opdr_key;
      if (params.ks_key)
        sql += " AND COALESCE(f.prs_kostensoort_key, o.prs_kostensoort_key, sm.prs_kostensoort_key) = " + params.ks_key;  // weet niet of we o hier altijd hebben, maar wel bij BGT waar we ks_key gebruiken.
      if (params.bes_key)
        sql += " AND f.bes_bestelopdr_key = " + params.bes_key;
      if (params.cnt_key)
        sql += " AND f.cnt_contract_key = " + params.cnt_key;
      if (sumover)
        sql += " AND f.fin_factuur_totaal >= " + sumover;
      if (sumbelow)
        sql += " AND f.fin_factuur_totaal <= " + sumbelow;

      if (!fin_deleted)
        sql += " AND f.fin_factuur_verwijder IS NULL";
      else if (!fin_actual)
        sql += " AND f.fin_factuur_verwijder IS NOT NULL";

      if (flags && flags.length > 0 && flags.length < S("fin_factuur_flags"))
      {
        var filterNull = false;

        for (var i = 0; i < flags.length; i++)
        {
         if (flags[i] === 0)
           filterNull = true;
        }

        sql += " AND (f.fin_factuur_flag IN (" + flags.join(",") + ")";
        if (filterNull)
          sql += " OR f.fin_factuur_flag IS NULL";
        sql += ")";
      }

      // Vooralsnog hanteer ik dan maar deze methodiek:
      // - als ik WEB_FINxOF READ heb, zie ik alles
      // - als ik geen WEB_FINxOF heb, zie alleen de facturen van kostenplaatsen waarvan ik budgethouder ben

      if (alleenmijnkostenplaatsen)
      {
        // beperkt tot mijn kostenplaatsen
        sql += " AND budgethouder IN (" + prsKeys + ")";
      }

      // Nu filtercondities voor flexkenmerken toevoegen
      sql += getKenmerkSql("FIN", "f.fin_factuur_key");

      sql += " ORDER BY f.fin_factuur_key";

      /**********************************
       * Callback functies ResultsetTable
       *********************************/

      function fnrowClass(oRs)
      {
        var result = "";
        if (oRs("fin_factuur_verwijder").Value != null)
          result = " deleted";
        else if (oRs("roodgroen").Value < 0)
          result = " outsidemargin";
        else if (oRs("roodgroen").Value > 0)
          result = " withinmargin";
        else if (oRs("fin_factuur_statuses_key").Value == 1)
          result = " rejected"; // was deleted

        if (oRs("bes_bestelopdr_key").Value != null)
        { // type=bestelling
          var besteld = oRs("bestelopdr_besteld").Value;
          var geleverd = oRs("bestelopdr_geleverd").Value;
          var besstatus = oRs("bes_bestelopdr_status").Value;
          if (  besstatus == 4      // in bestelling
             || geleverd == 0       // nog niets geleverd
             || besteld > geleverd) // nog niet alles geleverd
          {
              result += " finattentionlist";
          }
        }
        return result;
      }

      var factuurTotalex = 0;
      var factuurTotalinc = 0;
      function fnsummaryCalc(oRs)
      {
        if (oRs("fin_factuur_statuses_key").Value != 1   // 1 niet; 3 is wel een geldige factuur in principe
             && oRs("fin_factuur_verwijder").Value == null)
        {
            factuurTotalex += oRs("bedrag_excl_BTW").Value;
            factuurTotalinc += oRs("bedrag_incl_BTW").Value;
        }
      }

      function fnsummaryShow()
      {
        return L("lcl_fin_totaal_bedrag") + " "
             + S("currency_pref") + " " + safe.curr(factuurTotalex) + " / "
             + L("lcl_fin_totaal_bedrag_btw") + " " + S("currency_pref") + " " + safe.curr(factuurTotalinc);
      }
      function fnrowData(oRs)
      {
        var data = {
                     mld_opdr_key: oRs("mld_opdr_key").Value,
                     cnt_contract_key: oRs("cnt_contract_key").Value,
                     bes_bestelopdr_key: oRs("bes_bestelopdr_key").Value };
        return JSON.stringify(data);
      }

      // true als de regel getoond dient te worden.
      function fnrowFilter(oRs)
      {
        if (canReadAnyFIN)
          return true;

        var mld_opdr_key = oRs("mld_opdr_key").Value || -1;
        // Ik heb GEEN canReadAnyFIN rechten maar WEL canReadAny rechten. Dan heb ik WEB_MLDFIN rechten.
        if (canReadAny && mld_opdr_key > 0)
        { // De referentie van de factuur is een meldingsopdracht.
          // Ik heb alleen MLDFIN rechten (authparamsMLDFIN) om de financiële (factuur) gegevens te zien die bij een eigen melding of opdracht horen.
          // Ik mag de factuur zien als:
          // 1) Ik WEB_MLDFIN rechten heb en
          //    (geen canReadAnyFIN, wel canReadAny => MLDFIN)
          // 2) Ik de melder ben van de melding.
          var mld_opdr = mld.mld_opdr_info(mld_opdr_key);
          if (user.isCollega(mld_opdr.melding_user_key)) // Melder ben van de melding(2).
            return true;
        }

        return false;
      }

      function fnrowActionEnabler(oRs)
      {
        var deleted = (oRs("fin_factuur_verwijder").Value != null)
        var eEdit = !deleted; // Always true

        // Kan ik naar het item waar de factuur bij hoort?
        // Niet als ik al in een subframe van datzelfde item ben
        var eOrder = !embedded && (oRs("opdrachtnr").Value != " ") && !deleted && !params.opdr_key;

        // Fiateer en Verwijder
        // Afhankelijk van status en of er een referentie is opgegeven, de button grijs weergeven
        // Als status > 2 dan is er zeker een referentie bekend.
        // Fiateren ook afhankelijk of budgethouder binnen de organisatiescope ligt
        // Verwijderen: Write rechten voor WEB_FINFOF nodig
        // Fiateren: Ik kan facturen goedkeuren als: 1) ik heb ALG write rechten (WEB_FINBOF) op
        //                                              a) het afleveradres van de locatie van de bestelling
        //                                              b) de plaats van de bijbehorende melding van de opdracht OF
        //                                           2) ik ben budgethouder van de BrOC-kostenplaats (BrOC = Bestelling, /*reservering*/, Opdracht, Contract)
        var budgethouder = oRs("budgethouder").Value;
        var contracteigenaar = oRs("prs_perslid_key_eig").Value;
        var besmldfiat_write = false;
        var fiat_write = false;

        if (oRs("bes_bestelopdr_key").Value)
          besmldfiat_write = (oRs("bes_fiat_write").Value == 1) // Ik heb write rechten op de locatie van het afleveradres
        else if (oRs("mld_opdr_key").Value)
          besmldfiat_write = (oRs("mld_fiat_write").Value == 1) // Ik heb write rechten op de plaats van de bijbehorende melding
        else // opd_cnt_bes_type is nog niet bekend/gekozen, dan moet ik volledig rechten hebben
          fiat_write = (authparamsFINBOF && authparamsFINBOF.ALGwritelevel == -1);
        var canapprove = (user.isCollega(oRs("budgethouder").Value) || besmldfiat_write || fiat_write) && !deleted; // Budgethouder IN (user_key, vervangers).

        var eDelete   = !embedded &&
                        (authparamsFINFOF &&
                         authparamsFINFOF.PRSwritelevel < 9 &&
                         (oRs("fin_factuur_statuses_key").Value == 2 || oRs("fin_factuur_statuses_key").Value == 3))  &&
                         !deleted;
        var eApprove  = !embedded &&
                        (canapprove &&
                         oRs("fin_factuur_statuses_key").Value == 2 &&
                         oRs("opdrachtnr").Value != " ") &&
                         !deleted;
        var eUnapprove  = !embedded &&
                          (canapprove &&
                           oRs("fin_factuur_statuses_key").Value == 6 &&
                           oRs("opdrachtnr").Value != " ") &&
                           !deleted;
        var eRejectApprove = S("fin_enable_afwijzen") == 1 && eApprove;
        var eUnreject = !embedded &&
                        (eApprove &&
                         oRs("fin_factuur_statuses_key").Value == 1 &&
                         oRs("opdrachtnr").Value != " ") &&
                         !deleted;

        var eGoedkeur =!embedded &&
                        S("fin_enable_afwijzen") == 1 && S("fin_enable_goedkeuren") != 0 &&
                        authparamsFINGOE &&
                        authparamsFINGOE.PRSwritelevel < 9 &&
                        user.isCollega(oRs("prs_perslid_key_goedkeur").Value) && // Goedkeurder IN (user_key, vervangers).
                        oRs("fin_factuur_statuses_key").Value == 5;
        var eRejectGoedkeur = eGoedkeur;

        var data = {eEdit: eEdit,
                    eOrder: eOrder,
                     eApprove: eApprove,
                     eUnapprove: eUnapprove,
                     eRejectApprove: eRejectApprove,
                     eRejectGoedkeur: eRejectGoedkeur,
                     eUnreject: eUnreject,
                     eDelete: eDelete,
                     eGoedkeur: eGoedkeur};
        return data;
      }

      function fnstatusOms(oRs)
      {
        var finStatusKey = oRs("fin_factuur_statuses_key").Value;
        return fin.getfinstatustext(finStatusKey);
      }

      buttons = [];
      if (embedded)
      {
             buttons.push({ icon: "fa-fclt-refresh", title: L("lcl_refresh"), action: "FcltMgr.reload()" });
      }
      if (!embedded && ((authparamsFINFOF && authparamsFINFOF.PRSwritelevel < 9) || (authparamsEXTFIN && authparamsEXTFIN.PRSwritelevel < 9)))
      {
        var addurl = "appl/fin/fin_factuur.asp?fin_key=-1";
        addurl += buildTransitParam(["cnt_key", "opdr_key", "bes_key", "referentie"], params);
        buttons.push({ icon: "fa-plus", title: L("lcl_add"), action: "FcltMgr.openDetail('" + addurl + "', '" + safe.jsstring(L("lcl_add")) + "')" });
        buttons.push({ icon: "fa-list-ul",  title: L("lcl_fin_legenda"), action: 'openLegenda()' });

        var fac_import_app_key = S("fin_import_app_key");
        if (S("fin_import_app_key") == -1) { // bepaal dan de key van de standaard factuurimportfunctie
            var fisql = "SELECT MAX(fac_import_app_key) fac_import_app_key"
                      + "  FROM fac_import_app fia"
                      + " WHERE fac_import_app_code = 'FACTUUR'"
                      + "   AND fia.fac_functie_key IN"
                      + "        (SELECT wg.fac_functie_key"
                      + "           FROM fac_v_webgebruiker wg"
                      + "          WHERE wg.prs_perslid_key = " + user_key
                      + "            AND wg.fac_gebruiker_alg_level_read < 9"
                      + "            AND wg.fac_gebruiker_prs_level_read < 9)";
            var fioRs = Oracle.Execute(fisql);
            if (!fioRs.eof)
            {
                fac_import_app_key = fioRs("fac_import_app_key").Value;
            }
            fioRs.close();
        }
        if (fac_import_app_key > -1 && (authparamsFINFOF && authparamsFINFOF.PRSwritelevel < 9)) {
            var impurl = "appl/imp/imp_search.asp?import_app_key=" + fac_import_app_key;
            buttons.push({ icon: "fa-upload", title: L("lcl_import"), action: "FcltMgr.openDetail('" + impurl + "', '" + safe.jsstring(L("lcl_import")) + "')" });
        }
      }

      function fnOpdrtype(oRs)
      {
        if (oRs("mld_opdr_key").Value)
          return L("lcl_fin_mld_opdr");
        else if (oRs("cnt_contract_key").Value)
          return L("lcl_fin_cnt_contract");
        else if (oRs("bes_bestelopdr_key").Value)
          return L("lcl_fin_bestelling");
        else return "";
      }

      function fnBron(oRs)
      {
        return fin.getfinbrontext(oRs("fin_factuur_bron").Value);
      }

      function fnOpdrtypeOms(oRs)
      {
        if (oRs("mld_opdr_key").Value)
          return safe.html(oRs("mld_stdmelding_omschrijving").Value);
        else if (oRs("cnt_contract_key").Value)
          return safe.html(oRs("ins_discipline_omschrijving").Value);
        else if (oRs("bes_bestelopdr_key").Value)
          return safe.html(oRs("bes_discipline_omschrijving").Value);
        else return "";
      }

      function fnnote(oRs)
      {
        if (oRs("notitie_omschr").Value != null)
        {
          return (outputmode == 0? I("fa-comment") : oRs("notitie_omschr").Value);
        }
        else return "";
      }

      function fnnotetooltip(oRs)
      {
        if (oRs("notitie_omschr").Value != null)
        {
          var notitietext = oRs("notitie_omschr").Value;
          return (outputmode == 0? notitietext : "");
        }
        else return "";
      }

      function fnnotedate(oRs)
      {
        if (oRs("notitie_datum").Value != null)
          return L("lcl_fin_note") + " " + toDateString(oRs("notitie_datum").Value);
        else return "";

      }

      function fnreferenceamount(oRs)
      {
        var totaal;
        if (oRs("bes_bestelopdr_key").Value != null)
        {
          totaal = oRs("bestelopdr_totaal").Value;
        }
        else if (oRs("mld_opdr_key").Value != null)
        {
          totaal = oRs("mld_opdr_kosten").Value;
        }
        return safe.curr(totaal);
      }

      function fnreferencestatus(oRs)
      {
        var result = "";
        if (oRs("bes_bestelopdr_key").Value != null)
        {
          var besteld = oRs("bestelopdr_besteld").Value || 0;
          var geleverd = oRs("bestelopdr_geleverd").Value || 0;
          if (besteld == geleverd)
            result = L("lcl_fin_delivered_3"); // alles geleverd
          else if (geleverd == 0)
            result = L("lcl_fin_delivered_0"); // niets geleverd
          else
            result = L("lcl_fin_delivered_1"); // deels geleverd
        }
        else if (oRs("mld_opdr_key").Value != null)
        {
          var status_key = oRs("mld_statusopdr_key").Value;
          result = status.getopdrstatustext(status_key);
        }
        return result;
      }

      function fnreferentietooltip(oRs)
      {
        var result = "";
        if (oRs("bes_bestelopdr_key").Value != null)
        {
          var totaal = oRs("bestelopdr_totaal").Value || 0;
          var besteld = oRs("bestelopdr_besteld").Value || 0;
          var geleverd = oRs("bestelopdr_geleverd").Value || 0;
          var volledig = (besteld == geleverd ? L("lcl_fin_delivered_3") : L("lcl_fin_delivered_2"));  // volledig geleverd / niet (volledig) geleverd
          result = L("lcl_fin_reference_amount") + ": " + safe.curr(totaal) + "\n"
                 + L("lcl_fin_reference_status") + ": " + volledig;
        }
        else if (oRs("mld_opdr_key").Value != null)
        {
          var totaal = oRs("mld_opdr_kosten").Value || 0;
          var status_key = oRs("mld_statusopdr_key").Value;
          result = L("lcl_fin_reference_amount") + ": " + safe.curr(totaal) + "\n"
                 + L("lcl_fin_reference_status") + ": " + status.getopdrstatustext(status_key);
        }
        return result;
      }

      function fncolFlags(oRs)
      {
        var finkey = oRs("factuurnr_intern").Value;
        var flagkey = oRs("fin_factuur_flag").Value || 0;
        var ttl = L("lcl_fin_flag" + flagkey);
        var displ = "";

        if (print || excel)
        {
            if (flagkey != 0) displ = safe.html(ttl);  // else blijft-ie gewoon leeg
        }
        else  // maak er dan nog leuke plaatjes van
        {
            var flagIcon = I("fa-fclt-flag" + (flagkey == 0 ? "0" : ""));
            // Met hidden flagkey voor sortering. 999 zorgt dat bij 1 keer sorteren de gevlagde direct bovenaan staan
            displ = "<div class='clickParent' onclick='toggleFlag(event, "+ finkey +");'"
                  + " title='"+safe.htmlattr(ttl)+"'>"
                  + "<span id='finflag"+finkey+"' flagkey='"+flagkey+"' class='finflag"+flagkey+"'>" + flagIcon + "</span>"
                  + "<span style='display:none'>"+(flagkey||999)+"</span></div>";
        }
        return displ;
      }



      var rst = new ResultsetTable({ keyColumn: "factuurnr_intern",
                                     ID: "workTable",
                                     rowClass: fnrowClass,
                                     rowData: fnrowData,
                                     rowFilter: fnrowFilter,
                                     rowActionEnabler: fnrowActionEnabler,
                                     sql: sql,
                                     flexModule: "FIN",
                                     flexId: "factuurnr_intern",
                                     filterParams: params,
                                     summaryCalc: fnsummaryCalc,
                                     summaryShow: fnsummaryShow,
                                     outputmode: outputmode,
                                     title: L("lcl_fin_invoices"),
                                     showAll: showall,
                                     multiple: true,   /* wat doet-ie ook al weer, en willen we dat hier? */
                                     buttons: buttons
                                   });

      if (S("fin_factuur_flags") > 0)
        rst.addColumn(new Column({caption: (outputmode == 0 ? I("fa-fclt-flag0") : L("lcl_fin_flags")), content: fncolFlags, align: "center"}));
      rst.addColumn(new Column({caption: L("lcl_fin_nr"), content: function (oRs) { return safe.html(String(oRs("factuurnr_intern").Value)) }}));
      rst.addColumn(new Column({caption: L("lcl_fin_date"), content: "factuur_datum", datatype: "date", hasActions: true, nowrap: true}));
      rst.addColumn(new Column({caption: L("lcl_handler"), content: "uitvoerende",
                                purpose:(params.cnt_key||params.opdr_key||params.bes_key ? PRINTING_ONLY : PRINT_AND_VIEW)}));
      if (outputmode != 0)
        rst.addColumn(new Column({caption: L("lcl_prs_companies_leverancier_nr"), content: "prs_leverancier_nr"}));
      rst.addColumn(new Column({caption: L("lcl_fin_invoice_nr_extern"), content: "factuurnr_extern"}));
      rst.addColumn(new Column({caption: L("lcl_fin_type"), content: fnOpdrtype,
                                purpose:(params.cnt_key||params.opdr_key||params.bes_key ? PRINTING_ONLY : PRINT_AND_VIEW)}));
      rst.addColumn(new Column({caption: "", content: fnOpdrtypeOms, combine: true,
                                purpose:(params.cnt_key||params.opdr_key||params.bes_key ? PRINTING_ONLY : PRINT_AND_VIEW)}));

      rst.addColumn(new Column({caption: L("lcl_fin_invoice_source"), content: fnBron}));
      rst.addColumn(new Column({caption: L("lcl_fin_referentie"), content: "opdrachtnr", tooltip: fnreferentietooltip,
                                purpose:(params.cnt_key||params.opdr_key||params.bes_key ? PRINTING_ONLY : PRINT_AND_VIEW)}));
      if (excel)
          rst.addColumn(new Column({caption: L("lcl_fin_reference_amount"), content: fnreferenceamount, datatype: "currency"}));

      rst.addColumn(new Column({caption: L("lcl_fin_total_sum_exBTW"), content: "bedrag_excl_BTW", datatype: "currency"}));
      rst.addColumn(new Column({caption: L("lcl_fin_total_sum"), content: "bedrag_incl_BTW", datatype: "currency"}));
      rst.addColumn(new Column({caption: L("lcl_fin_fin_status"), content: fnstatusOms, tooltip: fnnotedate, nowrap: true}));
      rst.addColumn(new Column({caption: L("lcl_fin_reference_status"), content: fnreferencestatus}));
      rst.addColumn(new Column({caption: L("lcl_fin_last_note"), content: "notitie_datum", datatype: "date"}));
      rst.addColumn(new Column({caption: L("lcl_fin_note"), content: fnnote, combine: outputmode==0, tooltip: (outputmode == 0? fnnotetooltip : null)}));
      rst.addColumn(new Column({caption: L("lcl_fin_divide_period"), content: "fin_factuur_boekmaand"}));
      if (!fin_type || fin_type == "B")
      	  rst.addColumn(new Column({caption: L("lcl_fin_besteller"), content: "besteller"}));
      if (!embedded)
      {
        rst.addColumn(new Column({caption: L("lcl_prs_budgethouder"), content: "budgethoudernaam"}));
        rst.addColumn(new Column({caption: L("lcl_account"), content: "kostenplaats", combine: true}));
      }
      else
    	{
    	  rst.addColumn(new Column({caption: L("lcl_fin_remark"), content: "fin_factuur_opmerking"}));
    	}
      if (params.anyflex)
        rst.addColumn(new Column({caption: flexlabel, content: "flex"}));

      rst.addAction({action: "finEdit", caption: L("lcl_edit"), isDefault: true});
      rst.addAction({action: "finOrder", caption: L("lcl_shared_order"), enabler: "eOrder"});
      if (!embedded)
      {
        rst.addAction({action: "finApprove", caption: L("lcl_approve"), enabler: "eApprove", multi: true, multiOnce: true});
        rst.addAction({action: "finGoedkeur", caption: L("lcl_goedkeur"), enabler: "eGoedkeur", multi: true, multiOnce: true});
        rst.addAction({action: "finUnapprove", caption: L("lcl_unapprove"), enabler: "eUnapprove", multi: true, multiOnce: true});
        rst.addAction({action: "finRejectApprove", caption: L("lcl_reject") + " " + L("lcl_approve"), enabler: "eRejectApprove", multi: true, multiOnce: true});
        rst.addAction({action: "finRejectGoedkeur", caption: L("lcl_reject") + " " + L("lcl_goedkeur"), enabler: "eRejectGoedkeur", multi: true, multiOnce: true});
        rst.addAction({action: "finUnreject", caption: L("lcl_unreject"), enabler: "eUnreject", multi: true, multiOnce: true});
        rst.addAction({action: "finDelete", caption: L("lcl_delete"), enabler: "eDelete", multi: true, multiOnce: true});
      }
/*
      rst.addAction({ action: "scf_multiedit", caption: L("lcl_change"), multi: true, onlyMulti: true, multiOnce: true } );
*/
      var cnt = rst.processResultset();
      if (!excel && !print)
      {
%>
      <!-- LEGENDA  -->
      <script type="text/javascript">

        $(function() {
          $(".clickParent").parent().on("click", function(e) { e.stopPropagation(); $(this).find("> .clickParent").trigger("click"); });
        });

        function openLegenda()
        {
            var myPosition = "right top+30";
            if (elems.$originalHeaderRow && elems.$originalHeaderRow.length)
                myPosition = "right-15 top+"+(parseInt(elems.$fcltFrameHeader.css("top"))+30);
            params = { width: 250,
                       minWidth: 250,
                       minHeight: 10,
                       resizable: false,
                       position: {my: "right top", at: myPosition},
                       title: L("lcl_fin_legenda"),
                       create: FcltMgr.fnCreateCloseButton("div#legenda")
                     };
		        $('div#legenda').dialog(params).dialog('open');
            FcltMgr.resized();
        }
      </script>

      <div id="legenda" style="display:none; line-height: 30px;">
        <table id="factuurlegenda">
          <tr>
            <td title="<%= L("lcl_fin_legenda_normal_tt") %>"><%= L("lcl_fin_legenda_normal") %></td>
          </tr>
          <tr class="withinmargin">
            <td title="<%= L("lcl_fin_legenda_withinmargin") %>"><%= L("lcl_fin_legenda_withinmargin") %></td>
          </tr>
          <tr class="withinmargin finattentionlist">
            <td title="<%= L("lcl_fin_legenda_withinmargin_incomplete") %>"><%= L("lcl_fin_legenda_withinmargin_incomplete") %></td>
          </tr>
          <tr class="outsidemargin">
            <td title="<%= L("lcl_fin_legenda_outsidemargin") %>"><%= L("lcl_fin_legenda_outsidemargin") %></td>
          </tr>
          <tr class="outsidemargin finattentionlist">
            <td title="<%= L("lcl_fin_legenda_outsidemargin_incomplete") %>"><%= L("lcl_fin_legenda_outsidemargin_incomplete") %></td>
          </tr>
          <tr class="rejected">
            <td title="<%= L("lcl_fin_legenda_rejected") %>"><%= L("lcl_fin_legenda_rejected") %></td>
          </tr>
          <tr class="finattentionlist">
            <td title="<%= L("lcl_fin_legenda_incomplete") %>"><%= L("lcl_fin_legenda_incomplete") %></td>
          </tr>
<%        // Vlag 0 tonen we niet
          for (var flagkey=1; flagkey < S("fin_factuur_flags"); flagkey++)
          {
%>
            <tr><td>
              <span class="finflag<%=flagkey%>"><%=I("fa-fclt-flag")%></span>&nbsp;
              <%=L("lcl_fin_flag"+flagkey)%>
            </td></tr>
<%
          }
%>
        </table>
      </div>
<%    } %>
    </body>
  </html>
<%
}
%>
