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

    File:               DynArtikelInfo.asp
    Description:        Haal dynamische artikel informatie op (bijvoorbeeld: voorraad)
                        bij de leverancier site
                        Let op: de web(!)server moet dan wel naar buiten kunnen
                        (proxy?/ Certificaten?)
    Parameters:         srtdeel_key: srddeel_key van het artikel

    Context:            sel_items_tab.js/fetchArtikelInfo-Ajax
    Result:             json data
                            stock: number
                            stockDate: waarop leverancier in zijn magazijn heeft gekeken
    Note:
*/
var JSON_Result = true;
%>
<!-- #include file="../Shared/common.inc" -->
<%
    Response.Expires = -1;

    var SXH_PROXY_SET_PROXY = 2;
    var SXH_OPTION_SELECT_CLIENT_SSL_CERT=3;

    function getSupplierStock(pGroupNr, pArticleNr, xmlurl, xslPath, certificateName, pun, ppw)
    {
        var http_request = Server.CreateObject("WinHTTP.WinHTTPRequest.5.1");

        if (S("ProxyServerIPAddress"))
        {
            http_request.setProxy(SXH_PROXY_SET_PROXY, S("ProxyServerIPAddress"));
        }
        if (certificateName != null) // Let wel: zorg dat IUSR (of: geauthenticeerde gebruiker)
        {                            // Rechten heeft op het certificaat!
            __Log("Zetten certificaat: " + certificateName);
            http_request.setOption(SXH_OPTION_SELECT_CLIENT_SSL_CERT, certificateName);
        }

        var xmlReq = Server.CreateObject("MSXML2.DOMDocument.6.0");
        xmlReq.appendChild(xmlReq.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\""))

        rootrootElement = xmlReq.createElement("facilitor");
            rootElement = xmlReq.createElement("stock_request");
                elementPart = xmlReq.createElement("part");
                    elementGroup = xmlReq.createElement("group");
                        elementGroupText = xmlReq.createTextNode(pGroupNr);
                        elementGroup.appendChild(elementGroupText);
                    elementPart.appendChild(elementGroup);
                    elementNumber = xmlReq.createElement("number");
                        elementNumberText = xmlReq.createTextNode(pArticleNr);
                        elementNumber.appendChild(elementNumberText);
                    elementPart.appendChild(elementNumber);
                rootElement.appendChild(elementPart);
            rootrootElement.appendChild(rootElement);
        xmlReq.appendChild(rootrootElement);

        // Transformeer met de leverancier specifieke stylesheet
        if (xslPath)
        {
            var xslDoc = Server.CreateObject("MSXML2.DOMDocument.6.0");
            __Log("Loading xslPath: " + Server.MapPath(xslPath));
            xslDoc.resolveExternals = true; // XSL kan includes hebben
            xslDoc.validateOnParse = true; // en moet correct zijn
            xslDoc.load(Server.MapPath(xslPath));
            xmlReq.transformNodeToObject(xslDoc, xmlReq);
        }

        __Log("Posting to url: " + xmlurl);
        http_request.open("POST", xmlurl, false, pun, ppw); // Synchroon
        http_request.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
