MARX#76415 DO-koppeling Viewpoint (Itris) - Mareon obv DICO/Ketenstandaard

svn path=/Mareon/trunk/; revision=58867
This commit is contained in:
Marcel Bourseau
2023-01-29 21:39:28 +00:00
parent 407f86a873
commit aae513ec21
12 changed files with 556 additions and 86 deletions

View File

@@ -46,6 +46,10 @@ function FCLT_Sync_END(){
// TwinQ
F_PutSync(2);
break;
case "3RD":
// 3RD PARTY
F_PutSync(2);
break;
default:
F_PutSync(1);
}
@@ -246,6 +250,14 @@ function MARX_2_TWINQ_Facturen(){
F_GetFacturen_TWINQ();
}
// ----------------------------- #RD PARTY functies -----------------------------------------
function MARX_2_3RDPARTY_OpdrachtStatus(){
F_GetOpdrachten_Statussen();
}
function MARX_2_3RDPARTY_Facturen(){
F_GetFacturen_3RDPARTY();
}
// ----------------------------- Xtractor functies -----------------------------------------
function FCLT_2_AX_Facturen(){
@@ -663,6 +675,29 @@ function MAREON_2_TWINQ()
}
}
function MAREON_2_3RDPARTY()
{
if (G_push_notifyqueue == "1")
{
__Log("*** START MAREON --> 3RD PARTY ***", 2);
//start "push/notifyqueue"
__Log("*** START MAREON --> 3RD PARTY : Verwerken van ALLE opdrachtstatussen uit Mareon naar 3RD PARTY obv notifyqueue ***", 2);
MARX_2_3RDPARTY_OpdrachtStatus();
__Log("*** END", 2);
__Log("*** START MAREON --> 3RD PARTY: Facturen uit Mareon naar 3RD PARTY ***", 2);
MARX_2_3RDPARTY_Facturen();
__Log("*** END", 2);
__Log("*** END MAREON --> 3RD PARTY ***", 2);
}
else{
//Geen "push/notifyqueue" ingesteld
__Log("*** NQ staat niet in gesteld, de koppeling naar 3RD PARTY staat uit ***", 1);
}
}
function FACILITOR_2_Xtractor()
@@ -696,7 +731,7 @@ function FACILITOR_2_Xtractor()
// 1.63 -- MARX#73648: Factuur wordt telkens weer (oneindig) aan REMS aangeboden
// 1.64 -- MARX#69028: Uitvalfacturen toch naar het prefacturen register.
// 1.65 -- MARX#74749: Mareon Sync heel traag na MARX23.
// 1.66 -- MARX#74444: Het '&' teken in de naam van een bijlage wordt niet ondersteund in de sync.
// 1.70 -- MARX#76415: Mareon koppeling met 3rd Party Viewpoint + MARX#74444: Het '&' teken in de naam van een bijlage wordt niet ondersteund in de sync.
var G_Mareon_Adapter = "1.66";
//MARX#56643: Test Haagwonen inkoopordernummer ontbreekt in Mareon ION001753
@@ -728,6 +763,11 @@ var G_Token_saxton = "";
var G_twinq_url = Read_Ini_Setting("twinq","url");
var G_3party_id = Read_Ini_Setting("thirdparty","id");
var G_3party_export_folder = Read_Ini_Setting("thirdparty","exportfolder");
var G_3party_dico_version = Read_Ini_Setting("thirdparty","dico/version");
var G_3party_dico_ms_version = Read_Ini_Setting("thirdparty","dico/messageservice/version");
// 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;
@@ -790,7 +830,11 @@ 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- twinq/url: " + G_twinq_url, 1);
__Log("***XML- thirdparty/id: " + G_3party_id, 1);
__Log("***XML- thirdparty/exportfolder: " + G_3party_export_folder, 1);
__Log("***XML- thirdparty/dico/version: " + G_3party_dico_version, 1);
__Log("***XML- thirdparty/dico/messageservice/version: " + G_3party_dico_ms_version, 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);
@@ -933,6 +977,11 @@ var G_mar_timeout = 0; //initieel 1e keer.
__Log("TWINQ", 2);
MAREON_2_TWINQ();
}
if (AX_or_Tobias() == "3P")
{
__Log("3RD PARTY", 2);
MAREON_2_3RDPARTY();
}
if (G_ax_xtractorfolder != "")
{
FACILITOR_2_Xtractor();

View File

@@ -91,6 +91,20 @@
<opdrachtstatusfolder>c:\rems\opdrstatxml\</opdrachtstatusfolder>
<facturenfolder>c:\rems\facturenxml\</facturenfolder>
</rems>
<thirdparty>
<!-- Id of Naam van 3rd Party (ERP)system, b.v. ViewPoint -->
<id></id>
<exportfolder></exportfolder>
<dico>
<!-- DICO versie, bv 005 -->
<version></version>
<!-- Wordt er gebruikt gemaakt van MessageService in de communicatie? -->
<messageservice>
<!-- MessageService versie, b.v. 2.4, 3.0 of 3.1 -->
<version></version>
</messageservice>
</dico>
</thirdparty>
<xtractor>
<xmlfolder>c:\xtractor\xml\</xmlfolder>
<pdffolder>c:\xtractor\pdf\</pdffolder>

View File

@@ -20,7 +20,9 @@ function AX_or_Tobias(){
else {if (G_fclt_url != "") return "F";
else {if (G_rems_opdracht_xmlfolder != "") return "R";
else {if (G_twinq_url != "") return "TQ";
else return "";
else {if (G_3party_id != "") return "3P";
else return "";
}
}
}
}
@@ -299,6 +301,11 @@ function apiAX_GENERAL (v_API, v_req, v_type, v_soapAction, v_discard_active_abo
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() == "3P")
{
var v_url = G_ID_saxton_url;
l_result = api_3P_inner(v_url, v_API, v_req, v_type, v_soapAction, v_discard_active_abort, v_soort_api);
}
if (AX_or_Tobias() == "T")
{
// laatste parameter is runmethod, hier altijd 0 (= standaard runmethod van Tobias)
@@ -903,6 +910,287 @@ function api2_TWINQ_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 api_3P_inner (v_Url, v_API, v_req, v_type, v_soapAction, v_discard_active_abort, v_soort_api)
{
__Log("api2_3P_inner v_API: " + v_API, 3);
__Log("api2_3P_inner v_type: " + v_type, 3);
__Log("api2_3P_inner v_req: " + v_req, 3);
__Log("api2_3P_inner v_discard_active_abort: " + v_discard_active_abort, 3);
__Log("api2_3P_inner v_soort_api: " + v_soort_api, 3);
var v_msg = v_req;
if (G_3party_dico_ms_version != "")
{
v_msg = DICO_Add_MessageService (G_3party_dico_ms_version, G_3party_dico_version, v_msg);
}
__Log("api2_3P_inner v_msg: " + v_msg, 4);
if (v_Url != "")
{
var lResolve = 0;
var lConnect = 60 * 1000;
var lSend = 30 * 1000;
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);
xmlhttp.setRequestHeader("Content-Type", "text/plain");
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_3P_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_3P_inner XML Response = TRUE :", 3);
__Log("api2_3P_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_3P_inner XML Response = FALSE :",1);
__Log("api2_3P_inner - HTTP <> 2xx",1);
__Log("api2_3P_inner URL: " + v_Url,1);
__Log("api2_3P_inner Message: " + v_msg.substr(0,4*1024),1);
__Log("api2_3P_inner Status: "+ l_statusText,1);
l_resp = xmlhttp.responseText;
__Log("api2_3P_inner ResponseText:" + l_resp,1);
}
}
if (G_3party_export_folder != "")
{ // er is een export-folder, waarin we de XML wegschrijven
var l_random = Math.floor(Math.random() * 1000000); // 6 cijfers
WriteText2File(G_3party_export_folder, G_3party_id + l_random , "xml" , v_msg, 1, 1);
return {api_status_code: 1, api_status_message: l_statusText, api_response_message: txt};
}
}
// v_woco_gln is GLN van opdrachtgever
// v_lev_gln is GLN van leverancier
// v_purchId is het opdracht/ION nr van opdrachtgever
// v_statuscode is een van de vaste/afgesproken (ketenstandaard) statuscode, bv ACC, GER, etc
// v_extraInfo is optionele tekst
// v_dateTime is datum/tijd veld die bij sommige statuscodes verplicht is, bv bij die van GER (gereeddatum/tijd)
function DICO_StatusBericht (v_woco_gln, v_lev_gln, v_purchId, v_statuscode, v_extraInfo, v_dateTime)
{
//Berichtvoorbeeld
//Voorbeeld Body: dit is een SALES005 ketenstandaard MaintenanceStatus XML-bericht:
//
//<?xml version="1.0" encoding="utf-8"?>
//<MaintenanceStatus xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.ketenstandaard.nl/onderhoudsstatus/SALES/005" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ketenstandaard.nl/onderhoudsstatus/SALES/005 Onderhoudsstatus_SALES005.xsd">
//<MessageNumber>1234</MessageNumber>
//<MessageDate>2021-12-16</MessageDate>
//<MessageTime>10:27:30</MessageTime>
//<Buyer>
// <GLN>8712345000011</GLN>
//</Buyer>
//<Contractor>
// <GLN>8712345000004</GLN>
//</Contractor>
//<InstructionData>
// <InstructionNumber>ION000001</InstructionNumber>
// <Status>GER</Status>
// <DateReady>2021-12-15</DateReady>
// <FreeText>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</FreeText>
// <AppointmentDateTimeInformation>
// <RequiredDeliveryDate>2018-07-17</RequiredDeliveryDate> Afspraakdatum
// <RequiredDeliveryTime>00:00:00</RequiredDeliveryTime> Afspraaktijd
// <DeliveryTimeFrame>
// <DeliveryDateEarliest>2018-07-16</DeliveryDateEarliest>
// <DeliveryTimeEarliest>00:00:00</DeliveryTimeEarliest>
// <DeliveryDateLatest>2018-07-18</DeliveryDateLatest> Verlengingsdatum
// <DeliveryTimeLatest>00:00:00</DeliveryTimeLatest> Verlengingstijd
// </DeliveryTimeFrame>
// </AppointmentDateTimeInformation>
//</InstructionData>
//</MaintenanceStatus>
__Log("DICO_StatusBericht: " + "Start", 2);
__Log("v_woco_gln: " + v_woco_gln, 2);
__Log("v_lev_gln: " + v_lev_gln, 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_msg_id = MARX_Get_Msg_ID();
var l_timestamp = displayTimeStamp() //yyyy-mm-ddThh_mi_ss_iii (jaar-maand-dagTuur_min_sec_millisec): 23 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 = "<MaintenanceStatus xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"http://www.ketenstandaard.nl/onderhoudsstatus/SALES/005\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.ketenstandaard.nl/onderhoudsstatus/SALES/005 Onderhoudsstatus_SALES005.xsd\">"
+ "<MessageNumber>" + l_msg_id + "</MessageNumber>"
+ "<MessageDate>" + l_msg_date + "</MessageDate>"
+ "<MessageTime>" + l_msg_time + "</MessageTime>"
+ "<Buyer>"
+ "<GLN>" + v_woco_gln + "</GLN>"
+ "</Buyer>"
+ "<Contractor>"
+ "<GLN>" + v_lev_gln + "</GLN>"
+ "</Contractor>"
+ "<InstructionData>"
+ "<InstructionNumber>" + v_purchId + "</InstructionNumber>"
+ "<Status>" + v_statuscode + "</Status>";
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 + "<DateReady>" + l_dateTime_datum + "</DateReady>";
}
if (v_extraInfo != "")
{
v_req = v_req + "<FreeText>" + v_extraInfo + "</FreeText>";
}
if ((v_statuscode == "AFH" || v_statuscode == "VER") && l_dateTime_datum != "")
{
v_req = v_req + "<AppointmentDateTimeInformation>";
if (v_statuscode == "AFH")
{
v_req = v_req + "<RequiredDeliveryDate>" + l_dateTime_datum + "</RequiredDeliveryDate>"; // Afspraakdatum
v_req = v_req + "<RequiredDeliveryTime>" + l_dateTime_tijd + "</RequiredDeliveryTime>";// Afspraakdatum
}
if (v_statuscode == "VER")
{
v_req = v_req + "<DeliveryTimeFrame>";
v_req = v_req + "<DeliveryDateLatest>" + l_dateTime_datum + "</DeliveryDateLatest>"; // Verlengingsdatum
v_req = v_req + "<DeliveryTimeLatest>" + l_dateTime_tijd + "</DeliveryTimeLatest>"; // Verlengingstijd
v_req = v_req + "</DeliveryTimeFrame>";
}
v_req = v_req + "</AppointmentDateTimeInformation>";
}
v_req = v_req + "</InstructionData>";
v_req = v_req + "</MaintenanceStatus>";
__Log("v_req: " + v_req, 2);
__Log("DICO_StatusBericht: " + "End", 2);
return v_req;
}
function DICO_Add_MessageService(p_ms_version, p_dico_version, p_req_xml){
var l_msg_id = MARX_Get_Msg_ID();
var l_timestamp = displayTimeStamp() //yyyy-mm-ddThh_mi_ss_iii (jaar-maand-dagTuur_min_sec_millisec): 23 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 l_MsgType="";
p_req_xml_str = "" + p_req_xml;
if (p_req_xml_str.search("MaintenanceInstruction") != -1)
{
l_MsgType = "MTNINS"
}
if (p_req_xml_str.search("MaintenanceStatus") != -1)
{
l_MsgType = "MTNSTA"
}
if (p_req_xml_str.search("Invoice") != -1)
{
l_MsgType = "INVOIC"
}
switch (p_ms_version)
{
case "2.4":
break;
case "3.0":
break;
case "3.1":
var v_msg =
'<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="https://www.ketenstandaard.nl/WS/MessageService/3.1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">'
+ '<soap:Header>'
+ ' <ns:CustomInfo>'
+ ' <ns:IsTestMessage>false</ns:IsTestMessage>'
+ ' <!-- Optional: -->'
+ ' <ns:LanguageCode>NL</ns:LanguageCode>'
+ ' <ns:IsContentCompressed>false</ns:IsContentCompressed>'
+ ' <ns:ApplicationId>Mareon</ns:ApplicationId>'
+ ' <ns:VersionId>SYNC' + G_Mareon_Adapter + '</ns:VersionId>'
+ ' <ns:RelationId>Mareon</ns:RelationId>'
+ ' </ns:CustomInfo>'
+ ' <wsse:Security>'
+ ' <wsse:UsernameToken>'
+ ' <wsse:Username>' + v_ID_client_id + '</wsse:Username>'
+ ' <wsse:Password>' + v_ID_client_secret + '</wsse:Password>'
+ ' </wsse:UsernameToken>'
+ ' </wsse:Security>'
+ '</soap:Header>'
+ '<soap:Body>'
+ ' <ns:Message>'
+ ' <ns:MsgProperties>'
+ ' <ns:MsgId>' + l_msg_id + '</ns:MsgId>'
+ ' <ns:MsgDateTime>' + l_msg_date + 'T' + l_msg_time + '</ns:MsgDateTime>'
+ ' <ns:MsgFormat>SALES</ns:MsgFormat>'
+ ' <ns:MsgVersion>'+ p_dico_version + '</ns:MsgVersion>'
+ ' <ns:MsgType>' + l_MsgType + '</ns:MsgType>'
+ ' </ns:MsgProperties>'
+ ' <ns:MsgContent><![CDATA[' + p_req_xml + ']]></ns:MsgContent>'
+ ' </ns:Message>'
+ '</soap:Body>'
+ '</soap:Envelope>';
break;
default:
// Geen bekende MessageService
__Log("Onbekende versie MessageService !!", 1);
var v_msg = p_req_xml;
}
return v_msg;
}
function apiIDentity (v_url, v_req, v_type, v_contenttype, v_discard_active_abort, v_basic_authentication, v_secret)
@@ -1487,6 +1775,18 @@ function MARX_replaceAll(str, find, replace) {
return str.replace(new RegExp(find, 'g'), replace);
}
function MARX_Get_Msg_ID() {
var l_timestamp = displayTimeStamp() //yyyy-mm-ddThh_mi_ss_iii (jaar-maand-dagTuur_min_sec_millisec): 23 tekens
var 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, "_", "");//16 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);
return (l_msg_id + l_random); // max. 17 tekens
}
function STR_2_XML (v_str){
var xmldoc = new ActiveXObject("Msxml2.DOMDocument.6.0");
xmldoc.async = false;

View File

@@ -748,3 +748,137 @@ function F_GetFacturen_TWINQ()
}
}
function F_GetFacturen_3RDPARTY()
{
var v_API = "FACT4_SALES005";
var v_APIKEY = G_marx_apikey;
var v_req = "<GetFACT4_SALES005_NQ><adapterversion>" + G_Mareon_Adapter + "</adapterversion></GetFACT4_SALES005_NQ>"
var v_type = 1; // xml
var v_soap_envelop = 1; //soap-envelop eromheen
var v_resp = apiFCLT(G_marx_url, v_API, v_APIKEY, v_req, v_type, v_soap_envelop, 0);
__Log("F_GetFacturen_3RDPARTY: " + v_resp.text, 4);
var l_tmp_namespace = "sales"; // Deze tijdelijke en dummy namespace (truuk) met letters mb had van alles kunnen zijn, en is nodig om een goede query op Invoice te doen,
// want in de XML staat de default namespace (zonder prefix dus). Als we dit NIET doen, wordt er niets gequeryd uit XML!! En gaat het dus fout!
// namespace=http://www.ketenstandaard.nl/factuur/SALES/005
v_resp.setProperty ("SelectionNamespaces", "xmlns:" + l_tmp_namespace + "='http://www.ketenstandaard.nl/factuur/SALES/005'");
// SPlitsen van XML's...
var i = 1;
var strQuery = "//batch/fin_factuur[" + i + "]";
l_deelxml = v_resp.selectSingleNode(strQuery);
while (l_deelxml)
{
var l_strQuery_fin_factuur_key = strQuery + "/fin_factuur_key";
var l_fin_factuur_key = v_resp.selectSingleNode(l_strQuery_fin_factuur_key).text;
__Log("l_fin_factuur_key: " + l_fin_factuur_key, 3);
var l_strQuery_fac_notificatie_key = strQuery + "/fac_notificatie_key";
var l_fac_notificatie_key = v_resp.selectSingleNode(l_strQuery_fac_notificatie_key).text;
__Log("l_fac_notificatie_key: " + l_fac_notificatie_key, 3);
var l_strQuery_prs_send_invoice_2_woco = strQuery + "/prs_send_invoice_2_woco";
var l_prs_send_invoice_2_woco = v_resp.selectSingleNode(l_strQuery_prs_send_invoice_2_woco).text;
__Log("l_prs_send_invoice_2_woco: " + l_prs_send_invoice_2_woco, 3);
if (l_prs_send_invoice_2_woco == "0")
{ // Factuur niet naar opdrachtgever sturen, is niet gewenst aldaar! De factuur wordt dus niet verwerkt (door opdrachtgever).
// We moeten de factuur alleen uit de NQ halen, zowel in geval van NQ als classic SYNC (niet NQ), zodat die de volgende keer niet weer hier langs komt.
// En verder niets doen, dus status (waarschijnlijk incompleet) gewoon zo laten, de factuur is immers niet verwerkt door en/of verstuurd naar opdrachtgever!!
// Behalve nog nav "MARX#74749 Mareon Sync heel traag na MARX23" het veld fin_factuur_externsyncdate vullen...
MARX_Send_Succes_Or_Failure(l_fin_factuur_key, "FIN_FACTUUR_SET_EXTERNSYNCDATE", "");
var v_result = {api_status_code: 1, api_status_message: "", api_response_message: ""};
post_do_exec_notification(l_fac_notificatie_key, v_result);
}
else
{ // Factuur WEL naar opdrachtgever sturen, is erg gewenst aldaar! De factuur wordt dus WEL verwerkt (door opdrachtgever).
// Eerst nog de Facilitor/Mareon headers van de XML eraf halen om de SALES005 over te houden.
var strUBLQuery = "//" + l_tmp_namespace + ":Invoice";
var tmp_xml = STR_2_XML(l_deelxml.xml);
__Log("F_GetFacturen_3RDPARTY: tmp_xml " + tmp_xml.xml, 4);
tmp_xml.setProperty ("SelectionNamespaces", "xmlns:" + l_tmp_namespace + "='http://www.ketenstandaard.nl/factuur/SALES/005'");
var l_sales005_xml = tmp_xml.selectSingleNode(strUBLQuery);
__Log("F_GetFacturen_3RDPARTY: l_sales005_xml " + l_sales005_xml, 3);
l_pdf_base64 = F_Get_Base64_FactuurFile(l_fin_factuur_key);
if (l_pdf_base64 != ""){
// De node Attachment in de XML.
var strUBLQuery = "//" + l_tmp_namespace + ":Invoice" + "/" + l_tmp_namespace + ":Attachment";
var node_attachment = l_sales005_xml.selectSingleNode(strUBLQuery);
if (node_attachment.length != 0){
// De node Attachment in de XML bestaat dus.
__Log("XML node Attachment exists", 3);
// De node AttachedData in XMLResult gaat inhoud krijgen met de base64 tekenreeks.
var strUBLQuery = "//" + l_tmp_namespace + ":Invoice" + "/" + l_tmp_namespace + ":Attachment" + "/" + l_tmp_namespace + ":AttachedData";
var node_attached_data = l_sales005_xml.selectSingleNode(strUBLQuery);
if (node_attached_data.length != 0){
__Log("XML node AttachedData exists", 3);
node_attached_data.text=l_pdf_base64;
}
else {
__Log("XML node AttachedData does NOT exist",2);
newEle = v_resp.createElement(l_tmp_namespace + ":AttachedData");
__Log("XML element AttachedData created",3);
newTxt = v_resp.createTextNode(l_pdf_base64);
__Log("XML textnode with base64 data created",3);
newEle.appendChild(newTxt);
__Log("XML element AttachedData with textnode",3);
node_attachment.appendChild(newEle);
__Log("XML element added to XML",3);
}
}
}
var XMLResult = "<?xml version=\"1.0\"?>" + l_sales005_xml.xml;
if (G_log_level >= 4 && G_fclt_factuur_xmlfolder != ''){
WriteText2File(G_fclt_factuur_xmlfolder, "3rdparty[" + i + "]" , "xml" , XMLResult, 1, 1);
}
// Send factuur-XML to 3RDPARTY
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_result = apiAX_GENERAL (v_API, XMLResult, v_type, v_soapAction, v_discard_active_abort, v_soort_api);
var l_statuscode = v_result.api_status_code;
var l_statustekst = v_result.api_status_message;
var l_reponsetekst = v_result.api_response_message;
if (l_statuscode == 1){
// Factuur is goed verwerkt door 3RDPARTY
// Dan de factuur op verwerkt zetten en evt de auto-close van bijbehorende opdracht, dus call van MARX_Send_Succes_Or_Failure
MARX_Send_Succes_Or_Failure(l_fin_factuur_key, "FIN_FACTUUR_POST_SUCCESS", "");
//en natuurlijk de factuur uit de notifyqueue verwijderen...
post_do_exec_notification(l_fac_notificatie_key, v_result);
__Log("3RDPARTY factuurverwerking succesvol",3);
}
else{
var l_extra_omschr = l_statustekst + " - " + l_reponsetekst;
l_extra_omschr = l_extra_omschr.substr(0, 4000);
// de factuur voorzien van een failure in notifyqueue + ORDTRK met de response-fout
post_do_exec_notification(l_fac_notificatie_key, v_result);
__Log("3RDPARTY factuurverwerking NIET succesvol",1);
}
}
i = i + 1;
var strQuery = "//batch/fin_factuur[" + i + "]";
l_deelxml = v_resp.selectSingleNode(strQuery);
}
}

