Zum Hauptinhalt springen

Upgrade auf 23.2.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.

Was wurde gemacht?

Zusammenfassung

  • INV-549
    • Verhalten bei Ablehnung von Mappen verbessern: "Ablehnungsgrund" mit Historien-Feld in der Dokumentenansicht
    • ACHTUNG: siehe Unterpunkt "Manuell auszuführende Schritte"
  • Auflösung Cust-Skripte INV-564
    • Alle cust-Skripte in Invoice wurden in spc-Skripte umgewandelt oder anderweitig aufgelöst; das betrifft alle Skripte der Kategorien globalcust, mail, ptpCFGcust, ptpINVcust, ptpRECcust, ptpVENcust
    • Diese umfassenden Änderungen erfordern sehr viele manuell auszuführende Schritte (siehe unten)
  • Am Mappentyp ptpInvoice wurde das Feld hasEInvoiceDocument entfernt

Manuell auszuführende Schritte

tipp

Diese Anleitung berücksichtig immer nur den Sprung von der vorhergehenden Version zu der gerade beschrieben Version. Bei Upgrades über mehrere Versionen hinweg müssen alle Änderungen der Zwischenversionen ebenfalls beachtet werden!

Mappentypen

  • An den Mappen des Mappentyps ptpInvoice muss überprüft werden, ob das Löschen des Feldes hasEInvoiceDocument durch das Update-Skript erfolgreich war. Sofern das Feld noch an Mappen existiert, muss am Mappentyp einmal die Aktion 'Mappen ändern' ausgeführt werden. Ist das Feld danach immer noch da, muss am Mappentyp temporär eine Änderung vorgenommen werden (z. B. Leerzeichen im Namensfeld eintragen), diese wieder rückgängig gemacht und danach einmal auf 'Übernehmen' und anschließend auf 'Mappen ändern' geklickt werden. Das Feld sollte nun verschwunden sein.

Scripting

warnung

Es wird empfohlen, diesen ersten Schritt mit einem Entwickler gemeinsam durchzugehen

Da nun alle cust-Skripte durch spc-Skripte ersetzt wurden, ist es notwendig, alle cust-Skripte, die direkt ausführbaren Code und KEIN customizing enthalten, zu löschen. (Siehe unten für die Liste aller Skripte, die direkt ausführbaren Code enthalten) Was gilt als Skript, das direkt ausführbaren Code enthält?

Skript mit direkt ausführbarem Code, d.h. das Skript selbst gibt einen Wert zurück:

function doSomething() {
const docFile = context.file;
...
return -1;
}

context.returnValue = doSomething();

Skript ohne direkt ausführbaren Code, d.h. das Skript stellt nur Funktionen für andere Skripte zur Verfügung:

function someFunctionToExport(docFile) {
...
return -1;
}

exports.someFunctionToExport = someFunctionToExport;

cust-Skripte hingegen, die direkt ausführbaren Code UND customizing enthalten, d.h. sich vom gleichnamigen cust-Skript, das mit dem Standard zur jeweiligen Version ausgeliefert wurde, unterscheiden, müssen ein wenig modifiziert werden, sodass ihre Logik weiterhin die Standard-Logik überschreibt. Nämlich muss der Code in eine Funktion executeDirectly gepackt (die Funktion muss exakt so heißen!) und diese Funktion dann exportiert werden.

Vorher:

const libA = require("ou.sp.libA");
const libB = require("ou.sp.libB");

const docFile = context.file;

if (docFile.globalState === 100) {
context.returnValue = 1;
} else {
context.returnValue = -1;
}

Nachher:

const libA = require("ou.sp.libA");
const libB = require("ou.sp.libB");

function executeDirectly() {
const docFile = context.file;

if (docFile.globalState === 100) {
return 1;
} else {
return -1;
}
}

exports.executeDirectly = executeDirectly;

Für die Entscheidung, ob ein cust-Skript Code enthält, der vom ursprünglichen und gleichnamigen cust-Skript abweicht, kann ein Entwickler die Skripte zur Verfügung stellen, die mit der Invoice-Version, die aktuell beim Kunden installiert ist, ausgeliefert wurden.

