Zum Hauptinhalt springen

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

  • Gadget_ou.spc.ptpINV.folder.validationConfig wurde in Gadget_ou.sp.ptpINV.folder.validationConfigMandatoryFields umbenannt und ist damit nicht mehr direkt kundenseitig ersetzbar. Anpassungen müssen über die Callbacks in ou.cust.ptpINV.callbacks.dataExtraction erfolgen (before/after renderValidationConfigMandatoryFieldsGadget). (INV-764)
  • Das ErpService-Interface wurde angepasst: Die Datenbankparameter wurden von DBConnection auf DbWithProvider umgestellt und updateOrderDataByFilter erhielt einen zusätzlichen Parameter docFile. Bestehende ERP-Service-Implementierungen müssen entsprechend angepasst werden, d.h. sowohl Custom-Implementierungen des ERP-Service als auch Methodenaufrufe in Custom-Code von standardmäßig ausgelieferten ERP-Service-Implementierungen. (INV-679)

Zusammenfassung

  • Statuscodes können nun über ein MultiTable-Gadget im Webclient gepflegt werden. IDs sind nicht änderbar, Statuscodes können nur deaktiviert (nicht gelöscht) werden, und in der SP-Logik verwendete Statuscodes sind nicht deaktivierbar. (INV-682)
  • Beim Dexpro-Import wird der Rabattsatz (itemDiscountRate) nun rückwärts aus dem Rabattbetrag (itemDiscountAmount) berechnet, wenn dieser vom Extraktor nicht geliefert wird. (INV-732)
  • Das ErpService-Interface wurde für Dynamics-BC implementiert. (INV-679)
  • Es wurde eine konfigurierbare Preisprüfung implementiert, die nach einer erfolgreichen Wareneingangsprüfung den Bestell-Einzelpreis mit dem Rechnungs-Einzelpreis vergleicht. (INV-731)
  • Bei Verwendung der Dexpro-Beleglesung findet nun nach der Beleglesung sowie im Status 15 eine Validierung der Kopfbeträge statt. Außerdem werden nun Gesamtsteuerbetrag und Gesamtnettobetrag (sofern nicht erkannt) automatisch aus den erkannten Beträgen berechnet. Die Kopfbeträge werden nach dem Status 15 nicht mehr neu berechnet, sofern Dexpro als Belegleser verwendet wird. (INV-755)
  • Die Skontobeträge werden nun nicht mehr vor sondern nach dem Laden der Zahlungsinformationen aus der DB berechnet. (INV-660)
  • Die Kostenstellenberechtigten aller Kostenstellen einer Eingangsrechnung erhalten nun automatisch Zugriff auf die Mappe. Das Verhalten kann im Invoice-Settingsskript jeweils für ROB/RMB getrennt deaktiviert werden. (INV-616)
  • Im Status 15 gibt es nun eine Aktion "Ablehnen" (INV-768)
  • Beim Dexpro-Import werden Kopfbeträge bei Gutschriften nun automatisch in positive Werte umgewandelt, falls Dexpro negative Werte liefert. (INV-766)
  • Bei Positionen, die keinen Wareneingang erfordern, werden WE-Menge und WE-ME nun ausgeblendet (INV-757)
  • Spalten im ROB- und RMB-Monitor können nun verschoben sowie vergrößert und verkleinert werden. (LIB-532)
  • .tmpl.-Skripte werden nun in der Skript-Kompatibilitätsprüfung berücksichtigt und sind Teil der generierten Script-Hash-Map. (OUD-236)
  • Change-Callbacks im MultiInsert- und CopyPaste-Dialog werden nun asynchron ausgeführt und abgewartet. (LIB-545)
  • Das Positions-Matching ist nun umfassend konfigurierbar: verglichene Felder, fehlende Bestellpositionen und das Auffüllen von Rechnungspositionen mit Bestelldaten (auch beim Dexpro-Import) über settings.positionMatching bzw. settings.fillOrderDataFields. Das Gadget zeigt dynamische Spalten und ist per Callback erweiterbar. (INV-771)
  • Im Dexpro-Modus bleibt nun beim Registerwechsel in der Doppelansicht die Feldmarkierung erhalten. (INV-690)
  • In den RMB Positionen wird beim Hovern über eine rot eingefärbte Zelle (z.B. wegen Einzelpreis ungleich Bestell-Einzelpreis, fehlender Wareneingang...) zusätzlich ein Tooltip mit dem Grund angezeigt. (INV-773)
  • Beim Upload der Bestellpositionen-Stammdaten an Dexpro werden die numerischen Spalten der Bestellpositionen (Quantity, PriceUnit, Total, Price) sowie der Steuersätze (TaxRate) nun pro Zeile als Strings mit Punkt als Dezimaltrenner und genau vier Nachkommastellen normalisiert. Sowohl deutsche als auch englische Notationen werden korrekt verarbeitet. Der Upload-Task akzeptiert dafür eine neue optionale transformRow-Funktion. (INV-774)
  • An der Verbindung vom Startknoten zur Aktion „Starte Workflow" wird der globalState nun beim Einlaufen einer Mappe in den Workflow auf 0 initialisiert. Dies stellt sicher, dass ein ggf. zuvor gesetzter Wert — z.B. beim Neustart des Workflows — nicht fälschlicherweise in die Workflow-Logik einfließt. (INV-786)
  • Mappen werden beim Export zur Beleglesung sofort als export vormarkiert, um Mehrfachverarbeitung bei parallelen Job-Läufen zu verhindern. Zusätzlich sichert ein TaskAudit-Guard parallele Ausführungen ab, und Mappen die nach einem Absturz im export-Status ohne xtractProcessingId feststecken werden beim nächsten Lauf automatisch zurückgesetzt. (INV-767)
  • Anpassbare ou.spc.*-Skripte mit ausführbarem Code wurden um die Funktion executeDirectly() erweitert, um der Konvention für anpassbare Skripte zu entsprechen. (INV-776)
  • Das Feld itemDefinition war nur noch aus Legacy-Gründen vorhanden und wurde nun entfernt (INV-770)
  • Ein StatusCode-Enum für die in der Datenbanktabelle cfgStatusCodes definierten Prozess-/Validierungsstatuscodes (00–36) wurde eingeführt. Alle bisherigen String-Literale dieser Codes in den SP-Skripten wurden durch den Enum ersetzt. (INV-765)
  • Der Datenbankabgleich der Positionen (updateDocFileWithDbMatchStatus) wird für RMB-Mappen nun nach dem Empfang des Xtract-Signals (afterReceivesignalCheckExtractState), nach sendsignal.default sowie beim Speichern der Mappe (onSave) ausgeführt. Damit wird sichergestellt, dass der Datenbankabgleich bereits befüllt ist, wenn die Mappe in Status 15 zur manuellen Validierung einläuft — unabhängig davon, ob Dexpro oder Insiders als Belegleser verwendet wird. (INV-784)
  • Im ROB-Monitor zeigt der Tooltip des Bruttobetrag-Footers nun auch an, dass sich eine Abweichung zu den Kopfbeträgen innerhalb der Rundungstoleranz befindet. (INV-783)
  • Für den Datenbank-Positionsabgleich bei Rechnungen mit Bestellbezug wurde eine Konfigurationsmöglichkeit eingeführt, mit welcher Ausnahmen definiert werden können. Über die Ausnahmen lassen sich Positionen anhand konfigurierbarer Regeln (Spalte, Operator, Wert) vom Datenbank-Positionsabgleich ausnehmen. (INV-780)
  • Beim Dexpro-Export wurden overwriteFields und defaultFields ohne Feld-Mapping an Dexpro gesendet, wodurch die Felder von Dexpro ignoriert wurden. Das Mapping von internen Feldnamen (z.B. recipient) auf Dexpro-Feldnamen (z.B. Company) ist nun über fieldMapping in ou.spc.ptpINV.settings.dexpro konfigurierbar. (INV-796)

