Pular para o conteúdo principal

Autorize via OAuth e envie os dados de exportação para um serviço externo

O script a seguir realiza a autenticação usando um token obtido pelo fluxo Resource Owner Password e, em seguida, envia os dados de exportação para um serviço externo:
// Este exemplo de script de exportação personalizada mostra como enviar uma solicitação de autorização para OAuth 2.0 Resource Owner Password Flow, receber o token,
// e então enviar os resultados de exportação para o sistema externo em formato JSON

// Prepare o corpo chave-valor para a solicitação de autorização (parâmetros e seus valores podem ser diferentes). A variável de ambiente correspondente deve ser criada previamente.
var authDataContent = {};
authDataContent.grant_type = Context.GetSecret("password_secretName");
authDataContent.scope = "openid permissions";

// Passe dados sensíveis usando variáveis de ambiente. As variáveis correspondentes devem ser criadas previamente.
authDataContent.client_id = Context.GetSecret("client_id_secretName");
authDataContent.client_secret = Context.GetSecret("client_secret_secretName");
authDataContent.password = Context.GetSecret("password_secretName");
authDataContent.username = Context.GetSecret("username_secretName");

// crie a solicitação e envie os dados
var request = Context.CreateHttpRequest();
request.Url = "https://my_auth_service.com/auth2/connect/token"
request.Method = "POST";

// crie dados de conteúdo para a solicitação de autorização
request.SetUrlFormEncodedContent(authDataContent);
request.Send();
var authResponseObject = JSON.parse(request.ResponseText);

// obtenha todas as exportações do documento
var exports = Context.Transaction.Documents[0].Exports;

// selecione o resultado de exportação JSON
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);
var pdfExportResult = exports.find(element => element.ExportFormat === ExportFormat.Pdf);

// Crie dados de conteúdo para a solicitação
var multiPartRequest = Context.CreateMultipartFormDataRequest();
multiPartRequest.Url = "https://my_service.com/api/v1.0/process_method"
multiPartRequest.Method = "POST";
multiPartRequest.AuthToken = authResponseObject.access_token;
multiPartRequest.AuthScheme = "Bearer";

// adicione dados extraídos ao resultado de exportação
multiPartRequest.AppendStringContent(extractedDataExportResult.ToJson(), "jsonData");

// adicione o PDF exportado
multiPartRequest.AppendFileContent(pdfExportResult, "binaryData");

// envie uma solicitação para o serviço
multiPartRequest.Send();

// Obtenha um resultado de resposta deserializado
var responseObject = JSON.parse(multiPartRequest.ResponseText);

Enviar dados de exportação para um serviço externo

O script a seguir nomeia o arquivo exportado usando o número da fatura e, em seguida, envia os dados de exportação para um serviço externo (Dropbox, neste caso):
// Este exemplo de script de exportação personalizada mostra como enviar um arquivo para o Dropbox
// e definir o nome do arquivo usando o valor do campo de dados extraídos.

// Obter o resultado da exportação do documento
var exports = Context.Transaction.Documents[0].Exports;
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);

// Obter o token de acesso para a API do Dropbox (https://developers.dropbox.com/en-us/oauth-guide). A variável de ambiente correspondente deve ser criada previamente.
var token = Context.GetSecret("access_token_secretName");

// Obter "Número da fatura" dos dados extraídos
var invoiceNumberField = Context.Transaction.Documents[0].GetField("Invoice Number");
var invoiceNumber = invoiceNumberField.Value;

// Criar o nome do arquivo resultante
var jsonFileName = `ExtractedData_${invoiceNumber}.json`;

// Enviar o arquivo JSON com os dados extraídos para o Dropbox
var httpRequest = Context.CreateHttpRequest();
httpRequest.Url = "https://content.dropboxapi.com/2/files/upload"
httpRequest.Method = "POST";
httpRequest.AuthScheme = "Bearer";
httpRequest.AuthToken = token;
httpRequest.SetHeader("Dropbox-API-Arg", `{"path": "/Files/${jsonFileName}", "mode": "add", "autorename": true, "mute": false, "strict_conflict": false}`);
httpRequest.SetFileContent(extractedDataExportResult, "application/octet-stream");
httpRequest.Send();

Modificar dados extraídos

O script a seguir modifica o valor de um campo existente e adiciona novos valores a um campo repetitivo usando informações contidas na resposta de um serviço externo:
// Este exemplo de script de atividade personalizada mostra como modificar um campo existente 
// e criar um novo valor de campo com base nos resultados de uma chamada externa.

