From f161ffb7d2d03ca6b261fcc8d1a26782540350c7 Mon Sep 17 00:00:00 2001 From: Marcel Bourseau Date: Tue, 21 Dec 2021 15:28:25 +0000 Subject: [PATCH] MARX#69220 Koppeling Mareon -> Twinq: statusupdates van opdracht naar Twinq svn path=/Mareon/trunk/; revision=54249 --- ax/AxFacilitor.NMK | 1 + ax/AxFacilitor.SRC | 1 + ax/SRC/A2012_VerlengServiceTask.js | 33 --- ax/SRC/A365_GetToken.js | 41 ++- ax/SRC/AxFacilitor.js | 68 ++++- ax/SRC/AxFacilitor.xml | 4 + ax/SRC/Common.js | 304 ++++++++++++++++++++++- ax/SRC/F_GetOpdrachtenAcceptedRefused.js | 25 +- ax/SRC/F_GetOpdrachtenAfgemeld.js | 8 +- ax/SRC/F_GetOpdrachtenFinancAfgerond.js | 4 +- ax/SRC/F_GetOpdrachtenGepland.js | 8 +- ax/SRC/F_GetOpdrachtenOnderbroken.js | 12 +- ax/SRC/F_GetOpdrachtenOpmerking.js | 3 + ax/SRC/F_GetOpdrachtenStatussen.js | 20 +- ax/SRC/F_GetOpdrachtenUitvoer.js | 12 +- ax/SRC/F_GetOpdrachtenVerlengd.js | 8 +- ax/SRC/TQ_SetOpdrachtStatus.js | 144 +++++++++++ 17 files changed, 610 insertions(+), 86 deletions(-) delete mode 100644 ax/SRC/A2012_VerlengServiceTask.js create mode 100644 ax/SRC/TQ_SetOpdrachtStatus.js diff --git a/ax/AxFacilitor.NMK b/ax/AxFacilitor.NMK index b60f712..2a605ad 100644 --- a/ax/AxFacilitor.NMK +++ b/ax/AxFacilitor.NMK @@ -115,6 +115,7 @@ $(OBJ)\objMareon.js: \ $(MSRC)\A_UploadDocument.js \ $(MSRC)\A2012_UploadDocument.js \ $(MSRC)\R_SetOpdrachtStatus.js \ + $(MSRC)\TQ_SetOpdrachtStatus.js \ $(MSRC)\F_PutOpdrachten.js \ $(MSRC)\A_SetSupplierText.js \ $(MSRC)\A2012_SetSupplierText.js \ diff --git a/ax/AxFacilitor.SRC b/ax/AxFacilitor.SRC index d625ada..1eab36a 100644 --- a/ax/AxFacilitor.SRC +++ b/ax/AxFacilitor.SRC @@ -17,6 +17,7 @@ #include "SRC\A_UploadDocument.js" #include "SRC\A2012_UploadDocument.js" #include "SRC\R_SetOpdrachtStatus.js" +#include "SRC\TQ_SetOpdrachtStatus.js" #include "SRC\T_GetOpdrachten.js" #include "SRC\F_PutOpdrachten.js" #include "SRC\A_SetSupplierText.js" diff --git a/ax/SRC/A2012_VerlengServiceTask.js b/ax/SRC/A2012_VerlengServiceTask.js deleted file mode 100644 index 57661f0..0000000 --- a/ax/SRC/A2012_VerlengServiceTask.js +++ /dev/null @@ -1,33 +0,0 @@ -// -------------------------------------------------------------------------------------- -// A2012_VerlengServiceTask.js -// Copyright 2019 Facilitor. 053-4800 700, helpdesk@facilitor.nl -// Written by MB (2019) -// - - -function A2012_VerlengServiceTask(v_company_id, v_taskId, v_plandate2) -{ - -var v_API = "updatePurchStatus"; -if (v_plandate2 != "") - {v_plandate2 = v_plandate2 + "Z";} -else - {v_plandate2 = "1900-01-01T00:00:00Z";} - -v_req = '<_companyID>' + v_company_id + " <_taskId>" + v_taskId + " <_planDate>" + v_plandate2 + ""; -v_type = 0; -var v_soapAction = "SupplierPortal/updatePurchStatus"; -v_resp = apiAX(v_API, v_req, v_type,v_soapAction); - -if (v_type == 1 && v_resp != "") - { - oStream = new ActiveXObject("ADODB.Stream"); - oStream.Open(); - oStream.Type = 1; // adTypeBinary - oStream.Write(v_resp); // responseText geeft encoding problemen! - oStream.SaveToFile ("Log/test" + v_supplier_id + ".xml", 2); - oStream.Close(); - - } -return v_resp; -} \ No newline at end of file diff --git a/ax/SRC/A365_GetToken.js b/ax/SRC/A365_GetToken.js index 4d2844c..13b7fa0 100644 --- a/ax/SRC/A365_GetToken.js +++ b/ax/SRC/A365_GetToken.js @@ -6,31 +6,60 @@ function A365_supplierservice_GetToken (){ var v_token; - v_token = MARX_GetToken(G_ID_ax365_supplierservice_url, G_ID_ax365_supplierservice_client_id, G_ID_ax365_supplierservice_client_secret, G_ID_ax365_supplierservice_grant_type, G_ID_ax365_supplierservice_resource, G_ID_ax365_supplierservice_scope); + v_token = MARX_GetToken(G_ID_ax365_supplierservice_url, G_ID_ax365_supplierservice_client_id, G_ID_ax365_supplierservice_client_secret, G_ID_ax365_supplierservice_grant_type, G_ID_ax365_supplierservice_resource, G_ID_ax365_supplierservice_scope, 0); WriteSupplierserviceToken2File(v_token); return v_token; } function A365_saxton_GetToken (){ var v_token; - v_token = MARX_GetToken(G_ID_saxton_url, G_ID_saxton_client_id, G_ID_saxton_client_secret, G_ID_saxton_grant_type, G_ID_saxton_resource, G_ID_saxton_scope); + v_token = MARX_GetToken(G_ID_saxton_url, G_ID_saxton_client_id, G_ID_saxton_client_secret, G_ID_saxton_grant_type, G_ID_saxton_resource, G_ID_saxton_scope, 0); WriteSaxtonToken2File(v_token); return v_token; } function A2012_saxton_GetToken (){ var v_token; - v_token = MARX_GetToken(G_ID_saxton_url, G_ID_saxton_client_id, G_ID_saxton_client_secret, G_ID_saxton_grant_type, G_ID_saxton_resource, G_ID_saxton_scope); + v_token = MARX_GetToken(G_ID_saxton_url, G_ID_saxton_client_id, G_ID_saxton_client_secret, G_ID_saxton_grant_type, G_ID_saxton_resource, G_ID_saxton_scope, 0); WriteSaxtonToken2File(v_token); return v_token; } -function MARX_GetToken (v_url, v_client_id, v_client_secret, v_grant_type, v_resource, v_scope) +//MARX#69220 Koppeling Mareon -> Twinq +function TWINQ_GetToken (){ + var v_token; + v_token = MARX_GetToken(G_ID_saxton_url, G_ID_saxton_client_id, G_ID_saxton_client_secret, G_ID_saxton_grant_type, G_ID_saxton_resource, G_ID_saxton_scope, 1); + WriteSaxtonToken2File(v_token); + return v_token; +} + +// MARX#69220 Koppeling Mareon -> Twinq +// v_basic_authentication (0 of 1): In geval van Twinq, geldt v_basic_authentication (waarde = 1), bij T365/AX2012 geldt dat niet (waarde = 0) +function MARX_GetToken (v_url, v_client_id, v_client_secret, v_grant_type, v_resource, v_scope, v_basic_authentication) { + __Log("MARX_GetToken v_url: " + v_url,3); + __Log("MARX_GetToken v_client_id: " + v_client_id,3); + __Log("MARX_GetToken v_client_secret: " + v_client_secret,4); + __Log("MARX_GetToken v_grant_type: " + v_grant_type,3); + __Log("MARX_GetToken v_resource: " + v_resource,3); + __Log("MARX_GetToken v_scope: " + v_scope,3); + __Log("MARX_GetToken v_basic_authentication: " + v_basic_authentication,3); - l_request_body = "client_id=" + v_client_id + var l_secret; + var l_request_body; + l_secret = ""; + if (v_basic_authentication == 0) + { //geen basic auth, credentials in body... + l_request_body = "client_id=" + v_client_id + "&client_secret=" + v_client_secret + "&grant_type=" + v_grant_type; + } + else + { // wel basis auth, alleen granttype in body, en client_id en client secret worden in base64 omgezet... + l_request_body = "grant_type=" + v_grant_type; + var base64 = new Base64Cls(); + l_secret = base64.encode(v_client_id + ":" + v_client_secret); + } // v_resource is optioneel, in geval van AX365 is deze WEL gevuld (en in AX2012 NIET) if (v_resource != "") l_request_body = l_request_body + "&resource=" + v_resource; @@ -41,7 +70,7 @@ function MARX_GetToken (v_url, v_client_id, v_client_secret, v_grant_type, v_res var v_type = 1; var v_contenttype = "application/x-www-form-urlencoded"; __Log("MARX_GetToken: Nieuwe token opgehaald" ,2); - var v_resp = apiIDentity(v_url, l_request_body, v_type, v_contenttype, 0); + var v_resp = apiIDentity(v_url, l_request_body, v_type, v_contenttype, 0, v_basic_authentication, l_secret); var json_resp = JSON.parse(v_resp); var v_token = json_resp.access_token; diff --git a/ax/SRC/AxFacilitor.js b/ax/SRC/AxFacilitor.js index 9901272..f69923d 100644 --- a/ax/SRC/AxFacilitor.js +++ b/ax/SRC/AxFacilitor.js @@ -217,6 +217,16 @@ function MARX_2_REMS_Facturen(){ F_GetFacturen_REMS(); } +// ----------------------------- TWINQ functies ----------------------------------------- +function MARX_2_TWINQ_OpdrachtStatus(){ + F_GetOpdrachten_Statussen(); +} + +function MARX_2_TWINQ_Facturen(){ + F_GetFacturen_TWINQ(); +} + + // ----------------------------- Xtractor functies ----------------------------------------- function FCLT_2_AX_Facturen(){ F_GetFacturen_AX(); @@ -395,7 +405,7 @@ function AX365_2_FACILITOR() G_Token_saxton = ReadSaxtonTokenFromFile(); __Log("G_Token_saxton ReadSaxtonTokenFromFile:" + G_Token_saxton, 4); if (G_Token_saxton == ""){ - __Log("G_Token_saxton ReadSupplierserviceTokenFromFile is leeg:", 4); + __Log("G_Token_saxton ReadSaxtonTokenFromFile is leeg:", 4); G_Token_saxton = A365_saxton_GetToken(); } __Log("*** END Get AX Saxton Token", 2); @@ -520,7 +530,7 @@ function MAREON_2_FACILITOR() else{ //start else-tak "push/notifyqueue" - __Log("*** START FCLT --> AX2012 : Verwerken van ALLE opdrachtstatussen uit Mareon naar Facilitor obv notifyqueue ***", 2); + __Log("*** START MAREON --> CUST.FACILITOR.NL : Verwerken van ALLE opdrachtstatussen uit Mareon naar Facilitor obv notifyqueue ***", 2); MARX_2_FCLT_OpdrachtStatus(); __Log("*** END", 2); @@ -588,17 +598,50 @@ function REMS_2_MAREON() REMS_2_MARX_Opdrachten(); __Log("*** END", 2); - __Log("*** START FCLT --> AX2012 : Verwerken van ALLE opdrachtstatussen uit Mareon naar REMS obv notifyqueue ***", 2); + __Log("*** START MAREON --> REMS : Verwerken van ALLE opdrachtstatussen uit Mareon naar REMS obv notifyqueue ***", 2); MARX_2_REMS_OpdrachtStatus(); __Log("*** END", 2); if (G_rems_facturen_xmlfolder != ""){ MARX_2_REMS_Facturen(); } //einde else-tak "push/notifyqueue" - } - + } } +function MAREON_2_TWINQ() +{ + + if (G_ID_saxton_url != "" && G_push_notifyqueue == "1") + { + __Log("*** START MAREON --> TWINQ : Get (Saxton) Token ***", 2); + G_Token_saxton = ReadSaxtonTokenFromFile(); + __Log("G_Token_saxton ReadSaxtonTokenFromFile:" + G_Token_saxton, 4); + if (G_Token_saxton == ""){ + __Log("G_Token_saxton ReadSaxtonTokenFromFile is leeg:", 4); + G_Token_saxton = TWINQ_GetToken(); + } + __Log("*** END Get (Saxton) Token", 2); + + //start "push/notifyqueue" + __Log("*** START MAREON --> TWINQ : Verwerken van ALLE opdrachtstatussen uit Mareon naar Twinq obv notifyqueue ***", 2); + MARX_2_TWINQ_OpdrachtStatus(); + __Log("*** END", 2); + + // TODO TODO + + //__Log("*** START MAREON --> TWINQ: Facturen uit Mareon naar Twinq ***", 2); + //if (G_fclt_factuur_xmlfolder != ""){ + // MARX_2_TWINQ_Facturen(); + //} + //__Log("*** END", 2); + } + else{ + //Geen "push/notifyqueue" ingesteld + __Log("*** NQ staat niet in gesteld, de koppeling naarr Twinq staat uit ***", 1); + } +} + + function FACILITOR_2_Xtractor() { @@ -625,8 +668,9 @@ function FACILITOR_2_Xtractor() // 1.52 -- MARX#67695: Adapter genereert veel te veel logging --> Logging van base64 XML nodes (van PDF bestanden) is oorzaak, we kappen de logging daarvan af op max. 1024 tekens (1K) // 1.53 -- MARX#67715: Uitbreiding van de communicatie van statuscodes naar REMS // 1.54 -- MARX#69545 Factuur scanning 365 werkt niet door update in Tobias 365 +// 1.60 -- MARX#69220 Koppeling Mareon -> Twinq -var G_Mareon_Adapter = "1.54"; +var G_Mareon_Adapter = "1.60"; //MARX#56643: Test Haagwonen inkoopordernummer ontbreekt in Mareon ION001753 var G_new_date = new Date(); //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -654,6 +698,8 @@ var G_Token_supplierservice = ""; var G_ax365_url_serviceax = Read_Ini_Setting("ax365","url_serviceax"); var G_Token_saxton = ""; +var G_twinq_url = Read_Ini_Setting("twinq","url"); + // In een (1) sync sessie mogen er max 3 x een poging worden gedaan (= eigen keuze) om een Token op te halen indien deze expired zou zijn (om niet in oneindige loop te raken). var G_AX365_Allowed_Get_Token = 3; @@ -673,7 +719,7 @@ var G_pdf_xtractorfolder = Read_Ini_Setting("xtractor","pdffolder"); var G_ax_succeededfolder = Read_Ini_Setting("xtractor", "succeededfolder"); var G_ax_rejectedfolder = Read_Ini_Setting("xtractor", "rejectedfolder"); -// Identity Token instellingen voor de AX Saxton webservice 'CustomerPortalAX' +// Identity Token instellingen voor de AX Saxton webservice 'CustomerPortalAX' of Twinq token service var G_ID_saxton_url = Read_Ini_Setting("identityserver","token/url"); var G_ID_saxton_client_id = Read_Ini_Setting("identityserver","token/client_id"); var G_ID_saxton_client_secret = Read_Ini_Setting("identityserver","token/client_secret"); @@ -707,6 +753,8 @@ var G_mar_timeout = 0; //initieel 1e keer. __Log("***XML- ax/url(ServiceAX): " + G_ax_url_serviceax, 1); __Log("***XML- ax2012/url(SupplierService): " + G_ax2012_url, 1); __Log("***XML- ax2012/url(ServiceAX): " + G_ax2012_url_serviceax, 1); + __Log("***XML- ax365/url(SupplierService): " + G_ax365_url_supplierservice, 1); + __Log("***XML- ax365/url(ServiceAX): " + G_ax365_url_serviceax, 1); __Log("***XML- tobias/url: " + G_tobias_url, 1); __Log("***XML- facilitor/url: " + G_fclt_url, 1); __Log("***XML- facilitor/factuur/xmlfolder: " + G_fclt_factuur_xmlfolder, 1); @@ -714,6 +762,7 @@ var G_mar_timeout = 0; //initieel 1e keer. __Log("***XML- rems/opdrachtenfolder: " + G_rems_opdracht_xmlfolder, 1); __Log("***XML- rems/opdrachtstatusfolder: " + G_rems_opdrachtstatus_xmlfolder, 1); __Log("***XML- rems/facturenfolder: " + G_rems_facturen_xmlfolder, 1); + __Log("***XML- twinq/url: " + G_twinq_url, 1); __Log("***XML- identityserver/token/url: " + G_ID_saxton_url, 1); __Log("***XML- mareon/url: " + G_marx_url, 1); __Log("***XML- xtractor/xmlfolder: " + G_ax_xtractorfolder, 1); @@ -851,6 +900,11 @@ var G_mar_timeout = 0; //initieel 1e keer. __Log("REMS", 2); REMS_2_MAREON(); } + if (AX_or_Tobias() == "TQ") + { + __Log("TWINQ", 2); + MAREON_2_TWINQ(); + } if (G_ax_xtractorfolder != "") { FACILITOR_2_Xtractor(); diff --git a/ax/SRC/AxFacilitor.xml b/ax/SRC/AxFacilitor.xml index fda17dd..22ea385 100644 --- a/ax/SRC/AxFacilitor.xml +++ b/ax/SRC/AxFacilitor.xml @@ -59,6 +59,10 @@ 1 + + + + diff --git a/ax/SRC/Common.js b/ax/SRC/Common.js index 364c6f7..b337415 100644 --- a/ax/SRC/Common.js +++ b/ax/SRC/Common.js @@ -19,7 +19,9 @@ function AX_or_Tobias(){ else {if (G_ax365_url_supplierservice != "" || G_ax365_url_serviceax != "") return "A365"; else {if (G_fclt_url != "") return "F"; else {if (G_rems_opdracht_xmlfolder != "") return "R"; - else return ""; + else {if (G_twinq_url != "") return "TQ"; + else return ""; + } } } } @@ -291,6 +293,12 @@ function apiAX_GENERAL (v_API, v_req, v_type, v_soapAction, v_discard_active_abo } l_result = api2_AX365_inner(v_url, v_API, v_req, v_type, v_soapAction, v_discard_active_abort, v_soort_api, v_token); } + if (AX_or_Tobias() == "TQ") + { + var v_url = G_twinq_url; + var v_token = G_Token_saxton; + l_result = api2_TWINQ_inner(v_url, v_API, v_req, v_type, v_soapAction, v_discard_active_abort, v_soort_api, v_token); + } if (AX_or_Tobias() == "T") { // laatste parameter is runmethod, hier altijd 0 (= standaard runmethod van Tobias) @@ -732,7 +740,7 @@ function api2_AX365_inner (v_Url, v_API, v_req, v_type, v_soapAction, v_discard_ G_AX365_Allowed_Get_Token = G_AX365_Allowed_Get_Token - 1; switch (v_soort_api){ case 1: G_Token_supplierservice = A365_supplierservice_GetToken(); var l_token = G_Token_supplierservice; break; - case 2: G_Token_saxton = A2012_saxton_GetToken(); var l_token = G_Token_saxton; break; + case 2: G_Token_saxton = A365_saxton_GetToken(); var l_token = G_Token_saxton; break; } // We mogen nu de functie zelf nog eens aanroepen (iteratief). @@ -769,15 +777,143 @@ function api2_AX365_inner (v_Url, v_API, v_req, v_type, v_soapAction, v_discard_ } } +// Levert/retourneert een rij (struct) op van de volgende waarden: +// api_status_code: 0 of 1, 0 = fout gegaan, 1 = goed gegaan +// api_status_message: statustekst behorende bij status_code (http.statusText) +// api_response_message: response-berecht van webservice (api) die wordt aangeroepen. +function api2_TWINQ_inner (v_Url, v_API, v_req, v_type, v_soapAction, v_discard_active_abort, v_soort_api, v_token) +{ + __Log("api2_TWINQ_inner v_API: " + v_API, 3); + __Log("api2_TWINQ_inner v_type: " + v_type, 3); + __Log("api2_TWINQ_inner v_req: " + v_req, 3); + __Log("api2_TWINQ_inner v_discard_active_abort: " + v_discard_active_abort, 3); + __Log("api2_TWINQ_inner v_soort_api: " + v_soort_api, 3); + + var lResolve = 0; + var lConnect = 60 * 1000; + var lSend = 30 * 1000; -function apiIDentity (v_url, v_req, v_type, v_contenttype, v_discard_active_abort) + var xmlhttp = new ActiveXObject("MSXML2.ServerXMLHTTP.6.0"); + SXH_PROXY_SET_PROXY = 2; + if (typeof proxy != "undefined" && proxy) + xmlhttp.setProxy(SXH_PROXY_SET_PROXY, proxy); + + xmlhttp.open("POST", v_Url, false); + + __Log("api2_TWINQ_inner v_token: " + v_token, 4); + xmlhttp.setRequestHeader("Authorization", "Bearer " + v_token); + xmlhttp.setRequestHeader("Content-Type", "text/plain"); + var v_msg = v_req; + + __Log("api2_TWINQ_inner v_msg: " + v_msg, 4); + + if (G_mar_timeout != 0){ + //MARX#57502: AX Adapter robuuster maken, instelbare timeout + xmlhttp.setTimeouts(lResolve, lConnect, lSend, G_mar_timeout * 1000); + } + try { + xmlhttp.send(v_msg); + var txt = xmlhttp.responseText; + } + catch (e) + { + //MARX#57502: AX Adapter robuuster maken: Waarschijnlijk timeout-error + var txt = "api2_TWINQ_inner failed/timeout: " + e.description; + __Log(txt,1); + if (G_abort_http_error == 1) + { + MARXQUIT(v_discard_active_abort); + } + return {api_status_code: 0, api_status_message: "", api_response_message: txt}; + //return ""; + } + var l_statusText = xmlhttp.status + " " + xmlhttp.statusText; + + if (xmlhttp.status >= 200 && xmlhttp.status <= 299) + { + try + { + __Log("api2_TWINQ_inner XML Response = TRUE :", 3); + __Log("api2_TWINQ_inner XML Response :" + txt, 3); + return {api_status_code: 1, api_status_message: l_statusText, api_response_message: txt}; + //return txt; + } + catch (e) + { + // Waarschijnlijk http-error terug gekregen + return {api_status_code: 1, api_status_message: l_statusText, api_response_message: txt}; + //return ""; + } + } + else + { __Log("api2_TWINQ_inner XML Response = FALSE :",1); + __Log("api2_TWINQ_inner - HTTP <> 2xx",1); + __Log("api2_TWINQ_inner URL: " + v_Url,1); + __Log("api2_TWINQ_inner Message: " + v_msg.substr(0,4*1024),1); + __Log("api2_TWINQ_inner Status: "+ l_statusText,1); + l_resp = xmlhttp.responseText; + __Log("api2_TWINQ_inner ResponseText:" + l_resp,1); + + if (xmlhttp.status == 500 || xmlhttp.status == 401){ + // SupplierService geeft HTTP 500 in geval van Unauthorized, AX Saxton webservice 'CustomerPortalAX' geeft HTTP 401 + // Token expired? Kan heel goed mogelijk zijn, token heeft geldigheid van uur, en is om + // Als in response (dit is XML) de faultcode forbidden is, dan is dat het geval: + // a:Forbidden + // Bij HTTP401 (in geval CustomerPortalAX) is er geen XML die terugkomt. + // MARX#69545 Factuur scanning 365 werkt niet door update in Tobias 365, vandaar extra check op NativeErrorCode 1287 + if (xmlhttp.status == 401) { + // Forbidden gevonden, we doen een retry, door een nieuwe token op te halen / op te vragen, max. 3 x in een sync (G_AX365_Allowed_Get_Token > 0) + if (G_AX365_Allowed_Get_Token > 0){ + G_AX365_Allowed_Get_Token = G_AX365_Allowed_Get_Token - 1; + G_Token_saxton = TWINQ_GetToken(); var l_token = G_Token_saxton; + + + // We mogen nu de functie zelf nog eens aanroepen (iteratief). + l_result = api2_TWINQ_inner (v_Url, v_API, v_req, v_type, v_soapAction, v_discard_active_abort, v_soort_api, l_token); + return l_result; + } + else{ + __Log("api2_TWINQ_inner: Token problem, maximum van 3 pogingen zijn allemaal mislukt" ,1); + if (G_abort_http_error == 1) + { + MARXQUIT(v_discard_active_abort); + } + return {api_status_code: 0, api_status_message: l_statusText, api_response_message: txt}; + //return "" + } + + } + else{ + if (G_abort_http_error == 1) + { + MARXQUIT(v_discard_active_abort); + } + return {api_status_code: 0, api_status_message: l_statusText, api_response_message: txt}; + //return "" + } + } + else { + if (G_abort_http_error == 1) + { + MARXQUIT(v_discard_active_abort); + } + return {api_status_code: 0, api_status_message: l_statusText, api_response_message: txt}; + } + } +} + + + +function apiIDentity (v_url, v_req, v_type, v_contenttype, v_discard_active_abort, v_basic_authentication, v_secret) { __Log("apiIDentity v_url: " + v_url, 3); __Log("apiIDentity v_req: " + v_req, 3); __Log("apiIDentity v_type: " + v_type, 3); __Log("apiIDentity v_discard_active_abort: " + v_discard_active_abort, 3); + __Log("apiIDentity v_basic_authentication: " + v_basic_authentication, 3); + var lResolve = 0; var lConnect = 60 * 1000; @@ -791,6 +927,11 @@ function apiIDentity (v_url, v_req, v_type, v_contenttype, v_discard_active_abor xmlhttp.open("POST", v_url, false); xmlhttp.setRequestHeader("Content-Type", v_contenttype); + if (v_basic_authentication == 1) + { + __Log("apiIDentity l_secret: " + v_secret, 4); + xmlhttp.setRequestHeader("Authorization", "Basic " + v_secret); + } if (G_mar_timeout != 0){ //MARX#57502: AX Adapter robuuster maken, instelbare timeout @@ -1342,6 +1483,10 @@ function MARX_substr (v_str, v_char, v_last){ return l_result; } +function MARX_replaceAll(str, find, replace) { + return str.replace(new RegExp(find, 'g'), replace); +} + function STR_2_XML (v_str){ var xmldoc = new ActiveXObject("Msxml2.DOMDocument.6.0"); xmldoc.async = false; @@ -1393,6 +1538,159 @@ function __Log_XML(p_xmldoc, p_node, level){ } } +// Copied from \UTILS\PutOrders\puo_base64.js +function Base64Cls() +{ + // Private variabelen + this._keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" + + // Public functies + this.encode = _encode; + this.decode = _decode; + + + // private method for UTF-8 encoding + function utf8_encode(string) + { + string = string.replace(/\r\n/g,"\n"); + var utftext = ""; + + for (var n = 0; n < string.length; n++) + { + var c = string.charCodeAt(n); + + if (c < 128) + { + utftext += String.fromCharCode(c); + } + else if((c > 127) && (c < 2048)) + { + utftext += String.fromCharCode((c >> 6) | 192); + utftext += String.fromCharCode((c & 63) | 128); + } + else + { + utftext += String.fromCharCode((c >> 12) | 224); + utftext += String.fromCharCode(((c >> 6) & 63) | 128); + utftext += String.fromCharCode((c & 63) | 128); + } + } + return utftext; + } + + // private method for UTF-8 decoding + function utf8_decode(utftext) + { + var string = ""; + var i = 0; + var c = c1 = c2 = 0; + + while ( i < utftext.length ) + { + c = utftext.charCodeAt(i); + + if (c < 128) + { + string += String.fromCharCode(c); + i++; + } + else if((c > 191) && (c < 224)) + { + c2 = utftext.charCodeAt(i+1); + string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); + i += 2; + } + else + { + c2 = utftext.charCodeAt(i+1); + c3 = utftext.charCodeAt(i+2); + string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); + i += 3; + } + + } + return string; + } + + + function _encode(input) + { + var output = ""; + var chr1, chr2, chr3, enc1, enc2, enc3, enc4; + var i = 0; + + input = utf8_encode(input); + + while (i < input.length) + { + chr1 = input.charCodeAt(i++); + chr2 = input.charCodeAt(i++); + chr3 = input.charCodeAt(i++); + + enc1 = chr1 >> 2; + enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); + enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); + enc4 = chr3 & 63; + + if (isNaN(chr2)) + { + enc3 = enc4 = 64; + } + else if (isNaN(chr3)) + { + enc4 = 64; + } + + output = output + + this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + + this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4); + + } + return output; + } + + function _decode(input) + { + var output = ""; + var chr1, chr2, chr3; + var enc1, enc2, enc3, enc4; + var i = 0; + + input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); + + while (i < input.length) + { + enc1 = this._keyStr.indexOf(input.charAt(i++)); + enc2 = this._keyStr.indexOf(input.charAt(i++)); + enc3 = this._keyStr.indexOf(input.charAt(i++)); + enc4 = this._keyStr.indexOf(input.charAt(i++)); + + chr1 = (enc1 << 2) | (enc2 >> 4); + chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); + chr3 = ((enc3 & 3) << 6) | enc4; + + output = output + String.fromCharCode(chr1); + + if (enc3 != 64) + { + output = output + String.fromCharCode(chr2); + } + if (enc4 != 64) + { + output = output + String.fromCharCode(chr3); + } + } + output = utf8_decode(output); + + return output; + } + + +} + + + + function encodeBase64(p_bytes){ l_xml=new ActiveXObject("Msxml2.DOMDocument.6.0"); // Create temporary node with Base64 data type diff --git a/ax/SRC/F_GetOpdrachtenAcceptedRefused.js b/ax/SRC/F_GetOpdrachtenAcceptedRefused.js index f8837d4..59f63de 100644 --- a/ax/SRC/F_GetOpdrachtenAcceptedRefused.js +++ b/ax/SRC/F_GetOpdrachtenAcceptedRefused.js @@ -66,15 +66,15 @@ function F_GetOpdrachten_AcceptRefuse() v_mld_opdr_extrainfo = escapeXml(v_mld_opdr_extrainfo); if (v_srtnotificatie_code == 'ORDACP') { - GEN_AcceptServiceTask(v_company_id, v_taskId, v_externnr, v_mld_opdr_extrainfo); + GEN_AcceptServiceTask(v_company_id, "", "", v_taskId, v_externnr, v_mld_opdr_extrainfo); } if (v_srtnotificatie_code == 'ORDCAN') { - GEN_RefuseServiceTask(v_company_id, v_taskId, v_externnr, "GEWEIGERD", v_mld_opdr_extrainfo); + GEN_RefuseServiceTask(v_company_id, "", "", v_taskId, v_externnr, "GEWEIGERD", v_mld_opdr_extrainfo); } if (v_srtnotificatie_code == 'ORDANN') { - GEN_AnnuleerServiceTask(v_company_id, v_taskId, "ANN", v_externnr, v_mld_opdr_extrainfo, "-1"); + GEN_AnnuleerServiceTask(v_company_id, "", "", v_taskId, "ANN", v_externnr, v_mld_opdr_extrainfo, "-1"); } i = i + 1; @@ -83,7 +83,7 @@ function F_GetOpdrachten_AcceptRefuse() } } -function GEN_AcceptServiceTask(v_company_id, v_taskId, v_externnr, v_mld_opdr_extrainfo) +function GEN_AcceptServiceTask(v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_externnr, v_mld_opdr_extrainfo) { var v_resp; if (AX_or_Tobias() == "A") { @@ -101,13 +101,16 @@ function GEN_AcceptServiceTask(v_company_id, v_taskId, v_externnr, v_mld_opdr_ex if (AX_or_Tobias() == "F") { v_resp = FCLT_SetOpdrachtStatus (v_company_id, v_taskId, v_externnr, "ORDACP", ""); } - if (AX_or_Tobias() == "R") { + if (AX_or_Tobias() == "R") { v_resp = R_SetOpdrachtStatus (v_company_id, v_taskId, v_externnr, "ACC", "", v_mld_opdr_extrainfo); } + if (AX_or_Tobias() == "TQ") { + v_resp = TQ_SetOpdrachtStatus (v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_externnr, "ACC", v_mld_opdr_extrainfo, "-1"); + } return v_resp; } -function GEN_RefuseServiceTask(v_company_id, v_taskId, v_externnr, v_code_geweigerd, v_mld_opdr_extrainfo) +function GEN_RefuseServiceTask(v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_externnr, v_code_geweigerd, v_mld_opdr_extrainfo) { var v_resp; @@ -129,12 +132,14 @@ function GEN_RefuseServiceTask(v_company_id, v_taskId, v_externnr, v_code_geweig if (AX_or_Tobias() == "R") { v_resp = R_SetOpdrachtStatus (v_company_id, v_taskId, v_externnr, "WEI", "", v_mld_opdr_extrainfo); } - + if (AX_or_Tobias() == "TQ") { + v_resp = TQ_SetOpdrachtStatus (v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_externnr, "WEI", v_mld_opdr_extrainfo, "-1"); + } return v_resp; } -function GEN_AnnuleerServiceTask(v_company_id, v_taskId, v_statuscode, v_externnr, v_mld_opdr_extrainfo, v_date) +function GEN_AnnuleerServiceTask(v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_statuscode, v_externnr, v_mld_opdr_extrainfo, v_date) { var v_resp; @@ -156,6 +161,8 @@ function GEN_AnnuleerServiceTask(v_company_id, v_taskId, v_statuscode, v_externn if (AX_or_Tobias() == "R") { v_resp = R_SetOpdrachtStatus (v_company_id, v_taskId, v_externnr, v_statuscode, "", v_mld_opdr_extrainfo); } - + if (AX_or_Tobias() == "TQ") { + v_resp = TQ_SetOpdrachtStatus (v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_externnr, v_statuscode, v_mld_opdr_extrainfo, "-1"); + } return v_resp; } \ No newline at end of file diff --git a/ax/SRC/F_GetOpdrachtenAfgemeld.js b/ax/SRC/F_GetOpdrachtenAfgemeld.js index 47f677a..83885b3 100644 --- a/ax/SRC/F_GetOpdrachtenAfgemeld.js +++ b/ax/SRC/F_GetOpdrachtenAfgemeld.js @@ -51,7 +51,7 @@ function F_GetOpdrachten_Afgemeld() //MARX#56792: XML equivalent van & < > etc toepassen... v_extraInfo = escapeXml(v_extraInfo); - GEN_CompleteServiceTask(v_company_id, v_taskId, v_externnr, v_extraInfo, v_dateComplete); + GEN_CompleteServiceTask(v_company_id, "", "", v_taskId, v_externnr, v_extraInfo, v_dateComplete); i = i + 1; var strQuery = "//xml/mld_ordr[" + i + "]"; @@ -59,7 +59,7 @@ function F_GetOpdrachten_Afgemeld() } } -function GEN_CompleteServiceTask(v_company_id, v_taskId, v_externnr, v_extraInfo, v_dateComplete) +function GEN_CompleteServiceTask(v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_externnr, v_extraInfo, v_dateComplete) { var v_resp; @@ -81,6 +81,8 @@ function GEN_CompleteServiceTask(v_company_id, v_taskId, v_externnr, v_extraInfo if (AX_or_Tobias() == "R") { v_resp = R_SetOpdrachtStatus (v_company_id, v_taskId, v_externnr, "GER", v_dateComplete, v_extraInfo); } - + if (AX_or_Tobias() == "TQ") { + v_resp = TQ_SetOpdrachtStatus (v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_externnr, "GER", v_extraInfo, v_dateComplete); + } return v_resp; } diff --git a/ax/SRC/F_GetOpdrachtenFinancAfgerond.js b/ax/SRC/F_GetOpdrachtenFinancAfgerond.js index 816f7de..97f9341 100644 --- a/ax/SRC/F_GetOpdrachtenFinancAfgerond.js +++ b/ax/SRC/F_GetOpdrachtenFinancAfgerond.js @@ -82,6 +82,8 @@ function GEN_FinancAfrondenServiceTask(v_company_id, v_taskId, v_externnr, v_opd if (AX_or_Tobias() == "R") { v_resp = {api_status_code: 1, api_status_message: "", api_response_message: ""}; } - + if (AX_or_Tobias() == "TQ") { + v_resp = {api_status_code: 1, api_status_message: "", api_response_message: ""}; + } return v_resp; } \ No newline at end of file diff --git a/ax/SRC/F_GetOpdrachtenGepland.js b/ax/SRC/F_GetOpdrachtenGepland.js index 15ec055..b2c9dd7 100644 --- a/ax/SRC/F_GetOpdrachtenGepland.js +++ b/ax/SRC/F_GetOpdrachtenGepland.js @@ -52,7 +52,7 @@ function F_GetOpdrachten_Gepland() //MARX#56792: XML equivalent van & < > etc toepassen... v_extraInfo = escapeXml(v_extraInfo); - GEN_PlanServiceTask(v_company_id, v_taskId, v_externnr, v_extraInfo, v_date); + GEN_PlanServiceTask(v_company_id, "", "", v_taskId, v_externnr, v_extraInfo, v_date); i = i + 1; var strQuery = "//xml/mld_ordr[" + i + "]"; @@ -60,7 +60,7 @@ function F_GetOpdrachten_Gepland() } } -function GEN_PlanServiceTask(v_company_id, v_taskId, v_externnr, v_extraInfo, v_date) +function GEN_PlanServiceTask(v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_externnr, v_extraInfo, v_date) { var v_resp; if (AX_or_Tobias() == "A") { @@ -81,6 +81,8 @@ function GEN_PlanServiceTask(v_company_id, v_taskId, v_externnr, v_extraInfo, v_ if (AX_or_Tobias() == "R") { v_resp = R_SetOpdrachtStatus (v_company_id, v_taskId, v_externnr, "AFH", v_date, v_extraInfo); } - + if (AX_or_Tobias() == "TQ") { + v_resp = TQ_SetOpdrachtStatus (v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_externnr, "AFH", v_extraInfo, v_date); + } return v_resp; } \ No newline at end of file diff --git a/ax/SRC/F_GetOpdrachtenOnderbroken.js b/ax/SRC/F_GetOpdrachtenOnderbroken.js index b8a0377..08b4907 100644 --- a/ax/SRC/F_GetOpdrachtenOnderbroken.js +++ b/ax/SRC/F_GetOpdrachtenOnderbroken.js @@ -51,7 +51,7 @@ function F_GetOpdrachten_Onderbroken() //MARX#56792: XML equivalent van & < > etc toepassen... v_extraInfo = escapeXml(v_extraInfo); - GEN_OnderbreekServiceTask(v_company_id, v_taskId, v_statuscode, v_externnr, v_extraInfo, "-1"); + GEN_OnderbreekServiceTask(v_company_id, "", "", v_taskId, v_statuscode, v_externnr, v_extraInfo, "-1"); i = i + 1; var strQuery = "//xml/mld_ordr[" + i + "]"; @@ -60,7 +60,7 @@ function F_GetOpdrachten_Onderbroken() } -function GEN_OnderbreekServiceTask(v_company_id, v_taskId, v_statuscode, v_externnr, v_extraInfo, v_date) +function GEN_OnderbreekServiceTask(v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_statuscode, v_externnr, v_extraInfo, v_date) { var v_resp; if (AX_or_Tobias() == "A") { @@ -81,13 +81,15 @@ function GEN_OnderbreekServiceTask(v_company_id, v_taskId, v_statuscode, v_exter if (AX_or_Tobias() == "R") { v_resp = R_SetOpdrachtStatus (v_company_id, v_taskId, v_externnr, v_statuscode, "", v_extraInfo); } - + if (AX_or_Tobias() == "TQ") { + v_resp = TQ_SetOpdrachtStatus (v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_externnr, v_statuscode, v_extraInfo, v_date); + } return v_resp; } // Dezelfde functie als GEN_OnderbreekServiceTask, maar wordt alleen uitgevoerd als de onderbreek-status afwijkt van laatst gestuurde onderbreek-status, en nadat bericht is gestuurd, wordt deze laatste // onderbreekstatus in Mareon vastgelegd/geregistreerd, voor de volgende keer. -function GEN_Conditioneel_OnderbreekServiceTask (v_opdr_key, v_company_id, v_taskId, v_statuscode, v_externnr, v_extraInfo, v_date){ +function GEN_Conditioneel_OnderbreekServiceTask (v_opdr_key, v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_statuscode, v_externnr, v_extraInfo, v_date){ var v_resp; //Default gaan we ervan uit dat de response goed gaat/is, en dus de notify uit de queue kan... v_resp = {api_status_code: 1, api_status_message: "", api_response_message: ""}; @@ -96,7 +98,7 @@ function GEN_Conditioneel_OnderbreekServiceTask (v_opdr_key, v_company_id, v_tas v_laatste_statuscode_Mareon = F_GetOpdracht_Laatse_Onderbreekcode (v_opdr_key); if (v_statuscode != v_laatste_statuscode_Mareon){ // De statuscode die nu wordt gestuurd, wijkt af van de laatste statuscode, dus: opsturen naar ERP odprachtgever... - v_resp = GEN_OnderbreekServiceTask(v_company_id, v_taskId, v_statuscode, v_externnr, v_extraInfo, v_date); + v_resp = GEN_OnderbreekServiceTask(v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_statuscode, v_externnr, v_extraInfo, v_date); if (v_resp.api_status_code == 1){ // then goed verwerkt, stuur naar Mareon dat deze (laatst) gestuurde onderbreek-code naar ERP opdrachtgever goed is verwerkt, en registreer deze onderbreek-code, om dubbele berichten te voorkomen MARX_Send_Succes_Or_Failure(v_opdr_key, "OPDR_POST_ONDERBREEK", v_statuscode); diff --git a/ax/SRC/F_GetOpdrachtenOpmerking.js b/ax/SRC/F_GetOpdrachtenOpmerking.js index 12d1787..7e79e93 100644 --- a/ax/SRC/F_GetOpdrachtenOpmerking.js +++ b/ax/SRC/F_GetOpdrachtenOpmerking.js @@ -78,6 +78,9 @@ function GEN_SetSupplierText(v_company_id, v_taskId, v_externnr, v_extraInfo) if (AX_or_Tobias() == "R") { v_resp = R_SetOpdrachtStatus (v_company_id, v_taskId, v_externnr, "", "", v_extraInfo); } + if (AX_or_Tobias() == "TQ") { + v_resp = {api_status_code: 1, api_status_message: "", api_response_message: ""}; + } return v_resp; } diff --git a/ax/SRC/F_GetOpdrachtenStatussen.js b/ax/SRC/F_GetOpdrachtenStatussen.js index ede110b..632a129 100644 --- a/ax/SRC/F_GetOpdrachtenStatussen.js +++ b/ax/SRC/F_GetOpdrachtenStatussen.js @@ -154,6 +154,10 @@ function do_exec_opdrstatus(p_order, p_min_fac_tracking_datum_ordupd){ 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" @@ -226,7 +230,7 @@ function do_exec_opdrstatus(p_order, p_min_fac_tracking_datum_ordupd){ case "ORDACP": // Geaccepteerde opdracht - l_response = GEN_AcceptServiceTask(l_ax_company_id, l_mld_opdr_ordernr, l_mld_opdr_externnr, l_mld_opdr_opmerking); + 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": @@ -248,7 +252,7 @@ function do_exec_opdrstatus(p_order, p_min_fac_tracking_datum_ordupd){ // 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_ordernr, l_mld_opdr_onderbreek_code, l_mld_opdr_externnr, l_mld_opdr_opmerking, "-1"); + 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) @@ -278,7 +282,7 @@ function do_exec_opdrstatus(p_order, p_min_fac_tracking_datum_ordupd){ 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); + 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 @@ -289,7 +293,7 @@ function do_exec_opdrstatus(p_order, p_min_fac_tracking_datum_ordupd){ case "ORDPL2": // Gewijzigde Eind Plandatum bij opdracht if (l_mld_opdr_plandatum2 != ""){ - l_response = GEN_VerlengServiceTask(l_ax_company_id, l_mld_opdr_ordernr, "VER", l_mld_opdr_externnr, l_mld_opdr_opmerking, 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 @@ -299,21 +303,21 @@ function do_exec_opdrstatus(p_order, p_min_fac_tracking_datum_ordupd){ case "ORDHLT": // Opdracht is onderbroken - l_response = GEN_Conditioneel_OnderbreekServiceTask(l_mld_opdr_key, l_ax_company_id, l_mld_opdr_ordernr, l_mld_opdr_onderbreek_code, l_mld_opdr_externnr, l_mld_opdr_opmerking, "-1"); + 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_mld_opdr_ordernr, "UIT", l_mld_opdr_externnr, l_mld_opdr_opmerking, "-1"); + 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_mld_opdr_ordernr, l_mld_opdr_externnr, "GEWEIGERD", l_mld_opdr_opmerking); + 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_mld_opdr_ordernr, "ANN", l_mld_opdr_externnr, l_mld_opdr_opmerking, "-1"); + 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; diff --git a/ax/SRC/F_GetOpdrachtenUitvoer.js b/ax/SRC/F_GetOpdrachtenUitvoer.js index 3fb5892..bee0631 100644 --- a/ax/SRC/F_GetOpdrachtenUitvoer.js +++ b/ax/SRC/F_GetOpdrachtenUitvoer.js @@ -47,7 +47,7 @@ function F_GetOpdrachten_Uitvoer() //MARX#56792: XML equivalent van & < > etc toepassen... v_extraInfo = escapeXml(v_extraInfo); - GEN_UitvoeringServiceTask(v_company_id, v_taskId, "UIT", v_externnr, v_extraInfo, "-1"); + GEN_UitvoeringServiceTask(v_company_id, "", "", v_taskId, "UIT", v_externnr, v_extraInfo, "-1"); i = i + 1; var strQuery = "//xml/mld_ordr[" + i + "]"; @@ -55,7 +55,7 @@ function F_GetOpdrachten_Uitvoer() } } -function GEN_UitvoeringServiceTask(v_company_id, v_taskId, v_statuscode, v_externnr, v_extraInfo, v_date) +function GEN_UitvoeringServiceTask(v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_statuscode, v_externnr, v_extraInfo, v_date) { var v_resp; if (AX_or_Tobias() == "A") { @@ -76,16 +76,18 @@ function GEN_UitvoeringServiceTask(v_company_id, v_taskId, v_statuscode, v_exter if (AX_or_Tobias() == "R") { v_resp = R_SetOpdrachtStatus (v_company_id, v_taskId, v_externnr, v_statuscode, "", v_extraInfo); } - + if (AX_or_Tobias() == "TQ") { + v_resp = TQ_SetOpdrachtStatus (v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_externnr, v_statuscode, v_extraInfo, v_date); + } return v_resp; } // Dezelfde functie als GEN_UitvoeringServiceTask, maar nadat bericht is gestuurd, wordt deze laatste onderbreekstatus in Mareon gewist, voor de volgende keer altijd (=onvoorwaardelijk) een onderbreekcode wordt gestuurd. -function GEN_UitvoeringServiceTask_ResetOnderbreek (v_opdr_key, v_company_id, v_taskId, v_statuscode, v_externnr, v_extraInfo, v_date){ +function GEN_UitvoeringServiceTask_ResetOnderbreek (v_opdr_key, v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_statuscode, v_externnr, v_extraInfo, v_date){ var v_resp; //Default gaan we ervan uit dat de response goed gaat/is, en dus de notify uit de queue kan... - v_resp = GEN_UitvoeringServiceTask(v_company_id, v_taskId, v_statuscode, v_externnr, v_extraInfo, v_date); + v_resp = GEN_UitvoeringServiceTask(v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_statuscode, v_externnr, v_extraInfo, v_date); if (v_resp.api_status_code == 1){ // then goed verwerkt, stuur naar Mareon dat de (laatst) gestuurde onderbreek-code naar ERP opdrachtgever gewist/gedelete kan worden. MARX_Send_Succes_Or_Failure(v_opdr_key, "OPDR_POST_ONDERBREEK", ""); diff --git a/ax/SRC/F_GetOpdrachtenVerlengd.js b/ax/SRC/F_GetOpdrachtenVerlengd.js index b98f719..a8bd2b6 100644 --- a/ax/SRC/F_GetOpdrachtenVerlengd.js +++ b/ax/SRC/F_GetOpdrachtenVerlengd.js @@ -50,7 +50,7 @@ function F_GetOpdrachten_Verlengd() //MARX#56792: XML equivalent van & < > etc toepassen... v_extraInfo = escapeXml(v_extraInfo); - GEN_VerlengServiceTask(v_company_id, v_taskId, "VER", v_externnr, v_extraInfo, v_date); + GEN_VerlengServiceTask(v_company_id, "", "", v_taskId, "VER", v_externnr, v_extraInfo, v_date); i = i + 1; var strQuery = "//xml/mld_ordr[" + i + "]"; @@ -58,7 +58,7 @@ function F_GetOpdrachten_Verlengd() } } -function GEN_VerlengServiceTask(v_company_id, v_taskId, v_statuscode, v_externnr, v_extraInfo, v_date) +function GEN_VerlengServiceTask(v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_statuscode, v_externnr, v_extraInfo, v_date) { var v_resp; if (AX_or_Tobias() == "A") { @@ -79,6 +79,8 @@ function GEN_VerlengServiceTask(v_company_id, v_taskId, v_statuscode, v_externnr if (AX_or_Tobias() == "R") { v_resp = R_SetOpdrachtStatus (v_company_id, v_taskId, v_externnr, v_statuscode, v_date, v_extraInfo); } - + if (AX_or_Tobias() == "TQ") { + v_resp = TQ_SetOpdrachtStatus (v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_externnr, v_statuscode, v_extraInfo, v_date); + } return v_resp; } diff --git a/ax/SRC/TQ_SetOpdrachtStatus.js b/ax/SRC/TQ_SetOpdrachtStatus.js new file mode 100644 index 0000000..56b37df --- /dev/null +++ b/ax/SRC/TQ_SetOpdrachtStatus.js @@ -0,0 +1,144 @@ +// -------------------------------------------------------------------------------------- +// TQ_SetOpdrachtStatus.js +// Copyright 2021 Facilitor. 053-4800 700, helpdesk@mareon.nl +// Written by MB +// + +//Berichtvoorbeeld +//Voorbeeld Body: dit is een SALES005 ketenstandaard MaintenanceStatus XML-bericht: +// + + +// +// +//1234 +//2021-12-16 +//10:27:30 +// +// 8712345000011 +// +// +// 8712345000004 +// +// +// ION000001 +// GER +// 2021-12-15 +// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +// +// 2018-07-17 Afspraakdatum +// 00:00:00 Afspraaktijd +// +// 2018-07-16 +// 00:00:00 +// 2018-07-18 Verlengingsdatum +// 00:00:00 Verlengingstijd +// +// +// +// + +// v_company_id is AX365 bedrijf-id +// v_statuscode is een van de vaste/afgesproken (ketenstandaard) statuscode, bv ACC, GER, etc +// v_purchId is het opdracht/ION nr van AX365 +// v_extraInfo is optionele tekst +// v_dateTime is datum/tijd veld die bij sommige statuscodes verplicht is, bv bij die van GER (gereeddatum/tijd) +// v_communicatie_logboek_vereist(waarde 0/1) geeft aan of in AX365 het zg. "communicatielogboek" moet zijn ingericht (nee=0, ja=1) voor betreffende status 'v_statuscode', +// wanneer waarde 0 dan altijd communicatie, en bij waarde 1 betekent dat G_mar_communicatielogboek moet aanstaan, zo niet, dan wordt de status niet aan AX365 gestuurd (maar geskipt) + +function TQ_SetOpdrachtStatus (v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_purchId, v_statuscode, v_extraInfo, v_dateTime) +{ + //default gaan we ervan uit dat de communcatie goed verloopt (lekker positief ingesteld ;-) + var v_resp = {api_status_code: 1, api_status_message: "", api_response_message: ""}; + __Log("TQ_SetOpdrachtStatus: " + "Start", 2); + __Log("v_company_id: " + v_company_id, 2); + __Log("v_woco_gln: " + v_woco_gln, 2); + __Log("v_lev_gln: " + v_lev_gln, 2); + __Log("v_taskId: " + v_taskId, 2); + __Log("v_purchId: " + v_purchId, 2); + __Log("v_statuscode: " + v_statuscode, 2); + __Log("v_dateTime: " + v_dateTime, 2); + + if (v_dateTime == "-1") + { + // met v_dateTime gelijk aan -1 willen we de datumtime xml niet opnemen in de request! + v_dateTime = ""; + } + else + { + v_dateTime = v_dateTime; // e.g.: 2021-12-17T12:00:00 + } + + + var l_timestamp = displayTimeStamp() //yyyy-mm-ddThh_mi_ss_iii (jaar-maand-dagTuur_min_sec_millisec): 23 tekens + + l_msg_id = l_timestamp.substr(2); // 21 tekens + l_msg_id = MARX_replaceAll(l_msg_id, "-", "");//19 tekens + l_msg_id = MARX_replaceAll(l_msg_id, "_", "");//17 tekens + l_msg_id = MARX_replaceAll(l_msg_id, "T", "");//15 tekens + + // Returns a random integer from 0 to 99 // 2 tekens + var l_random = Math.floor(Math.random() * 100); + var l_msg_id = l_msg_id + l_random; // max. 17 tekens + + var l_msg_date = l_timestamp.substr(0,10); //yyyy-mm-dd + var l_msg_time = l_timestamp.substr(11,8) + l_msg_time = MARX_replaceAll(l_msg_time, "_", ":"); //hh:mi:ss + + var v_req = "" + + "" + l_msg_id + "" + + "" + l_msg_date + "" + + "" + l_msg_time + "" + + "" + + "" + v_woco_gln + "" + + "" + + "" + + "" + v_lev_gln + "" + + "" + + "" + + "" + v_purchId + "" + + "" + v_statuscode + ""; + + var l_dateTime_datum = v_dateTime.substr(0,10); + var l_dateTime_tijd = v_dateTime.substr(11,8); + + if (v_statuscode == "GER" && l_dateTime_datum != "") + { // Alleen bij gereedmelden opdrachten (technisch afmelden) komt in SALES005 de DateReady in de vorm van YYYY-MM-DD mee... + v_req = v_req + "" + l_dateTime_datum + ""; + } + if (v_extraInfo != "") + { + v_req = v_req + "" + v_extraInfo + ""; + } + if ((v_statuscode == "AFH" || v_statuscode == "VER") && l_dateTime_datum != "") + { + v_req = v_req + ""; + if (v_statuscode == "AFH") + { + v_req = v_req + "" + l_dateTime_datum + ""; // Afspraakdatum + v_req = v_req + "" + l_dateTime_tijd + "";// Afspraakdatum + } + if (v_statuscode == "VER") + { + v_req = v_req + ""; + v_req = v_req + "" + l_dateTime_datum + ""; // Verlengingsdatum + v_req = v_req + "" + l_dateTime_tijd + ""; // Verlengingstijd + v_req = v_req + ""; + } + v_req = v_req + ""; + } + v_req = v_req + ""; + v_req = v_req + ""; + + __Log("v_req: " + v_req, 2); + + var v_API = ""; + var v_type = 0; + var v_soapAction = ""; + var v_discard_active_abort = 1; //In geval van 500-error, geen active abort... + var v_soort_api = 2; + var v_resp = apiAX_GENERAL(v_API, v_req, v_type, v_soapAction, v_discard_active_abort, v_soort_api); + + __Log("TQ_SetOpdrachtStatus: " + "End", 2); + return v_resp; +} \ No newline at end of file