View File

@@ -107,6 +107,9 @@ function GEN_AcceptServiceTask(v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_
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");
}
if (AX_or_Tobias() == "3P") {
v_resp = THIRDP_SetOpdrachtStatus (v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_externnr, "ACC", v_mld_opdr_extrainfo, "-1");
}
return v_resp;
}
@@ -135,6 +138,9 @@ function GEN_RefuseServiceTask(v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_
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");
}
if (AX_or_Tobias() == "3P") {
v_resp = THIRDP_SetOpdrachtStatus (v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_externnr, "WEI", v_mld_opdr_extrainfo, "-1");
}
return v_resp;
}
@@ -161,8 +167,11 @@ function GEN_AnnuleerServiceTask(v_company_id, v_woco_gln, v_lev_gln, v_taskId,
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") {
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");
}
if (AX_or_Tobias() == "3P") {
v_resp = THIRDP_SetOpdrachtStatus (v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_externnr, v_statuscode, v_mld_opdr_extrainfo, "-1");
}
return v_resp;
}

View File

@@ -84,5 +84,8 @@ function GEN_CompleteServiceTask(v_company_id, v_woco_gln, v_lev_gln, v_taskId,
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);
}
if (AX_or_Tobias() == "3P") {
v_resp = THIRDP_SetOpdrachtStatus (v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_externnr, "GER", v_extraInfo, v_dateComplete);
}
return v_resp;
}

