<%
/*
     $Revision$
     $Id$

    File:               fac_fiattering_list.inc
    Description:        Overzicht fiatteringsverzoeken
    Parameters:
    Context:            Gemeenschappelijke code van FAC/fac_fiattering_list.asp en PDA/fiat_list.asp

*/

function getSqlFiatBes(fiatstatus, prsKeys, params)
{
   var v_sql_bestelling_bedrag = "(SELECT b.bes_bestelling_key"
                               + "      , SUM(bi.bes_bestelling_item_prijs * bi.bes_bestelling_item_aantal) bestelling_bedrag"
                               + "   FROM bes_bestelling b"
                               + "      , bes_bestelling_item bi"
                               + "      , bes_srtdeel bsd"
                               + "      , bes_srtgroep bsg"
                               + "      , bes_disc_params bdp"
                               + "  WHERE b.bes_bestelling_key = bi.bes_bestelling_key"
                               + "    AND bi.bes_srtdeel_key = bsd.bes_srtdeel_key"
                               + "    AND bsd.bes_srtgroep_key = bsg.bes_srtgroep_key"
                               + "    AND bsg.ins_discipline_key = bdp.bes_ins_discipline_key"
                               + (fiatstatus == "open"
                                 ? "  AND b.bes_bestelling_status = CASE"
                                   + "                              WHEN bdp.bes_disc_params_fiatflow = 0"
                                   + "                              THEN 2"
                                   + "                              ELSE 4"
                                   + "                              END"     // Te fiatteren
                                 : (fiatstatus == "close"
                                   ? " AND b.bes_bestelling_status != 2"     // Gefiatteerd
                                   : " AND b.bes_bestelling_status = 1"))    // Afgewezen
                               + "  GROUP BY b.bes_bestelling_key)";

  // Kan ik zelf fiatteren?: true:  totaalbedrag <= can_selfapprove
  //                         false  totaalbedrag > can_selfapprove
  var totaalbedrag = "(SELECT SUM(i1.bes_bestelling_item_aantal * COALESCE(i1.bes_bestelling_item_prijs, 0))"
                   + "   FROM bes_bestelling_item i1"
                   + "  WHERE i1.bes_bestelling_key = b.bes_bestelling_key)";

  // Deze mag/hoeft niet meer te fiatteren
  var exclude_fiatter = " COALESCE(b.bes_bestelling_fiat_user, "
                      + " CASE"
                      + " WHEN " + totaalbedrag + " <= " + S("can_selfapprove")
                      + " THEN -1"
                      + " ELSE b.prs_perslid_key"
                      + " END)";

  var fiatteur = " (SELECT p2.prs_perslid_naam_full"
               + "  FROM prs_v_perslid_fullnames_all p2"
               + " WHERE p2.prs_perslid_key ="
               + (fiatstatus == "open"
                 ? " prs.nextfiatteur(b.bes_bestelling_key, 'BES', " + exclude_fiatter + "))" // Open. Toon wie de fiatteur is. Voor de BES module wordt de pexcludekey toch niet gebruikt.
                 : " b.bes_bestelling_fiat_user)") // Gefiatteerd en afgewezen. Toon wie dat is geweest. (Afwijzer werd voorheen niet opgeslagen, nu wel)

  // Tijdens het uiteindelijk fiatteren wordt gekeken afhankelijk van totaalbedrag of er wellicht na kostenplaatsverantwoordelijke ook nog door kostenplaatsgroepverantwoordelijke moet worden gefiatteerd.
  var sql = " SELECT TO_CHAR(b.bes_bestelling_key) aanvraagnummer"
          + "      , b.bes_bestelling_datum datum"
          + "      , p.prs_perslid_naam_full"
          + "      , prijs.bestelling_bedrag bedrag"
          + "      , 'BES' module"
          + "      , 'mld_typeopdr_omschrijving' type"
          + ",       " + safe.quoted_sql(fiatstatus) + " fiatstatus"
          + "      , b.bes_bestelling_key request_key"
          + "      , b.bes_bestelling_status statuskey"
          + "      , b.bes_bestelling_datum sortdate"
          + "      , " + lcl.xsql("td.ins_discipline_omschrijving", "td.ins_discipline_key") + " categorie"
          + "      , " + fiatteur + " fiatteur"
          + "      , bes_bestelling_parentkey"
          + "      , NULL prefix"
          + "      , NULL uitvoerende"
          + "      , l.alg_locatie_omschrijving || ' (' || l.alg_locatie_code || ')' locatie"
          + "      , NULL gebouw"
          + "      , NULL terrein"
          + "      , NULL omschrijving"
          + "      , NULL extra1"
          + "   FROM prs_v_perslid_fullnames_all p"
          + "      , bes_bestelling b"
          + "      , " + v_sql_bestelling_bedrag + " prijs"
          + "      , bes_bestelling_item bi"
          + "      , bes_srtdeel sd"
          + "      , bes_srtgroep sg"
          + "      , ins_tab_discipline td"
          + "      , bes_disc_params dp"
          + "      , prs_kostenplaats k"
          + "      , prs_kostenplaatsgrp kpg"
          + "      , " + fac.getVSqlVerantwoordelijk(prsKeys) + " ver"
          + (fiatstatus != "open"
            ? "    , fac_tracking ft"
              + "  , fac_srtnotificatie fno"
            : "")
          + "      , mld_v_afleveradres m"
          + "      , alg_locatie l"
          + (params.bld_key_arr
            ? "    , alg_gebouw g"
              + "  , alg_terreinsector t"
            : "")
          + "  WHERE bi.bes_bestelling_key = b.bes_bestelling_key"
          + "    AND prijs.bes_bestelling_key = b.bes_bestelling_key"
          + "    AND sd.bes_srtdeel_key = bi.bes_srtdeel_key"
          + "    AND sd.bes_srtgroep_key = sg.bes_srtgroep_key"
          + "    AND sg.ins_discipline_key = td.ins_discipline_key"
          + "    AND td.ins_discipline_key = dp.bes_ins_discipline_key"
          + "    AND p.prs_perslid_key = b.prs_perslid_key"
          + "    AND b.prs_kostenplaats_key = k.prs_kostenplaats_key"
          + "    AND k.prs_kostenplaats_key = ver.prs_kostenplaats_key(+)"
          + "    AND k.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)"
          + (params.kpgrp_key_arr
            ? "  AND kpg.prs_kostenplaatsgrp_key IN (" + params.kpgrp_key_arr.join(", ") + ")"
            : "")
          + "    AND b.mld_adres_key_lev = m.mld_adres_key" // Afleveradres is altijd verplicht
          + "    AND m.alg_locatie_key = l.alg_locatie_key(+)"
          + (fiatstatus == "open"
            ? " AND b.bes_bestelling_status = CASE"
              + "                             WHEN dp.bes_disc_params_fiatflow = 0"
              + "                             THEN 2"
              + "                             ELSE 4"
              + "                             END"
/* A1 */      + " AND ((bes_bestelling_fiat_user IS NULL AND"
              + "       prs.nextfiatteur(b.bes_bestelling_key, 'BES', " + exclude_fiatter + ") IN (" + prsKeys + ")" + ")" // Voor de BES module wordt de pexcludekey toch niet gebruikt.
/* A2 */      + "     OR (bes_bestelling_fiat_user IS NOT NULL AND"
              + "         ((ver.prs_perslid_key IN (" + prsKeys + ") AND b.bes_bestelling_fiatbedrag < COALESCE(kpg.prs_kostenplaatsgrp_fin_limit1, " + S("mld_opdr_kpg_fin_limit1") + "))"
              + "       OR (ver.prs_kostenplaatsgrp_fiat2_key IN (" + prsKeys + ") AND b.bes_bestelling_fiatbedrag >=  COALESCE(kpg.prs_kostenplaatsgrp_fin_limit1, " + S("mld_opdr_kpg_fin_limit1") + ") AND b.bes_bestelling_fiatbedrag <  COALESCE(kpg.prs_kostenplaatsgrp_fin_limit2, " + S("mld_opdr_kpg_fin_limit2") + "))"
              + "       OR (ver.prs_kostenplaatsgrp_fiat3_key IN (" + prsKeys + ") AND b.bes_bestelling_fiatbedrag >=  COALESCE(kpg.prs_kostenplaatsgrp_fin_limit2, " + S("mld_opdr_kpg_fin_limit2") + "))))"
              + "     )"
            : " AND ft.fac_tracking_refkey = b.bes_bestelling_key"
              + " AND ft.fac_srtnotificatie_key = fno.fac_srtnotificatie_key"
              + " AND fno.fac_srtnotificatie_code IN (" + (fiatstatus == "close"? "'BESFIT', 'BESACP'" : "'BESREJ'") + ")"
              + " AND ft.prs_perslid_key IN (" + prsKeys + ")")
          + (fiatstatus == "open" // Als nog gefiatteerd moet worden door kostenplaatsgroep verantwoordelijke en ik heb net gefiatteerd dan wil ik die niet meer zien (want dan was het wel in 1 keer goedgekeurd).
            ? " AND (bes_bestelling_fiat_user <> " + user_key + " OR bes_bestelling_fiat_user IS NULL)" // Geldt alleen voor nog te fiatteren bestellingen, zie canApprove bij bestellingen. Dan heb je toch de rechten niet.
            : "") // Door mij goedgekeurde of afgekeurde bestellingen hoef ik niet meer af te melden maar wil ik nog wel zien
          + (params.bld_key_arr
            ? " AND l.alg_locatie_key = g.alg_locatie_key(+)"
              + " AND l.alg_locatie_key = t.alg_locatie_key(+)"
              + " AND (g.alg_gebouw_key IN (" + params.bld_key_arr.join(",") + ") OR t.alg_terreinsector_key IN (" + params.bld_key_arr.join(",") + "))"
            : "")
          + (params.loc_key_arr && !params.bld_key_arr
            ? " AND l.alg_locatie_key IN (" + params.loc_key_arr.join(",") + ")"
            : "")
          + " GROUP BY b.bes_bestelling_key"
          + "        , b.bes_bestelling_datum"
          + "        , p.prs_perslid_naam_full"
          + "        , b.bes_bestelling_status"
          + "        , prijs.bestelling_bedrag"
          + "        , "+ lcl.xsql('td.ins_discipline_omschrijving','td.ins_discipline_key')
          + "        , b.prs_kostenplaats_key"
          + "        , b.prs_perslid_key"
          + "        , b.bes_bestelling_fiat_user"
          + "        , bes_bestelling_parentkey"
          + "        , l.alg_locatie_omschrijving"
          + "        , l.alg_locatie_code"
          + "        , td.ins_discipline_key";
  return sql;
}

