Files
Facilitor/APPL/MLD/mld_edit_note.inc
Erik Groener e5286d4ad4 FCLT#89765 Problemen afgemelde meldingen na update functie #83589
svn path=/Website/trunk/; revision=70110
2025-08-26 12:44:46 +00:00

362 lines
18 KiB
C++

<% /*
$Revision$
$Id$
File: mld_edit_note.inc
Description: Functie vooor het echte bewaren van een melding notitie
Context: Vanuit mld_edit_note.asp
*/
%>
<!-- #include file="../Shared/notes.inc" -->
<%
// params: note_key, isFE, zichtFE
function mld_note_save(mld_key, note, params) {
var mld_info = mld.mld_melding_info(mld_key);
var result = {};
lcl.set_dialect(mld_info.srtdisc_key, "MLD_SRTDISCIPLINE_KEY");
var mfe = mld.func_enabled_melding (mld_key);
// Heb ik rechten om notities te wijzigen?
user.auth_required_or_abort(mfe.canWriteNotes);
var saveNote = !params.bijlage; // In het gaval van een het toevoegen van een bijlage (alleen door de FrontEnd)
// bij notities onder water de flags/status/notitificatie doen
// alsof er een notitie was getikt door die Frontend.
var eigenMelding = user.isCollega(mld_info.melder_key);
if (note) {
params.note = note;
params.module = "MLD";
params.table = "mld_melding";
// fenotes betekenis:
// 0 FE kan niet reageren, per notitie, default niet zichtbaar voor FE
// 1 FE kan reageren, alle notities zichtbaar voor FE (transparantiemodus)
// 2 FE kan reageren, per notitie, default niet zichtbaar voor FE
// 3 FE kan reageren, per notitie, default wel zichtbaar voor FE
// Let op: fenotes is geen bitwise codering (meer), gewoon 0-3
var zichtbaarFE = params.has_zichtbaarFE ? params.zichtFE : true; // default: zelf ingevoerd --> zichtbaar (tenzij anders aangegeven)
if (!eigenMelding)
{ // FOBO
zichtbaarFE = (mld_info.fenotes == 1); // Default waarden
if (mld_info.fenotes != 1)
{ // Afhankelijk van checkbox die door FOBO kan worden ingevuld.
if (params.has_zichtbaarFE)
zichtbaarFE = params.zichtFE;
else if (mld_info.publiek == 1) // use default when public and no checkbox for visibility present
zichtbaarFE = mld_info.fenotes == 3;
}
}
if (params.note_key > -1) { // bestaande notitie
var sql = "SELECT mld_melding_note_flag,"
+ " mld_melding_note_aanmaak"
+ " FROM mld_melding_note"
+ " WHERE mld_melding_note_key = " + params.note_key
+ " AND mld_melding_key = " + mld_key;
var oRs = Oracle.Execute(sql);
var oldflag = oRs("mld_melding_note_flag").Value;
var noteaanmaak = new Date(oRs("mld_melding_note_aanmaak").Value);
oRs.Close();
var newflag = (zichtbaarFE ? 1 : 0);
newflag |= (oldflag & 64); // Bij edit de 'ismailnote' bit behouden
params.flag = newflag;
} else { // nieuwe notitie
var newflag = (zichtbaarFE ? 1 : 0) + (params.ismailnote ? 64 : 0);
params.flag = newflag;
}
if (saveNote) {
// Hier het daadwerkelijke opslaan van de notitie
// In het gaval van een bijlage wordt er niets opgeslagen.
var note_key = notes.note_save(mld_key, params);
}
if (params.note_key > -1) { // bestaande notitie
if (!zichtbaarFE && oldflag & 1) // Proberen MLDNOT notificatie terug te trekken. Geen garanties
{ // Merk op dat de volgorde notitie1 maken (zichtbaar),
// notitie2 maken (zichtbaar),
// notitie2 bewerken (onzichtbaarbaar maken)
// ingewikkeld is. Daarom de check op fac_notificatie_datum. Niet 100% maar goed genoeg.
var sql = "DELETE FROM fac_notificatie"
+ " WHERE fac_srtnotificatie_key = "
+ " (SELECT fac_srtnotificatie_key"
+ " FROM fac_srtnotificatie"
+ " WHERE fac_srtnotificatie_code = 'MLDNOT')"
+ " AND fac_notificatie_datum >= " + noteaanmaak.toSQL(true)
+ " AND fac_notificatie_refkey = " + mld_key;
Oracle.Execute(sql);
}
} else { // Nieuwe 'Notitie bij {0}: {1}'
var txt = L("lcl_mld_is_mldnotetrack").format((mld_info.prefix||"") + mld_key, note);
var txt = txt.split("\n")[0].split("\r")[0]; // Altijd alleen eerste regel
if (txt.length > 80)
txt = txt.substr(0, 80);
txt = txt + "...";
var sender = getNotiSenderEmail(mld_key);
if (mfe.haveOnlyFErights) // Frontend gebruiker
{
if (eigenMelding && mld_info.mld_status != 5 &&
((params.action2BO && !(mld_info.actiecode & 1)) || // BO had de actie nog niet
(!params.has_action2BO && mld_info.actiecode & 1 && !(mld_info.actiecode & 128) ) // BO had de actie wel, maar de attentie nog niet
)
)
{
var sql = "UPDATE mld_melding"
+ " SET mld_melding_actiecode = 1 + 128" // + actionBO + attentieBO (evt. - attentieFE)
+ " WHERE mld_melding_key = " + mld_key;
Oracle.Execute(sql);
shared.trackaction("MLDA2B", mld_key);
result.mustrefreshMLD = true;
} else if (mld_info.actiecode & 256) {
var sql = "UPDATE mld_melding"
+ " SET mld_melding_actiecode = mld_melding_actiecode - 256" // - attentieFE
+ " WHERE mld_melding_key = " + mld_key;
Oracle.Execute(sql);
}
} else { // FOBO medewerker
if ((mld_info.actiecode & 128) == 128) { // Altijd attentie er af, *ik* heb hem blijkbaar gezien
var sql = "UPDATE mld_melding"
+ " SET mld_melding_actiecode = BITAND(mld_melding_actiecode, 511 - 128)"
+ " WHERE mld_melding_key = " + mld_key;
Oracle.Execute(sql);
mld_info.actiecode &= ~128; // - attentieBO
result.mustrefreshMLD = true;
}
if (zichtbaarFE && params.notifyFE) {
// Notificatie (MLDNOT) indien notitie zichtbaar is voor FE.
// (tracking ervan is overkill: de notitie zelf is eigenlijk tracking)
Oracle.Execute("BEGIN fac.putnotificationsrtprio("
+ "NULL"
+ ", " + mld_info.melder_key
+ ", 'MLDNOT'"
+ ", " + mld_key
+ ", " + safe.quoted_sql(txt)
+ ", NULL, NULL, NULL, NULL, 2, " + safe.quoted_sql(sender) + "); END;");
}
if (zichtbaarFE && mld_info.haschild && params.notifyFEchild) {
var sql = "SELECT mld_melding_key"
+ " , prs_perslid_key"
+ " FROM mld_melding"
+ " WHERE mld_melding_parentkey = " + mld_key;
var oRs = Oracle.Execute(sql);
while (!oRs.eof) {
var mld_child_key = oRs("mld_melding_key").Value;
var prs_child_key = oRs("prs_perslid_key").Value;
Oracle.Execute("BEGIN fac.putnotificationsrtprio("
+ "NULL"
+ ", " + prs_child_key
+ ", 'MLDNOT'"
+ ", " + mld_child_key
+ ", " + safe.quoted_sql(txt)
+ ", NULL, NULL, NULL, NULL, 2, " + safe.quoted_sql(sender) + "); END;");
oRs.MoveNext();
}
oRs.Close();
}
if (zichtbaarFE && mld_info.canholdthirdparty && mld_info.email_ext && params.notifyExt) {
Oracle.Execute("BEGIN fac.putnotificationsrtprio("
+ "NULL"
+ ", NULL"
+ ", 'MLDNOT'"
+ ", " + mld_key
+ ", " + safe.quoted_sql(txt)
+ ", 2, " + safe.quoted_sql(mld_info.email_ext) + ", NULL, NULL, 2, " + safe.quoted_sql(sender) + "); END;");
}
if (params.action2BO && !(mld_info.actiecode & 1)) { // action2BO
var sql = "UPDATE mld_melding"
+ " SET mld_melding_actiecode = 1" // Actie nu bij BO. Zelf gedaan dus geen attentie
+ " WHERE mld_melding_key = " + mld_key;
Oracle.Execute(sql);
shared.trackaction("MLDA2B", mld_key);
result.mustrefreshMLD = true;
} else if ( params.notifyFE // notifyFE
|| S("mld_note_hidden_action2FE") && params.action2FE && !(mld_info.actiecode & 2)) { // action2FE
var mldActiecode = mld_info.actiecode | 256; // Huidige actiecode + attentieFE
if (params.action2FE && !(mld_info.actiecode & 2)) { // action2FE
mldActiecode &= ~3; // - action2BO/FE
mldActiecode |= 2; // + action2FE
shared.trackaction("MLDA2M", mld_key);
}
var sql = "UPDATE mld_melding"
+ " SET mld_melding_actiecode = " + mldActiecode
+ " WHERE mld_melding_key = " + mld_key;
Oracle.Execute(sql);
result.mustrefreshMLD = true;
}
}
// Controleren of er ook naar het gebouw een mailtje gestuurd moet worden.
// Normaal gesproken gaat dit automatisch als het getrackt wordt. Maar hier wordt geen tracking gedaan. De notitie is de tracking.
// LET OP: Code komt uit de FAC_PAC.SRC package PROCEDURE notifytracking aan het einde van de lxmlnode "melding".
var sql_sng = "SELECT fac_srtnotificatie_gebouw"
+ " FROM fac_srtnotificatie"
+ " WHERE fac_srtnotificatie_code = 'MLDNOT'";
var oRs = Oracle.Execute(sql_sng);
var srtnotigebouw = oRs("fac_srtnotificatie_gebouw").Value;
oRs.Close();
var sql_ogk = "SELECT mld_alg_onroerendgoed_keys"
+ " FROM mld_melding"
+ " WHERE mld_melding_key = " + mld_key;
var oRs = Oracle.Execute(sql_ogk);
var algonrgoedkey = oRs("mld_alg_onroerendgoed_keys").Value || -1;
oRs.Close();
if (srtnotigebouw == 1 && algonrgoedkey > 0 && zichtbaarFE) { // Stuur een notificatie naar het e-mail adres van het gebouw
var sql_ge = "SELECT g.alg_gebouw_email"
+ " FROM alg_v_allonroerendgoed aog"
+ " , alg_gebouw g"
+ " WHERE aog.alg_gebouw_key = g.alg_gebouw_key"
+ " AND aog.alg_onroerendgoed_keys = " + algonrgoedkey;
var oRs = Oracle.Execute(sql_ge);
var gebouwemail = oRs("alg_gebouw_email").Value;
oRs.Close();
Oracle.Execute("BEGIN fac.putnotificationsrtprio("
+ "NULL"
+ ", NULL"
+ ", 'MLDNOT'"
+ ", " + mld_key
+ ", " + safe.quoted_sql(txt)
+ ", NULL"
+ ", " + safe.quoted_sql(gebouwemail)
+ ", NULL, NULL, 2, " + safe.quoted_sql(sender) + "); END;");
}
}
mld.lock(mld_key); // Voor zowel nieuwe als bestaande notitie de lock zetten als de notitie bewaard wordt
if (mld_info.nobnotify && params.note_key == -1) {
// De meest specifieke behandelaar nog een echte notificatie sturen bij nieuwe notitie
// naar jezelf hoeft dat niet.
var behandelaar_key = -1;
if (mld_info.behandel2_key > 0) {
if (mld_info.behandel2_key != user_key) {
behandelaar_key = mld_info.behandel2_key;
}
} else if (mld_info.behandel_key > 0 && mld_info.behandel_key != user_key) {
behandelaar_key = mld_info.behandel_key;
}
// Laat de Behandelaar weten dat er iemand (anders) een notitie heeft toegevoegd of gewijzigd
// only notify with a new note
if (behandelaar_key > 0) {
// putnotificationsrtprio doet geen vertaling van andere vars dan ##KEY## (notify_tracking zou dat wel doen)
// dus doen we het hier zelf maar.
var omssql = "SELECT fac_srtnotificatie_oms"
+ " FROM fac_srtnotificatie"
+ " WHERE fac_srtnotificatie_code = 'MLDNOB'";
var oRs = Oracle.Execute(omssql);
var oms = L(oRs("fac_srtnotificatie_oms").Value, { autolcl: true });
oRs.Close();
var sender = getNotiSenderEmail(mld_key);
Oracle.Execute("BEGIN fac.putnotificationsrtprio("
+ (saveNote? "NULL" : user_key)
+ ", " + behandelaar_key
+ ", " + (saveNote? "'MLDNOB'" : "'MLDUPD'")
+ ", " + mld_key
+ ", mld.mldsprintf(" + safe.quoted_sql(saveNote? oms : params.note) + ", " + mld_key + ")"
+ ", NULL, NULL, NULL, NULL, 2, " + safe.quoted_sql(sender) + "); END;");
}
}
if (S("mld_rejected_is_open") && mld_info.mld_status == 1) {
// Aanpassen van een afgewezen melding werpt die weer opnieuw de molen in.
mld.setmeldingstatus(mld_key, 2);
result.mustrefreshMLD = true;
result.verynewnote = true;
}
if (eigenMelding && ((mld_info.actiecode & 256) == 256) && mld_info.mld_status == 5)
{ // De attentie van de FE er afhalen en de attentie op de FO/BO zetten.
var mldActiecode = mld_info.actiecode;
// Als de melder gereageerd heeft op de Attentie, dan deze er weer afhalen. Ook als de melder niet akkoord is.
mldActiecode -= 256; // - attentieFE (256).
if (params.has_assume_not_ok && params.assume_not_ok)
{ // Melder niet akkoord, dan de actiecodeFO/BO zetten.
mldActiecode |= 128; // + attentieFOBO (128).
}
var sql = "UPDATE mld_melding"
+ " SET mld_melding_actiecode = " + mldActiecode
+ " WHERE mld_melding_key = " + mld_key;
Oracle.Execute(sql);
}
}
result.mld_key = mld_key;
result.note_key = note_key || params.note_key;
result.canAccept = mfe.canAccept;
return result;
}
function note_recently_changed(mld_key, lastdate) {
// Is de melding recent nog gewijzigd.
var changedby = "";
var sql_t = "SELECT t.fac_tracking_datum"
+ " , prs_perslid_naam_friendly naam"
+ " FROM (SELECT f.fac_tracking_datum"
+ " , f.prs_perslid_key"
+ " , f.fac_tracking_refkey mld_melding_key"
+ " FROM fac_tracking f"
+ " , fac_srtnotificatie n"
+ " WHERE f.fac_srtnotificatie_key = n.fac_srtnotificatie_key"
+ " AND n.fac_srtnotificatie_xmlnode = 'melding'"
+ " UNION "
+ "SELECT mld_melding_note_aanmaak"
+ " , prs_perslid_key"
+ " , mld_melding_key"
+ " FROM mld_melding_note"
+ ") t"
+ " , prs_v_perslid_fullnames_all p"
+ " WHERE t.prs_perslid_key = p.prs_perslid_key"
+ " AND t.mld_melding_key = " + mld_key
+ " AND t.prs_perslid_key <> " + user_key
+ " AND t.fac_tracking_datum > " + lastdate.toSQL(true)
+ " ORDER BY t.fac_tracking_datum DESC";
var oRs_t = Oracle.Execute(sql_t);
if (!oRs_t.eof) {
changedby = oRs_t("naam").Value;
}
oRs_t.Close();
return changedby;
}
function getNotiSenderEmail(mldkey) { // Deze functie volgt dezelfde logica als fac.notifytracking wat betreft het ophalen van het afzend emailadres
var sql = "SELECT COALESCE (d.ins_discipline_email,"
+ " l1.alg_locatie_email,"
+ " l2.alg_locatie_email)"
+ " sender"
+ " FROM mld_melding m,"
+ " mld_stdmelding stdm,"
+ " ins_tab_discipline d,"
+ " mld_adres ma,"
+ " alg_locatie l1,"
+ " alg_locatie l2"
+ " WHERE stdm.mld_stdmelding_key = m.mld_stdmelding_key"
+ " AND d.ins_discipline_key = stdm.mld_ins_discipline_key"
+ " AND m.mld_adres_key = ma.mld_adres_key(+)"
+ " AND ma.alg_locatie_key = l1.alg_locatie_key(+)"
+ " AND m.mld_alg_locatie_key = l2.alg_locatie_key(+)"
+ " AND m.mld_melding_key = " + mldkey;
var oRs = Oracle.Execute(sql);
var sender = oRs("sender").Value;
oRs.Close();
return sender;
}
%>