Files
Facilitor/APPL/MLD/mld_edit_melding_save.asp
Jos Groot Lipman 83b886db01 FSN#42267: Omschrijving van de tracking van stdmelding verfijnder
svn path=/Website/trunk/; revision=35397
2017-09-21 09:10:55 +00:00

743 lines
36 KiB
Plaintext
Raw Blame History

<%@ LANGUAGE = JavaScript %>
<% /*
$Revision$
$Id$
File: mld_edit_melding_save.asp
Description: Sla de wijzigingen van mld_edit_melding op
Parameters: submit van mld/mld_edit_melding.asp en pda/melding.asp
Note: Eventueel maken we uiteindelijk een print-scherm aan!
Als backo opslaat dan wordt impliciet de status op 4 (geaccepteerd) gezet
Uiteindelijk willen we deze general purpose hebben, waarbij bv zo weinig mogelijk
velden verplicht zijn en zeker niet onnodig meegegeven hoeven te worden; vandaar
de introductie van de savewhen parameter in de save2db
*/
var JSON_Result = true;
var mld_key = getFParamInt("mld_key", -1);
var LOCKED_USER_OK = { "xmlnode": "melding", "key": mld_key };
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../shared/save2db.inc" -->
<!-- #include file="../Shared/json2.js" -->
<!-- #include file="../Shared/kenmerk_common.inc" -->
<!-- #include file="mld.inc" -->
<%
function validReferenceKey(mldkey, refkey)
{
// Is de opgegeven referentie een geldige melding?
var result = false;
if (refkey && refkey > 0)
{
var sql_r = "SELECT m.mld_melding_key"
+ " FROM mld_melding m"
+ " , mld_stdmelding sm"
+ " WHERE m.mld_melding_key = " + refkey
+ " AND m.mld_stdmelding_key = sm.mld_stdmelding_key"
+ " AND sm.mld_ins_discipline_key IN"
+ " (SELECT ins_discipline_key"
+ " FROM fac_v_webgebruiker g"
+ " , fac_functie f"
+ " WHERE g.prs_perslid_key = " + user_key
+ " AND f.fac_functie_key = g.fac_functie_key"
+ " AND f.fac_functie_code IN ('WEB_MLDFOF', 'WEB_MLDBOF')"
+ " AND g.fac_gebruiker_alg_level_read < 9)"
+ (mldkey==-1
? ""
: " AND m.mld_melding_key != " + mldkey // niet naar jezelf refereren
)
+ " AND TRUNC(m.mld_melding_einddatum, 'DD') >= SYSDATE - " + S("mld_reference_days");
var oRs_r = Oracle.Execute(sql_r);
if (!oRs_r.eof)
result = true;
oRs_r.Close();
}
else
result = true; // Geen referentie is altijd geldig.
return result;
}
// AUTORISATIEPARAMETERS
var urole = getFParam("urole");
var fronto = urole == "fo";
var backo = urole == "bo";
var frontend = (!fronto & !backo);
var parent_key = getFParamInt("parent_key", -1);
var isNew = (mld_key <= 0); // dan gaan we S("mld_melding_autoprint") beschouwen
var locatiekey = getFParamInt("locatiekey", -1);
var sBehandel = getFParamInt("sBehandel", -2);
var prio = getFParamInt("prio", mld_key>0?-1:3); // Default 3 voor nieuwe. Bij readonly bestaande meldingen de prio niet aanpassen.
// Bepaal de nieuwe waarde voor de checkbox afgerond.
var newvalafgerond = Request.Form("afgerond").count == 1? 1: 0;
// Als we geen locatiekey hebben maar wel een afleveradres, kunnen we mogelijk ook een locatiekey bepalen
var del_address = getFParamInt("del_address", -1);
if (locatiekey == -1 && hasFParam("del_address") && del_address != -1)
{
oRs = Oracle.Execute('SELECT alg_locatie_key FROM mld_adres WHERE mld_adres_key = ' + del_address);
if (!oRs.eof && oRs("alg_locatie_key").Value)
{
locatiekey = oRs("alg_locatie_key").Value;
}
oRs.Close();
}
// Objects...
var obj_arr = getFParamIntArray("r_objs", []);
var one_object = (obj_arr.length == 1); // Is er 1 object geselecteerd?
var forcesave = (getFParamInt("forcesave", 0) == 1);
var stdm_key = getFParamInt("stdm");
var stdm_info = mld.mld_stdmeldinginfo(stdm_key);
var meldbron_key = getFParamInt("meldbronkey", S("mld_meldbron_key"));
// If a deelsrtcont_key is given, this new melding will reference to a kto_type=T and kto_key=deelsrtcont_key
var deelsrtcont_key = getFParamInt("deelsrtcont_key", null);
// Onroerendgoed_keys wordt de verfijnste van de opgegeven plaats
var gebouwkey = getFParamInt("gebouwkey", -1);
var verdiepingkey = getFParamInt("verdiepingkey", -1);
var ruimtekey = getFParamInt("ruimtekey", -1);
var alg_onroerendgoed_keys = -1;
if (stdm_info.ins_srtdiscipline_alglevel > 2)
{
// Wis de onroerendgoed keys die op basis van alglevel niet van belang zijn.
if (stdm_info.ins_srtdiscipline_alglevel < 3) gebouwkey = -1
else if (stdm_info.ins_srtdiscipline_alglevel < 4) verdiepingkey = -1
else if (stdm_info.ins_srtdiscipline_alglevel < 5) ruimtekey = -1;
// die specifiekere plaats moet dan leegblijven
if (ruimtekey != -1)
alg_onroerendgoed_keys = ruimtekey;
else if (verdiepingkey != -1)
alg_onroerendgoed_keys = verdiepingkey;
else if (gebouwkey != -1)
alg_onroerendgoed_keys = gebouwkey;
}
var savemode = true;
if (!forcesave && (fronto || frontend) && isNew)
{
// mld_stdmelding_doublecheck: 00 (0) Geen controle uitvoeren
// 01 (1) Controle dubbel bij invoer nieuwe melding (door FE, FO (of BO))
// 10 (2) Controle dubbel bij accpteren melding (door BO)
// 11 (3) Controle zowel bij invoer als bij accepteren
if (stdm_info.doublecheck == 1 || stdm_info.doublecheck == 3)
{
// In facmgt moet altijd een verplicht niveau gekozen worden. stdm_info.alg_onrgoed_niveau heeft dus een waarde (R, V, G, L).
var where_alg = "AND m.mld_alg_onroerendgoed_keys = org.alg_onroerendgoed_keys";
if (!stdm_info.ins_srtdiscipline_alg)
where_alg = "";
else if (stdm_info.alg_onrgoed_niveau == "R")
where_alg += " AND org.alg_ruimte_key = " + ruimtekey;
else if (stdm_info.alg_onrgoed_niveau == "V")
where_alg += " AND org.alg_verdieping_key = " + verdiepingkey;
else if (stdm_info.alg_onrgoed_niveau == "G")
where_alg += " AND org.alg_gebouw_key = " + gebouwkey;
else if (stdm_info.alg_onrgoed_niveau == "L")
where_alg += " AND org.alg_locatie_key = " + locatiekey;
// Als er exact 1 object is geselecteerd beschouwen
// we alleen meldingen op dat object
sql = "SELECT DISTINCT m.mld_melding_key"
+ " FROM mld_melding m"
+ (where_alg?
" , alg_v_allonroerendgoed org": "")
+ (one_object?
" , mld_melding_object mo" : "")
+ " WHERE m.mld_melding_status IN (0, 2, 3, 4, 7)"
+ (one_object
? " AND m.mld_melding_key = mo.mld_melding_key"
+ " AND mo.ins_deel_key = " + obj_arr
: "")
+ " AND m.mld_melding_parentkey IS NULL" // Geen child meldingen tonen
+ " AND m.mld_stdmelding_key = " + stdm_key
+ where_alg;
oRs = Oracle.Execute(sql);
if (!oRs.eof)
{ // Er is mogelijk een dubbele melding aanwezig
savemode = false;
}
oRs.Close();
}
}
if (savemode)
{ // Verder met opslaan van de gegevens
var sql = "SELECT ms.mld_ins_discipline_key"
+ " , mld_stdmelding_vereisdienst"
+ " , mld_stdmelding_autoorder"
+ " , ms.prs_dienst_key"
+ " , ms.mld_stdmelding_prseigen"
+ " , ms.mld_typeopdr_key"
+ " , " + lcl.xsqla('pd.prs_dienst_omschrijving', 'pd.prs_dienst_key')
+ " , COALESCE(ms.mld_stdmelding_directklaar, dp.mld_disc_params_directklaar, 0) mld_directklaar"
+ " FROM mld_stdmelding ms"
+ " , prs_dienst pd"
+ " , mld_disc_params dp"
+ " WHERE mld_stdmelding_key = " + stdm_key
+ " AND pd.prs_dienst_key(+) = ms.prs_dienst_key"
+ " AND ms.mld_ins_discipline_key = dp.mld_ins_discipline_key";
var oRs = Oracle.Execute(sql);
var discipline_key = oRs("mld_ins_discipline_key").Value;
var vereisdienst = oRs("mld_stdmelding_vereisdienst").Value == 1;
var eigenprs = oRs("mld_stdmelding_prseigen").Value == 1;
var prs_dienst_key = oRs("prs_dienst_key").Value;
var prs_dienst_desc = oRs("prs_dienst_omschrijving").Value; // 'Schoonmaken'
var autoorder = oRs("mld_stdmelding_autoorder").Value == 1;
var mld_typeopdr_key = oRs("mld_typeopdr_key").Value;
var directNaarFO = oRs("mld_directklaar").Value == 2;
oRs.Close();
var old_ref_key = -1;
if (mld_key > 0)
{
var sql_m = "SELECT m.mld_melding_kto_key"
+ " , m.mld_melding_spoed"
+ " FROM mld_melding m"
+ " WHERE m.mld_melding_key = " + mld_key;
var oRs_m = Oracle.Execute(sql_m);
old_ref_key = oRs_m("mld_melding_kto_key").Value;
var old_prio = oRs_m("mld_melding_spoed").Value;
oRs_m.Close();
}
// Als de setting niet is gezet is "Melding voor" gelijk aan contactpersoon. Invoerveld "Melding voor" was dan ook niet aanwezig.
// Kolommen prs_perslid_key en prs_perslid_key_voor zijn dan identiek.
if (S("mld_allow_for_others") == 1)
prs_key_voor = getFParamInt("personFor", -1);
else
{
prs_key_voor = getFParamInt("person", -1);
}
// Als we geen locatiekey hadden dan is hierboven al via afleveradres naar locatiekey gezocht.
var prs_bedrijf_key = mld.dienst_controle(stdm_key, locatiekey, gebouwkey, ruimtekey, prs_key_voor);
lcl.set_dialect(stdm_info.ins_srtdiscipline_key, "MLD_SRTDISCIPLINE_KEY");
var kpkey = getFParamInt("account", -1);
if (stdm_info.kpnverplicht && kpkey < 0)
{ // Kostenplaats is verplicht, maar is niet meegegeven. Bepaal default kostenplaats.
kpkey = (user.afdeling().prs_kostenplaats_key() || -1); // User kostenplaats key
if (kpkey < 0)
// We kunnen geen default kostenplaats bepalen. We kunnen de melding niet aanmaken.
// Alert geven en terug.
shared.simpel_page("Melding niet automatisch aangemaakt omdat kostenplaats niet bepaald kon worden");
}
// Deze velden altijd opslaan
var fields = [ { dbs: "mld_melding_onderwerp", typ: "varchar", frm: "melding_onderwerp", track: L("lcl_mld_subject"), len: 80 },
{ dbs: "mld_melding_omschrijving", typ: "varchar", frm: "melding_omschrijving", track: L("lcl_mld_inf_Omschrijving"), len: 4000 },
{ dbs: "mld_kosten_klant", typ: "check", frm: "kostenklant" /* notrack: */ },
{ dbs: "mld_melding_ordernr", typ: "varchar", frm: "ordernr", track: L("lcl_mld_inf_Ordernr")},
{ dbs: "prs_perslid_key", typ: "key", frm: "person", track: L("lcl_mld_name"), foreign: "prs_perslid" },
{ dbs: "prs_perslid_key_voor", typ: "key", val: prs_key_voor,
savewhen: "personFor", track: L("lcl_mld_call_for"), foreign: "prs_perslid" },
{ dbs: "prs_kostenplaats_key", typ: "key", val: kpkey, track: L("lcl_mld_inf_Kostenplaats"), foreign: "prs_kostenplaats" },
{ dbs: "mld_melding_opmerking", typ: "varchar", frm: "remark", track: L("lcl_mld_inf_Opmerking"), len: 4000 },
{ dbs: "mld_stdmelding_key", typ: "key", frm: "stdm", track: L("lcl_complain"), buildTrackText: buildStdmTrackText },
{ dbs: "mld_alg_onroerendgoed_keys", typ: "key", val: alg_onroerendgoed_keys,
savewhen: "locatiekey",
track: true /* afzonderlijke tracking, wel oldjsval */ },
{ dbs: "mld_alg_locatie_key", typ: "key", val: locatiekey,
savewhen: "locatiekey", track: true /* afzonderlijke tracking, wel oldjsval */ },
{ dbs: "mld_adres_key", typ: "key", frm: "del_address", track: L("lcl_delivery_address"), foreign: "mld_v_afleveradres" },
{ dbs: "mld_melding_behandelaar_key", typ: "key", frm: "sBehandel", track: true /* afzonderlijke tracking, wel oldjsval */ },
{ dbs: "mld_melding_externnr", typ: "varchar", frm: "externnr", track: L("lcl_mld_externr") },
{ dbs: "mld_melding_indult", typ: "check0", frm: "indult", track: L("lcl_mld_indult") },
{ dbs: "mld_melding_afgerond", typ: "check0", frm: "afgerond", track: L("lcl_mld_afgerond") }
];
// Checken of een geldige respijt aanwezig was.
// De eenheid van respijt wordt gelijk genomen aan de eenheid van de stdmelding en is dus altijd readonly.
// Als respijt niet aanwezig was dan ook eenheid niet opslaan (val wordt altijd opgeslagen, maar frm niet).
var respijtpresent = Request.Form("respijt").count > 0 && getFParamFloat("respijt") > 0;
if (respijtpresent)
fields.push({ dbs: "mld_melding_t_respijt.tijdsduur",
obj: "MLD_T_UITVOERTIJD", typ: "float", frm: "respijt", track: L("lcl_mld_respijt") },
{ dbs: "mld_melding_t_respijt.eenheid",
obj: "MLD_T_UITVOERTIJD", typ: "varchar", val: stdm_info.prioriteiten[(prio > 0? prio : old_prio)].eenheid, track: L("lcl_mld_respijt_eenheid") });
else // Leegmaken
fields.push({ dbs: "mld_melding_t_respijt.tijdsduur",
obj: "MLD_T_UITVOERTIJD", typ: "float", val: null, track: L("lcl_mld_respijt") },
{ dbs: "mld_melding_t_respijt.eenheid",
obj: "MLD_T_UITVOERTIJD", typ: "varchar", val: null, track: L("lcl_mld_respijt_eenheid") });
if (S("mld_melding_flags") > 0)
fields.push({ dbs: "mld_melding_flag", typ: "number", frm: "mldflag" /* notrack */ });
var rsv_ruimte_key = getFParamInt("rsv_ruimte_key", -1);
if (rsv_ruimte_key > 0)
fields.push({ dbs: "res_rsv_ruimte_key", typ: "key", frm: "rsv_ruimte_key", track: L("lcl_mld_with_res"), foreign: "res_rsv_ruimte" }); // Alleen bij aanmaken wordt deze eventueel gezet.
// Er zijn twee situaties te onderscheiden voor startdatum:
// 1) Als startdatum zichtbaar/wijzigbaar (vakgroep setting "Startdatum te bepalen" (mld_disc_params_startdatum))
// De tijd van de startdatum is altijd de begintijd van de dag (setting "fac_t_startofworkday" bijvoorbeeld 8:00 uur)
// => Startdatum = TRUNC(startdatum) + 8:00 uur
// Uitzondering: Echter als de startdatum de registratiedatum (bij nieuwe melding dus sysdate) is moet wel voor de begintijd de registratietijd (registratiedatum) genomen worden tijdens het opslaan.
// Anders geldt de acceptatietijd (in uren) onterecht al vanaf het begin van de dag.
// 2) Startdatum is niet zichtbaar/wijzigbaar
// De tijd van de startdatum is de tijd van de huidige waarde of van de sysdate, COALESCE(huidige waarde, sysdate).
// => Startdatum = COALESCE(huidige waarde, sysdate)
// Startdatum: indien niet meegegeven, neem dan sysdate
var startdate = getFParamDate("startdate", new Date);
var startwerkdag = parseFloat(S("fac_t_startofworkday"));
var startwerkdag_uur = Math.floor(startwerkdag);
var startwerkdag_min = (startwerkdag - Math.floor(startwerkdag)) * 60;
var startdatebegin = new Date(startdate.getFullYear(), startdate.getMonth(), startdate.getDate(), startwerkdag_uur, startwerkdag_min);
var sysdate = new Date();
if (stdm_info.startdatum)
{ // Situatie 1: Einddatum = TRUNC(startdatum) + 8:00 uur + SLA
// LET OP!!!: Als setting "mld_disc_params_startdatum" is gezet dan wordt eigenlijk verondersteld dat de SLA in dagen is en niet in uren.
// Echter als de startdatum de registratiedatum (bij nieuwe melding dus sysdate) is moet wel voor de begintijd de registratietijd (registratiedatum) genomen worden tijdens het opslaan.
// Anders geldt de acceptatietijd (in uren) onterecht al vanaf het begin van de dag.
if (mld_key < 0)
{ // Nieuwe melding.
// Startdatum is vandaag: starttijd is huidige tijd.
// Startdatum is niet vandaag: starttijd is begin werkdag.
var startdate_is_today = (startdate.midnight().getTime() == sysdate.midnight().getTime());
startdate = (startdate_is_today? sysdate : startdatebegin);
}
else
{ // Bestaande melding
sql = "SELECT mld_melding_datum"
+ " FROM mld_melding"
+ " WHERE mld_melding_key = " + mld_key;
oRs = Oracle.Execute(sql);
var oldstartdate = new Date(oRs("mld_melding_datum").Value);
// Alleen als datum veranderd is moet de starttijd worden aangepast.
if (startdate.midnight().getTime() != oldstartdate.midnight().getTime())
{ // Startdatum is aangepast.
// Als de startdatum is aangepast in registratiedatum, dan wel weer de registratietijd (registratiedatum) pakken.
// In alle andere gevallen begin van de werkdag pakken.
sql = "SELECT fac.gettrackingdate('MLDNEW', " + mld_key + ") registratiedatum FROM DUAL"
oRs_1 = Oracle.Execute(sql);
var registratiedatum = new Date(oRs_1("registratiedatum").Value);
oRs_1.Close();
var startdatum_is_registratiedatum = (startdate.midnight().getTime() == registratiedatum.midnight().getTime());
startdate = (startdatum_is_registratiedatum? registratiedatum : startdatebegin);
}
else
{ // else startdatum niet aanpassen.
startdate = oldstartdate;
}
oRs.Close();
}
fields.push({ dbs: "mld_melding_datum", typ: "datetime", val: startdate, track: L("lcl_mld_startdate") }); // Begin werkdag
}
else
{ // Situatie 2: Einddatum = COALESCE(huidige waarde, sysdate) + SLA
if (mld_key < 0)
{
fields.push({ dbs: "mld_melding_datum", typ: "sql", val: "SYSDATE" }); // Nieuwe melding, nu/sysdate
startdate = new Date();
}
else
{
fields.push({ dbs: "mld_melding_datum", typ: "datetime", frm: "startdate", track: L("lcl_mld_startdate") }); // Wijziging melding, huidige opgeslagen waarde
}
}
// enddate_std wordt m.b.v. trigger en database functie mld.geteinddatum(startdate, stdm_key, prio, geb_key) berekend.
// mld_melding_acceptdatum_std wordt ook in de trigger bepaald
// De einddatum is de meegegeven einddatum (zoals mogelijk bepaald en aangepast), maar als die niet wordt meegegeven is het
// gewoon enddate_std en dat regelt de trigger wel, dus DAN MOET IK HEM NIET MEEGEVEN
// De tijd van de einddatum wordt nu altijd opgeslagen onafhankelijk of de tijd getoond wordt.
if (Request.Form("enddate").count > 0)
fields.push({ dbs: "mld_melding_einddatum", typ: "datetime", frm: "enddate", track: L("lcl_mld_enddate") });
if (!isNew)
{ // Update an existing mld_melding record
if (stdm_info.kanverwijzen)
{
var ref_key = getFParamInt("ref_key", -1);
if (!stdm_info.is_kto_antwoord && stdm_info.kanverwijzen == 128 && ref_key != old_ref_key)
{
if (!validReferenceKey(mld_key, ref_key))
abort_with_warning(L("lcl_mld_invalid_reference"));
}
function ref_foreign (pval, oldjsvals) // bij oldval krijgen we oldjsvals tot nu toe mee
{
if (!pval)
return "";
var ref_type = oldjsvals?oldjsvals.mld_melding_kto_type:getFParam("ref_type");
return mld.referentielabel(ref_type, pval);
}
fields.push({ dbs: "mld_melding_kto_type", typ: "varchar", frm: "ref_type", track: true /* afzonderlijke tracking, wel oldjsval */ });
fields.push({ dbs: "mld_melding_kto_key", typ: "key", val: ref_key, track: L("lcl_reference"), foreign: ref_foreign });
}
fields.push({ dbs: "mld_melding_kto", typ: "check", frm: "ktoself", track: L("lcl_mld_kto_invite") });
// Hardness controle schrijfrechten
var this_mld = mld.func_enabled_melding(mld_key); // Wat heb ik zoal aan rechten op deze specifieke melding
user.auth_required_or_abort(this_mld.canChange);
// Controleer soms of er geen lopende opdrachten zijn die buiten de (gewijzigde) meldingsperiode vallen
if (S("mld_enforce_orderdates") == 1)
{ // Einddatum: indien niet meegegeven, neem dan sysdate.
var enddate = getFParamDate("enddate", new Date);
sql = "SELECT COUNT (*) aantal FROM mld_opdr"
+ " WHERE mld_statusopdr_key IN (3, 4, 5, 8)"
+ (stdm_info.startdatum == 1
? " AND (TRUNC(mld_opdr_datumbegin) < " + startdate.beginToSQL()
+ " OR TRUNC(mld_opdr_einddatum) >" + enddate.beginToSQL()+")"
: " AND TRUNC(mld_opdr_einddatum) > " + enddate.beginToSQL())
+ " AND mld_melding_key = " + mld_key;
oRs = Oracle.Execute(sql);
if (oRs("aantal") > 0)
abort_with_warning(L("lcl_mld_meldingbuitenopdracht"));
oRs.Close();
}
fields.push({ dbs: "mld_melding_spoed", typ: "key", frm: "prio", track: L("lcl_mld_urg"), foreign: mld.getpriotext });
/* mldUpd heeft na afloop handige oldjsvals */
var mldUpd = buildTrackingUpdate("mld_melding", " mld_melding_key = " + mld_key, fields);
/* SUBMIT THE CHANGED DATA */
var err = Oracle.Execute(mldUpd.sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
/* SET STATUS AND SUBMIT ADDITIONAL TRACKING */
if (sBehandel != -2 && (mldUpd.oldjsvals["mld_melding_behandelaar_key"] || -1) != (sBehandel || -1))
{ // Anders is-ie niet meegegeven of niet veranderd
mld.trackbehandelaar(mld_key, sBehandel);
}
if (S("mld_rejected_is_open") && mldUpd.oldjsvals["mld_melding_status"] == 1) {
// Aanpassen van een afgewezen melding werpt die weer opnieuw de molen in.
mld.setmeldingstatus(mld_key, 2);
}
// tracking plaats is ingewikkelder (twee keys maar slechts <20><>n track gewenst), die doen we handmatig
// alg_onroerendgoed_keys en locatiekey bevatten reeds de nieuwe waardes
if (stdm_info.ins_srtdiscipline_alg && hasFParam("locatiekey")) // dan kan de plaats gewijzigd zijn
{
if (alg_onroerendgoed_keys > 0)
newsql = "SELECT alg_plaatsaanduiding FROM alg_v_plaatsaanduiding_all WHERE alg_onroerendgoed_keys = " + alg_onroerendgoed_keys;
else
newsql = "SELECT alg_locatie_code FROM alg_locatie WHERE alg_locatie_key = " + locatiekey;
var og_key = mldUpd.oldjsvals["mld_alg_onroerendgoed_keys"];
var loc_key = mldUpd.oldjsvals["mld_alg_locatie_key"];
if (og_key>0)
oldsql = "SELECT alg_plaatsaanduiding FROM alg_v_plaatsaanduiding_all WHERE alg_onroerendgoed_keys = " + og_key;
else if (loc_key > 0)
oldsql = "SELECT alg_locatie_code FROM alg_locatie WHERE alg_locatie_key = " + loc_key;
else
oldsql = "SELECT '' FROM DUAL";
var oldtxt = Oracle.Execute(oldsql)(0).Value;
var newtxt = Oracle.Execute(newsql)(0).Value;
if (oldtxt != newtxt)
mldUpd.trackarray.push(L("lcl_plaatsgegevens") + ": " + buildTrackText("varchar", oldtxt, newtxt, { nodiff: true }));
}
// tracking doen we gelijk met de flexkenmerken
mld.keepFlexDocuments(mld_key, mldUpd.oldjsvals["mld_stdmelding_key"], stdm_key);
}
else
{ // A new mld_melding record
// We hebben de melding en dus de discipline. Autorisatie controle kan al redelijk scherp
var this_mld = mld.func_enabled_mld(stdm_info.ins_discipline_key, "D");
user.auth_required_or_abort(this_mld.canFEwrite || this_mld.canFOwrite);
if (deelsrtcont_key)
{
var ref_key = deelsrtcont_key;
var ref_type = "T";
}
else if (stdm_info.is_kto_antwoord || stdm_info.kanverwijzen == 0)
{
var ref_key = getFParamInt("kto_key", null);
var ref_type = getFParam("kto_type", null);
}
else
{
var ref_key = getFParamInt("ref_key", -1); // explicit reference
var ref_type = getFParam("ref_type", null);
}
if (!stdm_info.is_kto_antwoord && stdm_info.kanverwijzen==128 && !validReferenceKey(-1, ref_key) )
abort_with_warning(L("lcl_mld_invalid_reference"));
fields = fields.concat(
[ { dbs: "mld_melding_key", typ: "key", seq: "mld_s_mld_melding_key" },
{ dbs: "mld_meldbron_key", typ: "key", val: meldbron_key },
{ dbs: "mld_melding_start_key", typ: "key", frm: "start_key" },
{ dbs: "mld_melding_module", typ: "varchar", val: "MLD" },
{ dbs: "mld_melding_spoed", typ: "key", val: (prio > 0? prio : 3) }, // default (frontend) 3
{ dbs: "fac_activiteit_key", typ: "key", frm: "fac_activiteit_key" },
{ dbs: "mld_melding_kto_type", typ: "varchar", val: ref_type },
{ dbs: "mld_melding_kto_key", typ: "key", val: ref_key },
{ dbs: "mld_melding_kto", typ: "number", val: (stdm_info.stdmelding_kto & 1)? 1 : 0 }
]);
var mldIns = buildInsert("mld_melding", fields);
var mld_key = mldIns.sequences["mld_melding_key"];
var err = Oracle.Execute(mldIns.sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
if (parent_key > 0)
{
mld.link_child_to_parent(mld_key, parent_key);
}
else
{ // Zetten van de status op ingevoerd en afhandelen van de tracking.
mld.setmeldingstatus(mld_key, (directNaarFO? 0 : 2)); // Zorgt ook voor tracking & daarmee notificatie
}
if (stdm_info.is_kto_antwoord) // die direct afmelden
mld.setmeldingstatus(mld_key, 5);
}
if (getFParamInt("has_r_objs", 0) == 1) // voorkom dat we wissen vanuit mobile-save die helemaal geen listbox heeft
{ // Objecten verwijderen of toevoegen.
var objtrack = mld.saveobjects(mld_key, obj_arr);
// Tracken van de objectwijzigingen.
if (!isNew && objtrack != "")
mldUpd.trackarray.push(objtrack);
}
// Eventuele (gewijzigde) objecten zijn nu ook opgeslagen.
// Nu kan de definitieve mld_melding.mld_melding_einddatum_std en mld_melding.mld_melding_t_uitvoertijd bepaald en gezet worden.
mld.finishmeldingiu(mld_key);
// Sql met de huidige kenmerken rekening houdend met de juiste vakgroep en melding.
// Ander kenmerken worden door de functie saveFlexKenmerken verwijderd (FSN#18613)
currentKenmerkenSQL = "SELECT vk.mld_kenmerk_key"
+ " , mld_kenmerkmelding_waarde"
+ " FROM mld_kenmerkmelding km"
+ " , mld_kenmerk vk"
+ " , mld_melding m"
+ " , mld_stdmelding s"
+ " , mld_discipline d"
+ " WHERE km.mld_kenmerk_key = vk.mld_kenmerk_key"
+ " AND km.mld_kenmerkmelding_verwijder IS NULL"
+ " AND km.mld_melding_key = m.mld_melding_key"
+ " AND m.mld_melding_key = " + mld_key
+ " AND s.mld_stdmelding_key = m.mld_stdmelding_key"
+ " AND s.mld_ins_discipline_key = d.ins_discipline_key"
+ " AND ((vk.mld_stdmelding_key = s.mld_stdmelding_key AND vk.mld_kenmerk_niveau = 'S')"
+ " OR (vk.mld_stdmelding_key = s.mld_ins_discipline_key AND vk.mld_kenmerk_niveau = 'D')"
+ " OR (vk.mld_stdmelding_key = d.ins_srtdiscipline_key AND vk.mld_kenmerk_niveau = 'T'))";
allKenmerkenSQL = "SELECT "+lcl.xsql('t.mld_srtkenmerk_omschrijving', 't.mld_srtkenmerk_key') +" kenmerk_omschrijving"
+ ", m.mld_srtkenmerk_key srtkenmerk_key"
+ ", fac_kenmerkdomein_key"
+ " FROM mld_kenmerk m, "
+ " mld_srtkenmerk t"
+ " WHERE m.mld_srtkenmerk_key = t.mld_srtkenmerk_key"
+ " AND m.mld_kenmerk_key = "; /* wordt in saveFlexkenmerken uitgebreid */
var flextrack = [];
if (isNew || this_mld.canFlexChange) // anders veel te riskant (FSN#38017)
{
var flextrack =
saveFlexKenmerken(mld_key, { kenmerkTable: "mld_kenmerkmelding",
kenmerkParentKey : "mld_melding_key",
kenmerkWaarde: "mld_kenmerkmelding_waarde",
kenmerkKey: "mld_kenmerk_key",
currentKenmerkenSQL: currentKenmerkenSQL,
allKenmerkenSQL: allKenmerkenSQL,
requestQF: Request.Form,
isNew: isNew,
flexPath: "MLD/M",
tracking: true,
module: "MLD"
});
}
var doneParams = { mld_key : mld_key, autoprint: false, warning: "", autoorder: autoorder, success: true };
var sjabl_opdr_key = -1;
if (!isNew)
{
if (mldUpd.trackarray.length || flextrack.length)
{ // NB: de eerste regel wordt ook als notificatie (ipv automatisch fac_srtnotificatie_oms[MLDUPD]) gebruikt,
// Vandaar hier bij uitzondering ook het meldingsnummer en stdmelding_omschrijving vermelden
// Is quickfix voor AANS#20804
var formattedID = stdm_info.ins_srtdiscipline_prefix+mld_key + " ("+ stdm_info.discipline_omschrijving + "/"+ stdm_info.stdmelding_omschrijving +")";
mld.trackmeldingupdate(mld_key, L("lcl_mld_is_mldupdtrack").format(formattedID) + "\n" + mldUpd.trackarray.concat(flextrack).join("\n"));
}
// Voeg extra tracking toe als melding afgerond is.
if (newvalafgerond == 1 && !mldUpd.oldjsvals["mld_melding_afgerond"])
mld.trackmeldingafronden(mld_key, L("lcl_mld_is_mldafrtrack").format(formattedID));
}
else if (parent_key < 0) // isNew, Doe wat speciale dingen voor nieuwe opdrachten (sjabloon of autoorder)
{
mld.nextworkflowstep(mld_key, -1); // -1 = initial (the originating call)
// Als er een activiteit is gevonden met een sjabloon opdracht (sjabl_opdr_key > 0)
// dan moet er een nieuwe opdracht onder water aangemaakt worden met het sjabloon als voorbeeld
sql = "SELECT mo.mld_opdr_key"
+ " FROM mld_disc_params dp, fac_activiteit fa, mld_opdr mo"
+ " WHERE dp.fac_activiteit_key = fa.fac_activiteit_key"
+ " AND fa.fac_activiteit_xmlnode = 'opdracht'"
+ " AND mo.fac_activiteit_key = fa.fac_activiteit_key"
+ " AND dp.mld_ins_discipline_key = " + discipline_key;
oRs = Oracle.Execute(sql);
if (!oRs.Eof)
sjabl_opdr_key = oRs("mld_opdr_key").Value;
oRs.Close();
if (sjabl_opdr_key > 0)
{
// Eerst de melding op gaccepteerd zetten dan opdracht aanmaken
/* FSN#15158/PF 13-2-2009 15:00:24*/
// Zetten van de status op geaccepteerd en afhandelen van de tracking.
mld.setmeldingstatus(mld_key, 4);
var sql = "SELECT mld_s_mld_opdr_key.nextval FROM DUAL";
oRs = Oracle.Execute(sql);
new_opdr = oRs(0).Value;
oRs.Close();
sql = "INSERT INTO mld_opdr ("
+ "mld_opdr_key"
+ ", mld_opdr_module"
+ ", mld_melding_key"
+ ", mld_uitvoerende_keys"
+ ", mld_typeopdr_key"
+ ", mld_statusopdr_key"
+ ", mld_standaardopdr_key"
+ ", mld_opdr_omschrijving"
+ ", mld_opdr_datumbegin"
+ ", mld_opdr_einddatum"
+ ", mld_opdr_werkzaamheden"
+ ", mld_opdr_uren"
+ ", mld_opdr_materiaal"
+ ", mld_opdr_kosten"
+ ", mld_opdr_contactpersoon"
+ ", mld_opdr_geprint"
+ ", mld_opdr_bedrijfopdr_volgnr"
+ ", mld_opdr_uurloon"
+ ", prs_perslid_key"
+ ", prs_contactpersoon_key"
+ ", cnt_contract_key"
+ ", cnt_contract_dienst_key"
+ ", prs_kostenplaats_key"
+ ", mld_opdr_opmerking_fiat"
+ ", mld_opdr_ordernr"
+ ", mld_opdr_teverzenden"
+ ", mld_opdr_opmerking)"
+ " SELECT"
+ " " + new_opdr
+ ", mld_opdr_module"
+ ", " + mld_key
+ ", mld_uitvoerende_keys"
+ ", mld_typeopdr_key"
+ ", mld_statusopdr_key"
+ ", mld_standaardopdr_key"
+ ", mld_opdr_omschrijving"
+ ", mld_opdr_datumbegin"
+ ", mld_opdr_einddatum"
+ ", mld_opdr_werkzaamheden"
+ ", mld_opdr_uren"
+ ", mld_opdr_materiaal"
+ ", mld_opdr_kosten"
+ ", mld_opdr_contactpersoon"
+ ", mld_opdr_geprint"
+ ", mld_opdr_bedrijfopdr_volgnr"
+ ", mld_opdr_uurloon"
+ ", prs_perslid_key"
+ ", prs_contactpersoon_key"
+ ", cnt_contract_key"
+ ", cnt_contract_dienst_key"
+ ", prs_kostenplaats_key"
+ ", mld_opdr_opmerking_fiat"
+ ", mld_opdr_ordernr"
+ ", mld_opdr_teverzenden"
+ ", mld_opdr_opmerking"
+ " FROM mld_opdr o"
+ " WHERE o.mld_opdr_key = " + sjabl_opdr_key;
Oracle.Execute(sql);
// Kopi<70>ren flexkenmerken
// De regels in de tabel mld_kenmerkopdr kopi<70>ren
sql = "INSERT INTO mld_kenmerkopdr ("
+ " mld_opdr_key"
+ ", mld_kenmerk_key"
+ ", mld_kenmerkopdr_waarde)"
+ " SELECT " + new_opdr
+ ", mld_kenmerk_key"
+ ", mld_kenmerkopdr_waarde"
+ " FROM mld_kenmerkopdr"
+ " WHERE mld_opdr_key = " + sjabl_opdr_key;
Oracle.Execute(sql);
// Copy de flex folders: CopyFlexFolders(oldbasepath, newbasepath, flexsql)
// typeopdr and mld_kenmerk_key is for both orders, old (sjabloon) and new, the same
var flexsql = "SELECT k_old.mld_kenmerk_key k_old"
+ ", k_old.mld_kenmerk_key k_new"
+ " FROM mld_srtkenmerk t"
+ ", mld_kenmerk k_old"
+ ", mld_opdr o_old"
+ " WHERE o_old.mld_opdr_key = " + sjabl_opdr_key
+ " AND t.mld_srtkenmerk_kenmerktype IN ('F', 'E', 'M') "
+ " AND k_old.mld_typeopdr_key = o_old.mld_typeopdr_key "
+ " AND k_old.mld_kenmerk_niveau = 'O' "
+ " AND k_old.mld_kenmerk_verwijder IS NULL "
+ " AND k_old.mld_srtkenmerk_key = t.mld_srtkenmerk_key "
+ " AND t.mld_srtkenmerk_verwijder IS NULL";
CopyFlexFolders("MLD/" + subfolderKey("O", sjabl_opdr_key), "MLD/" + subfolderKey("O", new_opdr), flexsql);
}
}
if (!frontend && (S("mld_melding_autoprint") == 2 || (isNew && sjabl_opdr_key < 0 && S("mld_melding_autoprint") == 1)))
{ // S("mld_melding_autoprint"): 2-altijd, 1-aleen als er geen orders zijn.
doneParams.autoprint = true;
}
// Klantspecifieke check functie (hookfunction) voor de invoer
var pResult = new HookResult();
if (!custfunc.mld_postsave(mld_key, pResult))
{
abort_with_warning(pResult.errmsg);
}
}
else
{ // Eerst extra signaleringsvraag stellen daarna pas gegevens opslaan
var doneParams = { doublecheck: true,
urole: urole,
stdm_key: stdm_key,
ruimtekey: ruimtekey,
verdiepingkey: verdiepingkey,
gebouwkey: gebouwkey,
locatiekey: locatiekey,
obj_arr: obj_arr }
}
mld.unlock(mld_key);
Response.Write(JSON.stringify(doneParams));
Response.End;
%>