function getCntScope(params)
{
  return " SELECT l.alg_locatie_key loc"
       + "      , " + S("alg_loc_string") + " loc_oms"
       + "      , NULL gebter"
       + "      , NULL gebter_oms"
       + "      , cp.cnt_contract_key cnt_key"
       + "   FROM cnt_contract_plaats cp"
       + "      , alg_locatie l"
       + "  WHERE cnt_alg_plaats_key = l.alg_locatie_key"
       + "    AND cnt_alg_plaats_code = 'L'"
       + "    AND cnt_contract_plaats_verwijder IS NULL"
       + (params.loc_key_arr
         ? " AND l.alg_locatie_key IN (" + params.loc_key_arr.join(",") + ")"
         : "")
       + " UNION"
       + " SELECT l.alg_locatie_key loc"
       + "      , " + S("alg_loc_string") + " loc_oms"
       + "      , g.alg_gebouw_key gebter"
       + "      , g.alg_gebouw_naam gebter_oms"
       + "      , cp.cnt_contract_key cnt_key"
       + "   FROM cnt_contract_plaats cp"
       + "      , alg_locatie l"
       + "      , alg_gebouw g"
       + "  WHERE cnt_alg_plaats_code = 'G'"
       + "    AND cnt_alg_plaats_key = g.alg_gebouw_key"
       + "    AND g.alg_locatie_key = l.alg_locatie_key"
       + "    AND cnt_contract_plaats_verwijder IS NULL"
       + (params.bld_key_arr
         ? " AND g.alg_gebouw_key IN (" + params.bld_key_arr.join(",") + ")"
         : (params.loc_key_arr
           ? " AND l.alg_locatie_key IN (" + params.loc_key_arr.join(",") + ")"
           : ""))
       + " UNION"
       + " SELECT l.alg_locatie_key loc"
       + "      , " + S("alg_loc_string") + " loc_oms"
       + "      , t.alg_terreinsector_key gebter"
       + "      , t.alg_terreinsector_naam gebter_oms"
       + "      , cp.cnt_contract_key cnt_key"
       + "   FROM cnt_contract_plaats cp"
       + "      , alg_locatie l"
       + "      , alg_terreinsector t"
       + "  WHERE cnt_alg_plaats_code = 'T'"
       + "    AND cnt_alg_plaats_key = t.alg_terreinsector_key"
       + "    AND t.alg_locatie_key = l.alg_locatie_key"
       + "    AND cnt_contract_plaats_verwijder IS NULL"
       + (params.bld_key_arr
         ? " AND t.alg_terreinsector_key IN (" + params.bld_key_arr.join(",") + ")"
         : (params.loc_key_arr
           ? " AND l.alg_locatie_key IN (" + params.loc_key_arr.join(",") + ")"
           : ""));
}

function getCntGebonden(params)
{
  var filterlocatie = (params.dist_key_arr? true : false);
  var filter_gebonden = "";
  if (filterlocatie)
  {
    if (params.cnt)
      filter_gebonden = " c.cnt_contract_key = cp.cnt_contract_key";
    if (params.bld_key_arr)
    {
      // Filteren op gebouw/terrein levert alleen de gebouw/terreingebonden contracten. De cnt_alg_plaats_key is uniek voor gebouw en terrein en daarom is cnt_alg_plaats_code niet nodig.
      filter_gebonden += (params.cnt? " AND" : "") + " cp.cnt_alg_plaats_key IN (" + params.bld_key_arr.join(",") + ")";
    }
    else if (params.loc_key_arr)
    {
      // Filteren op locatie moet zowel de locatie gebonden contracten opleveren
      // als de gebouwgebonden contracten binnen deze locatie.
      var locaties = params.loc_key_arr.join(","); // De geselecteerde locatie, of alle locaties in het geselecteerde district.
      var gebouwenterreinen = "";
      sql_f = "SELECT alg_gebouw_key"
            + "  FROM alg_gebouw"
            + " WHERE alg_locatie_key IN (" + locaties + ")"
            + " UNION "
            + "SELECT alg_terreinsector_key"
            + "  FROM alg_terreinsector"
            + " WHERE alg_locatie_key IN (" + locaties + ")";
      var bld_key_arr2 = [];
      var oRsf = Oracle.Execute(sql_f);
      if (!oRsf.eof)
      {
        while (!oRsf.eof)
        {
          bld_key_arr2.push(oRsf("alg_gebouw_key").Value);
          oRsf.moveNext();
        }
        oRsf.Close();
        gebouwenterreinen = bld_key_arr2.join(",");
      }
      filter_gebonden += (params.cnt? " AND" : "") + " (  (cp.cnt_alg_plaats_code = 'L' AND cp.cnt_alg_plaats_key IN (" + locaties + "))"
                       + (gebouwenterreinen ? " OR (cp.cnt_alg_plaats_key IN (" + gebouwenterreinen + "))" : "") // De cnt_alg_plaats_key is uniek voor gebouw en terrein en daarom is cnt_alg_plaats_code niet nodig.
                       + " )";
    }
  }
  return filter_gebonden;
}

function getSqlFiatCnt(fiatstatus, prsKeys, params)
{ // Contracten: Goedkeuren tot de vijf limieten (WEB_CNTGO1 t/m WEB_CNTGO5)
  var scope = getCntScope(params);

  var loc_count = "(SELECT COUNT(loc) FROM theScope scope WHERE scope.cnt_key = c.cnt_contract_key)";
  var loc_oms = "(SELECT loc_oms FROM theScope scope WHERE scope.cnt_key = c.cnt_contract_key)";
  var gebter_oms = "(SELECT gebter_oms FROM theScope scope WHERE scope.cnt_key = c.cnt_contract_key)";
  var filterlocatie = (params.dist_key_arr? true : false);
  params.cnt = true;
  var filter_gebonden = getCntGebonden(params);

  function getSqlLocAut(lfunctie_code)
  {
    var sql_cntloc = cnt.getCntLocationsSql();
    return " AND EXISTS(SELECT g.prs_perslid_key"
         + "              FROM fac_v_webgebruiker g"
         + "                 , fac_functie f"
         + "                 , cnt_contract c1"
         + "                 , (" + sql_cntloc + ") cntloc"
         + "             WHERE g.fac_functie_key = f.fac_functie_key"
         + "               AND g.ins_discipline_key = c.ins_discipline_key"
         + "               AND g.prs_perslid_key IN (" + prsKeys + ")"
         + "               AND f.fac_functie_code = " + safe.quoted_sql(lfunctie_code)
         + "               AND c1.cnt_contract_key = cntloc.cnt_contract_key(+)"
         + "               AND c1.cnt_contract_key = c.cnt_contract_key"
         + "               AND (g.fac_gebruiker_alg_level_write = -1"
         + "                    OR (g.fac_gebruiker_alg_level_write < 9"
         + "                        AND (cntloc.alg_locatie_key IN (SELECT alg_locatie_key"
         + "                                                         FROM fac_v_my_locations"
         + "                                                        WHERE prs_perslid_key IN (" + prsKeys + ")"
         + "                                                          AND niveau = fac_gebruiker_alg_level_write)"
         + "                             OR cntloc.alg_locatie_key IS NULL)" // Op contracten zonder locatie(s) heeft iedereen rechten.
         + ")))";
  }


  var sql = " WITH theScope AS (" + scope + ")"
          + " SELECT DISTINCT TO_CHAR (c.cnt_contract_nummer_intern)||NVL2(cnt_contract_versie,'.'||cnt_contract_versie,'') aanvraagnummer"
          + "      , c.cnt_contract_aanmaak datum"
          + "      , p.prs_perslid_naam_full"
          + "      , c.cnt_contract_kosten bedrag"
          + "      , 'CNT' module"
          + "      , 'mld_typeopdr_omschrijving' type"
          + "      , " + safe.quoted_sql(fiatstatus) + " fiatstatus"
          + "      , c.cnt_contract_key request_key"
          + "      , c.cnt_contract_status statuskey"
          + "      , c.cnt_contract_aanmaak sortdate"
          + "      , " + lcl.xsql("td.ins_discipline_omschrijving", "td.ins_discipline_key") + " categorie"
          + (fiatstatus == "open"
            ? "    , CASE"
              + "    WHEN COALESCE (c.cnt_contract_approved, 0) <= " + S("cnt_contract_limit1")
              + "    THEN '1'"
              + "    WHEN COALESCE (c.cnt_contract_approved, 0) <= " + S("cnt_contract_limit2")
              + "    THEN '2'"
              + "    WHEN COALESCE (c.cnt_contract_approved, 0) <= " + S("cnt_contract_limit3")
              + "    THEN '3'"
              + "    WHEN COALESCE (c.cnt_contract_approved, 0) <= " + S("cnt_contract_limit4")
              + "    THEN '4'"
              + "    WHEN COALESCE (c.cnt_contract_approved, 0) <= " + S("cnt_contract_limit5")
              + "    THEN '5'"
              + "    ELSE '0'"
              + "    END"
            : "    , ' '") + " fiatteur"
          + "      , NULL bes_bestelling_parentkey"
          + "      , NULL prefix"
          + "      , NULL uitvoerende"
          + "      , CASE " + loc_count
            + "      WHEN 0"
            + "      THEN NULL"
            + "      WHEN 1"
            + "      THEN " + loc_oms
            + "      ELSE " + safe.quoted_sql(L("lcl_cnt_locatie_m")) + " || "
            + "           ' (' || TO_CHAR(" + loc_count + ") || ')'"  // Er kunnen meerdere locaties zijn (contract scope)
            + "      END locatie"
          + "      , CASE " + loc_count
            + "      WHEN 1"
            + "      THEN TO_CHAR (" + gebter_oms + ")"
            + "      ELSE NULL"
            + "      END gebouw"
          + "      , NULL terrein"
          + "      , c.cnt_contract_omschrijving omschrijving"
          + "      , NULL extra1"
          + "  FROM prs_v_perslid_fullnames_all p"
          + "      , cnt_v_aanwezigcontract c"
          + "      , ins_tab_discipline td"
          + "      , cnt_disc_params cd"
          + "      , prs_kostenplaats k"
          + (params.kpgrp_key_arr
            ? "    , prs_kostenplaatsgrp kpg"
            : "")
          + "      , fac_v_webgebruiker w"
          + "      , fac_functie f"
          + (fiatstatus != "open"
            ? ", fac_tracking ft"
              + ", fac_srtnotificatie fno"
            : "")
          + (filterlocatie
            ? ", cnt_contract_plaats cp"
            : "")
          + " WHERE c.ins_discipline_key = td.ins_discipline_key"
          + "   AND td.ins_discipline_key = cd.cnt_ins_discipline_key(+)"
          + "   AND c.prs_perslid_key_beh = p.prs_perslid_key"
          + "   AND c.prs_kostenplaats_key = k.prs_kostenplaats_key(+)"
          + (params.kpgrp_key_arr
            ? "    AND k.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)"
            + "    AND kpg.prs_kostenplaatsgrp_key IN (" + params.kpgrp_key_arr.join(", ") + ")"
            : "")
          + "   AND w.prs_perslid_key IN (" + prsKeys + ")"
          + "   AND w.fac_functie_key = f.fac_functie_key"
          + "   AND w.ins_discipline_key = c.ins_discipline_key"
          //+ "   AND fac_functie_code LIKE 'WEB_CNTGO%'"
           + (fiatstatus == "open"
            ? " AND c.cnt_contract_status = 3"
              + " AND (  COALESCE(c.cnt_contract_approved, 0) < cnt_contract_kosten"                // Contract is nog niet volledig goedgekeurd.
              + "     OR cd.cnt_disc_params_approve_new = 1"                                        // of moet altijd worden goedgekeurd
              + "     )"
/* A1 */      + " AND (   (    (  c.cnt_contract_kosten > " + S("cnt_contract_limit1")              // Zijn de kosten hoger als de limiet.
              + "              OR cd.cnt_disc_params_approve_new = 1"                               // of moet altijd worden goedgekeurd
              + "              )"
              + "          AND COALESCE(c.cnt_contract_approved, 0) <= " + S("cnt_contract_limit1") // Goedkeur 1.
              + (S("cnt_approval_all") == 1
                ? "        AND cnt_contract_kosten > " + S("cnt_contract_limit1")
                  + "      AND cnt_contract_kosten <= " + S("cnt_contract_limit2")                  // Er moet in 1 keer goed gekeurd te worden.
                : "")
              + getSqlLocAut('WEB_CNTGO1')
              + "          AND f.fac_functie_code LIKE 'WEB_CNTGO1')"                               // Heb ik rechten voor de eerste goedkeur.
/* A2 */      + "      OR (c.cnt_contract_kosten > " + S("cnt_contract_limit2")                     // Zijn de kosten hoger als de limiet.
              + "          AND COALESCE(c.cnt_contract_approved, 0) <= " + S("cnt_contract_limit2") // Goedkeur 2.
              + (S("cnt_approval_all") == 0
                ? "        AND COALESCE(c.cnt_contract_approved, 0) > " + S("cnt_contract_limit1")  // Eerste goedkeuring is geweest.
                : "        AND cnt_contract_kosten > " + S("cnt_contract_limit1")
                  + "      AND cnt_contract_kosten <= " + S("cnt_contract_limit3"))                 // Er moet in 1 keer goed gekeurd worden.
              + getSqlLocAut('WEB_CNTGO2')
              + "          AND f.fac_functie_code LIKE 'WEB_CNTGO2')"                               // Heb ik rechten voor de tweede goedkeur.
/* A3 */      + "      OR (c.cnt_contract_kosten > " + S("cnt_contract_limit3")                     // Zijn de kosten hoger als de limiet.
              + "          AND COALESCE(c.cnt_contract_approved, 0) <= " + S("cnt_contract_limit3") // Goedkeur 3.
              + (S("cnt_approval_all") == 0
                ? "        AND COALESCE(c.cnt_contract_approved, 0) > " + S("cnt_contract_limit2")  // Tweede goedkeuring is geweest.
                : "        AND cnt_contract_kosten > " + S("cnt_contract_limit2")
                  + "      AND cnt_contract_kosten <= " + S("cnt_contract_limit4"))                 // Er moet in 1 keer goed gekeurd worden.
              + getSqlLocAut('WEB_CNTGO3')
              + "          AND f.fac_functie_code LIKE 'WEB_CNTGO3')"                               // Heb ik rechten voor de derde goedkeur.
/* A4 */      + "      OR (c.cnt_contract_kosten > " + S("cnt_contract_limit4")                     // Zijn de kosten hoger als de limiet.
              + "          AND COALESCE(c.cnt_contract_approved, 0) <= " + S("cnt_contract_limit4") // Goedkeur 4.
              + (S("cnt_approval_all") == 0
                ? "        AND COALESCE(c.cnt_contract_approved, 0) > " + S("cnt_contract_limit3")  // Derde goedkeuring is geweest.
                : "        AND cnt_contract_kosten > " + S("cnt_contract_limit3")
                  + "      AND cnt_contract_kosten <= " + S("cnt_contract_limit5"))                 // Er moet in 1 keer goed gekeurd worden.
              + getSqlLocAut('WEB_CNTGO4')
              + "          AND f.fac_functie_code LIKE 'WEB_CNTGO4')"                               // Heb ik rechten voor de vierde goedkeur.
/* A5 */      + "      OR (c.cnt_contract_kosten > " + S("cnt_contract_limit5")                     // Zijn de kosten hoger als de limiet.
              + "          AND COALESCE(c.cnt_contract_approved, 0) <= " + S("cnt_contract_limit5") // Goedkeur 5.
              + (S("cnt_approval_all") == 0
                ? "        AND COALESCE(c.cnt_contract_approved, 0) > " + S("cnt_contract_limit4")  // Vierde goedkeuring is geweest.
                : "        AND cnt_contract_kosten > " + S("cnt_contract_limit5"))                  // Er moet in 1 keer goed gekeurd te worden.
              + getSqlLocAut('WEB_CNTGO5')
              + "          AND f.fac_functie_code LIKE 'WEB_CNTGO5'))"                              // Heb ik rechten voor de vijfde goedkeur.
              + " AND COALESCE (fac_gebruiker_prs_level_write, 9) < 9"                              // Heb ik enige schrijfrechten, dan heb ik alle schrijfrechten. Autorisatie is Ja/Nee.
            : " AND c.cnt_contract_status = " + (fiatstatus == "close"? "0" : "2")
              + " AND ft.fac_tracking_refkey = c.cnt_contract_key"
              + " AND ft.fac_srtnotificatie_key = fno.fac_srtnotificatie_key"
              + " AND fno.fac_srtnotificatie_code IN (" + (fiatstatus == "close"? "'CNTFIT'" : "'CNTREJ'") + ")"
              + " AND ft.prs_perslid_key IN (" + prsKeys + ")")
          + (filterlocatie
            ? " AND" + filter_gebonden
            : "");
  return " SELECT * FROM (" + sql + ")";
}


