Zum Hauptinhalt springen

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:

  1. Es wird immer versucht, alle Mengeneinheiten auf die Einheit der Bestellung zu normalisieren, da mit dieser Einheit auch gebucht werden muss.

  2. Es wird also versucht, die Bestelleinheit einer Gruppe zuzuordnen:

    const item = {
    itemOrderQuantityUnit: "Stk", -> // kann der Gruppe "STK" zugeordnet werden
    itemQuantityUnit: "st.",
    itemQuantityUnitDelivered: "stk",
    }
  3. 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
    }
  4. 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
    }
  5. 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

  1. Stimmt die gelieferte Mengeneinheit und die der Rechnung überein? -> Fehler, wenn nicht
  2. Ist die gelieferte Menge größer als die Bestellmenge? -> Fehler, wenn ja
  3. Ist die gelieferte Menge kleiner als die Bestellmenge? -> Rechnung wartet auf Wareneingang, wenn ja
  4. Ende der Funktion, wenn validateAgainstOrderQuantity auf false gesetzt ist
  5. Ist die Rechnungsmenge größer als die Bestellmenge? -> Fehler, wenn ja
  6. 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.