<% /*
    $Revision$
    $Id$

    File:           model_prs_bedrijfadres.inc

    Description:    De technische adressen van bedrijven of systemen waar Facilitor berichten naar toe kan sturen.
                    Dit kunnen bijvoorbeeld emailadressen zijn, maar ook URL's voor SOAP of REST services.
                    Er zijn drie categorieën van adressen, afhankelijk van prs_bedrijf_intern van het bijbehorende "bedrijf"
                        NULL: een externe partij (het bedrijf dat opdrachten krijgt)
                        1: een interne partij (het bedrijf van de melder enzo)
                        2: een systeem  (een generiek kanaal)

    Context:

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

function model_prs_bedrijfadres()
{
    this.records_name = "companyconnects";
    this.record_name = "companyconnect";
    this.table = "prs_bedrijfadres";
    this.primary = "prs_bedrijfadres_key";
    this.record_title = L("lcl_prs_bedrijfadres_frame");
    this.records_title = L("lcl_prs_bedrijfadres_title");
    this.autfunction = "WEB_PRSMGT";
    this.defaultIcon = "fa-address-card";
    this.trackcode = "PRSUPT";

    this.fields = {
        "id": {
            "dbs": "prs_bedrijfadres_key",
            "seq": "prs_s_prs_bedrijfadres_key",
            "typ": "key",
            "label": L("lcl_key"),
            "required": true
        },
        "company": {
            "dbs": "prs_bedrijf_key",
            "typ": "key",
            "label": L("prs_bedrijf_naam2"), /* label obv prs_bedrijf_bedrijf, lijkt onlogisch, is goed */
            "foreign": {
                "tbl": "prs_bedrijf",  // or 2??
                "key": "prs_bedrijf_key",
                "desc": "prs_bedrijf_naam"
            },
            "infoPointer": {
                "Url": "appl/prs/prs_bedrijf.asp?bedrijf_key="
            },
            "insertonly": true

        },
        "company2": {
            "dbs": "prs_bedrijf_key2",
            "typ": "key",
            "label": L("prs_bedrijf_naam1"),/* label obv prs_bedrijf_bedrijf, lijkt onlogisch, is goed */
            "foreign": {
                "tbl": "(SELECT prs_bedrijf_key, prs_bedrijf_naam FROM prs_bedrijf WHERE prs_bedrijf_intern=1)",
                "key": "prs_bedrijf_key",
                "desc": "prs_bedrijf_naam"
            }
        },