function getSqlFiatMld(fiatstatus, prsKeys, params)
{ // opdrachten: te fiatteren op mijn budgetten
  var sql = (params.goedkeur
            ? " SELECT op.mld_opdr_key" // Query wordt gebruikt als subquery voor getSqlGoedkeurMld (AND op.mld_opdr_key NOT IN (...))
            : " SELECT sd.ins_srtdiscipline_prefix || op.mld_melding_key || '/' || op.mld_opdr_bedrijfopdr_volgnr aanvraagnummer"
              + "      , mld_opdr_datumbegin datum"
              + "      , pf.prs_perslid_naam_full"
              + "      , mld_opdr_kosten bedrag"
              + "      , 'MLD' module"
              + "      , mld_typeopdr_omschrijving type"
              + "      , " + safe.quoted_sql(fiatstatus) + " fiatstatus"
              + "      , op.mld_opdr_key request_key"
              + "      , op.mld_statusopdr_key statuskey"
              + "      , mld_opdr_datumbegin sortdate"
              + "      , " + lcl.xsql("td.ins_discipline_omschrijving", "td.ins_discipline_key") + " categorie"
              + (fiatstatus == "open"
                ? "    , p2.prs_perslid_naam_full"
                : "    , ' '") + " fiatteur"
              + "      , NULL bes_bestelling_parentkey"
              + "      , sd.ins_srtdiscipline_prefix prefix"
              + "      , NULL uitvoerende"
              + "      , CASE "
                + "      WHEN l.alg_locatie_key IS NULL"
                + "      THEN NULL"
                + "      ELSE l.alg_locatie_omschrijving || ' (' || l.alg_locatie_code || ')'"
                + "      END locatie"
              + "      , g.alg_gebouw_code || ' ' || g.alg_gebouw_naam gebouw"
              + "      , t.alg_terreinsector_code || ' ' || alg_terreinsector_naam terrein"
              + "      , TO_CHAR(SUBSTR(m.mld_melding_omschrijving, 1, 4000)) omschrijving"
              + "      , NULL extra1")
              + "   FROM mld_melding m"
              + "      , mld_stdmelding sm"
              + "      , mld_opdr op"
              + "      , mld_typeopdr ot"
              + "      , prs_v_perslid_fullnames_all pf"
              + "      , prs_kostenplaats k"
              + (params.kpgrp_key_arr
                ? "    , prs_kostenplaatsgrp kpg"
                : "")
              + "      , ins_tab_discipline td"
              + "      , ins_srtdiscipline sd"
              + "      , fac_tracking ft"
              + "      , fac_srtnotificatie fno"
              + "      , " + fac.getVSqlVerantwoordelijk(prsKeys) + " ver"
              + (fiatstatus == "open"
                ? "      , prs_v_perslid_fullnames_all p2"
                : "")
              + "      , alg_locatie l"
              + "      , alg_v_allonroerendgoed onrg"
              + "      , alg_v_aanweziggebouw g"
              + "      , alg_terreinsector t"
              + "  WHERE op.mld_melding_key = m.mld_melding_key"
              + "    AND op.mld_typeopdr_key = ot.mld_typeopdr_key"
              + "    AND COALESCE(op.prs_kostenplaats_key, m.prs_kostenplaats_key) = k.prs_kostenplaats_key" // Indien melding en opdracht geen kostenplaats hebben, dan ook niet fiateren en is de opdrachtstatus al "Uitgegeven"
              + "    AND k.prs_kostenplaats_key = ver.prs_kostenplaats_key(+)"
              + (params.kpgrp_key_arr
                ? "    AND k.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)"
                + "    AND kpg.prs_kostenplaatsgrp_key IN (" + params.kpgrp_key_arr.join(", ") + ")"
                : "")
              + "    AND pf.prs_perslid_key = m.prs_perslid_key"
              + "    AND ft.fac_tracking_refkey = op.mld_opdr_key"
              + "    AND ft.fac_srtnotificatie_key = fno.fac_srtnotificatie_key"
              + "    AND ft.fac_tracking_refkey = op.mld_opdr_key"
              // Door herfiatteren kunnen twee tracking record onstaan. Maximum nemen.
              + "    AND ft.fac_tracking_key = (SELECT MAX(ft2.fac_tracking_key)"
              + "                                 FROM fac_tracking ft2"
              + "                                WHERE ft2.fac_tracking_refkey = op.mld_opdr_key"
              + "                                  AND ft2.fac_srtnotificatie_key = fno.fac_srtnotificatie_key)"
              + "    AND op.mld_melding_key = m.mld_melding_key"
              + "    AND m.mld_stdmelding_key = sm.mld_stdmelding_key"
              + "    AND sm.mld_ins_discipline_key = td.ins_discipline_key"
              + "    AND sd.ins_srtdiscipline_key = td.ins_srtdiscipline_key"
              + "    AND m.mld_alg_locatie_key = l.alg_locatie_key(+)"
              + "    AND m.mld_alg_onroerendgoed_keys = onrg.alg_onroerendgoed_keys(+)"
              + "    AND onrg.alg_gebouw_key = g.alg_gebouw_key(+)"
              + "    AND onrg.alg_terreinsector_key = t.alg_terreinsector_key(+)"
              + (fiatstatus == "open"
                ? " AND fno.fac_srtnotificatie_code = 'ORDFIA'"// Er moe(s)t uberhaupt gefiatteerd worden
                  + " AND op.mld_statusopdr_key = 3"
                  // Door gebruik van de database functie fac.gettrackinguserkey (peventcode IN VARCHAR2, pkey IN NUMBER) in het WHERE statement
                  // is de query zeer traag indien er vervangers zijn gedefinieerd (prsKeys bestaat uit meer dan 1 key).
                  // Daarom de database functie fac.gettrackinguserkey (peventcode IN VARCHAR2, pkey IN NUMBER) uitgeschreven.
                  // De fac_tracking en fac_srtnotificatie mee joinen duurder langer dan onderstaande oplossing.
/* A1 */          //+ " AND p2.prs_perslid_key = CASE WHEN fac.gettrackinguserkey('ORDFOK', op.mld_opdr_key) IS NULL"
/* A1 */          + " AND p2.prs_perslid_key = prs.getFiatteur(op.prs_kostenplaats_key"
                  + (S("mld_opdr_reapproval_rate") >= 0
                    ? "                                      , -1"
                    : "                                      , CASE"
                      + "                                      WHEN op.mld_opdr_fiatbedrag IS NULL"
                      + "                                      THEN NULL"
                      + "                                      ELSE fac.gettrackinguserkey('ORDFOK', op.mld_opdr_key)"
                      + "                                      END")
                  + "                                        , op.mld_opdr_kosten"
                  + "                                        , op.mld_opdr_discipline_key"
                  + "                                        , COALESCE(op.mld_opdr_fiatbedrag, 0))"
                  + " AND p2.prs_perslid_key IN (" + prsKeys + ")"
                : " AND fno.fac_srtnotificatie_code = " + (fiatstatus == "close"? "'ORDFOK'" : "'ORDFNO'") // Er is gefiatteerd.
                  + " AND ft.prs_perslid_key IN (" + prsKeys + ")") // Gefiatterd door jezelf of waarvoor je vervanger bent
              + (params.bld_key_arr // sortering op gebouw, locatie of district
                ? " AND (g.alg_gebouw_key IN (" + params.bld_key_arr.join(",") + ") OR t.alg_terreinsector_key IN (" + params.bld_key_arr.join(",") + "))"
                : (params.loc_key_arr
                  ? " AND l.alg_locatie_key IN (" + params.loc_key_arr.join(",") + ")"
                  : ""))
              + (params.opdrtype_key
                ? " AND ot.mld_typeopdr_key = " + params.opdrtype_key
                : "");
  return sql;
}

