Upgrade auf 24.0.0
Unbedingt die aktuellen Installationsvoraussetzungen vorab prüfen!
Diese Anleitung berücksichtigt immer nur den Sprung von der vorhergehenden Version zu der gerade beschriebenen Version. Bei Upgrades über mehrere Versionen hinweg müssen alle Änderungen der Zwischenversionen ebenfalls beachtet werden! Siehe genereller Ablauf von Upgrades.
Breaking Changes
- Workflow-Ext clientside-Scripte in clientHeaderCode migriert (nur One Unity Code). Damit werden auch clientseitige cust-Scripte nicht mehr automatisch geladen (siehe unten)!
Was wurde gemacht?
Zusammenfassung
- Es wurden einige kleine Veränderungen an den Portalskripten vorgenommen, um die Codequalität zu verbessern (OUD-158)
- Die Konfiguration für die automatische Jira-Ticket-Erstellung wurde erweitert (INV-638)
- Bugfixes
Manuell auszuführende Schritte
SPC-Skripte
Für die Skripte dieses Abschnitts ist nur eine manuelle Anpassung notwendig, sofern ein zugehörges cust-Script auf dem System existiert.
Die Codequalitätsverbesserungen (OUD-158) beeinflussen nicht direkt die Funktionalität, sollten aber aus Kompatibilitätsgründen nachgepflegt werden!
Codequalitätsverbesserungen (OUD-158)
ou.spc.global.filetype.action.getMailTemplate.ts (OUD-158)
== zu === geändert:
/* neuer Code */
if (mailTemplate === "") {
/* neuer Code Ende */
context.errorMessage = context.getFromSystemTable("Keine E-Mail Vorlage ausgewählt!");
return -1;
}
ou.spc.global.filetype.action.sendMail.ts (OUD-158)
!=zu!==geändert:
var getInvalidMails = function getInvalidMails(mails) {
return mails.split(",").map(function (to) {
return {
mail: to,
message: (0, ou_spc_MAIL_lib_1.emailCheck)(to)
};
}).filter(function (entry) {
/* neuer Code */
return entry.message !== "OK";
/* neuer Code Ende */
}).map(function (errorEntries) {
return "".concat(errorEntries.mail, " - ").concat(errorEntries.message);
});
};
!=zu!==geändert und Änderung des ersten FunktionsargumentsattachmentszuattachmentString:
/* neuer Code */
function addAttachmentsToMail(attachmentString, mail, currentFile) {
attachmentString.split(/\r?\n/).filter(function (attachment) {
/* neuer Code Ende */
return attachment && attachment.length;
}).forEach(function (attachment) {
var registerAndFileName = attachment.split("|");
var registerName = registerAndFileName[0];
var fileName = registerAndFileName[1];
var register = currentFile.getRegisterByName(registerName);
ou_sp_Iterators_1.Iterators.foreachDocumentsInRegister(register, function (document) {
// Dokument wurde in der Anlage nicht gefunden
/* neuer Code */
if (fileName !== document.fullname) {
/* neuer Code Ende */
logger.warn("".concat(fileName, " was not found in register ").concat(registerName));
return;
}
logger.debug("attach document ".concat(document.fullname, " from register ").concat(registerName, " to mail"));
// Die Anlagen in Mail-Objekt hochladen
if (!mail.addAttachment(document)) {
throw new Error("Es gab ein Problem beim Hochladen der Dokumente!\n".concat(mail.getLastError()));
}
});
});
}
ou.spc.global.filetype.field.attachments.ts (OUD-158)
==zu===geändert:
/* neuer Code */
if (enumval.length === 0) {
/* neuer Code Ende */
enumval.push("");
}
Gadget_ou.spc.global.filetype.register.timeline.sentMails.ts (OUD-158)
!=zu!==geändert:
if (mail.attachments.length > 0 && mail.attachments[0] !== "") content.push("<small><i>Attachments: ".concat(mail.attachments.join(", "), "</small></i>"));
ou.spc.MAIL.filetype.action.onDelete.ts (OUD-158)
!=zu!==geändert:
if (success !== 1) {
ou.spc.MAIL.filetype.action.onSave.ts (OUD-158)
==zu===geändert:
return ftReg.split("-_-")[0] === ft;
!=zu!==geändert:
if (succes !== 1) {
ou.spc.MAIL.lib.ts (OUD-158)
-
Ersetzen aller
++durch+= 1im gesamten Skript -
Anpassung if-Bedingung in der Funktion
checkMandatoryFields:
if (docFile[field] === "" || docFile[field] === null || docFile[field] === undefined) {
==zu===geändert in der FunktionemailCheck:
if (domArr[i].search(atomPat) === -1) {
==zu===geändert in der FunktionemailCheck:
if (user.match(userPat) === null) {
==zu===geändert in der FunktionemailCheck:
if (matchArray === null) {
!=zu!==und==zu===geändert in der FunktionemailCheck:
if (checkTLD && domArr[domArr.length - 1].length !== 2 && domArr[domArr.length - 1].search(knownDomsPat) === -1) {
- Verwenden der neuen Variable
retValstatttextToReplacein der FunktionreplaceTextWithValue:
function replaceTextWithValue(textToReplace, docFile) {
var retVal = textToReplace;
var i = 0;
while (i < retVal.length) {
var index1 = retVal.indexOf("{{");
var index2 = retVal.indexOf("}}");
if (index1 > -1 && index2 > -1) {
var param_1 = retVal.substring(index1 + 2, index2);
retVal = retVal.replace("{{".concat(param_1, "}}"), docFile.getAutoText(param_1));
}
i += 1;
}
retVal = retVal.replace(/<CRLF>/g, "\r\n");
retVal = retVal.replace(/<TAB>/g, "\t");
return retVal;
}
!=zu!==geändert in der FunktiondoWriteTable:
if (fieldsdoc.length !== fieldssql.length)
==zu===geändert in der FunktiondoWriteTable:
if (db && db.getLastError() === null) {
==zu===geändert in der FunktiondoWriteTable:
if (success && db.getLastError() === null) {
- Entfernen der
else-Bedingungen, die nicht notwendig sind in der FunktiondoWriteTable:
function doWriteTable(docFile, table, fieldsdoc, fieldssql, db) {
var fileid = docFile.fileid;
if (fieldsdoc.length !== fieldssql.length) return context.getFromSystemTable("Die Anzahl der Felder im Array stimmt nicht mit der Anzahl der Datenbank Spalten überein");
// Verbindung Datenbank
if (db && db.getLastError() === null) {
// erst einmal alle Tabelleneintraege zur Mappe loeschen
var deleteStatement = ou_sp_DeleteBuilder_1.DeleteBuilder.from(table).where("fileid ='".concat(fileid, "'")).toSQL();
var success = db.executeStatement(deleteStatement);
if (!success) {
var message_1 = "".concat(context.getFromSystemTable("Folgender Fehler trat beim DB Delete auf:"), "\n").concat(db.getLastError());
db.close();
return message_1;
}
// Achtung pro Array-Eintrag eine Tabellenzeile
var insertStatement = ou_sp_InsertBuilder_1.InsertBuilder.into(table).addRange(getInsertFields(docFile, fieldssql, fieldsdoc)).toSQL();
success = db.executeStatement(insertStatement);
if (success && db.getLastError() === null) {
db.close();
return 1;
}
var message_2 = "".concat(context.getFromSystemTable("Folgender Fehler trat beim DB Insert auf:"), "\n").concat(db.getLastError());
db.close();
return message_2;
}
var message = "".concat(context.getFromSystemTable("Verbindung zur Datenbank konnte nicht aufgebaut werden:"), "\n").concat(db.getLastError());
db.close();
return message;
}
==zu===geändert in der FunktiondoDeleteTable:
if (db && db.getLastError() === null) {
- Entfernen der
else-Bedingungen, die nicht notwendig sind in der FunktiondoDeleteTable:
function doDeleteTable(docFile, table, dbConn) {
var fileid = docFile.fileid;
// Verbindung Datenbank
var db = dbConn === undefined ? getOuspDBConn() : dbConn;
if (db && db.getLastError() === null) {
// Alle Tabelleneintraege zur Mappe loeschen
var deleteStatement = ou_sp_DeleteBuilder_1.DeleteBuilder.from(table).where("fileid ='".concat(fileid, "'")).toSQL();
var success = db.executeStatement(deleteStatement);
if (success) {
db.close();
return 1;
}
var message_3 = "".concat(context.getFromSystemTable("Folgender Fehler trat beim DB Delete auf:"), "\n").concat(db.getLastError());
db.close();
return message_3;
}
var message = "".concat(context.getFromSystemTable("Verbindung zur Datenbank konnte nicht aufgebaut werden:"), "\n").concat(db.getLastError());
db.close();
return message;
}
ou.spc.MAIL.lib.ts (OUD-166)
- Die neue Funktion
getDocumentRegistersForFileTypesForSelectListund deren Export muss hinzugefügt werden:
exports.getDocumentRegistersForFileTypesForSelectList = getDocumentRegistersForFileTypesForSelectList;
function getDocumentRegistersForFileTypesForSelectList(fileTypesToSearch) {
var fileTypesWithRegisters = [];
fileTypesToSearch.forEach(function (filetype) {
if (!filetype) {
return;
}
var otrFileType = otrUpgrade.findFileType(filetype);
if (!otrFileType) {
return;
}
var registers = otrUpgrade.getRegistersFromFileType(filetype).filter(function (register) {
return register.Type === "Dokumentenregister";
});
registers.forEach(function (register) {
// @ts-expect-error it is assumed that `Label` exists on the register object
var label = register.Label.startsWith("pf:") ?
// @ts-expect-error it is assumed that `Label` exists on the register object
context.getFromSystemTable(register.Label.slice(3)) :
// @ts-expect-error it is assumed that `Label` exists on the register object
context.getLocaleValue(register.Label);
var fileTypeLabel = otrFileType.MultiLangLabel.startsWith("pf:") ? context.getFromSystemTable(otrFileType.MultiLangLabel.slice(3)) : context.getLocaleValue(otrFileType.MultiLangLabel);
fileTypesWithRegisters.push(["".concat(filetype, "-_-").concat(register.Name), "".concat(fileTypeLabel, " - ").concat(label)]);
});
});
return fileTypesWithRegisters;
}
ou.spc.global.job.emailMonitoring (INV-638)
Für die Jira-Ticket-Erstellung wird nun die neue Funktion aus der Library verwendet.
Folgender Import kann entfernt werden:
var ou_sp_HttpClient_1 = require("ou.sp.HttpClient");
Folgender Import muss hinzugefügt werden:
const ou_sp_Jira_1 = require("ou.sp.Jira");
Nun muss die Funktion createJiraTicket angepasst werden:
Vorher:
function createJiraTicket(failedEmails) {
var _a;
var errorMsg = "E-Mail mit fehlgeschlagener Versendung identifiziert:\n\n\n".concat(failedEmails[0].sendLog, "\n\nGesamtanzahl fehlgeschlagener E-Mails am ").concat(util.convertDateToString(context.addTimeInterval(new Date(), -1, "days", false), "dd.mm.yyyy"), ": ").concat(failedEmails.length, "\n\nBitte pr\u00FCfen und ggf. erneut versenden.");
var _b = (_a = ou_sp_oud_settings_1.default.emailMonitoring) !== null && _a !== void 0 ? _a : {
customerEmail: "not set",
customerKey: "not set",
systemKey: "not set",
productKey: "not set",
priority: "not set"
},
customerEmail = _b.customerEmail,
customerKey = _b.customerKey,
systemKey = _b.systemKey,
productKey = _b.productKey,
priority = _b.priority;
var client = new ou_sp_HttpClient_1.HttpClient();
var data = {
template: "error-report",
variables: {
customerEmail: customerEmail,
customer: customerKey,
system: systemKey,
product: productKey,
error: errorMsg,
priority: priority
}
};
var result = client.post("https://mail-service.one-unity.cloud/mail", JSON.stringify(data));
if (result.status != 201) {
throw new Error("Mail-service request failed with ".concat(result.data, " exitCode was: ").concat(result.status));
}
}
Nachher:
function createJiraTicket(failedEmails) {
const errorMsg = `E-Mail mit fehlgeschlagener Versendung identifiziert:\n\n\n${failedEmails[0].sendLog}\n\nGesamtanzahl fehlgeschlagener E-Mails am ${util.convertDateToString(context.addTimeInterval(new Date(), -1, "days", false), "dd.mm.yyyy")}: ${failedEmails.length}\n\nBitte prüfen und ggf. erneut versenden.`;
const config = ou_sp_oud_settings_1.default.jiraReportConfig?.emailMonitoring;
if (!config) {
logger.error("Jira report configuration for email monitoring is not defined");
return;
}
(0, ou_sp_Jira_1.createJiraErrorReport)(config, errorMsg);
}
Cust-Skripte
Codequalitätsverbesserungen (OUD-158)
ou.cust.oud.settings (INV-638)
Die Konfiguration für die automatische Jira-Ticket-Erstellung kann nun jeweils für die Email-Überwachung sowie für den Stammdatenupload in diesem Skript definiert werden:
Vorher:
var emailMonitoring = {
customerEmail: "abc@xyz.com",
customerKey: "CXXXX",
systemKey: "OUK-XXXX",
productKey: "OUK-XXXX",
priority: "medium"
};
exports.emailMonitoring = emailMonitoring;
Nachher:
var jiraReportDefault = {
customerEmail: "abc@xyz.com",
customerKey: "CXXXX",
systemKey: "OUK-XXXX",
productKey: "OUK-XXXX",
priority: "medium"
};
var jiraReportConfig = {
emailMonitoring: jiraReportDefault,
masterDataUpload: jiraReportDefault
};
exports.jiraReportConfig = jiraReportConfig;
Außerdem ist die Eigenschaft clientHeaderCodeScriptsToLoad hinzugekommen, welche einfach unten eingefügt werden kann:
const clientHeaderCodeScriptsToLoad = [];
exports.clientHeaderCodeScriptsToLoad = clientHeaderCodeScriptsToLoad;
Löschen in Workflow-ext
Folgende Ordner/Dateien können in Workflow-ext entfernt werden:
Workflow-ext/ou/sp/oudWorkflow-ext/ou/cust/script-callbacks-file-example.js
Scripte in Workflow-ext/ou/cust/* werden mit dieser Version nicht mehr automatisch geladen. Sie müssen nun in PortalScripte verschoben und via clientHeaderCode geladen werden.
Clientseitige Scripte aus Workflow-ext/ou/cust/* können einfach in ein Portalscript verschoben werden (mit Portalscript-Eigenschaft clientExecutable=true). Anschließend in ou.cust.oud.settings im Array clientHeaderCodeScriptsToLoad die Namen der neuen Portalscripte eintragen. Bei den Standard überschreibenden Scripten ist ggf. eine andere Logik erforderlich, da hier die sp-Scripte aus der Ladelogik entfernt werden müssen - siehe dazu die Upgrade-Dokumentation der betroffenen Produkte, z.B. OUSP Invoice!
Umgebungsvariablen-Setup ausführen (Windows)
Das Umgebungsvariablen-Setup muss nochmals ausgeführt werden, siehe Installation.