<%@language = "javascript" %>
<% /*
     $Revision$
     $Id$

    File:               SuggestPerslid.asp
    Description:        Suggereer personen
    Parameters:         k         De eerste paar letters
                        bAll      Haal alle records op (met nog steeds een maximum van 500)
                        filtvalue Lijst met personen keys
                        filtcode  Beperk de lijst met getoonde personen: Ziek persoonfilter.inc

                        autlevel  Optioneel: schrijfrechten op dit niveau nodig
    Globals:
    Context:
    Note:
*/ %>

<%
JSON_Result = true;
%>

<!-- #include file="../../Shared/common.inc" -->
<!-- #include file="./suggest.inc" -->
<!-- #include file="./persoonFilter.inc" -->

<%
var charset = getQParam("charset", "windows-1252");
switch (charset.toLowerCase())
{
    case "utf-8":
    {
        Session.Codepage = 65001;
        Response.Charset = 'utf-8';
        break;
    }
    case "windows-1252":
    case "iso8859-1":
    case "iso8859-15":
    default:
    {
        /* doe allemaal niets, is wel gezet in default.inc */
        break;
    }
}

var chars = getQParam("k", "");
var autlevel = getQParamInt("autlevel", -1);
var bAll = getQParamInt("SuggestAll", 0) == 1;
var filtcode = getQParam("filtcode", "");
var filtvalue = getQParam("filtvalue", "");
var extracode = getQParam("extraCode", "");
var afd_key = getQParamInt("afd_key", -1); // Afdeling gegeven
params = {};

if (filtcode == "BEHF" || filtcode == "BEHB")
{ // Verplichte parameters
  var params = { prs_key: getQParamInt("prs_key"),
                 loc_key: getQParamInt("loc_key", -1), // mogelijk geen ALG
                 disc_key: getQParamInt("disc_key"),
                 autlevel: autlevel
               };
}
else if (filtcode == "OCP")
{ // Verplichte parameters
  var params = { disc_key : getQParamInt("disc_key") };
}
else if (filtcode == "SUBS")
{ // Verplichte parameters
  var params = { prs_key: getQParamInt("prs_key") };
}

if (afd_key > 0)
  params.afd_key = afd_key;

chars = chars.replace(/\*/g,"%");

var filtClause = getFiltClausePersoon(filtcode, params);

var extraInf = getExtraInfPersoon(extracode);

// Als filtercode "KP" is dan Kostenplaats autorisatie en geen 3D (alg/prs) autorisatie:
// Dan alleen die personen tonen die vallen onder de afdelingen die behoren bij de kostenplaatsen waarvoor ik gemandateerd ben
if (autlevel == 0 && filtcode != "KP") // Bedrijf niveau zit niet in prs_v_afdeling_familie
{
    filtClause += " AND p.prs_afdeling_key IN"
                + "    (SELECT a.prs_afdeling_key FROM prs_v_afdeling a"
                + "      WHERE a.prs_bedrijf_key = " + user.afdeling().prs_bedrijf_key() + " )"
}

// PRS autorisatie
if (autlevel > 0 && filtcode != "KP") // Efficiente versie van FAC_V_MY_PRS_AFDELINGEN_WRITE
{
    filtClause +=" AND p.prs_afdeling_key IN "
               + "    (SELECT prs_afdeling_key FROM prs_v_afdeling_familie a"
               + "      WHERE a.prs_afdeling_elder_key IN"
               + "        (SELECT aa.prs_afdeling_elder_key"
               + "           FROM prs_v_afdeling_familie aa"
               + "          WHERE aa.prs_afdeling_key = " + user.prs_afdeling_key()
               + "            AND aa.niveau = " + autlevel + "))"
}

