Zum Hauptinhalt springen

Positions-Matching (RMB)

Positions-Matching (RMB)

Das Positions-Matching-Gadget vergleicht die Rechnungspositionen mit den Bestellpositionen aus der Datenbank. Welche Felder dabei geladen und verglichen werden sowie welche Spalten das Gadget anzeigt, ist konfigurierbar.

Felder konfigurieren

Die zu vergleichenden Felder und die Felder für fehlende Bestellpositionen werden über die Eigenschaft positionMatching im Skript ou.cust.ptpINV.settings gesteuert.

Bekannte Felder

Standard-Felder, die in der Liste orderItemSelectFields im Skript ou.sp.ptpINV.lib.rmb.orderItems bereits definiert sind, werden einfach als String angegeben:

const settings = {
// ...
positionMatching: {
compareFields: [
"itemOrderNumber", // Pflichtfeld
"itemOrderItemNumber", // Pflichtfeld
"itemArticleNumber",
"itemArticleName",
"itemOrderQuantity",
"itemOrderQuantityUnit",
"itemOrderSingleAmount",
"itemPriceUnit",
"itemVatRate",
"itemCostCenter", // zusätzliches Feld
],
},
// ...
};

itemOrderNumber und itemOrderItemNumber sind Pflichtfelder – fehlen sie, wird beim Matching ein Fehler geworfen.

Eigene Datenbankfelder

Felder, die nicht standardmäßig definiert sind, werden als Objekt mit name (DB-Spaltenname), type und optionalem alias übergeben:

positionMatching: {
compareFields: [
"itemOrderNumber",
"itemOrderItemNumber",
// ...
{ name: "customColumn", type: "string", alias: "itemCustomColumn" },
],
},

Felder für fehlende Bestellpositionen

Analog steuert orderItemFields, welche Felder beim Laden fehlender Bestellpositionen aus der Datenbank abgerufen und als neue Rechnungspositionen übernommen werden:

positionMatching: {
orderItemFields: [
"itemOrderNumber", // Pflichtfeld
"itemOrderItemNumber", // Pflichtfeld
"itemArticleNumber",
"itemArticleName",
"itemOrderQuantity",
"itemOrderQuantityUnit",
"itemOrderSingleAmount",
"itemVatRate",
"itemVatCode",
"itemPriceUnit",
"itemCostCenter",
"itemCostUnit",
"itemImpersonalAccount",
{ name: "customColumn", type: "string", alias: "itemCustomColumn" },
],
},

Spalten im Gadget anzeigen

Das Konfigurieren eines Feldes in compareFields macht es vergleichbar, zeigt es aber noch nicht im Gadget an. Die Spalten des Gadgets werden über den Callback renderPositionMatcher before im Skript ou.cust.ptpINV.callbacks.dataExtraction gesteuert:

const renderPositionMatcherBefore = (data: {
docFile: ptpInvoice;
columns: Record<string, MultiTableColumn>;
selection: Record<number, boolean>;
}): otris.gadget.gui.HTML | void => {
data.columns["itemCostCenter"] = {
label: "de:Kostenstelle;en:Cost center",
tooltip: "de:Kostenstelle;en:Cost center",
width: "150px",
};
};

Bestelldaten auffüllen konfigurieren

Wenn Rechnungspositionen mit Bestelldaten aus der Datenbank angereichert werden – sowohl nach dem Positions-Matching als auch beim Import aus Dexpro –, sind die dabei kopierten Felder über fillOrderDataFields im Skript ou.cust.ptpINV.settings konfigurierbar. Wird die Eigenschaft gesetzt, ersetzt sie die Standard-Felder vollständig:

Standard-Feld (Quelle)Zielfeld
deliveryNoteNumberitemDeliveryNoteNumber
quantityDelivereditemQuantityDelivered
quantityUnitDelivereditemQuantityUnitDelivered
receiptNumberitemReceiptNumber
receiptRequireditemReceiptRequired

Jeder Eintrag kann zusätzlich shouldOverwriteExistingValues: true erhalten, um den Zielwert auch dann zu überschreiben, wenn er bereits gesetzt ist (Standard: false).

const settings = {
// ...
fillOrderDataFields: [
{ sourceField: "deliveryNoteNumber", targetField: "itemDeliveryNoteNumber" },
{ sourceField: "quantityDelivered", targetField: "itemQuantityDelivered" },
{ sourceField: "quantityUnitDelivered", targetField: "itemQuantityUnitDelivered" },
{ sourceField: "receiptNumber", targetField: "itemReceiptNumber" },
{ sourceField: "receiptRequired", targetField: "itemReceiptRequired" },
// Artikelnummer immer überschreiben
{ sourceField: "articleNumber", targetField: "itemArticleNumber", shouldOverwriteExistingValues: true },
],
// ...
};

Logik nach dem Speichern erweitern

Über die Callbacks saveMatchedPositions before und saveMatchedPositions after im Skript ou.cust.ptpINV.callbacks.dataExtraction kann die Logik nach dem Schließen des Gadgets erweitert werden. Der before-Callback erhält die ausgewählten Positionen vor dem Speichern — gibt er einen String zurück, wird die Aktion abgebrochen und der String als Fehlermeldung angezeigt. Der after-Callback wird nach erfolgreichem Speichern aufgerufen und eignet sich für Folgeaktionen.