Vai al contenuto principale

Documentation Index

Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt

Use this file to discover all available pages before exploring further.

I seguenti esempi JavaScript illustrano modelli comuni per le Advanced Script Rules: verifica della presenza di field, confronto di valori numerici, applicazione della convalida condizionale e convalida dei dati nelle tabelle. Copiali e adattali ai nomi dei tuoi field e alle tue regole aziendali.

Verificare che un field sia presente

Ad esempio, verifichiamo che il field MyField sia stato trovato e valorizzato:
var field = Context.GetField("MyField");

if (!field) {
  Context.CheckSucceeded = false;
  Context.ErrorMessage = 'Field MyField non trovato';
} else if (!field.Value) {
  Context.CheckSucceeded = false;
  Context.ErrorMessage = 'Field MyField vuoto';
}

Confrontare numeri in virgola mobile

Il confronto diretto di numeri in virgola mobile può produrre risultati imprevedibili. Usa i metodi dell’oggetto integrato Math per confrontare i numeri — in particolare gli importi monetari — in modo affidabile.
// confronta due numeri in virgola mobile
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 = 'The values are different';
}

// confronta due valori monetari
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 = 'The values are different';
}

Richiedere un valore non vuoto in base a un altro field

Un field opzionale può diventare obbligatorio in base al valore di un altro field. Ad esempio, se MaritalStatus è Married, i field del nome del coniuge devono essere compilati. Questa regola di script verifica che, quando MaritalStatus è Married, siano compilati sia SpouseFirstName sia SpouseLastName:
function checkFieldValuePresence(field) {
    if (!field.Value) {
        Context.ErrorMessage = 'Il valore del field ' + field.Name + ' non deve essere vuoto';
        return false;
    }
    return true;
}

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

if (conditionField === null) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = 'Field MaritalStatus non trovato';
} 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 = 'Field del nome del coniuge non trovato';
        } else if (!checkFieldValuePresence(lastName) || !checkFieldValuePresence(firstName)) {
            Context.CheckSucceeded = false;
        }
    }
} else { // stato civile non compilato, controllo non riuscito
    Context.CheckSucceeded = false;
}

Verificare che un field sia individuato sul document

Le regole possono anche compilare i valori del field, anche se il valore non è stampato sul document. Ad esempio, se si applicano diverse imposte, l’importo totale delle imposte può essere calcolato automaticamente. Tuttavia, alcuni Paesi richiedono che l’importo totale delle imposte sia stampato sul document. Questa regola di script verifica che, per le ricevute provenienti dalla Germania, l’imposta totale sia presente nell’immagine. Per gli altri Paesi non è necessario alcun controllo aggiuntivo, perché il flag Required field è attivato per il field dell’imposta totale:
function checkFieldRegion(field) {
    if (!field || !field.HasRegion) {
        Context.ErrorMessage = 'Il field (' + field.Name + ') non è presente nell\'immagine del documento';
        return false;
    }
    return true;
}

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

if (!conditionField.Value) {
    Context.ErrorMessage = 'Paese di origine sconosciuto, impossibile verificare le imposte';
    Context.CheckSucceeded = false;
} else {
    var totalTaxField = Context.GetField("TotalTax");
    if (conditionField.Text === "DE" && !checkFieldRegion(totalTaxField)) {
        Context.CheckSucceeded = false;
    }
}

Convalidare i dati in casi particolari

Verificare che l’imposta totale sia uguale alla somma di tutte le imposte si può fare con una regola predefinita (Check Sum). Tuttavia, se in alcuni paesi una delle imposte può avere un valore negativo, solo una regola di script può gestire entrambi i casi — sommando tutte le imposte oppure sommando e sottraendo un’imposta di reso, a seconda del paese di origine. Questo script verifica che la somma di due imposte sia uguale all’imposta totale, tranne per le ricevute provenienti dalla Spagna, per le quali sia la somma sia la differenza delle due può essere uguale all’imposta totale:
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 = 'Impossibile verificare le imposte';
    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));
    }
}

Confrontare la somma di una colonna con un field esterno

Gli script possono fare riferimento ai valori presenti nelle tabelle, non solo ai field normali. Per velocizzare i controlli delle regole, salvare le tabelle come variabili e fare riferimento alle variabili invece di recuperare nuovamente la tabella. Se una variabile contiene un’intera tabella, usare la proprietà Instances per accedere alle righe, quindi usare GetChild per ottenere una specifica cella in una riga. L’esempio seguente somma tutti i valori nella colonna Total Price e confronta il risultato con il field Total:
var totalField = Context.GetField("Total");
var tableField = Context.GetField("MyTable");

if (!totalField) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = "Total field is not found";
    return;
}

if (!tableField) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = "MyTable field is not found";
    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 = "The sum of Total Price in the table doesn't match Total";
}

Confrontare le celle di una colonna con un field esterno ed elencare le righe che non superano il controllo

Fare riferimento alle colonne di una tabella con Context.GetFields per ottenere ogni cella della colonna, utile per eseguire cicli. Lo script di esempio seguente confronta l’aliquota d’imposta di ogni riga con l’aliquota complessiva. Quando i valori non corrispondono, lo script continua invece di terminare immediatamente, raccogliendo i numeri delle righe con difformità e riportandoli nel messaggio di errore:
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 = "Aliquota d'imposta errata nelle righe: " + wrongLines.join(", ");
}

Confrontare il prodotto dei valori di una riga con un altro valore della stessa riga

È possibile eseguire operazioni su colonne diverse di una tabella riga per riga senza utilizzare cicli espliciti: fare riferimento a ciascuna colonna utilizzando Context.GetField. Questo crea una regola ripetuta che viene eseguita automaticamente per ogni riga. Tutte le colonne richiamate in questo modo devono appartenere alla stessa tabella. L’esempio seguente moltiplica la quantità per il prezzo unitario per ogni riga e confronta il risultato con il prezzo totale della voce di riga:
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 = "Quantità * Prezzo unitario non è uguale al Totale";
}

Automazione delle regole di business

Aggiungi regole di script a una Document skill, configura field leggibili e scrivibili e fai riferimento alle colonne della tabella.

Modello a oggetti

Riferimento completo agli oggetti JavaScript da utilizzare nelle Advanced Script Rules.

Context

L’oggetto globale Context — accedi al documento, ai field e ai parametri della skill dall’interno di una regola.

Field

L’oggetto Field — esamina e modifica un field del documento durante l’esecuzione della regola.