Customizing-Anleitung
Customizing im clientHeaderCode Script
Schritt 1: Script kopieren und umbenennen
Das Skript ou.spc.ptpINV.clientHeaderCode muss kopiert und in ou.spc.ptpINV.clientHeaderCode umbenannt werden.
Schritt 2: Weitere UserExits einfügen
Skripte, die im Browser geladen werden sollen, können im Array userExits des neuen clientHeaderCode Scripts eingetragen werden.
Beispiel:
const userExits = [
"ou.sp.ptpINV.userexit.callbacks.calc",
"ou.sp.ptpINV.userexit.callbacks.enum",
"ou.sp.ptpINV.userexit.callbacks.invoice",
"ou.sp.ptpINV.userexit.callbacks.mail",
"ou.sp.ptpINV.userexit.functions.invoice",
"ou.sp.ptpINV.userexit.functions.rmbMultiTable",
"ou.sp.ptpINV.userexit.functions.robMultiTable",
"ou.sp.ptpINV.userexit.invplus.calculationAmount",
"ou.sp.ptpINV.userexit.invplus.calculationAmountMultiTable",
"ou.sp.ptpINV.userexit.invplus.calculationCashDiscount",
"ou.sp.ptpINV.userexit.invplus.configuration",
"ou.sp.ptpINV.userexit.invplus.fieldMapping",
"ou.sp.ptpINV.userexit.invplus.locale",
"ou.sp.ptpINV.userexit.invplus.splitCalculationMultiTable",
"ou.sp.ptpINV.userexit.invplus.utils",
"ou.sp.ptpINV.userexit.invplus.validationAmountMultiTable",
/* Neues custom Skript, das im Client ausgeführt werden soll */
"ou.cust.ptpINV.userexit.someCustomUserExit",
/* ... */
];
Zusätzliche CSS-Styles können folgendermaßen hinzugefügt werden:
const { invoiceCss } = require("./ou.spc.ptpINV.clientHeaderCode.css");
const { customCss } = require("./ou.cust.ptpINV.someCustom.css");
/* ... */
/* ... */
clientHeader.addStyle(invoiceCss);
clientHeader.addStyle(customCss);
/* ... */
Normalisierung von Mengeneinheiten
Standardmäßig werden Mengeneinheiten (z.B. "Stck." -> "STK") beim Abholen der Positionen aus Dexpro und beim Laden von Bestelldaten aus der Datenbank normalisiert.
Das Vorgehen ist dabei wie folgt:
-
Es wird immer versucht, alle Mengeneinheiten auf die Einheit der Bestellung zu normalisieren, da mit dieser Einheit auch gebucht werden muss.
-
Es wird also versucht, die Bestelleinheit einer Gruppe zuzuordnen:
const item = {
itemOrderQuantityUnit: "Stk", -> // kann der Gruppe "STK" zugeordnet werden
itemQuantityUnit: "st.",
itemQuantityUnitDelivered: "stk",
} -
Alle Einheiten, die der Gruppe zugeordnet werden können, werden auf die Bestelleinheit normalisiert, in diesem Fall "Stk":
const item = {
itemOrderQuantityUnit: "Stk", -> // kann der Gruppe "STK" zugeordnet werden
itemQuantityUnit: "Stk", // normalisiert auf "Stk" der Bestelleinheit
itemQuantityUnitDelivered: "Stk", // normalisiert auf "Stk" der Bestelleinheit
} -
Falls die Bestelleinheit keiner Gruppe zugeordnet werden kann, wird versucht, die anderen Einheiten zu bereinigen und direkt auf die Bestelleinheit zu normalisieren:
// Vorher
const item = {
itemOrderQuantityUnit: "L", -> // wird nicht in der Koniguration gefunden
itemQuantityUnit: "l.",
itemQuantityUnitDelivered: "l",
}
// Nachher
const item = {
itemOrderQuantityUnit: "L", -> // wird nicht in der Koniguration gefunden
itemQuantityUnit: "L", // nach Transformation auf Großbuchstaben und Entfernen von Punkten direkt auf "L" normalisiert
itemQuantityUnitDelivered: "L", // nach Transformation auf Großbuchstaben direkt auf "L" normalisiert
} -
Falls das direkte Matching auch nicht funktioniert, werden die Einheiten nicht normalisiert.
Gruppen definieren/erweitern
Im Skript ou.cust.ptpINV.settings gibt es die Möglichkeit, Gruppen von
Einheiten zu definieren oder zu erweitern.
Soll zum Beispiel die Einheit "KG" in die Normalisierung aufgenommen werden, kann eine neue Gruppe "KG" mit den entsprechenden Einheiten definiert werden:
const settings = {
(...)
units: {
unitGroups: {
STK: ["ST", "STK", "STÜCK", "STCK", "PCE", "PCS", "PC"]
/* Neue Gruppe "KG" mit den entsprechenden Einheiten */
KG: ["KG", "KILO", "KGS", "kg."] // etc.
},
disableUnitNormalization: false
}
};
(...)
Nun werden alle Einheiten, die in der Gruppe "KG" definiert sind, auf "KG" normalisiert.
Die Normalisierung deaktivieren
Im bereits genannten Skript ou.cust.ptpINV.settings gibt es die Option
settings.units.disableUnitNormalization. Diese kann auf true gesetzt
werden, um die Normalisierung zu deaktivieren – die Funktionen im Skript
ou.sp.ptpINV.lib.units ziehen dann diese Option und führen die Normalisierung
nicht mehr durch.
Mengenvalidierung (RMB)
Validierung gegen die Bestellmenge (RMB)
Die Validierung gegen die Bestellmenge für RMB-Positionen kann über die
Eigenschaft settings.validateAgainstOrderQuantity im Skript
ou.cust.ptpINV.settings aktiviert oder deaktiviert werden.
Ist die Eigenschaft auf true gesetzt, wird pro Position validiert,
dass die Rechnungs- und die gelieferte Menge, wenn diese gleich sind, die
Bestellmenge nicht unter- und nicht überschreiten. Ist die Eigenschaft auf
false gesetzt (Standard), wird diese Validierung übersprungen.
Validierungsschritte
- Stimmt die gelieferte Mengeneinheit und die der Rechnung überein? -> Fehler, wenn nicht
- Ist die gelieferte Menge größer als die Bestellmenge? -> Fehler, wenn ja
- Ist die gelieferte Menge kleiner als die Bestellmenge? -> Rechnung wartet auf Wareneingang, wenn ja
- Ende der Funktion, wenn
validateAgainstOrderQuantityauffalsegesetzt ist - Ist die Rechnungsmenge größer als die Bestellmenge? -> Fehler, wenn ja
- Ist die Rechnungsmenge kleiner als die Bestellmenge? -> Fehler, wenn ja
Steuerung der Validierung über Callbacks
Im Callback-Skript ou.tmpl.ptpINV.callbacks.goodsReceiptCheck gibt es die
Funktion checkIfAllGoodsDeliveredBefore, die vor der Mengenvalidierung
pro Position aufgerufen wird.
Um die Funktion anzupassen, muss zuerst ein zugehöriges Cust-Skript
ou.cust.ptpINV.callbacks.goodsReceiptCheck erstellt werden.
Standardmäßig gibt die Funktion nichts zurück, was bedeutet, dass die Validierung wie gewohnt durchgeführt wird.
Die folgende Validierung überschreiben
Um die Validierung zu überschreiben, kann nun der Funktion
checkIfAllGoodsDeliveredBefore ein Rückgabewert hinzugefügt werden:
{
allGoodsDelivered?: boolean;
isOrderQuantityMismatch?: boolean;
}
allGoodsDelivered steuert, ob die Lieferung der Rechnung als vollständig
behandelt werden soll, d.h. ob die Rechung weiterhin auf einen Wareneingang
wartet oder im Workflow fortschreiten soll.
isOrderQuantityMismatch steuert, ob die Validierung gegen die Bestellmenge
erfolgreich war oder nicht. Je nach Wert, wird der Mappe ein Statuseintrag
hinzugefügt bzw. dieser entfernt.
Einen Fehler werfen
Soll im Prozess ein Fehler geworfen, an der Mappe also der Status
GoodsReceiptCheckStates.ERROR gesetzt werden, kann dem Array errorMessages,
der in die Funktion gegeben wird, eine Fehlermeldung hinzugefügt werden. Diese
wird dann als Statuseintrag an der Mappe gesetzt.
Aktion "Rechnungskreis ändern" (ou.sp.ptpINV.filetype.action.changeRecipient)
Skriptparameter startXtract
Der Parameter startXtract steuert, ob nach dem Wechsel des Empfängers
automatisch ein neuer Datenextraktions-Export angestoßen wird.
Standardmäßig ist der Parameter ausgeblendet. In diesem Fall verhält sich das
Skript so, als wäre startXtract = true: Nach dem Setzen des Rechnungskreises
wird der Workflow neu gestartet und der Export zur Datenextraktion ausgelöst.
Soll dieses Verhalten deaktivierbar sein, kann der Parameter im Documents-Manager für das Skript aktiviert werden.