<% /*
     $Revision$
     $Id$

     File:           getkenmerksql.inc
     Description:    Functie die de sql oplevert van ingevulde kenmerk filters
     Parameters:
     Context:        Vanuit xxx_list.inc
     Note:
*/ %>

<%
function getKenmerkSql(pmodule, pkeyColumn, prequestForm)
{
  var ktable_arr = [];
  if (typeof pkeyColumn === "string") {
    pkeyColumn = [pkeyColumn];
  }
  var slecil = 0;
  switch(pmodule)
  {
    case "ALG":  ktable_arr = ["alg_onrgoedkenmerk"];
                 break;
    case "BES":  ktable_arr = ["bes_kenmerkbestell"];
                 break;
    case "CNT":  ktable_arr = ["cnt_kenmerkcontract"];
                 break;
    case "FAQ":  ktable_arr = ["faq_kenmerkwaarde"];
                 break;
    case "FIN":  ktable_arr = ["fin_kenmerkfactuur"];  // TBD
                 break;
    case "CIL":
    case "SLE":  ktable_arr = ["ins_kenmerkdeel"];
                 slecil = (pmodule == "CIL"? 1 : 2);
                 pmodule = "INS";
                 break;
    case "INS":  ktable_arr = ["ins_kenmerkdeel", "ins_kmdeelsrtcontr"];
                 break;
    case "MLD":  ktable_arr = ["mld_kenmerkmelding"];
                 break;
    case "OPD":  ktable_arr = ["mld_kenmerkopdr"];
                 pmodule = "MLD";
                 break;
    case "PRS":  ktable_arr = ["prs_kenmerklink"];
                 break;
    case "RES":  ktable_arr = ["res_kenmerkwaarde"];
                 break;
  }

  var sqls = [];
  var validOperators = ["=", "<>", "<", ">", "<=", ">=", "LIKE", "NOT LIKE", "IS NOT NULL", "IS NULL"];
  var k_all = (prequestForm? getFParamInt("k_all", -1) : getQParamInt("k_all", -1)); // Aantal kenmerken
  if (!isNaN(k_all) && k_all > 0)
  {
    for (kenmerk = 1; kenmerk <= k_all; kenmerk++)
    {
      var inner_sqls = [];
      for (var i = 0; i < pkeyColumn.length; i++) {
        var ktable = ktable_arr[i];
        var kverwijder = ktable + "_verwijder"; // bes_kenmerkbestell_verwijder
        var kwaarde = ktable + "_waarde"; // bes_kenmerkbestell_waarde
        if (pmodule == "RES") kwaarde = "res_kenmerkreservering_waarde"; // RES is uitzondering

        // b.bes_bestelling_key => tableref = "b" en tablekey = bes_bestelling_key
        var keyColumn = pkeyColumn[i].split('.');
        var tableref = keyColumn[0];
        var tablekey = keyColumn[1];

        var sql_k = "";
        var where = "";

        var kk = (prequestForm
                ? getFParamInt("k" + kenmerk + "key", -1)
                : getQParamInt("k" + kenmerk + "key", -1)); // kenmerk key of bij INS: srtkenmerk_key
        var kcount = (prequestForm
                ? getFParamInt("k" + kenmerk + "count", -1)
                : getQParamInt("k" + kenmerk + "count", -1)); // (count <= 1) kk = kenmerk key [or] (count > 1) kk = srtkenmerk_key
        var komsch = new String(
                (prequestForm
                ? getFParam("k" + kenmerk + "omsch", "")
                : getQParam("k" + kenmerk + "omsch", ""))); // (count <= 1) komsch = "" [or] (count > 1) komsch = kenmerk_omschrijving
        var kv = (prequestForm
                ? getFParamArray("k" + kenmerk + "val", [], true)
                : getQParamArray("k" + kenmerk + "val", [], true)); // kenmerk waarde
        var ko = new String(
                (prequestForm
                ? getFParam("ko" + kenmerk, "")
                : getQParam("ko" + kenmerk, ""))); // kenmerk operand
        var kt = (prequestForm
                ? getFParam("k" + kenmerk + "t", null)
                : getQParam("k" + kenmerk + "t", null)); // kenmerk type

        if (!kv.length || ((kt == "S" || kt == "R") && kv == [-1]))
            kv = "";
        else if (kv.length == 1)
            kv = kv[0];

        if (kk > 0 && (kv != "" || ko == "IS NOT NULL" || ko == "IS NULL"))
        {
          var where1 = kwaarde;
          if (!inArray(ko, validOperators)) ERROR_BAD_KENMERK_OPERATOR;
          var where2;
          if (ko == "NOT LIKE")
              where2 = "LIKE";  // key IN (kenmerk NOT LIKE 'x') -> key NOT IN (kenmerk LIKE 'x')
          else if (ko == "<>")
              where2 = "=";     // key IN (kenmerk <> 'x') -> key NOT IN (kenmerk = 'x')
          else
              where2 = ko;
          var where3 = "";
          var where4 = "";
          var add_b = true;
          var add_c = pmodule == "INS" && tablekey == "ins_deel_key";
          where = "";

          var tablekey2 = tablekey;
          var andALG = "";
          var andPRS = "";
          var andINS = "";
          // Voor ALG en PRS tablekey2 aanpassen en extra AND conditie(s) toevoegen
          if (pmodule == "ALG")
          {
            tablekey2 = "alg_onrgoed_key"
            andALG = " AND alg_onrgoed_niveau = "
            if (tablekey == "alg_regio_key")
              andALG += "'E'";  // Regio
            if (tablekey == "alg_district_key")
              andALG += "'D'";  // District
            if (tablekey == "alg_locatie_key")
              andALG += "'L'";  // Locatie
            if (tablekey == "alg_gebouw_key")
              andALG += "'G'";  // Gebouw
            if (tablekey == "alg_terreinsector_key")
              andALG += "'T'";  // Terrein
            if (tablekey == "alg_verdieping_key")
              andALG += "'V'";  // Verdieping
            if (tablekey == "alg_ruimte_key")
              andALG += "'R'";  // Ruimte
            andALG += " AND " + tableref + "." + tablekey + " = alg_onrgoed_key"
          }
          if (pmodule == "PRS")
          {
            tablekey2 = "prs_link_key"
            andPRS = " AND prs_kenmerklink_niveau = "
            if (tablekey == "prs_afdeling_key")
              andPRS += "'A'";  // Afdeling
            if (tablekey == "prs_perslid_key")
              andPRS += "'P'"; // Persoon
            if (tablekey == "prs_bedrijf_key")
              andPRS += "'B'"; // Bedrijf
            if (tablekey == "prs_contactpersoon_key")
              andPRS += "'C'"; // Contactpersoon (FSN#15407)
          }
          if (slecil > 0)
          {
            tablekey2 = "ins_deel_key";
            where3 = " AND ik.ins_srtinstallatie_key = " + (slecil == 1? S("cil_ins_srt_groep_key") : S("sle_ins_srt_groep_key"));
          }
          if (pmodule == "INS") {
            if (tablekey == "ins_deel_key") {
              andINS = " AND ik.ins_kenmerk_niveau <> 'C'";
            } else if (tablekey == "ins_deelsrtcontrole_key") {
              andINS = " AND ik.ins_kenmerk_niveau = 'C'";
            }
          }

          if (ko != "IS NOT NULL" && ko != "IS NULL")
          {
            add_b = false;
            if (ko == "LIKE" || ko == "NOT LIKE")
            {
              where1 = "UPPER(" + where1 + ")";
              kv = safe.quoted_sql_wild("%" + kv + "%");
            }
            else
            {
              if (kt == "D") // Beide kanten naar DATE converteren om te kunnen vergelijken "<" en ">"
              {
                if (kv.indexOf("-"))
                { // assume "-" format
                  kv = " fac.safe_to_date(" + safe.quoted_sql(kv) + ",'DD-MM-YYYY')";
                  where1 = " fac.safe_to_date(" + where1 + ",'DD-MM-YYYY')";
                }
                else
                { // assume "/" format
                  kv = " fac.safe_to_date(" + safe.quoted_sql(kv) + ",'DD/MM/YYYY')";
                  where1 = " fac.safe_to_date(" + where1 + ",'DD/MM/YYYY')";
                }
              }
              else if (kt == "N" || kt == "V") // Beide kanten naar NUMBER converteren om te kunnen vergelijken "<" en ">"
              { // Een numeriek "N" kenmerk kan ook een checkbox "V" zijn.
                if (kv == "on") kv = "1";
                kv = " fac.safe_to_number(" + safe.quoted_sql(kv.replace(",", ".")) + ")" ; // Bij "Geavanceerd" kan het numerieke getal met de komma i.p.v. punt zijn ingevuld.
                where1 = " fac.safe_to_number(" + where1 + ")" ;
              }
              else // kt=="C", "S", ..
              {
                if (kt != "R" && kt != "S") // Listbox en suggestbox zijn keys. Upper is dan niet nodig. Wordt de query alleen maar trager van.
                  where1 = "UPPER(" + where1 + ")";
                if (typeof kv != "string" && kv.length > 1 && (ko == "=" || ko == "<>")) // e.g. 2042,723,341
                {
                  kv = "(" + safe.quoted_sql_join(kv, true) + ")";
                  where2 = "IN"; // <> wordt -> key NOT IN (kenmerk IN (1, 2, 3))
                }
                else
                  kv = safe.quoted_sql(kv.toUpperCase());
              }
            }
            where2 += " " + kv;
          }
          else
          {
            // add_b blijft true trouwens

            // Bij INS bevat kk een ins_srtkenmerk_key, niet een ins_kenmerk_key zoals de rest.
            // Dat is zo geregeld in INS/ins_flexkenmerk.inc
            // We moeten nu wel de tabel ins_kenmerk er bij slepen
            // Zelfde truc ook voor MLD

            where = "(" + ((ko == "IS NULL") ? " NOT " : "")
                  + " EXISTS (SELECT 'x'"
                  + "           FROM " + ktable
                  // Bij "INS" altijd ins_kenmerk er bij joinen omdat ins_kenmerk_bewerkniveau en ins_srtinstallatie_key er dan bij worden genomen als add_c.
                  + (pmodule == "INS" || kcount > 1
                    ? "            , " + pmodule.toLowerCase() + "_kenmerk ik"
                    : "")
                  + "          WHERE "
                  + (pmodule == "INS" || kcount > 1
                    ? "              ik." + pmodule.toLowerCase() + "_kenmerk_key = " + ktable + "." + pmodule.toLowerCase() + "_kenmerk_key AND "
                    : "")
                  + (kcount == 1
                    ? " " + ktable + "." + pmodule.toLowerCase() + "_kenmerk_key = " + kk
                    : " ik." + pmodule.toLowerCase() + "_srtkenmerk_key = " + kk)
                  + "            AND " + (add_c ? "((" : "") + tablekey2 + " = " + tableref + "." + tablekey;

            if (add_c)
            {
              where += " AND ins_kenmerk_bewerkniveau <> 'S' AND ins_kenmerk_verwijder IS NULL)"
                     + " OR (" + tablekey2 + " = " + tableref + ".ins_srtdeel_key"
                     + " AND ins_kenmerk_bewerkniveau = 'S'))";
            }
            where += " AND " + where1 + " IS NOT NULL "
                   + andALG + andPRS + andINS
                   + where3
                   + " AND " + kverwijder + " IS NULL) ";
          }

          // Ik zeg: een wat gekke constructie zo
          sql_k += (sql_k == "" ? "" : " AND ") + where;
          var negate = ko == "NOT LIKE" || ko == "<>";
          if (add_c)
          { // add_c is true dus: pmodule == "INS".
            sql_k +=(add_b ? (negate ? " AND " : " OR ") : "")
                  + " (" + tableref + ".ins_srtdeel_key" + (negate ? " NOT" : "") + " IN (SELECT " + tablekey2
                  + "  FROM " + ktable
                  + "     , ins_kenmerk ik"
                  + " WHERE ik.ins_kenmerk_key = " + ktable + ".ins_kenmerk_key"
                  + "   AND ik." + pmodule.toLowerCase() + "_kenmerk_key = " + kk
                  + "   AND " + where1 + " " + where2
                  + andALG + andPRS + andINS
                  + where3
                  + "   AND ins_kenmerk_bewerkniveau = 'S'"
                  + "   AND " + kverwijder + " IS NULL)";
            where4 = "  AND ins_kenmerk_bewerkniveau <> 'S'";
          }

          // voor filter Geen Waarde zou ook nog: Wel een record maar met een NULL waarde kunnen gelden
          // die nemen we ook nog mee. Alleen bij "Gevuld" (verwerkt in "where") hoeven we niet verder naar de waarden te kijken
          // in alle andere gevallen komt hier de conditie "kenmerk=waarde" erbij
          if (ko != "IS NOT NULL")
          {
            if (kcount > 1)
            {
              sql_k +=((add_b || add_c) ? (negate ? " AND " : " OR ") : "")
                    + " " + tableref + "." + tablekey + (negate ? " NOT" : "") + " IN (SELECT " + tablekey2
                    + " FROM " + ktable
                  + (pmodule == "BES"? ", bes_kenmerk bk":"")
                  + (pmodule == "CNT"? ", cnt_kenmerk ck":"")
                  + (pmodule == "INS"? ", ins_kenmerk ik":"")
                  + (pmodule == "MLD"? ", mld_kenmerk mk":"")
                  + (pmodule == "RES"? ", res_kenmerk rk":"")
                  + " WHERE "
                  + (pmodule == "BES"? " bk.bes_srtkenmerk_key = " + kk + " AND bk.bes_kenmerk_key = "+ktable+".bes_kenmerk_key":"")
                  + (pmodule == "CNT"? " ck.cnt_srtkenmerk_key = " + kk + " AND ck.cnt_kenmerk_key = "+ktable+".cnt_kenmerk_key":"")
                  + (pmodule == "INS"? " ik.ins_srtkenmerk_key = " + kk + " AND ik.ins_kenmerk_key = "+ktable+".ins_kenmerk_key":"")
                  + (pmodule == "MLD"? " mk.mld_srtkenmerk_key = " + kk + " AND mk.mld_kenmerk_key = "+ktable+".mld_kenmerk_key":"")
                  + (pmodule == "RES"? " rk.res_srtkenmerk_key = " + kk + " AND rk.res_kenmerk_key = "+ktable+".res_kenmerk_key":"")
                  + (pmodule != "BES" && pmodule != "CNT" && pmodule != "INS" && pmodule != "MLD" && pmodule != "RES" ? pmodule.toLowerCase() + "_kenmerk_key = " + kk:"")
                  + " AND " + where1 + " " + where2
                  + (pmodule == "BES"? " AND (bk.bes_kenmerk_omschrijving = " + safe.quoted_sql(komsch) + " OR bk.bes_kenmerk_omschrijving IS NULL)" : "")
                  + (pmodule == "CNT"? " AND (ck.cnt_kenmerk_omschrijving = " + safe.quoted_sql(komsch) + " OR ck.cnt_kenmerk_omschrijving IS NULL)" : "")
                  + (pmodule == "INS"? " AND (ik.ins_kenmerk_omschrijving = " + safe.quoted_sql(komsch) + " OR ik.ins_kenmerk_omschrijving IS NULL)" : "")
                  + (pmodule == "MLD"? " AND (mk.mld_kenmerk_omschrijving = " + safe.quoted_sql(komsch) + " OR mk.mld_kenmerk_omschrijving IS NULL)" : "")
                  + (pmodule == "RES"? " AND (rk.res_kenmerk_omschrijving = " + safe.quoted_sql(komsch) + " OR rk.res_kenmerk_omschrijving IS NULL)" : "")
                  + andALG + andPRS + andINS
                  + where3 + where4
                  + " AND " + kverwijder + " IS NULL)";
            }
            else
            {
              sql_k +=((add_b || add_c) ? (negate ? " AND " : " OR ") : "")
                    + " " + tableref + "." + tablekey + (negate ? " NOT" : "") + " IN (SELECT " + tablekey2
                    + " FROM " + ktable
                  + (pmodule == "INS"? ", ins_kenmerk ik" : "") // Omdat ins_kenmerk_bewerkniveau en ins_srtinstallatie_key er dan bij worden genomen als add_c.
                  + " WHERE "
                  + (pmodule == "INS"? " ik.ins_kenmerk_key = " + ktable +".ins_kenmerk_key AND " : "")
                  + ktable + "." + pmodule.toLowerCase() + ("_kenmerk_key = ") + kk
                  + " AND " + where1 + " " + where2
                  + andALG + andPRS + andINS
                  + where3 + where4
                  + " AND " + kverwijder + " IS NULL)";
            }
          }
          sql_k += (add_b ? ")" : "");
          sql_k += (add_c ? ")" : "");
        }
        if (sql_k != "") {
          inner_sqls.push(sql_k);
        }
      }
      if (inner_sqls.length) {
        sqls.push(inner_sqls.join((negate || ko == "IS NULL" ? " AND " : " OR ")));
      }
    }
  }
  return sqls.length ? " AND ((" + sqls.join(") AND (") + "))" : "";
}
%>