Files
Mareon/ax/SRC/F_GetOpdrachtenStatussen.js
Marcel Bourseau f161ffb7d2 MARX#69220 Koppeling Mareon -> Twinq: statusupdates van opdracht naar Twinq
svn path=/Mareon/trunk/; revision=54249
2021-12-21 15:28:25 +00:00

388 lines
22 KiB
JavaScript

// --------------------------------------------------------------------------------------
// F_GetOpdrachten_Statussen.js
// Copyright 2020 SG|facilitor. 053-4800 700, helpdesk@mareon.nl
// Written by MB (2019)
// --------------------------------------------------------------------------------------
//MARX#62647: Koppeling AX365 - Mareon (Push)
function F_GetOpdrachten_Statussen ()
{
var l_url = G_marx_url + "api2/reports/?rapcode=MARX_NQ_ORDER";
__Log("l_url: " + l_url,3);
var v_suppress_req_logging = 0; // Logging van request, indien dat gewenst is, niet onderdrukken.
var l_response_JSON = FcltAPI2(G_marx_apikey, "GET", l_url, "", 0, v_suppress_req_logging);
//Array van soort notificatie codes, idee is dat als bij dezelfde opdracht als eerder in deze run is uitgevoerd, wordt de 2e, 3e notify etc overgeslagen.
//Deze mtethode werd in 1e instantie gebruikt, echter nu niet meer, we willen de LAATST soort notificatiecode uit de SYNC gebruiken, niet meer de EERSTE!
//var l_fac_srtnotificatie_code_LIST = {};
if (l_response_JSON){
__Log("F_GetOpdrachten_Statussen: GET", 2);
var data = myJSON.parse(l_response_JSON.responseText);
__Log("Opdrachtstatus data:" + data, 4);
if ("marx_v_notifyqueue_orders" in data)
{ var l_orders = data.marx_v_notifyqueue_orders;
var l_aant_orders = l_orders.length;
__Log("Aantal opdrachtenstatussen: " + l_aant_orders, 3);
var l_prev_mld_opdr_key = -1; //default non-existent key
var l_error = 0; // default 0 = no (HTTP-error / success), 1 = HTTP-error/failure
var l_min_fac_tracking_datum_ordupd = null;
for (var i = 0; i < l_aant_orders; i++)
{
var l_mld_opdr_key = l_orders[i].mld_opdr_key;
var l_fac_srtnotificatie_code = l_orders[i].fac_srtnotificatie_code;
var l_fac_notificatie_key = l_orders[i].fac_notificatie_key;
var l_fac_tracking_datum = l_orders[i].fac_tracking_datum; // eg "2020-07-29T14:59:39", UTC time
__Log("l_mld_opdr_key: " + l_mld_opdr_key, 4);
__Log("l_fac_srtnotificatie_code: " + l_fac_srtnotificatie_code, 4);
__Log("l_fac_notificatie_key: " + l_fac_notificatie_key, 4);
__Log("l_fac_tracking_datum: " + l_fac_tracking_datum, 4);
if (l_mld_opdr_key == l_prev_mld_opdr_key){
//dezelfde opdracht als vorige keer
if (l_error == 0){
// Geen error bij dezelfde opdracht de vorge keer, dus DOORGAAN met deze
// Maar wel eerst checken of deze soort notificatie bij dezelfde opdracht straks nog in de array (in deze sync) aan de orde komt, want dan slaan we deze nu over, we willen namelijk de laatste...
if (find_srtnotcode_bij_opdr(l_mld_opdr_key, l_fac_srtnotificatie_code, l_orders, i+1, 0, 1) != -1){
// Ja, deze soort notificatie komt straks nog, we gaan geen communicatie naar extern systeem doen,
// Enkel een OKE-berichtje met bit64 reset van deze notify naar Mareon...
__Log("F_GetOpdrachten_Statussen Bypass: dubbele srtnoti " + l_fac_srtnotificatie_code, 4);
// Maar in geval van ORDUPD willen we wel de laagste tracking_datum noteren en onthouden, zodat het ophalen van bijlagen, die op datum en buiten NQ verloopt :-( , wel blijft werken, anders missen we bijlagen.
if (l_fac_srtnotificatie_code == "ORDUPD" && l_min_fac_tracking_datum_ordupd == null){
//ORDUPD komt straks dus nog een keertje bij deze opdracht, we willen deze laatste (=minimum) tracking-datum, zodat we geen bijlagen missen...
//En alleen onthouden als deze voor deze opdracht nog niet gevuld (null) was
l_min_fac_tracking_datum_ordupd = l_fac_tracking_datum;
}
post_do_exec_notification(l_fac_notificatie_key, {api_status_code: 1, api_status_message: "", api_response_message: ""});
}
else{
// We gaan de soort notificaties van dezelfde opdracht registeren in LIJST (Array), doen daar echter (nu nog) niets mee...
//l_fac_srtnotificatie_code_LIST[l_fac_srtnotificatie_code]=1;
// En communicatie van notify naar extern systeem...
l_error = do_exec_opdrstatus (l_orders[i], l_min_fac_tracking_datum_ordupd);
}
}
else{
// Wel een error bij dezelfde opdracht de vorge keer, dus SKIPPEN van deze
__Log("Agv vorige fout bij MAR-nr " + l_orders[i].mld_opdr_marx_nr + ": opdrachtstatus " + l_orders[i].fac_srtnotificatie_code + " bij opdracht " + l_orders[i].mld_opdr_externnr + " / " + l_orders[i].mld_opdr_ordernr + " wordt overgeslagen" + "(key:" + l_mld_opdr_key + ")", 1);
}
}
else{
//andere opdracht dan de vorige keer
//meteen maar l_error en Array resetten.
//Array is puur ter registratie, we deden voorheen wel iets, maar nu niet meer met deze array, wellicht nog iets om later 'ns een keertje in te gebruiken...
l_error = 0;
//l_fac_srtnotificatie_code_LIST = {};
//l_fac_srtnotificatie_code_LIST[l_fac_srtnotificatie_code]=1;
// reset van l_min_fac_tracking_datum_ordupd, overgang naar andere opdracht...
l_min_fac_tracking_datum_ordupd = null;
if (find_srtnotcode_bij_opdr(l_mld_opdr_key, l_fac_srtnotificatie_code, l_orders, i+1, 0, 1) != -1){
// De notificatiecode bij opdracht komt straks nog een keertje voorbij, deze SKIPPEN we, want we willen de laatste...
// Wel willen we deze uit de NQ halen, dus we gaan geen communicatie naar extern systeem doen,
// Enkel een OKE-berichtje met bit64 reset van deze notify naar Mareon...
__Log("F_GetOpdrachten_Statussen Bypass: dubbele srtnoti " + l_fac_srtnotificatie_code, 4);
// Maar in geval van ORDUPD willen we wel de laagste tracking_datum noteren en onthouden, zodat het ophalen van bijlagen, die op datum en buiten NQ verloopt :-( , wel blijft werken, anders missen we bijlagen.
if (l_fac_srtnotificatie_code == "ORDUPD" && l_min_fac_tracking_datum_ordupd == null){
//ORDUPD komt straks dus nog een keertje bij deze opdracht, we willen deze laatste (=minimum) tracking-datum, zodat we geen bijlagen missen...
//En alleen onthouden als deze voor deze opdracht nog niet gevuld (null) was
l_min_fac_tracking_datum_ordupd = l_fac_tracking_datum;
}
post_do_exec_notification(l_fac_notificatie_key, {api_status_code: 1, api_status_message: "", api_response_message: ""});
}
else{
// en anders de status natuurlijk gaan verwerken in externe systeem...
l_error = do_exec_opdrstatus (l_orders[i], l_min_fac_tracking_datum_ordupd);
}
}
l_prev_mld_opdr_key = l_mld_opdr_key;
}
//einde lus alle statussen
}
}
}
// Zoekt/Check of de soort notificatiecode v_srtnot_code bij opdracht v_opdr_key in de array v_array keertje voorkomt, zoekend vanaf array-index v_index_start tot/met v_index_end
// Let op: index van array begint met 0 en eindigt met lengte - 1 ;-),
// Wanneer je de hele array wilt doorzoeken, vul dan v_index_start en v_index_end met waarde 0.
// Als v_opdr_key_sorted = 0, dan wordt de hele array van v_index_start t/m v_index_end doorlopen, als v_opdr_key_sorted = 1, dan betekent dit dat de array gesorteerd is op opdracht-key, en stopt doorlopen van array zodra v_opdr_key ongelijk is.
// Resultaat = -1 indien niet voorkomt, en anders de index (vanaf 0 en hoger) als wel voorkomt.
function find_srtnotcode_bij_opdr(v_opdr_key, v_srtnot_code, v_array, v_index_start, v_index_end, v_opdr_key_sorted){
if (v_index_end == 0){v_index_end = v_array.length;}
for(var i = v_index_start; i < v_index_end; i++)
{
if (v_opdr_key_sorted && v_array[i].mld_opdr_key != v_opdr_key) return(-1);
if(v_array[i].mld_opdr_key == v_opdr_key && v_array[i].fac_srtnotificatie_code==v_srtnot_code) return(i);
}
return(-1);
}
function do_exec_opdrstatus(p_order, p_min_fac_tracking_datum_ordupd){
var l_error = 0;
var l_mld_opdr_key = p_order.mld_opdr_key; // eg 897125
var l_fac_notificatie_key = p_order.fac_notificatie_key; // eg 409044
var l_fac_tracking_datum_local;
var l_fac_tracking_datum_iso;
var l_fac_tracking_datum_tmp = p_order.fac_tracking_datum; // eg "2020-07-29T14:59:39", UTC time
if (l_fac_tracking_datum_tmp == null){
l_fac_tracking_datum_iso = "";
l_fac_tracking_datum_local = "";
}
else{
l_fac_tracking_datum_iso = jsdatetoiso(l_fac_tracking_datum_tmp);
l_fac_tracking_datum_local = jsdatextoxml(l_fac_tracking_datum_tmp);
}
var l_mld_statusopdr_key = p_order.mld_statusopdr_key; // eg 1
var l_mld_opdr_halted = p_order.mld_opdr_halted; // eg 1
//var l_mld_opdr_marx_nr = p_order.mld_opdr_marx_nr; // eg "MAR844121/1",
var l_ax_company_id = p_order.ax_company_id; // eg "1"
var l_woco_gln = p_order.woco_prs_leverancier_nr; // eg "1234567890123"
var l_lev_gln = p_order.lev_prs_leverancier_nr; // eg "1234567890123"
//var l_mld_melding_externnr = p_order.mld_melding_externnr; // eg "MLD00058733"
var l_mld_opdr_externnr = p_order.mld_opdr_externnr; // eg "ION00030210"
var l_mld_opdr_ordernr = p_order.mld_opdr_ordernr; // eg "MLD00058733-01"
var l_mld_opdr_plandatum;
var l_mld_opdr_plandatum_tmp = p_order.mld_opdr_plandatum; //eg "2020-07-30T09:00:00", UTC time, deze kan null zijn!!
if (l_mld_opdr_plandatum_tmp == null){
l_mld_opdr_plandatum = ""
}
else {
if (AX_or_Tobias() == "A365"){
// ISO date-time voor T365
l_mld_opdr_plandatum = jsdatetoiso(l_mld_opdr_plandatum_tmp);
}
else{
// Melding MARX#67715: local time voor REMS (en ook Facilitor, AX2012 en AX2009)
l_mld_opdr_plandatum = jsdatextoxml(l_mld_opdr_plandatum_tmp);
}
}
var l_mld_opdr_plandatum2;
var l_mld_opdr_plandatum2_tmp = p_order.mld_opdr_plandatum2; //eg null, in UTC time, deze kan null zijn!!
if (l_mld_opdr_plandatum2_tmp == null){
l_mld_opdr_plandatum2 = ""
}
else {
if (AX_or_Tobias() == "A365"){
// ISO date-time voor T365
l_mld_opdr_plandatum2 = jsdatetoiso(l_mld_opdr_plandatum2_tmp);
}
else{
// Melding MARX#67715: local time voor REMS (en ook Facilitor, AX2012 en AX2009)
l_mld_opdr_plandatum2 = jsdatextoxml(l_mld_opdr_plandatum2_tmp);
}
}
var l_mld_opdr_opmerking = p_order.mld_opdr_opmerking; // eg "Is niet meer nodig, de vloerbedekking is weer goed.", deze kan null zijn!!
if (l_mld_opdr_opmerking == null){l_mld_opdr_opmerking = ""};
l_mld_opdr_opmerking = escapeXml(l_mld_opdr_opmerking);
//var l_fac_srtnotificatie_key = p_order.fac_srtnotificatie_key; // eg 264
var l_fac_srtnotificatie_code = p_order.fac_srtnotificatie_code; // eg "ORDRSM"
var l_mld_opdr_kosten = p_order.mld_opdr_kosten; // eg 0
var l_mld_opdr_onderbreek_code = p_order.mld_opdr_onderbreek_code; // eg "AFW", deze kan null zijn!!
if (l_mld_opdr_onderbreek_code == null){l_mld_opdr_onderbreek_code = ""};
var l_mld_opdr_afwijs_code = p_order.mld_opdr_afwijs_code; // eg "ANN" of "WEI", deze kan null zijn!!
if (l_mld_opdr_afwijs_code == null){l_mld_opdr_afwijs_code = ""};
var l_response;
__Log("do_exec_opdrstatus - l_mld_opdr_key: " + l_mld_opdr_key, 3);
__Log("do_exec_opdrstatus - l_fac_srtnotificatie_code: " + l_fac_srtnotificatie_code, 3);
switch (l_fac_srtnotificatie_code)
{
case "ORDNEW":
// Nieuwe opdracht
//Default gaan we ervan uit dat de response goed gaat/is, en dus de notify uit de queue kan...
l_response = {api_status_code: 1, api_status_message: "", api_response_message: ""};
// Alleen voor Facilitor -> bijlagen van de nieuwe opdrachten ophalen (pullen)
if (AX_or_Tobias() == "F"){
__Log("*** START CUST.FACILITOR.NL --> MAREON : Putorders instellen en bijlages van opdrachtgever naar Mareon ophalen ***", 2);
var l_opdr_str = F_Putorders_NEW(l_mld_opdr_key,l_mld_opdr_ordernr);
F_GetOpdrachten_NEW_POST (l_opdr_str);
__Log("*** END", 2);
}
break;
case "ORDACP":
// Geaccepteerde opdracht
l_response = GEN_AcceptServiceTask(l_ax_company_id, l_woco_gln, l_lev_gln, l_mld_opdr_ordernr, l_mld_opdr_externnr, l_mld_opdr_opmerking);
break;
case "ORDUPD":
// Gewijzigde opdracht, kan zijn:
// 1. opmerking, of
// 2. een flexprop "onderbroken" (via api) of
// 3. bijlage(n).
//Default gaan we ervan uit dat de response goed gaat/is, en dus de notify uit de queue kan...
l_response = {api_status_code: 1, api_status_message: "", api_response_message: ""};
// 1. opmerking
if (l_mld_opdr_opmerking != ""){
l_response = GEN_SetSupplierText(l_ax_company_id, l_mld_opdr_ordernr, l_mld_opdr_externnr, l_mld_opdr_opmerking);
}
// 2. een flexprop "onderbroken" (via api)
if (l_response.api_status_code == 1){
// Communciatie vorige GEN_SetSupplierText is goed verlopen
if (l_mld_statusopdr_key == 8 && l_mld_opdr_halted == 1 && l_mld_opdr_onderbreek_code != ""){
// status is 8 (=geaccepteerd), halted is 1 (=onderbroken), en flexprop "onderbeekcode" is gevuld
l_response = GEN_Conditioneel_OnderbreekServiceTask(l_mld_opdr_key, l_ax_company_id, l_woco_gln, l_lev_gln, l_mld_opdr_ordernr, l_mld_opdr_onderbreek_code, l_mld_opdr_externnr, l_mld_opdr_opmerking, "-1");
}
}
// 3. bijlage(n)
if (l_response.api_status_code == 1){
// Communciatie vorige GEN_SetSupplierText en/of GEN_OnderbreekServiceTask is goed verlopen
if (G_mar_sync_bijlages_naar_opdrgvr != '0'){
if (AX_or_Tobias() == "F" || AX_or_Tobias() == "A" || AX_or_Tobias() == "A12" || AX_or_Tobias() == "A365"){
// Alleen in geval van Facilitor, AX2009 of AX2012, of AX365
__Log("*** START: Bijlagen bij opdrachten uit Mareon naar opdrachtgever ***", 2);
if (p_min_fac_tracking_datum_ordupd != null){
// MARX#65463: Bijlages komen niet aan AAGN
// Overrule de tracking-datum door de minimum trackingdatum van ORDUPD, om te voorkomen dat we bijlages missen mbt veld fac_bijlagen_aanmaakplus3sec
l_fac_tracking_datum_local = jsdatextoxml(p_min_fac_tracking_datum_ordupd);
__Log("Tracking datum voor ophalen bijlages: " + l_fac_tracking_datum_local, 4);
}
F_GetOpdracht_BijlagenQueue (l_mld_opdr_key, l_fac_tracking_datum_local);
//We gaan er voorlopig uit dat bijlage upload in principe altijd lukt, zo niet, dan toch, en laten we die voorbij gaan...
l_response = {api_status_code: 1, api_status_message: "", api_response_message: ""};
__Log("*** END", 2);
}
}
}
break;
case "ORDPLD":
// Gewijzigde Start Plandatum bij opdracht
if (l_mld_opdr_plandatum != ""){
l_response = GEN_PlanServiceTask(l_ax_company_id, l_woco_gln, l_lev_gln, l_mld_opdr_ordernr, l_mld_opdr_externnr, l_mld_opdr_opmerking, l_mld_opdr_plandatum);
}
else{
// Uit de NQ halen
l_response = {api_status_code: 1, api_status_message: "", api_response_message: ""};
}
break;
case "ORDPL2":
// Gewijzigde Eind Plandatum bij opdracht
if (l_mld_opdr_plandatum2 != ""){
l_response = GEN_VerlengServiceTask(l_ax_company_id, l_woco_gln, l_lev_gln, l_mld_opdr_ordernr, "VER", l_mld_opdr_externnr, l_mld_opdr_opmerking, l_mld_opdr_plandatum2);
}
else{
// Uit de NQ halen
l_response = {api_status_code: 1, api_status_message: "", api_response_message: ""};
}
break;
case "ORDHLT":
// Opdracht is onderbroken
l_response = GEN_Conditioneel_OnderbreekServiceTask(l_mld_opdr_key, l_ax_company_id, l_woco_gln, l_lev_gln, l_mld_opdr_ordernr, l_mld_opdr_onderbreek_code, l_mld_opdr_externnr, l_mld_opdr_opmerking, "-1");
break;
case "ORDRSM":
// Opdracht is in uitvoering gezet
l_response = GEN_UitvoeringServiceTask_ResetOnderbreek(l_mld_opdr_key, l_ax_company_id, l_woco_gln, l_lev_gln, l_mld_opdr_ordernr, "UIT", l_mld_opdr_externnr, l_mld_opdr_opmerking, "-1");
break;
case "ORDCAN":
// Opdracht is afgewezen, reden kan zijn (1) geweigerd of (2) geannuleerd
if (l_mld_opdr_afwijs_code == 'WEI') {
l_response = GEN_RefuseServiceTask(l_ax_company_id, l_woco_gln, l_lev_gln, l_mld_opdr_ordernr, l_mld_opdr_externnr, "GEWEIGERD", l_mld_opdr_opmerking);
}
if (l_mld_opdr_afwijs_code == 'ANN') {
l_response = GEN_AnnuleerServiceTask(l_ax_company_id, l_woco_gln, l_lev_gln, l_mld_opdr_ordernr, "ANN", l_mld_opdr_externnr, l_mld_opdr_opmerking, "-1");
}
break;
case "ORDAFM":
// Opdracht is technisch voltooid (gereed)
if (AX_or_Tobias() == "A365"){
// Voor T365, in ISO/UTC time
l_response = GEN_CompleteServiceTask(l_ax_company_id, l_mld_opdr_ordernr, l_mld_opdr_externnr, l_mld_opdr_opmerking, l_fac_tracking_datum_iso);
}
else {
// Melding MARX#67715: local time voor REMS (en ook Facilitor, AX2012 en AX2009)
l_response = GEN_CompleteServiceTask(l_ax_company_id, l_mld_opdr_ordernr, l_mld_opdr_externnr, l_mld_opdr_opmerking, l_fac_tracking_datum_local);
}
break;
case "ORDAFR":
// Opdracht is administratief voltooid (kosten gereed)
l_response = GEN_FinancAfrondenServiceTask(l_ax_company_id, l_mld_opdr_ordernr, l_mld_opdr_externnr, l_mld_opdr_kosten);
break;
default:
// Onbekend, doe niets, ook geen foutmelding, i.v.m. , backward compatible van oude sync adapters die nog (ergens) draaien, en nieuwe statuscodes moeten netto niets doen/geen impact hebben.
// Maar wel alsof het verwerken goed is gegaan, zodat ze uit de queue verdwijnen.
__Log("Onbekende statuscode:" + l_fac_srtnotificatie_code, 1);
l_response = {api_status_code: 1, api_status_message: "", api_response_message: ""};
}
l_error = post_do_exec_notification(l_fac_notificatie_key, l_response);
return l_error;
}
function post_do_exec_notification(p_fac_notificatie_key, p_response){
var l_error = 0;
var l_statuscode = p_response.api_status_code;
var l_statustekst = p_response.api_status_message;
var l_reponsetekst = p_response.api_response_message;
var l_extra_omschr = "";
var v_API = "MARKNOTISENT";
var l_url = G_marx_url + "?API=" + v_API + "&noti_key=" + p_fac_notificatie_key
var v_suppress_req_logging = 0; // Logging van request, indien dat gewenst is, niet onderdrukken.
if (l_statuscode == 1){
// Statusbericht is goed verwerkt door ERP, stuur naar Mareon een goed-signaal voor deze notify-queue actie.
l_error = 0;
l_url = l_url + "&resultcode=0";
FcltAPI2(G_marx_apikey, "GET", l_url, "", 0, v_suppress_req_logging);
}
else{
// Statusbericht is NIET goed verwerkt door ERP, stuur naar Mareon een fout-signaal voor deze notify-queue actie incl bijbehorende tekst.
l_error = 1;
l_url = l_url + "&resultcode=-1";
if (l_statustekst != "" || l_reponsetekst != ""){
var l_extra_omschr = l_statustekst + " - " + l_reponsetekst;
l_extra_omschr = l_extra_omschr.substr(0, 1000);
l_extra_omschr = encodeURIComponent(l_extra_omschr);
l_url = l_url + "&track_text=" + l_extra_omschr;
}
__Log("post_do_exec_notification: Error: " + p_fac_notificatie_key + " - " + l_extra_omschr, 2);
FcltAPI2(G_marx_apikey, "GET", l_url, "", 0, v_suppress_req_logging);
}
return l_error;
}