<% /*
    $Revision$
    $Id$

    File:           model_prs_bedrijf_bedrijf.inc

    Description:    Model voor prs_bedrijf_bedrijf

    Context:

    Notes:
*/
%>
<%

function model_prs_bedrijf_bedrijf()
{
    this.records_name = "crosscompanies";
    this.record_name = "crosscompany";
    this.table = "prs_bedrijf_bedrijf";
    this.primary = "prs_bedrijf_bedrijf_key";
    this.autfunction = "WEB_PRSSYS";
    this.record_title = L("prs_bedrijf_bedrijf");
    this.records_title = L("prs_bedrijf_bedrijf_m");


    this.fields = {
        "id": {
            "dbs": "prs_bedrijf_bedrijf_key",
            "label": L("lcl_key"),
            "typ": "key",
            "required": true,
            "seq": "prs_s_prs_bedrijfbedrijf_key"
        },
        "company1": {
            "dbs": "prs_bedrijf_key1",
            "label": L("prs_bedrijf_naam1"),
            "typ": "key",
            "required": true,
            "foreign": "prs_bedrijf"
        },
        "externid1": {
            "dbs": "prs_bedrijf_externid1",
            "label": L("prs_bedrijf_externid1"),
            "typ": "varchar"
        },
        "externsyncdate1": {
            "dbs": "prs_bedrijf_externsyncdate1",
            "label": L("prs_bedrijf_externsyncdate1"),
            "typ": "datetime",
            "readonly": !(user.has("WEB_FACTAB") || user.has("WEB_FACXNR"))
        },
        "company2": {
            "dbs": "prs_bedrijf_key2",
            "label": L("prs_bedrijf_naam2"),
            "typ": "key",
            "required": true,
            "foreign": "prs_bedrijf"
        },
        "externid2": {
            "dbs": "prs_bedrijf_externid2",
            "label": L("prs_bedrijf_externid2"),
            "typ": "varchar"
        },
        "externsyncdate2": {
            "dbs": "prs_bedrijf_externsyncdate2",
            "label": L("prs_bedrijf_externsyncdate2"),
            "typ": "datetime",
            "readonly": !(user.has("WEB_FACTAB") || user.has("WEB_FACXNR"))
        },
        "startdate": {
            "dbs": "prs_bedrijf_bedrijf_startdatum",
            "label": L("prs_bedrijf_startdatum"),
            "typ": "date",
            "defaultvalue": new Date()
        },
        "enddate": {
            "dbs": "prs_bedrijf_bedrijf_einddatum",
            "label": L("prs_bedrijf_einddatum"),
            "typ": "date"
        },
        "startdate2": {
            "dbs": "prs_bedrijf_bedrijf_startdt2",
            "label": L("prs_bedrijf_startdatum2"),
            "typ": "date"
        },
        "enddate2": {
            "dbs": "prs_bedrijf_bedrijf_einddt2",
            "label": L("prs_bedrijf_einddatum2"),
            "typ": "date"
        },
        "status": {
            "dbs": "prs_bedrijf_bedrijf_status",
            "label": L("prs_bedrijf_verzenden"),
            "typ": "check0",  // voor mld_opdr_teverzenden: 0=niet te verzenden 1=te verzenden
            "defaultvalue": 0,
            "required": true
        },
        "charged": {
            "dbs": "prs_bedrijf_bedrijf_charged",
            "label": L("prs_bedrijf_charged"),
            "typ": "number",
            "required": true,
            "LOV": L("prs_bedrijf_charged_lov"),
            "defaultvalue": 0
        },
        "chargemode": {
            "dbs": "prs_bedrijf_bedrijf_chargemode",
            "label": L("prs_bedrijf_chargemode"),
            "typ": "number"
        },
        "fee1": {
            "dbs": "prs_bedrijf_bedrijf_fee1",
            "label": L("prs_bedrijf_fee1"),
            "typ": "float",
            "iscurrency": true
        },
        "fee2": {
            "dbs": "prs_bedrijf_bedrijf_fee2",
            "label": L("prs_bedrijf_fee2"),
            "typ": "float",
            "iscurrency": true
        },
        "fee3": {
            "dbs": "prs_bedrijf_bedrijf_fee3",
            "label": L("prs_bedrijf_fee3"),
            "typ": "float",
            "iscurrency": true
        },
        "fee4": {
            "dbs": "prs_bedrijf_bedrijf_fee4",
            "label": L("prs_bedrijf_fee4"),
            "typ": "float",
            "iscurrency": true
        },
        "defaultbtw": {
            "dbs": "fin_btwtabelwaarde_key",
            "label": L("prs_bedrijf_defaultbtw"),
            "typ": "key",
            "foreign": "fin_btwtabelwaarde"
        },
        "gptc": {
            "dbs": "prs_bedrijf_bedrijf_g_pct",
            "label": L("prs_bedrijf_gpct"),
            "typ": "float"
        },
        "account1": {
            "dbs": "prs_bedrijf_bedrijf_account1",
            "label": L("prs_bedrijf_account1"),
            "typ": "varchar"
        },
        "account2": {
            "dbs": "prs_bedrijf_bedrijf_account2",
            "label": L("prs_bedrijf_account2"),
            "typ": "varchar"
        }
    };


    this.hook_pre_post = function (params, jsondata)
    {
        // Koppelen van twee dezelfde bedrijven niet toestaan.
        if (jsondata.company1 == jsondata.company2)
            abort_with_warning(L("prs_bedrijf_bedrijf_err1").format(L("prs_bedrijf_key1"), L("prs_bedrijf_key2")));
    }

    this.hook_pre_delete = function (params, jsondata)
    { // Bij multi wordt deze functie voor elke te verwijderen prs_bedrijf_bedrijf_key aangeroepen.

      // Voordat de standaard functie REST_DELETE de bedrijf-bedrijf koppeling verwijdert,
      // moeten eerst de bijbehorende bedrijfdienstlocaties records worden verwijderd.

      // De bedrijfdienstlocaties waarbij het veld prs_bedrijf_voor_key ("Voor opdrachtgever/bedrijf") is gevuld
      // met één van de twee bedrijven uit de bedrijf-bedrijf koppeling, moeten sowieso worden verwijderd.
      var sql_bdl = "SELECT prs_bedrijfdienstlocatie_key"
                  + "  FROM prs_bedrijfdienstlocatie"
                  + " WHERE prs_bedrijf_voor_key IN (SELECT prs_bedrijf_key1"
                  + "                                  FROM prs_bedrijf_bedrijf"
                  + "                                 WHERE prs_bedrijf_bedrijf_key = " + jsondata
                  + "                                UNION"
                  + "                                SELECT prs_bedrijf_key2"
                  + "                                  FROM prs_bedrijf_bedrijf"
                  + "                                 WHERE prs_bedrijf_bedrijf_key = " + jsondata + ")"
                  + "   AND prs_perslid_key IN (SELECT prs_perslid_key"
                  + "                             FROM prs_contactpersoon"
                  + "                            WHERE prs_bedrijf_key IN (SELECT prs_bedrijf_key1"
                  + "                                                        FROM prs_bedrijf_bedrijf"
                  + "                                                       WHERE prs_bedrijf_bedrijf_key = " + jsondata
                  + "                                                      UNION"
                  + "                                                      SELECT prs_bedrijf_key2"
                  + "                                                        FROM prs_bedrijf_bedrijf"
                  + "                                                       WHERE prs_bedrijf_bedrijf_key = " + jsondata + ")"
                  + "                              AND prs_contactpersoon_verwijder IS NULL)";

      var sql = "DELETE prs_bedrijfdienstlocatie"
              + " WHERE prs_bedrijfdienstlocatie_key IN (" + sql_bdl + ")";
      Oracle.Execute(sql);

      // Als dit de laatste bedrijf-bedrijf koppeling is van een bedrijf dan moeten alle bedrijfdienstlocatie records van zijn contactpersoon,
      // waarbij het veld prs_bedrijf_voor_key niet is gevuld (NULL), nu ook verwijderd worden.
      // Beide bedrijven ophalen.
      sql = "SELECT prs_bedrijf_key1"
          + "     , prs_bedrijf_key2"
          + "  FROM prs_bedrijf_bedrijf"
          + " WHERE prs_bedrijf_bedrijf_key = " + jsondata;
      var oRs = Oracle.Execute(sql);
      var bdr_key1 = oRs("prs_bedrijf_key1").Value;
      var bdr_key2 = oRs("prs_bedrijf_key2").Value;
      oRs.Close();

      // Voor beide bedrijven controleren of het de laatste bedrijf-bedrijf koppeling is.
      var lastone = [];
      sql = "SELECT COUNT(*) aantal"
          + "  FROM prs_bedrijf_bedrijf bb"
          + " WHERE bb.prs_bedrijf_key1 = " + bdr_key1
          + "    OR bb.prs_bedrijf_key2 = " + bdr_key1;
      var oRs = Oracle.Execute(sql);
      if (oRs("aantal").Value == 1)
         lastone.push(bdr_key1);
      oRs.Close();
      sql = "SELECT COUNT(*) aantal"
          + "  FROM prs_bedrijf_bedrijf bb"
          + " WHERE bb.prs_bedrijf_key1 = " + bdr_key2
          + "    OR bb.prs_bedrijf_key2 = " + bdr_key2;
      var oRs = Oracle.Execute(sql);
      if (oRs("aantal").Value == 1)
         lastone.push(bdr_key2);
      oRs.Close();

      // Van de bedrijven waarvan dit de laatste bedrijf-bedrijf koppeling is, alle prs_bedrijfdienstlocatie_key records verwijderen.
      if (lastone.length)
      {
        var sql_bdl = "SELECT prs_bedrijfdienstlocatie_key"
                    + "  FROM prs_bedrijfdienstlocatie"
                    + " WHERE prs_bedrijfdienstlocatie_key IN (SELECT prs_bedrijfdienstlocatie_key"
                    + "                                          FROM prs_bedrijfdienstlocatie"
                    + "                                         WHERE prs_bedrijf_voor_key IS NULL"
                    + "                                           AND prs_perslid_key IN (SELECT prs_perslid_key"
                    + "                                                                     FROM prs_contactpersoon"
                    + "                                                                    WHERE prs_bedrijf_key IN (" + lastone.join(",") + ")"
                    + "                                                                      AND prs_contactpersoon_verwijder IS NULL))";
        var sql = "DELETE prs_bedrijfdienstlocatie"
                + " WHERE prs_bedrijfdienstlocatie_key IN (" + sql_bdl + ")";
        Oracle.Execute(sql);
      }

      // Nu kan de standaard functie REST_DELETE de bedrijf-bedrijf koppeling verwijderen.
    }

    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, {});
}
%>