Files
Facilitor/APPL/MLD/mld_flexkenmerk.inc
Peter Feij 45a71d7701 AAEN#37781 ORDBOF is ook een goede autorisatie om opdrachtbehandelaar te zijn
svn path=/Website/trunk/; revision=30862
2016-09-27 07:43:27 +00:00

435 lines
23 KiB
C++

<% /*
$Revision$
$Id$
File: MLD/mld_flexkenmerk.inc
Description: Functie die html code genereert voor de presentatie van de flexvelden
Parameters: urole Rol van de gebruiker (frontend, frontoffice, backoffice, management info)
opdr_type Opdracht type
reado Readonly
flexcolumns aantal kolommen voor flexkenmerken
advanced Geadvanceerd
prs_key Perslid key
Context: Functie wordt aangeroepen door
1) load_kenmerk.asp
2) mld_melding.asp die initieel serverside deze html code invoegd.
Note:
*/ %>
<!-- #include file="../Shared/kenmerk_common.inc" -->
<%
function generateFlexKenmerkBlock(params)
{
if (!params.fnpre) // Mobile geeft die zelf mee
{
if (params.advanced)
{
params.fnpre = function () { BLOCK_START("mldAdvancedFlex"); }; // zolang het maar geen mldFlex is, die heeft float:right
params.fnpost = BLOCK_END;
}
else
{
params.fnpre = function () { BLOCK_START((params.opdr_type>0?"opdrFlex":"mldFlex")+(S("mld_flexcolumns")!=1?"2":""),
L("lcl_mld_flexblok")); };
params.fnpost = BLOCK_END;
}
}
// Merk op: alleen bij geavanceerd zoeken kunnen deze array's meerdere records bevatten
// in alle andere gevallen hebben te maken met één waarde.
var stdm_arr = (params.stdm_arr? params.stdm_arr : []);
var disc_arr = (params.disc_arr? params.disc_arr : []);
var srtdisc = (params.srtdisc? params.srtdisc : []);
var mld_key = (params.mld_key? params.mld_key : -1);
var opdr_type = (params.opdr_type? params.opdr_type : -1);
var opdr_type_org = (params.opdr_type_org? params.opdr_type_org : -1);
var opdr_key = (params.opdr_key? params.opdr_key : -1);
var reado = (params.reado? params.reado : false);
var showClose = (params.showClose? params.showClose : false);
var copy = (params.copy? params.copy : false);
var opdr_status = (params.opdr_status? params.opdr_status : -1);
var advanced = (params.advanced? params.advanced : false); // Geavanceerd
var prs_key = (params.prs_key? params.prs_key : -1); // Perslid key
// opdrman true betekent: user mag opdracht flexkenmerken > 900 zien/editen
var authparamsORDSUP = user.checkAutorisation("WEB_ORDSUP", true);
var opdrman = authparamsORDSUP && (authparamsORDSUP.PRSreadlevel < 9 || authparamsORDSUP.PRSwritelevel < 9 || authparamsORDSUP.ALGreadlevel < 9 || authparamsORDSUP.ALGwritelevel < 9)
var flexcolumns = (params.flexcolumns? params.flexcolumns : 1);
if (stdm_arr.length != 0 && disc_arr.length == 0)
{
var sql = "SELECT mld_ins_discipline_key"
+ " FROM mld_stdmelding s"
+ " WHERE s.mld_stdmelding_key IN (" + stdm_arr.join(",") + ")";
var oRs = Oracle.Execute(sql);
disc_arr = [(oRs("mld_ins_discipline_key").Value)];
}
if (mld_key < 0 || disc_arr.length > 1)
{ // Het is een nieuwe melding
var my_mldrechten = user.func_enabled("MLD", disc_arr.join(",")); // mld.func_enabled_melding is nauwkeuriger maar overkill?
my_mldrechten.canFEwrite = my_mldrechten.canWrite("WEB_MLDUSE"); // Er moet ook gelden dat het mijn melding is. Dat is het geval want het is een nieuwe melding die ik zelf invoer en aanmaak.
}
else
var my_mldrechten = mld.func_enabled_melding(mld_key);
var otherKenmerkPath = "null";
var sql_waarde = "";
// Load existing or default values. Try to maintain values when changing type as well
// Onderscheid vier gevallen:
// 1) wijzigen opdracht of geavanceerd,
// 2) wijzigen melding,
// 3) aanmaken opdracht,
// 4) aanmaken melding of geavanceerd.
var changeOpdracht = false;
var changeMelding = false;
var newOpdracht = false;
var newMelding = false;
var advancedOpdracht = false;
var advancedMelding = false;
if (opdr_type > 0 && opdr_key > 0)
changeOpdracht = true; // Wijzigen opdracht
else if (stdm_arr.length != 0 && mld_key > 0)
changeMelding = true; // Wijzigen melding
else if (opdr_type > 0 && mld_key > 0)
newOpdracht = true; // Aanmaken opdracht
else if (opdr_type > 0 && advanced && opdr_key < 0 && mld_key < 0)
advancedOpdracht = true; // Opvragen opdracht kenmerken voor lijsten (Geavanceerd)
else if ((stdm_arr.length != 0 || disc_arr.length != 0 || srtdisc.length != 0) && advanced && opdr_key < 0 && mld_key < 0)
advancedMelding = true; // Opvragen melding kenmerken voor lijsten (Geavanceerd)
else // (stdm_arr.length != 0 && mld_key < 0)
newMelding = true; // Aanmaken melding
// 1) Wijzigen opdracht of geavanceerd
if (changeOpdracht || advancedOpdracht)
{ // Bestaande opdrachtkenmerk waarden of kopiëren
if (copy || (opdr_type_org > 0 && opdr_type_org != opdr_type))
{ // Kopieeer eventueel flexfiles
otherKenmerkPath = "(SELECT 'MLD/" + subfolderKey("O", opdr_key) + "/' || mld_kenmerk_key"
+ " FROM mld_kenmerk k2, mld_srtkenmerk t2"
+ " WHERE k2.mld_typeopdr_key = " + opdr_type_org
+ " AND k2.mld_kenmerk_niveau = 'O'"
+ " AND k2.mld_kenmerk_verwijder IS NULL"
+ " AND k2.mld_srtkenmerk_key = t2.mld_srtkenmerk_key"
+ " AND k2.mld_kenmerk_groep = k.mld_kenmerk_groep"
+ " AND t2.mld_srtkenmerk_verwijder IS NULL"
+ " AND t2.mld_srtkenmerk_key = t.mld_srtkenmerk_key)";
}
// Doordat we in de query controleren tegen opdr_type_org is er het gewenste
// neveneffect dat de waardes behouden blijven bij (achteraf) wisselen
// van type opdracht
// Die check is trouwens redelijk redundant ware het niet dat er wat
// datavervuiling is wat een 'subselect return more than one row' kan
// geven in extreme situaties
sql_waarde = " (SELECT v.mld_kenmerkopdr_waarde"
+ " FROM mld_kenmerkopdr v"
+ " , mld_kenmerk vk"
+ " WHERE v.mld_opdr_key = " + opdr_key
+ " AND v.mld_kenmerk_key = vk.mld_kenmerk_key"
+ " AND vk.mld_typeopdr_key = " + opdr_type_org
+ " AND vk.mld_srtkenmerk_key = k.mld_srtkenmerk_key"
+ " AND vk.mld_kenmerk_groep = k.mld_kenmerk_groep"
+ " AND v.mld_kenmerkopdr_verwijder IS NULL)";
sql_filter = " mld_typeopdr s"
+ " WHERE s.mld_typeopdr_key = " + opdr_type
+ " AND (k.mld_typeopdr_key = s.mld_typeopdr_key"
+ " AND k.mld_kenmerk_niveau = 'O')";
}
// 2) Wijzigen melding
else if (changeMelding)
{ // Existing melding kenmerk values. stdm_arr heeft nu 1 waarde
// Doordat we in de query controleren tegen old_stdm is er het gewenste
// neveneffect dat de waardes behouden blijven bij (achteraf) wisselen
// van standaardmelding
oRs = Oracle.Execute("SELECT mld_stdmelding_key FROM mld_melding where mld_melding_key = " + mld_key);
old_stdm = oRs(0).value;
if (old_stdm != stdm_arr)
__Log("Old MLD_STDMELDING_KEY: " + old_stdm + " New: " + stdm_arr.join(","));
sql_waarde = " (SELECT v.mld_kenmerkmelding_waarde"
+ " FROM mld_kenmerkmelding v"
+ " , mld_kenmerk vk"
+ " WHERE v.mld_melding_key = " + mld_key
+ " AND vk.mld_srtkenmerk_key = k.mld_srtkenmerk_key"
+ " AND vk.mld_kenmerk_groep = k.mld_kenmerk_groep"
+ " AND vk.mld_kenmerk_niveau = k.mld_kenmerk_niveau"
//+ " AND vk.mld_stdmelding_key = " + old_stdm
+ " AND v.mld_kenmerk_key = vk.mld_kenmerk_key"
+ " AND v.mld_kenmerkmelding_verwijder IS NULL)";
sql_filter = " mld_stdmelding s, mld_discipline d"
+ " WHERE s.mld_stdmelding_key IN (" + stdm_arr.join(",") + ")"
+ " AND s.mld_ins_discipline_key = d.ins_discipline_key"
+ " AND ((k.mld_stdmelding_key = s.mld_stdmelding_key"
+ " AND k.mld_kenmerk_niveau = 'S')"
+ " OR (k.mld_stdmelding_key = s.mld_ins_discipline_key"
+ " AND k.mld_kenmerk_niveau = 'D')"
+ " OR (k.mld_stdmelding_key = d.ins_srtdiscipline_key"
+ " AND k.mld_kenmerk_niveau = 'T'))"
+ (copy
? " AND t.mld_srtkenmerk_kenmerktype NOT IN ('E', 'F', 'M')" // Bij kopieren melding niet de flexbestanden kopieren.
: "");
}
// 3) Aanmaken opdracht
else if (newOpdracht)
{ // New opdr, copy parent's melding kenmerk values or take default
__Log("About to copy kenmerk values from parent: " + mld_key);
sql_waarde = " COALESCE((SELECT v.mld_kenmerkmelding_waarde"
+ " FROM mld_kenmerkmelding v"
+ " , mld_kenmerk vk"
+ " , mld_srtkenmerk vt"
+ " WHERE v.mld_melding_key = " + mld_key
+ " AND vk.mld_srtkenmerk_key = vt.mld_srtkenmerk_key"
+ " AND vk.mld_srtkenmerk_key = k.mld_srtkenmerk_key"
+ " AND vk.mld_kenmerk_groep = k.mld_kenmerk_groep"
// NIET! + " AND vk.mld_kenmerk_niveau = k.mld_kenmerk_niveau"
+ " AND v.mld_kenmerk_key = vk.mld_kenmerk_key"
+ " AND v.mld_kenmerkmelding_verwijder IS NULL), " + lcl.xsql('k.mld_kenmerk_default','k.mld_kenmerk_key') + ")";
// Kopieeer eventueel flexfiles
otherKenmerkPath = " (SELECT 'MLD/" + subfolderKey("M", mld_key) + "/' || mld_kenmerk_key "
+ " FROM mld_melding m"
+ " , mld_kenmerk k2"
+ " , mld_srtkenmerk t2"
+ " , mld_stdmelding s"
+ " , mld_discipline d"
+ " WHERE m.mld_melding_key = " + mld_key
+ " AND s.mld_stdmelding_key = m.mld_stdmelding_key"
+ " AND k2.mld_kenmerk_groep = k.mld_kenmerk_groep"
+ " AND s.mld_ins_discipline_key = d.ins_discipline_key"
+ " AND ((k2.mld_stdmelding_key = s.mld_stdmelding_key"
+ " AND k2.mld_kenmerk_niveau = 'S')"
+ " OR (k2.mld_stdmelding_key = s.mld_ins_discipline_key"
+ " AND k2.mld_kenmerk_niveau = 'D')"
+ " OR (k2.mld_stdmelding_key = d.ins_srtdiscipline_key"
+ " AND k2.mld_kenmerk_niveau = 'T'))"
+ " AND k2.mld_kenmerk_verwijder IS NULL"
+ " AND k2.mld_srtkenmerk_key = t2.mld_srtkenmerk_key"
+ " AND t2.mld_srtkenmerk_verwijder IS NULL"
+ " AND t2.mld_srtkenmerk_key = t.mld_srtkenmerk_key)";
sql_filter = " mld_typeopdr s"
+ " WHERE s.mld_typeopdr_key = " + opdr_type
+ " AND (k.mld_typeopdr_key = s.mld_typeopdr_key"
+ " AND k.mld_kenmerk_niveau = 'O')";
if (newOpdracht && params.mobile)
sql_filter += " AND t.mld_srtkenmerk_kenmerktype <> 'M'"
}
// 4) Aanmaken melding of of geavanceerd
else
{ // Dan blijf een nieuwe melding over of geavanceerd meldingen: gebruik default waarden
sql_waarde = " "+ lcl.xsql('k.mld_kenmerk_default','k.mld_kenmerk_key');
if (stdm_arr.length != 0 || newMelding)
{
var x_key = "s.mld_stdmelding_key";
if (stdm_arr.length)
var x_arr = stdm_arr;
else
var x_arr = [-1]; // Vals spelen
}
else if (disc_arr.length != 0)
{
var x_key = "s.mld_ins_discipline_key";
var x_arr = disc_arr;
}
else if (srtdisc.length != 0)
{
var x_key = "d.ins_srtdiscipline_key";
var x_arr = srtdisc;
}
sql_filter = " mld_stdmelding s, mld_discipline d"
+ " WHERE " + x_key + " IN (" + x_arr.join(",") + ")"
+ " AND s.mld_ins_discipline_key = d.ins_discipline_key"
+ " AND ((k.mld_stdmelding_key = d.ins_srtdiscipline_key"
+ " AND k.mld_kenmerk_niveau = 'T')"
+ (advanced || disc_arr.length != 0 || stdm_arr.length != 0
? " OR (k.mld_stdmelding_key = s.mld_ins_discipline_key"
+ " AND k.mld_kenmerk_niveau = 'D')"
: "")
+ (advanced || stdm_arr.length != 0
? " OR (k.mld_stdmelding_key = s.mld_stdmelding_key"
+ " AND k.mld_kenmerk_niveau = 'S')"
: "")
+ " )";
}
// Bij 'advanced' groeperen we op mld_srtkenmerk_key ipv mld_kenmerk_key
// in de zoek-html komt uiteindelijk de srtkenmerk_key te staan
// in getkenmerksql.inc wordt dat voor MLD weer intelligent opgepikt
var sql = "SELECT DISTINCT " + (advanced&&!params.wfbuilder?"k.mld_srtkenmerk_key":"k.mld_kenmerk_key") + " kenmerk_key, "
+ "k.mld_kenmerk_niveau,"
+ (Session("logging")>0?" k.mld_kenmerk_niveau || ':' ||":"") // Lettertje ervoor bij logging
+ lcl.xsql('t.mld_srtkenmerk_omschrijving', 't.mld_srtkenmerk_key') +" kenmerk_omschrijving, "
+ " t.mld_srtkenmerk_kenmerktype kenmerk_kenmerktype, "
+ " t.fac_kenmerkdomein_key kenmerkdomein_key, "
+ " t.mld_srtkenmerk_lengte kenmerk_lengte, "
+ " t.mld_srtkenmerk_dec kenmerk_dec, "
+ " t.mld_srtkenmerk_nmin kenmerk_nmin, "
+ " t.mld_srtkenmerk_nmax kenmerk_nmax, "
+ sql_waarde + " kenmerk_waarde, "
+ " k.mld_kenmerk_volgnummer kenmerk_volgnr, "
+ " k.mld_kenmerk_groep kenmerk_groep, "
+ lcl.xsql('t.mld_srtkenmerk_dimensie', 't.mld_srtkenmerk_key') +" kenmerk_dimensie, "
+ lcl.xsql('k.mld_kenmerk_hint', 't.mld_srtkenmerk_key') +" kenmerk_hint, "
+ lcl.xsql('k.mld_kenmerk_default','k.mld_kenmerk_key') +" kenmerk_default, "
+ " k.mld_kenmerk_verplicht kenmerk_verplicht, "
+ " " + otherKenmerkPath + " otherpath," // corresponderende pad voor copy/move folder
+ " k.mld_kenmerk_toonbaar kenmerk_toonbaar," // 1=Alleen toonbaar (readonly)
+ " k.mld_kenmerk_uniek kenmerk_uniek,"
+ " k.mld_kenmerk_regexp kenmerk_regexp"
+ " FROM mld_srtkenmerk t"
+ " , mld_kenmerk k"
+ " ," + sql_filter
+ " AND k.mld_kenmerk_verwijder IS NULL"
+ " AND k.mld_srtkenmerk_key=t.mld_srtkenmerk_key"
+ " AND t.mld_srtkenmerk_verwijder IS NULL";
var sql1 = "";
if (changeOpdracht || newOpdracht || advancedOpdracht)
{
// PF/MGE 29-09-09: Ook bij nieuw opdrachten mag ik afmeld-kenmerken tussen de 100..900 niet zien
if ((showClose || (opdr_status == 6 || opdr_status == 7)) && changeOpdracht && !copy)
{ // dan wil ik ze wel zien
}
else
{ // Alleen bij of na afmelden mogen afmeld-kenmerken tussen de 100..900
sql1 = " AND (k.mld_kenmerk_volgnummer <= 100 OR k.mld_kenmerk_volgnummer >= 900)";
}
// Alleen met opdrman rechten mag ik opdracht flexkenmerken boven de 900 zien
if (!opdrman)
sql1 += " AND k.mld_kenmerk_volgnummer <= 900";
}
else
{ // changeMelding || newMelding || advancedMelding
// Alleen met mldbof rechten mag ik melding flexkenmerken boven de 900 zien. New feature 02-02-2010
if (!my_mldrechten.canRead("WEB_MLDBOF"))
sql1 += " AND k.mld_kenmerk_volgnummer <= 900";
if (!my_mldrechten.canRead("WEB_MLDBOF") && !my_mldrechten.canRead("WEB_MLDFOF") &&
!my_mldrechten.canRead("WEB_MLDBO2") && !my_mldrechten.canRead("WEB_MLDBO3") &&
!my_mldrechten.canRead("WEB_MLDORD") && !my_mldrechten.canRead("WEB_MLDBAC"))
{ // Met alleen WEB_MLDUSE rechten mag ik kenmerken tussen 800 en 900 niet zien
sql1 += " AND (k.mld_kenmerk_volgnummer <= 800 OR k.mld_kenmerk_volgnummer >= 900)";
}
}
sql = sql + sql1;
if (advanced) // Nog harder de dubbelen er uit filteren. Een kenmerk kan bijvoorbeeld bij verschillende
{ // objectsoorten een ander volgnummer hebben en dat interesseert ons echt niet.
sql = "SELECT kenmerk_key, "
+ " MIN(mld_kenmerk_niveau) mld_kenmerk_niveau, "
+ " MIN(kenmerk_omschrijving) kenmerk_omschrijving, "
+ " MIN(kenmerk_kenmerktype ) kenmerk_kenmerktype, "
+ " MIN(kenmerkdomein_key ) kenmerkdomein_key, "
+ " MIN(kenmerk_lengte ) kenmerk_lengte, "
+ " MIN(kenmerk_dec ) kenmerk_dec, "
+ " MIN(kenmerk_nmin ) kenmerk_nmin, "
+ " MIN(kenmerk_nmax ) kenmerk_nmax, "
+ " MIN(kenmerk_waarde ) kenmerk_waarde, "
+ " MIN(kenmerk_volgnr ) kenmerk_volgnr, "
+ " MIN(kenmerk_groep ) kenmerk_groep, "
+ " MIN(kenmerk_dimensie ) kenmerk_dimensie, "
+ " MIN(kenmerk_hint ) kenmerk_hint, "
+ " MIN(kenmerk_default ) kenmerk_default, "
+ " MIN(otherpath ) otherpath, "
+ " MIN(kenmerk_verplicht ) kenmerk_verplicht, "
+ " MIN(kenmerk_toonbaar ) kenmerk_toonbaar, "
+ " MIN(kenmerk_uniek ) kenmerk_uniek,"
+ " MIN(kenmerk_regexp ) kenmerk_regexp"
+ " FROM (" + sql + ")"
+ " GROUP BY kenmerk_key";
}
// Specifieke kenmerk_keys opgevraagd?
if (params.kenmerk_keys && params.kenmerk_keys.length)
{
sql += " AND k.mld_kenmerk_key IN (" + params.kenmerk_keys.join(",") + ")"
}
sql = sql + " ORDER BY kenmerk_volgnr, UPPER(kenmerk_omschrijving), DECODE(mld_kenmerk_niveau,'T',0,'D',1,'S',2)";
// ik hoef hierna dus nooit kenmerken te onderdrukken, hooguit readonly maken
if (changeOpdracht || newOpdracht || advancedOpdracht)
{
var kenmerk_module = "O";
var key = opdr_key;
}
else
{
var kenmerk_module = "M";
var key = mld_key;
}
function isReadonly (volgnummer)
{
if (reado) return true; // Als meegegeven dan altijd readonly
if (changeMelding || newMelding) // Advanced zoeken (advancedOpdracht) is nooit readonly
{ // JGL: een en ander kan veel compacter beschreven worden maar dat
// is dan niet meer te begrijpen.
// Voor bestaande meldingen zou eigenlijk my_mldrechten.canFlexChange meegenomen moeten worden.
// Maar daar zorgt de parameter reado nu al voor.
if (volgnummer <= 800)
{
if (my_mldrechten.canWrite("WEB_MLDFOF") || my_mldrechten.canFEwrite)
return false; // ik mag schrijven
return true;
}
if (volgnummer > 800 && volgnummer < 900)
{
if (my_mldrechten.canWrite("WEB_MLDFOF"))
return false; //ik mag schrijven
return true; // niet
}
if (volgnummer == 900)
{
if (my_mldrechten.canWrite("WEB_MLDFOF") || my_mldrechten.canWrite("WEB_MLDBOF"))
return false;
return true;
}
if (volgnummer > 900) // het enige wat overblijft
{
if (my_mldrechten.canWrite("WEB_MLDBOF"))
return false; // ik mag
return true; // niet
}
}
if (changeOpdracht || newOpdracht) // Advanced zoeken (advancedOpdracht) is nooit readonly
{
if (opdr_status == 7)
return true; // bij AV mag je nooit wijzigen
if (opdr_status != 7 && volgnummer >= 900 && opdrman)
return false; // bij TV en opdrman mag je nog boven de 900 flexkenmerken aanpassen
if (volgnummer > 100 && volgnummer <= 900)
return !showClose; // afmeld-kenmerken mag je alleen tijdens het afmelden wijzigen
// uiteindelijk dan nog de flexkenmerken <= 100 (vermoeden is dat MLDBOF hier eigenlijk niet bij hoort)
return !my_mldrechten.canWrite("WEB_MLDBOF") && !my_mldrechten.canWrite("WEB_ORDBO2") && !my_mldrechten.canWrite("WEB_ORDBOF");
}
return false; // 'k vind het wel best
}
listKenmerk(sql,
"MLD",
key,
{ flexcolumns: flexcolumns,
kenmerk_search: advanced,
kenmerk_extraTD: (changeOpdracht || newOpdracht), // Voor opdrachten een extra TD erachter TODO: (MGE) klopt dit nog
fnIsReadonly: isReadonly,
prs_key: prs_key, // Wordt alleen gebruikt als geldt (!kenmerk_search && !multiMode)
parentKey: key,
parent_list: params.parent_list,
fnpre: params.fnpre,
fnpost: params.fnpost,
mobile: params.mobile,
sqldefaultnotrequired: params.act_key > 0,
hideVervallen: newMelding||newOpdracht,
niveau: kenmerk_module,
wfbuilder: params.wfbuilder
}
);
} %>