<% /*
    $Revision$
    $Id$

    File:           model_fin_factuur.inc

    Description:    Model voor fin_factuur

    Context:

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

function model_fin_factuur()
{
    this.records_name = "invoices";
    this.record_name = "invoice";
    this.table = "fin_factuur";
    this.primary = "fin_factuur_key";
    this.autfunction = "WEB_BGTORD";
    this.record_title = L("fin_invoice");
    this.records_title = L("lcl_fin_invoices");

    this.fields = {
        "id": {
            "dbs": "fin_factuur_key",
            "label": L("lcl_key"),
            "typ": "key",
            "hidden_fld": true,
            "required": true,
            "seq": "fin_s_fin_factuur_key"
        },
        "budgetdiscipline": {
            "dbs": "bgt_project.ins_discipline_key",
            "label": L("bgt_discipline_omschrijving"),
            "typ": "key",
            "required": true,
            "foreign": bgt_budgetdiscipline_foreign(),
            "showtransit": true
        },
        "budgetproject": {
            "dbs": "bgt_project.bgt_project_key",
            "label": L("bgt_project_omschrijving"),
            "typ": "key",
            "foreign": bgt_budgetproject_foreign(),
            "delayload": true,
            "showtransit": true
        },
        "budgetcostcategory": {
            "dbs": "bgt_kostenrubriek.bgt_kostenrubriek_key",
            "label": L("bgt_kostenrubriek_oms"),
            "typ": "key",
            "foreign": bgt_budgetcostcategory_foreign(),
            "delayload": true,
            "showtransit": true
        },
        "costtype": {
            "dbs": "mld_opdr.prs_kostensoort_key",
            "label": L("prs_kostensoort_key"),
            "typ": "key",
            "foreign": bgt_costtype_foreign(),
            "delayload": true,
            "required": false
        },
        "company": {
            "dbs": "mld_opdr.mld_uitvoerende_keys",
            "label": L("lcl_ord_company"),
            "typ": "key",
            "foreign": bgt_company_foreign(),
            "showtransit": true
        },
        "order": {
            "dbs": "mld_opdr_key",
            "label": L("lcl_fin_mld_opdr"),
            "typ": "key",
            "required": true,
            "foreign": bgt_order_foreign(),
            "delayload": true,
            "showtransit": true,
            "clone": false
        },
        "additional": {
            "dbs": "mld_opdr.mld_opdr_meerwerk",
            "label": L("lcl_mld_opdr_meerwerk"),
            "typ": "check0",
            "defaultvalue": 0,
            "multiedit": true
        },
         "ordernr_sort": {
            "dbs": "mld_opdr_ordernr_int",
            "label": L("bgt_opdr_ordernr"),
            "sql": "fac.safe_to_number(mld_opdr.mld_opdr_ordernr)",
            "typ": "number",
            "readonly": true,
            "hidden_fld": true
        },
        "ordernr": {
            "dbs": "mld_opdr.mld_opdr_ordernr",
            "label": L("bgt_opdr_ordernr"),
            "typ": "varchar",
            "hidden_fld": true
        },
        "orderseq": {
            "dbs": "mld_opdr.mld_opdr_bedrijfopdr_volgnr",
            "label": L("lcl_ins_volgnr"),
            "typ": "number",
            "hidden_fld": true
        },
        "account": {
            "dbs": "mld_opdr.prs_kostenplaats_key",
            "label": L("bgt_budget_account"),
            "typ": "key",
            "foreign": bgt_account_foreign(),
            "readonly": true
        },
        "_staticinvoice": {
            "dbs": "",
            "label": L("bgt_factuurnr_vast"),
            "typ": "varchar",
            "foreign": bgt_invoice_foreign()
        },
        "invoice": {
            "dbs": "fin_factuur_nr",
            "label": L("lcl_fin_invoice_number"),
            "typ": "varchar",
            "required": true
        },
        "remark": {
            "dbs": "fin_factuur_opmerking",
            "label": L("bgt_factuur_omschrijving"),
            "typ": "varchar"
        },
        "date": {
            "dbs": "fin_factuur_datum",
            "label": L("lcl_fin_findate"),
            "typ": "date",
            "required": true,
            "defaultvalue": new Date()
        },
        "advice": {
            "dbs": "fin_factuur_advies",
            "label": L("lcl_fin_adviesdatum"),
            "typ": "date",
            "defaultvalue": new Date(),
            "multiedit": true
        },
        "isprinted": {
            "dbs": "fin_factuur_bron",
            "label": "Geprint",
            "typ": "check0",
            "multiedit": true
        },
        "month": {
            "dbs": "fin_factuur_boekmaand",
            "label": L("lcl_fin_boekmaand"),
            "typ": "varchar"
        },
        "status": {
            "dbs": "fin_factuur_statuses_key",
            "label": L("lcl_fin_fin_status"),
            "typ": "key",
            "foreign": bgt_invoicestatus_foreign(),
            "defaultvalue": "6",
            "clone": false,  // Krijgt nu de default waarde.
            "multiedit": true
        },
        "total": {
            "dbs": "fin_factuur_totaal",
            "label": L("lcl_fin_CO_sum"),
            "typ": "float",
            "iscurrency": true,
            "generaltotal": true,
            "clone": false
        },
        "totalvat": {
            "dbs": "fin_factuur_totaal_btw",
            "label": L("lcl_fin_btwsum"),
            "typ": "float",
            "defaultvalue": 0,
            "iscurrency": true,
            "generaltotal": true,
            "clone": false
        },
        "totalincl": {
            "dbs": "fin_factuur_totaal_incl",
            "sql": "fin_factuur_totaal + fin_factuur_totaal_btw",
            "label": L("lcl_fin_total_sum"),
            "typ": "float",
            "readonly": true,
            "sqlshow": true,
            "iscurrency": true,
            "generaltotal": true,
            "defaultvalue": "0",
            "clone": false
        }
    };


    this.list = {
        "columns": [
            "invoice",
            "date",
            "remark",
            "total",
            "totalvat",
            "totalincl"
        ]
    };

    this.hook_pre_edit = function(obj, fld)
    {
        delete fld.budgetcostcategory; // Wordt alleen gebruikt om de kostenrubriek in het overzicht te kunnen tonen.

        var btw_data = {};
        if (obj.id > -1)
        {
            var sql = "SELECT ks.prs_kostensoort_btw"
                    + "     , fb.fin_btwtabelwaarde_perc"
                    + "     , (SELECT COUNT(*)"
                            + "  FROM prs_bedrijf pb"
                            + "     , fin_btwtabel ft"
                            + " WHERE pb.fin_btwtabel_key = ft.fin_btwtabel_key"
                            + "   AND pb.prs_bedrijf_key = mo.mld_uitvoerende_keys"
                            + "   AND ft.fin_btwtabel_default IS NULL"
                            + ") btw_off"
                    + "  FROM fin_factuur ff"
                    + "     , mld_opdr mo"
                    + "     , prs_kostensoort ks"
                    + "     , fin_btwtabelwaarde fb"
                    + " WHERE fb.fin_btwtabelwaarde_key = ks.fin_btwtabelwaarde_key"
                    + "   AND ks.prs_kostensoort_key = mo.prs_kostensoort_key"
                    + "   AND mo.mld_opdr_key = ff.mld_opdr_key"
                    + "   AND ff.fin_factuur_key = " + obj.id;
            var oRs = Oracle.Execute(sql);
            if (!oRs.eof)
            {
                btw_data.btw_inc = oRs("prs_kostensoort_btw").Value;
                btw_data.btw_val = oRs("fin_btwtabelwaarde_perc").Value;
                btw_data.btw_off = oRs("btw_off").Value;
            }
            oRs.Close();
        }

        %>
        <script>
            var btw_data = <%=JSON.stringify(btw_data)%>;
        </script>
        <%

        var vast_facnr = isVastFactuurnummer(obj.invoice);
        if (!obj.id && obj.invoice)
        {
            var invoice = obj.invoice;
            if (!vast_facnr)
            {
                // Bij klonen: id=(bestaat niet), invoice=niet leeg. Dan een (volgende) volgnummer erachter zetten.
                var cur_inv = (invoice.indexOf("/") > -1 ? invoice.substring(0,invoice.indexOf("/")) : invoice);
                var cur_seq = (invoice.indexOf("/") > -1 ? invoice.substring(invoice.indexOf("/")+1) : 0);
                cur_seq = parseInt(cur_seq ? cur_seq : 0);

                var sql = "SELECT MAX(CASE WHEN INSTR(f.fin_factuur_nr, '/') > 0"
                        + "                THEN TO_NUMBER(SUBSTR(f.fin_factuur_nr, INSTR(f.fin_factuur_nr, '/')+1))"
                        + "                ELSE 0"
                        + "           END) max_seq"
                        + "  FROM bgt_kostenrubriek r"
                        + "     , prs_kostensoortgrp g"
                        + "     , prs_kostensoort s"
                        + "     , mld_opdr o"
                        + "     , fin_factuur f"
                        + " WHERE r.bgt_kostenrubriek_key = g.bgt_kostenrubriek_key"
                        + "   AND g.prs_kostensoortgrp_key = s.prs_kostensoortgrp_key"
                        + "   AND s.prs_kostensoort_key = o.prs_kostensoort_key"
                        + "   AND o.mld_opdr_key = f.mld_opdr_key"
                        + "   AND r.bgt_project_key = " + obj.budgetproject.id
                        + "   AND f.fin_factuur_nr LIKE " + safe.quoted_sql(cur_inv + "%");
                var oRs = Oracle.Execute(sql);
                cur_seq = oRs("max_seq").Value;
                oRs.Close();

                var new_inv = cur_inv + "/" + (cur_seq==0 ? "02" : ((cur_seq < 9 ? "0" : "") + (cur_seq + 1)));
                obj.invoice = new_inv;
            }
            else
            {
                // Bij klonen van een factuur met een vast factuurnr blijft deze ongewijzigd.
                obj.invoice = invoice;
            }
            var v_company = obj.company.id;
            var v_discipline = getQParamInt("budgetdiscipline", -1);
            var v_project = getQParamInt("budgetproject", -1);
            var v_isclone = getQParamInt("scf_clone", 0);
        %>
        <script>
            var company_key       = <%=(v_company || -1)%>;
            var budgetproject_key = <%=(v_project || -1)%>;
            var budgetdiscipline_key = <%=(v_discipline || -1)%>;
            var is_clone = <%=v_isclone%>;
        </script>
        <%
        }
        else
        {
            var mld_opdr_key = getQParamInt("opdrachtcommon", -1);
            if (obj.id == -1 && mld_opdr_key > -1)
            {   // Nieuwe factuur bij bekende opdracht.
                var sql = "SELECT p.ins_discipline_key"
                        + "     , p.bgt_project_key"
                        + "     , o.mld_uitvoerende_keys"
                        + "     , s.prs_kostensoort_key"
                        + "     , s.prs_kostensoort_oms"
                        + "  FROM mld_opdr o"
                        + "     , prs_kostensoort s"
                        + "     , prs_kostensoortgrp g"
                        + "     , bgt_kostenrubriek r"
                        + "     , bgt_project p"
                        + " WHERE p.bgt_project_key = r.bgt_project_key"
                        + "   AND r.bgt_kostenrubriek_key = g.bgt_kostenrubriek_key"
                        + "   AND g.prs_kostensoortgrp_key = s.prs_kostensoortgrp_key"
                        + "   AND s.prs_kostensoort_key = o.prs_kostensoort_key"
                        + "   AND o.mld_opdr_key = " + mld_opdr_key;
                var oRs = Oracle.Execute(sql);
                var v_order = mld_opdr_key;
                var v_discipline = oRs("ins_discipline_key").Value;
                var v_project = oRs("bgt_project_key").Value;
                var v_soort = oRs("prs_kostensoort_key").Value;
                var v_srtoms = oRs("prs_kostensoort_oms").Value;
                var v_company = oRs("mld_uitvoerende_keys").Value;
                oRs.Close();
                // Er is geen QParam voor costtype gezet, dus deze zelf vullen.
                obj.costtype = {id: v_soort, name: v_srtoms};
            }
            else
            {
                var v_order      = (obj.order            ? obj.order.id            : null);
                var v_discipline = (obj.budgetdiscipline ? obj.budgetdiscipline.id : null);
                var v_project    = (obj.budgetproject    ? obj.budgetproject.id    : null);
                var v_soort      = (obj.costtype         ? obj.costtype.id         : null);
                var v_company    = (obj.company          ? obj.company.id          : null);
            }
        %>
        <script>
            var cur_mode = "<%=mode%>"; // = "edit"
            var mldopdracht_key      = <%=(v_order      || -1)%>;
            var budgetdiscipline_key = <%=(v_discipline || -1)%>;
            var budgetproject_key    = <%=(v_project    || -1)%>;
            var costtype_key         = <%=(v_soort      || -1)%>;
            var company_key          = <%=(v_company    || -1)%>;
        </script>
        <%
        }
        // De opdracht moet wel gewijzigd kunnen worden bij het klonen.
        if (!obj.id)
            fld.order.readonly = false;
    }

    this.hook_pre_post = function(params, obj)
    {
        // Bij toevoegen van een factuur moet prs_kostensoort_key nog gevuld worden.
        // Gebruik daarvoor die van mld_opdr.
        setKostensoort(obj);
        // Is het factuurnummer/volgnummer uniek binnen het project?
        var v_discipline_key = (typeof obj.budgetdiscipline == "object" ? obj.budgetdiscipline.id : obj.budgetdiscipline);
        checkUniekFactuurnummer(-1, v_discipline_key, obj.invoice);
        // Bij een kopiefactuur van een origineel (factuurnummer zonder volgnummer)
        // moet het originele factuurnummer de toevoeging "/01" krijgen.
        // De vaste factuurnummers echter niet.
        var vast_factnr = isVastFactuurnummer(obj.invoice);
        var is_clone = (getQParamInt("scf_clone", 0) == 1);
        if (is_clone && !vast_factnr)
        {
            // Haal het originele factuurnummer op.
            var org_fin_key = getQParamInt("id");
            var sql = "SELECT fin_factuur_nr"
                    + "  FROM fin_factuur"
                    + " WHERE fin_factuur_key = " + org_fin_key;
            var oRs = Oracle.Execute(sql);
            var fact_nr_org = oRs("fin_factuur_nr").Value;
            oRs.Close();
            if (fact_nr_org.indexOf("/") == -1)
            {
                // Het originele factuurnummer heeft nog geen volgnummer.
                // Deze dus alsnog toevoegen.
                var sql = "UPDATE fin_factuur"
                        + "   SET fin_factuur_nr = " + safe.quoted_sql(fact_nr_org + "/01")
                        + " WHERE fin_factuur_key = " + org_fin_key;
                Oracle.Execute(sql);
            }
        }
    }

    this.hook_pre_put = function(params, obj, key)
    {
        // Bij wijzigen van factuur moet prs_kostensoort_key nog gevuld worden.
        // Gebruik daarvoor die van mld_opdr.
        setKostensoort(obj);
        // Project-key kan als gevolg van de filtering niet aanwezig zijn.
        // Haal deze dus maar op met behulp van de factuur-key.
        var sql = "SELECT pr.ins_discipline_key"
                + "     , kr.bgt_project_key"
                + "     , TRUNC(fa.fin_factuur_datum)  factuur_datum"
                + "     , TRUNC(fa.fin_factuur_advies) advies_datum"
                + "     , fa.fin_factuur_nr"
                + "     , fa.fin_factuur_opmerking"
                + "     , fa.fin_factuur_statuses_key"
                + "  FROM bgt_project pr"
                + "     , bgt_kostenrubriek kr"
                + "     , prs_kostensoortgrp kg"
                + "     , prs_kostensoort ks"
                + "     , mld_opdr mo"
                + "     , fin_factuur fa"
                + " WHERE pr.bgt_project_key = kr.bgt_project_key"
                + "   AND kr.bgt_kostenrubriek_key = kg.bgt_kostenrubriek_key"
                + "   AND kg.prs_kostensoortgrp_key = ks.prs_kostensoortgrp_key"
                + "   AND ks.prs_kostensoort_key = mo.prs_kostensoort_key"
                + "   AND mo.mld_opdr_key = fa.mld_opdr_key"
                + "   AND fa.fin_factuur_key = " + key;
        var oRs = Oracle.Execute(sql);
        var v_discipline_key = oRs("ins_discipline_key").Value;
        var v_project_key = oRs("bgt_project_key").Value;
        var v_factuur_datum = new Date(oRs("factuur_datum").Value);
        var v_advies_datum = new Date(oRs("advies_datum").Value);
        var v_invoice = oRs("fin_factuur_nr").Value;
        var v_remark = oRs("fin_factuur_opmerking").Value || "";
        var v_status = oRs("fin_factuur_statuses_key").Value;
        oRs.Close();

        // Is de combinatie factuurnummer/volgnummer nog steeds uniek?
        if (obj.invoice != v_invoice)
            checkUniekFactuurnummer(key, v_discipline_key, obj.invoice);

        // Zet van alle facturen met hetzelfde factuurnummer binnen het project de adviesdatum gelijk.
        // De vaste factuurnummers worden buiten beschouwing gelaten.
        var vast_facnr = isVastFactuurnummer(obj.invoice);
        var v_old_factuurdatum = toDateString(v_factuur_datum, true)
        var v_new_factuurdatum = toDateString(obj.date.midnight(), true);
        var v_old_adviesdatum = toDateString(v_advies_datum, true)
        var v_new_adviesdatum = toDateString(obj.advice.midnight(), true);
        //
        var v_diff_datum  = (v_old_factuurdatum != v_new_factuurdatum)
        var v_diff_advies = (v_old_adviesdatum != v_new_adviesdatum);
        var v_diff_remark = (v_remark != obj.remark);
        var v_diff_status = (v_status != obj.status);

        if (!vast_facnr && (v_diff_datum || v_diff_advies || v_diff_remark || v_diff_status))
        {
            // We moeten zoeken op factuurnummer zonder volgnummer.
            var cur_invoice = (obj.invoice.indexOf("/") > -1 ? obj.invoice.substring(0, obj.invoice.indexOf("/")) : obj.invoice);
            var sql_u = "UPDATE fin_factuur"
                      + "   SET fin_factuur_advies = " + obj.advice.toSQL()
                      + "     , fin_factuur_datum = " + obj.date.toSQL()
                      + "     , fin_factuur_opmerking = " + safe.quoted_sql(obj.remark)
                      + "     , fin_factuur_statuses_key = " + obj.status
                      + " WHERE fin_factuur_key IN"
                            + " (SELECT fin_factuur_key"
                            + "    FROM fin_factuur f"
                            + "       , mld_opdr m"
                            + "       , bgt_v_project_full p"
                            + "   WHERE f.mld_opdr_key = m.mld_opdr_key"
                            + "     AND m.prs_kostensoort_key = p.prs_kostensoort_key"
                            + "     AND p.ins_discipline_key = " + v_discipline_key
                            + "     AND SUBSTR(f.fin_factuur_nr, 0, INSTR(f.fin_factuur_nr,'/')-1) = " + safe.quoted_sql(cur_invoice)
                            + " )";
            Oracle.Execute(sql_u);
        }
    }

    function setKostensoort(obj)
    {
        var sql = "SELECT o.prs_kostensoort_key"
                + "  FROM mld_opdr o"
                + " WHERE mld_opdr_key = " + obj.order;
        var oRs = Oracle.Execute(sql);
        if (!oRs.eof)
        obj.costtype = (!oRs.eof ? oRs("prs_kostensoort_key").Value : NULL);
        oRs.Close();
    }

    function isVastFactuurnummer(factnr)
    {
        // is de huidige factuurnummer iets uit de usrtab, dan deze gewoon laten staan.
        var sql = "SELECT count(*) aantal"
                + "  FROM fac_usrdata d"
                + "     , fac_usrtab t"
                + " WHERE t.fac_usrtab_key = d.fac_usrtab_key"
                + "   AND t.fac_usrtab_naam = " + safe.quoted_sql(S("bgt_usrtab_vaste_factuurnummer"))
                + "   AND d.fac_usrdata_code = " + safe.quoted_sql(factnr);
        var oRs = Oracle.Execute(sql);
        var vast_factnr = (oRs("aantal").Value == 1);
        oRs.Close();
        return vast_factnr;
    }

    function checkUniekFactuurnummer(p_factuur_key, p_discipline_key, p_factuurnr)
    {
            var sql = "SELECT count(*) aantal"
                    + "  FROM bgt_project p"
                    + "     , bgt_kostenrubriek r"
                    + "     , prs_kostensoortgrp g"
                    + "     , prs_kostensoort s"
                    + "     , mld_opdr o"
                    + "     , fin_factuur f"
                    + " WHERE p.bgt_project_key = r.bgt_project_key"
                    + "   AND r.bgt_kostenrubriek_key = g.bgt_kostenrubriek_key"
                    + "   AND g.prs_kostensoortgrp_key = s.prs_kostensoortgrp_key"
                    + "   AND s.prs_kostensoort_key = o.prs_kostensoort_key"
                    + "   AND o.mld_opdr_key = f.mld_opdr_key"
                    + "   AND p.ins_discipline_key = " + p_discipline_key
                    + "   AND f.fin_factuur_nr = " + safe.quoted_sql(p_factuurnr)
                    + "   AND f.fin_factuur_nr NOT IN"
                            + " (SELECT d.fac_usrdata_code"
                            + "    FROM fac_usrdata d"
                            + "       , fac_usrtab t"
                            + "   WHERE t.fac_usrtab_key = d.fac_usrtab_key"
                            + "     AND t.fac_usrtab_naam = " + safe.quoted_sql(S("bgt_usrtab_vaste_factuurnummer"))
                            + " )"
                    + (p_factuur_key != -1 ? "   AND f.fin_factuur_key <> " + p_factuur_key : "");
            var oRs = Oracle.Execute(sql);
            var uniek_factuurnr = (oRs("aantal").Value == 0);
            oRs.Close();
            if (!uniek_factuurnr)
                abort_with_warning("Factuurnummer {0} bestaat al in dit project.".format(p_factuurnr));
    }


    var mld_opdr_key = getQParamInt("opdrachtcommon", -1);
    var fin_key = getQParamInt("id", -1);
    var ischild = (getQParam("columns", "")=="" ? true : false);
    var xmodel = getQParam("model", "");
    if (mode == "list" && (xmodel == this.record_name /* || (ischild && mld_opdr_key == -1) || (!ischild && mld_opdr_key > -1)*/ ))
    {
        this.REST_GET    = generic_REST_GET(this);
    }
    else
    {
        var gparams = {
            GET: {
                tables: [
                    "prs_kostensoort",
                    "prs_kostensoortgrp",
                    "bgt_kostenrubriek",
                    "bgt_project",
                    "mld_opdr"
                ],
                wheres: [
                    "prs_kostensoort.prs_kostensoortgrp_key = prs_kostensoortgrp.prs_kostensoortgrp_key",
                    "prs_kostensoortgrp.bgt_kostenrubriek_key = bgt_kostenrubriek.bgt_kostenrubriek_key",
                    "bgt_kostenrubriek.bgt_project_key = bgt_project.bgt_project_key",
                    "mld_opdr.prs_kostensoort_key = prs_kostensoort.prs_kostensoort_key",
                    "mld_opdr.mld_opdr_key = fin_factuur.mld_opdr_key"
                ]
            }
        };
        if (mld_opdr_key > -1 && fin_key == -1)
            gparams.GET.wheres.push("mld_opdr.mld_opdr_key = {0}".format(mld_opdr_key));

        var v_budgetdiscipline = getQParamInt("budgetdiscipline", -1);
        if (v_budgetdiscipline == -1)
        {
            gparams.GET.tables.push("ins_tab_discipline");
            gparams.GET.wheres.push("bgt_project.ins_discipline_key = ins_tab_discipline.ins_discipline_key");
            gparams.GET.wheres.push(
                    "bgt_project.ins_discipline_key IN"
                    + " (SELECT w.ins_discipline_key"
                    + "    FROM fac_v_webgebruiker w"
                    + "       , ins_tab_discipline d"
                    + "   WHERE w.ins_discipline_key = d.ins_discipline_key"
                    + "     AND w.prs_perslid_key = " + user_key
                    + "     AND (w.fac_gebruiker_prs_level_read<9 OR w.fac_gebruiker_alg_level_read<9)"
                    + "     AND d.ins_discipline_module = 'BGT'"
                    + "     AND d.ins_discipline_verwijder IS NULL"
                    + " )"
            );
        }

        this.REST_GET =  generic_REST_GET(this, gparams);
    }

    this.REST_PUT = generic_REST_PUT(this);
    var autparams = user.checkAutorisation(this.autfunction);
    var canWrite = (autparams.PRSwritelevel < 9 && autparams.ALGwritelevel < 9);
    if (canWrite)
    {
        this.REST_POST   = generic_REST_POST(this);
        this.REST_DELETE = generic_REST_DELETE(this);
    }
}
%>