Saltar al contenido principal

Autorizar mediante OAuth y enviar datos de exportación a un servicio externo

El siguiente script realiza la autenticación con un token obtenido mediante el flujo Resource Owner Password y luego envía los datos de exportación a un servicio externo:
// Este script de exportación personalizada de ejemplo muestra cómo enviar una solicitud de autorización para OAuth 2.0 Resource Owner Password Flow, recibir el token,
// y luego enviar los resultados de exportación al sistema externo en formato JSON

// Preparar el cuerpo clave-valor para la solicitud de autorización (los parámetros y sus valores pueden ser diferentes). La variable de entorno correspondiente debe crearse previamente.
var authDataContent = {};
authDataContent.grant_type = Context.GetSecret("password_secretName");
authDataContent.scope = "openid permissions";

// Pasar datos sensibles usando variables de entorno. Las variables correspondientes deben crearse 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");

// crear la solicitud y enviar los datos
var request = Context.CreateHttpRequest();
request.Url = "https://my_auth_service.com/auth2/connect/token"
request.Method = "POST";

// crear datos de contenido para la solicitud de autorización
request.SetUrlFormEncodedContent(authDataContent);
request.Send();
var authResponseObject = JSON.parse(request.ResponseText);

// obtener todas las exportaciones del documento
var exports = Context.Transaction.Documents[0].Exports;

// seleccionar el resultado de exportación JSON
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);
var pdfExportResult = exports.find(element => element.ExportFormat === ExportFormat.Pdf);

// Crear datos de contenido para la solicitud
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";

// agregar datos extraídos al resultado de exportación
multiPartRequest.AppendStringContent(extractedDataExportResult.ToJson(), "jsonData");

// agregar el PDF exportado
multiPartRequest.AppendFileContent(pdfExportResult, "binaryData");

// enviar una solicitud al servicio
multiPartRequest.Send();

// Obtener un resultado de respuesta deserializado
var responseObject = JSON.parse(multiPartRequest.ResponseText);

Enviar datos de exportación a un servicio externo

El siguiente script nombra el archivo exportado con el número de factura y luego envía los datos de exportación a un servicio externo (Dropbox, en este caso):
// Este script de exportación personalizada de ejemplo muestra cómo enviar un archivo a Dropbox
// y establecer el nombre del archivo usando el valor del campo de datos extraídos.

// Obtener el resultado de exportación del documento
var exports = Context.Transaction.Documents[0].Exports;
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);

// Obtener el token de acceso a la API de DropBox (https://developers.dropbox.com/en-us/oauth-guide). La variable de entorno correspondiente debe crearse previamente.
var token = Context.GetSecret("access_token_secretName");

// Obtener "Número de factura" de los datos extraídos
var invoiceNumberField = Context.Transaction.Documents[0].GetField("Invoice Number");
var invoiceNumber = invoiceNumberField.Value;

// Crear el nombre del archivo resultante
var jsonFileName = `ExtractedData_${invoiceNumber}.json`;

// Enviar el archivo JSON con los datos extraídos a 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 datos extraídos

El siguiente script modifica el valor de un campo existente y agrega nuevos valores a un campo repetitivo usando la información contenida en la respuesta de un servicio externo:
// Este script de actividad personalizada de ejemplo muestra cómo modificar un campo existente 
// y crear un nuevo valor de campo basado en los resultados de una llamada externa.

// Obtener todas las exportaciones del documento
var exports = Context.Transaction.Documents[0].Exports;

// Obtener el resultado de exportación JSON de las exportaciones
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);

// Obtener el resultado de exportación PDF de las exportaciones
var pdfExportResult = exports.find(element => element.ExportFormat === ExportFormat.Pdf);

// Crear una solicitud HTTP y especificar las propiedades de solicitud requeridas
var multipartFormDataRequest = Context.CreateMultipartFormDataRequest();
multipartFormDataRequest.Url = "http://my_service/api/v1.0/apimethod/"
multipartFormDataRequest.Method = "POST";

// Agregar datos extraídos del resultado de exportación JSON a la solicitud
multipartFormDataRequest.AppendStringContent(extractedDataExportResult.ToJson(), "jsonData");
// Agregar el PDF de los resultados de exportación a la solicitud
multipartFormDataRequest.AppendFileContent(pdfExportResult, "binaryData");

// Establecer el tiempo de espera para que se complete la solicitud HTTP (en minutos).
// Por defecto, el tiempo de espera está establecido en 1 minuto.
multipartFormDataRequest.Timeout = 1;

// Enviar una solicitud al servicio
multipartFormDataRequest.Send();

// Obtener un resultado de respuesta
var newJsonDataObject = JSON.parse(multipartFormDataRequest.ResponseText);

// Asumiendo que se obtuvo tal JSON en el resultado de respuesta:
/* {
    "DocumentData": {
        "Fields": {
            "InvoiceNumber": "706-222-3151",
            "InvoiceDate": "15.05.2020",
            "PurchaseOrder": [
                {
                    "OrderNumber": "25646788",
                    "Total": "540.54"
                },
                {
                    "OrderNumber": "24516684",
                    "Total": "138.43"
                }
            ]
        }
    }
}*/

