<% /*
     $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 = "";
  var slecil = 0;
  switch(pmodule)
  {
    case "ALG":  ktable = "alg_onrgoedkenmerk";
                 break;
    case "BES":  ktable = "bes_kenmerkbestell";
                 break;
    case "CNT":  ktable = "cnt_kenmerkcontract";
                 break;
    case "FAQ":  ktable = "faq_kenmerkwaarde";
                 break;
    case "FIN":  ktable = "fin_kenmerkfactuur";  // TBD
                 break;
    case "CIL":
    case "SLE":  ktable = "ins_kenmerkdeel";
                 slecil = (pmodule == "CIL"? 1 : 2);
                 pmodule = "INS";
                 break;
    case "INS":  ktable = "ins_kenmerkdeel";
                 break;
    case "MLD":  ktable = "mld_kenmerkmelding";
                 break;
    case "OPD":  ktable = "mld_kenmerkopdr";
                 pmodule = "MLD";
                 break;
    case "PRS":  ktable = "prs_kenmerklink";
                 break;
    case "RES":  ktable = "res_kenmerkwaarde";
                 break;
  }
  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 pkeyColumn = pkeyColumn.split('.');
  var tableref = pkeyColumn[0];
  var tablekey = pkeyColumn[1];

  var sql_k = "";
  var where = "";
  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 kk = (prequestForm
               ? getFParamInt("k" + kenmerk + "key", -1)
               : getQParamInt("k" + kenmerk + "key", -1)); // kenmerk key of bij INS: srtkenmerk_key
      var kv = new String(
               (prequestForm
               ? getFParam("k" + kenmerk + "val", "")
               : getQParam("k" + kenmerk + "val", ""))); // 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 ((kt == "S" || kt == "R") && kv == "-1") kv = "";
      if (kk > 0 && (kv != "" || ko == "IS NOT NULL" || ko == "IS NULL"))
      {
        var where1 = kwaarde;
        var where2 = ko;
        var where3 = "";
        var add_b = true;
        where = "";

        var tablekey2 = tablekey;
        var andALG = "";
        var andPRS = "";
        // 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 += "'R'";  // 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_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 (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') // Beide kanten naar NUMBER converteren om te kunnen vergelijken '<' en '>'
            { // Een numeriek "N" kenmerk kan ook een checkbox 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 + ")";
              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
                + (pmodule == "INS"? ", ins_kenmerk ik":"")
                + (pmodule == "MLD"? ", mld_kenmerk mk":"")
                + " WHERE "
                + (pmodule == "INS"? " ik.ins_srtkenmerk_key = " + kk + " AND ik.ins_kenmerk_key = ins_kenmerkdeel.ins_kenmerk_key":"")
                + (pmodule == "MLD"? " mk.mld_srtkenmerk_key = " + kk + " AND mk.mld_kenmerk_key = "+ktable+".mld_kenmerk_key":"")
                + (pmodule != "INS" && pmodule != "MLD" ? pmodule.toLowerCase() + "_kenmerk_key = " + kk:"")
                + " AND " + tablekey2 + " = " + tableref + "." + tablekey
                + " AND " + where1 + " IS NOT NULL "
                + andALG + andPRS
                + where3
                + " AND " + kverwijder + " IS NULL) ";
        }

        // Ik zeg: een wat gekke constructie zo
        sql_k += " AND " + where;
        // 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") {
            sql_k +=(add_b ? " OR " : "")
                  + " " + tableref + "." + tablekey + " IN (SELECT " + tablekey2
                  + " FROM " + ktable
                + (pmodule == "INS"? ", ins_kenmerk ik":"")
                + (pmodule == "MLD"? ", mld_kenmerk mk":"")
                + " WHERE "
                + (pmodule == "INS"? " ik.ins_srtkenmerk_key = " + kk + " AND ik.ins_kenmerk_key = ins_kenmerkdeel.ins_kenmerk_key":"")
                + (pmodule == "MLD"? " mk.mld_srtkenmerk_key = " + kk + " AND mk.mld_kenmerk_key = "+ktable+".mld_kenmerk_key":"")
                + (pmodule != "INS" && pmodule != "MLD" ? pmodule.toLowerCase() + "_kenmerk_key = " + kk:"")
                + " AND " + where1 + " " + where2
                + andALG + andPRS
                + where3
                + " AND " + kverwijder + " IS NULL)";
        }
        sql_k += (add_b ? ")" : "");
      }
    }
  }
  return sql_k;
}
%>