FCLT#84467 rolcode vervangt de restricties die in volgnummer waren verstopt -savepoint

svn path=/Website/trunk/; revision=69076
This commit is contained in:
Peter Feij
2025-05-20 15:51:16 +00:00
parent 192c642a39
commit cc54c1a215
6 changed files with 125 additions and 54 deletions

View File

@@ -13,7 +13,6 @@
*/
%>
<%
// Under construction voor FCLT#84467
function buildKenmerkRoleCodeLOV(params)
{
var kenmerkRoleCodeLOV = "";
@@ -35,6 +34,7 @@
case "BEZ":
kenmerkRoleCodeLOV = "7;"+ L("mgt_kenmerkrolcodebez_7") + ";" // alles
+ "4;"+ L("mgt_kenmerkrolcodebez_4") + ";" // BEZBOF only
+ "2;"+ L("mgt_kenmerkrolcodebez_2") + ";" // BEZFOF only
+ "3;"+ L("mgt_kenmerkrolcodebez_3"); // BEZFOF/BEZUSE only
break;
case "CNT":
@@ -58,18 +58,19 @@
+ "1;"+ L("mgt_kenmerkrolcodeins_1"); // INSMAN
break;
case "MLD":
kenmerkRoleCodeLOV = "7;"+ L("mgt_kenmerkrolcodemld_7") + ";"
+ "6;"+ L("mgt_kenmerkrolcodemld_6") + ";"
+ "4;"+ L("mgt_kenmerkrolcodemld_4") + ";"
+ "2;"+ L("mgt_kenmerkrolcodemld_2");
kenmerkRoleCodeLOV = "7;"+ L("mgt_kenmerkrolcodemld_7") + ";" // alles
+ "6;"+ L("mgt_kenmerkrolcodemld_6") + ";" // MLDBOF+MLDFOF
+ "3;"+ L("mgt_kenmerkrolcodemld_3") + ";" // MLDUSE+MLDBOF
+ "4;"+ L("mgt_kenmerkrolcodemld_4") + ";" // MLDBOF
+ "2;"+ L("mgt_kenmerkrolcodemld_2"); // MLDFOF
break;
case "OPD": // deze is nog TODO
kenmerkRoleCodeLOV = "7;"+ L("mgt_kenmerkrolcodeopd_7") + ";"
case "OPD":
kenmerkRoleCodeLOV = "7;"+ L("mgt_kenmerkrolcodeopd_7") + ";" // alles
+ "5;"+ L("mgt_kenmerkrolcodeopd_5") + ";"
+ "4;"+ L("mgt_kenmerkrolcodeopd_4") + ";" // ORDSUP
+ "3;"+ L("mgt_kenmerkrolcodeopd_3") + ";"
+ "2;"+ L("mgt_kenmerkrolcodeopd_2") + ";" // Afmelden?
+ "1;"+ L("mgt_kenmerkrolcodeopd_1"); // ORD*
+ "4;"+ L("mgt_kenmerkrolcodeopd_4") + ";" // ORDSUPonly
+ "3;"+ L("mgt_kenmerkrolcodeopd_3") + ";" // beide
+ "2;"+ L("mgt_kenmerkrolcodeopd_2") + ";" // Afmelden? opdrachtnemer
+ "1;"+ L("mgt_kenmerkrolcodeopd_1"); // ORDBOF opdrachtgever
break;
case "PRS":
kenmerkRoleCodeLOV = "7;"+ L("mgt_kenmerkrolcodeprs_7") + ";" // alles,

View File

@@ -99,11 +99,39 @@ function model_prs_kenmerk(niveau, params)
"LOV": buildGroepsverplichtingList(),
"emptyoption": null
},
// "readonly": {
// "dbs": "prs_kenmerk_toonbaar",
// "label": L("mgt_kenmerk_toonbaar"),
// "typ": "check",
// "multiedit": true
// },
"readonly": {
"dbs": "prs_kenmerk_toonbaar",
"label": L("mgt_kenmerk_toonbaar"),
"typ": "number",
"multiedit": true,
"bits": [
{
"name": "ktoon",
"label": "",
"showasgroup": false,
"typ": "check",
"multiedit": true
"mask": 3,
"radios": [
{
"name": "ktoon1",
"label": L("mgt_kenmerk_toonbaar"),
"mask": 1,
"defaultvalue": 0
},
{
"name": "ktoon2",
"label": L("lcl_prs_in_profile"),
"mask": 2,
"defaultvalue": 0
}
]
}]
},
"system": {
"dbs": "prs_kenmerk_systeem",

View File

@@ -3,9 +3,15 @@
$Id$
File: fac_user_info.asp
Description: Details van een user aka persoon
Description: Toont de details van een user aka persoon, diens profielpagina
De intentie is dat een gebruiker de relevante gegevens kan zien, en dat hangt af van je rol:
- een collega mag algemene, openbare gegevens zien
- iemand met beheerautorisatie mag meer zien
- een keyuser die service verleent aan deze persoon kan nog wat meer zien, zoals lopende zaken enzo
- ik mag mijn eigen gegevens zien
Parameters: prs_key (default user_key)
Context: Bijvoorbeeld vanuit telefoongids
Context: Bijvoorbeeld vanuit telefoongids, elke doorklik vanuit een naam
Note:
*/ %>
@@ -63,7 +69,7 @@ prs.checkAutorisation(prs_key);
// PRS_PHONEB gebruiken voor READ-bepaling, en PRSMAN/PRSUSE of PRSSYS vereisen voor write?
// Bepaal of ik FB-achtigegevens van deze persoon mag zien,
// Bepaal of ik facilitair-achtigegevens van deze persoon mag zien,
// geimplementeerd als "I am FO" indien ik schrijfrechten heb voor
// RES, BES of MLD voor deze persoon, of Systeembeheer
var xfunc = user.func_enabled("*", null, null, prs_key);
@@ -216,7 +222,7 @@ prs.checkAutorisation(prs_key);
IFRAMER_HEADER(L("lcl_prs_frame_algemeen"), buttons);
var fac_profiel_limiet = -1;
var sql = "SELECT fp.fac_profiel_limiet, fp.fac_profiel_omschrijving"
var sql = "SELECT fp.fac_profiel_limiet, fp.fac_profiel_omschrijving, fp.fac_profiel_key"
+ " FROM prs_v_aanwezigperslid p, "
+ " fac_profiel fp"
+ " WHERE prs_perslid_key = " + prs_key
@@ -224,6 +230,7 @@ prs.checkAutorisation(prs_key);
oRs = Oracle.Execute (sql);
if (!oRs.eof) {
fac_profiel_key = oRs("fac_profiel_key").value;
fac_profiel_limiet = oRs("fac_profiel_limiet").value;
fac_profiel_omschrijving = oRs("fac_profiel_omschrijving").value;
}
@@ -311,12 +318,22 @@ prs.checkAutorisation(prs_key);
ROFIELDTR("fld", L("lcl_prs_perslid_contactpersoon"), cnt_str, params_cnt);
}
oRs.Close();
ROFIELDTR("fld", L("lcl_prs_company"), thisUser.afdeling().bedrijf().naam(), { suppressEmpty: true });
var params_afd;
var params = { suppressEmpty: true };
if (user.has("WEB_PRSUSE"))
params_afd = { infoPointer: { Url: "appl/prs/prs_afdeling.asp?key=" + thisUser.prs_afdeling_key() }};
ROFIELDTR("fld", L("lcl_prs_person_dept_name"), thisUser.afdeling().naam(), params_afd);
ROFIELDTR("fld", L("lcl_prs_person_function"), thisUser.prs_srtperslid(), { suppressEmpty: true });
params.infoPointer = { Url: "appl/prs/prs_bedrijf.asp?bedrijf_key=" + thisUser.afdeling().prs_bedrijf_key() };
ROFIELDTR("fld", L("lcl_prs_company"), thisUser.afdeling().bedrijf().naam(), params);
params = {};
if (user.has("WEB_PRSUSE"))
params = { infoPointer: { Url: "appl/prs/prs_afdeling.asp?key=" + thisUser.prs_afdeling_key() }};
ROFIELDTR("fld", L("lcl_prs_person_dept_name"), thisUser.afdeling().naam(), params);
params = { suppressEmpty: true };
if (user.has("WEB_PRSMSU"))
params.infoPointer = { Url: "appl/mgt/prs_srtperslid.asp?mode=show&id=" + thisUser.prs_srtperslid_key() };
ROFIELDTR("fld", L("lcl_prs_person_function"), thisUser.prs_srtperslid(), params);
ROFIELDTR("fld", L("lcl_prs_person_phone"), thisUser.prs_perslid_telefoonnr(), { suppressEmpty: true, type: "telefoon" });
ROFIELDTR("fld", L("lcl_prs_person_mobile"), thisUser.prs_perslid_mobiel(), { suppressEmpty: true, type: "telefoon" });
ROFIELDTR("fld", L("lcl_prs_person_email"), thisUser.prs_perslid_email(), { suppressEmpty: true, type: "email" });
@@ -375,7 +392,11 @@ prs.checkAutorisation(prs_key);
);
}
ROFIELDTR("fld", L("lcl_account"), thisUser.kpn_string(), {suppressEmpty: true});
params = {suppressEmpty: true};
if (xfunc.canWrite("WEB_FINMSU"))
params.infoPointer = { Url: "appl/mgt/prs_kostenplaats.asp?mode=show&id=" + thisUser.prs_kostenplaats_key() };
ROFIELDTR("fld", L("lcl_account"), thisUser.kpn_string(), params);
if (thisUser.kpn_budgethouderkey() > 0)
{
var budgethouderUser = new Perslid(thisUser.kpn_budgethouderkey());
@@ -388,7 +409,10 @@ prs.checkAutorisation(prs_key);
if (fac_profiel_limiet != -1)
{
ROFIELDTR("fld", L("lcl_prs_profile"), fac_profiel_omschrijving);
params = {};
if (xfunc.canWrite("WEB_FINMSU"))
params.infoPointer = { Url: "appl/mgt/fac_profiel.asp?mode=show&id=" + fac_profiel_key };
ROFIELDTR("fld", L("lcl_prs_profile"), fac_profiel_omschrijving, params);
if (fac_profiel_limiet)
ROFIELDTR("fld", L("lcl_prs_mandate_for"), fac_profiel_limiet,
{ datatype: "currency", prefix: true, infoPointer: { Url:"appl/prs/kpn_mandate_search.asp?prs_key="+prs_key+"&autosearch=1", Title:L("lcl_menu_fin_mandatering") } });
@@ -397,14 +421,15 @@ prs.checkAutorisation(prs_key);
}
// ============================= FLEXKENMERKEN =========================================
// de autorisatie van de user wordt toegepast, maar dankzij includepublic worden alle flexkenmerken met prs_kenmerk_toonbaar&2
// sowieso getoond als je canRead("WEB_PROFIL") hebt
generateFlexKenmerkCode({link_key: prs_key,
srt_key: prs_srtkey,
niveau: "P",
kenmerk_2col: false,
reado: true,
publiconly: true
}); // MOETEN WE NOG FORCEREN DAT ALLEEN prsuse WORDT GETOOND?
// Dat doet generateFlex zelf maar?! TODO
includepublic: xfunc.canRead("WEB_PROFIL")
});
// ============================= VERVANGERS ============================================
if (S("prs_collegas_used") < 9 && (itsme || iamfo))
{ // indien ik facilitair ben

View File

@@ -80,7 +80,7 @@ var buttons = [];
if (canChange) {
buttons.push({ title: L("lcl_change"), icon: "fa-fclt-edit", action: "edit_phone()", id: "bchange_perslid" });
}
IFRAMER_HEADER("Facilitor Vinder", buttons);
IFRAMER_HEADER("Facilitor Vinder", buttons); // Harde titel
%>
<script type="text/javascript">
$(function ()
@@ -166,7 +166,7 @@ IFRAMER_HEADER("Facilitor Vinder", buttons);
srt_key : prs_srtkey,
niveau : "P",
reado : true,
publiconly : true,
includepublic: true,
prsauthparams: prs.checkAutorisation(prs_key)
});
BLOCK_END();