if (isNaN(parseInt(chars, 10)))
{
    // Merk op dat we de 'upper' weglaten omdat we later BINARY_AI hebben
    if (S("prs_pers_string").substring(0, 19) != ' p.prs_perslid_naam' || chars.match(/[^A-Z]/i))
    {   // rare S("prs_pers_string") of niet alleen letters
        var like = " (" + S("prs_pers_string") + " LIKE " + safe.quoted_sql_wild(chars + "%")+ ")"
    }
    else // uitsluitend A-Z, zoek alleen op achternaam. Is twee keer zo snel bij BINARY_AI
    {
        var like = " (prs_perslid_naam LIKE " + safe.quoted_sql_wild(chars + "%")+ ")"
    }
    sql = "SELECT p.prs_perslid_key"
        + ", " + S("prs_pers_string") + " naam"
        + ", " + S("prs_dep_string") + " afdeling"
        + ", prs_perslid_telefoonnr"
        + extraInf.selectstr
        + " FROM prs_perslid p" // Geen prs_v_aanwezigperslid: afhankelijk van filtcode wordt " AND prs_perslid_verwijder IS NULL" toegevoegd
        + ", prs_v_afdeling d "
        + extraInf.fromstr
        + " WHERE " + like
        + " " + filtClause
        + " AND p.prs_afdeling_key = d.prs_afdeling_key"
        // faalt bij NULL values: " AND p.prs_perslid_oslogin NOT LIKE '\\_%' ESCAPE '\\' "
        + " AND (prs_perslid_oslogin IS NULL OR prs_perslid_oslogin NOT LIKE '\\_%' ESCAPE '\\')"
        + extraInf.wherestr
        + " ORDER BY 2"

 var matchsql = "utl_match.jaro_winkler(SUBSTR(UPPER(" + S("prs_pers_string") + "),1,"+chars.length+"), "+safe.quoted_sql_upper(chars)+")"
 Simsql = "SELECT p.prs_perslid_key"
        + ", " + S("prs_pers_string") + " naam"
//        + ", " + S("prs_pers_string") + "||' '|| round(utl_match.jaro_winkler(SUBSTR(UPPER(" + S("prs_pers_string") + "),1,"+chars.length+"), "+safe.quoted_sql_upper(chars)+")*100,0)||'%' naam"
        + ", " + S("prs_dep_string") + " afdeling"
        + ", prs_perslid_telefoonnr"
        + extraInf.selectstr
        + " FROM prs_perslid p" // Geen prs_v_aanwezigperslid: afhankelijk van filtcode wordt " AND prs_perslid_verwijder IS NULL" toegevoegd
        + ", prs_v_afdeling d "
        + "WHERE 1=1 " + extraInf.fromstr
        + " " + filtClause
        + " AND p.prs_afdeling_key = d.prs_afdeling_key"
        // faalt bij NULL values: " AND p.prs_perslid_oslogin NOT LIKE '\\_%' ESCAPE '\\' "
        + " AND (prs_perslid_oslogin IS NULL OR prs_perslid_oslogin NOT LIKE '\\_%' ESCAPE '\\')"
        + extraInf.wherestr
        + " AND " + matchsql + " > 0.75"
        + " ORDER BY " + matchsql + " desc, 2" // best match bovenaan

// Maakt dat André ook gevonden wordt als je Andre tikt. Wel iets langzamer
// Echter mogen we de UPPER weglaten in de query, dat scheelt weer
// AI is Accent Insensitive en ook Case Insensitive
Oracle.Execute("alter session set nls_comp = 'LINGUISTIC' NLS_SORT = 'BINARY_AI'");
//bAll, fldName, fldKey, fldDesc, fldExtraParam, fldTitle, bStoreDesc, checkExist of similarSQL
    WriteResult2(sql, { bAll: bAll,
                       fldName: "naam",
                       fldKey: "prs_perslid_key",
                       fldDesc: "afdeling",
                       fldExtraParam: "extra",
                       fldTitle: "prs_perslid_telefoonnr",
                       SimilarSql: Simsql});
}
else // Telefoonnummer zoeken
{
    where_a = "REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(UPPER(";
    where_b = "), '-'), ' '), '('), ')'), '+31', '0')";
    sql = "SELECT p.prs_perslid_key"
        + ", " + S("prs_pers_string") + " naam"
        + ", prs_perslid_telefoonnr"
        + ", " + S("prs_dep_string") + " afdeling"
        + extraInf.selectstr
        + "  FROM prs_perslid p" // Geen prs_v_aanwezigperslid: afhankelijk van filtcode wordt " AND prs_perslid_verwijder IS NULL" toegevoegd
        + ", prs_v_afdeling d"
        + extraInf.fromstr
        + " WHERE (" + where_a + "p.prs_perslid_telefoonnr" + where_b + " LIKE " + where_a + safe.quoted_sql_wild("%" + chars + "%") + where_b
        + "    OR  " + where_a + "p.prs_perslid_mobiel"     + where_b + " LIKE " + where_a + safe.quoted_sql_wild("%" + chars + "%") + where_b
        + "       )"
        + " AND p.prs_afdeling_key = d.prs_afdeling_key"
        + " " + filtClause
        + " AND (prs_perslid_oslogin IS NULL OR prs_perslid_oslogin NOT LIKE '\\_%' ESCAPE '\\')"
        + extraInf.wherestr
        + " ORDER BY 3,2"

    WriteResult(sql, bAll, "prs_perslid_telefoonnr", "prs_perslid_key", "naam", "extra", "afdeling", true);
}

%>