// opdrachten die eerst nog goedgekeurd moet worden (nog voordat ze gefiatteerd mogen worden)
function getSqlGoedkeurMld(fiatstatus, prsKeys, params)
{ // opdrachten: goedkeuren
  params.goedkeur = true;
  var sql = " SELECT sd.ins_srtdiscipline_prefix || op.mld_melding_key || '/' || op.mld_opdr_bedrijfopdr_volgnr aanvraagnummer"
          + "      , mld_opdr_datumbegin datum"
          + "      , pf.prs_perslid_naam_full"
          + "      , mld_opdr_kosten bedrag"
          + "      , 'GOED' module"
          + "      , mld_typeopdr_omschrijving type"
          + "      , " + safe.quoted_sql(fiatstatus) + " fiatstatus"
          + "      , op.mld_opdr_key request_key"
          + "      , op.mld_statusopdr_key statuskey"
          + "      , mld_opdr_datumbegin sortdate"
          + "      , " + lcl.xsql("td.ins_discipline_omschrijving", "td.ins_discipline_key") + " categorie"
          + "      , ' ' fiatteur" // dat kunnen er meerdere met WEB_ORDGOE zijn
          + "      , NULL bes_bestelling_parentkey"
          + "      , sd.ins_srtdiscipline_prefix prefix"
          + "      , COALESCE((SELECT b.prs_bedrijf_naam FROM prs_bedrijf b WHERE b.prs_bedrijf_key = op.mld_uitvoerende_keys),"
          + "                 COALESCE((SELECT " + S("prs_pers_string") + " FROM prs_perslid p WHERE p.prs_perslid_key = op.mld_uitvoerende_keys),"
          + "                 '')) uitvoerende"
          + "      , CASE "
            + "      WHEN l.alg_locatie_key IS NULL"
            + "      THEN NULL"
            + "      ELSE l.alg_locatie_omschrijving || ' (' || l.alg_locatie_code || ')'"
            + "      END locatie"
          + "      , g.alg_gebouw_code || ' ' || g.alg_gebouw_naam gebouw"
          + "      , t.alg_terreinsector_code || ' ' || alg_terreinsector_naam terrein"
          + "      , op.mld_opdr_omschrijving omschrijving"
          + "      , NULL extra1"
          + "   FROM mld_melding m"
          + "      , mld_disc_params mdp"
          + "      , mld_stdmelding sm"
          + "      , mld_opdr op"
          + (params.kpgrp_key_arr
            ? "    , prs_kostenplaats k"
            + "    , prs_kostenplaatsgrp kpg"
            : "")
          + "      , mld_typeopdr ot"
          + "      , prs_v_perslid_fullnames_all pf"
          + "      , prs_perslid p"
          + "      , ins_tab_discipline td"
          + "      , ins_srtdiscipline sd"
          + (fiatstatus != "open"
            ? "      , fac_tracking ft"
              + "    , fac_srtnotificatie fno"
            : "")
          + "      , alg_locatie l"
          + "      , alg_v_allonroerendgoed onrg"
          + "      , alg_v_aanweziggebouw g"
          + "      , alg_terreinsector t"
          + "  WHERE op.mld_melding_key = m.mld_melding_key"
          + "    AND op.mld_typeopdr_key = ot.mld_typeopdr_key"
          + "    AND pf.prs_perslid_key = m.prs_perslid_key"
          + "    AND p.prs_perslid_key = m.prs_perslid_key"
          + (params.kpgrp_key_arr
            ? "    AND COALESCE(op.prs_kostenplaats_key, m.prs_kostenplaats_key) = k.prs_kostenplaats_key"
            + "    AND k.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)"
            + "    AND kpg.prs_kostenplaatsgrp_key IN (" + params.kpgrp_key_arr.join(", ") + ")"
            : "")
          + "    AND m.mld_stdmelding_key = sm.mld_stdmelding_key"
          + "    AND sm.mld_ins_discipline_key = td.ins_discipline_key"
          + "    AND sd.ins_srtdiscipline_key = td.ins_srtdiscipline_key"
          + "    AND mdp.mld_ins_discipline_key = op.mld_opdr_discipline_key"
          + "    AND EXISTS("
          // JGL: 31-7-2017 Deze prs-scoping werkt volgens mij niet voor bedrijf-niveau
          //                Bovendien heeft geen van de WEB_ORDGO? uberhaupt PRS-scoping?
          + "         SELECT g.prs_perslid_key"
          + "           FROM fac_v_webgebruiker g"
          + "              , fac_functie f"
          + "              , prs_perslid pzelf"
          + "          WHERE g.fac_functie_key = f.fac_functie_key"
          + "            AND g.ins_discipline_key = op.mld_opdr_discipline_key"
          + "            AND pzelf.prs_perslid_key IN (" +  (S("mld_opdr_validate_by_substitute") == 0? user_key : prsKeys) + ")"
          + "            AND g.prs_perslid_key = pzelf.prs_perslid_key"
          + "            AND (g.fac_gebruiker_prs_level_write = -1"
          + "                 OR (g.fac_gebruiker_prs_level_write < 9"
          + "                     AND pzelf.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 = p.prs_afdeling_key"
          + "                                                  AND aa.niveau = g.fac_gebruiker_prs_level_write))))"
          + "            AND (g.fac_gebruiker_alg_level_write = -1"
          + "                 OR (g.fac_gebruiker_alg_level_write < 9"
          + "                  AND (CASE"
          + "                       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 = pzelf.prs_perslid_key"
          + "                                                         AND niveau = fac_gebruiker_alg_level_write)"
          + "                       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 = pzelf.prs_perslid_key"
          + "                                                                AND l.niveau = fac_gebruiker_alg_level_write)"
          + "                       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 = pzelf.prs_perslid_key"
          + "                                                                AND niveau = fac_gebruiker_alg_level_write)"
          + "                       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 = pzelf.prs_perslid_key"
          + "                                                                AND niveau = fac_gebruiker_alg_level_write)"
          + "                       THEN 1"
          + "                       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 = pzelf.prs_perslid_key"
          + "                                                                AND niveau = fac_gebruiker_alg_level_write)"
          + "                       THEN 1"
          + "                       ELSE 0"
          + "                       END) = 1))"
          + (fiatstatus == "open"
            ? (S("mld_opdr_approval_all") == 0
              ? "                 AND ((fac_functie_code = 'WEB_ORDGOE'"
                + "                    AND ((op.mld_opdr_kosten >= mdp.mld_disc_params_bestellimiet"
                + "                          AND COALESCE (op.mld_opdr_approved, 0) <= mdp.mld_disc_params_bestellimiet)"
                + "                         OR (op.mld_opdr_kosten >= ot.mld_typeopdr_gvs AND COALESCE (op.mld_opdr_approved, -1) < 0)))"
                + "                OR (fac_functie_code = 'WEB_ORDGO2'"
                + "                    AND op.mld_opdr_kosten >= mdp.mld_disc_params_bestellimiet2"
                + "                    AND COALESCE(op.mld_opdr_approved, 0) = mdp.mld_disc_params_bestellimiet2)"
                + "                OR (fac_functie_code = 'WEB_ORDGO3'"
                + "                    AND op.mld_opdr_kosten >= mdp.mld_disc_params_bestellimiet3"
                + "                    AND COALESCE(op.mld_opdr_approved, 0) = mdp.mld_disc_params_bestellimiet3)"
                + "                OR (fac_functie_code = 'WEB_ORDGO4'"
                + "                    AND op.mld_opdr_kosten >= mdp.mld_disc_params_bestellimiet4"
                + "                    AND COALESCE(op.mld_opdr_approved, 0) = mdp.mld_disc_params_bestellimiet4)"
                + "                OR (fac_functie_code = 'WEB_ORDGO5'"
                + "                    AND op.mld_opdr_kosten >= mdp.mld_disc_params_bestellimiet5"
                + "                    AND COALESCE(op.mld_opdr_approved, 0) >= mdp.mld_disc_params_bestellimiet5)"
                + "                  )"
              : "                AND ((fac_functie_code = 'WEB_ORDGOE'"
                + "                    AND op.mld_opdr_kosten <= mdp.mld_disc_params_bestellimiet2"
                + "                    AND COALESCE(op.mld_opdr_approved, 0) <= mdp.mld_disc_params_bestellimiet)"
                + "                OR (fac_functie_code = 'WEB_ORDGO2'"
                + "                    AND op.mld_opdr_kosten <= mdp.mld_disc_params_bestellimiet3"
                + "                    AND COALESCE(op.mld_opdr_approved, 0) <= mdp.mld_disc_params_bestellimiet2)"
                + "                OR (fac_functie_code = 'WEB_ORDGO3'"
                + "                    AND op.mld_opdr_kosten <= mdp.mld_disc_params_bestellimiet4"
                + "                    AND COALESCE(op.mld_opdr_approved, 0) <= mdp.mld_disc_params_bestellimiet3)"
                + "                OR (fac_functie_code = 'WEB_ORDGO4'"
                + "                    AND op.mld_opdr_kosten <= mdp.mld_disc_params_bestellimiet5"
                + "                    AND COALESCE(op.mld_opdr_approved, 0) <= mdp.mld_disc_params_bestellimiet4)"
                + "                OR (fac_functie_code = 'WEB_ORDGO5'"
                + "                    AND op.mld_opdr_kosten >= mdp.mld_disc_params_bestellimiet5"
                + "                    AND COALESCE(op.mld_opdr_approved, 0) <= mdp.mld_disc_params_bestellimiet5)"
                + "                  )")
            : "")
          + "              )"
          + "    AND m.mld_alg_locatie_key = l.alg_locatie_key(+)"
          + "    AND m.mld_alg_onroerendgoed_keys = onrg.alg_onroerendgoed_keys(+)"
          + "    AND onrg.alg_gebouw_key = g.alg_gebouw_key(+)"
          + "    AND onrg.alg_terreinsector_key = t.alg_terreinsector_key(+)"
          + (fiatstatus == "open"
             ? " AND op.mld_statusopdr_key = 10"
             :  " AND mld_opdr_kosten > mdp.mld_disc_params_bestellimiet" // zo duur, moet wel een goedkeur geweest zijn
              + " AND ft.fac_tracking_refkey = op.mld_opdr_key"
              + " AND ft.prs_perslid_key IN (" + (S("mld_opdr_validate_by_substitute") == 0? user_key : prsKeys) + ")"
              + " AND ft.fac_srtnotificatie_key = fno.fac_srtnotificatie_key"
              + " AND fno.fac_srtnotificatie_code IN"
              + (fiatstatus == "close"
                ? " ('ORDFOK', 'ORDGOE') AND m.prs_perslid_key != ft.prs_perslid_key" // Als goedkeurder ook de opdracht heeft aangemaakt dan komt opdracht niet in de gefiatteerd lijst. Is niet zo gemakkelijk en zal performance kosten.
                : " ('ORDGNO')"))
          + (params.bld_key_arr // sortering op gebouw, locatie of district
            ? " AND (g.alg_gebouw_key IN (" + params.bld_key_arr.join(",") + ") OR t.alg_terreinsector_key IN (" + params.bld_key_arr.join(",") + "))"
            : (params.loc_key_arr
              ? " AND l.alg_locatie_key IN (" + params.loc_key_arr.join(",") + ")"
              : ""))
          + (params.opdrtype_key
            ? " AND ot.mld_typeopdr_key = " + params.opdrtype_key
            : "")
          + (fiatstatus == "close"
            ? " AND op.mld_opdr_key NOT IN (" + getSqlFiatMld(fiatstatus, (S("mld_opdr_validate_by_substitute") == 0? user_key : prsKeys), params) + ")"
            : "");
  return sql;
}

