Files
Facilitor/UTILS/PutOrders/puo_allorders.js
Jos Groot Lipman 07cfb4816b PCHX#66974 en FCLT#67009 opdrachtnummer weer correct in de subject regel
svn path=/Website/trunk/; revision=51542
2021-05-19 12:18:25 +00:00

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);
}