Hier ist die Liste mit allen cust-Skripten aus dem Standard, die direkt ausführbaren Code enthalten und zu spc-Skripten umgewandelt wurden:

  • ou.cust.MAIL.filetype.action.help.ts
  • ou.cust.MAIL.filetype.field.assignedRegister.ts
  • ou.cust.MAIL.filetype.field.fileType.ts
  • ou.cust.MAIL.filetype.action.copy.ts
  • ou.cust.MAIL.filetype.action.onSave.ts
  • ou.cust.MAIL.filetype.action.delete.ts
  • ou.cust.MAIL.filetype.action.onDelete.ts
  • ou.cust.MAIL.filetype.assignedRegister.ts
  • Gadget_ou.cust.cfgBT.filetype.field.multiTable.ts
  • ou.cust.ptpVendorSettings.filetype.action.onSave.ts
  • ou.cust.cfgBT.filetype.action.delete.ts
  • Gadget_ou.cust.ptpVendorSettings.filetype.field.html.summary.ts
  • ou.cust.ptpVendorSettings.folder.action.storeGlobalSettings.ts
  • ou.cust.ptpVendorSettings.filetype.action.onDelete.ts
  • ou.cust.cfgBT.filetype.action.onsave.ts
  • ou.cust.ptpVendorSettings.filetype.Property.dFROnFileViewScript.ts
  • ou.cust.ptpVendorSettings.filetype.field.recipient.ts
  • ou.cust.ptpVendorSettings.callback.functions.vendorSearch.ts
  • ou.cust.cfgBT.filetype.action.oncreate.ts
  • ou.cust.cfgVC.filetype.action.onDelete.ts
  • ou.cust.cfgCC.filetype.field.costCenter.ts
  • ou.cust.cfgRL.filetype.field.releaseRole.ts
  • ou.cust.cfgVC.callback.functions.getVatCode.ts
  • ou.cust.cfgVC.filetype.action.onSave.ts
  • ou.cust.cfgVC.callback.functions.lookupVatCode.ts
  • ou.cust.cfgCC.filetype.action.field.costCenter.ts
  • ou.cust.cfgRL.filetype.field.responsibleUser.ts
  • ou.cust.cfgCC.job.cfgCostCenter.ts
  • ou.cust.cfgRL.filetype.action.onSave.ts
  • ou.cust.cfgCC.filetype.action.onSave.ts
  • ou.cust.cfgCC.filetype.action.addCostCenter.ts
  • Gadget_ou.cust.filetype.folder.html.Counter.ts
  • ou.cust.global.filetype.field.attachments.ts
  • ou.cust.global.filetype.field.recipient.ts
  • Gadget_ou.cust.global.filetype.register.timeline.sentMails.ts
  • ou.cust.global.filetype.action.sendMail.ts
  • ou.cust.global.filetype.field.subject.ts
  • ou.cust.global.filetype.field.sender.ts
  • ou.cust.global.filetype.field.body.ts
  • ou.cust.global.filetype.action.takeTask.ts
  • ou.cust.global.filetype.field.signatur.ts
  • ou.cust.global.loadMailTemplate.ts
  • ou.cust.global.filetype.unsetMailIndicator.ts
  • ou.cust.global.filetype.field.recipientCopy.ts
  • ou.cust.global.job.removeCache.ts
  • ou.cust.global.filetype.action.getMailTemplate.ts
  • ou.cust.ptpINV.filetype.action.loadBookingTemplate.ts
  • ou.cust.ptpINV.workflow.action.outgoingEvent.ts
  • ou.cust.ptpINV.workflow.decision.checkAfterVerify.ts
  • ou.cust.ptpINV.callback.functions.ROB.lookupCostUnit.ts
  • ou.cust.ptpINV.workflow.guard.index.ts
  • ou.cust.ptpINV.callback.functions.ROB.getDefaultVatCode.ts
  • ou.cust.ptpINV.workflow.sendsignal.createReleaseList.ts
  • ou.cust.ptpINV.filetype.action.onDelete.ts
  • ou.cust.ptpINV.workflow.action.incomingEvent.ts
  • ou.cust.ptpINV.filetype.action.newBT.ts
  • ou.cust.ptpINV.workflow.decision.autoIndex.ts
  • ou.cust.ptpINV.callback.functions.ROB.getVatCodeByVatRate.ts
  • ou.cust.ptpINV.callback.functions.RMB.getItemOrderNumber.ts
  • ou.cust.ptpINV.callbacks.ts
  • ou.cust.ptpINV.workflow.access.booking.ts
  • ou.cust.ptpINV.filetype.field.paymentTermSource.ts
  • ou.cust.ptpINV.callback.functions.getVendor.ts
  • ou.cust.ptpINV.callback.functions.cover.historyVerification.ts
  • ou.cust.ptpINV.callback.bookingTemplate.ts
  • ou.cust.ptpINV.workflow.decision.checkAfterExport.ts
  • ou.cust.ptpINV.filetype.action.writeBookingTemplate.ts
  • ou.cust.ptpINV.callback.functions.ROB.lookupImpersonalAccount.ts
  • ou.cust.ptpINV.workflow.guard.manualExport.ts
  • ou.cust.ptpINV.workflow.sendsignal.export.ts
  • ou.cust.ptpINV.filetype.action.manStartWF.ts
  • ou.cust.ptpINV.enumval.ptpInvoiceUser.ts
  • ou.cust.ptpINV.callback.functions.lookupVendor.ts
  • ou.cust.ptpINV.callback.dashboard.fetchValuta.ts
  • ou.cust.ptpINV.workflow.guard.rejected.ts
  • ou.cust.ptpINV.workflow.guard.backToIndex.ts
  • ou.cust.ptpINV.callback.functions.ROB.lookupVatCode.ts
  • ou.cust.ptpINV.callback.functions.ROB.getCostUnit.ts
  • ou.cust.ptpINV.callback.functions.cover.historyPositions.ts
  • ou.cust.ptpINV.filetype.property.dFROnFileViewScript.ts
  • ou.cust.ptpINV.job.delete.ts
  • ou.cust.ptpINV.workflow.guard.released.ts
  • ou.cust.ptpINV.workflow.decision.checkAfterRelease.ts
  • ou.cust.ptpINV.callback.functions.lookupVendorAccount.ts
  • ou.cust.ptpINV.job.deleteFromExtract.ts
  • ou.cust.ptpINV.workflow.guard.export.ts
  • ou.cust.ptpINV.install.adminDashboard.ts
  • ou.cust.ptpINV.callback.functions.ROB.getCostCenter.ts
  • ou.cust.ptpINV.filetype.action.approvedButtons.ts
  • ou.cust.ptpINV.workflow.guard.additionalVerification.ts
  • ou.cust.ptpINV.workflow.guard.backToVerification.ts
  • ou.cust.ptpINV.workflow.guard.verified.ts
  • ou.cust.ptpINV.workflow.decision.checkAfterExportResult.ts
  • ou.cust.ptpINV.filetype.property.hROnFileViewScript.ts
  • ou.cust.ptpINV.callback.functions.cover.history.ts
  • ou.cust.ptpINV.callback.functions.ROB.lookupCostCenter.ts
  • ou.cust.ptpINV.workflow.receivesignal.exportResult.ts
  • ou.cust.ptpINV.callback.functions.ROB.getVatCode.ts
  • ou.cust.ptpINV.callback.dashboard.fetchTask.ts
  • ou.cust.ptpINV.workflow.decision.RMB.ts
  • ou.cust.ptpINV.callback.functions.ROB.getImpersonalAccount.ts
  • ou.cust.ptpINV.job.archiv.ts
  • ou.cust.ptpINV.callback.functions.getPaymentTerm.ts
  • ou.cust.ptpINV.filetype.action.onSave.ts
  • ou.cust.ptpINV.filtetype.register.filter.duplicates.ts
  • ou.cust.ptpINV.job.dashboard.ts
  • ou.cust.ptpINV.callback.functions.ROB.lookupVatCodeByVatRate.ts
  • ou.cust.ptpINV.workflow.decision.autoExport.ts
  • ou.cust.ptpINV.callback.functions.getVendorAccount.ts
  • ou.cust.ptpINV.callback.functions.lookupPaymentTerm.ts
  • ou.cust.ptpINV.callback.functions.RMB.lookupItemOrderNumber.ts

