// ******************************************
// * $Id$
// *
// *   SendAllOrders()
// *   getXslNode()
// *
// * Doorloop alle opdrachten etc uit de queues en verstuur die.
// *
// ******************************************
function sendAllOrders()
{
    Log2File(1, "** START SendAllOrders (" + toDateTimeString(new Date()) + ")");

    var sql = "SELECT prs_bedrijf_key,"
            + "       xmlnode,"
            + "       key,"
            + "       reference,"
            + "       0 cust,"
            + "       sender "
            + "  FROM fac_v_orderqueue";

    if (S("puo_custorders"))
    {
        sql += " UNION"
             + " SELECT prs_bedrijf_key,"
             + "      xmlnode,"
             + "      key,"
             + "      reference,"
             + "      1 cust,"
             + "      sender"
             + " FROM " + customerId + "_v_orderqueue ";
    }
    sql = sql + " ORDER BY prs_bedrijf_key, xmlnode";

    Log2File(3, sql);
    var oRs = Oracle.Execute(sql);

    var RecTotal = 0;
    var MLDRecSaved = 0;
    var BESRecSaved = 0;
    var CNTRecSaved = 0;
    var CustRecSaved = 0;

    __Log("Opening order query")
    while (!oRs.Eof)
    {
        var Bedrijf_key = oRs("prs_bedrijf_key").value;
        var XMLnode = oRs("xmlnode").value;
        var OpdrKey = oRs("key").value;
        var ordernr = oRs("reference").value;
        var Sender  = oRs("Sender").value||"";
        var cust    = oRs("cust").value;

        if (send1Order(Bedrijf_key, XMLnode, OpdrKey, ordernr, Sender, cust))
        {
            switch(XMLnode)
            {
                case "opdracht":   MLDRecSaved ++; break;
                case "bestelopdr": BESRecSaved ++; break;
                case "contract":   CNTRecSaved ++; break;
                default:           CustRecSaved ++;
            }
        }

        oRs.MoveNext();
        RecTotal ++;
    } // while
    oRs.Close();

    if (RecTotal > 0)
    {
        // Als er minder opdrachten verstuurd zijn dan er te versturen waren, dan noemen we dat een error
        var recSaved = BESRecSaved + MLDRecSaved + CNTRecSaved + CustRecSaved;
        var errLevel = (recSaved == RecTotal ? 1 : 0);
        var recMsg = " CUST:" + String(CustRecSaved)
                   + " and BES:" + String(BESRecSaved)
                   + " and MLD:" + String(MLDRecSaved)
                   + " and CNT:" + String(CNTRecSaved)
                   + " of "      + String(RecTotal)
                   + " orders put";
        Log2File(errLevel, recMsg);
    }
    else
    {
        Log2File(2, " 0 orders put");
    }
}

