Zum Hauptinhalt springen

Prüfen, ob ein Feld vorhanden ist

Prüfen wir zum Beispiel, ob das Feld MyField gefunden und ausgefüllt wurde:
var field = Context.GetField("MyField");

if (!field) {
  Context.CheckSucceeded = false;
  Context.ErrorMessage = 'MyField-Feld nicht gefunden';
} else if (!field.Value) {
  Context.CheckSucceeded = false;
  Context.ErrorMessage = 'MyField-Feld ist leer';
}

Gleitkommazahlen vergleichen

Der direkte Vergleich von Gleitkommazahlen kann zu unvorhersehbaren Ergebnissen führen. Wir empfehlen, Methoden des integrierten Math-Objekts zu verwenden, um Zahlen – insbesondere Geldbeträge – korrekt zu vergleichen.
// zwei Gleitkommazahlen vergleichen
var floatField1 = Context.GetField("Number Field 1");
var floatField2 = Context.GetField("Number Field 2");
var floatVal1 = floatField1.Value;
var floatVal2 = floatField2.Value;

if (Math.round(floatVal1) === Math.round(floatVal2)) {
    return;
} else {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = 'Die Werte sind unterschiedlich';
}

// zwei Geldwerte vergleichen
var moneyField1 = Context.GetField("Money Field 1");
var moneyField2 = Context.GetField("Money Field 2");
var value1 = moneyField1.Value.Amount;
var value2 = moneyField2.Value.Amount;

if (Math.abs(value1 - value2) <= 0.0001) {
    return;
} else {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = 'Die Werte sind unterschiedlich';
}

Je nach anderem Feld einen nicht leeren Wert verlangen

Ein optionales Feld kann erforderlich werden, wenn der Wert eines anderen Felds dies nötig macht. Beispiel: Steht beim Familienstand „verheiratet“, sollte der Name des Ehepartners angegeben werden. Oder: Ergibt die aus dem Geburtsdatum berechnete Altersangabe, dass die Person minderjährig ist, ist die Unterschrift des Vormunds erforderlich. Diese Skriptregel stellt sicher, dass bei Dokumenten, in denen das Feld Familienstand den Wert „Married“ hat, sowohl Vor- als auch Nachname des Ehepartners ausgefüllt sind:
function checkFieldValuePresence(field) {
    if (!field.Value) {
        Context.ErrorMessage = 'Wert des Felds ' + field.Name + ' darf nicht leer sein';
        return false;
    }
    return true;
}

var conditionField = Context.GetField("MaritalStatus");

if (conditionField === null) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = 'Feld MaritalStatus nicht gefunden';
} else if (checkFieldValuePresence(conditionField)) {
    var lastName = Context.GetField("SpouseLastName");
    var firstName = Context.GetField("SpouseFirstName");
    if (conditionField.Text === "Married") {
        if (lastName === null || firstName === null) {
            Context.CheckSucceeded = false;
            Context.ErrorMessage = 'Feld für Ehepartnername nicht gefunden';
        } else if (!checkFieldValuePresence(lastName) || !checkFieldValuePresence(firstName)) {
            Context.CheckSucceeded = false;
        }
    }
} else { // Familienstand nicht ausgefüllt, Prüfung fehlgeschlagen
    Context.CheckSucceeded = false;
}

Prüfen, ob das Feld auf dem Dokument gefunden wurde

Regeln können verwendet werden, um Feldwerte zu befüllen, auch wenn der Wert nicht tatsächlich auf dem Dokument aufgedruckt ist. Wenn beispielsweise mehrere Steuern anfallen, kann die gesamte Steuer automatisch berechnet werden. In einigen Ländern ist jedoch vorgeschrieben, dass der gesamte Steuerbetrag auf dem Dokument ausgewiesen ist. Diese Skriptregel prüft, dass bei Belegen aus Deutschland die gesamte Steuer nicht nur berechnet wird, sondern auch im Bild vorhanden ist. Für andere Länder ist keine zusätzliche Prüfung erforderlich, da das Flag Erforderliches Feld für das Feld „Gesamtsteuer“ aktiviert ist:
function checkFieldRegion(field) {
    if (!field || !field.HasRegion) {
        Context.ErrorMessage = 'Das Feld (' + field.Name + ') ist nicht im Dokumentbild vorhanden';
        return false;
    }
    return true;
}

var conditionField = Context.GetField("CountryOfOrigin");

if (!conditionField.Value) {
    Context.ErrorMessage = 'Herkunftsland unbekannt, Steuern können nicht geprüft werden';
    Context.CheckSucceeded = false;
} else {
    var totalTaxField = Context.GetField("TotalTax");
    if (conditionField.Text === "DE" && !checkFieldRegion(totalTaxField)) {
        Context.CheckSucceeded = false;
    }
}

Daten in besonderen Fällen validieren

Die Überprüfung, dass die gesamte Steuer der Summe aller Steuern entspricht, kann mit einer vordefinierten Regel (Check Sum) erfolgen. Wenn jedoch in manchen Ländern eine der Steuern einen negativen Wert haben kann, lässt sich nur mit einer Skriptregel beiden Fällen gerecht werden. Abhängig vom Herkunftsland des Dokuments werden entweder alle Steuern addiert oder eine Rückerstattungssteuer mit negativem Vorzeichen entsprechend berücksichtigt (addiert bzw. subtrahiert). Dieses Beispielskript prüft, dass die Summe zweier Steuern der gesamten Steuer entspricht – außer wenn der Beleg aus Spanien stammt. In diesem Fall kann entweder die Summe oder die Differenz der beiden der gesamten Steuer entsprechen:
var conditionField = Context.GetField("CountryOfOrigin");
var totalTaxField = Context.GetField("TotalTax");
var tax1Field = Context.GetField("Tax1");
var tax2Field = Context.GetField("Tax2");