// Offertes die geaccepteerd of afgewezen dienen te worden van meldingen waarvoor nog geen uitvoeringsopdracht is aangemaakt.
function getSqlAccAfwOff(prsKeys, params)
{ // opdrachten: accepten/afwijzen
  // Zonder WEB_ORDOAP rechten kom ik hier al niet.
  var sql = " SELECT sd.ins_srtdiscipline_prefix || o.mld_melding_key || '/' || o.mld_opdr_bedrijfopdr_volgnr aanvraagnummer"
          + "      , mld_opdr_datumbegin datum"
          + "      , pf.prs_perslid_naam_full"
          + "      , mld_opdr_kosten bedrag"
          + "      , 'OFFERTE' module"
          + "      , mld_typeopdr_omschrijving type"
          + "      , 'open' fiatstatus"
          + "      , o.mld_opdr_key request_key"
          + "      , o.mld_statusopdr_key statuskey"
          + "      , mld_opdr_einddatum sortdate"
          + "      , " + lcl.xsql("td.ins_discipline_omschrijving", "td.ins_discipline_key") + " categorie"
          + "      , ' ' fiatteur" // dat kunnen er meerdere met WEB_ORDOAP zijn
          + "      , NULL bes_bestelling_parentkey"
          + "      , sd.ins_srtdiscipline_prefix prefix"
          + "      , COALESCE((SELECT b.prs_bedrijf_naam FROM prs_bedrijf b WHERE b.prs_bedrijf_key = o.mld_uitvoerende_keys),"
          + "                 COALESCE((SELECT " + S("prs_pers_string") + " FROM prs_perslid p WHERE p.prs_perslid_key = o.mld_uitvoerende_keys),"
          + "                 '')) uitvoerende"
          + "      , CASE "
            + "      WHEN l.alg_locatie_key IS NULL"
            + "      THEN NULL"
            + "      ELSE l.alg_locatie_omschrijving || ' (' || l.alg_locatie_code || ')'"
            + "      END locatie"
          + "      , g.alg_gebouw_code || ' ' || g.alg_gebouw_naam gebouw"
          + "      , t.alg_terreinsector_code || ' ' || alg_terreinsector_naam terrein"
          + "      , o.mld_opdr_omschrijving omschrijving"
          + "      , NULL extra1"
          + "   FROM mld_melding m"
          + "      , mld_stdmelding sm"
          + "      , mld_opdr o"
          + (params.kpgrp_key_arr
            ? "    , prs_kostenplaats k"
            + "    , prs_kostenplaatsgrp kpg"
            : "")
          + "      , mld_typeopdr ot"
          + "      , prs_v_perslid_fullnames_all pf"
          + "      , ins_tab_discipline td"
          + "      , mld_disc_params dp"
          + "      , ins_srtdiscipline sd"
          + "      , (SELECT o1.mld_melding_key"
          + "              , COUNT (o1.mld_opdr_key) aantal_opdrachten"
          + "              , MAX(o1.mld_opdr_bedrijfopdr_volgnr) lastopdrachtvolgnr"
          + "           FROM mld_opdr o1"
          + "              , mld_typeopdr mto"
          + "          WHERE o1.mld_typeopdr_key = mto.mld_typeopdr_key"
          + "            AND mto.mld_typeopdr_isofferte = 0"
          + "         GROUP BY o1.mld_melding_key) opdracht"
          + "      , alg_locatie l"
          + "      , alg_v_allonroerendgoed onrg"
          + "      , alg_v_aanweziggebouw g"
          + "      , alg_terreinsector t"
          + "  WHERE o.mld_melding_key = m.mld_melding_key"
          + "    AND o.mld_typeopdr_key = ot.mld_typeopdr_key"
          + "    AND pf.prs_perslid_key = m.prs_perslid_key"
          + "    AND m.mld_stdmelding_key = sm.mld_stdmelding_key"
          + (params.kpgrp_key_arr
            ? "    AND COALESCE(o.prs_kostenplaats_key, m.prs_kostenplaats_key) = k.prs_kostenplaats_key(+)"
            + "    AND k.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)"
            + "    AND kpg.prs_kostenplaatsgrp_key IN (" + params.kpgrp_key_arr.join(", ") + ")"
            : "")
          + "    AND sm.mld_ins_discipline_key = td.ins_discipline_key"
          + "    AND sd.ins_srtdiscipline_key = td.ins_srtdiscipline_key"
          + "    AND dp.mld_ins_discipline_key = o.mld_opdr_discipline_key"
          + "    AND ot.mld_typeopdr_isofferte = 1"
          + "    AND o.mld_melding_key = opdracht.mld_melding_key(+)"
          + "    AND (opdracht.aantal_opdrachten IS NULL"
          + "         OR opdracht.lastopdrachtvolgnr < o.mld_opdr_bedrijfopdr_volgnr"
          + "         OR dp.mld_disc_params_offerteauto = 0)"
          + "    AND o.mld_statusopdr_key IN (6)"
          + "    AND m.mld_alg_locatie_key = l.alg_locatie_key(+)"
          + "    AND m.mld_alg_onroerendgoed_keys = onrg.alg_onroerendgoed_keys(+)"
          + "    AND onrg.alg_gebouw_key = g.alg_gebouw_key(+)"
          + "    AND onrg.alg_terreinsector_key = t.alg_terreinsector_key(+)"
          + "    AND EXISTS(SELECT g.prs_perslid_key"
          + "                 FROM fac_v_webgebruiker g"
          + "                    , fac_functie f"
          + "                    , prs_perslid pzelf"
          + "                WHERE g.fac_functie_key = f.fac_functie_key"
          + "                  AND f.fac_functie_code = 'WEB_ORDBOF'"
          + "                  AND g.ins_discipline_key = o.mld_opdr_discipline_key"
          + "                  AND pzelf.prs_perslid_key IN (" + prsKeys + ")"
          + "                  AND g.prs_perslid_key = pzelf.prs_perslid_key"
          + "                  AND (g.fac_gebruiker_alg_level_read = -1"
          + "                       OR (g.fac_gebruiker_alg_level_read < 9"
          + "                           AND (CASE"
          + "                                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 = pzelf.prs_perslid_key"
          + "                                                                  AND niveau = fac_gebruiker_alg_level_read)"
          + "                                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 = pzelf.prs_perslid_key"
          + "                                                                         AND l.niveau = fac_gebruiker_alg_level_read)"
          + "                                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 = pzelf.prs_perslid_key"
          + "                                                                         AND niveau = fac_gebruiker_alg_level_read)"
          + "                                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 = pzelf.prs_perslid_key"
          + "                                                                         AND niveau = fac_gebruiker_alg_level_read)"
          + "                                THEN 1"
          + "                                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 = pzelf.prs_perslid_key"
          + "                                                                         AND niveau = fac_gebruiker_alg_level_read)"
          + "                                THEN 1"
          + "                                ELSE 0"
          + "                                END) = 1))"
          + "              )"
          + "   AND o.mld_opdr_discipline_key IN"
          + "        (SELECT DISTINCT wg.ins_discipline_key"
          + "           FROM fac_v_webgebruiker wg, fac_functie f"
          + "          WHERE f.fac_functie_key = wg.fac_functie_key"
          + "            AND f.fac_functie_code = 'WEB_ORDOAP'"
          + "            AND wg.fac_gebruiker_alg_level_write < 9"
          + "            AND wg.fac_gebruiker_prs_level_write < 9"
          + "            AND wg.prs_perslid_key = " + user_key + ")"
          + (params.bld_key_arr // sortering op gebouw/terrein, locatie of district
            ? " AND (g.alg_gebouw_key IN (" + params.bld_key_arr.join(",") + ") OR t.alg_terreinsector_key IN (" + params.bld_key_arr.join(",") + "))"
            : (params.loc_key_arr
              ? " AND l.alg_locatie_key IN (" + params.loc_key_arr.join(",") + ")"
              : ""))
          + (params.opdrtype_key
            ? " AND ot.mld_typeopdr_key = " + params.opdrtype_key
            : "");
  return sql;
}

