226 lines
12 KiB
JavaScript
226 lines
12 KiB
JavaScript
// --------------------------------------------------------------------------------------
|
|
// A2012_GetOpdrachten.js
|
|
// Copyright 2017 Facilitor. 053-4800 700, helpdesk@facilitor.nl
|
|
// Written by MB (2017)
|
|
//
|
|
|
|
function A2012_GetOpdrachten()
|
|
{
|
|
var v_status_code = "o"; // open
|
|
|
|
// Call MARX#37375: Nieuwe sync-data tbv nauwkeurig syc-en
|
|
// [A] Huidige (on-premise) instelling 'opdr_past_days' uit mareon.xml (default 1) kan worden overruled door nieuwe Mareon-instelling [B] MAR_SYNC_opdr_past_days:
|
|
// [B] Per woco nieuwe overrule-instelling MAR_SYNC_opdr_past_days (integer):
|
|
// [B1] MAR_SYNC_opdr_past_days < 0, dan overruled deze [A].
|
|
// [B2] MAR_SYNC_opdr_past_days = 1, dan geldt de nieuwe berekend tijdswindow [C + D], en vervallen [A] en [B1]
|
|
// [B3] MAR_SYNC_opdr_past_days = 0, dan geldt [A] dus (fallback), de huidige sync werking.
|
|
|
|
if (G_mar_sync_opdr_past_days == 0){
|
|
// dan geldt [A] dus (fallback), de huidige sync werking.
|
|
|
|
// l_aantal_dagen in mareon.xml staat default/normaal op 1 (voor gisteren), dus alle opdrachten vanaf gisteren. Voor testdoeleinden kan dit wat opgerekt worden...
|
|
// var l_aantal_dagen = 1;
|
|
var l_aantal_dagen = Read_Ini_Setting("ax2012","opdr_past_days");
|
|
__Log("A2012_GetOpdrachten: setting opdr_past_days uit mareon.xml = " + l_aantal_dagen , 2);
|
|
|
|
var l_today = Read_Ini_Setting("ax2012","opdr_today");
|
|
__Log("A2012_GetOpdrachten: l_today = " + l_today , 2);
|
|
if (l_today == ""){ l_today = 0;}
|
|
__Log("A2012_GetOpdrachten: l_today = " + l_today , 2);
|
|
var l_currentTime = new Date((new Date()).valueOf() - l_today*1000*60*60*24);
|
|
|
|
__Log("A2012_GetOpdrachten: l_aantal_dagen + l_today = " + ((parseInt(l_aantal_dagen) + parseInt(l_today))) , 2);
|
|
var l_yesterday = new Date((new Date()).valueOf() - (parseInt(l_aantal_dagen) + parseInt(l_today))*1000*60*60*24);
|
|
var v_datum_vanaf = jsdatextoxml(l_yesterday);
|
|
var v_datum_tm = jsdatextoxml(l_currentTime);
|
|
}
|
|
if (G_mar_sync_opdr_past_days != 0){
|
|
// nieuwe methode, agv MARX#56643: Test Haagwonen inkoopordernummer ontbreekt in Mareon ION001753
|
|
__Log("A2012_GetOpdrachten: berekend tijdswindow door DB bepaald = " ,2);
|
|
var v_datum_vanaf = G_mar_sync_date_last;
|
|
var v_datum_tm = G_mar_sync_date_now;
|
|
}
|
|
|
|
__Log("A2012_GetOpdrachten: v_datum_vanaf = " + v_datum_vanaf ,2);
|
|
__Log("A2012_GetOpdrachten: v_datum_tm = " + v_datum_tm ,2);
|
|
|
|
var v_xml_opdrachten;
|
|
var v_xml_bijlagen;
|
|
|
|
// Haal de aannemers (feitelijk de AX-aannemer-id's) uit Facilitor die geregistreerd zijn voor het aannemersportaal.
|
|
// Het aannemer-id van AX wordt uit Facilitor uitgelezen, en per aannemer wordt de webservice om de opdrachten van die aannemer op te halen, aangeroepen...
|
|
l_suppl_array = F_GetSuppliers();
|
|
for (var i = 0; i < l_suppl_array.length; i++){
|
|
v_supplier_id = l_suppl_array[i];
|
|
|
|
// Ophalen van de opdrachten voor aannemer 'v_supplier_id' vanaf (default) gisteren tot en met nu.
|
|
v_xml_opdrachten = A2012_GetOpdrachten_van_Aannemer(v_supplier_id, v_status_code, v_datum_vanaf, v_datum_tm);
|
|
|
|
// Convert AX2012 xml message to AX2009 (overgenomen uit Rob Berghout's origineel)
|
|
v_xml_opdrachten = v_xml_opdrachten.replace('<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">','<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"><s:Header><a:Action s:mustUnderstand="1">http://tempuri.org/ISupplierService/GetSupplierTasksSpecResponse</a:Action></s:Header>');
|
|
v_xml_opdrachten = v_xml_opdrachten.replace('<SupplierPortalGetSupplierTasksByVendSpecResponse xmlns="http://tempuri.org">', '<GetSupplierTasksSpecResponse xmlns="http://tempuri.org/">');
|
|
v_xml_opdrachten = v_xml_opdrachten.replace('</SupplierPortalGetSupplierTasksByVendSpecResponse>', ' </GetSupplierTasksSpecResponse>');
|
|
v_xml_opdrachten = v_xml_opdrachten.replace('<response xmlns:b="http://schemas.datacontract.org/2004/07/Dynamics.Ax.Application" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">', '<GetSupplierTasksSpecResult xmlns:b="http://schemas.datacontract.org/2004/07/SG.Services.Repositories" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">');
|
|
v_xml_opdrachten = v_xml_opdrachten.replace('</response>', '</GetSupplierTasksSpecResult>');
|
|
|
|
// Onderstaande is ook overgenomen uit Rob's origineel, maar dat gaan we anders (beter doen), want die replace All haalt een eventuele eindigde Z bij alle nodes weg, dat is niet goed,
|
|
// Om alleen bij de (betreffende.gebruikte) datumvelden te doen, gaan we dat heel gericht in de A_GetOpdrachten.xsl oplossen. Daarom die replaceAll uitcommentarieren, hebben we niet nodig
|
|
// Processing for example: <b:realizedVisitDate>1980-01-01T00:00:01Z</b:realizedVisitDate> is not processed correctly in Mareon. Remove the Z (UTC time)
|
|
//v_xml_opdrachten = replaceAll(v_xml_opdrachten, "Z</b", "</b");
|
|
|
|
|
|
//var l_xmldoc = new ActiveXObject("Msxml2.DOMDocument.6.0");
|
|
//l_xmldoc.async = false;
|
|
//l_xmldoc.loadXML(v_xml_opdrachten);
|
|
//Krijg niet voor elkaar om via bovenstaande 3 (nu) uitgecommentaarde regel een node te kunnen checken in de XML, daarom maar op een botte manier...
|
|
// Die s: zit ook in de weg als ik de elegante functie __Log_XMLwil GENEST(!) wil gebruiken.
|
|
// s:Envelope/s:Body
|
|
|
|
//var strQuery = "//GetSupplierTasksSpecResponse/GetSupplierTasksSpecResult";
|
|
//var l_zijn_er_opdrachten = l_xmldoc.selectSingleNode(strQuery);
|
|
|
|
// Daarom maar op een botte doch goed werkende manier:
|
|
|
|
var l_split_opdrachten = v_xml_opdrachten.split("<b:SupplierTaskSpec>");
|
|
var l_aantal_opdrachten = l_split_opdrachten.length - 1;
|
|
|
|
|
|
if (l_aantal_opdrachten > 0){
|
|
// Er zijn opdrachten, zodat aanroep van Facilitor api oke is...
|
|
// Wegschrijven van de opdrachten (voor aannemer 'v_supplier_id') naar Facilitor....
|
|
__Log("A2012_GetOpdrachten: aantal opdrachten = " + l_aantal_opdrachten ,2);
|
|
var l_marx_response_xml = api_F_PutXML(v_xml_opdrachten, "AX_OPDRACHTEN");
|
|
if (l_marx_response_xml)
|
|
{
|
|
A2012_PurchOrderS_Delivered(l_marx_response_xml);
|
|
}
|
|
}
|
|
else{
|
|
__Log("A2012_GetOpdrachten: Geen opdrachten.",2);
|
|
}
|
|
|
|
if (G_mar_sync_bijlages_opdrgvr != '0'){
|
|
// MARX#57420: Documenten van Tobias AX naar Mareonmoeten worden gesynct
|
|
// En misschien zijn er ook nog wel bijlagen/foto's bij (eerdere) opdrachten toegevoegd, die halen we nu (per leverancier) op.
|
|
__Log("A2012_GetOpdrachten: Eventuele bijlages naar Mareon",3);
|
|
v_xml_bijlagen = A2012_GetBijlagen_bij_opdrachten_van_Aannemer(v_supplier_id, v_status_code, v_datum_vanaf, v_datum_tm);
|
|
api_AX_2_F_Bijlagen(v_xml_bijlagen);
|
|
}
|
|
else{
|
|
__Log("A2012_GetOpdrachten: Geen bijlages naar Mareon",3);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
function A2012_GetOpdrachten_van_Aannemer(v_supplier_id, v_status_code, v_datum_vanaf, v_datum_tm)
|
|
{
|
|
|
|
var v_API = "SupplierPortalGetSupplierTasksByVendSpecRequest";
|
|
var v_req = ' <SupplierPortalGetSupplierTasksByVendSpecRequest xmlns="http://tempuri.org"> '+
|
|
'<_vendAccount>'+v_supplier_id+'</_vendAccount>' +
|
|
'<_bonStatus>'+v_status_code+'</_bonStatus>'+
|
|
'<_startRange>'+v_datum_vanaf+'</_startRange>' +
|
|
'<_endRange>'+v_datum_tm+'</_endRange>' +
|
|
'</SupplierPortalGetSupplierTasksByVendSpecRequest>';
|
|
var v_type = 0;
|
|
var v_soapAction = "SupplierPortal/getSupplierTasksByVendSpec";
|
|
|
|
var v_resp = apiAX(v_API, v_req, v_type, v_soapAction, 0);
|
|
|
|
return v_resp;
|
|
}
|
|
|
|
function A2012_GetBijlagen_bij_opdrachten_van_Aannemer(v_supplier_id, v_status_code, v_datum_vanaf, v_datum_tm)
|
|
{
|
|
// MARX#76342: Mareon Bijlagen aanpassing AX2012 via nieuwe webservices die base64 stuk voor stuk ophaalt tbv performance
|
|
// Toepassen van nieuwe API SupplierPortalGetDocuReferenceRequest, de oude SupplierPortalGetDocuRefRequest bestaat nog wel maar gaan we niet meer gebruiken
|
|
// Reden: performance, zodat AX niet alle bijlagen tot base64 hoeft te verwerken, want die blijft in deze nieuwe API leeg, en het ophalen van de base64 doen we via een nog andere nieuwe API, stuk voor stuk.
|
|
var v_API = "SupplierPortalGetDocuReferenceRequest";
|
|
var v_req = ' <SupplierPortalGetDocuReferenceRequest xmlns="http://tempuri.org"> '+
|
|
'<_vendAccount>'+v_supplier_id+'</_vendAccount>' +
|
|
'<_bonStatus>'+v_status_code+'</_bonStatus>'+
|
|
'<_startRange>'+v_datum_vanaf+'</_startRange>' +
|
|
'<_endRange>'+v_datum_tm+'</_endRange>' +
|
|
'</SupplierPortalGetDocuReferenceRequest>';
|
|
var v_type = 0;
|
|
var v_soapAction = "SupplierPortal/getDocuReference";
|
|
|
|
var v_resp = apiAX(v_API, v_req, v_type, v_soapAction, 0);
|
|
|
|
return v_resp;
|
|
}
|
|
|
|
function A2012_GetBijlage_via_ReferenceId(v_docu_ref_id)
|
|
{
|
|
// MARX#76342: Mareon Bijlagen aanpassing AX2012, Nieuwe API die obv 1 unieke reference-ID de base64 bijlage ophaalt
|
|
var v_API = "SupplierPortalGetDocuRefBase64Request";
|
|
var v_req = ' <SupplierPortalGetDocuRefBase64Request xmlns="http://tempuri.org"> '+
|
|
'<_docuReference>'+v_docu_ref_id+'</_docuReference>' +
|
|
'</SupplierPortalGetDocuRefBase64Request>';
|
|
var v_type = 0;
|
|
var v_soapAction = "SupplierPortal/getDocuRefBase64";
|
|
|
|
var v_resp = apiAX(v_API, v_req, v_type, v_soapAction, 0);
|
|
|
|
return v_resp;
|
|
}
|
|
|
|
// MARX#76891: Registratie in AX2012 of inkooporder aanwezig is in Mareon
|
|
function A2012_PurchOrderS_Delivered(v_marx_response_xml)
|
|
{
|
|
// Voorbeeld v_marx_response_xml (response uit Mareon):
|
|
// <facilitor>
|
|
// <details>
|
|
// ..
|
|
// <result>
|
|
// <mld_opdr_externnr>ION100236531-mb6</mld_opdr_externnr>
|
|
// <mld_opdr_key>2561187</mld_opdr_key>
|
|
// <mld_opdr_externnr>ION100236531-mb5</mld_opdr_externnr>
|
|
// <mld_opdr_key>2561186</mld_opdr_key>
|
|
// <success>true</success>
|
|
// </result>
|
|
// </details>
|
|
// </facilitor>
|
|
|
|
// Voor elke node <facilitor/details/mld_opdr_externnr> moet 'SupplierPortalPurchOrderDeliveredRequest' worden aangeroepen
|
|
|
|
var l_result_str = "facilitor/details/result";
|
|
var l_mld_opdr_externnr_str = "mld_opdr_externnr";
|
|
|
|
var l_node_result = v_marx_response_xml.selectNodes(l_result_str);
|
|
for (var i=0; i < l_node_result.length; i++)
|
|
{
|
|
var l_nodes_mld_opdr_externnr = l_node_result[i].selectNodes(l_mld_opdr_externnr_str);
|
|
|
|
for (var j=0; j < l_nodes_mld_opdr_externnr.length; j++)
|
|
{
|
|
var l_mld_opdr_externnr_node = l_nodes_mld_opdr_externnr[j];
|
|
if (l_mld_opdr_externnr_node)
|
|
{
|
|
var l_mld_opdr_externnr = l_mld_opdr_externnr_node.text;
|
|
if (l_mld_opdr_externnr){
|
|
A2012_PurchOrder_Delivered(l_mld_opdr_externnr);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function A2012_PurchOrder_Delivered(v_purch_Id)
|
|
{
|
|
var v_API = "SupplierPortalPurchOrderDeliveredRequest";
|
|
var v_req = ' <SupplierPortalPurchOrderDeliveredRequest xmlns="http://tempuri.org"> '+
|
|
'<PurchOrders>' +
|
|
'<Purchorder>' +
|
|
'<id>'+ v_purch_Id +'</id>' +
|
|
'<companyId>'+ G_company_Id +'</companyId>' +
|
|
'</Purchorder>' +
|
|
'</PurchOrders>' +
|
|
'</SupplierPortalPurchOrderDeliveredRequest>';
|
|
var v_type = 0;
|
|
var v_soapAction = "SupplierPortal/purchOrderDelivered";
|
|
var v_resp = apiAX(v_API, v_req, v_type, v_soapAction, 0);
|
|
return v_resp;
|
|
}
|