<% /*
     $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/json2.js" -->
<!-- #include file="../Shared/resultset_table_v2.inc" -->
<!-- #include file="../Shared/getkenmerksql.inc" -->
<!-- #include file="../Shared/iface.inc" -->
<!-- #include file="fin.inc" -->

<%
FCLTHeader.Requires({ plugins:["jQuery"],
                      js: ["../fin/fin_list.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.sumover       : wildcard currency
  // params.sumbelow      : wildcard currency
  // params.fin_actual    : boolean (true | false)
  // params.fin_deleted   : boolean (true | false)
  // params.dis_key       : key
  // params.loc_key       : key
  // params.bld_key       : key
  // params.verantw_key   : key

  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 authparamsFINUSE = user.checkAutorisation("WEB_FINUSE", true);
  var authparamsFINFOF = user.checkAutorisation("WEB_FINFOF", true);
  var authparamsFINBOF = user.checkAutorisation("WEB_FINBOF", true);
  var authparamsFINGOE = user.checkAutorisation("WEB_FINGOE", true);

  user.auth_required_or_abort(authparamsFINUSE || authparamsFINFOF || authparamsFINBOF || user.isBudgethouder());

  // ik ken 2 varianten: allemaal of alleen de mijne
  var alleenmijnkostenplaatsen = (!authparamsFINUSE && !authparamsFINFOF && !authparamsFINBOF);  // geen FINUSE, FINFOF of FINBOF -> budgethouder

  var asContactpersoon = user.isContactpersoon() && !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 budh_key = params.budh_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;

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

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



      // Query factuurlijst opbouwen.
      sql = "SELECT f.fin_factuur_key factuurnr_intern"
          + "     , fin_factuur_verwijder"
          + "     , f.fin_factuur_datum factuur_datum"
          + "     , COALESCE((SELECT b.prs_bedrijf_naam"
          + "                  FROM prs_bedrijf b"
          + "                  WHERE prs_bedrijf_key = COALESCE (o.mld_uitvoerende_keys, c.cnt_prs_bedrijf_key, bo.prs_bedrijf_key)),"
          + "                (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"
          + "     , (SELECT b.prs_leverancier_nr FROM prs_bedrijf b WHERE prs_bedrijf_key = COALESCE (o.mld_uitvoerende_keys, c.cnt_prs_bedrijf_key, bo.prs_bedrijf_key)) 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"
          + "     , 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 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"
          + "     , (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";

      // merk op: als budgethouder==user_key dan wordt bes_fiat_write later genegeerd.
      if (!authparamsFINBOF)
        sql += ", 0 bes_fiat_write"
      else if (authparamsFINBOF.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 = " + authparamsFINBOF.ALGwritelevel + ")),"
                    + " 0) bes_fiat_write";

      if (!authparamsFINBOF)
        sql += ", 0 mld_fiat_write"
      else if (authparamsFINBOF.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 = " + authparamsFINBOF.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 = " + authparamsFINBOF.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 = " + authparamsFINBOF.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 = " + authparamsFINBOF.ALGwritelevel + ")"
                       + "       THEN 1"
                       + "  ELSE 0"
                       + " END"
                       + " FROM alg_v_onroerendgoed onrg"
                         + " WHERE m.mld_alg_onroerendgoed_keys = onrg.alg_onroerendgoed_keys(+)) mld_fiat_write";

      sql += "  FROM fin_factuur f"
          + " 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 "
          + "         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 "
          + "         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"
          + "         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 (SELECT prs.getkpverantwoordelijke ( "
          + "                                    prs_kostenplaats_key, "
          +                                      S("prs_approvemethod") + ", "
          + "                                    -1) "
          + "                                    budgethouder, "
          + "                                 kp.* "
          + "                            FROM prs_kostenplaats kp) k "
          + "            ON k.prs_kostenplaats_key = COALESCE (bb.prs_kostenplaats_key, "
          + "                                                  c.prs_kostenplaats_key, "
          + "                                                  o.prs_kostenplaats_key, "
          + "                                                  m.prs_kostenplaats_key) ";

        sql += " WHERE 1=1"; // Nu de where clause bouwen

        if (asContactpersoon)
           sql +=" 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)"
               + "    OR 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)"
               + "    OR 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)"
               + "   )";

      // Als geen FINFOF maar wel FINBOF moet ik ook de alg-scope controleren
      if (!authparamsFINFOF && authparamsFINBOF && authparamsFINBOF.ALGreadlevel > -1)
      {
          // 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
          // 2) Ik ben contracteigenaar van het contract OF
          // 3) Ik ben budgethouder van de BrOC-kostenplaats OF
          // Terzijde als type (mld-cnt-bes) niet bekend/gekozen is, dan moet ik volledig rechten hebben

          // 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 + ")))";

          // 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 EXISTS (SELECT m.mld_melding_key"
                        + "       FROM alg_v_onroerendgoed onrg"
                        + "      WHERE m.mld_alg_onroerendgoed_keys = onrg.alg_onroerendgoed_keys(+)"
                        + "        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 (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 + "))"
                               + "      ))"
                + ")";

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

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

          // 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)";

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

      // Als bld_key een geldige waarde heeft, hebben loc_key en dis_key ook een geldige waarde
      if (dis_key)
      {
        var loc_key_arr = [];
        if (loc_key)
        {
          loc_key_arr.push(loc_key);
        }
        else
        {
          // Zoek alle locaties die bij het gekozen district horen.
          sqld = "SELECT alg_locatie_key"
               + "  FROM alg_locatie"
               + " WHERE alg_district_key = " + dis_key;
          var oRsd = Oracle.Execute(sqld);
          while (!oRsd.eof)
          {
            loc_key_arr.push(oRsd("alg_locatie_key").Value);
            oRsd.MoveNext();
          }
          oRsd.Close();
        }
        // Als alleen dis_key bekend is dan zoeken voor alle loc_key bij deze 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(",") + ")"
              + "     UNION"
              + "    SELECT cnt_contract_key"
              + "      FROM cnt_v_contract_locatie_geg cl"
              + "    WHERE alg_locatie_key IN (" + loc_key_arr.join(",") + ")))";

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

      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"
             + "                                    , alg_v_aanweziggebouw g"
             + "                                WHERE m.alg_locatie_key = g.alg_locatie_key"
             + "                                  AND (g.prs_perslid_key_verantw = " + verantw_key
             + "                                    OR g.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 + ")))";

        // 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_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 ('T', '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_contract_locatie_geg cl"
             + "                              , alg_v_aanweziggebouw g"
             + "                          WHERE cl.alg_locatie_key = g.alg_locatie_key"
             + "                            AND (g.prs_perslid_key_verantw = " + verantw_key
             + "                              OR g.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 COALESCE (o.mld_uitvoerende_keys, c.cnt_prs_bedrijf_key, bo.prs_bedrijf_key) = " + handler_key;

      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.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";

      // 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)
      {
        if (oRs("fin_factuur_verwijder").Value != null)
          return "deleted";
        else if (oRs("roodgroen").Value < 0)
          return "outsidemargin";
        else if (oRs("roodgroen").Value > 0)
          return "withinmargin";
        else if (oRs("fin_factuur_statuses_key").Value == 1)
          return "rejected"; // was deleted
        return "";
      }

      var factuurTotalex = 0;
      var factuurTotalinc = 0;
      function fnsummaryCalc(oRs)
      {
        if (oRs("fin_factuur_statuses_key") != 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);
      }

      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 embedded ben, want dikke kans dat ik dan juist
        // al een subframe van datzelfde item ben!
        var eOrder   = !embedded && (oRs("opdrachtnr").Value != " ") && !deleted;

        // 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 ben budgethouder van de BrOC-kostenplaats (BrOC = Bestelling, /*reservering*/, Opdracht, Contract)
        //                                           2) 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
        //                                           3) ik ben contracteigenaar van het contract
        var budgethouder = oRs("budgethouder").Value;
        var contracteigenaar = oRs("prs_perslid_key_eig").Value;
        var besmldfiat_write = false;
        var cntfiat_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 if (oRs("cnt_contract_key").Value) // Contract
          cntfiat_write = user.isCollega(oRs("prs_perslid_key_eig").Value); // Contracteigenaar IN (user_key, vervangers).
        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) || cntfiat_write || besmldfiat_write || fiat_write) && !deleted; // Budgethouder IN (user_key, vervangers).

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

        var eGoedkeur =!embedded &&
                        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: "page_refresh.png", title: L("lcl_refresh"), action: "FcltMgr.reload()" });
      }
      if (!embedded && ((authparamsFINFOF && authparamsFINFOF.PRSwritelevel < 9) || (authparamsFINUSE && authparamsFINUSE.PRSwritelevel < 9)))
      {
        var addurl = "appl/fin/fin_factuur.asp?fin_key=-1";
        addurl += buildTransitParam(["cnt_key", "opdr_key", "bes_key"], params)
        buttons.push({ icon: "plus.png", title: L("lcl_add"), action: "FcltMgr.openDetail('" + addurl + "', '" + L("lcl_add") + "')" });

        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: "folder.png", title: L("lcl_import"), action: "FcltMgr.openDetail('" + impurl + "', '" + 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").Value != null)
          return (outputmode == 0? I("fa-comment") : oRs("notitie").Value);
        else return "";
      }

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

      }

      function fntotaalgeleverd(oRs)
      {
        var result = "";
        if (oRs("bes_bestelopdr_key").Value != null)
        {
          var totaal = oRs("bestelopdr_totaal").Value;
          var besteld = oRs("bestelopdr_besteld").Value || 0;
          var geleverd = oRs("bestelopdr_geleverd").Value || 0;
          var volledig = (besteld == geleverd ? L("lcl_Yes") : L("lcl_No"));
          result = L("lcl_fin_bestelopdr_totaal") + ": " + safe.curr(totaal) + "\n"
                 + L("lcl_fin_bestelopdr_volledig") + ": " + volledig;
        }
        return result;
      }

      function fnvolledig(oRs)
      {
        var result = "";
        if (oRs("bes_bestelopdr_key").Value != null)
        {
          var besteld = oRs("bestelopdr_besteld").Value || 0;
          var geleverd = oRs("bestelopdr_geleverd").Value || 0;
          var result = (besteld == geleverd ? L("lcl_Yes") : L("lcl_No"));
        }
        return result;
      }


      var rst = new ResultsetTable({ keyColumn: "factuurnr_intern",
                                     ID: "workTable",
                                     rowClass: fnrowClass,
                                     rowData: fnrowData,
                                     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
                                   });

      rst.addColumn(new Column({caption: L("lcl_fin_nr"), content: "factuurnr_intern"}));
      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: "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_opdrachtnr"), content: "opdrachtnr", tooltip: fntotaalgeleverd,
                                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_bestelopdr_totaal"), content: "bestelopdr_totaal", 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", combine:true}));
      rst.addColumn(new Column({caption: L("lcl_fin_fin_status"), content: fnstatusOms, tooltip: fnnotedate, nowrap: true}));
      if (excel)
          rst.addColumn(new Column({caption: L("lcl_fin_bestelopdr_volledig"), content: fnvolledig}));
      rst.addColumn(new Column({caption: L("lcl_fin_note"), content: outputmode==0?fnnote:fnnotedate, combine: outputmode==0}));
      rst.addColumn(new Column({caption: L("lcl_fin_divide_period"), content: "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"}));
    	}

      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});
        if (S("fin_enable_afwijzen") == 1)
        {
          rst.addAction({action: "finRejectApprove", caption: L("lcl_reject") + " " + L("lcl_approve"), enabler: "eReject", 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});
      }
      var cnt = rst.processResultset();
%>
    </body>
  </html>
<%
}
%>