// Facturen die gefiatteerd moet worden.
function getSqlFiatFin(fiatstatus, prsKeys, params)
{ // Facturen: fiatteren.
  // Zonder WEB_FINBOF rechten of zonder dat ik budgethouder ben, kom ik hier al niet.
  var scope = getCntScope(params);

  var loc_count = "(SELECT COUNT(loc) FROM theScope scope WHERE scope.cnt_key = c.cnt_contract_key)";
  var loc_oms = "(SELECT loc_oms FROM theScope scope WHERE scope.cnt_key = c.cnt_contract_key)";
  var gebter_oms = "(SELECT gebter_oms FROM theScope scope WHERE scope.cnt_key = c.cnt_contract_key)";
  var filterlocatie = (params.dist_key_arr? true : false);
  var filter_gebonden = getCntGebonden(params);

  var authparamsFINBOF = user.checkAutorisation("WEB_FINBOF", true);
  var sql = " WITH theScope AS (" + scope + ")"
          + " SELECT DISTINCT TO_CHAR(f.fin_factuur_key) aanvraagnummer"
          + "      , f.fin_factuur_datum datum"
          + "      , pf.prs_perslid_naam_full"
          + "      , (fin_factuur_totaal + fin_factuur_totaal_btw) bedrag"
          + "      , 'FIN' module"
          + "      , CASE"
            + "      WHEN f.bes_bestelopdr_key IS NOT NULL"
            + "      THEN 'Bestelling'"
            + "      WHEN f.cnt_contract_key IS NOT NULL"
            + "      THEN 'Contract'"
            + "      WHEN f.mld_opdr_key IS NOT NULL"
            + "      THEN 'Opdracht'"
            + "      END type"
          + "      , " + safe.quoted_sql(fiatstatus) + " fiatstatus"
          + "      , f.fin_factuur_key request_key"
          + "      , f.fin_factuur_statuses_key statuskey"
          + "      , f.fin_factuur_datum sortdate"
          + "      , NULL categorie"
          + (fiatstatus == "open"
            ? "    , ' '"
            : "    , pf2.prs_perslid_naam_full") + " fiatteur"
          + "      , NULL bes_bestelling_parentkey"
          + "      , NULL prefix"
          + "      , 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 " + S("prs_pers_string") + " FROM prs_perslid p WHERE p.prs_perslid_key = c.cnt_prs_perslid_key)) uitvoerende"
          + "      , CASE"
          + "        WHEN f.bes_bestelopdr_key IS NOT NULL"
          + "        THEN (SELECT m.mld_adres_naam FROM mld_v_afleveradres m WHERE m.mld_adres_key IN (bo.mld_adres_key_lev))"
          + "        WHEN f.cnt_contract_key IS NOT NULL"
          + "        THEN CASE " + loc_count
            + "           WHEN 0"
            + "           THEN NULL"
            + "           WHEN 1"
            + "           THEN " + loc_oms
            + "           ELSE " + safe.quoted_sql(L("lcl_cnt_locatie_m")) + " || "
            + "                ' (' || TO_CHAR(" + loc_count + ") || ')'"  // Er kunnen meerdere locaties zijn (contract scope)
            + "           END"
          + "        WHEN f.mld_opdr_key IS NOT NULL"
          + "        THEN CASE "
            + "           WHEN l.alg_locatie_key IS NULL"
            + "           THEN NULL"
            + "           ELSE l.alg_locatie_omschrijving || ' (' || l.alg_locatie_code || ')'"
            + "           END"
          + "        END locatie"
          + "      , CASE"
          + "        WHEN f.bes_bestelopdr_key IS NOT NULL"
          + "        THEN NULL"
          + "        WHEN f.cnt_contract_key IS NOT NULL"
          + "        THEN CASE " + loc_count
            + "           WHEN 1"
            + "           THEN TO_CHAR (" + gebter_oms + ")"
            + "           ELSE NULL"
            + "           END"
          + "        WHEN f.mld_opdr_key IS NOT NULL"
          + "        THEN g.alg_gebouw_code || ' ' || g.alg_gebouw_naam"
          + "        END gebouw"
          + "      , CASE"
          + "        WHEN f.mld_opdr_key IS NOT NULL"
          + "        THEN t.alg_terreinsector_code || ' ' || alg_terreinsector_naam"
          + "        ELSE NULL" // f.bes_bestelopdr_key IS NOT NULL en f.cnt_contract_key IS NOT NULL
          + "        END terrein"
          + "      , NULL omschrijving"
          + "      , NULL extra1"
          + "   FROM (SELECT fin.getfiatteur(f.fin_factuur_key) budgethouder, f.* from fin_factuur f) f"
          + "      , prs_v_perslid_fullnames_all pf"
          +  "     , bes_bestelopdr bo"
          +  "     , mld_opdr o"
          + (params.kpgrp_key_arr
            ? "    , bes_bestelopdr_item boi"
            + "    , bes_bestelling_item bi"
            + "    , bes_bestelling b"
            + "    , prs_kostenplaats k"
            + "    , prs_kostenplaatsgrp kpg"
            : "")
          +  "     , mld_melding m"
          +  "     , cnt_contract c"
          +  "     , alg_locatie l"
          +  "     , alg_v_allonroerendgoed onrg"
          +  "     , alg_v_aanweziggebouw g"
          +  "     , alg_terreinsector t"
          + (filterlocatie
            ? ", cnt_contract_plaats cp"
            : "")
          + (fiatstatus != "open"
            ? "    , fac_tracking ft"
              + "  , fac_srtnotificatie fno"
              + "  , prs_v_perslid_fullnames_all pf2"
            : "")
          + "  WHERE f.prs_perslid_key_user = pf.prs_perslid_key(+)"
          + "    AND f.bes_bestelopdr_key = bo.bes_bestelopdr_key(+)"
          + "    AND f.mld_opdr_key = o.mld_opdr_key(+)"         //      vast staat in welke tak we zitten
          + "    AND o.mld_melding_key = m.mld_melding_key(+)"
          + (params.kpgrp_key_arr
            ? "    AND bo.bes_bestelopdr_key = boi.bes_bestelopdr_key(+)"
            + "    AND boi.bes_bestelopdr_item_key = bi.bes_bestelopdr_item_key(+)"
            + "    AND bi.bes_bestelling_key = b.bes_bestelling_key(+)"
            + "    AND COALESCE(o.prs_kostenplaats_key, c.prs_kostenplaats_key, b.prs_kostenplaats_key) = k.prs_kostenplaats_key(+)"
            + "    AND k.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)"
            + "    AND kpg.prs_kostenplaatsgrp_key IN (" + params.kpgrp_key_arr.join(", ") + ")"
            : "")
          + "    AND f.cnt_contract_key = c.cnt_contract_key(+)"
          + "    AND f.fin_factuur_verwijder IS NULL"
          // Ik kan facturen fiatteren 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)
          // "AND (" + sql1a + " OR " + sql1b + " OR " + sql2 + " OR " + sql3 + ")"
          + " AND ("
          + (authparamsFINBOF && authparamsFINBOF.ALGwritelevel > -1
            ? // 1a) Heb ik ALG write rechten (WEB_FINBOF) op het afleveradres van de locatie van de bestelling?
              " (f.bes_bestelopdr_key IS NOT NULL "
                + " AND bo.mld_adres_key_lev IN (SELECT ma.mld_adres_key"
                + "                                FROM mld_v_afleveradres ma"
                + "                               WHERE ma.alg_locatie_key IN (SELECT alg_locatie_key"
                + "                                                              FROM fac_v_my_locations"
                + "                                                             WHERE prs_perslid_key IN (" + prsKeys + ")"
                + "                                                               AND niveau = " + authparamsFINBOF.ALGwritelevel + ")))"
                // 1b) Heb ik ALG write rechten (WEB_FINBOF) op de plaats van de bijbehorende melding van de opdracht?
                + " OR (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.ALGwritelevel + "))"
                + "          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.ALGwritelevel + "))"
                + "          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.ALGwritelevel + "))"
                + "          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.ALGwritelevel + "))"
                + "          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.ALGwritelevel + "))"
                + "         )"
                + "    )"
                // 1c) Heb ik ALG write rechten (WEB_FINBOF) op de plaats van het bijbehorende contract?
                + " OR (f.cnt_contract_key IS NOT NULL"
                + "     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 = " + authparamsFINBOF.ALGwritelevel + "))"
                + "             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.ALGwritelevel + "))"
                + "       ))"
                + "    )"
            : (authparamsFINBOF && authparamsFINBOF.ALGwritelevel == -1
              ? " 1 = 1"   // Volledige FINBOF rechten
              : " 1 = 0")) // Geen enkele FINBOF rechten
          // 2) Ben ik budgethouder van de BrOC-kostenplaats?
          + " OR (budgethouder IN (" + prsKeys + "))"
          + ")"
          + (params.opdrtype_key
            ? " AND o.mld_typeopdr_key = " + params.opdrtype_key
            : "")
          + (fiatstatus == "open"
             ? " AND f.fin_factuur_statuses_key IN (2)"
               //+ " AND f.prs_perslid_key_goedkeur IN (" + prsKeys + ")"
             : " AND ft.fac_tracking_refkey = f.fin_factuur_key"
               + " AND ft.prs_perslid_key = pf2.prs_perslid_key"
               + " AND ft.prs_perslid_key IN (" + prsKeys + ")" // Alleen die facturen die ik zelf (ook als vervanger) kon fiatteren/afkeuren.
               + " AND ft.fac_srtnotificatie_key = fno.fac_srtnotificatie_key"
               + " AND fno.fac_srtnotificatie_code IN"
               + (fiatstatus == "close"
                 ? " ('FINGOE')"
                 : " ('FINFNO')"))
          + "    AND m.mld_alg_locatie_key = l.alg_locatie_key(+)"
          + "    AND m.mld_alg_onroerendgoed_keys = onrg.alg_onroerendgoed_keys(+)"
          + "    AND onrg.alg_gebouw_key = g.alg_gebouw_key(+)"
          + "    AND onrg.alg_terreinsector_key = t.alg_terreinsector_key(+)"
          + (filterlocatie
            ? "    AND c.cnt_contract_key = cp.cnt_contract_key(+)"
              + "    AND cp.cnt_alg_plaats_code(+) IN ('G', 'L', 'T')"
            : "");

  // Locatie, Gebouw of Terrein filtering.
  // Als bld_key_arr een geldige waarde heeft, hebben loc_key_arr en dist_key_arr ook een geldige waarde.
  if (params.dist_key_arr)
  {
    var loc_key_arr = params.loc_key_arr;
    var bld_key_arr = params.bld_key_arr;
    // Als alleen dist_key_arr bekend is dan zoeken voor alle locaties (loc_key_arr) bij deze districten (dist_key_arr).
    // 1) Het afleveradres van de locatie van de bestelling (bld_key_arr 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_arr
                   ? " AND (  (onrg.alg_gebouw_key IN (" + bld_key_arr.join(",") + "))"
                     + "   OR (onrg.alg_terreinsector_key IN (" + bld_key_arr.join(",") + "))"
                     + "   )"
                   : "")
                 + "    ))";

    // 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_arr)
    {
      sql3 += "     OR (cnt_alg_plaats_code = 'G' AND cnt_alg_plaats_key IN (" + bld_key_arr.join(",") + "))"
            + "     OR (cnt_alg_plaats_code = 'T' AND cnt_alg_plaats_key IN (" + bld_key_arr.join(",") + "))";
    }
    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 + ")";
  }

  return " SELECT * FROM (" + sql + ")";
}

// Facturen die goedgekeurd moet worden nadat ze gefiatteerd zijn geworden
function getSqlGoedkeurFin(fiatstatus, prsKeys, params)
{ // Facturen: goedkeuren
  // Zonder WEB_FINGOE rechten kom ik hier al niet.
  var sql = " SELECT TO_CHAR(f.fin_factuur_key) aanvraagnummer"
          + "      , f.fin_factuur_datum datum"
          + "      , pf.prs_perslid_naam_full"
          + "      , (fin_factuur_totaal + fin_factuur_totaal_btw) bedrag"
          + "      , 'FIN2' module"
          + "      , CASE"
          + "        WHEN f.bes_bestelopdr_key IS NOT NULL"
          + "        THEN 'Bestelling'"
          + "        WHEN f.cnt_contract_key IS NOT NULL"
          + "        THEN 'Contract'"
          + "        WHEN f.mld_opdr_key IS NOT NULL"
          + "        THEN 'Opdracht'"
          + "        END type"
          + "      , " + safe.quoted_sql(fiatstatus) + " fiatstatus"
          + "      , f.fin_factuur_key request_key"
          + "      , f.fin_factuur_statuses_key statuskey"
          + "      , f.fin_factuur_datum sortdate"
          + "      , NULL categorie"
          + "      , pf2.prs_perslid_naam_full fiatteur"
          + "      , NULL bes_bestelling_parentkey"
          + "      , NULL prefix"
          + "      , NULL uitvoerende"
          + "      , CASE"
            + "      WHEN f.mld_opdr_key IS NOT NULL"
            + "      THEN CASE "
            + "           WHEN l.alg_locatie_key IS NULL"
            + "           THEN NULL"
            + "           ELSE l.alg_locatie_omschrijving || ' (' || l.alg_locatie_code || ')'"
            + "           END"
            + "      ELSE NULL"
            + "      END locatie"
          + "      , CASE"
            + "      WHEN f.mld_opdr_key IS NOT NULL"
            + "      THEN g.alg_gebouw_code || ' ' || g.alg_gebouw_naam"
            + "      ELSE NULL"
            + "      END gebouw"
          + "      , CASE"
            + "      WHEN f.mld_opdr_key IS NOT NULL"
            + "      THEN t.alg_terreinsector_code || ' ' || alg_terreinsector_naam"
            + "      ELSE NULL" // f.bes_bestelopdr_key IS NOT NULL en f.cnt_contract_key IS NOT NULL
            + "      END terrein"
          + "      , NULL omschrijving"
          + "      , NULL extra1"
          + "   FROM fin_factuur f"
          + "      , mld_opdr o"
          + "      , mld_melding m"
          + "      , alg_locatie l"
          + "      , alg_v_allonroerendgoed onrg"
          + "      , alg_v_aanweziggebouw g"
          + "      , alg_terreinsector t"
          + (params.kpgrp_key_arr
            ? "      , cnt_contract c"
            + "      , bes_bestelopdr bo"
            + "      , bes_bestelopdr_item boi"
            + "      , bes_bestelling_item bi"
            + "      , bes_bestelling b"
            + "      , prs_kostenplaats k"
            + "      , prs_kostenplaatsgrp kpg"
            : "")
          + "      , prs_v_perslid_fullnames_all pf"
          + "      , prs_v_perslid_fullnames_all pf2"
          + (fiatstatus != "open"
            ? "    , fac_tracking ft"
              + "  , fac_srtnotificatie fno"
            : "")
          + "  WHERE f.prs_perslid_key_user = pf.prs_perslid_key(+)"
          + "    AND f.prs_perslid_key_goedkeur = pf2.prs_perslid_key"
          + "    AND f.mld_opdr_key = o.mld_opdr_key(+)"
          + "    AND o.mld_melding_key = m.mld_melding_key(+)"
          + "    AND m.mld_alg_locatie_key = l.alg_locatie_key(+)"
          + "    AND m.mld_alg_onroerendgoed_keys = onrg.alg_onroerendgoed_keys(+)"
          + "    AND onrg.alg_gebouw_key = g.alg_gebouw_key(+)"
          + "    AND onrg.alg_terreinsector_key = t.alg_terreinsector_key(+)"
          + (params.kpgrp_key_arr
            ? "    AND f.cnt_contract_key = c.cnt_contract_key(+)"
            + "    AND f.bes_bestelopdr_key = bo.bes_bestelopdr_key(+)"
            + "    AND bo.bes_bestelopdr_key = boi.bes_bestelopdr_key(+)"
            + "    AND boi.bes_bestelopdr_item_key = bi.bes_bestelopdr_item_key(+)"
            + "    AND bi.bes_bestelling_key = b.bes_bestelling_key(+)"
            + "    AND COALESCE(c.prs_kostenplaats_key, o.prs_kostenplaats_key, b.prs_kostenplaats_key) = k.prs_kostenplaats_key(+)"
            + "    AND k.prs_kostenplaatsgrp_key = kpg.prs_kostenplaatsgrp_key(+)"
            + "    AND kpg.prs_kostenplaatsgrp_key IN (" + params.kpgrp_key_arr.join(", ") + ")"
            : "")
          + (fiatstatus == "open"
             ? " AND f.fin_factuur_statuses_key IN (5)"
               + " AND f.prs_perslid_key_goedkeur IN (" + prsKeys + ")"
             :  " AND ft.fac_tracking_refkey = f.fin_factuur_key"
               + " AND ft.prs_perslid_key IN (" + prsKeys + ")" // Alleen die facturen die ik zelf (ook als vervanger) kon goedkeuren/afkeuren.
               + " AND ft.fac_srtnotificatie_key = fno.fac_srtnotificatie_key"
               + " AND fno.fac_srtnotificatie_code IN"
               + (fiatstatus == "close"
                 ? " ('FINFOK')"
                 : " ('FINGNO')")
               + " AND f.prs_perslid_key_goedkeur = ft.prs_perslid_key"); // Goedkeurder heeft goedgekeurd/afgekeurd.

  return sql;
}