View File

@@ -84,5 +84,8 @@ function GEN_PlanServiceTask(v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_ex
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);
}
if (AX_or_Tobias() == "3P") {
v_resp = THIRDP_SetOpdrachtStatus (v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_externnr, "AFH", v_extraInfo, v_date);
}
return v_resp;
}

View File

@@ -84,6 +84,9 @@ function GEN_OnderbreekServiceTask(v_company_id, v_woco_gln, v_lev_gln, v_taskId
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);
}
if (AX_or_Tobias() == "3P") {
v_resp = THIRDP_SetOpdrachtStatus (v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_externnr, v_statuscode, v_extraInfo, v_date);
}
return v_resp;
}

View File

@@ -78,9 +78,11 @@ 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") {
if (AX_or_Tobias() == "TQ") {
v_resp = {api_status_code: 1, api_status_message: "", api_response_message: ""};
}
if (AX_or_Tobias() == "3P") {
v_resp = {api_status_code: 1, api_status_message: "", api_response_message: ""};
}
return v_resp;
}

View File

@@ -79,6 +79,9 @@ function GEN_UitvoeringServiceTask(v_company_id, v_woco_gln, v_lev_gln, v_taskId
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);
}
if (AX_or_Tobias() == "3P") {
v_resp = THIRDP_SetOpdrachtStatus (v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_externnr, v_statuscode, v_extraInfo, v_date);
}
return v_resp;
}

