303 lines
12 KiB
JavaScript
303 lines
12 KiB
JavaScript
// ******************************************
|
|
// * $Id$
|
|
// *
|
|
// * SendAllOrders()
|
|
// *
|
|
// * Doorloop alle opdrachten etc uit de queues en verstuur die.
|
|
// *
|
|
// ******************************************
|
|
function sendAllOrders()
|
|
{
|
|
Log2File(2, "** START SendAllOrders (" + toDateTimeString(new Date()) + ")");
|
|
|
|
var sql = "SELECT prs_bedrijf_key,"
|
|
+ " alg_locatie_key,"
|
|
+ " xmlnode,"
|
|
+ " key,"
|
|
+ " reference,"
|
|
+ " 0 cust,"
|
|
+ " sender,"
|
|
+ " teverzenden_datum "
|
|
+ " FROM fac_v_orderqueue";
|
|
|
|
if (S("puo_custorders"))
|
|
{
|
|
sql += " UNION"
|
|
+ " SELECT prs_bedrijf_key,"
|
|
+ " alg_locatie_key,"
|
|
+ " xmlnode,"
|
|
+ " key,"
|
|
+ " reference,"
|
|
+ " 1 cust,"
|
|
+ " sender,"
|
|
+ " NULL teverzenden_datum "
|
|
+ " FROM " + customerId + "_v_orderqueue ";
|
|
}
|
|
sql = sql + " ORDER BY prs_bedrijf_key, xmlnode";
|
|
|
|
Log2File(3, sql);
|
|
var oRs = Oracle.Execute(sql);
|
|
if (!oRs.Eof && S("puo_loglevel") > 1)
|
|
{
|
|
var oRs2 = Oracle.Execute("SELECT COUNT(*) FROM (" + sql + ")");
|
|
Log2File(2, "About to send {0} orders".format(oRs2(0).Value)); // Handige waarschuwing bij interactief testen
|
|
oRs2.Close()
|
|
}
|
|
|
|
var RecTotal = 0;
|
|
var MLDRecSaved = 0;
|
|
var BESRecSaved = 0;
|
|
var CNTRecSaved = 0;
|
|
var CustRecSaved = 0;
|
|
|
|
var keeploglevel = S("puo_loglevel");
|
|
while (!oRs.Eof)
|
|
{
|
|
var Bedrijf_key = oRs("prs_bedrijf_key").value;
|
|
var prs_loc_key = oRs("alg_locatie_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;
|
|
var tv_datum = oRs("teverzenden_datum").value;
|
|
|
|
if (tv_datum != null && new Date(tv_datum) > new Date())
|
|
{
|
|
Log2File(0, "Future scheduled time: teverzenden_datum=" + toDateTimeString(new Date(tv_datum)) + " Key=" + OpdrKey);
|
|
}
|
|
else
|
|
{
|
|
if (send1Order(Bedrijf_key, XMLnode, { prs_loc_key: prs_loc_key,
|
|
OpdrKey: OpdrKey,
|
|
ordernr: ordernr,
|
|
Sender: Sender,
|
|
cust: cust }))
|
|
{
|
|
switch(XMLnode)
|
|
{
|
|
case "opdracht": MLDRecSaved ++; break;
|
|
case "bestelopdr": BESRecSaved ++; break;
|
|
case "contract": CNTRecSaved ++; break;
|
|
default: CustRecSaved ++;
|
|
}
|
|
}
|
|
if (S("puo_loglevel") != keeploglevel)
|
|
settings.overrule_setting("puo_loglevel", keeploglevel); // was mogelijk overruled door send1Order
|
|
}
|
|
|
|
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 = "\nCUST:" + String(CustRecSaved)
|
|
+ " and BES:" + String(BESRecSaved)
|
|
+ " and MLD:" + String(MLDRecSaved)
|
|
+ " and CNT:" + String(CNTRecSaved)
|
|
+ " of " + String(RecTotal)
|
|
+ " orders put";
|
|
Log2File(errLevel, recMsg);
|
|
if (recSaved != RecTotal)
|
|
{
|
|
Log2File(1, "That makes {0} failure(s)".format(RecTotal - recSaved));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Log2File(2, " 0 orders put");
|
|
}
|
|
}
|
|
|
|
function send1Order(Bedrijf_key, XMLnode, params) // XMLNode=opdracht, bestelopdr, contract, planrequest
|
|
{
|
|
var prs_loc_key = params.prs_loc_key || -1;
|
|
var OpdrKey = params.OpdrKey;
|
|
var ordernr = params.ordernr;
|
|
var Sender = params.Sender;
|
|
var cust = params.cust;
|
|
|
|
var result = null;
|
|
Log2File(1, "\n");
|
|
Log2File(2, "\n\n" + Fill(100, "="));
|
|
Log2File(2, "*> send1Order");
|
|
var sql = "SELECT prs_bedrijf_naam"
|
|
+ " FROM prs_bedrijf"
|
|
+ " WHERE prs_bedrijf_key = " + Bedrijf_key;
|
|
var oRs = Oracle.Execute(sql);
|
|
var bedrijfnaam = oRs("prs_bedrijf_naam").Value; // Handig voor logging
|
|
oRs.Close();
|
|
|
|
Log2File(1, "====== " + XMLnode
|
|
+ ": key: " + OpdrKey
|
|
+ " nr: " + ordernr
|
|
+ " to: " + bedrijfnaam
|
|
+ " (" + toDateTimeString(new Date()) + ")"
|
|
+ (params.userident ? " user: " + params.userident : ""));
|
|
|
|
if ((S("puo_flags") & 2) != 2) // Voor in testomgevingen
|
|
{
|
|
Log2File(2, "*< send1Order");
|
|
Log2File(1, "====== Skipping actual sending because of puo_flags");
|
|
return false;
|
|
}
|
|
// Hoe vaak al mislukt? Steeds minder vaak proberen
|
|
if (XMLnode == "opdracht" || XMLnode == "bestelopdr") // mislukte contracten tracken we nog niet
|
|
{
|
|
var sql = "SELECT fac_tracking_refkey,"
|
|
+ " fac_srtnotificatie_xmlnode,"
|
|
+ " fac_srtnotificatie_code,"
|
|
+ " MIN (fac_tracking_datum) firstdatum,"
|
|
+ " MAX (fac_tracking_datum) faildatum,"
|
|
+ " COUNT (*) failcount"
|
|
+ " FROM fac_tracking ft, fac_srtnotificatie fs"
|
|
+ " WHERE ft.fac_srtnotificatie_key = fs.fac_srtnotificatie_key"
|
|
+ " AND ft.fac_tracking_refkey = " + OpdrKey
|
|
+ " AND fac_srtnotificatie_code = " + (XMLnode == "opdracht" ? "'ORDSNX'" : "'BES2SX'")
|
|
+ " GROUP BY fac_tracking_refkey, fac_srtnotificatie_xmlnode, fac_srtnotificatie_code"
|
|
var oRs = Oracle.Execute(sql);
|
|
if (!oRs.Eof)
|
|
{
|
|
var failcount = oRs("failcount").Value;
|
|
var faildatum = new Date(oRs("faildatum").Value);
|
|
var firstdatum = new Date(oRs("firstdatum").Value);
|
|
// Interval tussen pogingen steeds 10 minuten langer, max 120 minuten
|
|
var backofminutes = Math.min(S("puo_faildelaymax"), failcount * S("puo_faildelayincrement"));
|
|
var nextdatum = new Date(faildatum);
|
|
nextdatum.setMinutes(nextdatum.getMinutes() + backofminutes);
|
|
if (nextdatum > new Date())
|
|
{
|
|
Log2File(1, "Failed {0} time(s) between {1} and {2}, delaying until {3}".format(failcount, toDateTimeString(firstdatum), toDateTimeString(faildatum), toDateTimeString(nextdatum)));
|
|
if (forceOrders)
|
|
Log2File(1, "*But* parameter FORCE is given so sending anyway");
|
|
else
|
|
{
|
|
Log2File(2, "*< send1Order");
|
|
Log2File(1, "====== Skip opdracht/bestelopdr");
|
|
return false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (failcount == S("puo_failextralogging") && S("puo_loglevel") < 4) // *Eenmalig* loggen we deze opdracht extra veel
|
|
{
|
|
Log2File(1, "Failed 3 times, increasing logging just once");
|
|
settings.overrule_setting("puo_loglevel", 4);
|
|
}
|
|
Log2File(1, "Failed {0} times between {1} and {2}, trying again".format(failcount, toDateTimeString(firstdatum), toDateTimeString(faildatum)));
|
|
}
|
|
|
|
}
|
|
oRs.Close();
|
|
}
|
|
|
|
var sqlB = "SELECT prs_bedrijfadres_key "
|
|
+ " FROM prs_bedrijfadres ba "
|
|
+ " WHERE ba.prs_bedrijf_key = " + Bedrijf_key
|
|
+ " AND ((ba.alg_locatie_key = " + prs_loc_key + ") OR (ba.alg_locatie_key IS NULL))"
|
|
+ " AND (ba.alg_district_key = (SELECT d.alg_district_key"
|
|
+ " FROM alg_locatie d"
|
|
+ " WHERE d.alg_locatie_key = " + prs_loc_key + ")"
|
|
+ " OR (ba.alg_district_key IS NULL))";
|
|
|
|
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, ba.alg_locatie_key NULLS LAST, ba.alg_district_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'";
|
|
sqlB += " ORDER BY ba.alg_locatie_key NULLS LAST, ba.alg_district_key NULLS LAST";
|
|
break;
|
|
}
|
|
case "contract":
|
|
{
|
|
sqlB += " AND prs_bedrijfadres_type = 'C'";
|
|
sqlB += " ORDER BY ba.alg_locatie_key NULLS LAST, ba.alg_district_key NULLS LAST";
|
|
break;
|
|
}
|
|
case "planrequest":
|
|
{
|
|
sqlB += " AND prs_bedrijfadres_type = 'V'"; // P=planning staat de constraint niet toe en voorraad is nog niet eens zo gek
|
|
sqlB += " ORDER BY ba.alg_locatie_key NULLS LAST, ba.alg_district_key NULLS LAST";
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
sqlB += " AND 1 = 0"; // unsupported
|
|
Log2File(0, "Niet ondersteunde xmlnode: " + XMLnode);
|
|
}
|
|
}
|
|
|
|
Log2File(3, sqlB);
|
|
var oRsB = Oracle.Execute(sqlB);
|
|
if (oRsB.Eof)
|
|
{
|
|
oRsB.Close();
|
|
Log2File(1, sql);
|
|
var tekst = "Error: No suitable technical address for company '{0}' key {1} found.".format(bedrijfnaam, Bedrijf_key);
|
|
Log2File(1, tekst);
|
|
marksent(XMLnode, OpdrKey, -1, tekst, cust);
|
|
result = null;
|
|
}
|
|
else
|
|
{
|
|
result = send2address( oRsB("prs_bedrijfadres_key").Value,
|
|
XMLnode,
|
|
OpdrKey,
|
|
{
|
|
sender: Sender,
|
|
marksent: marksent,
|
|
xml_content: params.xml_content,
|
|
cust: cust,
|
|
ordernr: params.ordernr
|
|
}
|
|
);
|
|
}
|
|
oRsB.Close();
|
|
|
|
Log2File(2, "*< send1Order");
|
|
Log2File(2, Fill(100, "=") + "\n\n");
|
|
return result;
|
|
}
|
|
|
|
function marksent(XMLnode, OpdrKey, resultcode, tekst, cust)
|
|
{
|
|
if (XMLnode == "planrequest")
|
|
return; // die kent geen markorderassent
|
|
|
|
// tekst += "\nFor contractor '{1}' key {2}".format(bedrijfnaam, Bedrijf_key);
|
|
var sqlC = "BEGIN "
|
|
+ (cust == 0 ? "FAC" : customerId) + ".markorderassent(" + safe.quoted_sql(XMLnode)
|
|
+ ", " + OpdrKey
|
|
+ ", " + resultcode // failure
|
|
+ ", " + safe.quoted_sql(tekst)
|
|
+ ");"
|
|
+ " END;";
|
|
Log2File(2, sqlC);
|
|
Oracle.Execute(sqlC);
|
|
} |