View File

@@ -490,7 +490,7 @@ function BijlagenButton(tfield, tprops, tparams)
+ (fileChecked ? " checked" : "")
+ (tfield.readonlyfield ? " disabled" : "" )
+' controlgroup="'+kenmerk_key+'" id="' + kmCode('val') + '" name="' + kmCode('val') + '">'
+ '<label for="' + kmCode('val') + '">'+safe.html(lijst[file].name)+'</label>'
+ '<label for="' + kmCode('val') + '">'+pfield.krolcode+safe.html(lijst[file].name)+'</label>'
+ (tfield.kkenmerktype == "M"
? '<input type="hidden" id="has_' + kmCode('val') + '" name="has_' + kmCode('val') + '" value="1">'
+ '<input type="hidden" id="' + kmCode('file') + '" name="' + kmCode('file') + '" value="' + safe.html(lijst[file].name) + '">'
@@ -911,6 +911,7 @@ function kv2html(pfield, pparams)
+ '</h4>';
} else {
kvhtml += ('\n <label for="' + pparams.props.nameprefix + pfield.idCounter + 'val"'
+ (pfield.krolcode ? ' data-fclt-rolcode="' + pfield.krolcode + '"' : '')
+ '>' + safe_oms + (pparams.label_ext ? " "+pparams.label_ext : "") + pfield.separator
+ (
(pfield.kdimensie != null && pfield.kdimensie != "xxx")
@@ -2207,11 +2208,11 @@ function mobileBijlagen (tpfield, tpprops, tpparams)
}
if (!tpfield.readonlyfield) {
var btn_icon = "fa fa-file"; // [F]ile
var btn_icon = "fa-file"; // [F]ile
if (tpfield.kkenmerktype == "M") { // [M]ap
btn_icon = "fa fa-folder-open";
btn_icon = "fa-folder-open";
} else if (tpfield.kkenmerktype == "E") { // [E]ncrypted
btn_icon = "fa fa-file-lock";
btn_icon = "fa-file-lock";
}
tkv += '<div class="attachment-wrapper">';
@@ -2224,7 +2225,7 @@ function mobileBijlagen (tpfield, tpprops, tpparams)
"id": tpprops.nameprefix + tpfield.idCounter + "val",
"cls": (tpfield.isSqlExpr ? " flexsql" : "") + (tpfield.isExpression ? " expression " + (tpfield.isShowExpr ? "flexshow" : "flexexpr") : "") + (tpfield.required ? tpparams.required_class : "")
+ MOBILE_UI_CLASSES.button, /* Dynamisch herladen voegt deze classes niet in */
"dataicon": btn_icon,
"icon": btn_icon,
"click": "FcltMgr.stopPropagation(); $('#attachments"+tpfield.kkey+"').trigger('click')",
"attributes": {
"isBijlage": 1,
@@ -2270,9 +2271,9 @@ var minMax = []; // te gebruiken uren voor timepicker vastleg
// params: sql: moet een query met de goede :-) velden bevatten
// sinds kort worden deze By Name gebruikt ipv By volgorde
// module, key: alleen gebruikt voor flexkenmerk 'F' (file) 'E' (encrypted file) en 'M' (map)
// props { fnIsInvisible: optioneel function (volgnr, type) - true betekent onzichtbaar
// fnIsReadonly: optioneel function (volgnr) - true betekent readonly
// fnIsHidden: optioneel function (volgnr, default) - true betekent hidden (onzichtbaar maar wel aanwezig i.v.m. opslaan)
// props { fnIsInvisible: optioneel function (oRs) - true betekent onzichtbaar
// fnIsReadonly: optioneel function (oRS) - true betekent readonly
// fnIsHidden: optioneel function (rolcode, default) - true betekent hidden (onzichtbaar maar wel aanwezig i.v.m. opslaan)
// fnClassname: optioneel function() - geeft een class of lege string terug
// parentKey: optioneel om flexkenmerken onder op te slaan
// kenmerk_module: optioneel bij ALG: "L", "G", "R" etc.
@@ -2586,6 +2587,7 @@ function listKenmerk(sql, module, pkey, props)
thisfield.knmax = oRs("kenmerk_nmax").Value;
thisfield.ksysteem = oRs("kenmerk_systeem").Value;
thisfield.kvolgnr = "" + oRs("kenmerk_volgnr").Value;
thisfield.krolcode = oRs("kenmerk_rolcode").Value; // bitwise: zichtbaar voor welke rollen?
thisfield.kdimensie = oRs("kenmerk_dimensie").Value; // beperkt bij uploads de extensie
thisfield.khint = oRs("kenmerk_hint").Value;
thisfield.kregexp = oRs("kenmerk_regexp").Value;
@@ -2629,9 +2631,9 @@ function listKenmerk(sql, module, pkey, props)
// Velden die de gebruiker niet mag zien zijn we h<><68>l snel klaar mee
// Ook velden waar je niet op kunt zoeken (bv vertrouwelijke) slaan we direct over in zoekmode
// En labels met een readonly-kenmerk tonen we niet als readonly, om invulinstructies in showmode weg te laten
if ( (!props.kenmerk_search && props.fnIsInvisible && props.fnIsInvisible(thisfield.kvolgnr, thisfield.kkenmerktype, oRs))
if ( (!props.kenmerk_search && props.fnIsInvisible && props.fnIsInvisible(oRs))
|| (props.kenmerk_search && (thisfield.kkenmerktype == "L" || thisfield.kkenmerktype == "l" || thisfield.kkenmerktype == "b" || thisfield.kkenmerktype == "Q" || thisfield.kkenmerktype == "M" || thisfield.kkenmerktype == "F" || thisfield.kkenmerktype == "E") || thisfield.kvolgnr < 0)
|| (!props.kenmerk_search && thisfield.kkenmerktype == "L" && thisfield.forceReadonly && props.fnIsReadonly && props.fnIsReadonly(thisfield.kvolgnr, oRs))
|| (!props.kenmerk_search && thisfield.kkenmerktype == "L" && thisfield.forceReadonly && props.fnIsReadonly && props.fnIsReadonly(oRs))
|| (props.kenmerk_search && (thisfield.ksysteem&4)
|| (thisfield.functie_key && !thisfield.additAuthrights)) // Als er geen rechten zijn op de extra autorisatie, dan het kenmerk niet tonen.
)
@@ -2644,7 +2646,7 @@ function listKenmerk(sql, module, pkey, props)
thisfield.readonlyfield = thisfield.forceReadonly; // startwaarde
if (!thisfield.readonlyfield && !props.kenmerk_search && props.fnIsReadonly) // Zoeken is natuurlijk nooit readonly
thisfield.readonlyfield = props.fnIsReadonly(thisfield.kvolgnr, oRs);
thisfield.readonlyfield = props.fnIsReadonly(oRs);
if (thisfield.readonlyfield || props.kenmerk_search)
thisfield.required = 0; //false
@@ -3002,7 +3004,7 @@ function listKenmerk(sql, module, pkey, props)
}
// vangnet: verbergen ondanks alles (kan ook vooraf, is slimmer)
thisfield.komschrijving = (thisfield.maskeren ? c_maskmarker + "&nbsp;" + thisfield.komschrijving : thisfield.komschrijving);
thisfield.ishidden = (props.fnIsHidden && props.fnIsHidden(thisfield.kvolgnr, thisfield.kdefault));
thisfield.ishidden = (props.fnIsHidden && props.fnIsHidden(thisfield.krolcode, thisfield.kdefault));
// ==========================================================================================
// Alles bepaald, te tonen waarde/veld in kv, nu positioneren enzo in kvhtml

View File

@@ -19,6 +19,9 @@ function getSqlFlex(flexModule, flexId, flexParams)
? "E"
: flexId.substr(4,1) // D (District), L (Locatie), G (Gebouw), T (Terreinsector) en R (Ruimte).
);
var myreadrolcode = 0 + (flexParams.readman ? 1 : 0)
+ (flexParams.readuse ? 2 : 0);
sql_alg_kenmerkalg = "SELECT ak.alg_kenmerk_key"
+ " , a." + flexId // alg_district_key, alg_locatie_key, alg_gebouw_key, alg_terrein_key, alg_ruimte_key
+ " , (SELECT alg_onrgoedkenmerk_waarde"
@@ -53,8 +56,7 @@ function getSqlFlex(flexModule, flexId, flexParams)
+ " WHERE ka.alg_kenmerk_key = k.alg_kenmerk_key"
+ " AND k.alg_kenmerk_verwijder IS NULL"
+ " AND k.alg_kenmerk_niveau = " + safe.quoted_sql_upper(alg_niveau)
+ (!flexParams.readman? " AND alg_kenmerk_volgnr >= 100" : "")
+ (!flexParams.readuse? " AND alg_kenmerk_volgnr <= 100" : "");
+ " AND BITAND(k.alg_kenmerk_rolcode, " + myreadrolcode + ") > 0 ";
break;
}
@@ -110,7 +112,12 @@ function getSqlFlex(flexModule, flexId, flexParams)
break;
}
case "BEZ": { sql_bez_kenmerkbez = "SELECT bk.bez_kenmerk_key"
case "BEZ": {
var myreadrolcode = 0 + (user.has("WEB_BEZUSE") ? 1 : 0)
+ (user.has("WEB_BEZFOF") ? 2 : 0)
+ (user.has("WEB_BEZBOF") ? 4 : 0);
sql_bez_kenmerkbez = "SELECT bk.bez_kenmerk_key"
+ " , b.bez_bezoekers_key"
+ " , (SELECT bez_kenmerkwaarde_waarde"
+ " FROM bez_kenmerkwaarde bkw"
@@ -142,11 +149,8 @@ function getSqlFlex(flexModule, flexId, flexParams)
+ " FROM (" + sql_bez_kenmerkbez + ") kb" // bez_kenmerk_key / bez_bezoekers_key / bez_kenmerkwaarde_waarde inclusief lege waarden
+ " , bez_kenmerk k"
+ " WHERE kb.bez_kenmerk_key = k.bez_kenmerk_key"
+ " AND k.bez_kenmerk_verwijder IS NULL";
if (!user.has("WEB_BEZBOF"))
{
sqlFlex += " AND k.bez_kenmerk_volgnr < 900";
}
+ " AND k.bez_kenmerk_verwijder IS NULL"
+ " AND BITAND(k.alg_kenmerk_rolcode, " + myreadrolcode + ") > 0 ";
break;
}
@@ -410,7 +414,11 @@ function getSqlFlex(flexModule, flexId, flexParams)
break;
}
case "MLD": { sql_srtmld_kenmerkmld = "SELECT mk.mld_kenmerk_key"
case "MLD": {
var myreadrolcode = 0 + (flexParams.readman ? 1 : 0)
+ (flexParams.readuse ? 2 : 0);
sql_srtmld_kenmerkmld = "SELECT mk.mld_kenmerk_key"
+ " , m.mld_melding_key"
+ " , (SELECT mld_kenmerkmelding_waarde"
+ " FROM mld_kenmerkmelding mkm"
@@ -454,7 +462,7 @@ function getSqlFlex(flexModule, flexId, flexParams)
+ " WHERE sk.mld_srtkenmerk_key = k.mld_srtkenmerk_key"
+ " AND km.mld_kenmerk_key = k.mld_kenmerk_key"
+ " AND sk.mld_srtkenmerk_verwijder IS NULL"
+ (flexParams && (flexParams.readuse || flexParams.readman)? " AND k.mld_kenmerk_volgnummer < 800" : "");
+ (flexParams && (flexParams.readuse || flexParams.readman)? " AND k.mld_kenmerk_volgnummer < 800" : ""); // Dit kan nergens op slaan, wat dan wel TODO
break;
}
@@ -512,11 +520,17 @@ function getSqlFlex(flexModule, flexId, flexParams)
var authparamsMAN = user.checkAutorisation("WEB_PRSMAN", true) || {PRSreadlevel: 10};
// Als authparamsMAN en authparamsUSE verschillen zou het heel ingewikkeld worden.
// Daarom tonen we dan voor de veiligheid geen MAN meer.
/*
if (authparamsMAN.PRSreadlevel > -1 && authparamsMAN.PRSreadlevel != authparamsUSE.PRSreadlevel)
where.push("prs_kenmerk_volgnr >= 100");
if (authparamsUSE.PRSreadlevel > -1)
if (authparamsUSE.PRSreadlevel > -1) // Dit had toch MAN moeten zijn??!
where.push("prs_kenmerk_volgnr <= 100");
*/
}
var myreadrolcode = 0 + (user.has("WEB_PRSMAN") ? 1 : 0)
+ (user.has("WEB_PRSUSE") ? 2 : 0);
if (authparamsMAN.PRSreadlevel > -1 && authparamsMAN.PRSreadlevel != authparamsUSE.PRSreadlevel)
myreadrolcode = myreadrolcode - 1; // om recht te doen aan de eerdere werking: verschillende levels voor MAN en USE => geen PRSMAN
sql_prs_kenmerkprs = "SELECT pk.prs_kenmerk_key"
+ " , p." + flexId // prs_afdeling_key, prs_perslid_key
@@ -551,6 +565,7 @@ function getSqlFlex(flexModule, flexId, flexParams)
+ " , prs_kenmerk k"
+ " WHERE kp.prs_kenmerk_key = k.prs_kenmerk_key"
+ " AND k.prs_kenmerk_verwijder IS NULL"
+ " AND BITAND(k.prs_kenmerk_rolcode, " + myreadrolcode + ") > 0"
+ (where.length? " AND " + where.join(" AND ") + " " : "")
+ " AND k.prs_kenmerk_niveau = " + safe.quoted_sql_upper(flexId.substr(4,1)); // A (Afdeling) en P (Persoon/Perslid)