메인 콘텐츠로 건너뛰기

OAuth로 인증하고 내보내기 데이터를 외부 서비스로 전송하기

다음 스크립트는 Resource Owner Password 플로우로 획득한 토큰을 사용해 인증을 수행한 뒤, 내보내기 데이터를 외부 서비스로 전송합니다.
// 이 샘플 사용자 정의 내보내기 스크립트는 OAuth 2.0 Resource Owner Password Flow에 대한 인증 요청을 전송하고 토큰을 수신한 다음,
// 내보내기 결과를 JSON 형식으로 외부 시스템에 전송하는 방법을 보여줍니다

// 인증 요청을 위한 키-값 본문을 준비합니다(매개변수와 해당 값은 다를 수 있음). 해당 환경 변수는 사전에 생성되어 있어야 합니다.
var authDataContent = {};
authDataContent.grant_type = Context.GetSecret("password_secretName");
authDataContent.scope = "openid permissions";

// 환경 변수를 사용하여 민감한 데이터를 전달합니다. 해당 변수는 사전에 생성되어 있어야 합니다.
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");

// 요청을 생성하고 데이터를 전송합니다
var request = Context.CreateHttpRequest();
request.Url = "https://my_auth_service.com/auth2/connect/token"
request.Method = "POST";

// 인증 요청을 위한 콘텐츠 데이터를 생성합니다
request.SetUrlFormEncodedContent(authDataContent);
request.Send();
var authResponseObject = JSON.parse(request.ResponseText);

// 문서에서 모든 내보내기를 가져옵니다
var exports = Context.Transaction.Documents[0].Exports;

// JSON 내보내기 결과를 선택합니다
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);
var pdfExportResult = exports.find(element => element.ExportFormat === ExportFormat.Pdf);

// 요청을 위한 콘텐츠 데이터를 생성합니다
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";

// 추출된 데이터를 내보내기 결과에 추가합니다
multiPartRequest.AppendStringContent(extractedDataExportResult.ToJson(), "jsonData");

// 내보낸 PDF를 추가합니다
multiPartRequest.AppendFileContent(pdfExportResult, "binaryData");

// 서비스에 요청을 전송합니다
multiPartRequest.Send();

// 역직렬화된 응답 결과를 가져옵니다
var responseObject = JSON.parse(multiPartRequest.ResponseText);

내보낸 데이터를 외부 서비스로 전송하기

다음 스크립트는 송장 번호를 사용해 내보낸 파일의 이름을 지정한 다음, 내보낸 데이터를 외부 서비스(여기서는 Dropbox)로 전송합니다:
// This sample Custom export script shows how to send a file to Dropbox
// and set the file name using value of extracted data field.

// Get the document export result
var exports = Context.Transaction.Documents[0].Exports;
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);

// DropBox API에 대한 액세스 토큰을 가져옵니다(https://developers.dropbox.com/en-us/oauth-guide). 해당 환경 변수는 사전에 생성되어 있어야 합니다.
var token = Context.GetSecret("access_token_secretName");

// Get "Invoice Number" from the extracted data
var invoiceNumberField = Context.Transaction.Documents[0].GetField("Invoice Number");
var invoiceNumber = invoiceNumberField.Value;

// Create the result file name
var jsonFileName = `ExtractedData_${invoiceNumber}.json`;

// Send the JSON file with the extracted data to 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();

추출된 데이터 수정

다음 스크립트는 외부 서비스의 응답에 포함된 정보를 사용하여 기존 field 값을 수정하고 반복 field에 새로운 값을 추가합니다:
// 이 샘플 Custom activity 스크립트는 기존 field를 수정하고
// 외부 호출 결과를 기반으로 새 field 값을 생성하는 방법을 보여줍니다.

// 문서에서 모든 내보내기 가져오기
var exports = Context.Transaction.Documents[0].Exports;

// 내보내기에서 JSON 내보내기 결과 가져오기
var extractedDataExportResult = exports.find(element => element.ExportFormat === ExportFormat.Json);

// 내보내기에서 PDF 내보내기 결과 가져오기
var pdfExportResult = exports.find(element => element.ExportFormat === ExportFormat.Pdf);

// HTTP 요청을 생성하고 필수 요청 속성 지정
var multipartFormDataRequest = Context.CreateMultipartFormDataRequest();
multipartFormDataRequest.Url = "http://my_service/api/v1.0/apimethod/"
multipartFormDataRequest.Method = "POST";

// JSON 내보내기 결과에서 추출된 데이터를 요청에 추가
multipartFormDataRequest.AppendStringContent(extractedDataExportResult.ToJson(), "jsonData");
// 내보내기 결과의 PDF를 요청에 추가
multipartFormDataRequest.AppendFileContent(pdfExportResult, "binaryData");

// HTTP 요청 완료 시간 제한 설정(분 단위).
// 기본적으로 시간 제한은 1분으로 설정됩니다.
multipartFormDataRequest.Timeout = 1;

// 서비스에 요청 전송
multipartFormDataRequest.Send();

// 응답 결과 가져오기
var newJsonDataObject = JSON.parse(multipartFormDataRequest.ResponseText);

// 응답 결과에서 다음과 같은 JSON을 얻었다고 가정:
/* {
    "DocumentData": {
        "Fields": {
            "InvoiceNumber": "706-222-3151",
            "InvoiceDate": "15.05.2020",
            "PurchaseOrder": [
                {
                    "OrderNumber": "25646788",
                    "Total": "540.54"
                },
                {
                    "OrderNumber": "24516684",
                    "Total": "138.43"
                }
            ]
        }
    }
}*/