Statt ou.sp.ptpINV.settings und ou.cust.ptpINV.settings gibt es jetzt das Skript ou.spc.ptpINV.settings. Dieses Skript exportiert auch kein Settings-Objekt mehr, sondern eine Funktion getSettings. D.h. jedes Skript, das die Settings importiert, muss dementsprechend angepasst werden.

Vorher:

var settings = require("ou.sp.ptpINV.settings");
var db = settings.ptpConnections.getDatabaseConnection("ousp");

Nachher:

var settings = require("ou.spc.ptpINV.settings");
var ptpConnections = settings.getSettings().ptpConnections;
var db = ptpConnections.getDatabaseConnection("ousp");

Um das bisherige customizing der Settings in ou.cust.ptpINV.settings zu erhalten, muss der Inhalt des cust-Skripts mit dem des neuen Skripts (ou.spc.ptpINV.settings) ersetzt werden, und jegliches customizing, das im cust-Skript vorhanden war, manuell wieder eingefügt werden.


Die Funktionalitäten, die bisher in ou.sp.ptpINV.callbacks zu finden waren, wurden in ou.sp.ptpINV.lib.callbacks verschoben. Jegliche Importe von require("ou.sp.ptpINV.callbacks") müssen dementsprechend angepasst werden.

Zudem wurde das Skript ou.cust.ptpINV.callbacks umbenannt in ou.spc.ptpINV.callbacks. D.h. speziell die Aufrufe var callback = loadCallbackScript("ou.cust.ptpINV.callbacks"); müssen angepasst werden zu var callback = loadCallbackScript("ou.spc.ptpINV.callbacks");. Um das bisherige customizing aus ou.cust.ptpINV.callbacks zu erhalten, muss der Inhalt des cust-Skripts mit dem des neuen Skripts (ou.spc.ptpINV.callbacks) ersetzt werden, und jegliches customizing, das im cust-Skript vorhanden war, manuell wieder eingefügt werden.


