Files
Mareon/ax/SRC/F_PutOpdrachten.js

293 lines
14 KiB
JavaScript

// --------------------------------------------------------------------------------------
// F_GetSuppliers.js
// Copyright 2014 SG|facilitor. 053-4800 700, helpdesk@sgfacilitor.nl
// Written by MB (2014)
//
// MAREON Connector/Adapter Ax -> FACILITOR en Facilitor -> Ax
// --------------------------------------------------------------------------------------
function api_F_PutOpdr_Bijlage(p_url, p_apikey, p_mld_opdr_key, p_bestandsnaam, p_bijlage64, p_kenmerk_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 http://uwva.facws001.sg.nl/trunk/api2/issues/1021288.html?include=custom_fields&fileencoding=base64&fields=custom_fields
__Log("Start api_F_PutOpdr_Bijlage: ", 2);
try{
var v_url = p_url + "api2/orders/" + p_mld_opdr_key + ".json?scope=fo&include=custom_fields&fileencoding=base64";
var l_json_data =
{
order: {
custom_fields: [
{
propertyid: p_kenmerk_key,
attachments: [
{
name: p_bestandsnaam,
content_base64: p_bijlage64
}
]
}
]
}
}
l_json_message = JSON.stringify(l_json_data, null, 2);
var v_discard_active_abort = 1; //In geval van 500-error, geen active abort... (MARX#61048: Documenten versturen van Mareon naar AX)
var v_suppress_req_logging = 0; // Json message gewoon loggen indien dat gewenst is, dus niet onderdrukken.
var l_response_JSON = FcltAPI2(p_apikey, "PUT", v_url, l_json_message, v_discard_active_abort, v_suppress_req_logging);
//l_response_JSON_text = JSON.stringify(l_response_JSON, null, 2);
__Log("l_response_JSON_text:" + l_response_JSON, 3);
return l_response_JSON;
}
catch(e)
{
__Log("api_F_PutOpdr_Bijlage: catch met propertyid" + p_kenmerk_key, 3);
return null;
}
}
function F_GetOpdrachten_Key(p_ERP_id, p_mld_opdr_externnr)
{
var v_mld_opdr_key = "-1";
var v_API = "GET_OPDRDATA_4AX";
var v_APIKEY = G_marx_apikey;
var v_req = "<GetGET_OPDRDATA_4AX><adapterversion>" + G_Mareon_Adapter + "</adapterversion><APIkey>" + v_APIKEY + "</APIkey><ax_company_id>" + p_ERP_id + "</ax_company_id><mld_opdr_externnr>" + p_mld_opdr_externnr + "</mld_opdr_externnr></GetGET_OPDRDATA_4AX>"
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);
var l_node;
__Log("F_GetOpdrachten_Key: " + v_resp.text,3);
// Uitlezen van XML's...
var i = 1;
var strQuery = "//xml/mld_ordr[" + i + "]";
var l_deelxml = v_resp.selectSingleNode(strQuery);
if (l_deelxml)
{
var l_node = strQuery + "/mld_opdr_key";
var v_mld_opdr_key = v_resp.selectSingleNode(l_node).text;
}
__Log("v_mld_opdr_key: " + v_mld_opdr_key,2);
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);
var l_opdr_str = "";
var l_marx_api = "ACTION_REF_KEY";
var l_import_action = "OPDR_POST_BIJLAGE";
// 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");
}
l_opdr_str = l_opdr_str + "<action><action_code>" + l_import_action + "</action_code>" + "<ref_key>" + l_mld_opdr_key + "</ref_key></action>";
}
// 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);
}
}
if (l_opdr_str != ""){
// Er zijn (nieuwe) bijlages bij minimaal 1 opdracht geupload
l_opdr_str = "<xml>" + l_opdr_str + "</xml>";
api_F_PutXML(l_opdr_str, l_marx_api);
}
}
//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);
// Kenmerk-key in Mareon waarin de bijlagen terecht moet komen is key 20.
var l_upload_success = api_F_PutOpdr_Bijlage(G_marx_url, G_marx_apikey, v_mld_opdr_key, l_bestandsnaam, l_bijlage_base64, 20);
if (l_upload_success == null){
// Upload niet gelukt, b.v. omdat opdracht al gesloten was (technisch gereed of afgewezen), of omdat file-extensie niet geoorloofd, omdat ....
// Dat zouden we kunnen tracken bij de opdracht, b.v. via algemene API 'ACTION_REF_KEY' onder een CUST-notify, doen we vooralsnog ff niet
// We loggen dat iig wel...
__Log("Upload failure api_AX_2_F_Verwerk_Documenten: Bijlage " + l_bestandsnaam + " NIET geupload naar kenmerk ",1);
}
// ----------------------------------------------------------------------
__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, 0);
var l_node;
var l_opdr_str = "";
__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);
l_opdr_str = l_opdr_str + F_Putorders_NEW(v_mld_opdr_key_marx, v_mld_opdr_key_fclt);
i = i + 1;
var strQuery = "//xml/mld_ordr[" + i + "]";
l_deelxml = v_resp.selectSingleNode(strQuery);
}
F_GetOpdrachten_NEW_POST (l_opdr_str);
}
// MARX#65463: Bijlages komen niet aan AAGN -> Schekman
// Ophalen van bijlages vanuit, in beide gevallen, dwz vanuit oude SYNC-mode en ook vanuit de nieuwe NQ-modes
// Uitgestelde Putorders/mar_send_mld_opdr_to_supplier uit mar_update_gen_opdrachten (mareon.sql) moet nog aangeslingerd worden, onvoorwaardelijk, of er nu bijlages zijn gevonden of niet.
// Deze functie is alleen voor Facilitor (niet Tobias etc) bedoeld!
function F_Putorders_NEW(v_mld_opdr_key_marx, v_mld_opdr_key_fclt)
{
var l_import_action = "OPDR_POST_PUTORDERS";
var l_opdr_str = "";
if (AX_or_Tobias() == "F") {
if (G_mar_sync_bijlages_opdrgvr != '0' && G_mar_sync_bijlages_opdrgvr != '-1'){
// MARX#57420: Documenten van Tobias AX naar Mareon
// 0/leeg = bestanden vanuit opdrachtgever worden niet gedeeld;
// <> 0 = bestanden vanuit opdrachtgever wel delen met leverancier, default wordt door import nieuwe woco/opdrachtgever de waarde -1 ingevuld, mn voor Tobias bedoeld, hiermee wordt bereikt dat default wel bijlages wordt uitgewisseld.
// LET OP!: vul voor Faciltior kenmerk-key bijlages in, dus key van flexprop van bijlages uit facilitor omgeving, -1 is daarbij geen geldige waarde/key voor kenmerk, en betekent geen uitwisseling)
//Deze key voor Facilitor moet derhalve > 0 zijn, anders heeft dat geen zin cq. gaat dat fout.
v_aantal_bestanden = FCLT_2_MARX_PutOpdrachtBijlages(v_mld_opdr_key_fclt, v_mld_opdr_key_marx);
}
}
l_opdr_str = l_opdr_str + "<action><action_code>" + l_import_action + "</action_code>" + "<ref_key>" + v_mld_opdr_key_marx + "</ref_key></action>";
return l_opdr_str;
}
function F_GetOpdrachten_NEW_POST (l_opdr_str)
{
var l_marx_api = "ACTION_REF_KEY";
if (l_opdr_str != ""){
// Er zijn (nieuwe) bijlages bij minimaal 1 opdracht geupload, of in geval van NQ altijd een post-bericht (uitgesteld putorders)...
l_opdr_str = "<xml>" + l_opdr_str + "</xml>";
api_F_PutXML(l_opdr_str, l_marx_api);
}
}