function getSqlFiatRes(fiatstatus, prsKeys, params)
{ // Reserveringen: catalogus artikelen fiatteren.
  var sql = "SELECT aanvraagnummer"
          + "     , datum"
          + "     , prs_perslid_naam_full"
          + "     , SUM(bedrag) bedrag"
          + "     , module"
          + "     , type"
          + "     , fiatstatus"
          + "     , request_key"
          + "     , statuskey"
          + "     , sortdate"
          + "     , MIN(categorie) || CASE WHEN MIN(categorie) != MAX(categorie) THEN '...' ELSE '' END categorie"
          + "     , fiatteur"
          + "     , bes_bestelling_parentkey"
          + "     , prefix"
          + "     , uitvoerende"
          + "     , locatie"
          + "     , gebouw"
          + "     , terrein"
          + "     , omschrijving"
          + "     , extra1"
          + "  FROM (SELECT DISTINCT TO_CHAR(COALESCE(rsact.res_srtactiviteit_prefix, '') || rrr.res_reservering_key || '/' || rrr.res_rsv_ruimte_volgnr) aanvraagnummer"
          + "             , rrr.res_rsv_ruimte_aanmaak datum"
          + "             , p.prs_perslid_naam_full"
          + "             , (  SELECT SUM(res.getartikelprijs(ra1.res_rsv_artikel_key))"
          + "                    FROM res_rsv_artikel ra1"
          + "                       , res_rsv_ruimte rr1"
          + "                       , res_artikel a1"
          + "                       , res_discipline d1"
          + "                   WHERE ra1.res_rsv_ruimte_key = rr1.res_rsv_ruimte_key"
          + "                     AND rr1.res_rsv_ruimte_key = rrr.res_rsv_ruimte_key"
          + "                     AND ra1.res_artikel_key = a1.res_artikel_key"
          + "                     AND d1.ins_discipline_key = a1.res_discipline_key"
          + "                     AND ra1.res_rsv_artikel_verwijder IS NULL"
          + "                     AND d1.ins_discipline_key = d.ins_discipline_key"
          + "                GROUP BY d.ins_discipline_key) bedrag"
          + "             , 'RES' module"
          + "             , 'mld_typeopdr_omschrijving' type"
          + "             , " + safe.quoted_sql(fiatstatus) + " fiatstatus"
          + "             , rrr.res_rsv_ruimte_key request_key"
          + "             , COALESCE(rrr.res_status_bo_key, rra.res_status_bo_key) statuskey"
          + "             , rrr.res_rsv_ruimte_aanmaak sortdate"
          + "             , " + lcl.xsql("d.ins_discipline_omschrijving", "d.ins_discipline_key") + " categorie"
          + "             , (SELECT p2.prs_perslid_naam_full"
          + "                  FROM prs_v_perslid_fullnames_all p2"
          + "                 WHERE p2.prs_perslid_key = k.prs_perslid_key) fiatteur"
          + "             , NULL bes_bestelling_parentkey"
          + "             , NULL prefix"
          + "             , NULL uitvoerende"
          + "             , l.alg_locatie_omschrijving || ' (' || l.alg_locatie_code || ')' locatie"
          + "             , aog.alg_gebouw_code || ' ' || aog.alg_gebouw_naam gebouw"
          + "             , NULL terrein" // Terrein heeft geen ruimte /*(aog.alg_terreinsector_code || ' ' || aog.alg_terreinsector_naam terrein)*/
          + "             , res_rsv_ruimte_omschrijving omschrijving"
          + "             , NULL extra1"
          + "          FROM res_rsv_ruimte rrr"
          + "             , res_rsv_artikel rra"
          + "             , res_artikel ra"
          + "             , res_ruimte_opstelling rro"
          + "             , res_ruimte rr"
          + "             , res_v_aanwezigalg_ruimte rar"
          + "             , alg_v_allonrgoed_gegevens aog"
          + "             , alg_locatie l"
          + "             , res_discipline d"
          + "             , res_disc_params dp"
          + "             , prs_v_perslid_fullnames_all p"
          + "             , prs_kostenplaats k"
          + "             , res_activiteit ract"
          + "             , res_srtactiviteit rsact"
          + "         WHERE rrr.res_rsv_ruimte_key = rra.res_rsv_ruimte_key"
          + "           AND rra.res_artikel_key = ra.res_artikel_key"
          + "           AND rrr.res_ruimte_opstel_key = rro.res_ruimte_opstel_key(+)"
          + "           AND rro.res_ruimte_key = rr.res_ruimte_key(+)"
          + "           AND rr.res_ruimte_key = rar.res_ruimte_key(+)"
          + "           AND aog.alg_ruimte_key = COALESCE(rrr.alg_ruimte_key, rar.alg_ruimte_key)"
          + "           AND aog.alg_locatie_key = l.alg_locatie_key"
          + "           AND d.ins_discipline_key = ra.res_discipline_key"
          + "           AND d.ins_discipline_key = dp.res_ins_discipline_key"
          + "           AND rrr.res_rsv_ruimte_contact_key = p.prs_perslid_key"
          + "           AND rrr.prs_kostenplaats_key = k.prs_kostenplaats_key"
          + "           AND rrr.res_activiteit_key = ract.res_activiteit_key"
          + "           AND ract.res_srtactiviteit_key = rsact.res_srtactiviteit_key"
          + "           AND rrr.res_rsv_ruimte_verwijder IS NULL"
          // Welke artikelen moeten/kunnen gefiatteerd worden?
          // 1) Dan moeten er artikelregels gevonden zijn die nog niet gefiatteerd zijn (res_rsv_artikel_approved = 0).
          // 2) De BO status (res_status_bo_key) moet Nieuw(2) zijn (COALESCE(res_rsv_ruimte.res_status_bo_key, res_rsv_artikel.res_status_bo_key) = 2).
          //    Als de BO status al Afgemeld(5) is of Verwerkt(6) dan is de reservering al voorbij en heeft fiattering geen zin meer.
          // 3) Dan moet gelden dat de artikelen in de catalogus gefiatteerd dienen te worden (res_rsv_ruimte_cat_appr == 1)
          //    Tijdens het opslaan wordt gekeken of er catalogussen zijn met een totaal bestelbedrag die boven de drempelwaarde ligt.
          //    Afhankelijk daarvan wordt de waarde res_rsv_ruimte_cat_appr op 0=Nee of 1=Ja gezet (Wel of niet fiatteren).
          // 4) Ben ik de budgethouder van de kostenplaats van de reservering?
          + (fiatstatus == "open"
            ? "         AND rra.res_rsv_artikel_approved = 0"                           // 1) Er zijn niet gefiatteerde artikelregels.
              + "       AND COALESCE(rrr.res_status_bo_key, rra.res_status_bo_key) = 2" // 2) De BO status is Nieuw(2).
            : (fiatstatus == "close"
              ? "       AND rra.res_rsv_artikel_approved = 1"                           // 1) Er zijn gefiatteerde artikelregels.
              : "       AND rra.res_rsv_artikel_approved = 2"))                         // 1) Er zijn afgewezen artikelregels.
          + "           AND rrr.res_rsv_ruimte_cat_appr = 1"                            // 3) De artikelen in de catalogus dienen gefiatteerd te worden (res_rsv_ruimte_cat_appr == 1).
          + "           AND k.prs_perslid_key IN (" + prsKeys + ")"                     // 4) Alleen reserveringen waarvan ik budgethouder (kostenplaatsverantwoordelijke) ben.
          + "       )"
          + " GROUP BY aanvraagnummer"
          + "        , datum"
          + "        , prs_perslid_naam_full"
          + "        , module"
          + "        , type"
          + "        , fiatstatus"
          + "        , request_key"
          + "        , statuskey"
          + "        , sortdate"
          + "        , fiatteur"
          + "        , bes_bestelling_parentkey"
          + "        , prefix"
          + "        , uitvoerende"
          + "        , locatie"
          + "        , gebouw"
          + "        , terrein"
          + "        , omschrijving"
          + "        , extra1";

  return sql;
}


function getSqlInstemMld(fiatstatus, prsKeys, params)
{ // Meldingen: in te stemmen.
  var sql = "SELECT sd.ins_srtdiscipline_prefix || m.mld_melding_key aanvraagnummer"
          + "     , m.mld_melding_datum                datum"
          + "     , pf.prs_perslid_naam_full"
          + "     , NULL                               bedrag"
          + "     , 'MLDIN'                            module"
          + "     , sm.mld_stdmelding_omschrijving     type"
          + "     , 'open'                             fiatstatus"   // per definitie
          + "     , m.mld_melding_key                  request_key"
          + "     , m.mld_melding_status               statuskey"
          + "     , mld_melding_datum                  sortdate"
          + "     , " + lcl.xsql("di.ins_discipline_omschrijving", "di.ins_discipline_key") + " categorie"
          + (fiatstatus == "open"
            ? "     , pf2.prs_perslid_naam_full"
            : "     , ''") + " fiatteur"
          + "     , NULL                               bes_bestelling_parentkey"
          + "     , sd.ins_srtdiscipline_prefix        prefix"
          + "     , NULL                               uitvoerende"
          + "     , alg_locatie_omschrijving           locatie"
          + "     , alg_gebouw_naam                    gebouw"
          + "     , alg_terreinsector_naam             terrein"
          + "     , mld_melding_onderwerp              omschrijving"
          + "     , mld_melding_conceptstatus          extra1"       // teveel
          + "  FROM mld_melding                  m"
          + "     , mld_stdmelding               sm"
          + "     , ins_tab_discipline           di"
          + "     , ins_srtdiscipline            sd"
          + "     , prs_v_perslid_fullnames_all  pf"
          + "     , alg_v_allonrgoed_gegevens    v"
          + "     , alg_locatie                  l"
          + (fiatstatus == "open"
            ? "   , prs_v_perslid_fullnames_all pf2"
            : "   , fac_tracking                 ft"
              + " , fac_srtnotificatie           fno")
          + " WHERE m.prs_perslid_key_voor = pf.prs_perslid_key"
          + "   AND m.mld_alg_onroerendgoed_keys = v.alg_onroerendgoed_keys(+)"
          + "   AND m.mld_alg_locatie_key = l.alg_locatie_key(+)"
          + "   AND m.mld_stdmelding_key = sm.mld_stdmelding_key"
          + "   AND sd.ins_srtdiscipline_key = di.ins_srtdiscipline_key"
          + "   AND sm.mld_ins_discipline_key = di.ins_discipline_key"
          + (fiatstatus == "open"
            ? " AND mld_melding_status = 2"
              + " AND mld_melding_conceptstatus > 0"
              + " AND pf2.prs_perslid_key = mld.getinstemmer(m.mld_melding_key)"
              + " AND pf2.prs_perslid_key IN (" + prsKeys + ")"      // Alleen mijn instemmingen
            : "   AND ft.fac_tracking_refkey = m.mld_melding_key"
              + " AND ft.fac_srtnotificatie_key = fno.fac_srtnotificatie_key"
              + " AND ft.prs_perslid_key IN (" + prsKeys + ")"
              + (fiatstatus == "close"
                ? " AND fno.fac_srtnotificatie_code IN ('MLDUPD')"
                  + " AND ft.fac_tracking_datum <= (SELECT MIN(ft2.fac_tracking_datum)"
                  + "                                 FROM fac_tracking ft2"
                  + "                                    , fac_srtnotificatie fno2"
                  + "                                WHERE ft2.fac_tracking_refkey = m.mld_melding_key"
                  + "                                  AND ft2.fac_srtnotificatie_key = fno2.fac_srtnotificatie_key"
                  + "                                  AND fno2.fac_srtnotificatie_code IN ('MLDNEW'))"
                : " AND fno.fac_srtnotificatie_code IN ('MLDREJ')"));

  return sql;
}



