<% /*
    $Revision$
    $Id$

    File:           model_fac_gebruikersgroep.inc

    Description:    Model voor fac_gebruikersgroep
                    Welke gebruiker zit in welke groep?

    Context:

    Notes:
*/
%>
<!-- #include file="../prs/prs.inc" -->
<%

function model_fac_gebruikersgroep(params)
{
    params = params || {};
    this.records_name = "usergroup";
    this.record_name = "usergroups";
    this.table = "fac_gebruikersgroep";
    this.primary = "fac_gebruikersgroep_key";
    this.autfunction = "WEB_PRSMSU";
    this.record_title = L("fac_gebruikersgroep");
    this.records_title = L("fac_gebruikersgroep_m");
    this.defaultIcon = "fa-user-shield";

    this.fields = {
        "id": {
            "dbs": "fac_gebruikersgroep_key",
            "label": L("lcl_key"),
            "typ": "key",
            "hidden_fld": true,
            "required": true,
            "seq": "fac_s_fac_gebruikersgroep_key"
        },
        "_fromperson": {
            "dbs": "",
            "label": L("fac_gebruikersgroep_from"),
            "typ": "key",
            "foreign": "prs_perslid"
        },
        "authorizationgroup": {
            "dbs": "fac_groep_key",
            "label": L("fac_groep"),
            "typ": "key",
            "required": true,
            "foreign": {
                "tbl": "fac_groep",
                "key": "fac_groep_key",
                "desc": "fac_groep_omschrijving"
            },
            "uniquewith": "person"
        },
        "person": {
            "dbs": "prs_perslid_key",
            "label": L("prs_perslid"),
            "typ": "key",
            "required": true,
            "foreign": "prs_perslid",
            "uniquewith": "authorizationgroup"
        },
        "expires": {
            "dbs": "fac_gebruikersgroep_vervaldatum",
            "label": L("fac_gebruikersgroep_vervaldatum"),
            "typ": "date"
        }
    };

    this.list = {
        "columns": [
            //"id",
            "authorizationgroup",
            "person",
            "expires"
        ]
    };
    this.edit = {
        modal: true,
        requires: {
            js: ["../mgt/fac_gebruikersgroep.js"]
        }
    };


    // Lidmaatschap van groepen met PRSSYS, FACTAB en FACFAC mag je alleen
    // manipuleren als je zelf die rechten hebt
    this._checkprotected = function(groep_key)
    {
        var exclude = [];
        if (!user.has("WEB_PRSSYS"))
            exclude.push("WEB_PRSSYS");
        if (!user.has("WEB_FACTAB"))
            exclude.push("WEB_FACTAB");
        if (!user.has("WEB_FACFAC"))
            exclude.push("WEB_FACFAC");
        if (exclude.length)
        {
            if (groep_key && typeof groep_key == "object" && "id" in groep_key)
            {   // dereference
                groep_key = groep_key.id;
            }
            var sql = "SELECT fac_groep_key"
                    + "  FROM fac_groeprechten fgr,"
                    + "       fac_functie ff"
                    + " WHERE fgr.fac_functie_key = ff.fac_functie_key"
                    + "   AND fac_groep_key = " + groep_key
                    + "   AND ff.fac_functie_code in (" + safe.quoted_sql_join(exclude) + ")";
            var oRs = Oracle.Execute(sql);
            user.auth_required_or_abort(oRs.Eof);
            oRs.Close()
        }
    }

    this.hook_pre_post = function(params, obj)
    {
        if (obj._fromperson > -1)
        {   // Er zijn geen autorisatiegroepen bekend waardoor de standaard REST_POST niet wordt uitgevoerd.
            //
            var prs_arr = getQParamIntArray("prsarr", []);
            prs_arr.push(obj.person); // Voeg de eerste persoon ook toe aan de lijst.
            var data = { authorizationgroups: obj.authorizationgroup || []
                       , persons: prs_arr
                       }
            // Haal de autorisatiegroepen van de geselecteerde gebruiker (_fromperson) op
            // om deze te kunnen kopieren naar andere gebruiker(s).
            var sql = "SELECT fac_groep_key"
                    + "     , fac_gebruikersgroep_vervaldatum"
                    + "  FROM fac_gebruikersgroep"
                    + " WHERE prs_perslid_key = " + obj._fromperson;
            var oRs = Oracle.Execute(sql);
            while (!oRs.eof)
            {
                var vervaldatum = (oRs("fac_gebruikersgroep_vervaldatum").Value != null ? (new Date(oRs("fac_gebruikersgroep_vervaldatum").Value)) : null);
                data.authorizationgroups.push( { groep: oRs("fac_groep_key").Value
                                               , vervalt: (obj.expires ? obj.expires : vervaldatum)
                                               }
                                             );
                oRs.MoveNext();
            }
            oRs.Close();
            if (data.authorizationgroups.length == 0)
            {
                abort_with_warning(L("fac_gebruikersgroep_msg1"));
            }

            // Alle combinaties van autorisatie en persoon proberen toe te voegen
            var aantal = 0;
            for (var a=0; a<data.authorizationgroups.length; a++)
            {
                for (var p=0; p<data.persons.length; p++)
                {
                    if (!check_authorization_person(data.authorizationgroups[a].groep, data.persons[p]))
                    {
                        var copydata = { id: -1
                                       , person: data.persons[p]
                                       , authorizationgroup: data.authorizationgroups[a].groep
                                       , expires: data.authorizationgroups[a].vervalt
                                       };
                        this._checkprotected(copydata.authorizationgroup);
                        generic_REST_POST(this)(params, copydata);
                        aantal++
                    }
                }
            }
            //__Log("aantal toegevoegd: "+aantal);
        }
    }

    this.hook_pre_edit = function(obj, fld)
    {
        var prs_arr = getQParamIntArray("prsarr", []);
        if (prs_arr.length > 0)
        {   // multiedit mode
            // Sluit de groepen die alle gebruikers overeenkomstig hebben uit van de lijst.
            // Als er maar 1 gebruiker geselecteerd is dan wordt de standaard where-clause gebruikt
            // die wordt gegenereerd obv "field.uniquewith" in scaffolding_edit.inc.
            prs_arr.push(obj.person.id);
            fld.authorizationgroup.foreign.where = "fac_groep_key NOT IN"
                                                 + "(SELECT fac_groep_key"
                                                 + "   FROM (SELECT fac_groep_key, COUNT(prs_perslid_key)"
                                                         + "   FROM fac_gebruikersgroep"
                                                         + "  WHERE prs_perslid_key IN (" + prs_arr.join(",") + ")"
                                                         + "  GROUP BY fac_groep_key"
                                                         + " HAVING COUNT(prs_perslid_key) = " + prs_arr.length
                                                 + "        )"
                                                 + ")";
        }

        if (obj.id > 0) { // Bestaand record
            fld.authorizationgroup.readonly = true;
            fld.person.readonly = true;
            delete this.fields._fromperson;
        }
    }

    function check_authorization_person(authorization, person)
    {   // Bestaat de combinatie autorisatie/persoon al.
        if (authorization && typeof authorization == "object" && "id" in authorization)
        {   // dereference
            authorization = authorization.id;
        }
        if (person && typeof person == "object" && "id" in person)
        {   // dereference
            person = person.id;
        }
        var sql = "SELECT COUNT(*) aantal"
                + "  FROM fac_gebruikersgroep"
                + " WHERE fac_groep_key = " + authorization
                + "   AND prs_perslid_key = " + person;
        var oRs = Oracle.Execute(sql);
        var present = oRs("aantal").Value > 0;
        oRs.Close();
        return present;
    }

    this.REST_GET    = generic_REST_GET(this);

    // Vanuit het scherm "Persoonsgegevens" mogen autorisaties alleen getoond worden als de gebruiker PRSMSU leesrechten heeft.
    // In model_prs_perslid wordt de perslid_key van de te bekijken persoon doorgegeven aan dit model zodat hier de POST en DELETE
    // uitgeschakeld kunnen worden.
    var auth_rw = true;
    if (params.prs_key > 0)
    {
        var prsauthparams = prs.checkAutorisation(prs_key);
        var xfunc = user.func_enabled("PRS", null, null, prs_key);
        auth_rw = (prsauthparams.writesys || xfunc.canWrite("WEB_PRSMSU"));
    }
    if (auth_rw)
    {
        this.REST_POST   = function (params, jsondata)
            {
                // Voor elke multiselect gekozen authorizationgroup wordt deze REST_POST aangeroepen.
                //
                var prs_arr = getQParamIntArray("prsarr", []);
                prs_arr.push(jsondata.person); // Voeg de eerste persoon ook toe aan de lijst.
                var result = { key: [], warning: ""};
                for (var p=0; p<prs_arr.length; p++)
                {
                    jsondata.person = prs_arr[p];
                    if (!check_authorization_person(jsondata.authorizationgroup, jsondata.person))
                    {
                        this._checkprotected(jsondata.authorizationgroup);
                        var gen_result = generic_REST_POST(this)(params, jsondata);
                        result.key.push(gen_result.key);
                    }
                }
                return result;
            }
        this.REST_PUT    = generic_REST_PUT(this); // update alleen voor vervaldatum, persoon en gebruikersgroep niet!
        this.REST_DELETE = function (params, the_key)
            {
                var sql = "SELECT fac_groep_key"
                        + "  FROM fac_gebruikersgroep"
                        + " WHERE fac_gebruikersgroep_key = " + the_key;
                var oRs = Oracle.Execute(sql);
                if (!oRs.Eof)
                    this._checkprotected(oRs("fac_groep_key").Value);
                oRs.Close();
                return generic_REST_DELETE(this)(params, the_key);
            }
    }
}
%>