Passer au contenu principal

S’authentifier via OAuth et envoyer les données d’export à un service externe

Le script suivant effectue l’authentification à l’aide d’un jeton obtenu via le flux Resource Owner Password, puis envoie les données d’export à un service externe :
// Cet exemple de script d'exportation personnalisé montre comment envoyer une requête d'autorisation pour OAuth 2.0 Resource Owner Password Flow, recevoir le jeton,
// et ensuite envoyer les résultats d'exportation au système externe au format JSON

// Préparer le corps clé-valeur pour la requête d'autorisation (les paramètres et leurs valeurs peuvent être différents). La variable d'environnement correspondante doit être créée au préalable.
var authDataContent = {};
authDataContent.grant_type = Context.GetSecret("password_secretName");
authDataContent.scope = "openid permissions";

// Transmettre les données sensibles en utilisant des variables d'environnement. Les variables correspondantes doivent être créées au préalable.
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");

// créer la requête et envoyer les données
var request = Context.CreateHttpRequest();
request.Url = "https://my_auth_service.com/auth2/connect/token"
request.Method = "POST";

// créer les données de contenu pour la requête d'autorisation
request.SetUrlFormEncodedContent(authDataContent);
request.Send();
var authResponseObject = JSON.parse(request.ResponseText);

// obtenir toutes les exportations du document
var exports = Context.Transaction.Documents[0].Exports;

// sélectionner le résultat d'exportation JSON
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);
var pdfExportResult = exports.find(element => element.ExportFormat === ExportFormat.Pdf);

// Créer les données de contenu pour la requête
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";

// ajouter les données extraites au résultat d'exportation
multiPartRequest.AppendStringContent(extractedDataExportResult.ToJson(), "jsonData");

// ajouter le PDF exporté
multiPartRequest.AppendFileContent(pdfExportResult, "binaryData");

// envoyer une requête au service
multiPartRequest.Send();

// Obtenir un résultat de réponse désérialisé
var responseObject = JSON.parse(multiPartRequest.ResponseText);

Envoyer les données d’export vers un service externe

Le script suivant nomme le fichier exporté à partir du numéro de facture, puis envoie les données d’export vers un service externe (Dropbox dans ce cas) :
// Cet exemple de script d'exportation personnalisé montre comment envoyer un fichier vers Dropbox
// et définir le nom du fichier en utilisant la valeur d'un champ de données extraites.

// Obtenir le résultat d'exportation du document
var exports = Context.Transaction.Documents[0].Exports;
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);

// Obtenir le jeton d'accès à l'API DropBox (https://developers.dropbox.com/en-us/oauth-guide). La variable d'environnement correspondante doit être créée au préalable.
var token = Context.GetSecret("access_token_secretName");

// Obtenir le "Numéro de facture" à partir des données extraites
var invoiceNumberField = Context.Transaction.Documents[0].GetField("Invoice Number");
var invoiceNumber = invoiceNumberField.Value;

// Créer le nom du fichier résultat
var jsonFileName = `ExtractedData_${invoiceNumber}.json`;

// Envoyer le fichier JSON avec les données extraites vers 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();

Modifier les données extraites

Le script suivant modifie la valeur d’un champ existant et ajoute de nouvelles valeurs à un champ répétitif à partir des informations contenues dans la réponse d’un service externe :
// Cet exemple de script d'activité personnalisée montre comment modifier un champ existant 
// et créer une nouvelle valeur de champ basée sur les résultats d'un appel externe.

// Récupérer toutes les exportations du document
var exports = Context.Transaction.Documents[0].Exports;

// Récupérer le résultat d'exportation JSON à partir des exportations
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);

// Récupérer le résultat d'exportation PDF à partir des exportations
var pdfExportResult = exports.find(element => element.ExportFormat === ExportFormat.Pdf);

// Créer une requête HTTP et spécifier les propriétés de requête requises
var multipartFormDataRequest = Context.CreateMultipartFormDataRequest();
multipartFormDataRequest.Url = "http://my_service/api/v1.0/apimethod/"
multipartFormDataRequest.Method = "POST";

// Ajouter les données extraites du résultat d'exportation JSON à la requête
multipartFormDataRequest.AppendStringContent(extractedDataExportResult.ToJson(), "jsonData");
// Ajouter le PDF des résultats d'exportation à la requête
multipartFormDataRequest.AppendFileContent(pdfExportResult, "binaryData");

// Définir le délai d'expiration pour que la requête HTTP soit terminée (en minutes).
// Par défaut, le délai d'expiration est défini à 1 minute.
multipartFormDataRequest.Timeout = 1;

// Envoyer une requête au service
multipartFormDataRequest.Send();

// Récupérer un résultat de réponse
var newJsonDataObject = JSON.parse(multipartFormDataRequest.ResponseText);

// En supposant qu'un tel JSON a été obtenu dans le résultat de réponse :
/* {
    "DocumentData": {
        "Fields": {
            "InvoiceNumber": "706-222-3151",
            "InvoiceDate": "15.05.2020",
            "PurchaseOrder": [
                {
                    "OrderNumber": "25646788",
                    "Total": "540.54"
                },
                {
                    "OrderNumber": "24516684",
                    "Total": "138.43"
                }
            ]
        }
    }
}*/

// Modifier la valeur d'un champ de document Vantage existant basé sur les données reçues d'un appel externe
var document = Context.Transaction.Documents[0];
var invoiceNumber = document.GetField("Numéro de facture");
if (invoiceNumber.InstanceId === undefined || invoiceNumber.InstanceId === null)
    invoiceNumber.AddInstance();