Das Skript ou.cust.ptpINV.lib.database.mapping wurde gelöscht. Customizing des Mappings (falls vorhanden) muss nun in das Callback in ou.tmpl.ptpINV.callbacks.database.mapping verschoben werden.


Das Skript ou.cust.MAIL.filetype.userexit.assignedRegister wurde umbenannt in ou.spc.MAIL.filetype.callback.assignedRegister, d.h. eventuell vorhandenes Customizing muss in ou.cust.MAIL.filetype.callback.assignedRegister verschoben werden


Workflow

Da alle cust-Skripte nun spc-Skripte sind, müssen diese neuen Skriptnamen auch im Workflow hinterlegt werden:

Nametechnical nameattribute namenew value
pf:workflow.ptpInvoice.action.rejectedControlFlow_6Guardrunscript:ou.spc.ptpINV.workflow.guard.rejected
pf:workflow.ptpInvoice.action.verifiedControlFlow_16Guardrunscript:ou.spc.ptpINV.workflow.guard.verified
pf:workflow.ptpInvoice.action.releasedControlFlow_66Guardrunscript:ou.spc.ptpINV.workflow.guard.released
DunkelbuchungControlFlow_103Guardrunscript:ou.spc.ptpINV.workflow.decision.autoExport
pf:workflow.ptpInvoice.action.indexControlFlow_139Guardrunscript:ou.spc.ptpINV.workflow.guard.index
pf:workflow.ptpInvoice.action.rejectedControlFlow_152Guardrunscript:ou.spc.ptpINV.workflow.guard.rejected
Auto-IndexierungControlFlow_158Guardrunscript:ou.spc.ptpINV.workflow.decision.autoIndex
pf:workflow.ptpInvoice.action.exportControlFlow_161Guardrunscript:ou.spc.ptpINV.workflow.guard.export
Buchung Zielsystem ok?ControlFlow_180Guardrunscript:ou.spc.ptpINV.workflow.decision.checkAfterExportResult
Buchung Export ok?ControlFlow_191Guardrunscript:ou.spc.ptpINV.workflow.decision.checkAfterExport
pf:workflow.ptpInvoice.action.manualExportControlFlow_197Guardrunscript:ou.spc.ptpINV.workflow.guard.manualExport
pf:workflow.ptpInvoice.action.exportControlFlow_198Guardrunscript:ou.spc.ptpINV.workflow.guard.export
pf:workflow.ptpInvoice.action.export -> VisibilityGuard-Valuerunscript:ou.spc.ptpINV.workflow.access.booking
pf:workflow.ptpInvoice.action.manualExportControlFlow_199Guardrunscript:ou.spc.ptpINV.workflow.guard.manualExport
Betragsfreigabe erfüllt?ControlFlow_233Guardrunscript:ou.spc.ptpINV.workflow.decision.checkAfterRelease
Zweitfreigeber?ControlFlow_260Guardrunscript:ou.spc.ptpINV.workflow.decision.checkAfterVerify
pf:workflow.ptpInvoice.action.rejectedControlFlow_277Guardrunscript:ou.spc.ptpINV.workflow.guard.rejected
pf:workflow.ptpInvoice.action.backToVerificationControlFlow_278Guardrunscript:ou.spc.ptpINV.workflow.guard.backToVerification
RMBControlFlow_282Guardrunscript:ou.spc.ptpINV.workflow.decision.RMB
pf:workflow.ptpInvoice.action.exportControlFlow_284Guardrunscript:ou.spc.ptpINV.workflow.guard.export
pf:workflow.ptpInvoice.action.rejectedControlFlow_288Guardrunscript:ou.spc.ptpINV.workflow.guard.rejected
pf:workflow.ptpInvoice.action.backToIndexControlFlow_295Guardrunscript:ou.spc.ptpINV.workflow.guard.backToIndex
pf:workflow.ptpInvoice.action.backToIndexControlFlow_296Guardrunscript:ou.spc.ptpINV.workflow.guard.backToIndex
pf:workflow.ptpInvoice.action.rejectedControlFlow_297Guardrunscript:ou.spc.ptpINV.workflow.guard.rejected
pf:workflow.ptpInvoice.action.additionalVerificationControlFlow_300Guardrunscript:ou.spc.ptpINV.workflow.guard.additionalVerification
fachliche Prüfung -> Feldbelegung -> Bei EingangAction_3runscriptou.spc.ptpINV.workflow.action.incomingEvent
fachliche Prüfung -> Feldbelegung -> Bei AusgangAction_3runscriptou.spc.ptpINV.workflow.action.outgoingEvent
Daten prüfen -> Feldbelegung -> Bei EingangAction_10runscriptou.spc.ptpINV.workflow.action.incomingEvent
Daten prüfen -> Feldbelegung -> Bei AusgangAction_10runscriptou.spc.ptpINV.workflow.action.outgoingEvent
WorkflowDefaultScript -> Feldbelegung -> Bei EingangSendSignal_18runscriptou.spc.ptpINV.workflow.action.incomingEvent
WorkflowDefaultScript -> Feldbelegung -> Bei AusgangSendSignal_18runscriptou.spc.ptpINV.workflow.action.outgoingEvent
Prüfen und Buchen -> Feldbelegung -> Bei EingangAction_22runscriptou.spc.ptpINV.workflow.action.incomingEvent
Prüfen und Buchen -> Feldbelegung -> Bei AusgangAction_22runscriptou.spc.ptpINV.workflow.action.outgoingEvent
Daten prüfen -> Feldbelegung -> Bei EingangAction_27runscriptou.spc.ptpINV.workflow.action.incomingEvent
Daten prüfen -> Feldbelegung -> Bei AusgangAction_27runscriptou.spc.ptpINV.workflow.action.outgoingEvent
Ende -> Feldbelegung -> Bei EingangFinalState_43runscriptou.spc.ptpINV.workflow.action.incomingEvent
pf:workflow.ptpInvoice.receivesignal.checkXtractState -> Feldbelegung -> Bei EingangReceiveSignal_109runscriptou.spc.ptpINV.workflow.action.incomingEvent
pf:workflow.ptpInvoice.receivesignal.checkXtractState -> Feldbelegung -> Bei AusgangReceiveSignal_109runscriptou.spc.ptpINV.workflow.action.outgoingEvent
Starte Workflow -> Feldbelegung -> Bei EingangSendSignal_107runscriptou.spc.ptpINV.workflow.action.incomingEvent
Starte Workflow -> Feldbelegung -> Bei AusgangSendSignal_107runscriptou.spc.ptpINV.workflow.action.outgoingEvent
Ende -> Feldbelegung -> Bei EingangFinalState_114runscriptou.spc.ptpINV.workflow.action.incomingEvent
Indexierung -> Feldbelegung -> Bei EingangAction_138runscriptou.spc.ptpINV.workflow.action.incomingEvent
Indexierung -> Feldbelegung -> Bei AusgangAction_138runscriptou.spc.ptpINV.workflow.action.outgoingEvent
Betragsfreigabe -> Feldbelegung -> Bei EingangAction_151runscriptou.spc.ptpINV.workflow.action.incomingEvent
Betragsfreigabe -> Feldbelegung -> Bei AusgangAction_151runscriptou.spc.ptpINV.workflow.action.outgoingEvent
Prüfen (Buchung) -> Feldbelegung -> Bei EingangAction_182runscriptou.spc.ptpINV.workflow.action.incomingEvent
Prüfen (Buchung) -> Feldbelegung -> Bei AusgangAction_182runscriptou.spc.ptpINV.workflow.action.outgoingEvent
Buchung im Zielsystem erfolgreich angekommen?ReceiveSignal_183Guardrunscript:ou.spc.ptpINV.workflow.receivesignal.exportResult
Buchung im Zielsystem erfolgreich angekommen? -> Feldbelegung -> Bei EingangReceiveSignal_183Guardou.spc.ptpINV.workflow.action.incomingEvent
Buchung im Zielsystem erfolgreich angekommen? -> Feldbelegung -> Bei AusgangReceiveSignal_183Guardou.spc.ptpINV.workflow.action.outgoingEvent
Ende -> Feldbelegung -> Bei EingangFinalState_216runscriptou.spc.ptpINV.workflow.action.incomingEvent
Ende -> Feldbelegung -> Bei EingangFinalState_244runscriptou.spc.ptpINV.workflow.action.incomingEvent
Ende -> Feldbelegung -> Bei EingangFinalState_269runscriptou.spc.ptpINV.workflow.action.incomingEvent
ou.cust.ptpINV.workflow.sendsignal.exportSendSignal_272Recipientou.spc.ptpINV.workflow.sendsignal.export
ou.cust.ptpINV.workflow.sendsignal.export -> Feldbelegung -> Bei EingangSendSignal_272runscriptou.spc.ptpINV.workflow.action.incomingEvent
ou.cust.ptpINV.workflow.sendsignal.export -> Feldbelegung -> Bei AusgangSendSignal_272runscriptou.spc.ptpINV.workflow.action.outgoingEvent
Prüfen und Buchen -> Feldbelegung -> Bei EingangAction_280runscriptou.spc.ptpINV.workflow.action.incomingEvent
Prüfen und Buchen -> Feldbelegung -> Bei AusgangAction_280runscriptou.spc.ptpINV.workflow.action.outgoingEvent
Ende -> Feldbelegung -> Bei EingangFinalState_287runscriptou.spc.ptpINV.workflow.action.incomingEvent

Mappen anpassen

Documentsmanager

Öffne Documentsmanager > Mappentypen > ptpInvoice:

In den Felder sollte bereits reasonReject vorhanden sein - dann tippe auf den Button "Mappen ändern" (und im zusätzlichen Fenster auf "ok")