View File

@@ -82,5 +82,8 @@ function GEN_VerlengServiceTask(v_company_id, v_woco_gln, v_lev_gln, v_taskId, v
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);
}
if (AX_or_Tobias() == "3P") {
v_resp = THIRDP_SetOpdrachtStatus (v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_externnr, v_statuscode, v_extraInfo, v_date);
}
return v_resp;
}

View File

@@ -51,86 +51,7 @@ function TQ_SetOpdrachtStatus (v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_
//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 = "<MaintenanceStatus xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"http://www.ketenstandaard.nl/onderhoudsstatus/SALES/005\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.ketenstandaard.nl/onderhoudsstatus/SALES/005 Onderhoudsstatus_SALES005.xsd\">"
+ "<MessageNumber>" + l_msg_id + "</MessageNumber>"
+ "<MessageDate>" + l_msg_date + "</MessageDate>"
+ "<MessageTime>" + l_msg_time + "</MessageTime>"
+ "<Buyer>"
+ "<GLN>" + v_woco_gln + "</GLN>"
+ "</Buyer>"
+ "<Contractor>"
+ "<GLN>" + v_lev_gln + "</GLN>"
+ "</Contractor>"
+ "<InstructionData>"
+ "<InstructionNumber>" + v_purchId + "</InstructionNumber>"
+ "<Status>" + v_statuscode + "</Status>";
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 + "<DateReady>" + l_dateTime_datum + "</DateReady>";
}
if (v_extraInfo != "")
{
v_req = v_req + "<FreeText>" + v_extraInfo + "</FreeText>";
}
if ((v_statuscode == "AFH" || v_statuscode == "VER") && l_dateTime_datum != "")
{
v_req = v_req + "<AppointmentDateTimeInformation>";
if (v_statuscode == "AFH")
{
v_req = v_req + "<RequiredDeliveryDate>" + l_dateTime_datum + "</RequiredDeliveryDate>"; // Afspraakdatum
v_req = v_req + "<RequiredDeliveryTime>" + l_dateTime_tijd + "</RequiredDeliveryTime>";// Afspraakdatum
}
if (v_statuscode == "VER")
{
v_req = v_req + "<DeliveryTimeFrame>";
v_req = v_req + "<DeliveryDateLatest>" + l_dateTime_datum + "</DeliveryDateLatest>"; // Verlengingsdatum
v_req = v_req + "<DeliveryTimeLatest>" + l_dateTime_tijd + "</DeliveryTimeLatest>"; // Verlengingstijd
v_req = v_req + "</DeliveryTimeFrame>";
}
v_req = v_req + "</AppointmentDateTimeInformation>";
}
v_req = v_req + "</InstructionData>";
v_req = v_req + "</MaintenanceStatus>";
__Log("v_req: " + v_req, 2);
var v_req = DICO_StatusBericht (v_woco_gln, v_lev_gln, v_purchId, v_statuscode, v_extraInfo, v_dateTime);
var v_API = "";
var v_type = 0;
@@ -141,4 +62,30 @@ function TQ_SetOpdrachtStatus (v_company_id, v_woco_gln, v_lev_gln, v_taskId, v_
__Log("TQ_SetOpdrachtStatus: " + "End", 2);
return v_resp;
}
function THIRDP_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("THIRDP_SetOpdrachtStatus: " + "Start", 2);
switch (G_3party_id)
{
case "ViewPoint":
var v_req = DICO_StatusBericht (v_woco_gln, v_lev_gln, v_purchId, v_statuscode, v_extraInfo, v_dateTime);
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);
break;
default:
// Geen bekend Applicatie
__Log("THIRDP_SetOpdrachtStatus: " + "UNKNOWN 3D PARTY!!", 1);
var v_resp = {api_status_code: 0, api_status_message: "", api_response_message: "UNKNOWN 3D PARTY"};
}
__Log("THIRDP_SetOpdrachtStatus: " + "End", 2);
return v_resp;
}