Manuell auszuführende Schritte

Datenbank (ptpData)

Die Spalte itemDefinition in der Tabelle invoiceHeader muss gelöscht, alle Views, die auf der Tabelle aufbauen, müssen angepasst werden. (INV-770)

Portalskripte

Template-Skripte (.tmpl.) (OUD-236)

info

Da .tmpl.-Skripte bisher nicht in der Script-Hash-Map erfasst wurden, werden sie beim ersten Upgrade nach diesem Update in der Kompatibilitätsprüfung als neu erstellt (New) gemeldet. Darunter können sich sowohl tatsächlich neu hinzugefügte als auch bereits bestehende Skripte befinden – letztere wurden lediglich erstmals in die Hash-Map aufgenommen. Im DiffViewer ist ersichtlich, welche .tmpl.-Skripte in dieser Version neu hinzugekommen sind. Die übrigen gemeldeten Skripte können ignoriert werden.

SP-Skripte

ou.sp.ptpINV.workflow.decision.checkAfterDataExtraction (INV-755)

Hier wurde eine Validierung der Kopfbeträge hinzugefügt. Der Gesamtsteuerbetrag wird nun automatisch aus dem Gesamtbetrag errechnet. Sofern der Gesamtnettobetrag nicht erkannt wurde, wird dieser berechnet und die Mappe geht zur Prüfung in den Status 15 mit einem entsprechenden StatusCode. Ebenfalls in den Status 15 geht die Mappe, wenn die anschließende Validierung der Kopfbeträge fehlschlägt.

ou.sp.ptpINV.workflow.guard.validated (INV-755)

Auch hier wurde eine Validierung der Kopfbeträge hinzugefügt. Sofern die Validierung fehlschlägt wird eine entsprechende Fehlermeldung im Dialog angezeigt.

ou.sp.ptpINV.workflow.sendsignal.default (INV-755)

Hier wurde eine Prüfung der Einzelsteuerbeträge eingeführt. Sofern diese fehlschlägt wird ein entsprechender StatusCode gesetzt und die Mappe läuft in den Status 91 zur Prüfung Daten.

