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

     File:               mld_edit_bord_save.asp
     Description:        Past de melding aan
     Parameters:
         mld_key         De melding
         type            -2: Primaire behandelaar
                         -3: Behandelteam
                         -4: Actieve behandelaar
                         >0: Kenmerk
         new_key         update naar deze key
     Context:
     Note:
*/ %>

<%
var JSON_Result = true;
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/save2db.inc" -->
<!-- #include file="mld.inc" -->
<!-- #include file="../Shared/Suggest/persoonFilter.inc" -->
<%
protectRequest.validateToken();

var mld_key_arr = getFParamKeyArray("mld_key");
var type = getFParamInt("type");
if (type > 0) {
    var kenmerk_omschrijving = getFParam("type_descr", "");
}
var from_key = getFParamInt("from_key", -1);
var to_key = getFParamInt("to_key", -1);
var result = {
    success: true
};

// Geeft wat relevante informatie terug
function mld_bord_info(mld_key) {
    var sql = "SELECT m.prs_perslid_key"
            + "     , COALESCE(m.mld_alg_locatie_key, -1) alg_locatie_key"
            + "     , m.mld_melding_behandelaar_key"
            + "     , m.mld_melding_behandelaar2_key"
            + "     , m.mld_melding_status"
            + "     , m.mld_ins_discipline_key"
            + "     , s.mld_ins_discipline_key stdm_ins_discipline_key"
            + "     , dp.mld_disc_params_srtgroep"
            + "     , dp.mld_disc_params_primairbeh"
            + "  FROM mld_melding         m"
            + "     , mld_stdmelding      s"
            + "     , ins_tab_discipline  d"
            + "     , mld_disc_params     dp"
            + " WHERE     m.mld_melding_key = " + mld_key
            + "       AND m.mld_stdmelding_key = s.mld_stdmelding_key"
            + "       AND s.mld_ins_discipline_key = d.ins_discipline_key"
            + "       AND d.ins_discipline_key = dp.mld_ins_discipline_key";
    var oRs = Oracle.Execute(sql);
    var result = {
        prs_key: oRs("prs_perslid_key").Value,
        loc_key: oRs("alg_locatie_key").Value,
        behandel_key: oRs("mld_melding_behandelaar_key").Value,
        behandel2_key: oRs("mld_melding_behandelaar2_key").Value || -1,
        mld_status: oRs("mld_melding_status").Value,
        disc_key: oRs("stdm_ins_discipline_key").Value,
        mld_ins_discipline_key: oRs("mld_ins_discipline_key").Value,
        srtgroep: oRs("mld_disc_params_srtgroep").Value,
        primaire_behandelaar: oRs("mld_disc_params_primairbeh").Value
    };
    oRs.Close();
    return result;
}

