Vai al contenuto principale

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. Si consiglia di usare i metodi dell’oggetto integrato Math per confrontare correttamente i numeri e, in particolare, gli importi monetari.
// 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 = 'I valori sono diversi';
}

// 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 = 'I valori sono diversi';
}

Richiedere un valore non vuoto in base a un altro field

Un field opzionale può diventare obbligatorio se il valore di un altro field lo richiede. Ad esempio, se lo stato civile è “married”, è necessario inserire il nome del coniuge. Oppure, se l’età della persona calcolata dalla data di nascita indica che è minorenne, è necessaria la firma del tutore. Questa regola di script verifica che, per i documenti in cui il field dello stato civile ha il valore “Married”, siano compilati sia il nome sia il cognome del coniuge:
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 il Field sia stato individuato sul Document

Le regole possono essere utilizzate per compilare i valori del field, anche se il valore non è effettivamente 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 non sia solo calcolata ma anche 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 tipo script può considerare entrambi i casi. A seconda del paese di origine del documento, può sommare tutte le imposte oppure sommare e sottrarre il valore negativo di un’imposta di reso. Questo script di esempio verifica che la somma di due imposte sia uguale all’imposta totale, tranne quando la ricevuta proviene dalla Spagna, nel qual caso 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 le somme delle colonne di una tabella con i valori esterni alla tabella

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

if (!totalField) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = "Il field Totale non è stato trovato";
    return;
}

if (!tableField) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = "Il field MyTable non è stato trovato";
    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 = "La somma del Prezzo Totale nella tabella non corrisponde al Totale";
}

Confrontare i singoli valori delle celle di colonna con valori esterni alle tabelle e visualizzare i numeri delle righe contenenti errori

Il riferimento alle colonne di una tabella può essere effettuato anche tramite il metodo Field GetFields. Questo metodo consente di ottenere un elenco di tutte le celle di una tabella, utile per impostare cicli. Lo script di esempio seguente confronta le aliquote d’imposta per ogni riga di dettaglio con l’aliquota complessiva. Se i valori non corrispondono, l’esecuzione dello script non viene interrotta; invece, il numero della riga in cui si è verificata la difformità viene passato a una variabile speciale, che la regola può utilizzare per verificare l’intera colonna. Il messaggio di errore nello script di esempio elencherà i numeri di tutte le righe che contengono errori:
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 di più field in una riga con il valore di un field diverso nella stessa riga

È possibile eseguire varie operazioni su colonne diverse di una tabella in sequenza (riga per riga) senza utilizzare cicli. Per farlo, è necessario fare riferimento a ciascuna colonna utilizzando il metodo Field GetField. Si tratta di una regola ripetuta che verrà eseguita automaticamente per ogni riga della tabella. Tutte le colonne richiamate in questo modo devono appartenere alla stessa tabella. Lo script di esempio seguente moltiplica la quantità per il prezzo unitario per ogni riga e confronta il valore ottenuto con il prezzo totale della 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";
}