ou.sp.ptpINV.userexit.functions.rmbMultiTable (INV-794)

In der Funktion showItemOrderNumberTable wird itemDiscountRate nun korrekt übernommen. Wenn der Datenbankabgleich keinen Rabatt liefert, die aktuelle Position aber bereits einen gesetzt hat, wird dieser fortan korrekt beibehalten.

Eigene change-Callbacks (LIB-545)

Falls in eigenen Cust- oder Userexit-Skripten change-Callbacks definiert sind, die asynchrone Operationen ausführen (z.B. Lookup-Dialoge via showTableDialogReact), müssen diese nun eine Promise zurückgeben, damit der MultiInsert- und CopyPaste-Dialog den Abschluss der Operation korrekt abwarten kann.

ou.sp.ptpINV.userexit.functions.multiTable (INV-783)

Hier wurde die Funktion getItemTotalAmountFooter erweitert, sodass bei ROBs der Tooltip des Bruttobetrag-Footers nun auch anzeigt, dass sich eine Abweichung zu den Kopfbeträgen innerhalb der Rundungstoleranz befindet.

Diff wird geladen…
ou.tmpl.ptpINV.callbacks.dataExtraction (INV-755)

Hier wurden die Callback-Funktionen checkAfterDataExtractionAfter und validatedDataExtractionAfter angepasst. Bei beiden Funktionen hat sich der Typ des Parameters geändert. Falls ein zugehöriges Cust-Skript existiert, muss dieses ggf. angepasst werden:

Der Parameter der Funktion checkAfterDataExtractionAfter ist nicht mehr vom Typ

data: {
docFile: ptpInvoice;
validationResult: ValidateDocFileMandatoryXtractFieldsResult;
positionDatabaseMatch: boolean | undefined;
}

sondern

data: {
docFile: ptpInvoice;
validationResult: ValidateDocFileMandatoryXtractFieldsResult;
positionDatabaseMatch: boolean | undefined;
headerDataAutoFilledOrInvalidResult: EnsureAndValidateHeaderDataResult;
}

Der Parameter der Funktion validatedDataExtractionAfter ist nicht mehr vom Typ

data: {
docFile: ptpInvoice;
validationResult: ValidateDocFileMandatoryXtractFieldsResult;
}

sondern

data: {
docFile: ptpInvoice;
validationResult: ValidateDocFileMandatoryXtractFieldsResult;
headerDataValidationResult: HeaderDataValidationResult;
}

Workflow

gefahr

Ab sofort dürfen Workflow-Anpassungen nicht mehr an bestehenden Workflow-Versionen vorgenommen werden. Stattdessen muss zwingend eine neue Workflow-Version erstellt werden (siehe Beschreibung in Ablauf von Upgrades)

Neue Aktion "Ablehnen" in Status 15 (INV-768)

INV-768-overview

Schritt 1: Neuen Endpunkt erstellen
  • globalState: 98
  • runscript: ou.spc.ptpINV.workflow.action.incomingEvent

INV-768-step-1

Schritt 2: Verbindung zwischen Status 15 und neuem Knoten herstellen

Allgemein:

  • pf: workflow.ptpInvoice.action.rejected
  • Skript: runscript:ou.spc.ptpINV.workflow.guard.rejected
  • Kommentar: workflow.ptpInvoice.comment.dataExtractionRejected

INV-768-step-2-1

Eigenschaften:

  • backgroundColor: #f44336; border: none; color: #fff;
  • confirmScriptParams: true
  • dialogTitle: Bitte Ablehnungsgrund eingeben

INV-768-step-2-2

Feldbelegung globalState = 0 an Verbindung vom Startknoten (INV-786)

An der Verbindung vom Startknoten zur Aktion „Starte Workflow" muss in der Feldbelegung der Wert globalState = 0 eingetragen werden. Dadurch wird sichergestellt, dass der globalState beim Einlaufen einer Mappe in den Workflow korrekt initialisiert wird.

INV-786-overview

Schritt 1: Feldbelegung hinzufügen
  • globalState: 0

INV-786-step-1

Customizing-Hinweis

Falls im Customizing-Callback callbackAfterGetTargetWorkflow oder in anderen Cust-Skripten ein globalState gesetzt wird, bevor startWorkflow aufgerufen wird, ist diese Änderung relevant. Typische Fälle sind:

  • Neustart einer Mappe: Beim Neustart des Workflows läuft die Mappe erneut über den Startknoten — ein zuvor gesetzter globalState wird durch die neue Feldbelegung auf 0 zurückgesetzt.
  • Mappentyp-Wechsel (z.B. aus Postman): Auch hier wird callbackAfterGetTargetWorkflow durchlaufen und ein gesetzter globalState anschließend auf 0 zurückgesetzt.

In beiden Fällen wird der Wert anschließend von der Verbindung „Neuer Beleg" auf 10 gesetzt. Eigene Logik, die im Callback beforeSendsignalStart oder afterSendsignalStart auf einen zuvor gesetzten globalState angewiesen ist, muss entsprechend angepasst werden.