// 외부 호출에서 받은 데이터를 기반으로 기존 Vantage 문서 field의 값 변경
var document = Context.Transaction.Documents[0];
var invoiceNumber = document.GetField("Invoice Number");
if (invoiceNumber.InstanceId === undefined || invoiceNumber.InstanceId === null)
    invoiceNumber.AddInstance();
invoiceNumber.Value = newJsonDataObject.DocumentData.Fields.InvoiceNumber;

// 외부 호출에서 받은 데이터를 기반으로 새 Vantage 문서 field 값 추가
var poOrder = Context.Transaction.Documents[0].GetField("Purchase Order");
let orderNumberFieldId = document.GetField("Purchase Order/Order Number").Id;
let totalFieldId = document.GetField("Purchase Order/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;
});

특정 테이블 열에서 데이터 가져오기

다음 스크립트는 Description 테이블 열의 모든 값(각 행)을 트랜잭션 이벤트 로그에 기록합니다:
// Get the first document in a transaction
var document = Context.Transaction.Documents[0];
var descriptionFieldId = document.GetField("Line Items/Description").Id;

// Get the table object
var table = document.GetField("Line Items");

for (var i = 0; i < table.Instances.length; i++) {
  // 각 테이블 행의 'Description' 열 객체를 가져와 트랜잭션 이벤트 로그에 값 기록
  var columnDescription = table.Instances[i].Children.find(x => x.Id === descriptionFieldId);
  Context.LogMessage("Description. Row " + i + ": " + columnDescription.Value);
}

모든 테이블 열에서 데이터 가져오기

다음 스크립트는 모든 테이블 열의 모든 값(행)을 트랜잭션 이벤트 로그에 기록합니다:
// 트랜잭션의 첫 번째 문서 가져오기
var document = Context.Transaction.Documents[0];

// 테이블 객체 가져오기
var table = document.GetField("Line Items");

// 모든 테이블 데이터를 트랜잭션 이벤트 로그에 기록하기
for (var i = 0; i < table.Instances.length; i++) {
    for (var j = 0; j < table.Instances[i].Children.length; j++) {
        Context.LogMessage("Table row "+i+". Column "+table.Instances[i].Children[j].Name+": "+table.Instances[i].Children[j].Value);
    }
}

테이블에 행 추가

다음 스크립트는 테이블에 새 행을 추가하고 DescriptionQuantity 열의 값을 설정합니다.
// Get the first document in a transaction
var document = Context.Transaction.Documents[0];

// Get the table object
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;

// 테이블 행을 하나 추가하고 Description 및 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;
}

// Add three rows and set values
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++);

테이블에서 행 삭제

다음 스크립트는 테이블의 모든 행을 삭제합니다.
// 트랜잭션에서 첫 번째 문서 가져오기
var document = Context.Transaction.Documents[0];

// Get the table object
var table = document.GetField("Line Items");
var indexCount = table.Instances.length - 1;

// Delete all rows by their indexes
for (var i = indexCount; i >= 0 ; i--) {
  table.Instances[i].Remove();
}

// Or you can delete the entire table
table.Remove();

반복 field의 특정 인스턴스 삭제

다음 스크립트는 반복 field의 마지막 인스턴스를 삭제합니다.
// Get the first document in a transaction
var document = Context.Transaction.Documents[0];

// Get the repeating field object
var rField = document.GetField("First Name");

// Check if this field is repeating
if (rField.IsRepeatable) {
    // Delete the last instance of this field
    if (rField.Instances.length >= 1) {
        rField.Instances[rField.Instances.length-1].Remove();
    }  
}
else {
    Context.LogMessage(rField.Name + " 은(는) 반복되지 않습니다.");
}

JSON 파일 생성 후 타사 시스템으로 전송

다음 스크립트는 사용자 지정 형식의 JSON 파일을 생성한 후 타사 시스템으로 전송합니다:
// 이 샘플 사용자 정의 내보내기 스크립트는 추출된 Invoice US fields 값을 사용하여
// JSON 문자열을 생성하고 외부 엔드포인트로 전송하는 방법을 보여줍니다.
// 트랜잭션에서 첫 번째 문서를 가져옵니다.
var document = Context.Transaction.Documents[0];

// JSON 객체를 생성하고 키/값 쌍을 설정합니다.
var extractedValues = {};
extractedValues.Total = document.GetField("Total").Value;
extractedValues.Currency = document.GetField("Currency").Value;
extractedValues.Date = document.GetField("Invoice Date").Value;

// 반복 field 값을 가져와서 배열 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);
}

// 수신된 JSON 파일은 다음 형식입니다:
/* {
   "Total": 1819.14,
   "Currency": "USD",
   "Date": "2019-05-23T00:00:00.000Z",
   "PurchaseOrderNumber": [
      "012345678",
      "4500123466"
   ]
}*/

// 이전에 생성된 JSON을 해당 요청의 문자열 콘텐츠로 사용하여 multipart/form-data 요청을 전송합니다.
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();

원본 파일 이름 가져오기

다음 스크립트는 파일의 원본 이름을 MyField field에 저장합니다:
// Get the name of the source file and set it as the value of the specified field ("MyField")
Context.Transaction.Documents.forEach( doc => {
    // Scanning Station의 경우, 소스 파일 이름이 등록 Parameter에 저장됨
    var param = doc.RegistrationParameters["SourceFileName"]; 
    doc.GetField("MyField").Value = param != null ?
        param.Value : doc.SourceFiles[0].FileName;
});