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

    File:               mld_edit_kenmerk_multi_save.asp
    Description:        Multi-edit wijzigen van overeenkomstige kenmerken van de geselecteerde meldingen:
                        het save-script.
    Parameters:

    Context:
    Note:
*/
%>

<%
var JSON_Result = true;
%>

<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/kenmerk_common.inc" -->
<!-- #include file="../Shared/save2db.inc" -->
<!-- #include file="../mld/mld_flexkenmerk.inc" -->
<!-- #include file="../mld/mld.inc" -->

<%
protectRequest.validateToken();
var mld_key_arr = getFParamIntArray("mld_key");
var nameprefix = getFParamSafe("nameprefix");
var urole = getFParamSafe("urole");
var kenmerk_count = getFParamInt("k_all", 0);

var fronto = urole == "fo";
var backo  = urole == "bo";
var minfo  = urole == "mi";
var frontend = (!fronto && !backo && !minfo);

var autfunction = "";
if (fronto)
  autfunction = "WEB_MLDFOF";
else if (minfo)
  autfunction = "WEB_MLDBAC";
else if (backo)
  autfunction = "WEB_MLDBOF";
else
  autfunction = "WEB_MLDUSE";
var authparams = user.checkAutorisation(autfunction); // Dit is nog ongeacht de melding

var ingesloten = [];
for (i=0; i<mld_key_arr.length; i++)
{
    var this_mld = mld.func_enabled_melding(mld_key_arr[i]);
    if (this_mld.canFlexChange)
    {
        ingesloten.push(mld_key_arr[i]);
    }
}