function send1Order(Bedrijf_key, XMLnode, OpdrKey, ordernr, Sender, cust)
{
    var result = false;
    Log2File(1, "\n");
    Log2File(2, "\n\n" + Fill(100, "="));
    Log2File(1, "====== " + XMLnode + ": key: " + OpdrKey + " nr: " + ordernr + " (" + toDateTimeString(new Date()) + ")");

    if ((S("puo_flags") & 2) != 2) // Voor in testomgevingen
    {
        Log2File(1, "====== Skipping actual sending because of puo_flags");
        return false;
    }

    var sqlB = "SELECT prs_bedrijfadres_url, "
             + "       prs_bedrijfadres_encoding, "
             + "       NVL(prs_bedrijfadres_ordermode, 0) prs_bedrijfadres_ordermode, "
             + "       NVL(replace(prs_bedrijfadres_xsl, '\\', '/'), 'xsl/cust.xsl') prs_bedrijfadres_xsl, "
             + "       prs_bedrijfadres_certificate, "
             + "       prs_bedrijfadres_attachfile,"
             + "       prs_bedrijfadres_flexfiles,"
             + "       ba.mld_typeopdr_key, "
             + "       ba.prs_bedrijfadres_ext, "
             + "       ba.prs_bedrijfadres_username,"
             + "       ba.prs_bedrijfadres_password,"
             + "       ba.prs_bedrijfadres_authmethod,"
             + "       ba.prs_bedrijfadres_soapversion,"
             + "       ba.prs_bedrijfadres_soapaction"
             + "  FROM prs_bedrijfadres ba "
             + " WHERE ba.prs_bedrijf_key = " + Bedrijf_key;

    switch (XMLnode)
    {
        case "opdracht":
            {
                sqlB += " AND prs_bedrijfadres_type = 'O'";
                // Moet ik hier zelf nog het opdrachttype gaan opzoeken?? Ja.
                var sqlOT = "SELECT mld_typeopdr_key"
                          + "  FROM mld_opdr"
                          + " WHERE mld_opdr_key = " + OpdrKey;
                Log2File(3, sqlOT);
                var oRsOT = Oracle.Execute(sqlOT);
                if (!oRsOT.Eof)
                {
                    sqlB += " AND (ba.mld_typeopdr_key = " + oRsOT("mld_typeopdr_key").value + " OR ba.mld_typeopdr_key IS NULL)"
                          + " ORDER BY mld_typeopdr_key NULLS LAST";  // bedoeling: de gevulde specifieke boven de lege fallback
                }
                else
                {
                    Log2File(0, "Opdracht niet meer kunnen vinden?? Key=" + OpdrKey);
                }
                oRsOT.Close();
                break;
            }
        case "bestelopdr":
            {
                sqlB += " AND prs_bedrijfadres_type = 'B'";
                break;
            }
        case "contract":
            {
                sqlB += " AND prs_bedrijfadres_type = 'C'";
                break;
            }
        default:
            {
                sqlB += " AND 1 = 0";  // unsupported
                Log2File(0, "Niet ondersteunde xmlnode: " + XMLnode);
            }
    }

    Log2File(3, sqlB);
    var oRsB = Oracle.Execute(sqlB);
    if (oRsB.Eof)
    {
        Log2File(0, "Error: Bedrijf is niet goed geconfigureerd: " + Bedrijf_key);
    }
    else
    {
        var bedrijfadres = { url:             oRsB("prs_bedrijfadres_url").value,
                             encoding:        oRsB("prs_bedrijfadres_encoding").value,
                             ordermode:       oRsB("prs_bedrijfadres_ordermode").value,
                             typeopdr_key:    oRsB("mld_typeopdr_key").value,
                             certificateName: oRsB("prs_bedrijfadres_certificate").value || "",
                             extension:       oRsB("prs_bedrijfadres_ext").value||"",
                             flexfiles:       oRsB("prs_bedrijfadres_flexfiles").value,
                             AttachFile:      oRsB("prs_bedrijfadres_attachfile").Value,// Eén vaste bijlage ('algemene voorwaarden') om bij te sluiten
                             XSLbedr:         oRsB("prs_bedrijfadres_xsl").value.toLowerCase(),
                             username:        oRsB("prs_bedrijfadres_username").value,
                             password:        oRsB("prs_bedrijfadres_password").value,
                             authmethod:      oRsB("prs_bedrijfadres_authmethod").value || 0,
                             soapversion:     oRsB("prs_bedrijfadres_soapversion").value,
                             soapaction:      oRsB("prs_bedrijfadres_soapaction").value
                           };
        oRsB.Close();

        var connect = new ConnectorCls(); // Sinds 5.4 connecten we voor elke opdracht altijd opnieuw
        // Verbindt met het bezorgadres.
        connect.connect(bedrijfadres);
        if (connect.Connected)
        {
            // fouten worden afgevangen in fetchXMLContent. Indien geen xml aangemaakt
            // kan worden levert de functie een lege string. Voor orders gaan we dit blijven
            // herhalen totdat de order wel verstuurd kan worden.
            var xml_content = fetchXMLContent(XMLnode, OpdrKey, -1, "", "");
            if (xml_content)
            {
                var addflexfiles = (bedrijfadres.flexfiles||S("puo_order_flexfiles")) == 1;

                var AttachPath = "" // (nog) niet voor bestellingen
                if (addflexfiles && XMLnode == "opdracht")
                    AttachPath = S("flexfilespath") + "/MLD/" + subfolderKey("O", String(OpdrKey)) + "/";

                var XSLfile = getXslNode(bedrijfadres.XSLbedr, XMLnode);

                if (AttachPath)
                    Log2File(1, "Searching attachments under: " + AttachPath);
                Log2File(3, "In SendAllOrders sender=" + Sender);
                LogString2File(4, "xml_content", xml_content, "xml")
                Log2File(4, "xsl=" + bedrijfadres.XSLbedr + "==>" + XSLfile);
                Log2File(4, "ordernr=" + ordernr);
                Log2File(4, "key=" + OpdrKey);
                Log2File(4, "encoding=" + bedrijfadres.encoding);
                Log2File(4, "order_mode=" + bedrijfadres.ordermode);
                Log2File(4, "certificate=" + bedrijfadres.certificateName);
                Log2File(4, "mld_typeopdr_key=" + bedrijfadres.typeopdr_key);
                Log2File(4, "AttachPath=" + AttachPath);
                Log2File(4, "xmlnode=" + XMLnode);
                Log2File(4, "prs_bedrijfadres_ext=" + bedrijfadres.extension);
                Log2File(4, "AttachFile=" + bedrijfadres.AttachFile);
                Log2File(4, "username=" + bedrijfadres.username);
                Log2File(4, "authmethod=" + bedrijfadres.authmethod);
                Log2File(4, "soapversion=" + bedrijfadres.soapversion);
                Log2File(4, "soapaction=" + bedrijfadres.soapaction);

                var SendOrderResult = SendOrder( connect
                                                , xml_content
                                                , bedrijfadres
                                                , XSLfile
                                                , ordernr
                                                , OpdrKey
                                                , AttachPath
                                                , Sender
                                                , XMLnode
                                                , "");

                Log2File(1, "SendOrderResult: " + SendOrderResult.resultcode);
                var tekst = [];
                if (connect.friendlyurl)
                    tekst.push(connect.friendlyurl);
                if (SendOrderResult.errtext)
                    tekst.push(SendOrderResult.errtext);
                var sqlC = "BEGIN "
                         + (cust == 0 ? "FAC" : customerId) + ".markorderassent(" + safe.quoted_sql(XMLnode)
                                                                           + ", " + OpdrKey
                                                                           + ", " + SendOrderResult.resultcode
                                                                           + ", " + safe.quoted_sql(tekst.join("\n"))
                                                                           + ");"
                         + " END;";
                Log2File(2, sqlC);
                Oracle.Execute(sqlC);

                if (SendOrderResult.resultcode == 0 || SendOrderResult.resultcode == 2)
                {
                    result = true;
                    // send notification to supplier is possibly done by mld_opdr/bes_bestelopdr
                    // notification triggers when we change the status
                }
            } // if (XMLcontent)

            connect.disconnect()
        } // if (connect.Connected)
    }
    Log2File(2, Fill(100, "=") + "\n\n");
    return result;
}

function getXslNode(pXslFile, pNode)
{
  var fso = new ActiveXObject("Scripting.FileSystemObject");
  var vFile = pXslFile;

  if (vFile == "xsl/cust.xsl")
  {
    vFile = "xsl/" + pNode + ".xsl";
    if (!fso.FileExists(custabspath + "/" + vFile))
    {
      vFile = pXslFile;
    }
  }

  return vFile;
}