// Obter todas as exportações do documento
var exports = Context.Transaction.Documents[0].Exports;

// Obter o resultado da exportação JSON das exportações
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);

// Obter o resultado da exportação PDF das exportações
var pdfExportResult = exports.find(element => element.ExportFormat === ExportFormat.Pdf);

// Criar uma requisição HTTP e especificar as propriedades de requisição necessárias
var multipartFormDataRequest = Context.CreateMultipartFormDataRequest();
multipartFormDataRequest.Url = "http://my_service/api/v1.0/apimethod/"
multipartFormDataRequest.Method = "POST";

// Adicionar dados extraídos do resultado da exportação JSON à requisição
multipartFormDataRequest.AppendStringContent(extractedDataExportResult.ToJson(), "jsonData");
// Adicionar o PDF dos resultados da exportação à requisição
multipartFormDataRequest.AppendFileContent(pdfExportResult, "binaryData");

// Definir o timeout para a requisição HTTP ser concluída (em minutos).
// Por padrão, o timeout é definido como 1 minuto.
multipartFormDataRequest.Timeout = 1;

// Enviar uma requisição para o serviço
multipartFormDataRequest.Send();

// Obter um resultado de resposta
var newJsonDataObject = JSON.parse(multipartFormDataRequest.ResponseText);

// Assumindo que tal JSON foi obtido no resultado da resposta:
/* {
    "DocumentData": {
        "Fields": {
            "InvoiceNumber": "706-222-3151",
            "InvoiceDate": "15.05.2020",
            "PurchaseOrder": [
                {
                    "OrderNumber": "25646788",
                    "Total": "540.54"
                },
                {
                    "OrderNumber": "24516684",
                    "Total": "138.43"
                }
            ]
        }
    }
}*/

// Alterar o valor de um campo de documento Vantage existente com base em dados recebidos de uma chamada externa
var document = Context.Transaction.Documents[0];
var invoiceNumber = document.GetField("Número da fatura");
if (invoiceNumber.InstanceId === undefined || invoiceNumber.InstanceId === null)
    invoiceNumber.AddInstance();
invoiceNumber.Value = newJsonDataObject.DocumentData.Fields.InvoiceNumber;

// Adicionar novos valores de campo de documento Vantage com base em dados recebidos de uma chamada externa
var poOrder = Context.Transaction.Documents[0].GetField("Pedido de Compra");
let orderNumberFieldId = document.GetField("Pedido de Compra/Order Number").Id;
let totalFieldId = document.GetField("Pedido de Compra/Total").Id;
newJsonDataObject.DocumentData.Fields.PurchaseOrder.forEach(function (elem) {
    var newOrder = poOrder.AddInstance();
    var orderNumber = newOrder.Children.find(x => x.Id === orderNumberFieldId);
    orderNumber.Value = elem.OrderNumber;
    var total = newOrder.Children.find(x => x.Id === totalFieldId);
    total.Value = elem.Total;
});

Obter dados de uma coluna específica da tabela

O script a seguir grava todos os valores (linhas) da coluna Description da tabela no log de eventos da transação:
// Obter o primeiro documento em uma transação
var document = Context.Transaction.Documents[0];
var descriptionFieldId = document.GetField("Line Items/Description").Id;

// Obter o objeto da tabela
var table = document.GetField("Line Items");

for (var i = 0; i < table.Instances.length; i++) {
  // Obter o objeto da coluna 'Description' para cada linha da tabela e gravar seus valores no log de eventos da transação
  var columnDescription = table.Instances[i].Children.find(x => x.Id === descriptionFieldId);
  Context.LogMessage("Description. Row " + i + ": " + columnDescription.Value);
}

Recuperar dados de todas as colunas da tabela

O script a seguir grava todos os valores (linhas) de todas as colunas da tabela no log de eventos da transação:
// Obter o primeiro documento em uma transação
var document = Context.Transaction.Documents[0];

// Obter o objeto da tabela
var table = document.GetField("Line Items");

// Escrever todos os dados da tabela no log de eventos da transação
for (var i = 0; i < table.Instances.length; i++) {
    for (var j = 0; j < table.Instances[i].Children.length; j++) {
        Context.LogMessage("Linha da tabela "+i+". Coluna "+table.Instances[i].Children[j].Name+": "+table.Instances[i].Children[j].Value);
    }
}

Adicionar linhas a uma tabela

O script a seguir adiciona novas linhas à tabela e define valores para as colunas Descrição e Quantidade:
// Obter o primeiro documento em uma transação
var document = Context.Transaction.Documents[0];