if (ingesloten.length > 0)
{   // Kenmerken van referentiemelding ophalen.
    var kkey_arr = getMultiRefKenmerken();
    // Bij elke melding de juiste kenmerken ophalen.
    // In _saveFlexKenmerken() zijn de kenmerk keys nodig die bij de betreffende (std)melding horen.
    // De functie flexkenmerken2jsondata() leest echter de referentie kenmerken. Met onderstaande query
    // worden de kenmerken bepaald die horen bij de (std)melding.
    var sql = "SELECT COALESCE(rk.mld_kenmerk_omschrijving, s.mld_srtkenmerk_omschrijving) ref_naam"
            + "     , rk.mld_kenmerk_key ref_kenmerk_key"
            + "     , k.mld_srtkenmerk_key"
            + "     , k.mld_kenmerk_key"
            + "     , k.mld_stdmelding_key"
            + "     , m.mld_melding_key"
            + "     , w.mld_kenmerkmelding_waarde"
            + "     , w.mld_kenmerkmelding_key"
            + "     , w.mld_kenmerkmelding_verwijder"
            + "  FROM mld_kenmerk k"
            + "     , mld_srtkenmerk s"
            + "     , mld_discipline d"
            + "     , mld_stdmelding t"
            + "     , mld_melding m"
            + "     , mld_kenmerkmelding w"
            + "     , mld_kenmerk rk"
            + " WHERE k.mld_srtkenmerk_key = s.mld_srtkenmerk_key"
            + "   AND COALESCE(k.mld_kenmerk_omschrijving, s.mld_srtkenmerk_omschrijving) = COALESCE(rk.mld_kenmerk_omschrijving, s.mld_srtkenmerk_omschrijving)"
            + "   AND k.mld_kenmerk_verwijder IS NULL"
            + "   AND s.mld_srtkenmerk_verwijder IS NULL"
            + "   AND m.mld_stdmelding_key = t.mld_stdmelding_key"
            + "   AND t.mld_ins_discipline_key = d.ins_discipline_key"
            + "   AND (  ( k.mld_stdmelding_key IS NULL                    AND k.mld_kenmerk_niveau = 'A')"
            + "       OR ( k.mld_stdmelding_key = d.ins_srtdiscipline_key  AND k.mld_kenmerk_niveau = 'T')"
            + "       OR ( k.mld_stdmelding_key = t.mld_ins_discipline_key AND k.mld_kenmerk_niveau = 'D')"
            + "       OR ( k.mld_stdmelding_key = t.mld_stdmelding_key     AND k.mld_kenmerk_niveau = 'S')"
            + "       )"
            + "   AND k.mld_kenmerk_key = w.mld_kenmerk_key(+)"
            + "   AND m.mld_melding_key = w.mld_melding_key(+)"
            + "   AND w.mld_kenmerkmelding_verwijder IS NULL"
            + "   AND k.mld_srtkenmerk_key = rk.mld_srtkenmerk_key"
            + "   AND rk.mld_kenmerk_key IN (" + kkey_arr.join(",") + ")"
            + "   AND m.mld_melding_key IN (" + ingesloten.join(",") + ")"
            + " ORDER BY m.mld_melding_key";
    var oRs = Oracle.Execute(sql);
    var data_arr = [];
    var old_key = -1;
    while (!oRs.eof)
    {
        var mld_key = oRs("mld_melding_key").Value;
        if (old_key != mld_key)
        {
            old_key = mld_key;
            var flx = { mld_key: mld_key
                      , ref_key: {}
                      };
            data_arr.push(flx);
        }
        flx.ref_key[oRs("ref_kenmerk_key").Value] = {kenmerk_key: oRs("mld_kenmerk_key").Value};
        oRs.MoveNext();
    }
    oRs.Close();

    // Per melding de kenmerken aanpassen.
    for (var i=0; i<data_arr.length; i++)
    {
            var knm_arr = [];
            for (var ref in data_arr[i].ref_key)
            {
                knm_arr.push(data_arr[i].ref_key[ref].kenmerk_key);
            }

        var currentKenmerkenSQL = "SELECT k.mld_kenmerk_key"
                                + "     , ok.mld_kenmerkmelding_waarde"
                                + "     , k.mld_kenmerk_toonbaar"
                                + "     , k.fac_functie_key"
                                + "  FROM mld_kenmerkmelding ok"
                                + "     , mld_kenmerk k"
                                + " WHERE ok.mld_kenmerk_key = k.mld_kenmerk_key"
                                + "   AND ok.mld_kenmerkmelding_verwijder IS NULL"
                                + "   AND k.mld_kenmerk_key IN (" + knm_arr.join(",") + ")"
                                + "   AND ok.mld_melding_key = " + data_arr[i].mld_key;

        var allKenmerkenSQL     = "SELECT COALESCE (" + lcl.xsql("k.mld_kenmerk_omschrijving", "k.mld_kenmerk_key")
                                + "              ,  " + lcl.xsql("t.mld_srtkenmerk_omschrijving", "t.mld_srtkenmerk_key") + ") kenmerk_omschrijving"
                                + "     , t.mld_srtkenmerk_kenmerktype kenmerk_kenmerktype"
                                + "     , t.mld_srtkenmerk_systeem     kenmerk_systeem"
                                + "     , k.mld_kenmerk_toonbaar       kenmerk_readonly"
                                + "     , k.mld_kenmerk_uniek          kenmerk_uniek"
                                + "     , fac_kenmerkdomein_key"
                                + "  FROM mld_kenmerk k"
                                + "     , mld_srtkenmerk t"
                                + " WHERE k.mld_srtkenmerk_key = t.mld_srtkenmerk_key"
                                + "   AND k.mld_kenmerk_key = "; /* wordt in saveFlexkenmerken uitgebreid */

        var kenmerkParams = { kenmerkTable: "mld_kenmerkmelding"
                            , kenmerkParentKey : "mld_melding_key"
                            , kenmerkWaarde: "mld_kenmerkmelding_waarde"
                            , kenmerkKey: "mld_kenmerk_key"
                            , kenmerkToonbaar: "mld_kenmerk_toonbaar"
                            , currentKenmerkenSQL: currentKenmerkenSQL
                            , allKenmerkenSQL: allKenmerkenSQL
                            , requestQF: Request.Form
                            , module: "MLD"
                            , flexPath: "MLD/M"
                            , tracking: true
                            , multiEdit: true
                            , noFlexCleanup: true
                            , multikenmerk: data_arr[i].ref_key
                            , isNew: false
                            };
        if (hasFParam("nameprefix"))
        {
            kenmerkParams.nameprefix = getFParamSafe("nameprefix", "");
            kenmerkParams.extraserie = true;
        }
        var all_flexdata = flexkenmerken2jsondata(kenmerkParams);
        var changed_flexdata = [];
        for (km_data in all_flexdata)
        {
            if (inArray(km_data, kkey_arr))
                changed_flexdata.push(all_flexdata[km_data]);
        }
        kenmerkParams.flexdata = changed_flexdata;

        var flextrack = saveFlexKenmerken( data_arr[i].mld_key, kenmerkParams );
        shared.trackaction("MLDUPD", data_arr[i].mld_key, flextrack.join("\n"));
    }
}

var result = {success: true, message: "", key: ingesloten.join(",")};
Response.Write(JSON.stringify(result));
%>
<% ASPPAGE_END(); %>
