<%@ language = "JavaScript" %>
<% /*
     $Revision$
     $Id$

     File:              api_cntsoap.asp
     Description:       API voor CNT-soap berichten
                        Interpreteert een bericht zodanig dat contractgegevens worden aangepast.
                        Dat is: qua ingangsdatum, contractbedrag of termijnbedrag.

     Parameters:        Een xml
     Status:
     Context:
*/
    DOCTYPE_Disable = 1;
    THIS_FILE = "appl/api/api_cntsoap.asp";
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/xml_converter.inc" -->
<!-- #include file="../Shared/save2db.inc" -->
<!-- #include file="../api/api.inc" -->
<!-- #include file="../cnt/cnt.inc" -->
<%
    // We sturen het antwoord in UTF-8.
    Session.Codepage = 65001;
    Response.Charset = 'utf-8';

    var API = new API_func();
    var tsql = "-";        // Voor tijdelijke statement(s)
    var sql = "-";         // De uiteindelijke insert/update-sql
    var resultcode = -1;   /* Zolang deze -1 is, is het nog goed. Uiteindelijk eindigt het met 0 (als goed). */
    var resulttekst = "";
    var xmlReq = Server.CreateObject("MSXML2.DOMDocument.6.0");
    xmlReq.load(Request);

    var xmlResp = new ActiveXObject("MSXML2.DOMDocument.6.0");
    xmlResp.appendChild(xmlResp.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"utf-8\""))

    // The response.
    var FCLTElement = xmlResp.createElement("facilitor");
    // The response header.
    var now = new Date();
    var nowtxt = now.getFullYear()+'-'+padout(now.getMonth()+1) +'-'+padout(now.getDate()) +' '
                           +padout(now.getHours()) +':'+padout(now.getMinutes())+':'+padout(now.getSeconds());
    var elmHeader = xmlResp.createElement("header");
    var headerinfo = {
//                      file: String(Request.ServerVariables("SCRIPT_NAME")).toLowerCase(),
                      datum: nowtxt,
                      naam: user.naam(),
                      custId: customerId,
                      language: user.lang()
                     }
    for (param in headerinfo)
    {
        var FCLTdata = xmlResp.createElement(param);
        FCLTdata.appendChild(xmlResp.createTextNode(headerinfo[param]));
        elmHeader.appendChild(FCLTdata);
    }
    FCLTElement.appendChild(elmHeader);

    // Hier zou het echte werk moeten gebeuren nav. xmlReq
    // en FCLTElement moeten we uitbreiden met antwoorden.
    var detected ="?";
