<% /*
    $Revision$
    $Id$

    File:           model_prs_bedrijfdienstlocatie.inc

    Description:    Model voor prs_bedrijfdienstlocatie

    Context:

    Notes:
*/
%>
<%
function model_prs_bedrijfdienstlocatie()
{
    this.records_name = "buildingfunctions";
    this.record_name = "buildingfunction";
    this.table = "prs_bedrijfdienstlocatie";
    this.primary = "prs_bedrijfdienstlocatie_key";
    // TODO: als de user contactpersoon is geldt prs.checkAutorisation(prs_perslid_key).readcontact/.writecontact en WEB_EXTREL
    this.autfunction = ["WEB_PRSMSU", "WEB_MLDORD", "WEB_EXTORD"];
    this.record_title = L("lcl_prs_dienst_scope");
    this.records_title = L("lcl_prs_dienst_scope");

    // Aan welke wergever(s) is het bedrijf (van de contactpersoon) gekoppeld.
    var sql_bedrijf = (prs_key > 0
                        ? " (SELECT prs_bedrijf_key"
                          + "  FROM prs_contactpersoon"
                          + " WHERE prs_perslid_key = " + prs_key
                          + "   AND prs_contactpersoon_verwijder IS NULL)"
                        : bedrijf_key);
    var sql_bedrijf_bedrijf = "SELECT b.prs_bedrijf_key"
                            + "     , b.prs_bedrijf_naam"
                            + "  FROM prs_bedrijf b"
                            + "     , prs_bedrijf_bedrijf bb"
                            + " WHERE b.prs_bedrijf_key = bb.prs_bedrijf_key1"
                            + "   AND bb.prs_bedrijf_key2 = " + sql_bedrijf
                            + " UNION "
                            + "SELECT b.prs_bedrijf_key"
                            + "     , b.prs_bedrijf_naam"
                            + "  FROM prs_bedrijf b"
                            + "     , prs_bedrijf_bedrijf bb"
                            + " WHERE b.prs_bedrijf_key = bb.prs_bedrijf_key2"
                            + "   AND bb.prs_bedrijf_key1 = " + sql_bedrijf;


    this.fields = {
        "id": {
            "dbs": "prs_bedrijfdienstlocatie_key",
            "label": L("lcl_key"),
            "typ": "key",
            "hidden_fld": true,
            "required": true,
            "seq": "prs_s_prs_bedrijfdienstloc_key"
        },
        "company": {
            "dbs": "prs_bedrijf_key",
            "label": L("prs_bedrijf_key"),
            "typ": "key",
            "insertonly": true,
            "foreign": {
                "tbl": "prs_bedrijf",
                "key": "prs_bedrijf_key",
                "desc": "prs_bedrijf_naam"
            },
            "defaultvalue": null
        },
        "person": {
            "dbs": "prs_perslid_key",
            "label": L("lcl_person"),
            "typ": "key",
            "insertonly": true,
            "foreign": {
                "tbl": "prs_v_perslid_fullnames",
                "key": "prs_perslid_key",
                "desc": "prs_perslid_naam_friendly"
            },
            "defaultvalue": null
        },
        "service": {
            "dbs": "prs_dienst_key",
            "label": L("prs_dienst"),
            "typ": "key",
            "insertonly": true,
            "required": true,
            "foreign": {
                "tbl": "prs_dienst",
                "key": "prs_dienst_key",
                "desc": "prs_dienst_omschrijving"
            },
            "defaultvalue": null,
            "onChange": "forcompany_onchange()"
        },
        "location": {
            "dbs": "alg_locatie_key",
            "label": L("alg_locatie"),
            "typ": "key",
            "readonly": true,
            "sql": "(COALESCE( prs_bedrijfdienstlocatie.alg_locatie_key"
                          + ", (SELECT g.alg_locatie_key"
                          + "     FROM alg_gebouw g"
                          + "    WHERE g.alg_gebouw_key = prs_bedrijfdienstlocatie.alg_gebouw_key"
                          + "  )"
                          + "))",
            "foreign": {
                "tbl": "alg_locatie",
                "key": "alg_locatie_key",
                "desc": "alg_locatie_omschrijving"
            },
            "sqlshow": true,
            "defaultvalue": null
        },
        "building": {
            "dbs": "alg_gebouw_key",
            "label": L("lcl_building"),
            "typ": "key",
            "readonly": true,
            "foreign": {
                "tbl": "alg_gebouw",
                "key": "alg_gebouw_key",
                "desc": "alg_gebouw_naam"
            },
            "defaultvalue": null
        },
        "forcompany": {
            "dbs": "prs_bedrijf_voor_key",
            "label": L("lcl_prs_dienst_scope_voor_bedrijf"),
            "typ": "key",
            "insertonly": true,
            "foreign": {
                "tbl": "(SELECT DISTINCT prs_bedrijf_key"
                     + "      , prs_bedrijf_naam"
                     + "   FROM (" + sql_bedrijf_bedrijf + "))",
                "key": "prs_bedrijf_key",
                "desc": "prs_bedrijf_naam",
                "multiselect": true,
                "selectjustone": true
            },
            "defaultvalue": null,
            "emptyoption": L("mgt_all"),
            "listfunction": function(oRs)
                            {
                              return (oRs.Fields("forcompany.id").Value? oRs.Fields("forcompany.name").Value : L("mgt_all"));
                            }
        },
        "duration": {
            "dbs": "prs_bdl_t_uitvoertijd",
            "label": L("lcl_prs_uitvoertijd"),
            "typ": "processingtime",
            "multiedit": true
        },
        "autoorder": {
            "dbs": "mld_autoorder",
            "label": L("lcl_prs_dienst_scope_autoorder"),
            "typ": "check0",
            "defaultvalue": 0,
            "invert": true,
            "multiedit": true
        }
    };

    if (prs_key > 0)
      this.edit = {
          "modal": true
      };

    this.hook_pre_post = function(params, obj)
    { // Controle op, en wijzigingen aan data voordat het record wordt toegevoegd.
      // Als de waarde van forcompany alleen "Alles" is, dan is de obj waarde hier null. Bij multi is er ook een -1 waarde aanwezig.
      // Als "Alles" (ook) is geselecteerd dan alleen de waarde -1 nodig voor forcompany.
      if (!obj.forcompany || obj.forcompany.join(",").indexOf("-1") != -1)
        obj.forcompany = [-1];
      else
      { // Als nu met deze nieuwe waard(en) alles is geselecteerd, dan kan alleen de waarde "Alles" geselecteerd worden.
        // prs_key is gelijk aan obj.service, dus ik kan sql_bedrijf_bedrijf gebruiken (die prs_key gebruikt).
        var sql = "SELECT b.prs_bedrijf_key"
                + "     , b.prs_bedrijf_naam"
                + "  FROM (SELECT DISTINCT prs_bedrijf_key"
                + "             , prs_bedrijf_naam"
                + "          FROM (" + sql_bedrijf_bedrijf + ")) b"
                + " WHERE b.prs_bedrijf_key NOT IN (SELECT COALESCE(bdl.prs_bedrijf_voor_key, -1)"
                + "                                   FROM prs_bedrijfdienstlocatie bdl"
                + "                                  WHERE bdl.prs_dienst_key = " + obj.service
                + "                                  AND bdl.prs_perslid_key = " + obj.person + ")"
                + "   AND b.prs_bedrijf_key NOT IN (" + obj.forcompany.join(",") + ")";
        var oRs = Oracle.Execute(sql);
        if (oRs.eof)
          obj.forcompany = [-1];
      }

      // Diensten bij (contact)persoon. Bedrijf is niet gedefinieerd.
      if (obj.company == undefined && obj.forcompany[0] == -1)
      { // "Alles" is geselecteerd voor selectbox "Voor opdrachtgever/bedrijf".
        // Alle bestaande entries verwijderen.
        var sql = "DELETE FROM prs_bedrijfdienstlocatie WHERE prs_perslid_key = " + obj.person + " AND prs_dienst_key = " + obj.service;
        var err = Oracle.Execute(sql, true);
        if (err.friendlyMsg)
          abort_with_warning(err.friendlyMsg);
      }
      // Diensten bij bedrijf. Persoon is niet gedefinieerd.
      else if (obj.person == undefined && obj.forcompany[0] == -1)
      { // "Alles" is geselecteerd voor selectbox "Voor opdrachtgever/bedrijf".
        // Alle bestaande entries verwijderen.
        var sql = "DELETE FROM prs_bedrijfdienstlocatie WHERE prs_bedrijf_key = " + obj.company + " AND prs_dienst_key = " + obj.service;
        var err = Oracle.Execute(sql, true);
        if (err.friendlyMsg)
          abort_with_warning(err.friendlyMsg);
      }
    }

    this.hook_post_post = function (params, jsondata, key)
    { // Als er meerdere bedrijven (forcompany) zijn geselecteerd (multiselect) dan is alleen de eerste nu opgeslagen.
      // Dan nu ook de anderen één voor één opslaan.
      if (!jsondata.forcompany) return;
      var nextdata = { id:-1,
                       service: jsondata.service,
                       company: (jsondata.company? jsondata.company : -1),
                       person: (jsondata.person? jsondata.person : -1),
                       //location: jsondata.location,
                       //building: jsondata.building,
                       duration: jsondata.duration };
      for (var i = 1; i < jsondata.forcompany.length; i++)
      {
        nextdata.forcompany = jsondata.forcompany[i];
        var restresult = this.REST_POST(params, nextdata);
      }
    }

    this.hook_pre_edit = function(obj, fld)
    {
      if (obj.id == -1)
      { // Bij aanmaken nieuwe koppeling bedrijf-dienst nog geen uitvoertijd vastleggen.
        // Dit mag pas als er ook locaties/gebouwen gekoppeld gaan worden.
        fld.duration.readonly = true;
      }

      if (prs_key > 0)
        // Als de dienst voor alles geldt, dan kun je de dienst niet meer toevoegen.
        fld.service.foreign.where = "     prs_dienst_key NOT IN (SELECT bdl.prs_dienst_key"
                                  + "                              FROM prs_bedrijfdienstlocatie bdl"
                                  + "                           WHERE bdl.prs_perslid_key = " + prs_key
                                  + "                           AND bdl.prs_bedrijf_voor_key IS NULL)"
                                  + " AND EXISTS (SELECT bedr.prs_bedrijf_key"
                                  + "                  , bedr.prs_bedrijf_naam"
                                  + "               FROM (" + sql_bedrijf_bedrijf + ") bedr"
                                  + "              WHERE bedr.prs_bedrijf_key NOT IN (SELECT bdl.prs_bedrijf_voor_key"
                                  + "                                                   FROM prs_bedrijfdienstlocatie bdl"
                                  + "                                                  WHERE bdl.prs_perslid_key = " + prs_key
                                  + "                                                    AND bdl.prs_dienst_key = prs_dienst.prs_dienst_key))";
    }

    this.hook_pre_delete = function(params, key)
    {
    }

    var get_params = {
        "GET": {
            "tables": [ "alg_v_aanweziglocatie",
                        "alg_v_aanweziggebouw"
                      ],
            "wheres": [ "prs_bedrijfdienstlocatie.alg_locatie_key = alg_v_aanweziglocatie.alg_locatie_key(+)",
                        "prs_bedrijfdienstlocatie.alg_gebouw_key  = alg_v_aanweziggebouw.alg_gebouw_key(+)",
                        "(alg_v_aanweziglocatie.alg_locatie_vervaldatum IS NULL OR alg_v_aanweziglocatie.alg_locatie_vervaldatum > SYSDATE)",
                        "(alg_v_aanweziggebouw.alg_gebouw_vervaldatum IS NULL OR alg_v_aanweziggebouw.alg_gebouw_vervaldatum > SYSDATE)"
                      ]
        }
    };

    this.REST_GET    = generic_REST_GET(this, get_params);
    this.REST_POST   = generic_REST_POST(this);
    if (user.has("WEB_PRSMSU"))
      this.REST_PUT    = generic_REST_PUT(this);
    this.REST_DELETE = generic_REST_DELETE(this);
}
%>