MARX#57420: Documenten van Tobias AX naar Mareon

svn path=/Mareon/trunk/; revision=43552
This commit is contained in:
Marcel Bourseau
2019-07-31 18:41:52 +00:00
parent 169e2c7fb7
commit 139c745e6b
8 changed files with 325 additions and 9 deletions

View File

@@ -110,6 +110,7 @@ $(OBJ)\objMareon.js: \
$(MSRC)\A2012_GetOpdrachten.js \
$(MSRC)\T_GetOpdrachten.js \
$(MSRC)\R_GetOpdrachten.js \
$(MSRC)\FCLT_GetOpdrachtBijlages.js \
$(MSRC)\R_SetOpdrachtStatus.js \
$(MSRC)\F_PutOpdrachten.js \
$(MSRC)\A_SetSupplierText.js \

View File

@@ -12,6 +12,7 @@
#include "SRC\A_GetOpdrachten.js"
#include "SRC\A2012_GetOpdrachten.js"
#include "SRC\R_GetOpdrachten.js"
#include "SRC\FCLT_GetOpdrachtBijlages.js"
#include "SRC\R_SetOpdrachtStatus.js"
#include "SRC\T_GetOpdrachten.js"
#include "SRC\F_PutOpdrachten.js"

View File

@@ -45,6 +45,7 @@ function A2012_GetOpdrachten()
__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...
@@ -84,20 +85,26 @@ function A2012_GetOpdrachten()
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);
api_F_PutOpdrachten(v_xml_opdrachten, "AX_OPDRACHTEN");
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);
api_F_PutOpdrachten(v_xml_opdrachten, "AX_OPDRACHTEN");
}
else{
__Log("A2012_GetOpdrachten: Geen opdrachten. SKIP api_F_PutOpdrachten",2);
__Log("A2012_GetOpdrachten: Geen opdrachten. SKIP api_F_PutOpdrachten",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.
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);
}
}
}
function A2012_GetOpdrachten_van_Aannemer(v_supplier_id, v_status_code, v_datum_vanaf, v_datum_tm)
{
@@ -126,3 +133,32 @@ function A2012_GetOpdrachten_van_Aannemer(v_supplier_id, v_status_code, v_datum_
// }
return v_resp;
}
function A2012_GetBijlagen_bij_opdrachten_van_Aannemer(v_supplier_id, v_status_code, v_datum_vanaf, v_datum_tm)
{
var v_API = "SupplierPortalGetDocuRefRequest ";
var v_req = ' <SupplierPortalGetDocuRefRequest xmlns="http://tempuri.org"> '+
'<_vendAccount>'+v_supplier_id+'</_vendAccount>' +
'<_bonStatus>'+v_status_code+'</_bonStatus>'+
'<_startRange>'+v_datum_vanaf+'</_startRange>' +
'<_endRange>'+v_datum_tm+'</_endRange>' +
'</SupplierPortalGetDocuRefRequest>';
var v_type = 0;
var v_soapAction = "SupplierPortal/getDocuRef";
var v_resp = apiAX(v_API, v_req, v_type, v_soapAction);
//if (v_type == 1 && v_resp != "")
// {
// oStream = new ActiveXObject("ADODB.Stream");
// oStream.Open();
// oStream.Type = 1; // adTypeBinary
// oStream.Write(v_resp); // responseText geeft encoding problemen!
// oStream.SaveToFile ("Log/test" + v_supplier_id + ".xml", 2);
// oStream.Close();
// }
return v_resp;
}

View File

@@ -82,6 +82,13 @@ function A_GetOpdrachten()
else{
__Log("A_GetOpdrachten: Geen opdrachten. SKIP api_F_PutOpdrachten",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.
v_xml_bijlagen = A_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);
}
}
}
@@ -103,6 +110,36 @@ var v_soapAction = "";
var v_resp = apiAX(v_API, v_req, v_type, v_soapAction);
//if (v_type == 1 && v_resp != "")
// {
// oStream = new ActiveXObject("ADODB.Stream");
// oStream.Open();
// oStream.Type = 1; // adTypeBinary
// oStream.Write(v_resp); // responseText geeft encoding problemen!
// oStream.SaveToFile ("Log/test" + v_supplier_id + ".xml", 2);
// oStream.Close();
// }
return v_resp;
}
function A_GetBijlagen_bij_opdrachten_van_Aannemer(v_supplier_id, v_status_code, v_datum_vanaf, v_datum_tm)
{
var v_API = "GetDocuRefSpec";
var v_req = ' <GetDocuRefSpec xmlns="http://tempuri.org"> '+
'<vendAccountNum>'+v_supplier_id+'</vendAccountNum>' +
'<bonStatus>'+v_status_code+'</bonStatus>'+
'<startRange>'+v_datum_vanaf+'</startRange>' +
'<endRange>'+v_datum_tm+'</endRange>' +
'</GetDocuRefSpec>';
var v_type = 0;
var v_soapAction = "";
var v_resp = apiAX(v_API, v_req, v_type, v_soapAction);
//if (v_type == 1 && v_resp != "")
// {
// oStream = new ActiveXObject("ADODB.Stream");

View File

@@ -116,6 +116,11 @@ function FCLT_2_Tobias_Facturen(){
// ----------------------------- Facilitor functies -----------------------------------------
function MARX_2_FCLT_NEW_Opdrachten(){
F_GetOpdrachten_NEW();
}
function MARX_2_FCLT_OpmerkingOpdrachten(){
F_GetOpdrachten_Opmerking();
}
@@ -304,7 +309,16 @@ function Tobias_2_FACILITOR()
function MAREON_2_FACILITOR()
{
if (G_mar_sync_bijlages_opdrgvr > 0){
// MARX#57420: Documenten van Tobias AX naar Mareon
// 0/leeg = bestanden vanuit opdrachtgever worden niet gedeeld;
// <> 0 = bestanden vanuit opdrachtgever wel delen met leverancier
// LET OP!: vul voor Faciltior kenmerk-key bijlages in, dus key van flexprop van bijlages uit facilitor omgeving)
//Deze key voor Facilitor moet derhalve > 0 zijn, anders heeft dat geen zin cq. gaat dat fout.
MARX_2_FCLT_NEW_Opdrachten();
}
__Log("*** START MAREON --> CUST.FACILITOR.NL : Opmerking opdrachten uit Mareon naar Facilitor ***", 2);
MARX_2_FCLT_OpmerkingOpdrachten();
__Log("*** END", 2);
@@ -374,6 +388,7 @@ function FACILITOR_2_Xtractor()
// 1.32 -- MARX#56493: Lege plandatum vanuit Mareon naar Tobias-AX wordt in AX2012 niet verwerkt.
// 1.35 -- MARX#56792: Mareon sync adapter aanpassen tbv nieuwe statussen naar Tobias2012 + MARX#57368: Aanpassing 'huidige' aanroep Tobias-AX webservice ivm communicatie logboek
// 1.36 -- MARX#57502: AX Adapter robuuster maken + MARX#57491: Communicatie logboek ook voor Tobias AX 2009
// 1.37 -- MARX#57420: Documenten van Tobias AX naar Mareon
var G_Mareon_Adapter = "1.36";
//MARX#56643: Test Haagwonen inkoopordernummer ontbreekt in Mareon ION001753
@@ -491,7 +506,7 @@ var G_mar_timeout = 0; //initieel 1e keer.
var G_mar_sync_buffer = parseInt(l_array[13]); // Buffer in seconds, extra time overload (overlap van extra tijd)
var G_mar_communicatielogboek = parseInt(l_array[14]); // Opdrachtgever maakt gebruik van communicatielogboek (AX webservice UpdatePurchStatus beschikbaar)
var G_mar_sync_bijlages_opdrgvr = parseInt(l_array[16]); // Bijlages vanuit opdrachtgever worden gedeeld met leverancier indien niet leeg/0. Voor Facilitor vullen met de flexprop-key
if (AX_or_Tobias() == "A")
{

View File

@@ -0,0 +1,63 @@
// --------------------------------------------------------------------------------------
// FCLT_GetOpdrachtBijlages.js
// Copyright 2019 Aareon, unit Facilitor. 053-4800 700, helpdesk@mareon.nl
// Written by MB (2019)
//
// Parameters:
// v_mld_opdr_key_fclt: key van mld_opdr in Facilitor omgeving
// v_mld_opdr_key_marx: key van mld_opdr in Mareon
// v_mld_kenmerk_key_fclt: key van opdracht-kenmerk in Facilitor omgeving
function FCLT_GetOpdrachtBijlages(v_mld_opdr_key_fclt, v_mld_opdr_key_marx, v_mld_kenmerk_key_fclt)
{
var url = G_fclt_url + "api2/orders/" + v_mld_opdr_key_fclt + ".json?scope=fo&include=custom_fields&fileencoding=base64";
var l_json_data =
{
order: {
custom_fields: [
{
propertyid: v_mld_kenmerk_key_fclt
}
]
}
}
l_json_message = JSON.stringify(l_json_data, null, 2);
__Log("l_json_message: " + l_json_message, 3)
var l_response_JSON = FcltAPI2("GET", url, l_json_message);
if (l_response_JSON)
{
__Log("FCLT_GetOpdrachtBijlages: GET", 2);
var data = eval ("(" + l_response_JSON.responseText + ")");
__Log("Opdracht data:" + data, 4);
if ("order" in data && "custom_fields" in data.order)
{ __Log("Opdracht : order", 3);
for (var fld in data.order.custom_fields)
{ __Log("Bijlage custom_fields: fld", 3);
var attarr = data.order.custom_fields[fld].attachments;
if (attarr)
{ __Log("Opdracht 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);
api_F_PutOpdr_Bijlage(v_mld_opdr_key_marx, attarr[i].name, attarr[i].content_base64);
__Log("Bijlage: " + i + " van " + attarr.length + " geupload naar Mareon",2);
}
}
}
}
}
else
{
__Log("FCLT_GetOpdrachtBijlages 1: " + l_response_JSON.responseText,2);
__Log("FCLT_GetOpdrachtBijlages 2: " + l_response_JSON.status, 2);
}
}

View File

@@ -122,6 +122,12 @@ function F_GetMareonInfo()
var l_http_timeout = v_resp.selectSingleNode(l_node);
__Log("l_http_timeout: " + l_http_timeout.text,2);
l_result.push(l_http_timeout.text);
//MARX#57420: Documenten van Tobias AX naar Mareon, via instelling regelen of bijlages vanuit opdrachtgever worden gesynct
var l_node = strQuery + "/mar_sync_bijlages_van_opdrgvr";
var l_sync_bijlages_opdrgvr = v_resp.selectSingleNode(l_node);
__Log("l_sync_bijlages_opdrgvr: " + l_sync_bijlages_opdrgvr.text,2);
l_result.push(l_sync_bijlages_opdrgvr.text);
return l_result;
}

View File

@@ -91,4 +91,161 @@ function F_GetOpdrachten_Key(p_ERP_id, p_mld_opdr_externnr)
return v_mld_opdr_key;
}
//MARX#57420: Documenten van Tobias AX naar Mareon
//Input: v_xml_bijlagen_string, xml(node) met opdrachten en opdrachtregels, daarbinnen de documenten/bijlages.
function api_AX_2_F_Bijlagen(v_xml_bijlagen_string)
{
var v_xml_bijlagen = STR_2_XML(v_xml_bijlagen_string);
var l_xml_opdrachten = v_xml_bijlagen.getElementsByTagName("b:PurchOrder");
__Log("api_AX_2_F_Bijlagen: Aantal opdrachten met bijlage(s) = " + l_xml_opdrachten.length ,2);
// Loop 1. Eerst de loop met alle opdrachten
for (var i=0; i < l_xml_opdrachten.length; i++)
{
var l_mld_opdr_key = -1;
var l_node_opdracht_companyId = l_xml_opdrachten[i].getElementsByTagName("b:CompanyId");
var l_node_opdracht_ionr = l_xml_opdrachten[i].getElementsByTagName("b:PurchId");
if (l_node_opdracht_companyId.length !=0){
l_opdracht_companyId = l_node_opdracht_companyId[0].childNodes[0].nodeValue;
}
if (l_node_opdracht_ionr.length !=0){
l_node_opdracht_ionr = l_node_opdracht_ionr[0].childNodes[0].nodeValue;
}
if (l_opdracht_companyId != "" && l_node_opdracht_ionr != ""){
l_mld_opdr_key = F_GetOpdrachten_Key(l_opdracht_companyId, l_node_opdracht_ionr);
}
__Log("api_AX_2_F_Bijlagen - l_mld_opdr_key: " + l_mld_opdr_key, 2);
if (l_mld_opdr_key != -1){
// Er is een mld_opdracht aangemaakt ovb Tobias ERP-id (l_opdracht_companyId) en daarbinnen het unieke opdrachtnummer l_node_opdracht_ionr.
// Loop 2. Daarna de loop met alle bestanden/documenten op opdracht-kop nivo
l_docs_xml = l_xml_opdrachten[i].getElementsByTagName("b:Documents");
l_aantal_uploads = api_AX_2_F_Verwerk_Documenten (l_mld_opdr_key, l_docs_xml , 0, "b:FileName", "b:Extension", "b:Base64");
// Loop 3. Nu nog de loop met alle opdracht-regels binnen de opdracht
var l_xml_opdrachtregels = l_xml_opdrachten[i].getElementsByTagName("b:SupplierPurchLine");
for (var j=0; j < l_xml_opdrachtregels.length; j++)
{
// Loop 4. Tenslotte de loop met alle bestanden/documenten op betreffende opdracht-regel nivo
l_docs_xml = l_xml_opdrachtregels[j].getElementsByTagName("b:Documents");
l_aantal_uploads = api_AX_2_F_Verwerk_Documenten (l_mld_opdr_key, l_docs_xml, l_aantal_uploads, "b:FileName", "b:Extension", "b:Base64");
}
}
// Opdracht bestaat niet in Mareon, bijlages kunnen (nog) niet worden geupload.
else
{
__Log("api_AX_2_F_Bijlagen: Opdracht " + l_node_opdracht_ionr + " bestaat (nog) niet in Mareon, bijlagen kunnen niet worden geupload.",1);
}
}
}
//MARX#57420: Documenten van Tobias AX naar Mareon
// Inputparamters:
// v_mld_opdr_key = Mareon opdracht key (mld_opdr_key)
// v_xml_documenten = xml met alle documenten (op opdracht- of regelnivo)
// v_aantal_uploads = aantal documenten tot nu toe bij opdracht geupload, initeel waarde 0.
// Er wordt hier in deze functie gecheckt dat het maximum aantal documenten bij een opdracht het maximum (van 10 doen we, vanuit REMS overgenomen) niet wordt overschreden.
// Hierbij wordt geen rekening gehouden met evt. al aanwezige bestanden bij de opdracht, bij een vorige call.
// NB: Ketenstandaard geeft een maximum van 3 bestanden (op opdracht-kop nivo), 10 is daarbij vergeleken heel erg ruim!
// Outputparameter (dwz result) vandeze functie:
// l_result: Aantal bestanden dat erbij is geupload.
function api_AX_2_F_Verwerk_Documenten(v_mld_opdr_key, v_xml_documenten, v_aantal_uploads, v_filename, v_file_extension, v_file_content_base64){
var l_result = 0;
var l_xml_document = v_xml_documenten[0].getElementsByTagName("b:Document");
for (var i=0; i < l_xml_document.length; i++)
{
if (i + v_aantal_uploads < 10){
l_result = i + 1;
var l_bijlage_naam = null;
var l_bijlage_ext = null;
var l_bijlage_base64 = null;
var node_media_id = l_xml_document[i].getElementsByTagName(v_filename);
if (node_media_id.length !=0)
l_bijlage_naam = node_media_id[0].childNodes[0].nodeValue;
__Log("Bestandsnaam[" + i + "] : " + l_bijlage_naam, 2);
var node_media_type = l_xml_document[i].getElementsByTagName(v_file_extension);
if (node_media_type.length !=0)
l_bijlage_ext= node_media_type[0].childNodes[0].nodeValue;
__Log("Bestands-extensie[" + i + "] : " + l_bijlage_ext, 2);
var node_documentinhoud64 = l_xml_document[i].getElementsByTagName(v_file_content_base64);
if (node_documentinhoud64.length !=0){
l_bijlage_base64 = node_documentinhoud64[0].childNodes[0].nodeValue;
}
__Log("DocumentInhoud[" + i + "] : " + l_bijlage_base64, 4);
// Maximaal 10 bijlages staan we per opdracht toe.
if (l_bijlage_base64 && l_bijlage_naam && l_bijlage_ext){
var l_bestandsnaam = l_bijlage_naam + "." + l_bijlage_ext;
__Log("api_AX_2_F_Verwerk_Documenten - l_bestandsnaam : " + l_bestandsnaam, 3);
__Log("api_AX_2_F_Verwerk_Documenten - v_mld_opdr_key : " + v_mld_opdr_key, 3);
if (v_mld_opdr_key != -1) {
__Log("api_AX_2_F_Verwerk_Documenten - Before api_F_PutOpdr_Bijlage : ", 3);
api_F_PutOpdr_Bijlage(v_mld_opdr_key, l_bestandsnaam, l_bijlage_base64);
// ----------------------------------------------------------------------
__Log("api_AX_2_F_Verwerk_Documenten - After api_F_PutOpdr_Bijlage : ", 3);
}
}
}
else
{
__Log("api_AX_2_F_Verwerk_Documenten: Maximum van 10 documenten is bereikt, bijlagen kan niet worden geupload.",1);
}
}
return l_result + v_aantal_uploads;
}
//MARX#57420: Documenten van Tobias AX naar Mareon, webservice om van nieuwe toegevoegde opdrachten in Mareon, de bijlages vanuit opdrachtgever op te halen.
//Deze functie is alleen (en alleen) voor Facilitor - Mareon bedoeld (niet voor AX)
function F_GetOpdrachten_NEW()
{
var v_API = "NEW_OPDR_4FCLT";
var v_APIKEY = G_marx_apikey;
var v_req = "<GetNEW_OPDR_4FCLT><adapterversion>" + G_Mareon_Adapter + "</adapterversion><APIkey>" + v_APIKEY + "</APIkey></GetNEW_OPDR_4FCLT>"
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);
var l_node;
__Log("F_GetOpdrachten_NEW: " + v_resp.text, 3);
// Uitlezen van XML's...
var i = 1;
var strQuery = "//xml/mld_ordr[" + i + "]";
var l_deelxml = v_resp.selectSingleNode(strQuery);
while (l_deelxml)
{
l_node = strQuery + "/mld_opdr_key";
var v_mld_opdr_key_marx = v_resp.selectSingleNode(l_node).text;
l_node = strQuery + "/mld_opdr_key_fclt";
var v_mld_opdr_key_fclt = v_resp.selectSingleNode(l_node).text;
__Log("v_mld_opdr_key_fclt: " + v_mld_opdr_key_fclt,2);
if (AX_or_Tobias() == "F") {
FCLT_GetOpdrachtBijlages(v_mld_opdr_key_fclt, v_mld_opdr_key_marx, G_mar_sync_bijlages_opdrgvr);
}
i = i + 1;
var strQuery = "//xml/mld_ordr[" + i + "]";
l_deelxml = v_resp.selectSingleNode(strQuery);
}
}