Saltar al contenido principal

Verificar que un campo esté presente

Por ejemplo, comprobemos que el campo MyField se haya encontrado y esté rellenado:
var field = Context.GetField("MyField");

if (!field) {
  Context.CheckSucceeded = false;
  Context.ErrorMessage = 'Campo MyField no encontrado';
} else if (!field.Value) {
  Context.CheckSucceeded = false;
  Context.ErrorMessage = 'Campo MyField vacío';
}

Comparar números de punto flotante

Comparar directamente números de punto flotante puede producir resultados impredecibles. Recomendamos usar los métodos del objeto incorporado Math para comparar números y, en especial, valores monetarios de forma correcta.
// comparar dos números de punto flotante
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 = 'Los valores son diferentes';
}

// comparar dos valores monetarios
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 = 'Los valores son diferentes';
}

Exigir un valor no vacío en función de otro campo

Un campo opcional puede volverse obligatorio si el valor de otro campo así lo exige. Por ejemplo, si el estado civil es «casado», se debe completar el nombre del cónyuge. O, si la edad de la persona calculada a partir de su fecha de nacimiento indica que es menor de edad, se requiere la firma del tutor. Esta regla de script verifica que, para los documentos donde el campo de estado civil tiene el valor «Married», tanto el nombre como el apellido del cónyuge estén completos:
function checkFieldValuePresence(field) {
    if (!field.Value) {
        Context.ErrorMessage = 'El valor del campo ' + field.Name + ' no debe estar vacío';
        return false;
    }
    return true;
}

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

if (conditionField === null) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = 'Campo MaritalStatus no encontrado';
} 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 = 'Campo de nombre del cónyuge no encontrado';
        } else if (!checkFieldValuePresence(lastName) || !checkFieldValuePresence(firstName)) {
            Context.CheckSucceeded = false;
        }
    }
} else { // estado civil no completado, la verificación falló
    Context.CheckSucceeded = false;
}

Compruebe que el campo se haya localizado en el documento

Las reglas pueden usarse para completar los valores del campo, incluso si el valor no está realmente impreso en el documento. Por ejemplo, si se aplican varios impuestos, el impuesto total puede calcularse automáticamente. Sin embargo, algunos países exigen que el Importe del impuesto total aparezca impreso en el documento. Esta regla de script comprueba que, para los recibos de Alemania, el impuesto total no solo se calcule, sino que esté presente en la imagen. Para otros países, no se requiere ninguna comprobación adicional porque la opción Required field está activada para el campo de impuesto total:
function checkFieldRegion(field) {
    if (!field || !field.HasRegion) {
        Context.ErrorMessage = 'El campo (' + field.Name + ') no está presente en la imagen del documento';
        return false;
    }
    return true;
}

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

if (!conditionField.Value) {
    Context.ErrorMessage = 'País de origen desconocido, no se pueden verificar los impuestos';
    Context.CheckSucceeded = false;
} else {
    var totalTaxField = Context.GetField("TotalTax");
    if (conditionField.Text === "DE" && !checkFieldRegion(totalTaxField)) {
        Context.CheckSucceeded = false;
    }
}

Validar los datos en casos particulares

Comprobar que el impuesto Total sea igual a la suma de todos los impuestos puede hacerse con una regla predefinida (Check Sum). Pero si en algunos países uno de los impuestos puede tener un valor negativo, solo una regla de script podría contemplar ambos casos. Según el país de origen del documento, puede sumar todos los impuestos o sumar y restar el valor negativo de un impuesto de devolución. Este script de ejemplo comprueba que la suma de dos impuestos sea igual al impuesto Total, excepto si el recibo es de España, en cuyo caso la suma o la diferencia de ambos puede ser igual al impuesto Total:
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 = 'No se pueden verificar los impuestos';
    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));
    }
}

Comparar las sumas de columnas de una tabla con valores ubicados fuera de la tabla

Los scripts pueden hacer referencia a valores dentro de tablas y no solo a campos normales. Para acelerar la verificación de reglas, recomendamos guardar las tablas como variables y luego referenciar esas variables en lugar de las tablas originales. Si una variable contiene una tabla completa, puede usar la propiedad Instances para acceder a las filas de la tabla y luego usar el método Field GetChild para obtener el valor de una celda específica en una fila. El script de ejemplo a continuación suma todos los valores de la columna Total Price y compara el resultado con el valor del campo Total:
var totalField = Context.GetField("Total");
var tableField = Context.GetField("MyTable");

if (!totalField) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = "No se encontró el campo Total";
    return;
}

if (!tableField) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = "No se encontró el campo MyTable";
    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 suma de Precio Total en la tabla no coincide con el Total";
}

Comparar valores individuales de las celdas de una columna con valores ubicados fuera de las tablas y mostrar los números de las filas que contienen errores

También se puede hacer referencia a las columnas de una tabla mediante el método Field GetFields. Este método le permite obtener una lista de todas las celdas de una tabla, lo cual puede ser útil para configurar bucles. El siguiente script de ejemplo compara las tasas impositivas de cada partida con la tasa impositiva general. Si los valores no coinciden, el script no se interrumpe. En su lugar, el número de la fila donde se produjo la discrepancia se pasa a una variable especial que la regla puede usar para verificar toda la columna. El mensaje de error del script de ejemplo enumerará los números de todas las filas que contienen errores:
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 = "Tasa impositiva incorrecta en las líneas: " + wrongLines.join(", ");
}

Comparar el producto de varios campos en una fila con el valor de otro campo en la misma fila

Puede realizar varias operaciones con diferentes columnas de una tabla de forma secuencial (fila por fila) sin usar bucles. Para ello, debe hacer referencia a cada columna mediante el método Field GetField. Esta será una regla repetitiva que se ejecutará automáticamente para cada fila de la tabla. Todas las columnas referenciadas de este modo deben pertenecer a la misma tabla. El siguiente script de ejemplo multiplica la cantidad por el precio unitario en cada fila y compara el valor resultante con el precio total de la línea:
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 = "Cantidad * Precio unitario no es igual al Total";
}