Pular para o conteúdo principal

Verifique se um campo está presente

Por exemplo, vamos verificar se o campo MyField foi localizado e preenchido:
var field = Context.GetField("MyField");

if (!field) {
  Context.CheckSucceeded = false;
  Context.ErrorMessage = 'Campo MyField não encontrado';
} else if (!field.Value) {
  Context.CheckSucceeded = false;
  Context.ErrorMessage = 'Campo MyField vazio';
}

Comparar números de ponto flutuante

Comparar diretamente números de ponto flutuante pode levar a resultados imprevisíveis. Recomendamos usar os métodos do objeto nativo Math para comparar números e, sobretudo, valores monetários corretamente.
// comparar dois números de ponto flutuante
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 = 'Os valores são diferentes';
}

// comparar dois valores monetários
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 = 'Os valores são diferentes';
}

Exigir um valor não vazio dependendo de outro campo

Um campo opcional pode se tornar obrigatório se o valor de outro campo assim o exigir. Por exemplo, se o estado civil estiver como “casado”, o nome do cônjuge deve ser preenchido. Ou, se a idade da pessoa calculada a partir da data de nascimento indicar que ela é menor de idade, será necessária a assinatura do responsável. Esta regra de script verifica que, para documentos em que o campo de estado civil tem o valor “Married”, o primeiro e o último nome do cônjuge estão ambos preenchidos:
function checkFieldValuePresence(field) {
    if (!field.Value) {
        Context.ErrorMessage = 'O valor do campo ' + field.Name + ' não deve estar vazio';
        return false;
    }
    return true;
}

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

if (conditionField === null) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = 'Campo MaritalStatus não 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 do nome do cônjuge não encontrado';
        } else if (!checkFieldValuePresence(lastName) || !checkFieldValuePresence(firstName)) {
            Context.CheckSucceeded = false;
        }
    }
} else { // estado civil não preenchido, verificação falhou
    Context.CheckSucceeded = false;
}

Verifique se o campo foi localizado no documento

As regras podem ser usadas para preencher os valores do campo, mesmo que o valor não esteja realmente impresso no documento. Por exemplo, se vários impostos se aplicarem, o imposto total pode ser calculado automaticamente. No entanto, alguns países exigem que o valor total do imposto seja impresso no documento. Esta regra de script verifica que, para recibos da Alemanha, o imposto total não é apenas calculado, mas também está presente na imagem. Para outros países, nenhuma verificação adicional é necessária porque o indicador Required field está ativado para o campo de imposto total:
function checkFieldRegion(field) {
    if (!field || !field.HasRegion) {
        Context.ErrorMessage = 'O campo (' + field.Name + ') não está presente na imagem do documento';
        return false;
    }
    return true;
}

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

if (!conditionField.Value) {
    Context.ErrorMessage = 'País de origem desconhecido, não é possível verificar os impostos';
    Context.CheckSucceeded = false;
} else {
    var totalTaxField = Context.GetField("TotalTax");
    if (conditionField.Text === "DE" && !checkFieldRegion(totalTaxField)) {
        Context.CheckSucceeded = false;
    }
}

Validar os dados em casos específicos

Verificar se o imposto total é igual à soma de todos os impostos pode ser feito usando uma regra predefinida (Check Sum). Porém, se em alguns países um dos impostos puder ter valor negativo, somente uma regra de script conseguiria considerar ambos os casos. Dependendo do país de origem do documento, ela pode somar todos os impostos ou somar e subtrair o valor negativo de um imposto de devolução. Este script de exemplo verifica se a soma de dois impostos é igual ao imposto total, exceto se o recibo for da Espanha, caso em que a soma ou a diferença entre os dois pode ser igual ao imposto 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 = 'Não foi possível verificar os impostos';
    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 somas de colunas de tabela com valores fora da tabela

Scripts podem referenciar valores dentro de tabelas, e não apenas campos regulares. Para acelerar as verificações de regras, recomendamos salvar as tabelas como variáveis e depois referenciar essas variáveis em vez das tabelas originais. Se uma variável contiver uma tabela inteira, você pode usar a propriedade Instances para acessar as linhas da tabela e, em seguida, usar o método Field GetChild para obter o valor de uma célula específica em uma linha. O script de exemplo abaixo soma todos os valores na coluna Total Price e compara o resultado ao valor do campo Total:
var totalField = Context.GetField("Total");
var tableField = Context.GetField("MyTable");

if (!totalField) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = "Campo Total não encontrado";
    return;
}

if (!tableField) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = "Campo MyTable não encontrado";
    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 = "A soma do Total Price na tabela não corresponde ao Total";
}

Compare valores individuais de células de coluna com valores localizados fora das tabelas e exiba os números das linhas que contêm erros

Também é possível fazer referência às colunas de uma tabela usando o método Field GetFields. Esse método permite obter uma lista de todas as células de uma tabela, o que pode ser útil para configurar loops. O script de exemplo abaixo compara as alíquotas de imposto de cada item de linha com a alíquota de imposto geral. Se os valores não corresponderem, o script não é interrompido. Em vez disso, o número da linha em que ocorreu a divergência é passado para uma variável especial, que a regra pode usar para verificar toda a coluna. A mensagem de erro no script de exemplo listará os números de todas as linhas que contêm erros:
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 = "Alíquota de imposto incorreta nas linhas: " + wrongLines.join(", ");
}

Comparar o produto de vários campos em uma linha ao valor de um campo diferente na mesma linha

Você pode executar várias operações com diferentes colunas de uma tabela, sequencialmente (linha a linha), sem usar loops. Para isso, é necessário referenciar cada coluna usando o método Field GetField. Essa será uma regra repetitiva que será executada automaticamente para cada linha da tabela. Todas as colunas referenciadas dessa forma precisam pertencer à mesma tabela. O script de exemplo abaixo multiplica a quantidade pela unidade de preço em cada linha e compara o valor resultante com o preço total do item da linha:
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 = "Quantidade * Preço unitário não é igual ao Total";
}