invoiceNumber.Value = newJsonDataObject.DocumentData.Fields.InvoiceNumber;

// Ajouter de nouvelles valeurs de champ de document Vantage basées sur les données reçues d'un appel externe
var poOrder = Context.Transaction.Documents[0].GetField("Commande d'achat");
let orderNumberFieldId = document.GetField("Commande d'achat/Order Number").Id;
let totalFieldId = document.GetField("Commande d'achat/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;
});

Récupérer les données d’une colonne spécifique d’un tableau

Le script suivant écrit toutes les valeurs (lignes) de la colonne Description du tableau dans le journal des événements de la transaction :
// Obtenir le premier document d'une transaction
var document = Context.Transaction.Documents[0];
var descriptionFieldId = document.GetField("Line Items/Description").Id;

// Obtenir l'objet tableau
var table = document.GetField("Line Items");

for (var i = 0; i < table.Instances.length; i++) {
  // Obtenir l'objet colonne 'Description' pour chaque ligne du tableau et écrire ses valeurs dans le journal d'événements de la transaction
  var columnDescription = table.Instances[i].Children.find(x => x.Id === descriptionFieldId);
  Context.LogMessage("Description. Ligne " + i + " : " + columnDescription.Value);
}

Récupérer les données de toutes les colonnes du tableau

Le script suivant écrit toutes les valeurs (lignes) de toutes les colonnes du tableau dans le journal des événements de la transaction :
// Obtenir le premier document d'une transaction
var document = Context.Transaction.Documents[0];

// Obtenir l'objet tableau
var table = document.GetField("Line Items");

// Écrire toutes les données du tableau dans le journal des événements de la transaction
for (var i = 0; i < table.Instances.length; i++) {
    for (var j = 0; j < table.Instances[i].Children.length; j++) {
        Context.LogMessage("Ligne du tableau "+i+". Colonne "+table.Instances[i].Children[j].Name+": "+table.Instances[i].Children[j].Value);
    }
}

Ajouter des lignes à un tableau

Le script suivant ajoute de nouvelles lignes au tableau et définit des valeurs pour les colonnes Description et Quantité du tableau :
// Obtenir le premier document dans une transaction
var document = Context.Transaction.Documents[0];

// Obtenir l'objet table
var table = document.GetField("Lignes d'articles");
var descriptionFieldId = document.GetField("Lignes d'articles/Description").Id;
var quantityFieldId = document.GetField("Lignes d'articles/Quantity").Id;
var tableRowCount = table.Instances.length;

// Créer une fonction pour ajouter une ligne de table et définir les valeurs pour les colonnes Description et 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;
}

// Ajouter trois lignes et définir les valeurs
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++);

Supprimer des lignes d’un tableau

Le script suivant supprime toutes les lignes d’un tableau :
// Obtenir le premier document dans une transaction
var document = Context.Transaction.Documents[0];

// Obtenir l'objet tableau
var table = document.GetField("Line Items");
var indexCount = table.Instances.length - 1;

// Supprimer toutes les lignes par leurs index
for (var i = indexCount; i >= 0 ; i--) {
  table.Instances[i].Remove();
}

// Ou vous pouvez supprimer l'ensemble du tableau
table.Remove();

Supprimer une instance précise d’un champ répétitif

Le script suivant supprime la dernière instance d’un champ répétitif :
// Obtenir le premier document d'une transaction
var document = Context.Transaction.Documents[0];

// Obtenir l'objet champ répétitif
var rField = document.GetField("First Name");

// Vérifier si ce champ est répétitif
if (rField.IsRepeatable) {
    // Supprimer la dernière instance de ce champ
    if (rField.Instances.length >= 1) {
        rField.Instances[rField.Instances.length-1].Remove();
    }  
}
else {
    Context.LogMessage(rField.Name + " n'est pas répétitif.");
}

Générer un fichier JSON et l’envoyer à un système tiers

Le script suivant génère un fichier JSON dans un format personnalisé et l’envoie à un système tiers :
// Cet exemple de script d'exportation personnalisé montre comment créer une chaîne JSON
// en utilisant les valeurs des champs extraits de facture US et l'envoyer à un point de terminaison externe.
// Récupérer le premier document de la transaction.
var document = Context.Transaction.Documents[0];

// Créer un objet JSON et définir ses paires clé/valeur.
var extractedValues = {};
extractedValues.Total = document.GetField("Total").Value;
extractedValues.Currency = document.GetField("Currency").Value;
extractedValues.Date = document.GetField("Invoice Date").Value;

// Récupérer les valeurs des champs répétitifs et les définir comme valeurs de tableau 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);
}

// Le fichier JSON reçu est au format suivant :
/* {
   "Total": 1819.14,
   "Currency": "USD",
   "Date": "2019-05-23T00:00:00.000Z",
   "PurchaseOrderNumber": [
      "012345678",
      "4500123466"
   ]
}*/

// Envoyer une requête multipart/form-data avec le JSON créé précédemment comme contenu de chaîne de cette requête.
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();

Récupérer les noms de fichiers d’origine

Le script suivant insère le nom d’origine d’un fichier dans le champ MyField :
// Obtenir le nom du fichier source et le définir comme valeur du champ spécifié ("MyField")
Context.Transaction.Documents.forEach( doc => {
    // Pour Scanning Station, le nom du fichier source est placé dans un paramètre d'enregistrement
    var param = doc.RegistrationParameters["SourceFileName"]; 
    doc.GetField("MyField").Value = param != null ?
        param.Value : doc.SourceFiles[0].FileName;
});