// Cambiar el valor de un campo de documento de Vantage existente basado en datos recibidos de una llamada externa
var document = Context.Transaction.Documents[0];
var invoiceNumber = document.GetField("Número de factura");
if (invoiceNumber.InstanceId === undefined || invoiceNumber.InstanceId === null)
    invoiceNumber.AddInstance();
invoiceNumber.Value = newJsonDataObject.DocumentData.Fields.InvoiceNumber;

// Agregar nuevos valores de campo de documento de Vantage basados en datos recibidos de una llamada externa
var poOrder = Context.Transaction.Documents[0].GetField("Orden de compra");
let orderNumberFieldId = document.GetField("Orden de compra/Order Number").Id;
let totalFieldId = document.GetField("Orden 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;
});

Recuperar datos de una columna específica de una tabla

El siguiente script escribe todos los valores (filas) de la columna Description en el registro de eventos de la transacción:
// Obtener el primer documento en una transacción
var document = Context.Transaction.Documents[0];
var descriptionFieldId = document.GetField("Line Items/Description").Id;

// Obtener el objeto tabla
var table = document.GetField("Line Items");

for (var i = 0; i < table.Instances.length; i++) {
  // Obtener el objeto columna 'Description' para cada fila de la tabla y escribir sus valores en el registro de eventos de la transacción
  var columnDescription = table.Instances[i].Children.find(x => x.Id === descriptionFieldId);
  Context.LogMessage("Description. Row " + i + ": " + columnDescription.Value);
}

Recuperar datos de todas las columnas de la tabla

El siguiente script escribe todos los valores (filas) de todas las columnas de la tabla en el registro de eventos de la transacción:
// Obtener el primer documento de una transacción
var document = Context.Transaction.Documents[0];

// Obtener el objeto tabla
var table = document.GetField("Line Items");

// Escribir todos los datos de la tabla en el registro de eventos de la transacción
for (var i = 0; i < table.Instances.length; i++) {
    for (var j = 0; j < table.Instances[i].Children.length; j++) {
        Context.LogMessage("Fila de tabla "+i+". Columna "+table.Instances[i].Children[j].Name+": "+table.Instances[i].Children[j].Value);
    }
}

Agregar filas a una tabla

El siguiente script agrega filas nuevas a la tabla y asigna valores a las columnas Description y Quantity:
// Obtener el primer documento en una transacción
var document = Context.Transaction.Documents[0];

// Obtener el objeto de tabla
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;

// Crear función para agregar una fila de tabla y establecer valores para las columnas Description y 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;
}

// Agregar tres filas y establecer 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++);

Eliminar filas de una tabla

El siguiente script elimina todas las filas de una tabla:
// Obtener el primer documento en una transacción
var document = Context.Transaction.Documents[0];

// Obtener el objeto tabla
var table = document.GetField("Line Items");
var indexCount = table.Instances.length - 1;

// Eliminar todas las filas por sus índices
for (var i = indexCount; i >= 0 ; i--) {
  table.Instances[i].Remove();
}

// O puedes eliminar toda la tabla
table.Remove();

Eliminar una instancia específica de un campo repetido

El siguiente script elimina la última instancia de un campo repetido:
// Obtener el primer documento en una transacción
var document = Context.Transaction.Documents[0];

// Obtener el objeto de campo repetible
var rField = document.GetField("First Name");

// Verificar si este campo es repetible
if (rField.IsRepeatable) {
    // Eliminar la última instancia de este campo
    if (rField.Instances.length >= 1) {
        rField.Instances[rField.Instances.length-1].Remove();
    }  
}
else {
    Context.LogMessage(rField.Name + " no es repetible.");
}

Generar un archivo JSON y enviarlo a un sistema de terceros

El siguiente script genera un archivo JSON con un formato personalizado y lo envía a un sistema de terceros:
// Este script de exportación personalizada de ejemplo muestra cómo crear una cadena JSON
// usando valores de campos extraídos de Invoice US y enviarla a un endpoint externo.
// Obtener el primer documento en la transacción.
var document = Context.Transaction.Documents[0];

// Crear un objeto JSON y establecer sus pares clave/valor.
var extractedValues = {};
extractedValues.Total = document.GetField("Total").Value;
extractedValues.Currency = document.GetField("Currency").Value;
extractedValues.Date = document.GetField("Invoice Date").Value;

// Obtener valores de campos repetidos y establecerlos 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);
}

// El archivo JSON recibido tiene el siguiente formato:
/* {
   "Total": 1819.14,
   "Currency": "USD",
   "Date": "2019-05-23T00:00:00.000Z",
   "PurchaseOrderNumber": [
      "012345678",
      "4500123466"
   ]
}*/

// Enviar una solicitud multipart/form-data con el JSON creado previamente como el contenido de cadena de esa solicitud.
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();

Obtener los nombres de archivo originales

El siguiente script coloca el nombre original de un archivo en el campo MyField:
// Obtener el nombre del archivo de origen y establecerlo como el valor del campo especificado ("MyField")
Context.Transaction.Documents.forEach( doc => {
    // Para Scanning Station, el nombre del archivo de origen se coloca en un parámetro de registro
    var param = doc.RegistrationParameters["SourceFileName"]; 
    doc.GetField("MyField").Value = param != null ?
        param.Value : doc.SourceFiles[0].FileName;
});