352 lines
20 KiB
JavaScript
352 lines
20 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_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 {l_mld_opdr_plandatum = jsdatetoiso(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 {l_mld_opdr_plandatum2 = jsdatetoiso(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_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_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_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, "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_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, "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_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, "ANN", l_mld_opdr_externnr, l_mld_opdr_opmerking, "-1");
|
|
}
|
|
break;
|
|
|
|
case "ORDAFM":
|
|
// Opdracht is technisch voltooid (gereed)
|
|
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);
|
|
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 + "¬i_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;
|
|
}
|
|
|
|
|