/*      We houden deze toch nog even onder de pet, omdat we voor type 2 bedrijfsnaam als systeemnaam gebruiken
        "name": {
            "dbs": "prs_bedrijfadres_omschrijving",
            "label": L("lcl_prs_bedrijfadres_omschrijving"),
            "typ": "varchar",
            "required": false,  // wmb required als bedrijf_intern = 2/kanaal = generiek TODO
            "filter": "like"
        },
*/        "channel": {
            "dbs": "prs_bedrijfadres_type",
            "typ": "varchar",
            "required": true,
            "label": L("lcl_prs_bedrijfadres_type"),
            "LOV": bedrijfadrestypeLOV(),
            "track": true
        },
        "ordertype": {      // alleen relevant voor kanaal Opdrachten
            "dbs": "mld_typeopdr_key",
            "typ": "key",
            "label": L("lcl_mld_typeopdr"),
            "foreign": "mld_typeopdr",
            "multiedit": true,
            "track": true
        },
        "discipline": {
            "dbs": "ins_discipline_key",
            "typ": "key",
            "label": L("mgt_discipline"),
            "foreign": "mld_typeopdr",
            "multiedit": true,
            "track": true
        },
        "address": {
            "dbs": "prs_bedrijfadres_url",  // = protocol + url
            "typ": "varchar",
            "required": true,
            "label": L("lcl_prs_bedrijfadres_url"),
            "multiedit": true,
            "track": true
        },
        "sender": {
            "dbs": "prs_bedrijfadres_sender",
            "typ": "varchar",
            "label": L("lcl_prs_bedrijfadres_afzender"),
            "placeholder": S("puo_fromaddress"),
            "multiedit": true,
            "track": true
        },
        "replyaddress": {
            "dbs": "prs_bedrijfadres_replyaddress",
            "typ": "varchar",
            "label": L("lcl_prs_bedrijfadres_replyadres"),
            "placeholder": S("puo_replyaddress"),
            "multiedit": true,
            "track": true
        },
        "district": {
            "dbs": "alg_district_key",
            "typ": "key",
            "label": L("lcl_district"),
            "foreign": { tbl: "alg_district",
                         key: "alg_district_key",
                         desc: "alg_district_omschrijving",
                         where: "alg_district_verwijder IS NULL"
                        },
            "multiedit": true,
            "track": true
        },
        "location": {
            "dbs": "alg_locatie_key",
            "typ": "key",
            "label": L("lcl_location"),
            "foreign": { tbl: "alg_locatie",
                         key: "alg_locatie_key",
                         desc: "alg_locatie_code",
                         name: "alg_locatie_omschrijving",
                         where: "alg_locatie_verwijder IS NULL" },  // TODO lijkt onafhankelijk van district
            "multiedit": true,
            "track": true
        },
        "username": {
            "dbs": "prs_bedrijfadres_username",
            "typ": "varchar",
            "label": L("lcl_prs_bedrijfadres_username"),
            "multiedit": true,
            "track": true
        },
        "password": {
            "dbs": "prs_bedrijfadres_password",
            "typ": "varchar",
            "label": L("lcl_prs_bedrijfadres_wachtwoord"),
            "multiedit": true,
            "track": true,
            "secret": true
        },
        "authmode": {
            "dbs": "prs_bedrijfadres_authmethod",
            "typ": "number",
            "defaultvalue": 0,
            "multiedit": true,
            "label": L("lcl_prs_bedrijfadres_authmethod"),
            "LOV": L("lcl_prs_bedrijfadres_authmethodLOV"),
            "required": true
        },
        "oa_token_url": {
            "dbs": "prs_bedrijfadres_oa_token_url",
            "typ": "varchar",
            "multiedit": true,
            "label": L("lcl_prs_bedrijfadres_oa_token_url")
        },
        "oa_scope": {
            "dbs": "prs_bedrijfadres_oa_scope",
            "typ": "varchar",
            "multiedit": true,
            "label": L("lcl_prs_bedrijfadres_oa_scope")
        },
        "oa_resource": {
            "dbs": "prs_bedrijfadres_oa_resource",
            "typ": "varchar",
            "multiedit": true,
            "label": L("lcl_prs_bedrijfadres_oa_resource")
        },
        "ordermode": {
            "dbs": "prs_bedrijfadres_ordermode",
            "typ": "number",
            "label": L("lcl_prs_companies_order_mode"),
            "multiedit": true,
            "track": true,
            "LOV": ordermodeLOV()
        },