for (var i = 0; i < mld_key_arr.length; i++) {

    var this_mld = mld.func_enabled_melding(mld_key_arr[i]); // Wat heb ik zoal aan rechten op deze specifieke melding
    user.auth_required_or_abort(this_mld.canChange);

    if (from_key != to_key) { // Zou niet voor moeten komen
        if (type > 0) { // Kenmerk
            var srtkenmerk_key = type;

            var sql_k = "SELECT k.mld_kenmerk_key"
                      + "     , k.mld_kenmerk_verplicht"
                      + "     , sk.fac_kenmerkdomein_key"
                      + "  FROM mld_melding  m"
                      + "       JOIN mld_stdmelding sm ON m.mld_stdmelding_key = sm.mld_stdmelding_key"
                      + "       JOIN ins_tab_discipline d"
                      + "           ON sm.mld_ins_discipline_key = d.ins_discipline_key"
                      + "       JOIN mld_kenmerk k"
                      + "           ON (   k.mld_kenmerk_niveau = 'A'"
                      + "               OR (    k.mld_kenmerk_niveau = 'S'"
                      + "                   AND k.mld_stdmelding_key = sm.mld_stdmelding_key)"
                      + "               OR (    k.mld_kenmerk_niveau = 'D'"
                      + "                   AND k.mld_stdmelding_key = sm.mld_ins_discipline_key)"
                      + "               OR (    k.mld_kenmerk_niveau = 'T'"
                      + "                   AND k.mld_stdmelding_key = d.ins_srtdiscipline_key))"
                      + "       JOIN mld_srtkenmerk sk ON k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key"
                      + " WHERE     m.mld_melding_key = " + mld_key_arr[i]
                      + "       AND k.mld_srtkenmerk_key = " + srtkenmerk_key
                      + "       AND COALESCE(k.mld_kenmerk_omschrijving, sk.mld_srtkenmerk_omschrijving) = " + safe.quoted_sql(kenmerk_omschrijving)
                      + "       AND k.mld_kenmerk_verwijder IS NULL";
            var oRs_k = Oracle.Execute(sql_k);
            var kenmerk_key = oRs_k("mld_kenmerk_key").Value;
            var verplicht = oRs_k("mld_kenmerk_verplicht").Value == 1;
            var domein_key = oRs_k("fac_kenmerkdomein_key").Value;
            oRs_k.Close();

            // Check of de toegewezen waarde niet vervallen is
            if (to_key > -1) {
                var sql = "SELECT fac_kenmerkdomein_objectnaam"
                        + "     , fac_kenmerkdomein_kolomnaam"
                        + "     , fac_kenmerkdomein_kolomtxt"
                        + "     , fac_kenmerkdomein_xmlnode"
                        + "     , fac_kenmerkdomein_verval"
                        + "     , fac_usrtab_key"
                        + "  FROM fac_kenmerkdomein"
                        + " WHERE fac_kenmerkdomein_key = " + domein_key;
                var oRs = Oracle.Execute(sql);
                var objectnaam = oRs("fac_kenmerkdomein_objectnaam").Value;
                var usrtab_key = oRs("fac_usrtab_key").Value;
                var vervalkolom = oRs("fac_kenmerkdomein_verval").Value;
                oRs.Close();

                var vervallen;
                if (objectnaam === "FAC_USRDATA") {
                    sql = "SELECT 'dummy'"
                        + "  FROM fac_usrdata"
                        + " WHERE fac_usrtab_key = " + usrtab_key
                        + "   AND fac_usrdata_key = " + to_key
                        + "   AND (fac_usrdata_vervaldatum IS NULL OR fac_usrdata_vervaldatum > SYSDATE)"
                        + "   AND fac_usrdata_verwijder IS NULL";
                    oRs = Oracle.Execute(sql);
                    vervallen = oRs.EOF;
                    oRs.Close();
                } else if (vervalkolom !== null) { // Anders hoeven we niet te checken op een vervaldatum ..
                    sql = "SELECT 'dummy'"
                        + "  FROM " + objectnaam
                        + " WHERE " + oRs("fac_kenmerkdomein_kolomnaam").Value + " = " + to_key
                        + "   AND (" + vervalkolom + " IS NULL OR " + vervalkolom + " > SYSDATE)";
                    oRs = Oracle.Execute(sql);
                    vervallen = oRs.EOF;
                    oRs.Close();
                }
                if (vervallen) {
                    abort_with_warning(L("lcl_mld_error_kenmerk_value_invalid"));
                }
            }

            if (from_key === -1) { // Dan was deze leeg, dus: INSERT
                var sql = "INSERT INTO mld_kenmerkmelding (mld_melding_key, mld_kenmerk_key, mld_kenmerkmelding_waarde)"
                        + " VALUES (" + mld_key_arr[i] + ", " + kenmerk_key + ", " + to_key + ")";
            } else if (to_key === -1) { // Dan wordt deze leeg, dus: DELETE
                if (verplicht) {
                    abort_with_warning(L("lcl_mld_error_kenmerk_required"));
                }
                var sql = "DELETE FROM mld_kenmerkmelding"
                        + " WHERE mld_melding_key = " + mld_key_arr[i]
                        + "   AND mld_kenmerk_key = " + kenmerk_key
                        + "   AND mld_kenmerkmelding_waarde = " + from_key;
            } else { // Anders is het een UPDATE
                var sql = "UPDATE mld_kenmerkmelding"
                        + "   SET mld_kenmerkmelding_waarde = " + to_key
                        + " WHERE mld_melding_key = " + mld_key_arr[i]
                        + "   AND mld_kenmerk_key = " + kenmerk_key;
            }
            Oracle.Execute(sql);

            var vold = "";
            var vnew = "";
            // Onderstaande uit kenmerk_common;
            var sql_track = "SELECT COALESCE (" + lcl.xsql("k.mld_kenmerk_omschrijving", "k.mld_kenmerk_key")
                        + "                ,  " + lcl.xsql("sk.mld_srtkenmerk_omschrijving", "sk.mld_srtkenmerk_key") + ") kenmerk_omschrijving"
                        + "     , sk.fac_kenmerkdomein_key"
                        + "     , mld_srtkenmerk_systeem"
                        + "           kenmerk_systeem"
                        + "  FROM mld_kenmerk k, mld_srtkenmerk sk"
                        + " WHERE k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key"
                        + "   AND k.mld_kenmerk_key = " + kenmerk_key;
            var oRsk = Oracle.Execute(sql_track);
            var label        = oRsk("kenmerk_omschrijving").Value;
            var kdomein_key  = oRsk("fac_kenmerkdomein_key").Value;
            var confidential = oRsk("kenmerk_systeem").Value & 4;
            oRsk.Close();
            if (confidential) {
                vold = vnew = L("lcl_confidential_mask");
            } else {
                if (from_key > 0) {
                    var oRsd = Oracle.Execute("SELECT fac.getdomeinwaarde(" + kdomein_key + ", " + from_key + ") domeinwaarde FROM DUAL");
                    vold = oRsd("domeinwaarde").Value;
                    oRsd.Close();
                }
                if (to_key > 0) {
                    var oRsd = Oracle.Execute("SELECT fac.getdomeinwaarde(" + kdomein_key + ", " + to_key + ") domeinwaarde FROM DUAL");
                    vnew = oRsd("domeinwaarde").Value;
                    oRsd.Close();
                }
            }
            var trackingStr = label + ": " + buildTrackText("varchar", vold, vnew, { nodiff: true });
            shared.trackaction("MLDUPD", mld_key_arr[i], trackingStr);
        } else {
            if (type === -2) { // Primaire Behandelaar

                // Kijk of ik van deze melding de afhandeling (en dus de primaire behandelaar) wel mag aanpassen;
                if (!this_mld.canAfhandChange) {
                    abort_with_warning(L("lcl_no_auth"));
                }

                // Kijk of ik deze behandelaar wel mag kiezen bij deze melding;
                var mld_bord_info = mld_bord_info(mld_key_arr[i]);
                if (to_key > 0) { // Vullen / aanpassen
                    if (mld_bord_info.primaire_behandelaar == 0) { // Dit zou niet moeten voorkomen
                        abort_with_warning(L("lcl_no_auth"));
                    }
                    var filtClause = getFiltClausePersoon(mld_bord_info.mld_status == 0 ? "BEHF" : "BEHB", mld_bord_info);
                    var sql_prs = "SELECT 'dummy'"
                                + "  FROM prs_perslid p"
                                + "     , prs_v_afdeling_boom d"
                                + " WHERE p.prs_afdeling_key = d.prs_afdeling_key"
                                + filtClause
                                + "   AND p.prs_perslid_key = " + to_key;
                    var oRs_prs = Oracle.Execute(sql_prs);
                    var valid = !oRs_prs.EOF;
                    oRs_prs.Close();
                    if (!valid) {
                        abort_with_warning(L("lcl_forward_error_processor"));
                    }
                } else { // Leegmaken
                    if (mld_bord_info.primaire_behandelaar == 2) { // Hij is verplicht, dus leegmaken mag niet
                        abort_with_warning(L("lcl_mld_error_backoffice_required"));
                    }
                }

                // Alle checks doorstaan, updaten maar
                var sql = "UPDATE mld_melding"
                        + "   SET mld_melding_behandelaar_key = " + (to_key === -1 ? "NULL" : to_key)
                        + " WHERE mld_melding_key = " + mld_key_arr[i];
                Oracle.Execute(sql);

                // Tracking + notificatie
                mld.trackbehandelaar(mld_key_arr[i], to_key, to_key === user_key);

            } else if (type === -3) { // Behandelteam

                // Controleer de soort vakgroep
                var mld_bord_info = mld_bord_info(mld_key_arr[i]);
                if (to_key > 0 && !(mld_bord_info.srtgroep & 5)) {
                    abort_with_warning(L("lcl_forward_error_team")); // 'Dit behandelteam behandelt dit soort meldingen niet'
                }

                // Controleer de vakgroep<>behandelteams restricties
                var valid = false;
                sql_vak = "SELECT mld_discipline_key2"
                        + "  FROM mld_discipline_discipline"
                        + " WHERE mld_discipline_key1 = " + mld_bord_info.disc_key;
                oRs_vak = Oracle.Execute(sql_vak);
                if (!oRs_vak.EOF) { // Er geldt een beperking; ga kijken of het nieuwe team wordt toegestaan
                    while (!oRs_vak.EOF && !valid) {
                        valid = to_key == oRs_vak("mld_discipline_key2").Value;
                        oRs_vak.MoveNext();
                    }
                    oRs_vak.Close();
                    if (!valid) {
                        abort_with_warning(L("lcl_forward_error_team")); // 'Dit behandelteam behandelt dit soort meldingen niet'
                    }
                } else { /* Geen beperking, geen probleem */ }

                var new_behandel2_key = mld_bord_info.behandel2_key;
                if (to_key === -1) {
                    new_behandel2_key = -1;
                } else if (to_key > 0 && mld_bord_info.behandel2_key > 0) {
                    // Check dan of de oude actieve behandelaar nog compatible is met het nieuwe team (en maak deze anders leeg)
                    var prsFiltParams = {
                        disc_key: to_key, // Dit moet hier het nieuwe behandelteam zijn
                        prs_key: mld_bord_info.prs_key,
                        loc_key: mld_bord_info.loc_key
                    }
                    var filtClause = getFiltClausePersoon(mld_bord_info.mld_status == 0 ? "BH2F" : "BH2B", prsFiltParams);
                    var sql_prs = "SELECT 'dummy'"
                                + "  FROM prs_perslid p"
                                + "     , prs_v_afdeling_boom d"
                                + " WHERE p.prs_afdeling_key = d.prs_afdeling_key"
                                + filtClause
                                + "   AND p.prs_perslid_key = " + mld_bord_info.behandel2_key;
                    var oRs_prs = Oracle.Execute(sql_prs);
                    var valid = !oRs_prs.EOF;
                    oRs_prs.Close();
                    if (!valid) {
                        new_behandel2_key = -1;
                    }
                }

                // Alle checks doorstaan, updaten maar
                var sql = "UPDATE mld_melding"
                        + "   SET mld_ins_discipline_key = " + (to_key === -1 ? "NULL" : to_key)
                        + (new_behandel2_key === -1
                            ? " , mld_melding_behandelaar2_key = NULL" // Actieve behandelaar ook leegmaken dan
                            : "")
                        + " WHERE mld_melding_key = " + mld_key_arr[i];
                Oracle.Execute(sql);

                // Tracking + notificatie
                mld.trackAndNotifyBehandelteam(mld_key_arr[i], to_key);
                if (mld_bord_info.behandel2_key !== new_behandel2_key) { // old != new
                    mld.trackbehandelaar2(mld_key_arr[i], new_behandel2_key);
                }

            } else if (type === -4) { // Actieve behandelaar

                // Kijk of ik deze actieve behandelaar wel mag kiezen bij deze melding;
                if (to_key > 0) { // Leegmaken mag altijd
                    var mld_bord_info = mld_bord_info(mld_key_arr[i]);
                    var prsFiltParams = {
                        disc_key: mld_bord_info.mld_ins_discipline_key, // Dit moet hier de behandelteam_key zijn
                        prs_key: mld_bord_info.prs_key,
                        loc_key: mld_bord_info.loc_key
                    }
                    var filtClause = getFiltClausePersoon(mld_bord_info.mld_status == 0 ? "BH2F" : "BH2B", prsFiltParams);
                    var sql_prs = "SELECT 'dummy'"
                                + "  FROM prs_perslid p"
                                + "     , prs_v_afdeling_boom d"
                                + " WHERE p.prs_afdeling_key = d.prs_afdeling_key"
                                + filtClause
                                + "   AND p.prs_perslid_key = " + to_key;
                    var oRs_prs = Oracle.Execute(sql_prs);
                    var valid = !oRs_prs.EOF;
                    oRs_prs.Close();
                    if (!valid) {
                        abort_with_warning(L("lcl_forward_error_processor")); // 'Deze persoon mag deze melding niet behandelen'
                    }
                }

                // Alle checks doorstaan, updaten maar
                var sql = "UPDATE mld_melding"
                        + "   SET mld_melding_behandelaar2_key = " + (to_key === -1 ? "NULL" : to_key)
                        + " WHERE mld_melding_key = " + mld_key_arr[i];
                Oracle.Execute(sql);

                // Tracking + notificatie
                mld.trackbehandelaar2(mld_key_arr[i], to_key, to_key === user_key);
            }
        }
    }
}

if (result.success) {
    result.toaster = L("lcl_mld_is_mldupd");
}

Response.Write(JSON.stringify(result));
%>
<% ASPPAGE_END(); %>