// Obter o objeto da tabela
var table = document.GetField("Line Items");
var descriptionFieldId = document.GetField("Line Items/Description").Id;
var quantityFieldId = document.GetField("Line Items/Quantity").Id;
var tableRowCount = table.Instances.length;

// Criar função para adicionar uma linha da tabela e definir valores para as colunas Description e Quantity
function addRow(valueDescription, valueQuantity, index) {
    table.AddInstance();
    var columnDescription = table.Instances[index].Children.find(x => x.Id === descriptionFieldId);
    columnDescription.Value = valueDescription;
    var columnQuantity = table.Instances[index].Children.find(x => x.Id === quantityFieldId);
    columnQuantity.Value = valueQuantity;
}

// Adicionar três linhas e definir valores
addRow("49910 - Gloves or mittens, NOI, in boxes", 4, tableRowCount++);
addRow("15560 - Bulk, NOI, inflated", 42, tableRowCount++);
addRow("15520 - Athletic or Sporting Goods, NOI", 24, tableRowCount++);

Excluir linhas de uma tabela

O script a seguir exclui todas as linhas de uma tabela:
// Obter o primeiro documento em uma transação
var document = Context.Transaction.Documents[0];

// Obter o objeto da tabela
var table = document.GetField("Line Items");
var indexCount = table.Instances.length - 1;

// Excluir todas as linhas pelos seus índices
for (var i = indexCount; i >= 0 ; i--) {
  table.Instances[i].Remove();
}

// Ou você pode excluir toda a tabela
table.Remove();

Excluir uma instância específica de um campo repetido

O script a seguir exclui a última instância de um campo repetido:
// Obter o primeiro documento em uma transação
var document = Context.Transaction.Documents[0];

// Obter o objeto de campo repetitivo
var rField = document.GetField("First Name");

// Verificar se este campo é repetitivo
if (rField.IsRepeatable) {
    // Excluir a última instância deste campo
    if (rField.Instances.length >= 1) {
        rField.Instances[rField.Instances.length-1].Remove();
    }  
}
else {
    Context.LogMessage(rField.Name + " não é repetitivo.");
}

Gerar um arquivo JSON e enviá-lo a um sistema de terceiros

O script a seguir gera um arquivo JSON em um formato personalizado e o envia a um sistema de terceiros:
// Este exemplo de script de exportação personalizada mostra como criar uma string JSON
// usando valores de campos extraídos de Invoice US e enviá-la para um endpoint externo.
// Obter o primeiro documento na transação.
var document = Context.Transaction.Documents[0];

// Create a JSON object and set its key/value pairs.
var extractedValues = {};
extractedValues.Total = document.GetField("Total").Value;
extractedValues.Currency = document.GetField("Currency").Value;
extractedValues.Date = document.GetField("Invoice Date").Value;

// Obter valores de campos repetidos e defini-los como valores de array JSON.
extractedValues.PurchaseOrderNumber = [];
var poGroup = document.GetField("Purchase Order");
var orderNumberFieldId = document.getField("Purchase Order/Order Number").Id;
for (var i = 0; i < poGroup.Instances.length; i++) {
  var poNumber = poGroup.Instances[i].Children.find(x => x.Id === orderNumberFieldId);
  extractedValues.PurchaseOrderNumber.push(poNumber.Value);
}

// O arquivo JSON recebido está no seguinte formato:
/* {
   "Total": 1819.14,
   "Currency": "USD",
   "Date": "2019-05-23T00:00:00.000Z",
   "PurchaseOrderNumber": [
      "012345678",
      "4500123466"
   ]
}*/

// Enviar uma requisição multipart/form-data com o JSON criado anteriormente como conteúdo string dessa requisição.
var httpRequest = Context.CreateMultipartFormDataRequest();
httpRequest.Method = "POST";
httpRequest.Url = "https://external-endpoint.com/api/v1.0/tasks/1495c913-17bb-48d4-8041-a240e05ca9a4/process
httpRequest.AppendStringContent(JSON.stringify(extractedValues), "jsonData");
httpRequest.Send();

Recuperar nomes de arquivos originais

O script a seguir insere o nome original de um arquivo no campo MyField:
// Obter o nome do arquivo de origem e defini-lo como o valor do campo especificado ("MyField")
Context.Transaction.Documents.forEach( doc => {
    // Para Scanning Station, o nome do arquivo de origem é colocado em um parâmetro de registro
    var param = doc.RegistrationParameters["SourceFileName"]; 
    doc.GetField("MyField").Value = param != null ?
        param.Value : doc.SourceFiles[0].FileName;
});