Files
Mareon/ax/SRC/F_GetFacturen.js
Marcel Bourseau 65a65a9f8c MARX#81188 Toevoegen van nieuwe factuurvelden in de JSON structuur voor T365
svn path=/Mareon/trunk/; revision=62725
2023-11-27 12:47:49 +00:00

1195 lines
57 KiB
JavaScript

// --------------------------------------------------------------------------------------
// F_GetFacturen.js
// Copyright 2014 SG|facilitor. 053-4800 700, helpdesk@sgfacilitor.nl
// Written by MB (2014)
//
// MAREON Connector/Adapter Ax -> FACILITOR en Facilitor -> Ax
// --------------------------------------------------------------------------------------
function F_GetFacturen_AX()
{
var v_API = "FACT4AX_XTRACTOR";
var v_APIKEY = G_marx_apikey;
if (G_push_notifyqueue == "0"){
var v_req = "<GetFACT4AX_XTRACTOR><adapterversion>" + G_Mareon_Adapter + "</adapterversion><APIkey>" + v_APIKEY + "</APIkey></GetFACT4AX_XTRACTOR>"
}
else{
//start else-tak "push/notifyqueue"
var v_req = "<GetFACT4AX_XTRACTOR_NQ><adapterversion>" + G_Mareon_Adapter + "</adapterversion></GetFACT4AX_XTRACTOR_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_AX: " + v_resp.text, 4);
if (G_ax_xtractorfolder != "" && G_pdf_xtractorfolder == ""){
__Log("G_pdf_xtractorfolder niet gevuld", 1);
}
// SPlitsen van XML's...
var i = 1;
var strQuery = "//batch/document[" + i + "]";
l_deelxml = v_resp.selectSingleNode(strQuery);
while (l_deelxml)
{
var l_strQuery_fin_factuur_key = "//batch/fin_factuur_key[" + i + "]";
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 = "//batch/fac_notificatie_key[" + i + "]";
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 = "//batch/prs_send_invoice_2_woco[" + i + "]";
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);
var XMLResult = "<?xml version=\"1.0\"?>"
+"<batch>"
+ l_deelxml.xml
+ "</batch>";
if (G_ax_xtractorfolder != "") {
WriteText2File(G_ax_xtractorfolder, "xtractor[" + i + "]" , "xml" , XMLResult, 1, 1);
}
if (G_pdf_xtractorfolder != "")
{
__Log("PDF_2_XTRACTOR", 3);
// Nu nog indien aanwezig de factuurPDF downloaden
F_GetFactuurFiles(G_pdf_xtractorfolder, l_fin_factuur_key);
}
// Direct sending Xtractor format to AX2012 via webservice (in AX2009 this is done by FileWatcher)
if (AX_or_Tobias() == "A12") {
A2012_Xtractor2AX(XMLResult, "xtractor[" + i + "]");
}
// Direct sending Xtractor format to AX365 via webservice
if (AX_or_Tobias() == "A365") {
A365_Xtractor2AX(v_resp, i, l_deelxml, l_fin_factuur_key, l_fac_notificatie_key, l_prs_send_invoice_2_woco);
}
i = i + 1;
var strQuery = "//batch/document[" + i + "]";
l_deelxml = v_resp.selectSingleNode(strQuery);
}
}
function F_GetFacturen_FCLT()
{
var v_API = "FACT4_FACILITOR";
var v_APIKEY = G_marx_apikey;
if (G_push_notifyqueue == "0"){
var v_req = "<GetFACT4_FACILITOR><adapterversion>" + G_Mareon_Adapter + "</adapterversion><APIkey>" + v_APIKEY + "</APIkey></GetFACT4_FACILITOR>"
}
else{
//start else-tak "push/notifyqueue"
var v_req = "<GetFACT4_FACILITOR_NQ><adapterversion>" + G_Mareon_Adapter + "</adapterversion></GetFACT4_FACILITOR_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_FCLT: " + v_resp.text, 4);
if (G_fclt_factuur_pdffolder == ""){
__Log("G_fclt_factuur_pdffolder niet gevuld", 1);
}
// SPlitsen van XML's...
var i = 1;
var strQuery = "//batch/fin_factuur[" + i + "]";
l_deelxml = v_resp.selectSingleNode(strQuery);
while (l_deelxml)
{
__Log("PDF_2_FACILITOR", 3);
var l_strQuery_fin_factuur_key = "//batch/fin_factuur_key[" + i + "]";
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 = "//batch/fac_notificatie_key[" + i + "]";
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 = "//batch/prs_send_invoice_2_woco[" + i + "]";
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).
l_pdf_base64 = F_Get_Base64_FactuurFile(l_fin_factuur_key);
if (l_pdf_base64 != ""){
// De node Attachment in de XML.
var node_attachment = l_deelxml.getElementsByTagName("Attachment");
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 node_attached_data = l_deelxml.getElementsByTagName("AttachedData");
if (node_attached_data.length != 0){
__Log("XML node AttachedData exists", 3);
var y = node_attached_data.childNodes[0];
if (y != null){
y.nodeValue = l_pdf_base64;
}
}
else {
__Log("XML node AttachedData does NOT exist",2);
newEle = v_resp.createElement("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[0].appendChild(newEle);
__Log("XML element added to XML",3);
}
}
}
var XMLResult = "<?xml version=\"1.0\"?>" + l_deelxml.xml;
if (G_log_level >= 4){
WriteText2File(G_fclt_factuur_xmlfolder, "facilitor[" + i + "]" , "xml" , XMLResult, 1, 1);
}
// Send factuur-XML to Facilitor
var v_API = "MARX_FIN_FACTUUR";
var v_type = 1;
var v_soapAction = "";
var v_soort_api = 1; // (nav MARX#61048: Documenten versturen van Mareon naar AX) is waarde 1 (oude/huidige api via SupplierService) of waarde 2 (nieuwe api via CustomerPortalAX)
var v_result = apiAX_GENERAL (v_API, XMLResult, v_type, v_soapAction, 1, 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 Facilitor
if (G_push_notifyqueue == "0"){
MARX_Send_Succes_Or_Failure(l_fin_factuur_key, "FIN_FACTUUR_POST_SUCCESS", "");
}
else{
//start else-tak "push/notifyqueue", ook 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 extra de factuur uit de notifyqueue verwijderen...
post_do_exec_notification(l_fac_notificatie_key, v_result);
}
__Log("Facilitor factuurverwerking succesvol",3);
}
else{
var l_extra_omschr = l_statustekst + " - " + l_reponsetekst;
l_extra_omschr = l_extra_omschr.substr(0, 4000);
if (G_push_notifyqueue == "0"){
MARX_Send_Succes_Or_Failure(l_fin_factuur_key, "FIN_FACTUUR_POST_FAIL", l_extra_omschr)
}
else{
//start else-tak "push/notifyqueue": alleen de factuur voorzien van een failure in notifyqueue + ORDTRK met de response-fout
post_do_exec_notification(l_fac_notificatie_key, v_result);
}
__Log("Facilitor factuurverwerking NIET succesvol",1);
}
}
i = i + 1;
var strQuery = "//batch/fin_factuur[" + i + "]";
l_deelxml = v_resp.selectSingleNode(strQuery);
}
}
function F_GetFacturen_Tobias()
{
var v_API = "FACT4_TOBIAS";
var v_APIKEY = G_marx_apikey;
var v_req = "<GetFACT4_TOBIAS><APIkey>" + v_APIKEY + "</APIkey></GetFACT4_TOBIAS>"
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_Tobias: " + v_resp.text,4);
// SPlitsen van XML's...
var i = 1;
var strQuery = "//batch/Factuurinfo[" + i + "]";
l_deelxml = v_resp.selectSingleNode(strQuery);
while (l_deelxml)
{
var v_API = "$RUNSTREAM";
var v_req = "<![CDATA[<?xml version=\"1.0\"?>"
+ "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><SOAP-ENV:Body>"
+ "<sg:AanbiedenFactuur xmlns:sg=\"urn:x-sg-1.0\" >"
+ l_deelxml.xml
+ "</sg:AanbiedenFactuur>"
+ "</SOAP-ENV:Body></SOAP-ENV:Envelope>]]>";
var v_type = 0;
// laatste parameter is runmethod, hier 1 (= afwijkend van de standaard runmethod van Tobias, hier wordt runstream gebruikt.)
l_result = api2Tobias(G_tobias_url, v_API, v_req, v_type, 1);
i = i + 1;
var strQuery = "//batch/Factuurinfo[" + i + "]";
l_deelxml = v_resp.selectSingleNode(strQuery);
}
}
function F_GetFacturen_REMS()
{
var v_API = "FACT4_REMS_UBL21";
var v_APIKEY = G_marx_apikey;
if (G_push_notifyqueue == "0"){
var v_req = "<GetFACT4_REMS_UBL21><adapterversion>" + G_Mareon_Adapter + "</adapterversion><APIkey>" + v_APIKEY + "</APIkey></GetFACT4_REMS_UBL21>"
}
else{
//start else-tak "push/notifyqueue"
var v_req = "<GetFACT4_REMS_UBL21_NQ><adapterversion>" + G_Mareon_Adapter + "</adapterversion></GetFACT4_REMS_UBL21_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);
//v_resp.setProperty ("SelectionNamespaces", "xmlns='urn:oasis:names:specification:ubl:schema:xsd:Invoice-2' xmlns:cbc='urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2' xmlns:cac='urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2' xmlns:ext='urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2' xmlns:qdt='urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2' xmlns:udt='urn:un:unece:uncefact:data:draft:UnqualifiedDataTypes:2'");
// SPlitsen van XML's...
var i = 1;
var strQuery = "//batch/fin_factuur[" + i + "]";
l_deelxml = v_resp.selectSingleNode(strQuery);
while (l_deelxml)
{ __Log("F_GetFacturen_REMS Splits Factuur nr " + i , 3);
//Nu de (prefix) van de bestandsnaam bepalen...
var l_strQuery_xml_file_name = strQuery + "/xml_file_name";
l_xml_file_node = v_resp.selectSingleNode(l_strQuery_xml_file_name);
var l_xml_file_name_prefix = "";
if (l_xml_file_node){
l_xml_file_name_prefix = l_xml_file_node.text + "_";
}
__Log("l_xml_file_name_prefix: " + l_xml_file_name_prefix, 2);
//Eerst de factuur-key bepalen...
var l_strQuery_fin_factuur_key = strQuery + "/fin_factuur_key";
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";
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).
// De node Attachment in de XML = cac:Attachment
var node_attachment = l_deelxml.getElementsByTagName("cac:Attachment");
if (node_attachment.length != 0)
{
// De node Attachment in de XML bestaat dus.
__Log("XML node Attachment exists",3);
// We kunnen de eventuele PDF aan de factuur ophalen,
if (l_fin_factuur_key != ""){
// Nu halen de indien aanwezig de gekoppelde factuur-PDF op...
l_pdf_base64 = F_Get_Base64_FactuurFile(l_fin_factuur_key);
__Log("F_GetFacturen_REMS l_pdf_base64:" + l_pdf_base64 ,4);
if (l_pdf_base64 != ""){
// De node EmbeddedDocumentBinaryObject in XMLResult gaat inhoud krijgen met de base64 tekenreeks.
//<cbc:EmbeddedDocumentBinaryObject mimeCode="application/pdf"></cbc:EmbeddedDocumentBinaryObject>
var node_attached_data = l_deelxml.getElementsByTagName("cbc:EmbeddedDocumentBinaryObject");
if (node_attached_data.length != 0){
__Log("F_GetFacturen_REMS: XML node cbc:EmbeddedDocumentBinaryObject exists",3);
var y = node_attached_data.childNodes[0];
if (y != null){
y.nodeValue = l_pdf_base64;
__Log("F_GetFacturen_REMS: XML node met base64 gevuld",2);
}
}
else {
__Log("F_GetFacturen_REMS: XML node cbc:EmbeddedDocumentBinaryObject does NOT exist",2);
newEle = v_resp.createElement("cbc:EmbeddedDocumentBinaryObject");
newAtt = v_resp.createAttribute("mimeCode");
newAtt.value="application/pdf";
newEle.setAttributeNode(newAtt);
__Log("F_GetFacturen_REMS: XML element cbc:EmbeddedDocumentBinaryObject created",3);
newTxt = v_resp.createTextNode(l_pdf_base64);
__Log("F_GetFacturen_REMS: XML textnode with base64 data created",3);
newEle.appendChild(newTxt);
__Log("F_GetFacturen_REMS: XML element cbc:EmbeddedDocumentBinaryObject with textnode",3);
node_attachment[0].appendChild(newEle);
__Log("F_GetFacturen_REMS: XML element added to XML",3);
}
}
}
}
// Eerst nog de Facilitor/Mareon headers van de XML eraf halen om de UBL over te houden.
var l_tmp_namespace = "mb"; // 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!
var strUBLQuery = "//" + l_tmp_namespace + ":Invoice";
var tmp_xml = STR_2_XML(l_deelxml.xml);
__Log("F_GetFacturen_REMS: tmp_xml " + tmp_xml.xml, 4);
tmp_xml.setProperty ("SelectionNamespaces", "xmlns:" + l_tmp_namespace + "='urn:oasis:names:specification:ubl:schema:xsd:Invoice-2'");
var l_ubl_xml = tmp_xml.selectSingleNode(strUBLQuery);
__Log("F_GetFacturen_REMS: l_ubl_xml " + l_ubl_xml, 3);
var XMLResult = "<?xml version=\"1.0\"?>" + l_ubl_xml.xml;
WriteText2File(G_rems_facturen_xmlfolder, l_xml_file_name_prefix + "mareon[" + i + "]" , "xml" , XMLResult, 1, 1);
// MARX#73648 Factuur wordt telkens weer (oneindig) aan REMS aangeboden
if (G_push_notifyqueue == "0"){
//Zet de factuur op verwerkt (niet meer achteraf in SYNC END, maar nu al
MARX_Send_Succes_Or_Failure(l_fin_factuur_key, "FIN_FACTUUR_POST_SUCCESS", "");
}
else{
//start else-tak "push/notifyqueue", ook 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 extra de factuur uit de notifyqueue verwijderen...
var v_result = {api_status_code: 1, api_status_message: "", api_response_message: ""};
post_do_exec_notification(l_fac_notificatie_key, v_result);
}
__Log("REMS factuurverwerking succesvol",3);
}
i = i + 1;
var strQuery = "//batch/fin_factuur[" + i + "]";
l_deelxml = v_resp.selectSingleNode(strQuery);
}
}
function F_GetFactuurFiles(p_folder, p_fin_factuur_key)
{
// FF voor de test naar uwv op work/trunk, mareon op labs is nog 2015.1 (wacht op 2015.2 stuff)
//var factuurkey = 98225;
//var G_marx_url = 'http://uwva.facws001/trunk/';
var url = G_marx_url + "api2/invoices/" + p_fin_factuur_key + ".json?scope=fo&include=custom_fields";
var v_suppress_req_logging = 0; // Logging van request, indien dat gewenst is, niet onderdrukken.
var objXMLHTTP = FcltAPI2(G_marx_apikey, "GET", url, "", 0, v_suppress_req_logging);
if (objXMLHTTP)
{
__Log("F_GetFactuurFiles: GET", 2);
var data = eval ("(" + objXMLHTTP.responseText + ")");
__Log("Factuur data :" + data, 4);
if ("invoice" in data && "custom_fields" in data.invoice)
{ __Log("Factuur data : invoice", 3);
for (var fld in data.invoice.custom_fields)
{ __Log("Factuur custom_fields: fld", 3);
var attarr = data.invoice.custom_fields[fld].attachments;
if (attarr)
{ __Log("Factuur attachments: attarr", 3);
for (var i = 0; i < attarr.length; i++)
{
__Log("File: " + attarr[i].name,2);
__Log("Size: " + attarr[i].size,2);
__Log("Url: " + attarr[i].content_url,2);
var fileXMLHTTP = FcltAPI2(G_marx_apikey, "GET", attarr[i].content_url, "", 0, v_suppress_req_logging);
if (fileXMLHTTP)
{
var fileStream = new ActiveXObject("ADODB.Stream");
fileStream.Type = 1; // adTypeBinary
fileStream.Open();
fileStream.Write(fileXMLHTTP.responseBody);
//Bestandsnaam wordt in p_folder bewaard, met de naam als volgt:
// 1. Vaste (harde) prefix 'mareon'
// 2. Underscore '_'
// 3. Unieke fin_factuur_key
// 4. Underscore '_'
// 5. Naam zoals leverancier die heeft geupload (handmatig of via SidB oid).
// Voorbeeld: mareon_123_mijnfactuur.pdf,
// !!Deze pdf-naam MOET(!!!) ook in de Xtractor XML worden opgeleverd, want deze gaat 1-op-1 Xtractor in!!!!
fileStream.SaveToFile(p_folder + "mareon_" + p_fin_factuur_key + "_" + attarr[i].name, 2); // 2=overwrite
fileStream.Close();
}
}
}
}
}
}
else
{
__Log("F_GetFactuurFiles 1: " + objXMLHTTP.responseText,2);
__Log("F_GetFactuurFiles 2: " + objXMLHTTP.status, 2);
}
}
function F_Get_Base64_FactuurFile(p_fin_factuur_key)
{
var url = G_marx_url + "api2/invoices/" + p_fin_factuur_key + ".json?scope=fo&include=custom_fields&fileencoding=base64";
var l_base64 = '';
var v_suppress_req_logging = 0; // Logging van request, indien dat gewenst is, niet onderdrukken.
var objXMLHTTP = FcltAPI2(G_marx_apikey, "GET", url, "", 0, v_suppress_req_logging);
if (objXMLHTTP)
{
__Log("F_Get_Base64_FactuurFile: GET", 2);
var data = eval ("(" + objXMLHTTP.responseText + ")");
__Log("F_Get_Base64_FactuurFile Factuur data :" + data,4);
if ("invoice" in data && "custom_fields" in data.invoice)
{ __Log("F_Get_Base64_FactuurFile Factuur data : invoice",3);
for (var fld in data.invoice.custom_fields)
{ __Log("F_Get_Base64_FactuurFile Factuur custom_fields: fld",3);
var attarr = data.invoice.custom_fields[fld].attachments;
if (attarr && attarr.length > 0)
{ __Log("F_Get_Base64_FactuurFile Factuur attachments: attarr",3);
// Alleen de eerste, er is als het goed is maar 1 bestand.
l_base64 = attarr[0].content_base64;
__Log("F_Get_Base64_FactuurFile Factuur base 64 bestand: " + l_base64,4);
}
}
}
}
return l_base64;
}
// Bepaalt uit de Xtractor-XML de company-ID waar de factuur naar toe gestuurd moet worden (dwz AX-nr waarvoor de factuur bestemd is)
function Xtractor_2_CompanyID (p_xml)
{
var strQuery_document = "//document/fields/DOCUMENT";
var v_buyer_axid = p_xml.selectSingleNode(strQuery_document + "/EX_SGBDR").text;
return v_buyer_axid;
}
function Xtractor_2_PreInvoice (p_xml, p_pdf_base64)
{
// Voorbeeld van PreInvoice JSON structuur
//{
// "amountHigh": 0,
// "amountLow": 0,
// "amountNoTax": 0,
// "autoIncasso": true,
// "bankAccountId": "string",
// "bookDate": "2023-06-19T10:42:49.281Z",
// "buyer": {
// "address": "string",
// "city": "string",
// "name": "string",
// "zipCode": "string"
// },
// "chamberOfCommerceNumber": "string",
// "deliveryDate": "2023-06-19T10:42:49.281Z",
// "description": "string",
// "documentFileName": "string",
// "failure": "string",
// "failureDesc": "string",
// "g_Account": "string",
// "g_Amount": 0,
// "invoiceAmount": 0,
// "invoiceBase64": "string",
// "invoiceDate": "2023-06-19T10:42:49.281Z",
// "invoiceNumber": "string",
// "invoiceSource": "string",
// "invoiceSourceNum": "string",
// "paymId": "string",
// "specs": [
// {
// "amount": 0,
// "articleId": "string",
// "chargedTo": "string",
// "id": "string",
// "lineNum": 0,
// "lineQuanity": 0,
// "location": "string",
// "orderArtOms": <string>,
// "typeId": "string",
// "unit": "string",
// "vatIndicator": "string"
// }
// ],
// "taxAmountHigh": 0,
// "taxAmountLow": 0,
// "taxDate": "2023-06-19T10:42:49.281Z",
// "taxShifted": true,
// "vatNumber": "string",
// "vendor": {
// "address": "string",
// "city": "string",
// "name": "string",
// "zipCode": "string"
// }
//}
var strQuery_amount = "//document/fields/AMOUNT";
var strQuery_document = "//document/fields/DOCUMENT";
var strQuery_corsa = "//document/fields/CORSA";
var strQuery_docfile = "//document/docfile";
var v_amountHigh_txt = p_xml.selectSingleNode(strQuery_amount + "/EX_SGGHOOG").text;
var v_amountHigh = 0;
if (v_amountHigh_txt != "")
{
v_amountHigh = parseFloat(v_amountHigh_txt.replace(/,/,'.'));
}
var v_amountLow_txt = p_xml.selectSingleNode(strQuery_amount + "/EX_SGGLAAG").text;
var v_amountLow = 0;
if (v_amountLow_txt != "")
{
v_amountLow = parseFloat(v_amountLow_txt.replace(/,/,'.'));
}
var v_amountNoTax_txt = p_xml.selectSingleNode(strQuery_amount + "/EX_SGGONBEL").text;
var v_amountNoTax = 0;
if (v_amountNoTax_txt != "")
{
var v_amountNoTax = parseFloat(v_amountNoTax_txt.replace(/,/,'.'));
}
var v_autoIncasso_txt = p_xml.selectSingleNode(strQuery_document + "/EX_SGAINC").text;
var v_autoIncasso = Boolean(v_autoIncasso_txt == "Ja");
var v_bankAccountId = p_xml.selectSingleNode(strQuery_corsa + "/EX_BANKACC_1").text;
var v_invoiceDate_txt = p_xml.selectSingleNode(strQuery_document + "/EX_INVOICEDATE").text;
var v_invoiceDate = v_invoiceDate_txt.substr(6,4) + "-" + v_invoiceDate_txt.substr(3,2) + "-" + v_invoiceDate_txt.substr(0,2) + "T12:00:00Z"; // Knetterhard ergens midden op de dag (is toch dont care)
var v_bookDate = v_invoiceDate;
var v_taxDate = v_invoiceDate;
var v_buyer_address = p_xml.selectSingleNode(strQuery_document + "/EX_SGBDR_ADRES").text;
var v_buyer_city = p_xml.selectSingleNode(strQuery_document + "/EX_SGBDR_PLAATS").text;
var v_buyer_name = p_xml.selectSingleNode(strQuery_document + "/EX_SGBDR_NAAM").text;
var v_buyer_zipcode = p_xml.selectSingleNode(strQuery_document + "/EX_SGBDR_POSTCODE").text;
var v_chamberOfCommerceNumber = p_xml.selectSingleNode(strQuery_document + "/EX_KVKNUMMER").text;
var v_deliveryDate_txt = p_xml.selectSingleNode(strQuery_document + "/EX_DELIVERYDATE").text;
var v_deliveryDate = v_deliveryDate_txt.substr(6,4) + "-" + v_deliveryDate_txt.substr(3,2) + "-" + v_deliveryDate_txt.substr(0,2) + "T12:00:00Z"; // Knetterhard ergens midden op de dag (is toch dont care)
var v_description = p_xml.selectSingleNode(strQuery_document + "/EX_OND").text;
var v_documentFileName = p_xml.selectSingleNode(strQuery_docfile + "/pdf_img_file").text;
var v_g_Account = p_xml.selectSingleNode(strQuery_amount + "/EX_GREKNR").text;
var v_g_Amount_txt = p_xml.selectSingleNode(strQuery_amount + "/EX_GREKBDR").text;
var v_g_Amount = 0;
if (v_g_Amount_txt != "")
{
v_g_Amount = parseFloat(v_g_Amount_txt.replace(/,/,'.'));
}
var v_invoiceAmount_txt = p_xml.selectSingleNode(strQuery_amount + "/EX_TOTAL_INCL").text;
var v_invoiceAmount = 0;
if (v_invoiceAmount_txt != "")
{
v_invoiceAmount = parseFloat(v_invoiceAmount_txt.replace(/,/,'.'));
}
var v_invoiceBase64 = p_pdf_base64;
var v_invoiceNumber = p_xml.selectSingleNode(strQuery_document + "/EX_INVOICENR").text;
//var v_invoiceSource = p_xml.selectSingleNode(strQuery_document + "/EX_INVOICE_BRON").text;
var v_invoice_MARXSource = p_xml.selectSingleNode(strQuery_document + "/EX_INVOICE_SOURCE").text;
var v_invoice_MARXSource_TEKST = p_xml.selectSingleNode(strQuery_document + "/EX_INVOICE_SOURCE_TXT").text;
var v_PaymId = p_xml.selectSingleNode(strQuery_document + "/EX_INVOICE_PAYMENTID").text;
var v_failure = p_xml.selectSingleNode(strQuery_document + "/EX_UITVAL").text;
var v_failureDesc = p_xml.selectSingleNode(strQuery_document + "/EX_UITVALOMS").text;
var i = 1;
var strQuery_tableROW = "//document/fields/TABLE/EX_TABLE/row[" + i + "]";
l_tableROW_xml = p_xml.selectSingleNode(strQuery_tableROW);
var v_array_resulttableROW = [];
while (l_tableROW_xml)
{
var v_ART = p_xml.selectSingleNode(strQuery_tableROW + "/col[@nr='1']").text;
var v_DESCR = p_xml.selectSingleNode(strQuery_tableROW + "/col[@nr='2']").text;
var v_AMNT = 0;
var v_AMNT_txt = p_xml.selectSingleNode(strQuery_tableROW + "/col[@nr='3']").text;
if (v_AMNT_txt != "")
{
v_AMNT = parseFloat(v_AMNT_txt.replace(/,/,'.'));
}
var v_BTW = p_xml.selectSingleNode(strQuery_tableROW + "/col[@nr='4']").text;
var v_BTWAMNT =0;
var v_BTWAMNT_txt = p_xml.selectSingleNode(strQuery_tableROW + "/col[@nr='5']").text;
if (v_BTWAMNT_txt != "")
{
v_BTWAMNT = parseFloat(v_BTWAMNT_txt.replace(/,/,'.'));
}
var v_PRICEUNIT = 0;
var v_PRICEUNIT_txt = p_xml.selectSingleNode(strQuery_tableROW + "/col[@nr='6']").text;
if (v_PRICEUNIT_txt != "")
{
v_PRICEUNIT = parseFloat(v_PRICEUNIT_txt.replace(/,/,'.'));
}
var v_LINENUM = 0;
var v_LINENUM_txt = p_xml.selectSingleNode(strQuery_tableROW + "/col[@nr='7']").text;
if (v_LINENUM_txt != "")
{
v_LINENUM = parseInt(v_LINENUM_txt);
}
var v_ARTNR = p_xml.selectSingleNode(strQuery_tableROW + "/col[@nr='8']").text;
var v_ARTNRAMNT = 0;
var v_ARTNRAMNT_txt = p_xml.selectSingleNode(strQuery_tableROW + "/col[@nr='9']").text;
if (v_ARTNRAMNT_txt != "")
{
v_ARTNRAMNT = parseInt(v_ARTNRAMNT_txt);
}
var v_ARTNRUNIT = p_xml.selectSingleNode(strQuery_tableROW + "/col[@nr='10']").text;
var v_ARTNRLOC = p_xml.selectSingleNode(strQuery_tableROW + "/col[@nr='11']").text;
var v_ARTNRCOST = p_xml.selectSingleNode(strQuery_tableROW + "/col[@nr='12']").text;
var v_ARTSPEC = p_xml.selectSingleNode(strQuery_tableROW + "/col[@nr='13']").text;
var l_row_data =
{
"amount": v_AMNT,
"articleId": v_ARTNR,
"chargedTo": v_ARTNRCOST,
"id": v_ART,
"lineNum": v_LINENUM,
"lineQuanity": v_ARTNRAMNT,
"location": v_ARTNRLOC,
"orderArtOms": v_DESCR,
"typeId": v_ARTSPEC,
"unit": v_ARTNRUNIT,
"vatIndicator": v_BTW
}
v_array_resulttableROW.push(l_row_data);
i = i + 1;
var strQuery_tableROW = "//document/fields/TABLE/EX_TABLE/row[" + i + "]";
l_tableROW_xml = p_xml.selectSingleNode(strQuery_tableROW);
}
var v_taxAmountHigh_txt = p_xml.selectSingleNode(strQuery_amount + "/EX_VAT_HIGH").text;
var v_taxAmountHigh = 0;
if (v_taxAmountHigh_txt != "")
{
v_taxAmountHigh = parseFloat(v_taxAmountHigh_txt.replace(/,/,'.'));
}
var v_taxAmountLow_txt = p_xml.selectSingleNode(strQuery_amount + "/EX_VAT_LOW").text;
var v_taxAmountLow = 0;
if (v_taxAmountLow_txt != "")
{
v_taxAmountLow = parseFloat(v_taxAmountLow_txt.replace(/,/,'.'));
}
var v_taxShifted_txt = p_xml.selectSingleNode(strQuery_amount + "/EX_BTWVERL").text;
var v_taxShifted = Boolean(v_taxShifted_txt == "Ja");
var v_vatNumber = p_xml.selectSingleNode(strQuery_corsa + "/EX_VATNR_1").text;
var v_vendor_address = p_xml.selectSingleNode(strQuery_document + "/EX_EXBDR_ADRES").text;
var v_vendor_city = p_xml.selectSingleNode(strQuery_document + "/EX_EXBDR_PLAATS").text;
var v_vendor_name = p_xml.selectSingleNode(strQuery_document + "/EX_EXBDR_NAAM").text;
var v_vendor_zipcode = p_xml.selectSingleNode(strQuery_document + "/EX_EXBDR_POSTCODE").text;
var l_json_data =
{
"amountHigh": v_amountHigh,
"amountLow": v_amountLow,
"amountNoTax": v_amountNoTax,
"autoIncasso": v_autoIncasso,
"bankAccountId": v_bankAccountId,
"bookDate": v_bookDate,
"buyer": {
"address": v_buyer_address,
"city": v_buyer_city,
"name": v_buyer_name,
"zipCode": v_buyer_zipcode
},
"chamberOfCommerceNumber": v_chamberOfCommerceNumber,
"deliveryDate": v_deliveryDate,
"description": v_description,
"documentFileName": v_documentFileName,
"failure": v_failure,
"failureDesc": v_failureDesc,
"g_Account": v_g_Account,
"g_Amount": v_g_Amount,
"invoiceAmount": v_invoiceAmount,
"invoiceBase64": v_invoiceBase64,
"invoiceDate": v_invoiceDate,
"invoiceNumber": v_invoiceNumber,
"invoiceSource": v_invoice_MARXSource_TEKST,
"invoiceSourceNum": v_invoice_MARXSource,
"paymId": v_PaymId,
"specs": v_array_resulttableROW,
"taxAmountHigh": v_taxAmountHigh,
"taxAmountLow": v_taxAmountLow,
"taxDate": v_taxDate,
"taxShifted": v_taxShifted,
"vatNumber": v_vatNumber,
"vendor": {
"address": v_vendor_address,
"city": v_vendor_city,
"name": v_vendor_name,
"zipCode": v_vendor_zipcode
}
};
return l_json_data;
}
function A2012_Xtractor2AX(v_xml, xtractFile) {
var v_API = "PreInvoiceServiceAddPreInvoiceFromXtractorRequest";
var v_req = '<PreInvoiceServiceAddPreInvoiceFromXtractorRequest xmlns="http://tempuri.org"> <xmlXtractorFormat><![CDATA[' + v_xml + "]]></xmlXtractorFormat> </PreInvoiceServiceAddPreInvoiceFromXtractorRequest>";
var v_type = 0;
var v_soapAction = "PreInvoiceService/addPreInvoiceFromXtractor";
var v_resp = apiAX(v_API, v_req, v_type, v_soapAction, 0);
if (v_resp.search("<response>true</response>") != -1) {
WriteText2File(G_ax_succeededfolder, xtractFile, "xml", v_req, 1, 1);
} else {
WriteText2File(G_ax_rejectedfolder, xtractFile, "xml", v_req, 1, 1);
}
return v_resp;
}
function A365_Xtractor2AX(v_resp, i, v_deelxml, v_factuur_key, v_notification_key, v_send_invoice_2_woco)
{
var l_reponsetekst = "";
if (v_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(v_factuur_key, "FIN_FACTUUR_SET_EXTERNSYNCDATE", "");
var v_result = {api_status_code: 1, api_status_message: "", api_response_message: ""};
post_do_exec_notification(v_notification_key, v_result);
}
else
{ // Factuur WEL naar opdrachtgever sturen, is erg gewenst aldaar! De factuur wordt dus WEL verwerkt (door opdrachtgever).
var l_pdf_base64 = F_Get_Base64_FactuurFile(v_factuur_key);
// MARX#74747 Voor T365 de Facturen via de Saxton/JSON koppeling
if (G_ax365_url_supplierservice != "")
{ // XML via de 'oude' supplierservice
if (l_pdf_base64 != ""){
// De node Attachment in de XML.
var node_attachment = v_deelxml.getElementsByTagName("docfile");
if (node_attachment.length != 0){
// De node docfile in de XML bestaat dus.
__Log("XML node docfile exists", 3);
// De node pdf_base64 in XMLResult gaat inhoud krijgen met de base64 tekenreeks.
var node_attached_data = v_deelxml.getElementsByTagName("pdf_base64");
if (node_attached_data.length != 0){
__Log("XML node pdf_base64 exists", 3);
var y = node_attached_data.childNodes[0];
if (y != null){
y.nodeValue = l_pdf_base64;
}
}
else {
__Log("XML node pdf_base64 does NOT exist",2);
newEle = v_resp.createElement("pdf_base64");
__Log("XML element pdf_base64 created",3);
newTxt = v_resp.createTextNode(l_pdf_base64);
__Log("XML textnode with base64 data created",3);
newEle.appendChild(newTxt);
__Log("XML element pdf_base64 with textnode",3);
node_attachment[0].appendChild(newEle);
__Log("XML element added to XML",3);
}
}
}
var XMLResult = "<?xml version=\"1.0\"?>" + v_deelxml.xml;
if (G_log_level >= 4){
var l_log_folder = GetLogFolder() + "/";
WriteText2File(l_log_folder, "invoice_ax365[" + i + "]" , "xml" , XMLResult, 1, 1);
}
var v_API = ""; // dont care in AX365 Factuur-webservice
var v_req = '<addPreInvoiceFromXtractor xmlns="http://tempuri.org"> <xmlXtractorFormat><![CDATA[' + XMLResult + "]]></xmlXtractorFormat> </addPreInvoiceFromXtractor>";
var v_type = 0;
var v_soapAction = "PreInvoiceService/addPreInvoiceFromXtractor";
var v_discard_active_abort = 1; //In geval van 500-error, geen active abort...
var v_soort_api = 1; // (nav MARX#61048: Documenten versturen van Mareon naar AX) is waarde 1 (oude/huidige api via SupplierService) of waarde 2 (nieuwe api via CustomerPortalAX)
}
else
{
// JSON via Saxton/ AX webservice
// Gedeelte van het URL pad naar de webservice "PreInvoice"
var v_company_id = Xtractor_2_CompanyID(v_deelxml);
var v_API = "api/v0.1/" + v_company_id + "/Suppliers/PreInvoice";
// Conversie van Xtractor-XML naar Preinvoice-JSON
var l_json_data = Xtractor_2_PreInvoice(v_deelxml, l_pdf_base64);
var v_req = JSON.stringify(l_json_data, null, 2);
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;
}
// Send factuur-XML of factuur-JSON to AX365
var v_result = apiAX_GENERAL (v_API, v_req, 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;
__Log("l_statuscode:" + l_statuscode, 3);
__Log("l_statustekst" + l_statustekst, 3);
__Log("l_reponsetekst:" + l_reponsetekst, 3);
var l_extra_omschr = l_statustekst + " - " + l_reponsetekst;
l_extra_omschr = l_extra_omschr.substr(0, 4000);
if (l_statuscode == 0){
// Fout (HTTP500 oid) in de communicatie, dit is sowieso fout...
if (G_push_notifyqueue == "0"){
MARX_Send_Succes_Or_Failure(v_factuur_key, "FIN_FACTUUR_POST_FAIL", l_extra_omschr)
}
else{
//start else-tak "push/notifyqueue"
post_do_exec_notification(v_notification_key, v_result);
}
__Log("AX365 factuurverwerking NIET succesvol",1);
}
else {
// Wel goed (HTTP200 oid), maar nu nog checken op basis van interne bericht, staat daar true of false....
if (l_reponsetekst.search("<result>true</result>") != -1) {
if (G_push_notifyqueue == "0"){
MARX_Send_Succes_Or_Failure(v_factuur_key, "FIN_FACTUUR_POST_SUCCESS", "")
}
else{
//start else-tak "push/notifyqueue", ook 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(v_factuur_key, "FIN_FACTUUR_POST_SUCCESS", "");
//en extra de factuur uit de notifyqueue verwijderen...
post_do_exec_notification(v_notification_key, v_result);
}
__Log("AX365 factuurverwerking succesvol",3);
}
else {
if (G_push_notifyqueue == "0"){
MARX_Send_Succes_Or_Failure(v_factuur_key, "FIN_FACTUUR_POST_FAIL", l_extra_omschr)
}
else{
//start else-tak "push/notifyqueue"
post_do_exec_notification(v_notification_key, v_result);
}
__Log("AX365 factuurverwerking NIET succesvol",1);
}
}
}
return l_reponsetekst;
}
function F_GetFacturen_TWINQ()
{
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_TWINQ: " + 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_TWINQ: 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_TWINQ: 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, "twinq[" + i + "]" , "xml" , XMLResult, 1, 1);
}
// Send factuur-XML to TWINQ
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 Twinq
// 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("TWINQ 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("TWINQ factuurverwerking NIET succesvol",1);
}
}
i = i + 1;
var strQuery = "//batch/fin_factuur[" + i + "]";
l_deelxml = v_resp.selectSingleNode(strQuery);
}
}
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);
}
}