// Uit alle sql-definities hierboven wordt hier het uiteindelijke totale query samengesteld en opgeleverd
// waarbij onnodige delen worden weggelaten. Dat gebeurt met UNION ALL, dus al die query-functies moeten
// een gelijkvormig resultaat opleveren in termen van kolommen, namen en volgorde, en wel deze:
//
//  aanvraagnummer
//  datum
//  prs_perslid_naam_full
//  bedrag
//  module
//  type
//  fiatstatus
//  request_key
//  statuskey
//  sortdate
//  categorie
//  fiatteur
//  bes_bestelling_parentkey
//  prefix
//  uitvoerende
//  locatie
//  gebouw
//  terrein
//  omschrijving
//  extra1  (ruimte om specifiek nog wat op te leveren, type=numeriek vooralsnog
//
function fiattering_sql(params)
{
  var haveORDOAPrights = user.checkAutorisation("WEB_ORDOAP", true); // Heb ik WEB_ORDOAP rechten om offertes te accepteren/af te wijzen.
  var haveFINBOFrights = user.checkAutorisation("WEB_FINBOF", true); // Heb ik WEB_FINBOF rechten om facturen te fiatteren/af te wijzen.
  var haveFINGOErights = user.checkAutorisation("WEB_FINGOE", true); // Heb ik WEB_FINGOE rechten om facturen goed te keuren/af te wijzen.

  var prsKeys = user.collegakeylist();

  params.betreft = params.betreft || [];
  // Betreft hoofdletter onafhankelijk maken.
  for (var i = 0; i < params.betreft.length; i++)
  {
    params.betreft[i] = params.betreft[i].toUpperCase();
  }

  var sqls = [];
  if (params.opdrtype_key)
  { // Er wordt gezocht naar een opdrachttype, die bestaan alleen voor offertes, opdrachten en eventueel bij facturen van opdrachten.
    // Verwijder "BES" uit de betreft array.
    for (var i = 0; i < params.betreft.length; i++)
    {
      if (params.betreft[i] == "BES")
        params.betreft.splice(i, 1);
    }
    // Verwijder "CNT" uit de betreft array.
    for (var i = 0; i < params.betreft.length; i++)
    {
      if (params.betreft[i] == "CNT")
        params.betreft.splice(i, 1);
    }
  }

  // Ben ik budgethouder van de kostenplaats of de kostenplaatsgroep?
  // Alleen als budgethouder van de kostenplaats(groep) kan ik bestellingen en meldingsopdrachten fiatteren anders hoef ik niet eens te kijken.
  // Als budgethouder van de kostenplaats(groep) kan ik misschien ook facturen fiatteren.
  var sqlkp = "SELECT COUNT(*) aantal"
            + "  FROM prs_kostenplaats k"
            + " WHERE k.prs_perslid_key IN (" + prsKeys + ")";
  var sqlkpg = "SELECT COUNT(*) aantal"
             + "  FROM prs_kostenplaatsgrp kg"
             + " WHERE kg.prs_perslid_key IN (" + prsKeys + ")"
             + "    OR prs_kostenplaatsgrp_fiat2_key IN (" + prsKeys + ")"
             + "    OR prs_kostenplaatsgrp_fiat3_key IN (" + prsKeys + ")";
  var sqlbud = "SELECT SUM (aantal) aantal"
            + "  FROM (" + sqlkp + " UNION " + sqlkpg + ")";
  var oRsbud = Oracle.Execute(sqlbud);
  var benBudgethouder = oRsbud("aantal").Value > 0;
  oRsbud.Close();




  var alleModules = params.betreft.length == 0;
  if (benBudgethouder && (inArray("BES", params.betreft) || alleModules))
  {
    // Sql gedeelte voor bestellingen (BES) ophalen.
    if (params.getopen)
      sqls.push(getSqlFiatBes("open", prsKeys, params));  // Te fiatteren

    if (params.getclosed)
      sqls.push(getSqlFiatBes("close", prsKeys, params)); // Gefiatteerd

    if (params.getrejected)
      sqls.push(getSqlFiatBes("reject", prsKeys, params)); // Afgewezen
  }

  if (inArray("CNT", params.betreft) || alleModules)
  {
    // Sql gedeelte voor contracten (CNT) ophalen.
    if (params.getopen)
    {
      // Heb ik enige goedkeur rechten anders hoef ik niet eens te kijken.
      var haveCNTGOErights = user.checkAutorisation(["WEB_CNTGO1", "WEB_CNTGO2", "WEB_CNTGO3", "WEB_CNTGO4", "WEB_CNTGO5"], true);
      if (haveCNTGOErights)
        sqls.push(getSqlFiatCnt("open", prsKeys, params));  // Ter goedkeuring
    }

    if (params.getclosed)
      sqls.push(getSqlFiatCnt("close", prsKeys, params)); // Goedgekeurd

    if (params.getrejected)
      sqls.push(getSqlFiatCnt("reject", prsKeys, params)); // Afgewezen
  }

  if (inArray("MLDIN", params.betreft) || alleModules)
  {
    if (params.getopen)
      sqls.push(getSqlInstemMld("open", prsKeys, params));  // In te stemmen.

    if (params.getclosed)
      sqls.push(getSqlInstemMld("close", prsKeys, params));  // Ingestemd.

    if (params.getrejected)
      sqls.push(getSqlInstemMld("reject", prsKeys, params));  // Afgewezen.
  }

  if (inArray("MLDOP", params.betreft) || alleModules)
  {
    if(benBudgethouder)
    {
      // Sql gedeelte voor meldingsopdrachten (MLD) ophalen.
      if (params.getopen)
        sqls.push(getSqlFiatMld("open", prsKeys, params));  // Te fiatteren

      if (params.getclosed)
        sqls.push(getSqlFiatMld("close", prsKeys, params)); // Gefiatteerd

      if (params.getrejected)
        sqls.push(getSqlFiatMld("reject", prsKeys, params)); // Afgewezen
    }

    // Heb ik enige goedkeur rechten anders hoef ik niet eens te kijken.
    var haveORDGOErights = user.checkAutorisation(["WEB_ORDGOE", "WEB_ORDGO2", "WEB_ORDGO3", "WEB_ORDGO4", "WEB_ORDGO5"], true);

    if (haveORDGOErights)
    {
      // Sql gedeelte voor goedkeur meldingen (MLD) ophalen.
      if (params.getopen)
        sqls.push(getSqlGoedkeurMld("open", prsKeys, params));  // Goed te keuren

      if (params.getclosed)
        sqls.push(getSqlGoedkeurMld("close", prsKeys, params)); // Gefiatteerd

      if (params.getrejected)
        sqls.push(getSqlGoedkeurMld("reject", prsKeys, params)); // Afgewezen
    }
  }

  if (inArray("MLDOF", params.betreft) || alleModules)
  { // Werken we uberhaubt met offeretes?
    var sqloff = "SELECT COUNT(*) aantal"
               + "  FROM mld_typeopdr"
               + " WHERE mld_typeopdr_isofferte = 1";
    var oRsoff = Oracle.Execute(sqloff);
    var haveOffertes = oRsoff("aantal").Value > 0;
    oRsoff.Close();

    // Heb ik WEB_ORDOAP rechten? Zonder deze rechten kan ik offertes toch niet accepteren/afwijzen.
    if (haveOffertes && haveORDOAPrights && params.getopen)
      sqls.push(getSqlAccAfwOff(prsKeys, params)); // Te accepteren/Af te wijzen offertes (offerte opdrachten) van meldingen waarvoor nog geen uitvoeringsopdracht is aangemaakt.
  }

  if (inArray("FIN", params.betreft) || alleModules)
  { // Heb ik WEB_FINBOF rechten? Zonder deze rechten kan ik facturen toch niet fiatteren/afwijzen.
    if (haveFINBOFrights || benBudgethouder)
    {
      // Sql gedeelte voor fiatteren facturen (FIN) ophalen.
      if (params.getopen)
        sqls.push(getSqlFiatFin("open", prsKeys, params));  // Te fiatteren

      if (params.getclosed)
        sqls.push(getSqlFiatFin("close", prsKeys, params)); // Gefiatteerd

      if (params.getrejected)
        sqls.push(getSqlFiatFin("reject", prsKeys, params)); // Afgewezen
    }

    if (haveFINGOErights)
    {// Heb ik WEB_FINGOE rechten? Zonder deze rechten kan ik nooit als goedkeurder worden aangewezen/geselecteerd.
      // Sql gedeelte voor goedkeuren facturen (FIN) ophalen.
      if (params.getopen)
        sqls.push(getSqlGoedkeurFin("open", prsKeys, params));  // Ter goedkeuring

      if (params.getclosed)
        sqls.push(getSqlGoedkeurFin("close", prsKeys, params)); // Goedgekeurd

      if (params.getrejected)
        sqls.push(getSqlGoedkeurFin("reject", prsKeys, params)); // Afgewezen
    }
  }

  if (benBudgethouder && (inArray("RES", params.betreft) || alleModules))
  {
    // Sql gedeelte voor reserveringen (RES) ophalen.
    if (params.getopen)
      sqls.push(getSqlFiatRes("open", prsKeys, params));  // Te fiatteren

    if (params.getclosed)
      sqls.push(getSqlFiatRes("close", prsKeys, params)); // Gefiatteerd

    if (params.getrejected)
      sqls.push(getSqlFiatRes("reject", prsKeys, params)); // Afgewezen
  }

  if (sqls.length == 0)
    sql = "SELECT '1' aanvraagnummer, '2' sortdate FROM DUAL WHERE 1=0 ORDER BY sortdate, aanvraagnummer ASC"; // Geen resultaat.
  else if (params.groupbymodule) {
    for (var i = 0; i < sqls.length; i++) {
      sqls[i] = "SELECT DECODE(module"
              +             ", 'BES', " + safe.quoted_sql(L("lcl_fin_bestellingen"))
              +             ", 'CNT', " + safe.quoted_sql(L("lcl_fin_contracten"))
              +             ", 'MLD', " + safe.quoted_sql(L("lcl_fin_opdrachten"))
              +             ", 'GOED', " + safe.quoted_sql(L("lcl_fin_opdrachten"))
              +             ", 'OFFERTE', " + safe.quoted_sql(L("lcl_fin_offertes"))
              +             ", 'FIN', " + safe.quoted_sql(L("lcl_fin_invoices"))
              +             ", 'FIN2', " + safe.quoted_sql(L("lcl_fin_invoices"))
              +             ", 'RES', " + safe.quoted_sql(L("lcl_fin_catering_order"))
              +             ", 'MLDIN', " + safe.quoted_sql(L("lcl_mld_concepten")) + ") module"
              + "     , COUNT(*) aantal"
              + "  FROM (" + sqls[i] + ")"
              + " GROUP BY module";
      sql = "SELECT * FROM (" + sqls.join(" UNION ALL ") + ")";
    }
  } else {
    sql = "SELECT * FROM (" + sqls.join(" UNION ALL ") + ") ORDER BY sortdate, aanvraagnummer ASC";
  }

  return sql;
}

%>