Files
Facilitor/UTILS/PutOrders/puo_sendfile.js
Jos Groot Lipman eb17d85472 FSN#38889 Beter omgaan met undefined parameter waarden
svn path=/Website/trunk/; revision=32198
2017-01-03 19:55:16 +00:00

520 lines
19 KiB
JavaScript

// ******************************************
// * $Id$
// *
// * sendOrder()
// *
// * private functies:
// * GetExtension()
// * connectFile()
// * connectFtp()
// * connectHTTP()
// * connectMail()
// *
// ******************************************
function GetExtension(xmlDoc, xslDoc)
{
// Company has a stylesheet defined. Use this stylesheet to generate a formatted order
var Extension = "html";
var xslt = new ActiveXObject("Msxml2.XSLTemplate.6.0");
xslDoc.resolveExternals = true; // anders op de volgende regel al:
// A reference to variable or parameter 'srtnotificatiecode' cannot be resolved
xslt.stylesheet = xslDoc;
var xslProc = xslt.createProcessor();
xslProc.input = xmlDoc;
xslProc.addParameter("mode", "getExtension");
xslProc.transform();
var fileExt = xslProc.output;
Log2File(2, "File ext: " + fileExt);
// Was in Putorders.exe fout: als je outputmode xsl:output method="text" gebruitk
// krijg je geen xml-node met bijvoorbeeld <format><extension>csv</extension></format>
// maar gewoon csv
// Uiteindelijk eindigde je dan met fallback naar txt!!
// var extDoc = SafeLoadTextXML(fileExt);
var extDoc = new ActiveXObject("Msxml2.DOMDocument.6.0");
extDoc.async = false;
extDoc.loadXML(fileExt);
if (extDoc.parseError.errorCode != 0)
{
// no valid xml structure, doctype of output is probably in text format
Log2File(1, "Output format is text");
Extension = "txt";
}
else
{
extDoc.setProperty("SelectionLanguage", "XPath");
var extensionNode = extDoc.selectSingleNode("//format/extension")
if (!extensionNode)
{
Log2File(2, "extensionNode Is Nothing");
Extension = "html";
}
else
{
Log2File(2, "extensionNode is defined");
Extension = extensionNode.text;
}
Log2File(2, "Extension: " + Extension);
}
return Extension;
}
// JGL Volgens mij is er juni 2014 geen enkele klant die dit gebruikt.
function connectFile(p_connect, p_textstream, p_filename)
{
var filename = p_connect.CurrentAddress + p_filename;
Log2File(1, "Sending File as: " + filename + "...");
p_textstream.SaveToFile(filename, 2); // adSaveCreateOverWrite
var resultcode = 0;
var errText = "";
Log2File(2, "*< connectFile");
return {resultcode: resultcode, errtext: errText};
}
function connectHTTP( p_connect
, p_textstream
, p_xsldoc
, p_bedrijfadres
, p_filename
)
{
Log2File(1, "Sending HTTP as: " + p_filename + "...");
var resultcode = -1;
var errText = "";
var mode = "";
var submitResult;
if (p_bedrijfadres.ordermode == 0)
{
mode = "HTTP";
Log2File(2, "Before SendOrder submitHTTP");
submitResult = submitHTTP( p_connect
, p_textstream
, p_bedrijfadres);
Log2File(2, "HTTPresult: " + submitResult);
}
else if (p_bedrijfadres.ordermode & 1)
{
mode = "SOAP";
Log2File(2, "Before SendOrder SubmitDOMSOAP");
submitResult = submitDOMXSLSOAP( p_connect
, p_textstream
, p_xsldoc
, p_bedrijfadres
);
Log2File(2, "(base64-decoded) response: " + submitResult)
// SOAPresult bevat nu doorgaans een cXML response, anders was er wel een error geraised
//
// Van cxml gaan we nog weer controleren of het verzendresultaat goed is
}
else
{
Log2File(0, "Ongeldig order_mode: " + p_bedrijfadres.ordermode);
}
if (mode = "SOAP")
{
resultcode = 0;
// xml maar even eruit gehaald omdat API requests soms falen en deze geven dan geen geldige
// xml terug.
if (p_bedrijfadres.extension == "cxml" || p_bedrijfadres.extension == "xxml")
{
var XMLresult = new ActiveXObject("Msxml2.DOMDocument.6.0");
var xmlDoc = SafeLoadTextXML(submitResult);
TestAndRaiseAnXMLError("Error in xXML "+mode+" response", xmlDoc);
if (p_xsldoc)
{
xmlDoc.transformNodeToObject(p_xsldoc, XMLresult);
Log2File(3, "(c)XML response: " + XMLresult.xml);
TestAndRaiseAnXMLError("Analyseren (c)XML response", XMLresult);
if (XMLresult.text)
{
Log2File(1, "(c)XML resultaat error: " + XMLresult.xml);
resultcode = 1;
errText = XMLresult.text;
}
}
else
{
Log2File(3, "(c)XML response: niet gegenereerd");
}
}
}
Log2File(2, "*< connectHTTP");
return {resultcode: resultcode, errtext: errText};
}
function connectFTP( p_connect
, p_bedrijfadres
, p_textstream
, p_filename
, p_attachfolder
)
{
Log2File(1, "Sending FTP as: " + p_filename + "...");
// De opdracht:
Log2File(2, "Sending data as file: " + p_filename + " (" + p_textstream.Size + " bytes)");
var FTPresult = sendFTP(p_connect, p_filename, p_textstream); // send text data
//
// Stuur alle flexfiles (type M(ap) en F(file)) ook mee
if (FTPresult && p_attachfolder)
{
var objFso = new ActiveXObject("Scripting.FileSystemObject");
if (objFso.FolderExists(p_attachfolder))
{
var objFolders = objFso.GetFolder(p_attachfolder);
var subFolders = new Enumerator(objFolders.SubFolders);
for (; !subFolders.atEnd(); subFolders.moveNext())
{
var objFiles = objFso.GetFolder(subFolders.item());
var allFiles = new Enumerator(objFiles.files);
for (; !allFiles.atEnd(); allFiles.moveNext())
{
var attFile = allFiles.item();
Log2File(1, "Sending attachment: " + attFile.Path + " (" + attFile.Size + " bytes)");
var filename = safe.filename(attFile.Name, "/", "_");
FTPresult = sendFTP(p_connect, filename, "", attFile.Path);
}
}
}
}
var resultcode = -1;
var errText = "";
if (FTPresult)
{
resultcode = 2;
}
Log2File(2, "*< connectFTP");
return {resultcode: resultcode, errtext: errText};
}
function connectMail( p_connect
, p_textstream
, p_xmlData
, p_bedrijfadres
, p_xslPath
, p_ordernr
, p_order_key
, p_attachfolder
, p_sender
, XMLnode
, p_filename
)
{
Log2File(1, "Sending email as: " + p_filename + "...");
var resultcode = -1;
var errText = "";
if ( S("puo_fromaddress") && S("puo_fromaddress") != "null" && S("puo_fromaddress") != "nodefault")
{
// Compose mail
Log2File(2, "Before SendMail");
var body = "Opdracht nr. " + p_ordernr + " is middels Facilitor bij u geplaatst."
+ " De specificatie van de bestelling is bijgevoegd als document: " + p_filename;
var mailResult = false;
var encryptpass = "";
if ((p_bedrijfadres.ordermode & 2) != 0) // Ooit bedacht om vertaaldocumenten encryped te versturen
{ // Dat werd echter niet door virusscanners geaccepteerd dus
// nooit in gebruik genomen
encryptpass = p_bedrijfadres.certificateName;
}
var mailsubject = getMailSubject(XMLnode, p_order_key, p_ordernr);
// Alleen txt en html kunnen eventueel in de mailbody
var mail_to = p_connect.mailto;
var params = { attachFolder: p_attachfolder
, attachPassword: encryptpass
, include_file: p_bedrijfadres.AttachFile
, cc : S("puo_cc")
, bcc : S("puo_bcc")
, receiptto : S("puo_receiptto")
};
if ((p_bedrijfadres.ordermode & 1) == 0) // In body
{
if (p_bedrijfadres.extension == "html")
{
// Use the mailer translation function in case the html is added to the body
// to be able to add the logo and to include the email parameter
var content = XML2HTML( p_xmlData
, p_xslPath
, ""
, "email"
);
params.attachFileName = p_filename; //JGL Volgens mij don't care parameter
mailResult = sendMail( p_sender
, mail_to
, mailsubject
, ""
, content
, params
);
}
else
{
mailResult = sendMail( p_sender
, mail_to
, mailsubject
, stream2text(p_textstream)
, ""
, params
);
}
}
else // Plain body met verwijzing naar de attachment, waarschijnlijk een XML
{
params.attachFileName = p_filename;
params.attachStream = p_textstream;
mailResult = sendMail( p_sender
, mail_to
, mailsubject
, body
, ""
, params
);
}
if (mailResult)
{
resultcode = 2;
}
else
{
Log2File(0, "Ordering email not sent..");
}
}
else
{
Log2File(0, "Ordering email not sent...");
}
Log2File(2, "*< connectMail");
return {resultcode: resultcode, errtext: errText};
}
// Public functies
function SendOrder( p_connect
, p_xmlData
, p_bedrijfadres
, p_xslPath
, p_ordernr
, p_order_key
, p_attachfolder
, p_sender
, XMLnode
, p_code
)
{
// Input:
// Order_mode 0=in body, 1=attachment
// +2='encrypt' opdracht mail attachments met 'certificateName'
// +4='donot doublebase64encode'
// Resultaat:
// 0 Alles ok
// -1 Technische fout, bijvoorbeeld geen Certificaat, geen HTTPS verbinding of ongeldige SOAP envelop
// 1 Logische fout in bijvoorbeeld de cXML zoals leverancier niet bekend o.i.d.
// errText wordt eventueel met een tekst gevuld
// 2 OK maar geen bevestiging ontvangen bij mail, file en FTP
Log2File(2, "*> sendOrder");
try
{
if (!p_xslPath)
{
throw new UserException(1000, "PutOrders", "No path specified");
}
var resultcode = -1;
var errText = "Onbekende fout";
Log2File(3, "In SendOrder sender=" + p_sender);
// Company has a stylesheet defined. Use this stylesheet to generate a formatted order
// Voor AKZA/GTI is dit bijvoorbeeld een eigen formaat
// Voor UWVA/Westplant is dit een cXML
// Load stylesheet
Log2File(1, "Load company style: " + p_xslPath);
var xslDoc = SafeLoadFileXSL(p_xslPath);
xslDoc.setProperty("SelectionNamespaces", "xmlns:xsl='http://www.w3.org/1999/XSL/Transform'"); // verderop nodig
var xmlDoc = SafeLoadTextXML(p_xmlData);
if (!p_bedrijfadres.extension)
{
p_bedrijfadres.extension = GetExtension(xmlDoc, xslDoc) // Old style via XSL
}
if (p_bedrijfadres.extension)
{
var streamResult = new ActiveXObject("ADODB.Stream");
streamResult.Type = 2; // adTypeText
streamResult.Charset = 'utf-8';
// Kijk of er in de XSL naar een andere encoding wordt getransformeerd
// Naar Windows-1252 kregen we namelijk problemen bij Extended ASCII
// karakters op Windows 2008 (AAIT#31212)
if (xslDoc.selectSingleNode("//xsl:output"))
{
var enc = xslDoc.selectSingleNode("//xsl:output").getAttribute("encoding");
if (enc)
{
Log2File(2, "Forcing stream encoding to: " + enc);
streamResult.Charset = enc;
}
}
streamResult.Open();
if (p_bedrijfadres.extension == "xml" || p_bedrijfadres.extension == "cxml")
{
result = XML2HTML( p_xmlData
, p_xslPath
, p_code
, ""
)
var XMLResult = new ActiveXObject("Msxml2.DOMDocument.6.0");
XMLResult.async = false;
XMLResult.loadXML(result);
TestAndRaiseAnXMLError("Error in SendOrder XML2HTML result", XMLResult);
// Eventuele attachements inplakken
//Log2File(2, "Order: " + XMLResult.xml);
XMLResult = mergeXMLAttachments(XMLResult);
XMLResult.save(streamResult);
//Log2File(2, "Order2: " + XMLResult.xml);
}
else // Bijvoorbeeld csv
{
xmlDoc.transformNodeToObject(xslDoc, streamResult);
}
LogStream2File(2, "transformed", streamResult, p_bedrijfadres.extension);
streamResult.Position = 0;
// file naam mag geen / bevatten
var filename = p_ordernr + "." + p_bedrijfadres.extension;
filename = safe.filename(filename, "/", "_");
var connectResult = {};
if (p_connect.Connected)
{
if (p_connect.isFile)
{
filename = "Opdr_" + filename;
connectResult = connectFile( p_connect
, streamResult
, filename
);
}
else if (p_connect.isHTTP || p_connect.isHTTPS)
{
connectResult = connectHTTP( p_connect
, streamResult
, xslDoc // voor de terugweg
, p_bedrijfadres
, filename
);
}
else if (p_connect.isFTP)
{
filename = "o_" + filename;
connectResult = connectFTP( p_connect
, p_bedrijfadres
, streamResult
, filename
, p_attachfolder
);
}
else if (p_connect.isMail)
{
filename = "Opdr_" + filename;
connectResult = connectMail( p_connect
, streamResult
, p_xmlData
, p_bedrijfadres
, p_xslPath
, p_ordernr
, p_order_key
, p_attachfolder
, p_sender
, XMLnode
, filename
);
}
else
{
// no connection
}
} // p_connected.Connected
resultcode = connectResult.resultcode;
errText = connectResult.errtext;
} //extension != ""
}
catch(e)
{
Log2File(0, "Error (SendOrder) sending " + (filename||"") + ": " + e.description);
resultcode = -1;
errText = e.description;
}
finally
{
}
Log2File(2, "*< sendOrder");
return {resultcode: resultcode, errtext: errText};
}
function getMailSubject(pXMLnode, pOpdrKey, ordernr)
{
var sqlS = "";
var MailSubject = "";
switch (pXMLnode)
{
case "opdracht":
{
MailSubject = S("puo_subjectprefixmld");
sqlS = "SELECT mld.opdrsprintf(" + safe.quoted_sql(MailSubject) + "," + pOpdrKey + ") subj FROM DUAL";
break;
}
case "bestelopdr":
{
MailSubject = S("puo_subjectprefix");
sqlS = "SELECT bes.opdrsprintf(" + safe.quoted_sql(MailSubject) + "," + pOpdrKey + ") subj FROM DUAL";
break;
}
case "contract":
{
MailSubject = S("puo_subjectprefixcnt");
sqlS = "SELECT cnt.sprintf(" + safe.quoted_sql(MailSubject) + "," + pOpdrKey + ") subj FROM DUAL";
break;
}
}
if (MailSubject.indexOf("##") == -1)
{
MailSubject = MailSubject + ordernr; // Geen ##, backwards compatible toch nummer erbij
}
else
{
var oRsS = Oracle.Execute(sqlS);
MailSubject = oRsS("subj").value;
oRsS.Close();
}
return MailSubject;
}