//        http_request.setRequestHeader("SOAPAction", "urn:VSR#get_stocks");
        __SafeLog("Posting naar leverancier:<br>" + Server.HTMLEncode(xmlReq.xml));
        http_request.send(xmlReq.xml);
        if (http_request.status != 200)
        {
            __Log("getSupplierStock status: " + http_request.status);
            return null;
        }

        var xmlResp = Server.CreateObject("Msxml2.DOMDocument.6.0");
        xmlResp.resolveExternals = false; // XML-data vertrouwen we niet altijd
        xmlResp.validateOnParse = false; // maar dan kun je geen DTD's meer controleren
        __SafeLog("Response van leverancier:<br>" + Server.HTMLEncode(http_request.ResponseText));
        xmlResp.loadXML(http_request.ResponseText); // for parsing
        if (xmlResp.parseError.errorCode != 0)
        {
            __SafeDoLog("Response Headers:<br>" + http_request.GetAllResponseHeaders().replace(/\r\n/g, "<br>"));
            __SafeDoLog("Response van leverancier:<br>" + Server.HTMLEncode(http_request.ResponseText));
            __SafeDoLog("Error laden XML antwoord {0}<br>Reason: {1}<br>Regel: {2}({3})"
                    .format(xmlResp.parseError.errorCode, xmlResp.parseError.reason, xmlResp.parseError.line, xmlResp.parseError.filepos), "#f00");
        }

        // Transformeer met de leverancier specifieke stylesheet
        if (xslPath)
        {
            var xslDoc = Server.CreateObject("MSXML2.DOMDocument.6.0");
            __Log("Loading xslPath: " + Server.MapPath(xslPath));
            xslDoc.resolveExternals = true; // XSL kan includes hebben
            xslDoc.validateOnParse = true; // en moet correct zijn
            xslDoc.load(Server.MapPath(xslPath));
            xmlResp.transformNodeToObject(xslDoc, xmlResp);
            __SafeLog("Stock response transformed: " + Server.HTMLEncode(xmlResp.xml));
        }

        // Zoek ons artikel terug in de response (voor het theoretische geval dat
        // de leverancier meer terugstuurd)
        var strQuery = "facilitor/stock_response/part[number='" + safe.htmlattr(pArticleNr) + "']/amount";
        objStock = xmlResp.selectSingleNode(strQuery);
        if (!objStock)
        {
            __Log("getSupplierStock:  " + strQuery + " not found in (transformed) XML");
            return null;
        }
        else
        {
            result = { stock: objStock.text };
            strQuery = "stock_response/part[number='" + safe.htmlattr(pArticleNr) + "']/infotext";
            objInfotext = xmlResp.selectSingleNode(strQuery);
            if (objInfotext)
                result.infotext = objInfotext.text;

            // We doen nog niets met infohtml maar leggen alvast de basis
            strQuery = "stock_response/part[number='" + safe.htmlattr(pArticleNr) + "']/infohtml";
            objInfohtml = xmlResp.selectSingleNode(strQuery);
            if (objInfohtml)
                result.infohtml = objInfohtml.text;

            return result;
        }
    }

    var srtdeel_key = getQParamInt("srtdeel_key");
    var sql = "SELECT bes_srtdeel_nr, " + lcl.xsqla('bes_srtgroep_omschrijving','g.bes_srtgroep_key')
            + "     , prs_bedrijfadres_url, prs_bedrijfadres_xsl"
            + "     , prs_bedrijf_details_loc, prs_bedrijfadres_certificate"
            + "     , prs_bedrijfadres_username, prs_bedrijfadres_password"
            + "     , d.bes_srtdeel_maxbestel maxbestel"
            + " FROM  bes_srtdeel d"
            + "     , bes_srtgroep g"
            + "     , prs_bedrijf be"
            + "     , prs_bedrijfadres ba"
            + " WHERE d.bes_srtdeel_key = " + srtdeel_key
            + "   AND d.bes_srtgroep_key = g.bes_srtgroep_key"
            + "   AND ba.prs_bedrijf_key = be.prs_bedrijf_key" // die outerjoin was toch gewoon onzin hier?
            + "   AND ba.prs_bedrijfadres_type = 'V'"
            + "   AND ba.prs_bedrijfadres_startdatum <= SYSDATE"
            + "   AND d.prs_bedrijf_key = be.prs_bedrijf_key"

    var oRs = Oracle.Execute(sql);
    if (oRs.Eof || oRs("prs_bedrijfadres_url").Value == null) // Leverancier ondersteunt dat niet
    {
        Response.Write(JSON.stringify({})); // We weten niets
        Response.End;
    }

    var prs_ba_xsl = "";
    if (oRs("prs_bedrijfadres_xsl").Value)
        var prs_ba_xsl = custpath + "/" + oRs("prs_bedrijfadres_xsl").Value.toLowerCase();
    var res = getSupplierStock(oRs("bes_srtgroep_omschrijving").Value,
                               oRs("bes_srtdeel_nr").Value,
                               oRs("prs_bedrijfadres_url").Value,
                               prs_ba_xsl,
                               oRs("prs_bedrijfadres_certificate").Value,
                               oRs("prs_bedrijfadres_username").Value,
                               oRs("prs_bedrijfadres_password").Value
                               )

    if (!res) // Geen antwoord?
    {
        Response.Write(JSON.stringify({})); // We weten niets
        Response.End;
    }

    result = { stock: res.stock,
               maxbestel: oRs("maxbestel").Value,
               requestDate: new Date()
             };
    if (oRs("prs_bedrijf_details_loc").Value)
        result.details_url = oRs("prs_bedrijf_details_loc").Value + oRs("bes_srtdeel_nr").Value;

    Response.Write(JSON.stringify(result));
    
ASPPAGE_END();
%> 
