MARX#69028 Uitvalfacturen toch naar het prefacturen register

svn path=/Mareon/trunk/; revision=56706
This commit is contained in:
Marcel Bourseau
2022-07-27 17:19:44 +00:00
parent cc9b23ff83
commit db1c25e4db
2 changed files with 375 additions and 295 deletions

View File

@@ -30,9 +30,24 @@ function FCLT_Sync_END(){
// Tobias Progress
F_PutSync(1);
break;
default:
// T365, Facilitor, REMS en Twinq
case "A365":
// Tobias 365
F_PutSync(2);
break;
case "F":
// Facilitor
F_PutSync(2);
break;
case "R":
// REMS
F_PutSync(2);
break;
case "TQ":
// TwinQ
F_PutSync(2);
break;
default:
F_PutSync(1);
}
}
@@ -246,11 +261,11 @@ function Ax_2_FACILITOR()
//start then-tak pull
// Als de koppeling niet via PUSH verloopt, dan zelf de opdrachten uit AX halen (PULL), en de statusupdates via diverse views obv laatste tracking-key
__Log("*** START AX --> FCLT : Opdrachten uit AX en naar Facilitor ***", 2);
__Log("*** START AX --> FCLT : Opdrachten uit AX en naar Mareon ***", 2);
AX_2_FCLT_Opdrachten();
__Log("*** END", 2);
__Log("*** START FCLT --> AX : Opmerking opdrachten uit Facilitor naar AX ***", 2);
__Log("*** START FCLT --> AX : Opmerking opdrachten uit Mareon naar AX ***", 2);
FCLT_2_AX_OpmerkingOpdrachten();
__Log("*** END", 2);
@@ -258,22 +273,22 @@ function Ax_2_FACILITOR()
FCLT_2_AX_AcceptRefuseOpdracht();
__Log("*** END", 2);
__Log("*** START FCLT --> AX : Geplande opdrachten uit Facilitor naar AX ***", 2);
__Log("*** START FCLT --> AX : Geplande opdrachten uit Mareon naar AX ***", 2);
FCLT_2_AX_GeplandeOpdrachten();
__Log("*** END", 2);
if (G_mar_communicatielogboek == 1){
__Log("*** Communicatie logboek AAN", 2);
__Log("*** START FCLT --> AX : Verlengde opdrachten uit Facilitor naar AX ***", 2);
__Log("*** START FCLT --> AX : Verlengde opdrachten uit Mareon naar AX ***", 2);
FCLT_2_AX_VerlengdeOpdrachten();
__Log("*** END", 2);
__Log("*** START FCLT --> AX : Opdrachten in uitvoering uit Facilitor naar AX ***", 2);
__Log("*** START FCLT --> AX : Opdrachten in uitvoering uit Mareon naar AX ***", 2);
FCLT_2_AX_UitvoeringOpdrachten();
__Log("*** END", 2);
__Log("*** START FCLT --> AX : Onderbroken opdrachten uit Facilitor naar AX ***", 2);
__Log("*** START FCLT --> AX : Onderbroken opdrachten uit Mareon naar AX ***", 2);
FCLT_2_AX_OnderbrokenOpdrachten();
__Log("*** END", 2);
}
@@ -287,7 +302,7 @@ function Ax_2_FACILITOR()
__Log("*** END", 2);
}
__Log("*** START FCLT --> AX : Afgemelde opdrachten uit Facilitor naar AX ***", 2);
__Log("*** START FCLT --> AX : Afgemelde opdrachten uit Mareon naar AX ***", 2);
FCLT_2_AX_AfgemeldeOpdrachten();
__Log("*** END", 2);
} // einde then-tak "pull"
@@ -297,11 +312,11 @@ function Ax_2_FACILITOR()
//Totdat AX nog geen push-mechanisme heeft, gaan we de opdrachtverstrekking nog PULLEN!
//Zodra AX2012 wel push-mechanisme heeft, verloopt de opdrachtverstrekking buiten de sync, en kan dit stukje komen te vervallen...
__Log("*** START AX --> FCLT : Opdrachten uit AX en naar Facilitor ***", 2);
__Log("*** START AX --> FCLT : Opdrachten uit AX en naar Mareon ***", 2);
AX_2_FCLT_Opdrachten();
__Log("*** END", 2);
__Log("*** START FCLT --> AX2012 : Verwerken van ALLE opdrachtstatussen uit Mareon Facilitor naar AX obv notifyqueue ***", 2);
__Log("*** START FCLT --> AX2012 : Verwerken van ALLE opdrachtstatussen uit Mareon naar AX obv notifyqueue ***", 2);
FCLT_2_AX_OpdrachtStatus();
__Log("*** END", 2);
//einde else-tak "push/notifyqueue"
@@ -317,34 +332,34 @@ function Ax2012_2_FACILITOR()
//start then-tak pull
// Als de koppeling niet via PUSH verloopt, dan zelf de opdrachten uit AX halen (PULL), en de statusupdates via diverse views obv laatste tracking-key
__Log("*** START AX2012 --> FCLT : Opdrachten uit AX en naar Facilitor ***", 2);
__Log("*** START AX2012 --> FCLT : Opdrachten uit AX en naar Mareon ***", 2);
AX2012_2_FCLT_Opdrachten();
__Log("*** END", 2);
__Log("*** START FCLT --> AX2012 : Opmerking opdrachten uit Facilitor naar AX ***", 2);
__Log("*** START FCLT --> AX2012 : Opmerking opdrachten uit Mareon naar AX ***", 2);
FCLT_2_AX2012_OpmerkingOpdrachten();
__Log("*** END", 2);
__Log("*** START FCLT --> AX2012 : Geaccepteerde/geweigerde opdrachten uit Facilitor naar AX ***", 2);
__Log("*** START FCLT --> AX2012 : Geaccepteerde/geweigerde opdrachten uit Mareon naar AX ***", 2);
FCLT_2_AX2012_AcceptRefuseOpdracht();
__Log("*** END", 2);
__Log("*** START FCLT --> AX2012 : Geplande opdrachten uit Facilitor naar AX ***", 2);
__Log("*** START FCLT --> AX2012 : Geplande opdrachten uit Mareon naar AX ***", 2);
FCLT_2_AX2012_GeplandeOpdrachten();
__Log("*** END", 2);
if (G_mar_communicatielogboek == 1){
__Log("*** Communicatie logboek AAN", 2);
__Log("*** START FCLT --> AX2012 : Verlengde opdrachten uit Facilitor naar AX ***", 2);
__Log("*** START FCLT --> AX2012 : Verlengde opdrachten uit Mareon naar AX ***", 2);
FCLT_2_AX2012_VerlengdeOpdrachten();
__Log("*** END", 2);
__Log("*** START FCLT --> AX2012 : Opdrachten in uitvoering uit Facilitor naar AX ***", 2);
__Log("*** START FCLT --> AX2012 : Opdrachten in uitvoering uit Mareon naar AX ***", 2);
FCLT_2_AX2012_UitvoeringOpdrachten();
__Log("*** END", 2);
__Log("*** START FCLT --> AX2012 : Onderbroken opdrachten uit Facilitor naar AX ***", 2);
__Log("*** START FCLT --> AX2012 : Onderbroken opdrachten uit Mareon naar AX ***", 2);
FCLT_2_AX2012_OnderbrokenOpdrachten();
__Log("*** END", 2);
}
@@ -377,7 +392,7 @@ function Ax2012_2_FACILITOR()
}
// En tenslotte obv PULL de afgemelde opdrachten nog.
__Log("*** START FCLT --> AX2012 : Afgemelde opdrachten uit Facilitor naar AX ***", 2);
__Log("*** START FCLT --> AX2012 : Afgemelde opdrachten uit Mareon naar AX ***", 2);
FCLT_2_AX2012_AfgemeldeOpdrachten();
__Log("*** END", 2);
} // einde then-tak "pull"
@@ -388,11 +403,11 @@ function Ax2012_2_FACILITOR()
//Totdat AX nog geen push-mechanisme heeft, gaan we de opdrachtverstrekking nog PULLEN!
//Zodra AX2012 wel push-mechanisme heeft, verloopt de opdrachtverstrekking buiten de sync, en kan dit stukje komen te vervallen...
__Log("*** START AX2012 --> FCLT : Opdrachten uit AX en naar Facilitor ***", 2);
__Log("*** START AX2012 --> FCLT : Opdrachten uit AX en naar Mareon ***", 2);
AX2012_2_FCLT_Opdrachten();
__Log("*** END", 2);
__Log("*** START FCLT --> AX2012 : Verwerken van ALLE opdrachtstatussen uit Mareon Facilitor naar AX obv notifyqueue ***", 2);
__Log("*** START FCLT --> AX2012 : Verwerken van ALLE opdrachtstatussen uit Mareon naar AX obv notifyqueue ***", 2);
FCLT_2_AX2012_OpdrachtStatus();
__Log("*** END", 2);
//einde else-tak "push/notifyqueue"
@@ -416,7 +431,7 @@ function AX365_2_FACILITOR()
__Log("*** END Get AX Saxton Token", 2);
// Statusinformatie en evt bijlagen van Mareon -> AX365
__Log("*** START FCLT --> AX365 : Verwerken van ALLE opdrachtstatussen + bijlagen uit Mareon Facilitor naar AX365 obv notifyqueue ***", 2);
__Log("*** START FCLT --> AX365 : Verwerken van ALLE opdrachtstatussen + bijlagen uit Mareon naar AX365 obv notifyqueue ***", 2);
FCLT_2_AX365_OpdrachtStatus_Bijlagen();
__Log("*** END", 2);
@@ -451,31 +466,31 @@ function Tobias_2_FACILITOR()
{
// "*** START Tobias --> FCLT : Weiger returncodes/teksten uit Tobias ZIJN ER NIET (i.t.t. AX ***");
__Log("*** START Tobias --> FCLT : Opdrachten uit Tobias en naar Facilitor ***", 2);
__Log("*** START Tobias --> FCLT : Opdrachten uit Tobias en naar Mareon ***", 2);
Tobias_2_FCLT_Opdrachten();
__Log("*** END", 2);
__Log("*** START FCLT --> Tobias : Opmerking opdrachten uit Facilitor naar Tobias ***", 2);
__Log("*** START FCLT --> Tobias : Opmerking opdrachten uit Mareon naar Tobias ***", 2);
FCLT_2_Tobias_OpmerkingOpdrachten();
__Log("*** END", 2);
__Log("*** START FCLT --> Tobias : Geaccepteerde/geweigerde opdrachten uit Facilitor naar Tobias ***", 2);
__Log("*** START FCLT --> Tobias : Geaccepteerde/geweigerde opdrachten uit Mareon naar Tobias ***", 2);
FCLT_2_Tobias_AcceptRefuseOpdracht();
__Log("*** END", 2);
__Log("*** START FCLT --> Tobias : Geplande opdrachten uit Facilitor naar Tobias ***", 2);
__Log("*** START FCLT --> Tobias : Geplande opdrachten uit Mareon naar Tobias ***", 2);
FCLT_2_Tobias_GeplandeOpdrachten();
__Log("*** END", 2);
__Log("*** START FCLT --> Tobias : Afgemelde opdrachten uit Facilitor naar Tobias ***", 2);
__Log("*** START FCLT --> Tobias : Afgemelde opdrachten uit Mareon naar Tobias ***", 2);
FCLT_2_Tobias_AfgemeldeOpdrachten();
__Log("*** END", 2);
if (G_ax_xtractorfolder == ""){
__Log("*** START FCLT --> Tobias : Facturen uit Facilitor naar Tobias ***", 2);
__Log("*** START FCLT --> Tobias : Facturen uit Mareon naar Tobias ***", 2);
FCLT_2_Tobias_Facturen();
}
else{
@@ -652,7 +667,7 @@ function MAREON_2_TWINQ()
function FACILITOR_2_Xtractor()
{
__Log("*** START FCLT --> AX / Tobias/AX : Facturen met status INGEVOERD + AKKOORD uit Facilitor naar AX of Tobias/AX ***", 2);
__Log("*** START FCLT --> AX / Tobias/AX : Facturen uit Mareon naar AX of Tobias/AX ***", 2);
FCLT_2_AX_Facturen();
__Log("*** END", 2);
}
@@ -679,8 +694,9 @@ function FACILITOR_2_Xtractor()
// 1.61 -- MARX#71922: Factuurbericht naar Twinq
// 1.62 -- MARX#72900: Afwijkende technische gereeddatum komt niet goed bij opdrachtgever aan
// 1.63 -- MARX#73648: Factuur wordt telkens weer (oneindig) aan REMS aangeboden
// 1.64 -- MARX#69028 Uitvalfacturen toch naar het prefacturen register.
var G_Mareon_Adapter = "1.63";
var G_Mareon_Adapter = "1.64";
//MARX#56643: Test Haagwonen inkoopordernummer ontbreekt in Mareon ION001753
var G_new_date = new Date();
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

View File

@@ -12,7 +12,7 @@ function F_GetFacturen_AX()
var v_API = "FACT4AX_XTRACTOR";
var v_APIKEY = G_marx_apikey;
if (G_push_notifyqueue == "0"){
if (G_push_notifyqueue == "0"){
var v_req = "<GetFACT4AX_XTRACTOR><adapterversion>" + G_Mareon_Adapter + "</adapterversion><APIkey>" + v_APIKEY + "</APIkey></GetFACT4AX_XTRACTOR>"
}
else{
@@ -44,6 +44,11 @@ function F_GetFacturen_AX()
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>"
@@ -65,7 +70,7 @@ function F_GetFacturen_AX()
}
// 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);
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 + "]";
@@ -111,81 +116,96 @@ function F_GetFacturen_FCLT()
var l_fac_notificatie_key = v_resp.selectSingleNode(l_strQuery_fac_notificatie_key).text;
__Log("l_fac_notificatie_key: " + l_fac_notificatie_key, 3);
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;
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!!
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);
}
}
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", "");
}
}
}
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{
//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)
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);
}
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;
@@ -269,22 +289,39 @@ function F_GetFacturen_REMS()
l_xml_file_name_prefix = l_xml_file_node.text + "_";
}
__Log("l_xml_file_name_prefix: " + l_xml_file_name_prefix, 2);
// De node Attachment in de XML = cac:Attachment
var node_attachment = l_deelxml.getElementsByTagName("cac:Attachment");
if (node_attachment.length != 0){
//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!!
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,
//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);
if (l_fin_factuur_key != ""){
// Nu halen de indien aanwezig de gekoppelde factuur-PDF op...
@@ -319,37 +356,38 @@ function F_GetFacturen_REMS()
}
}
}
}
// 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);
}
// 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);
@@ -459,92 +497,79 @@ function A2012_Xtractor2AX(v_xml, xtractFile) {
}
function A365_Xtractor2AX(v_resp, i, v_deelxml, v_factuur_key, v_notification_key)
function A365_Xtractor2AX(v_resp, i, v_deelxml, v_factuur_key, v_notification_key, v_send_invoice_2_woco)
{
var l_pdf_base64 = F_Get_Base64_FactuurFile(v_factuur_key);
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;
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!!
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);
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);
}
}
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);
}
// Send factuur-XML to AX365
var XMLResult = "<?xml version=\"1.0\"?>" + v_deelxml.xml;
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_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, v_req, 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;
__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 (G_log_level >= 4){
var l_log_folder = GetLogFolder() + "/";
WriteText2File(l_log_folder, "invoice_ax365[" + i + "]" , "xml" , XMLResult, 1, 1);
}
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 {
// Send factuur-XML to AX365
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_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, v_req, 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;
__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)
}
@@ -554,6 +579,31 @@ function A365_Xtractor2AX(v_resp, i, v_deelxml, v_factuur_key, v_notification_ke
}
__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;
}
@@ -592,84 +642,98 @@ function F_GetFacturen_TWINQ()
var l_fac_notificatie_key = v_resp.selectSingleNode(l_strQuery_fac_notificatie_key).text;
__Log("l_fac_notificatie_key: " + l_fac_notificatie_key, 3);
// 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);
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);
l_pdf_base64 = F_Get_Base64_FactuurFile(l_fin_factuur_key);
if (l_pdf_base64 != ""){
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!!
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);
// 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);
l_pdf_base64 = F_Get_Base64_FactuurFile(l_fin_factuur_key);
if (l_pdf_base64 != ""){
// 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);
// 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_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);
if (node_attachment.length != 0){
// De node Attachment in de XML bestaat dus.
__Log("XML node Attachment exists", 3);
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);
}
}
// 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);
}
}
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);