Zum Hauptinhalt springen

Upgrade auf 24.0.0

gefahr

Unbedingt die aktuellen Installationsvoraussetzungen vorab prüfen!

tipp

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

tipp

Für die Skripte dieses Abschnitts ist nur eine manuelle Anpassung notwendig, sofern ein zugehörges cust-Script auf dem System existiert.

tipp

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 Funktionsarguments attachments zu attachmentString:
/* 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 += 1 im gesamten Skript

  • Anpassung if-Bedingung in der Funktion checkMandatoryFields:

    if (docFile[field] === "" || docFile[field] === null || docFile[field] === undefined) {
  • == zu === geändert in der Funktion emailCheck:
    if (domArr[i].search(atomPat) === -1) {
  • == zu === geändert in der Funktion emailCheck:
  if (user.match(userPat) === null) {
  • == zu === geändert in der Funktion emailCheck:
  if (matchArray === null) {
  • != zu !== und == zu === geändert in der Funktion emailCheck:
  if (checkTLD && domArr[domArr.length - 1].length !== 2 && domArr[domArr.length - 1].search(knownDomsPat) === -1) {
  • Verwenden der neuen Variable retVal statt textToReplace in der Funktion replaceTextWithValue:
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 Funktion doWriteTable:
    if (fieldsdoc.length !== fieldssql.length)
  • == zu === geändert in der Funktion doWriteTable:
  if (db && db.getLastError() === null) {
  • == zu === geändert in der Funktion doWriteTable:
    if (success && db.getLastError() === null) {
  • Entfernen der else-Bedingungen, die nicht notwendig sind in der Funktion doWriteTable:
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 Funktion doDeleteTable:
  if (db && db.getLastError() === null) {
  • Entfernen der else-Bedingungen, die nicht notwendig sind in der Funktion doDeleteTable:
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 getDocumentRegistersForFileTypesForSelectList und 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.client.settings.ts (OUD-158)

  • == zu === geändert:
if (context.currentUser === "lcmAdmin") {

ou.cust.global.filetype.field.eMailAddress.autoComplete.ts (OUD-158)

  • != zu !== geändert:
      if (sUser.email !== "") {

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/oud
  • Workflow-ext/ou/cust/script-callbacks-file-example.js
gefahr

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.

tipp

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.