if (!conditionField.Value || !totalTaxField.Value || !tax1Field.Value || !tax2Field.Value) {
    Context.ErrorMessage = 'Steuern können nicht geprüft werden';
    Context.CheckSucceeded = false;
} else {
    if (conditionField.Text === "ES") {
        Context.CheckSucceeded = ((Math.round(tax1Field.Value - tax2Field.Value) === Math.round(totalTaxField.Value))
            || (Math.round(tax1Field.Value + tax2Field.Value) === Math.round(totalTaxField.Value)));
    } else {
        Context.CheckSucceeded = (Math.round(tax1Field.Value + tax2Field.Value) === Math.round(totalTaxField.Value));
    }
}

Summen von Tabellenspalten mit Werten außerhalb der Tabelle vergleichen

Skripte können nicht nur auf reguläre Felder zugreifen, sondern auch auf Werte innerhalb von Tabellen. Um Regelprüfungen zu beschleunigen, empfehlen wir, Tabellen als Variablen zu speichern und anschließend diese Variablen statt der ursprünglichen Tabellen zu verwenden. Wenn eine Variable eine gesamte Tabelle enthält, können Sie die Eigenschaft Instances nutzen, um auf die Zeilen der Tabelle zuzugreifen, und anschließend die Methode Field GetChild verwenden, um den Wert einer bestimmten Zelle in einer Zeile zu ermitteln. Das folgende Beispielskript summiert alle Werte in der Spalte Total Price und vergleicht das Ergebnis mit dem Wert des Feldes Gesamtbetrag:
var totalField = Context.GetField("Total");
var tableField = Context.GetField("MyTable");

if (!totalField) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = "Feld Total wurde nicht gefunden";
    return;
}

if (!tableField) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = "Feld MyTable wurde nicht gefunden";
    return;
}

var sum = 0;

for (var i = 0; i < tableField.Instances.length; i++) {
    var tableTotalField = tableField.Instances[i].GetChild("MyTable/Total Price");
    sum += tableTotalField.Value.Amount;
}

if (Math.abs(sum - totalField.Value.Amount) > 0.02) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = "Die Summe von Total Price in der Tabelle stimmt nicht mit dem Gesamtbetrag überein";
}

Vergleichen Sie einzelne Werte aus Spaltenzellen mit Werten außerhalb von Tabellen und zeigen Sie die Nummern der fehlerhaften Zeilen an

Auf Tabellenspalten kann auch mit der Methode Field GetFields zugegriffen werden. Diese Methode ermöglicht es, eine Liste aller Zellen einer Tabelle abzurufen, was beim Einrichten von Schleifen nützlich sein kann. Das folgende Beispielskript vergleicht die Steuersätze der einzelnen Positionen mit dem übergeordneten Steuersatz. Stimmen die Werte nicht überein, wird das Skript nicht abgebrochen. Stattdessen wird die Nummer der Zeile, in der die Abweichung aufgetreten ist, an eine spezielle Variable übergeben, die die Regel verwenden kann, um die gesamte Spalte zu prüfen. Die Fehlermeldung im Beispielskript listet die Nummern aller Zeilen auf, die Fehler enthalten:
var taxRateFields = Context.GetFields("MyTable/TaxRate");
var taxRateField = Context.GetField("TaxRate");

if (!taxRateFields || !taxRateField)
    return;

var taxRate = taxRateField.Value ? taxRateField.Value : 0;
var wrongLines = [];
for (var i = 0; i < taxRateFields.length; i++) {
    if (taxRateFields[i].Value != taxRate)
        wrongLines.push(i + 1);
}

if (wrongLines.length > 0) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = "Falscher Steuersatz in Zeilen: " + wrongLines.join(", ");
}

Vergleichen Sie das Produkt mehrerer Felder in einer Zeile mit dem Wert eines anderen Felds in derselben Zeile

Sie können verschiedene Operationen mit unterschiedlichen Spalten in einer Tabelle der Reihe nach (zeilenweise) ausführen, ohne Schleifen zu verwenden. Dazu müssen Sie jede Spalte über die Methode Field GetField referenzieren. Dies ist eine wiederkehrende Regel, die automatisch für jede Zeile der Tabelle ausgeführt wird. Alle so referenzierten Spalten müssen aus derselben Tabelle stammen. Das folgende Beispielskript multipliziert die Stückzahl mit dem Stückpreis für jede Zeile und vergleicht den resultierenden Wert mit dem Gesamtpreis für die Position:
var quantityField = Context.GetField("MyTable/Quantity");
var unitPriceField = Context.GetField("MyTable/Unit Price");
var totalField = Context.GetField("MyTable/Total Price");

if (!quantityField || !unitPriceField || !totalField)
    return;

var quantity = quantityField.Value ? quantityField.Value : 0;
var unitPrice = unitPriceField.Value?.Amount ? unitPriceField.Value.Amount : 0;
var total = totalField.Value?.Amount ? totalField.Value.Amount : 0;

var result = quantity * unitPrice;

if (Math.abs(result - total) > 0.01) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = "Menge * Stückpreis entspricht nicht dem Gesamtbetrag";
}