//    xmlReq.setProperty("SelectionLanguage", "XPath");   // Weet niet of noodzakelijk

    // Is hiermee voldoende gecheckt op rechten?
    var authparams = user.checkAutorisation("WEB_CNTMAN");// Dit is nog ongeacht het contract

    // Dit is de contractenloop (mochten er ooit nog anderen gaan volgen).
    var contracten = xmlReq.getElementsByTagName("contract");
    for (i=0; i < contracten.length; i++)
    {
        // Lees per node de (optionele) tages en waarden
        var fields = []; // Bij te werken velden
        var cntid          = contracten[i].getAttribute("key");
        var cntaction      = contracten[i].getAttribute("type").toLowerCase();
        var mut_datum      = XMLval(contracten[i], "datum"); // Unsupported yet (misschien eigenlijk zelfs overbodig).
        var van_datum      = XMLval(contracten[i], "ingangsdatum");
        var contractbedrag = XMLval(contracten[i], "contractbedrag");
        var termijnbedrag  = XMLval(contracten[i], "termijnbedrag");
        //var cntkenmerken   = (contracten[i].getElementsByTagName("kenmerk"))[0].childNodes[0].nodeValue; // Unsupported yet
        var cnt_key        = -1;   // Bepaald op basis van cntid

        if (cntid == null) {
            resultcode = 1;
						resulttekst = "Undefined contract ID (key)";
        } else if (cntaction != 'update') {
            resultcode = 2;
            resulttekst = "Invalid action (type="+ cntaction +")";
        } else {
            tsql = "SELECT c.cnt_contract_key, TO_CHAR (c.cnt_contract_looptijd_tot, 'yyyymmdd') tot_datum "
                + " FROM cnt_contract c"
                + " WHERE c.cnt_contract_nummer_intern="+ safe.quoted_sql(cntid)
                + " AND NOT EXISTS"
                + " (SELECT 1 FROM cnt_contract"
                + "  WHERE cnt_contract_nummer_intern=c.cnt_contract_nummer_intern"
                + "  AND cnt_contract_versie > c.cnt_contract_versie)";
            var oRs = Oracle.Execute(tsql);
            if (oRs.eof) {
                resultcode = 3;
                resulttekst = "Unknown contract";
            } else {
                // Hier heb ik een geldige cnt_contract_key.
                cnt_key = oRs("cnt_contract_key").value;
                tot_datum = oRs("tot_datum").value;

                this_cnt = cnt.func_enabled_contract(cnt_key); // Wat heb ik zoal aan rechten op dit contract?
                if (this_cnt.canChange) {
                    // Bepaal de door te voeren wijzigingen.
                    if (van_datum != null) {
                        var looptijd_van = XMLtoJsDate(van_datum);
                        var looptijd_tot = XMLtoJsDate(tot_datum);
                        if (looptijd_van <= looptijd_tot) {
                            fields.push({ dbs: "cnt_contract_looptijd_van", typ: "date",  val: looptijd_van,   track: L("lcl_cnt_date_start") });
                        }
                        else {
                            resultcode = 4;
                            resulttekst = "Invalid datum (ingangsdatum)";
                        }
                    }
                    if (contractbedrag != null)
                        fields.push({ dbs: "cnt_contract_kosten",           typ: "float", val: contractbedrag, track: L("lcl_cnt_contract_sum") });
                    if (termijnbedrag != null)
                        fields.push({ dbs: "cnt_contract_termijnkosten",    typ: "float", val: termijnbedrag,  track: L("lcl_cnt_period_sum") });

                    // We weten de updates, nu nog uitvoeren; rechten voldoende afgedekt via CNTMAN-check hierboven?
                    if (resultcode == -1) { // Nog steeds geen fouten.
                        if (fields.length > 0) {
                            // Construct/uitvoeren update.
                            var cntUpd = buildTrackingUpdate("cnt_contract", "cnt_contract_key = " + cnt_key, fields, { noValidateToken: true });
                            oRs = Oracle.Execute(cntUpd.sql);

                            // Tot slot nog de tracking toevoegen.
                            if (cntUpd.trackarray.length)
                                shared.trackaction("CNTUPD", cnt_key, L("lcl_cnt_is_cntupd") + "\n" + cntUpd.trackarray.join("\n"));
                        }
                        resultcode = 0; // Ik heb gedaan wat ik moest en mocht doen voor dit contract.
                    }
                }
                else {
                    // Wat als geen rechten; melden of niets doen (resultcode = -1)?
                    resultcode = 5;
                    resulttekst = "Not authorized";
                }
            } // end geldige cnt_key
        } // end geldige cntid

        var binfo = {
                     returncode: resultcode,
                     returntekst: resulttekst,
                     // executed:sql,   // debug
                     datum: nowtxt
                    }

        var FCLTBody = xmlResp.createElement("contract");   // type=response
        FCLTBody.setAttribute('key', cntid);
        FCLTBody.setAttribute('type', 'response');
        for (param in binfo)
        {
            var FCLTdata = xmlResp.createElement(param);
            FCLTdata.appendChild(xmlResp.createTextNode(binfo[param]));
            FCLTBody.appendChild(FCLTdata);
        }

        FCLTElement.appendChild(FCLTBody);
    } // end for
    // Alle contract-nodes zijn behandeld.

    xmlResp.appendChild(FCLTElement);

    Response.ContentType = "text/xml";
    Response.Write(xmlResp.xml)
%>
