Passer au contenu principal

Vérifier qu’un champ est présent

Par exemple, vérifions que le champ MyField est détecté et renseigné :
var field = Context.GetField("MyField");

if (!field) {
  Context.CheckSucceeded = false;
  Context.ErrorMessage = 'Champ MyField introuvable';
} else if (!field.Value) {
  Context.CheckSucceeded = false;
  Context.ErrorMessage = 'Champ MyField vide';
}

Comparer des nombres à virgule flottante

La comparaison directe de nombres à virgule flottante peut produire des résultats imprévisibles. Nous recommandons d’utiliser les méthodes de l’objet natif Math pour comparer correctement les nombres, en particulier les montants.
// comparer deux nombres à virgule flottante
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 = 'Les valeurs sont différentes';
}

// comparer deux valeurs monétaires
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 = 'Les valeurs sont différentes';
}

Exiger une valeur non vide en fonction d’un autre champ

Un champ optionnel peut devenir obligatoire si la valeur d’un autre champ l’exige. Par exemple, si l’état civil indique « marié », le nom du conjoint doit être renseigné. Ou, si l’âge de la personne calculé à partir de sa date de naissance montre qu’elle est mineure, la signature du tuteur est requise. Cette règle de script vérifie que, pour les documents où le champ État civil a la valeur « Married », le prénom et le nom du conjoint sont tous deux renseignés :
function checkFieldValuePresence(field) {
    if (!field.Value) {
        Context.ErrorMessage = 'La valeur du champ ' + field.Name + ' ne doit pas être vide';
        return false;
    }
    return true;
}

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

if (conditionField === null) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = 'Champ MaritalStatus introuvable';
} 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 = 'Champ nom du conjoint introuvable';
        } else if (!checkFieldValuePresence(lastName) || !checkFieldValuePresence(firstName)) {
            Context.CheckSucceeded = false;
        }
    }
} else { // statut matrimonial non renseigné, vérification échouée
    Context.CheckSucceeded = false;
}

Vérifier que le champ a été localisé sur le document

Les règles peuvent servir à renseigner les valeurs du champ, même si la valeur n’est pas réellement imprimée sur le document. Par exemple, si plusieurs taxes s’appliquent, le total de la taxe peut être calculé automatiquement. Toutefois, certains pays exigent que le montant total de la taxe figure sur le document. Cette règle de script vérifie que, pour les reçus émis en Allemagne, le total de la taxe n’est pas seulement calculé mais bien présent sur l’image. Pour les autres pays, aucune vérification supplémentaire n’est nécessaire, car l’indicateur champ obligatoire est activé pour le champ du total de la taxe :
function checkFieldRegion(field) {
    if (!field || !field.HasRegion) {
        Context.ErrorMessage = 'Le champ (' + field.Name + ') n\'est pas présent sur l\'image du document';
        return false;
    }
    return true;
}

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

if (!conditionField.Value) {
    Context.ErrorMessage = 'Pays d\'origine inconnu, impossible de vérifier les taxes';
    Context.CheckSucceeded = false;
} else {
    var totalTaxField = Context.GetField("TotalTax");
    if (conditionField.Text === "DE" && !checkFieldRegion(totalTaxField)) {
        Context.CheckSucceeded = false;
    }
}

Valider les données dans des cas particuliers

Vérifier que la taxe totale est égale à la somme de toutes les taxes peut se faire à l’aide d’une règle prédéfinie (Check Sum). Mais si, dans certains pays, l’une des taxes peut être négative, seule une règle de script peut couvrir les deux cas. Selon le pays d’origine du document, on pourra soit additionner toutes les taxes, soit additionner et soustraire la taxe de remboursement (négative). Cet exemple de script vérifie que la somme de deux taxes est égale à la taxe totale, sauf si le reçu provient d’Espagne, auquel cas soit la somme, soit la différence des deux peut être égale à la taxe 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 = 'Impossible de vérifier les taxes';
    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));
    }
}

Comparer les sommes des colonnes d’un tableau à des valeurs situées en dehors du tableau

Les scripts peuvent faire référence à des valeurs à l’intérieur des tableaux et pas seulement à des champs. Pour accélérer les vérifications de règles, nous recommandons d’enregistrer les tableaux dans des variables, puis de référencer ces variables plutôt que les tableaux d’origine. Si une variable contient un tableau entier, vous pouvez utiliser la propriété Instances pour accéder aux lignes du tableau, puis la méthode Field GetChild pour obtenir la valeur d’une cellule donnée dans une ligne. Le script ci-dessous additionne toutes les valeurs de la colonne Total Price et compare le résultat à la valeur du champ Total :
var totalField = Context.GetField("Total");
var tableField = Context.GetField("MyTable");

if (!totalField) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = "Le champ Total est introuvable";
    return;
}

if (!tableField) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = "Le champ MyTable est introuvable";
    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 somme des Prix Totaux du tableau ne correspond pas au Total";
}

Comparer les valeurs de cellules de colonne à des valeurs situées en dehors des tableaux et afficher les numéros des lignes contenant des erreurs

La référence aux colonnes d’un tableau peut également se faire à l’aide de la méthode Field GetFields. Cette méthode permet d’obtenir la liste de toutes les cellules d’un tableau, ce qui peut être utile pour mettre en place des boucles. Le script d’exemple ci-dessous compare les taux d’imposition de chaque ligne d’article au taux d’imposition global. Si les valeurs ne correspondent pas, le script n’est pas interrompu. À la place, le numéro de la ligne où l’écart s’est produit est transmis à une variable spéciale, que la règle peut utiliser pour vérifier l’ensemble de la colonne. Le message d’erreur dans le script d’exemple énumérera les numéros de toutes les lignes contenant des erreurs :
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 = "Taux d'imposition incorrect aux lignes : " + wrongLines.join(", ");
}

Comparer le produit de plusieurs champs d’une ligne à la valeur d’un autre champ de la même ligne

Vous pouvez effectuer diverses opérations sur différentes colonnes d’un tableau de manière séquentielle (ligne par ligne) sans utiliser de boucles. Pour ce faire, vous devez référencer chaque colonne à l’aide de la méthode Field GetField. Il s’agit d’une règle répétée qui sera exécutée automatiquement pour chaque ligne du tableau. Toutes les colonnes référencées de cette manière doivent appartenir au même tableau. Le script d’exemple ci-dessous multiplie la quantité par le prix unitaire pour chaque ligne et compare la valeur obtenue au prix total de la ligne d’article :
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é × Prix unitaire n'est pas égal au Total";
}