【スケジューラ】PayPal Rest APIを利用してみる（Transaction:分析）

前回の[記事](https://qiita.com/Miki_Yokohata/items/b6ed8313c5c45a00373a)でPayPal Rest APIにGetリクエストを発信し、**Transaction**情報を取得しファイルに保存しました。
今回は、そのファイルを分析しながらJSON形式のデータを読み解いていきたいと思います。
そして再度、[Sharperlight](https://sharperlight.jp/)スケジューラのタスクを利用します。
なぜ、Sharperlightスケジューラのタスクを利用しているかというと、このような、つまりRest APIを利用してデータを自前のデータベースに保存および同調させ、Sharperlightの強力なレポーティング機能等を利用して業務に役立つよう可視化するといったソリューションを作成する場合は、同調プロセスを自動化したいという理由からです。

今回の分析タスクを作成するにあたり、本来はPayPal Rest API側のスキーマや取得するデータ構造等の変更によって発生するであろうこちら側の変更作業をできる限り減らしたいので、様々な手法やSharperlightの機能を利用して、それらを実現させていくのですが、今回は解説記事ということで、その辺りは省略します。

## データ構造のチェック ##
取得したJSONデータファイルを開いてみるとこのような構造が拝見できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/bad8f90b-90d3-f304-74e2-dec817735978.png)
この一部分の画像には、`transaction_details`ということで2つのレコードが表示されており、それぞれのレコードが7つの`_info`グループを持っていることが分かります。今回は各レコードの`transaction_info`グループの情報だけを取り出していきます。

`transaction_info`グループはどのようなデータ構造になっているのかな？このようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/69da001a-9388-a465-fa1d-a1a1e86b264c.png)
更に子情報をもつアイテムも見えますね。それぞれの子情報はこんな感じでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/1d93b97f-be96-0a52-39d8-558c901075cc.png)
孫はいなさそうですね。
この各レコードの`transaction_info`情報をデータベースの`[Transaction_Info]`テーブルに保存しようという考えです。各レコードの`transaction_info`情報には子情報をもつアイテムが存在しますが、それらをフラット化していこうと思います。
つまり、このようにします；
    [paypal_account_id]
	[transaction_id]
	[transaction_event_code]
	[transaction_initiation_date]
	[transaction_updated_date]
	[**transaction_amount**_currency_code]
	[**transaction_amount**_value]
	[transaction_status]
	[**ending_balance**_currency_code]
	[**ending_balance**_value]
	[**available_balance**_currency_code]
	[**available_balance**_value]
	[protection_eligibility]
## データの読み込み ##
Sharperlightスケジューラのタスクでデータを読み込む処理を作成していきます。JavaScriptで全部書いてもいいのですが、今回は少し手間を省いていきます。
[Sharperlight](https://sharperlight.jp/)アプリケーションメニューから**スケジューラ**を起動します。
### 一般タブ ###
`一般`タブではこのような感じで**コード**、**グループ**、**説明**を記入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/03f45691-33ef-6630-40e1-9b6218558099.png)
### アクションタブ ###
`アクション`タブに移動して、新規アイコンでアクションを追加します。最初に追加するアクションは**クエリの組み合わせ**アクションです。このアクションでは定義したクエリが返すレコード毎に、別の処理を繰り返し実行することができます。Forループ文のような処理を行うことができます。
`クエリを編集`ボタンでクエリの作成を開始します。
**フィルター領域**では、`製品`に**システム**、`テーブル`には**Webページのテーブル、CSV、JSON、XMLまたはOData**を指定します。
`URLリンク`フィルターには、JSONデータファイルを指定します。（今回は1ファイルのみとしたので、直接指定します）
ファイルを指定すると、エンジンがファイルを分析して、選択可能なアイテムを**選択領域**に表示します。
`開始位置`フィルターには、データ構造のルートアイテムである**transaction_details**を指定します。
最後に**出力領域**に今回の対象情報である**transaction_info**を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/67408e88-c465-a635-029b-d3244d9247a0.png)
`プレビュー`ボタンで出力値を確認します。各レコードの**transaction_info**情報だけが出力されているのが分かります。今回PayPal Rest APIから取得したTransactionのデータは16レコードあったということが分かりますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/7c4319f1-28c3-2d65-aa96-356ca13c8f74.png)

次に、これら16のレコードを一つ一つ処理していきます。その処理にはJavaScriptを利用します。各出力レコードの参照には出力名{%trans_info}を使用します。

`新規`アイコンを利用して**JavaScript**アクションを追加します。
下部のスクリプト欄にはこのようなコードを記述します。一番最初の行でクエリの組み合わせで戻ってくるデータの一行を受け取ります。後はオブジェクトに変換し、列を一つ一つ処理していきます。途中、子オブジェクトも処理していきます。処理した結果をその都度コンソールに表示させて確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/65e0ecb6-1756-7592-23fb-1fc231d49657.png)
```
// Get a record
var output = lib_task.QueryCombinationValueGet('trans_info');
var rec = JSON.parse(output);

// Get columns for the record
var cols = Object.keys(rec);
for (var c in cols){
       if (typeof rec[cols[c]] !== 'object'){
              console.log(cols[c] + " / " + rec[cols[c]]);
              
       }else{       // Processing child Information
              var childRec = rec[cols[c]];
              var childRecCols = Object.keys(childRec);
              for (var cc in childRecCols){
                     console.log(cols[c] + ': ' + childRecCols[cc] + " / " + childRec[childRecCols[cc]]);
              }
       }
}
```
`接続テスト`ボタンで実行すると、このように列名とその値が取得できました。子情報もフラット化できました:ok_hand:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/fdc6e542-2e0e-87a4-6843-fe56ff64474c.png)
最後に**クエリの組み合わせ終了**アクションを追加してループを閉めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/e8b5db54-7fe4-40c6-cab2-ceecc759bc95.png)

あとはこの情報をSharperlightのWriteback(書き戻し)機能を利用して、データベースに書込んでいきます。この記事ではある期間の限られたTransactionデータを例として取得して分析をしましたが、実際にはこのような処理を発展させて全てのデータを同調させ、そのデータを利用して様々なレポートの作成を可能にします。
デルタ更新機能などを組み込んだスケジューラのタスクでこの処理を自動化し、前回取得したデータ以降に作成された最新のデータのみを取得しデータベースに追加していきます。

長くなったので今回はここまで。

では、失礼します。