/* future use
        "soapversion": {
            "dbs": "prs_bedrijfadres_soapversion",
            "typ": "varchar",
            "label": L("lcl_prs_bedrijfadres_soapversion"),
            "multiedit": true,
            "track": true
        },
*/
        "soapaction": {
            "dbs": "prs_bedrijfadres_soapaction",
            "typ": "varchar",
            "label": L("lcl_prs_bedrijfadres_soapaction"),
            "multiedit": true,
            "track": true
        },
        "certificate": {
            "dbs": "prs_bedrijfadres_certificate",
            "typ": "varchar",
            "label": L("lcl_prs_companies_order_certificate"),
            "multiedit": true,
            "track": true
        },
        "stylesheet": {
            "dbs": "prs_bedrijfadres_xsl",
            "typ": "varchar",
            "label": L("lcl_prs_companies_xsl"),
            "multiedit": true,
            "track": true
        },
        "xslerrorhandler": {
            "dbs": "prs_bedrijfadres_error_handler",
            "typ": "check0",
            "label": L("lcl_prs_companies_error_handler"),
            "multiedit": true,
            "track": true
        },
        "extension": {
            "dbs": "prs_bedrijfadres_ext",
            "typ": "varchar",
            "label": L("lcl_prs_bedrijfadres_ext"),
            "multiedit": true,
            "track": true
        },
        "sendattachment": {
            "dbs": "prs_bedrijfadres_flexfiles",
            "typ": "number",
            "defaultvalue": 0,
            "label": L("lcl_puo_order_flexfiles"),
            "multiedit": true,
            "LOV": bijlagemeesturenLOV(),
            "required": true
        },
        "encoding": {
            "dbs": "prs_bedrijfadres_encoding",
            "typ": "number",
            "defaultvalue": 0,
            "label": L("lcl_prs_bedrijfadres_encoding"),
            "multiedit": true,
            "LOV": encodingLOV(),
            "required": true
        },
        "lockuser": {
            "dbs": "prs_bedrijfadres_lockuser_key",
            "typ": "key",
            "label": L("lcl_prs_bedrijfadres_lockuser"),
            "foreign": "prs_perslid",
            "multiedit": true,
            "track": true
        },
        "locksecret": {
            "dbs": "prs_bedrijfadres_locksecret",
            "typ": "varchar",
            "label": L("lcl_prs_bedrijfadres_locksecret"),
            "hidden_fld": true, // Met de combinatie hidden_fld en readonly wordt de waarde in het veld bij bewaren niet opgeslagen.
            "readonly": true,   // Als met de resetknop dit veld wordt gewist wordt de oude waarde dus niet weer opgeslagen bij bewaren van het bedrijfadres.
            "multiedit": true,
            "track": true,
            "secret": true
        },
        "lockexpire": {
            "dbs": "prs_bedrijfadres_lockexpire",
            "typ": "number",
            "label": L("lcl_prs_bedrijfadres_lockexpire"),
            "multiedit": true,
            "track": true
        },
        "loglevel": {
            "dbs": "prs_bedrijfadres_loglevel",
            "typ": "number",
            "defaultvalue": 0,
            "label": L("lcl_prs_bedrijfadres_loglevel"),
            "track": true,
            "required": true
        },
        "charset": {
            "dbs": "prs_bedrijfadres_charset",
            "typ": "varchar",
            "multiedit": true,
            "label": L("lcl_prs_bedrijfadres_charset"),
            "LOV": L("lcl_prs_bedrijfadres_charsetLOV")
        },
        "attachfile": {
            "dbs": "prs_bedrijfadres_attachfile",
            "typ": "file",
            "module": "BDRADR",
            "icon": "fa-file-lines",
            "defaultValue": L("lcl_prs_bedrijfadres_bijlage"),
            "label": L("lcl_prs_bedrijfadres_bijlage"),
            "multiedit": true,
            "track": true
        },
        "plugin": {
            "dbs": "prs_bedrijfadres_plugin",
            "typ": "varchar",
            "multiedit": true,
            "label": L("prs_bedrijfadres_plugin")
        },
        "plugindata": {
            "dbs": "prs_bedrijfadres_plugindata",
            "typ": "memo",
            "multiedit": true,
            "label": L("prs_bedrijfadres_plugindata")
        },
        "startdate": {
            "dbs": "prs_bedrijfadres_startdatum",
            "label": L("prs_bedrijf_startdatum"),
            "typ": "date",
            "multiedit": true,
            "defaultvalue": new Date(),
            "track": true
        }
    };


    function bedrijfadrestypeLOV()
    {
        return  "B;" + L("lcl_prs_bedrijfadres_type_b")
             + ";C;" + L("lcl_prs_bedrijfadres_type_c")
             + ";N;" + L("lcl_prs_bedrijfadres_type_n")
             + ";O;" + L("lcl_prs_bedrijfadres_type_o")
             + ";R;" + L("lcl_prs_bedrijfadres_type_r")
             + ";E;" + L("lcl_prs_bedrijfadres_type_e_intern")   // enige waarde als prs_bedrijf_intern = 1, niet voor de rest
             + ";G;" + L("lcl_prs_bedrijfadres_type_g")           // tbd, komt overeen met prs_bedrijf_intern = 2
             + ";V;" + L("lcl_prs_bedrijfadres_type_v") // BES voorraad of MARX planrequest
             + ";I;" + L("lcl_prs_bedrijfadres_type_i")
             + ";S;" + L("lcl_prs_bedrijfadres_type_s")
             //+ ";P;" + L("lcl_prs_bedrijfadres_type_p") // planrequests
             ;
    };

    function bijlagemeesturenLOV(prs_type)
    {
        // with channel B the flexfiles value is interpreted as 0 = No, 1 = Yes (2 = not applicable)
        if (prs_type == "B")
        {
            return  "0;" + safe.quoted_sql(L("lcl_no"))
                 + ";1;" + safe.quoted_sql(L("lcl_Yes"));
        }
        else
        {
            var def = " (" + (S("puo_order_flexfiles")?L("lcl_Yes"):L("lcl_No")) + ")";
            return  "0;" + L("lcl_default") + def
                 + ";1;" + L("lcl_Yes")
                 + ";2;" + L("lcl_No");
        }
    };

    function encodingLOV()
    {
        return  "0;" + L("lcl_encoding_text_xml")
             + ";1;" + L("lcl_encoding_multipart_form")
             + ";2;" + L("lcl_encoding_application_json")
             + ";4;" + L("lcl_encoding_form_urlencoded")
    };

    function ordermodeLOV()
    {   // Initiëel leeg, wordt onLoad gevuld door onChangeAddress
        return  "0;0"
             + ";1;1"
             + ";5;5"
             + ";13;13"
    };

    this.hook_pre_edit = this.hook_pre_multi_edit = function (obj, fld) { %>
    <script type="text/javascript">
        var email_regexp = new RegExp("<%=safe.jsstring(S("email_regexp"))%>", "ig");
    </script>
<%  }

    this._pre_analyze_fields = function(params, jsondata) /* analyseer inkomende jsondata, common voor PUT en POST */
    {
        var authparams = user.checkAutorisation(this.autfunction, true);
        user.auth_required_or_abort(authparams && (authparams.ALGwritelevel < 9 || authparams.PRSwritelevel < 9));

        if (jsondata.channel && jsondata.channel != "O")
            jsondata.ordertype = -1;
    };

    this._analyze_fields = function(dbfields, params, jsondata) /* analyseer inkomende data, common voor PUT en POST */
    {
    };

    this._validate_fields = function(dbfields, params, jsondata) /* valideer fields, alle constraints die niet door de database worden afgevangen */
    {
        if (   ("channel" in jsondata) && ("sendattachment" in jsondata)
            && jsondata.channel == "B" && jsondata.sendattachment == 2)
        {
            abort_with_warning(L("mgt_validation_error_1").format(L("lcl_puo_order_flexfiles")));
        }

        if (("encoding" in jsondata) && (jsondata.encoding < 0 || jsondata.encoding > 4)) {
            abort_with_warning(L("mgt_validation_error_1").format(L("lcl_prs_bedrijfadres_encoding")));
        }

        if (("address" in jsondata) && jsondata.address != "")
        {
            var fout_adres = true;
            var protocol = "";
            var arr = (jsondata.address||"").split(":");
            if (arr.length == 1 && new RegExp(S("email_regexp"), "ig").test(jsondata.address))
            {
                jsondata.address = 'mailto:' + jsondata.address;
                fout_adres = false;
            }
            else if (arr.length > 1)
            {
                switch (arr[0])
                {
                    case "mailto":
                    case "file":   protocol = arr[0] + ":"; break;
                    case "https":
                    case "http":
                    case "ftp":
                    case "sftp":   protocol = arr[0] + "://"; break;
                    default:       protocol = jsondata.address; // Geen van bovengenoemde protocollen: levert straks fout_adres=true.
                }
                fout_adres = jsondata.address.substr(protocol.length) == "";
            }
            if (fout_adres) {
                abort_with_warning(L("mgt_validation_error_1").format(L("lcl_prs_bedrijfadres_url")));
            }
        }

        // bestaat de ingevulde xsl-file
        var fso = Server.CreateObject("Scripting.FileSystemObject")
        var xsl = jsondata.stylesheet || "";
        if (xsl && !fso.FileExists(Server.MapPath(custpath) + "/" + xsl)) // Zo doet puo_xmltools/ SafeLoadFileXSL dat
            abort_with_warning(xsl + " not found");
    };

    this.includes = {
        "srtnotifications": {
            "model": new model_prs_bedrijfadres_srtnoti(),
            "joinfield": "companyconnect",
            "multiadd": "srtnotification",
            "enable_update": true,
            "required": true,
            "notransport": true // TRIGGER prs_t_prs_bedrijfadres_A_I maakt al wat srtnoti aan, met clonen zou dat tot dubbelen leiden.
        }
    };

    this.REST_GET    = generic_REST_GET(this);
    this.REST_POST   = function _POST(params, jsondata)
        {
            this._pre_analyze_fields(params, jsondata);
            var dbfields = api2.update_fields(params, this, jsondata); // Build updater
            this._analyze_fields(dbfields, params, jsondata);
            this._validate_fields(dbfields, params, jsondata);

            return generic_REST_POST(this)(params, jsondata);
        };
    this.REST_PUT    = function _REST_PUT(params, jsondata, the_key)
        {
            this._pre_analyze_fields(params, jsondata);
            var dbfields = api2.update_fields(params, this, jsondata); // Build updater
            this._analyze_fields(dbfields, params, jsondata);
            this._validate_fields(dbfields, params, jsondata);

            return generic_REST_PUT(this)(params, jsondata, the_key);
        };
    this.REST_DELETE = generic_REST_DELETE(this);

}
%>