<% /*
    $Revision$
    $Id$

    File:           model_fac_groeprechten.inc

    Description:    Vanuit CodeCharge gegenereerd model voor fac_groeprechten

    Context:

    Notes:          fac-groeprechten heeft drie 1-op-n relaties: fac_groep,
                    fac_functie en ins_discipline
                    We *eisen* dat je altijd minstens 1 van de drie bij een
                    instantiatie van het model moet meegeven

*/

/* params kan bevatten een groep_key, een disc_key en een functie_key
   We ondersteunen de volgende combinatiees:
      groep_key  functie_key disc_key
          -           -          -          Niet ondersteund, te complex
          -           -          X          Ja
          -           X          -          Ja
          -           X          X          Ja
          X           -          -          Ja
          X           -          X          Niet ondersteund. Als je een groep of disc hebt moet je eerst functie kiezen
          X           X          -          Ja
          X           X          X          Niet ondersteund (dan krijg je een detail popupje)
*/
function model_fac_groeprechten (params)
{
    if (params && (params.groep_key > 0 || params.disc_key > 0 || params.functie_key > 0))
        { /* Oke */ }
    else
        INTERNAL_ERROR_GROEPRECHTEN; // minstens 1 van de drie moet er zijn

    this.table = "fac_groeprechten";
    this.primary = "fac_groeprechten_key";
    this.records_name = "fac_groeprecht";
    this.record_name = "fac_groeprechten";

    this.autfunction = "WEB_FACMSU";
    this.record_title = L("fac_groeprechten");
    this.records_title = L("fac_groeprechten_m");

    this.fields = {
      "id": {
        "dbs": "fac_groeprechten_key",
        "label": "Key",
        "typ": "key",
        "hidden_fld": true,
        "required": true,
        "filter": "exact",
        "seq": "fac_s_fac_groeprechten_key"
      },
      "fac_groep": {
        "dbs": "fac_groep_key",
        "label": L("fac_groep"),
        "typ": "key",
        "hidden_fld": true,
        "foreign": {
          "tbl": "fac_groep",
          "key": "fac_groep_KEY",
          "desc": "fac_groep_omschrijving"
        }
      },
      "fac_functie": {
        "dbs": "fac_functie_key",
        "label": L("fac_functie_key"),
        "typ": "key",
        "hidden_fld": true,
        "foreign": "fac_functie"
      },
      "ins_discipline": {
        "dbs": "ins_discipline_key",
        "label": L("mgt_discipline"),
        "typ": "key",
        "hidden_fld": true,
        "foreign": {
          "tbl": "ins_tab_discipline",
          "key": "ins_discipline_key",
          "desc": "ins_discipline_omschrijving",
          "where": "ins_discipline_verwijder IS NULL"
        }
      },
      "prs_level_read": {
        "dbs": "fac_gebruiker_prs_level_read",
        "label": L("fac_gebruiker_prs_level_read"),
        "typ": "number",
        "foreign": foreignPRSRechten
      },
      "prs_level_write": {
        "dbs": "fac_gebruiker_prs_level_write",
        "label": L("fac_gebruiker_prs_level_write"),
        "typ": "number",
        "foreign": foreignPRSRechten
      },
      "alg_level_read": {
        "dbs": "fac_gebruiker_alg_level_read",
        "label": L("fac_gebruiker_alg_level_read"),
        "typ": "number",
        "foreign": foreignALGRechten
      },
      "alg_level_write": {
        "dbs": "fac_gebruiker_alg_level_write",
        "label": L("fac_gebruiker_alg_level_write"),
        "typ": "number",
        "foreign": foreignALGRechten
      }
    };

    function fnFunctieDisc(oRs, field, model, sqlfieldname)
    {
        if (!model.hasdisc)
            return "n/a"; // is nooit zichtbaar
        var nn_disc = oRs(sqlfieldname).Value;
        return model.module + " " + nn_disc + "/" + model.total_disc;
    };

    function fnGroep(oRs, field, model, sqlfieldname)
    {
        var nn_grp = oRs(sqlfieldname).Value;
        if (nn_grp > 0)
            return nn_grp;
        return "";
    };

    function foreignALGRechten(val)
    {
        switch (val)
        {
            case -3: return "";
            case -2: return L("fac_gebruiker_level_variabel");
            default: return api2.splitLOV(buildAlgLevelLOV())[val]
        }
    }
    function foreignPRSRechten(val)
    {
        switch (val)
        {
            case -3: return "";
            case -2: return L("fac_gebruiker_level_variabel");
            default: return api2.splitLOV(buildPrsLevelLOV())[val]
        }
    }
    // Levert -3 op als rechten niet van toepassing zijn op een veld
    function fnRechten(oRs, field, model, sqlfieldname)
    {
        if ("min_level" in model)
            var min_level = model.min_level
        else
            var min_level = oRs("fac_functie_min_level").Value;

        if (!(min_level & 2) // Geen schrijfrechten
             && (field.dbs == "fac_gebruiker_prs_level_write" || field.dbs == "fac_gebruiker_alg_level_write")
           )
           return -3; // N.v.t.
        if (!(min_level & 4) && (min_level & 8) // Geen PRS, wel ALG
             && (field.dbs == "fac_gebruiker_prs_level_read" || field.dbs == "fac_gebruiker_prs_level_write")
           )
           return -3;
        if (!(min_level & 8) // Geen ALG rechten
             && (field.dbs == "fac_gebruiker_alg_level_read" || field.dbs == "fac_gebruiker_alg_level_write")
           )
           return -3;
        return oRs(sqlfieldname).Value;
    };

    if (params.functie_key > 0) // Wat handige info ophalen
    {
        var sql = "SELECT fac_functie_module"
                + "     , fac_functie_discipline"
                + "     , fac_functie_min_level"
                + "     , (SELECT COUNT(*)"
                + "          FROM ins_tab_discipline"
                + "          WHERE ins_discipline_verwijder IS NULL"
                + "            AND ins_discipline_module = fac_functie_module) nn_disc"
                + "  FROM fac_functie"
                + " WHERE fac_functie_key = " + params.functie_key;
        var oRs = Oracle.Execute(sql);
        this.module = oRs("fac_functie_module").Value;
        this.hasdisc = oRs("fac_functie_discipline").Value == 1;
        this.min_level = oRs("fac_functie_min_level").Value;
        this.total_disc = oRs("nn_disc").Value;
        oRs.Close();
        if (!(this.min_level & (4 | 8)))
        {
            this.fields["prs_level_read"].label = L("fac_gebruiker_lezen"); // Generiekere labels
            this.fields["prs_level_write"].label = L("fac_gebruiker_schrijven");
        }

    }
    if (params.functie_key > 0 && params.groep_key > 0)
    {
        this.tablesql = "(SELECT *"
                      + "   FROM fac_groeprechten"
                      + "  WHERE fac_functie_key = " + params.functie_key
                      + "    AND fac_groep_key = " + params.groep_key
                      + ") fac_groeprechten";
    }
    else if (params.functie_key > 0 && params.disc_key > 0)
    {
        this.tablesql = "(SELECT *"
                      + "   FROM fac_groeprechten"
                      + "  WHERE fac_functie_key = " + params.functie_key
                      + "    AND ins_discipline_key = " + params.disc_key
                      + ") fac_groeprechten";
    }
    else if (params.functie_key > 0)
    {
        this.tablesql = "(SELECT MIN(fac_groeprechten_key) fac_groeprechten_key,"
                      + "        fac_groep_key,"
                      + "        fac_functie_key,"
                      + "        COUNT(ins_discipline_key) nn_disc,"
                      + "        CASE WHEN COUNT(DISTINCT fac_gebruiker_prs_level_read)  > 1 THEN -2 ELSE MIN(fac_gebruiker_prs_level_read)  END  fac_gebruiker_prs_level_read,"
                      + "        CASE WHEN COUNT(DISTINCT fac_gebruiker_prs_level_write) > 1 THEN -2 ELSE MIN(fac_gebruiker_prs_level_write) END fac_gebruiker_prs_level_write,"
                      + "        CASE WHEN COUNT(DISTINCT fac_gebruiker_alg_level_read)  > 1 THEN -2 ELSE MIN(fac_gebruiker_alg_level_read)  END fac_gebruiker_alg_level_read,"
                      + "        CASE WHEN COUNT(DISTINCT fac_gebruiker_alg_level_write) > 1 THEN -2 ELSE MIN(fac_gebruiker_alg_level_write) END fac_gebruiker_alg_level_write"
                      + "   FROM fac_groeprechten"
                      + "  WHERE fac_functie_key =  " + params.functie_key
                      + "  GROUP BY fac_groep_key, fac_functie_key) fac_groeprechten";
        this.record_title += " TODO Functie: " + params.functie_key;
        this.fields["prs_level_read"].val  = fnRechten;
        this.fields["prs_level_write"].val = fnRechten;
        this.fields["alg_level_read"].val  = fnRechten;
        this.fields["alg_level_write"].val = fnRechten;

        this.fields["ins_discipline"] =
          {
            "dbs": "nn_disc",
            "label": L("mgt_discipline"),
            "typ": "varchar",
            val: fnFunctieDisc,
            "hidden_fld": true
          };
    }
    else if (params.groep_key > 0)
    {
        this.tablesql = "(SELECT MIN(fac_groeprechten_key) fac_groeprechten_key,"
                      + "        fac_groep_key,"
                      + "        g.fac_functie_key,"
                      + "        f.fac_functie_min_level,"
                      + "        CASE"
                      + "           WHEN fac_functie_discipline = 1"
                      + "           THEN fac_functie_module || ' ' || "
                      + "              COUNT (g.ins_discipline_key) || '/'"
                      + "              || (SELECT COUNT ( * )"
                      + "                    FROM ins_tab_discipline ia"
                      + "                   WHERE ins_discipline_verwijder IS NULL"
                      + "                     AND ia.ins_discipline_module = fac_functie_module)"
                      + "        END nn_disc,"
                      + "        CASE WHEN COUNT(DISTINCT fac_gebruiker_prs_level_read)  > 1 THEN -2 ELSE MIN(fac_gebruiker_prs_level_read)  END  fac_gebruiker_prs_level_read,"
                      + "        CASE WHEN COUNT(DISTINCT fac_gebruiker_prs_level_write) > 1 THEN -2 ELSE MIN(fac_gebruiker_prs_level_write) END fac_gebruiker_prs_level_write,"
                      + "        CASE WHEN COUNT(DISTINCT fac_gebruiker_alg_level_read)  > 1 THEN -2 ELSE MIN(fac_gebruiker_alg_level_read)  END fac_gebruiker_alg_level_read,"
                      + "        CASE WHEN COUNT(DISTINCT fac_gebruiker_alg_level_write) > 1 THEN -2 ELSE MIN(fac_gebruiker_alg_level_write) END fac_gebruiker_alg_level_write"
                      + "   FROM fac_groeprechten g, fac_functie f"
                      + "  WHERE fac_groep_key =  " + params.groep_key
                      + "    AND g.fac_functie_key = f.fac_functie_key"
                      + "  GROUP BY fac_groep_key, g.fac_functie_key, fac_functie_discipline, fac_functie_min_level, fac_functie_module) fac_groeprechten";
        this.record_title += " TODO Groep: " + params.groep_key;
        this.fields["prs_level_read"].val  = fnRechten;
        this.fields["prs_level_write"].val = fnRechten;
        this.fields["alg_level_read"].val  = fnRechten;
        this.fields["alg_level_write"].val = fnRechten;
        this.fields["ins_discipline"] =
          {
            "dbs": "nn_disc",
            "label": L("mgt_discipline"),
            "typ": "varchar",
            "hidden_fld": true
            };
    }
    else // moet disc_key wel gevuld zijn
    {
        this.tablesql = "(SELECT MIN(fac_groeprechten_key) fac_groeprechten_key,"
                      + "        COUNT(fac_groep_key) nn_groep,"
                      + "        fac_functie_key,"
                      + "        ins_discipline_key,"
                      + "        CASE WHEN COUNT(DISTINCT fac_gebruiker_prs_level_read)  > 1 THEN -2 ELSE MIN(fac_gebruiker_prs_level_read)  END  fac_gebruiker_prs_level_read,"
                      + "        CASE WHEN COUNT(DISTINCT fac_gebruiker_prs_level_write) > 1 THEN -2 ELSE MIN(fac_gebruiker_prs_level_write) END fac_gebruiker_prs_level_write,"
                      + "        CASE WHEN COUNT(DISTINCT fac_gebruiker_alg_level_read)  > 1 THEN -2 ELSE MIN(fac_gebruiker_alg_level_read)  END fac_gebruiker_alg_level_read,"
                      + "        CASE WHEN COUNT(DISTINCT fac_gebruiker_alg_level_write) > 1 THEN -2 ELSE MIN(fac_gebruiker_alg_level_write) END fac_gebruiker_alg_level_write"
                      + "   FROM fac_groeprechten"
                      + "  WHERE ins_discipline_key =  " + params.disc_key
                      + "  GROUP BY ins_discipline_key, fac_functie_key) fac_groeprechten";
        this.record_title += " TODO Disc: " + params.groep_key;
        this.fields["prs_level_read"].val  = fnRechten;
        this.fields["prs_level_write"].val = fnRechten;
        this.fields["alg_level_read"].val  = fnRechten;
        this.fields["alg_level_write"].val = fnRechten;
        this.fields["fac_groep"] =
          {
            "dbs": "nn_groep",
            "label": L("fac_groep_m"),
            "typ": "number",
            val: fnGroep,
            "hidden_fld": true
            };
    }

    this.list = {
      "columns": [
        "id",
        "fac_functie",
        "fac_groep",
        "ins_discipline",
        "prs_level_read",
        "prs_level_write",
        "alg_level_read",
        "alg_level_write"
      ]
    };

    this.REST_GET    = generic_REST_GET(this);
  //  this.REST_POST   = generic_REST_POST(this);
  //  this.REST_PUT    = generic_REST_PUT(this);
  //  this.REST_DELETE = generic_REST_DELETE(this);
}
%>